Merge "Fix version to reside in setup.py"
authorSeshu Kumar M <seshu.kumar.m@huawei.com>
Wed, 28 Mar 2018 10:47:42 +0000 (10:47 +0000)
committerGerrit Code Review <gerrit@onap.org>
Wed, 28 Mar 2018 10:47:42 +0000 (10:47 +0000)
107 files changed:
adapters/mso-adapter-utils/pom.xml
adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/adapters/vdu/CloudInfo.java [new file with mode: 0644]
adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/adapters/vdu/PluginAction.java [new file with mode: 0644]
adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/adapters/vdu/VduArtifact.java [new file with mode: 0644]
adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/adapters/vdu/VduException.java [new file with mode: 0644]
adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/adapters/vdu/VduInstance.java [new file with mode: 0644]
adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/adapters/vdu/VduModelInfo.java [new file with mode: 0644]
adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/adapters/vdu/VduPlugin.java [new file with mode: 0644]
adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/adapters/vdu/VduStateType.java [new file with mode: 0644]
adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/adapters/vdu/VduStatus.java [new file with mode: 0644]
adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/cloudify/utils/MsoCloudifyUtils.java
adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/openstack/utils/MsoHeatEnvironmentEntry.java
adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/openstack/utils/MsoHeatUtils.java
adapters/mso-adapter-utils/src/test/java/org/openecomp/mso/adapters/vdu/BeansTest.java [new file with mode: 0644]
adapters/mso-adapter-utils/src/test/java/org/openecomp/mso/cloudify/utils/MsoCloudifyUtilsTest.java [new file with mode: 0644]
adapters/mso-adapter-utils/src/test/java/org/openecomp/mso/cloudify/utils/MsoCloudifyUtilsTest2.java [new file with mode: 0644]
adapters/mso-adapter-utils/src/test/java/org/openecomp/mso/openstack/utils/MsoHeatUtilsTest.java [new file with mode: 0644]
adapters/mso-adapter-utils/src/test/java/org/openecomp/mso/openstack/utils/MsoHeatUtilsTest2.java [new file with mode: 0644]
adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/openstack/exceptions/MsoAdapterExceptionTest.java [new file with mode: 0644]
adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/openstack/exceptions/MsoCloudIdentityNotFoundTest.java [new file with mode: 0644]
adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/openstack/exceptions/MsoCloudSiteNotFoundTest.java [new file with mode: 0644]
adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/openstack/exceptions/MsoIOExceptionTest.java [new file with mode: 0644]
adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/openstack/exceptions/MsoNetworkAlreadyExistsTest.java [new file with mode: 0644]
adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/openstack/exceptions/MsoNetworkNotFoundTest.java [new file with mode: 0644]
adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/openstack/exceptions/MsoOpenstackExceptionTest.java [new file with mode: 0644]
adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/openstack/exceptions/MsoStackAlreadyExistsTest.java [new file with mode: 0644]
adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/openstack/exceptions/MsoStackNotFoundTest.java [new file with mode: 0644]
adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/openstack/exceptions/MsoTenantAlreadyExistsTest.java [new file with mode: 0644]
adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/openstack/exceptions/MsoTenantNotFoundTest.java [new file with mode: 0644]
adapters/mso-catalog-db-adapter/src/test/java/org/openecomp/mso/adapters/catalogdb/catalogrest/CatalogQueryExceptionTest.java [new file with mode: 0644]
adapters/mso-requests-db-adapter/src/test/java/org/openecomp/mso/adapters/requestsdb/HealthCheckHandlerTestException.java [new file with mode: 0644]
adapters/mso-sdnc-adapter/src/test/java/org/openecomp/mso/adapters/sdnc/ObjectFactoryTest.java
adapters/mso-sdnc-adapter/src/test/java/org/openecomp/mso/adapters/sdnc/SDNCAdapterRequestTest.java
adapters/mso-sdnc-adapter/src/test/java/org/openecomp/mso/adapters/sdnc/client/CallbackHeaderTest.java
adapters/mso-sdnc-adapter/src/test/java/org/openecomp/mso/adapters/sdnc/client/SDNCAdapterCallbackRequestTest.java
adapters/mso-sdnc-adapter/src/test/java/org/openecomp/mso/adapters/sdnc/impl/RequestTunablesTest.java
adapters/mso-sdnc-adapter/src/test/java/org/openecomp/mso/adapters/sdnc/impl/SDNCResponseTest.java
adapters/mso-sdnc-adapter/src/test/java/org/openecomp/mso/adapters/sdnc/util/SDNCRequestIdUtilTest.java
adapters/mso-vnf-adapter/src/main/java/org/openecomp/mso/adapters/vdu/mapper/VfModuleCustomizationToVduMapper.java [new file with mode: 0644]
adapters/mso-vnf-adapter/src/main/java/org/openecomp/mso/adapters/vnf/MsoVnfAdapterImpl.java
adapters/mso-vnf-adapter/src/main/java/org/openecomp/mso/adapters/vnf/MsoVnfPluginAdapterImpl.java [new file with mode: 0644]
adapters/mso-vnf-adapter/src/main/java/org/openecomp/mso/adapters/vnf/VnfAdapterRestUtils.java
adapters/mso-vnf-adapter/src/test/java/org/openecomp/mso/adapters/vnf/AriaVduPluginTest.java [new file with mode: 0644]
adapters/mso-vnf-adapter/src/test/java/org/openecomp/mso/adapters/vnf/MsoVnfPluginAdapterImplTest.java [new file with mode: 0644]
adapters/mso-workflow-message-adapter/src/test/java/org/openecomp/mso/adapters/workflowmessage/BPRestCallbackTest.java [new file with mode: 0644]
asdc-controller/pom.xml
bpmn/MSOCommonBPMN/pom.xml
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/common/VnfAdapterRestV1Test.java
bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/bpmn/mock/StubResponseOof.java [new file with mode: 0644]
bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/bpmn/mock/StubResponseVNFAdapter.java
bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/client/sdnc/sync/CallbackHeaderTest.java [new file with mode: 0644]
bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/client/sdnc/sync/ObjectFactoryTest.java [new file with mode: 0644]
bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/client/sdnc/sync/RequestHeaderTest.java [new file with mode: 0644]
bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/client/sdnc/sync/RequestTunablesTest.java [new file with mode: 0644]
bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/client/sdnc/sync/SDNCAdapterCallbackRequestTest.java [new file with mode: 0644]
bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/client/sdnc/sync/SDNCAdapterRequestTest.java [new file with mode: 0644]
bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/client/sdnc/sync/SDNCResponseTest.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/pom.xml
bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/CompareModelofE2EServiceInstance.groovy [new file with mode: 0644]
bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/DoCompareModelofE2EServiceInstance.groovy [new file with mode: 0644]
bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/DoCreateE2EServiceInstance.groovy
bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/vcpe/scripts/CreateVcpeResCustService.groovy
bpmn/MSOInfrastructureBPMN/src/main/resources/process/UpdateCustomE2EServiceInstance.bpmn
bpmn/MSOInfrastructureBPMN/src/main/resources/subprocess/DoCreateE2EServiceInstance.bpmn
bpmn/MSOInfrastructureBPMN/src/main/resources/subprocess/DoUpdateE2EServiceInstance.bpmn
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
bpmn/MSOURN-plugin/pom.xml
cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/AzureConfig.java [new file with mode: 0644]
mso-api-handlers/mso-api-handler-infra/pom.xml
mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/E2EServiceInstances.java
mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/e2eserviceinstancebeans/CompareModelsRequest.java
mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/e2eserviceinstancebeans/DelE2ESvcResp.java
mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/e2eserviceinstancebeans/E2ERequest.java
mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/e2eserviceinstancebeans/GetE2EServiceInstanceResponse.java
mso-api-handlers/mso-api-handler-infra/src/test/java/org/openecomp/mso/apihandlerinfra/E2EServiceInstancesTest.java
mso-api-handlers/mso-api-handler-infra/src/test/java/org/openecomp/mso/apihandlerinfra/NetworkRequestHandlerTest.java
mso-api-handlers/mso-api-handler-infra/src/test/java/org/openecomp/mso/apihandlerinfra/VolumeInfoHandlerTest.java
mso-catalog-db/src/test/java/org/openecomp/mso/db/catalog/CatalogDbSessionFactoryManagerTest.java [new file with mode: 0644]
mso-catalog-db/src/test/java/org/openecomp/mso/db/catalog/test/AllottedResourceCustomizationTest.java [new file with mode: 0644]
mso-catalog-db/src/test/java/org/openecomp/mso/db/catalog/test/CatalogDatabaseTest.java
mso-catalog-db/src/test/java/org/openecomp/mso/db/catalog/test/RecordNotFoundExceptionTest.java [new file with mode: 0644]
pom.xml

index e264a20..ee70fb6 100644 (file)
                        <artifactId>snakeyaml</artifactId>
                        <version>1.15</version>
                </dependency>
-
+       <dependency>
+                       <groupId>com.shazam</groupId>
+                       <artifactId>shazamcrest</artifactId>
+                       <version>0.11</version>
+                       <scope>test</scope>
+                       <exclusions>
+                               <exclusion>
+                               <groupId>com.google.guava</groupId>
+                               <artifactId>guava</artifactId>
+                               </exclusion>
+                               <exclusion>
+                               <groupId>org.apache.commons</groupId>
+                               <artifactId>commons-lang3</artifactId>
+                               </exclusion>
+                       </exclusions>
+               </dependency>
        </dependencies>
 </project>
diff --git a/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/adapters/vdu/CloudInfo.java b/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/adapters/vdu/CloudInfo.java
new file mode 100644 (file)
index 0000000..0355245
--- /dev/null
@@ -0,0 +1,69 @@
+/*-\r
+ * ============LICENSE_START=======================================================\r
+ * ONAP - SO\r
+ * ================================================================================\r
+ * Copyright (C) 2018 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.adapters.vdu;\r
+\r
+/**\r
+ * Cloud information structure for deploying/managing a VDU.  Includes the cloud site\r
+ * as well as tenant information within the site.  Currently this is defined as a \r
+ * cloud site ID. which would map to a CloudConfig entry.\r
+ * Perhaps the CloudConfig entry itself should be provided, instead of requiring each\r
+ * plug-in to query it.\r
+ * \r
+ * The meaning of 'tenant' may differ by cloud provider, but every cloud supports some\r
+ * sort of tenant partitioning.\r
+ * \r
+ */\r
+public class CloudInfo {\r
+       \r
+       private String cloudSiteId;\r
+       private String tenantId;        \r
+       private String tenantName;//bpmn query and pass\r
+       \r
+       public CloudInfo() {\r
+       }\r
+       \r
+       public CloudInfo (String cloudSiteId, String tenantId, String tenantName) {\r
+               this.cloudSiteId = cloudSiteId;\r
+               this.tenantId = tenantId;\r
+               this.tenantName = tenantName;\r
+       }\r
+       \r
+       public String getCloudSiteId() {\r
+               return cloudSiteId;\r
+       }\r
+       public void setCloudSiteId(String cloudSiteId) {\r
+               this.cloudSiteId = cloudSiteId;\r
+       }\r
+       public String getTenantId() {\r
+               return tenantId;\r
+       }\r
+       public void setTenantId(String tenantId) {\r
+               this.tenantId = tenantId;\r
+       }\r
+       public String getTenantName() {\r
+               return tenantName;\r
+       }\r
+       public void setTenantName(String tenantName) {\r
+               this.tenantName = tenantName;\r
+       }\r
+       \r
+       \r
+}
\ No newline at end of file
diff --git a/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/adapters/vdu/PluginAction.java b/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/adapters/vdu/PluginAction.java
new file mode 100644 (file)
index 0000000..1f3cf2f
--- /dev/null
@@ -0,0 +1,63 @@
+/*-\r
+ * ============LICENSE_START=======================================================\r
+ * ONAP - SO\r
+ * ================================================================================\r
+ * Copyright (C) 2018 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.adapters.vdu;\r
+\r
+/**\r
+ * Java beam representing a detailed action performed within a plugin during VDU\r
+ * orchestration. This allows the plugin to convey more detailed information about\r
+ * recent activities it has performed.  It is primarily intended for logging and\r
+ * troubleshooting, so plugins are free to populate this as desired.\r
+ */\r
+public class PluginAction {\r
+       \r
+       private String action;  \r
+       private String status;\r
+       private String rawMessage;      \r
+       \r
+       public PluginAction () {\r
+       }\r
+       \r
+       public PluginAction (String action, String status, String rawMessage) {\r
+               this.action = action;\r
+               this.status = status;\r
+               this.rawMessage = rawMessage;\r
+       }\r
+       \r
+       public String getAction() {\r
+               return action;\r
+       }\r
+       public void setAction(String action) {\r
+               this.action = action;\r
+       }\r
+       public String getStatus() {\r
+               return status;\r
+       }\r
+       public void setStatus(String status) {\r
+               this.status = status;\r
+       }\r
+       public String getRawMessage() {\r
+               return rawMessage;\r
+       }\r
+       public void setRawMessage(String rawMessage) {\r
+               this.rawMessage = rawMessage;\r
+       }\r
+       \r
+}
\ No newline at end of file
diff --git a/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/adapters/vdu/VduArtifact.java b/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/adapters/vdu/VduArtifact.java
new file mode 100644 (file)
index 0000000..394d13d
--- /dev/null
@@ -0,0 +1,64 @@
+/*-\r
+ * ============LICENSE_START=======================================================\r
+ * ONAP - SO\r
+ * ================================================================================\r
+ * Copyright (C) 2018 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.adapters.vdu;\r
+\r
+public class VduArtifact {\r
+       \r
+       // Enumerate the types of artifacts permitted.  This may need to be a variable string\r
+       // value if arbitrary (cloud-specific) artifacts may be attached to VDUs in ASDC.\r
+       public enum ArtifactType {\r
+               MAIN_TEMPLATE, NESTED_TEMPLATE, CONFIG_FILE, SCRIPT_FILE, TEXT_FILE, ENVIRONMENT\r
+       }\r
+       \r
+       private String name;\r
+       private byte[] content;\r
+       private ArtifactType type;\r
+       \r
+       // Default constructor\r
+       public VduArtifact() {}\r
+       \r
+       // Fully specified constructor\r
+       public VduArtifact (String name, byte[] content, ArtifactType type) {\r
+               this.name = name;\r
+               this.content = content;\r
+               this.type = type;\r
+       }\r
+       \r
+       public String getName() {\r
+               return name;\r
+       }\r
+       public void setName (String name) {\r
+               this.name = name;\r
+       }\r
+       public byte[] getContent() {\r
+               return content;\r
+       }\r
+       public void setContent(byte[] content) {\r
+               this.content = content;\r
+       }\r
+       public ArtifactType getType() {\r
+               return type;\r
+       }\r
+       public void setType(ArtifactType type) {\r
+               this.type = type;\r
+       }       \r
+       \r
+}
\ No newline at end of file
diff --git a/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/adapters/vdu/VduException.java b/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/adapters/vdu/VduException.java
new file mode 100644 (file)
index 0000000..3fd1d2e
--- /dev/null
@@ -0,0 +1,60 @@
+/*-\r
+ * ============LICENSE_START=======================================================\r
+ * OPENECOMP - MSO\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.adapters.vdu;\r
+\r
+import org.openecomp.mso.openstack.exceptions.MsoException;\r
+import org.openecomp.mso.openstack.exceptions.MsoExceptionCategory;\r
+\r
+/**\r
+ * OpenStack exception.\r
+ */\r
+public class VduException extends MsoException\r
+{\r
+       \r
+       /**\r
+     * Serialization id.\r
+     */\r
+    private static final long serialVersionUID = 3313636124141766495L;\r
+    \r
+       /**\r
+        * Constructor to create a new VduException instance\r
+        * @param detail error details\r
+        */\r
+       public VduException (String detail) {\r
+               // Set the detailed error as the Exception 'message'\r
+               super(detail);\r
+               // TODO:  Need a more generic category than OPENSTACK\r
+               super.category = MsoExceptionCategory.OPENSTACK;\r
+       }\r
+       \r
+       /**\r
+        * Constructor to create a new VduException instance\r
+        * @param detail error details\r
+        * @param e the cause\r
+        */\r
+       public VduException (String detail, Exception e) {\r
+               // Set the detailed error as the Exception 'message'\r
+               super(detail, e);\r
+               // TODO:  Need a more generic category than OPENSTACK\r
+               super.category = MsoExceptionCategory.OPENSTACK;\r
+       }\r
+\r
+}
\ No newline at end of file
diff --git a/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/adapters/vdu/VduInstance.java b/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/adapters/vdu/VduInstance.java
new file mode 100644 (file)
index 0000000..5a5a6ab
--- /dev/null
@@ -0,0 +1,80 @@
+/*-\r
+ * ============LICENSE_START=======================================================\r
+ * OPENECOMP - MSO\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.adapters.vdu;\r
+\r
+import java.util.Map;\r
+import java.util.HashMap;\r
+\r
+/*\r
+ * This Java bean class relays VDU status information in a cloud-agnostic format.\r
+ * \r
+ * This bean is returned by all implementors of the VduPlugin interface operations\r
+ * (instantiate, query, delete).\r
+ */\r
+\r
+public class VduInstance {\r
+       // Set defaults for everything\r
+       protected String vduInstanceId;\r
+       protected String vduInstanceName;\r
+       protected VduStatus status;\r
+       protected Map<String, Object> outputs = new HashMap<>();\r
+       protected Map<String, Object> inputs = new HashMap<>();\r
+\r
+       public String getVduInstanceId() {\r
+               return vduInstanceId;\r
+       }\r
+\r
+       public void setVduInstanceId(String vduInstanceId) {\r
+               this.vduInstanceId = vduInstanceId;\r
+       }\r
+\r
+       public String getVduInstanceName() {\r
+               return vduInstanceName;\r
+       }\r
+\r
+       public void setVduInstanceName(String vduInstanceName) {\r
+               this.vduInstanceName = vduInstanceName;\r
+       }\r
+\r
+       public VduStatus getStatus() {\r
+               return status;\r
+       }\r
+\r
+       public void setStatus(VduStatus status) {\r
+               this.status = status;\r
+       }\r
+\r
+       public Map<String, Object> getOutputs() {\r
+               return outputs;\r
+       }\r
+\r
+       public void setOutputs(Map<String, Object> outputs) {\r
+               this.outputs = outputs;\r
+       }\r
+\r
+       public Map<String, Object> getInputs() {\r
+               return inputs;\r
+       }\r
+\r
+       public void setInputs(Map<String, Object> inputs) {\r
+               this.inputs = inputs;\r
+       }\r
+}
\ No newline at end of file
diff --git a/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/adapters/vdu/VduModelInfo.java b/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/adapters/vdu/VduModelInfo.java
new file mode 100644 (file)
index 0000000..3cef292
--- /dev/null
@@ -0,0 +1,50 @@
+/*-\r
+ * ============LICENSE_START=======================================================\r
+ * ONAP - SO\r
+ * ================================================================================\r
+ * Copyright (C) 2018 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.adapters.vdu;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+public class VduModelInfo {    \r
+       private String modelCustomizationUUID;\r
+       private int timeoutMinutes;\r
+       private List<VduArtifact> artifacts = new ArrayList<>();\r
+       \r
+       public String getModelCustomizationUUID() {\r
+               return modelCustomizationUUID;\r
+       }\r
+       public void setModelCustomizationUUID(String modelCustomizationUUID) {\r
+               this.modelCustomizationUUID = modelCustomizationUUID;\r
+       }\r
+       public int getTimeoutMinutes() {\r
+               return timeoutMinutes;\r
+       }\r
+       public void setTimeoutMinutes(int timeoutMinutes) {\r
+               this.timeoutMinutes = timeoutMinutes;\r
+       }\r
+       public List<VduArtifact> getArtifacts() {\r
+               return artifacts;\r
+       }\r
+       public void setArtifacts(List<VduArtifact> artifacts) {\r
+               this.artifacts = artifacts;\r
+       }\r
+       \r
+}
\ No newline at end of file
diff --git a/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/adapters/vdu/VduPlugin.java b/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/adapters/vdu/VduPlugin.java
new file mode 100644 (file)
index 0000000..3484646
--- /dev/null
@@ -0,0 +1,186 @@
+/*-\r
+ * ============LICENSE_START=======================================================\r
+ * ONAP - SO\r
+ * ================================================================================\r
+ * Copyright (C) 2018 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.adapters.vdu;\r
+\r
+/**\r
+ * This interface defines a common API for template-based cloud deployments.\r
+ * The methods here should be adaptable for Openstack (Heat), Cloudify (TOSCA),\r
+ * Aria (TOSCA), Multi-VIM (TBD), and others (e.g. Azure Resource Manager).\r
+ * \r
+ * The deployed instances are referred to here as Virtual Deployment Units (VDUs).\r
+ * The package of templates that define a give VDU is referred to as its blueprint.\r
+ * \r
+ * Template-based orchestrators all follow a similar template/blueprint model.\r
+ * - One main template that is the top level definition\r
+ * - Optional nested templates referenced/included by the main template\r
+ * - Optional files attached to the template package, typically containing\r
+ *   configuration files, install scripts, orchestration scripts, etc.\r
+ *   \r
+ * The main template also defines the required inputs for creating a new instance,\r
+ * and output values exposed by successfully deployed instances.  Inputs and outputs\r
+ * may include simple or complex (JSON) data types.\r
+ *   \r
+ * Each implementation of this interface is expected to understand the MSO CloudConfig\r
+ * to obtain the credentials for its sub-orchestrator and the targeted cloud.\r
+ * The sub-orchestrator may have different credentials from the cloud (e.g. an Aria \r
+ * instance in front of an Openstack cloud) or they may be the same (e.g. Heat)\r
+ */\r
+import java.util.Map;\r
+\r
+public interface VduPlugin {\r
+\r
+    /**\r
+     * The instantiateVdu interface deploys a new VDU instance from a vdu model package.\r
+     * \r
+     * For some VIMs, this may be a single command (e.g. Heat -> create stack) or may\r
+     * require a series of API calls (e.g. Cloudify -> upload blueprint, create deployment,\r
+     * execute install workflow).  These details are hidden within the plug-in implementation.\r
+     * The instantiation should be fully completed before returning.  On failures, this\r
+     * method is expected to back out the attempt, leaving the cloud in its previous state.\r
+     * \r
+     * It is expected that parameters have been validated and contain at minimum the\r
+     * required parameters for the given template with no extra parameters.\r
+     *\r
+     * The VDU name supplied by the caller will be globally unique, and identify the artifact\r
+     * in A&AI.  Inventory is managed by the higher levels invoking this function.\r
+     *\r
+     * @param cloudInfo The target cloud + tenant identifiers for the VDU.\r
+     * @param instanceName A unique name for the VDU instance to update.\r
+     * @param inputs A map of key/value inputs.  Values may be strings, numbers, or JSON objects.\r
+     *                 Will completely replace any inputs provided on the original instantiation.\r
+     * @param vduModel Object containing the collection of templates and files that comprise\r
+     *                 the blueprint for this VDU.\r
+     * @param rollbackOnFailure Flag to preserve or roll back the update on Failure.  Should normally\r
+     *         be True except in troubleshooting/debug cases.  Might not be supported in all plug-ins.\r
+     * \r
+     * @return A VduInstance object\r
+     * @throws VduException Thrown if the sub-orchestrator API calls fail or if a timeout occurs.\r
+     * Various subclasses of VduException may be thrown.\r
+     */\r
+    public VduInstance instantiateVdu (\r
+                               CloudInfo cloudInfo,\r
+                               String instanceName,\r
+                               Map<String,Object> inputs,\r
+                               VduModelInfo vduModel,\r
+                               boolean rollbackOnFailure)\r
+                       throws VduException;\r
+    \r
+    /**\r
+     * Query a deployed VDU instance.  This call will return a VduInstance object, or null\r
+     * if the deployment does not exist.\r
+     * \r
+     * Some VIM orchestrators identify deployment instances by string UUIDs, and others \r
+     * by integers.  In the latter case, the ID will be passed in as a numeric string.\r
+     *\r
+     * The returned VduInstance object contains the input and output parameter maps,\r
+     * as well as other properties of the deployment (name, status, last action, etc.).\r
+     * \r
+     * @param cloudInfo The target cloud + tenant identifiers for the VDU.\r
+     * @param vduInstanceId The ID of the deployment to query\r
+     * \r
+     * @return A VduInstance object\r
+     * @throws VduException Thrown if the sub-orchestrator API calls fail or if a timeout occurs.\r
+     * Various subclasses of VduException may be thrown.\r
+     */\r
+    public VduInstance queryVdu (\r
+                               CloudInfo cloudInfo,\r
+                               String vduInstanceId)\r
+                       throws VduException;\r
+\r
+    \r
+    /**\r
+     * Delete a VDU instance by ID.  If the VIM sub-orchestrator supports pre-installation\r
+     * of blueprints/models, the blueprint itself may remain installed.  This is recommended,\r
+     * since other VDU instances may be using it.\r
+     * \r
+     * Some VIM orchestrators identify deployment instances by string UUIDs, and others \r
+     * by integers.  In the latter case, the ID will be passed in as a numeric string.\r
+     * \r
+     * For some VIMs, deletion may be a single command (e.g. Heat -> delete stack) or a\r
+     * series of API calls (e.g. Cloudify -> execute uninstall workflow, delete deployment).\r
+     * These details are hidden within the plug-in implementation.  The deletion should be\r
+     * fully completed before returning.    \r
+     *  \r
+     * The successful return is a VduInstance object which contains the state of the VDU\r
+     * just prior to deletion, with a status of DELETED.  If the deployment was not found,\r
+     * the VduInstance object should be empty (with a status of NOTFOUND).\r
+     * There is no rollback from a successful deletion.\r
+     * \r
+     * A deletion failure will result in an undefined deployment state - the components may\r
+     * or may not have been all or partially uninstalled, so the resulting deployment must\r
+     * be considered invalid.\r
+     *\r
+     * @param cloudInfo The target cloud + tenant identifiers for the VDU.\r
+     * @param instanceId The unique id of the deployment to delete.\r
+     * @param timeoutMinutes Timeout after which the delete action will be cancelled.\r
+     *                 Consider sending the entire model here, if it may be of use to the plug-in?\r
+     * \r
+     * @return A VduInstance object, representing its state just prior to deletion.\r
+     * \r
+     * @throws VduException Thrown if the API calls fail or if a timeout occurs.\r
+     * Various subclasses of VduException may be thrown.\r
+     */\r
+    public VduInstance deleteVdu (\r
+                               CloudInfo cloudInfo,\r
+                               String instanceId,\r
+                               int timeoutMinutes)\r
+                       throws VduException;\r
+\r
+    \r
+    /**\r
+     * The updateVdu interface attempts to update a VDU in-place, using either new inputs or\r
+     * a new model definition (i.e. updated templates/blueprints).  This depends on the\r
+     * capabilities of the targeted sub-orchestrator, as not all implementations are expected\r
+     * to support this ability.  It is primary included initially only for Heat.\r
+        *\r
+     * It is expected that parameters have been validated and contain at minimum the required\r
+     * parameters for the given template with no extra parameters.  The VDU instance name cannot\r
+     * be updated. \r
+     * \r
+        * The update should be fully completed before returning. The successful return is a\r
+        * VduInstance object containing the updated VDU state.\r
+     * \r
+     * An update failure will result in an undefined deployment state - the components may\r
+     * or may not have been all or partially modified, deleted, recreated, etc.  So the resulting\r
+     * VDU must be considered invalid.\r
+     * \r
+     * @param cloudInfo The target cloud + tenant identifiers for the VDU.\r
+     * @param instanceId The unique ID for the VDU instance to update.\r
+     * @param inputs A map of key/value inputs.  Values may be strings, numbers, or JSON objects.\r
+     *                 Will completely replace any inputs provided on the original instantiation.\r
+     * @param vduModel Object containing the collection of templates and files that comprise\r
+     *                 the blueprint for this VDU.\r
+     * @param rollbackOnFailure Flag to preserve or roll back the update on Failure.  Should normally\r
+     *         be True except in troubleshooting/debug cases.  Might not be supported in all plug-ins.\r
+     * \r
+     * @return A VduInfo object\r
+     * @throws VduException Thrown if the sub-orchestrator API calls fail or if a timeout occurs.\r
+     * Various subclasses of VduException may be thrown.\r
+     */\r
+    public VduInstance updateVdu (\r
+                       CloudInfo cloudInfo,\r
+                       String instanceId,\r
+                       Map<String,Object> inputs,\r
+                       VduModelInfo vduModel,\r
+                       boolean rollbackOnFailure)\r
+                                       throws VduException;\r
+\r
+}
\ No newline at end of file
diff --git a/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/adapters/vdu/VduStateType.java b/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/adapters/vdu/VduStateType.java
new file mode 100644 (file)
index 0000000..92f5cda
--- /dev/null
@@ -0,0 +1,36 @@
+/*-\r
+ * ============LICENSE_START=======================================================\r
+ * OPENECOMP - MSO\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.adapters.vdu;\r
+\r
+\r
+/*\r
+ * Enum status values to capture the state of a generic (cloud-agnostic) VDU.\r
+ */\r
+public enum VduStateType {\r
+       NOTFOUND,\r
+       INSTANTIATING,\r
+       INSTANTIATED,\r
+       DELETING,\r
+       DELETED,                // Note - only returned in success response to deleteVdu call.\r
+       UPDATING,\r
+       FAILED,\r
+       UNKNOWN\r
+}\r
diff --git a/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/adapters/vdu/VduStatus.java b/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/adapters/vdu/VduStatus.java
new file mode 100644 (file)
index 0000000..174bed9
--- /dev/null
@@ -0,0 +1,54 @@
+/*-\r
+ * ============LICENSE_START=======================================================\r
+ * ONAP - SO\r
+ * ================================================================================\r
+ * Copyright (C) 2018 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.adapters.vdu;\r
+\r
+public class VduStatus {\r
+       \r
+       private VduStateType state;     \r
+       private String errorMessage;\r
+       private PluginAction lastAction;        \r
+       \r
+       public VduStateType getState() {\r
+               return state;\r
+       }\r
+       public void setState(VduStateType state) {\r
+               this.state = state;\r
+       }\r
+       public String getErrorMessage() {\r
+               return errorMessage;\r
+       }\r
+       public void setErrorMessage(String errorMessage) {\r
+               this.errorMessage = errorMessage;\r
+       }\r
+       public PluginAction getLastAction() {\r
+               return lastAction;\r
+       }\r
+       public void setLastAction(PluginAction lastAction) {\r
+               this.lastAction = lastAction;\r
+       }\r
+       public void setLastAction (String action, String status, String rawCloudMessage) {\r
+               lastAction = new PluginAction();\r
+               lastAction.setAction (action);\r
+               lastAction.setStatus (status);\r
+               lastAction.setRawMessage(rawCloudMessage);\r
+       }\r
+       \r
+}
\ No newline at end of file
index f72e46a..bc3aa4f 100644 (file)
@@ -26,11 +26,22 @@ import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipOutputStream;
 
+import org.openecomp.mso.adapters.vdu.CloudInfo;
+import org.openecomp.mso.adapters.vdu.PluginAction;
+import org.openecomp.mso.adapters.vdu.VduArtifact;
+import org.openecomp.mso.adapters.vdu.VduArtifact.ArtifactType;
+import org.openecomp.mso.adapters.vdu.VduException;
+import org.openecomp.mso.adapters.vdu.VduInstance;
+import org.openecomp.mso.adapters.vdu.VduModelInfo;
+import org.openecomp.mso.adapters.vdu.VduPlugin;
+import org.openecomp.mso.adapters.vdu.VduStateType;
+import org.openecomp.mso.adapters.vdu.VduStatus;
 import org.openecomp.mso.cloud.CloudConfig;
 import org.openecomp.mso.cloud.CloudConfigFactory;
 import org.openecomp.mso.cloud.CloudSite;
@@ -56,6 +67,7 @@ import org.openecomp.mso.cloudify.v3.client.ExecutionsResource.CancelExecution;
 import org.openecomp.mso.cloudify.v3.client.ExecutionsResource.GetExecution;
 import org.openecomp.mso.cloudify.v3.client.ExecutionsResource.ListExecutions;
 import org.openecomp.mso.cloudify.v3.client.ExecutionsResource.StartExecution;
+import org.openecomp.mso.cloudify.v3.model.AzureConfig;
 import org.openecomp.mso.cloudify.v3.model.Blueprint;
 import org.openecomp.mso.cloudify.v3.model.CancelExecutionParams;
 import org.openecomp.mso.cloudify.v3.model.CloudifyError;
@@ -85,7 +97,7 @@ import com.fasterxml.jackson.core.JsonParseException;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 
-public class MsoCloudifyUtils extends MsoCommonUtils {
+public class MsoCloudifyUtils extends MsoCommonUtils implements VduPlugin{
 
        private MsoPropertiesFactory msoPropertiesFactory;
        private CloudConfigFactory cloudConfigFactory;
@@ -111,6 +123,12 @@ public class MsoCloudifyUtils extends MsoCommonUtils {
     
     private static final ObjectMapper JSON_MAPPER = new ObjectMapper();
 
+    /**
+     * This constructor MUST be used ONLY in the JUNIT tests, not for real code.
+     */
+    public MsoCloudifyUtils() {
+       
+    }
     /**
      * This constructor MUST be used ONLY in the JUNIT tests, not for real code.
      * The MsoPropertiesFactory will be added by EJB injection.
@@ -186,17 +204,24 @@ public class MsoCloudifyUtils extends MsoCommonUtils {
         
         Cloudify cloudify = getCloudifyClient (cloudSite.get());
 
-        // Create the Cloudify OpenstackConfig with the credentials
-        OpenstackConfig openstackConfig = getOpenstackConfig (cloudSite.get(), tenantId);
-        
         LOGGER.debug ("Ready to Create Deployment (" + deploymentId + ") with input params: " + inputs);
 
         // Build up the inputs, including:
         // - from provided "environment" file
         // - passed in by caller
-        // - special input for Openstack Credentials
-        Map<String,Object> expandedInputs = new HashMap<String,Object> (inputs);
-        expandedInputs.put("openstack_config", openstackConfig);
+        // - special input for cloud-specific Credentials
+        Map<String,Object> expandedInputs = new HashMap<> (inputs);
+        
+        String platform = cloudSite.get().getPlatform();
+        if (platform == null || platform.equals("") || platform.equalsIgnoreCase("OPENSTACK")) {
+               // Create the Cloudify OpenstackConfig with the credentials
+               OpenstackConfig openstackConfig = getOpenstackConfig (cloudSite.get(), tenantId);
+               expandedInputs.put("openstack_config", openstackConfig);
+        } else if (platform.equalsIgnoreCase("AZURE")) {
+               // Create Cloudify AzureConfig with the credentials
+               AzureConfig azureConfig = getAzureConfig (cloudSite.get(), tenantId);
+               expandedInputs.put("azure_config",  azureConfig);
+        }
          
         // Build up the parameters to create a new deployment
        CreateDeploymentParams deploymentParams = new CreateDeploymentParams();
@@ -236,10 +261,11 @@ public class MsoCloudifyUtils extends MsoCommonUtils {
 
        /*
         * It can take some time for Cloudify to be ready to execute a workflow
-        * on the deployment.  Sleep 10 seconds.
+        * on the deployment.  Sleep 30 seconds based on observation of behavior
+        * in a Cloudify VM instance (delay due to "create_deployment_environment").
         */
        try {
-               Thread.sleep(10000);
+               Thread.sleep(30000);
        } catch (InterruptedException e) {}
        
        /*
@@ -825,7 +851,7 @@ public class MsoCloudifyUtils extends MsoCommonUtils {
     /*
      * Common method to load a blueprint.  May be called from 
      */
-    private boolean uploadBlueprint (Cloudify cloudify, String blueprintId, String mainFileName, Map<String,byte[]> blueprintFiles)
+    protected boolean uploadBlueprint (Cloudify cloudify, String blueprintId, String mainFileName, Map<String,byte[]> blueprintFiles)
        throws MsoException
     {
        // Check if it already exists.  If so, return false.
@@ -1204,11 +1230,234 @@ public class MsoCloudifyUtils extends MsoCommonUtils {
         return me;
     }
 
+
+
+    /*******************************************************************************
+     * 
+     * Methods (and associated utilities) to implement the VduPlugin interface
+     * 
+     *******************************************************************************/
+    
+    /**
+     * VduPlugin interface for instantiate function.
+     * 
+     * This one is a bit more complex, in that it will first upload the blueprint if needed,
+     * then create the Cloudify deployment and execute the install workflow.
+     * 
+     * This implementation also merges any parameters defined in the ENV file with the other
+     * other input parameters for any undefined parameters).
+     * The basic MsoCloudifyUtils separates blueprint management from deploument actions,
+     * but the VduPlugin does not declare blueprint management operations.
+     */
+    public VduInstance instantiateVdu (
+                       CloudInfo cloudInfo,
+                       String instanceName,
+                       Map<String,Object> inputs,
+                       VduModelInfo vduModel,
+                       boolean rollbackOnFailure)
+       throws VduException
+    {
+       String cloudSiteId = cloudInfo.getCloudSiteId();
+       String tenantId = cloudInfo.getTenantId();
+       
+       // Translate the VDU ModelInformation structure to that which is needed for
+       // creating and uploading a blueprint.  Use the model customization UUID as
+       // the blueprint identifier.
+       
+       String blueprintId = vduModel.getModelCustomizationUUID();
+       
+               try {
+                       
+               if (! isBlueprintLoaded (cloudSiteId, blueprintId)) {
+                               LOGGER.debug ("Blueprint " + blueprintId + " is not loaded.  Will upload it now.");
+       
+                               // Prepare the blueprint inputs.  Need the set of blueprint templates and files,
+                               // plus the main blueprint name.
+                               Map<String,byte[]> blueprintFiles = new HashMap<>();
+                               String mainTemplate = "";
+       
+                               // Add all of the blueprint artifacts from the VDU model
+                               List<VduArtifact> vduArtifacts = vduModel.getArtifacts();
+                               for (VduArtifact vduArtifact: vduArtifacts)
+                               {
+                                       // Add all artifacts to the blueprint, with one exception.
+                                       // ENVIRONMENT files will be processed later as additional parameters.
+                                       
+                                       ArtifactType artifactType = vduArtifact.getType();
+                                       if (artifactType != ArtifactType.ENVIRONMENT) {
+                                               blueprintFiles.put(vduArtifact.getName(), vduArtifact.getContent());
+                                               
+                                               if (artifactType == ArtifactType.MAIN_TEMPLATE) {
+                                                       mainTemplate = vduArtifact.getName();
+                                               }
+                                       }
+                               }
+                                               
+                   // Upload the blueprint package
+                               uploadBlueprint(cloudSiteId, blueprintId, mainTemplate, blueprintFiles, false);
+                       }
+       }
+       catch (Exception e) {
+               throw new VduException ("CloudifyUtils (instantiateVDU): blueprint Exception", e);
+       }
+       
+               
+       // Next, create and install a new deployment based on the blueprint.
+       // For Cloudify, the deploymentId is specified by the client.  Just use the instance name
+       // as the ID.
+       
+       try {
+               // Query the Cloudify Deployment object and  populate a VduInstance
+               DeploymentInfo deployment = createAndInstallDeployment (cloudSiteId,
+                    tenantId,
+                    instanceName,
+                    blueprintId,
+                    inputs,
+                    true,  // (poll for completion)
+                    vduModel.getTimeoutMinutes(),
+                    rollbackOnFailure);
+               
+               VduInstance vduInstance = deploymentInfoToVduInstance(deployment);
+               
+               return vduInstance;
+       }
+       catch (Exception e) {
+               throw new VduException ("CloudifyUtils (instantiateVDU): Create-and-install-deployment Exception", e);
+       }
+    }
+    
+    
+    /**
+     * VduPlugin interface for query function.
+     */
+    public VduInstance queryVdu (CloudInfo cloudInfo, String instanceId)
+       throws VduException
+    {
+       String cloudSiteId = cloudInfo.getCloudSiteId();
+       String tenantId = cloudInfo.getTenantId();
+       
+       try {
+               // Query the Cloudify Deployment object and  populate a VduInstance
+               DeploymentInfo deployment = queryDeployment (cloudSiteId, tenantId, instanceId);
+               
+               VduInstance vduInstance = deploymentInfoToVduInstance(deployment);
+               
+               return vduInstance;
+       }
+       catch (Exception e) {
+               throw new VduException ("Query VDU Exception", e);
+       }
+    }
+    
+    
+    /**
+     * VduPlugin interface for delete function.
+     */
+    public VduInstance deleteVdu (CloudInfo cloudInfo, String instanceId, int timeoutMinutes)
+       throws VduException
+    {
+       String cloudSiteId = cloudInfo.getCloudSiteId();
+       String tenantId = cloudInfo.getTenantId();
+       
+       try {
+               // Uninstall and delete the Cloudify Deployment
+               DeploymentInfo deployment = uninstallAndDeleteDeployment (cloudSiteId, tenantId, instanceId, timeoutMinutes);
+               
+               // Populate a VduInstance based on the deleted Cloudify Deployment object
+               VduInstance vduInstance = deploymentInfoToVduInstance(deployment);
+               
+               return vduInstance;
+       }
+       catch (Exception e) {
+               throw new VduException ("Delete VDU Exception", e);
+       }
+    }
+    
+    
+    /**
+     * VduPlugin interface for update function.
+     * 
+     * Update is currently not supported in the MsoCloudifyUtils implementation.
+     * Just return a VduException.
+     * 
+     */
+    public VduInstance updateVdu (
+                       CloudInfo cloudInfo,
+                       String instanceId,
+                       Map<String,Object> inputs,
+                       VduModelInfo vduModel,
+                       boolean rollbackOnFailure)
+       throws VduException
+    {
+       throw new VduException ("CloudifyUtils: updateVDU interface not supported");
+    }
+    
+       
+    /*
+     * Convert the local DeploymentInfo object (Cloudify-specific) to a generic VduInstance object
+     */
+    protected VduInstance deploymentInfoToVduInstance (DeploymentInfo deployment)
+    {
+       VduInstance vduInstance = new VduInstance();
+       
+       // only one ID in Cloudify, use for both VDU name and ID
+       vduInstance.setVduInstanceId(deployment.getId());
+       vduInstance.setVduInstanceName(deployment.getId());
+       
+       // Copy inputs and outputs
+       vduInstance.setInputs(deployment.getInputs());
+       vduInstance.setOutputs(deployment.getOutputs());
+       
+       // Translate the status elements
+       vduInstance.setStatus(deploymentStatusToVduStatus (deployment));
+       
+       return vduInstance;
+    }
+    
+    protected VduStatus deploymentStatusToVduStatus (DeploymentInfo deployment)
+    {
+       VduStatus vduStatus = new VduStatus();
+       
+       // Determine the status based on last action & status
+       // DeploymentInfo object should be enhanced to report a better status internally.
+       DeploymentStatus status = deployment.getStatus();
+       
+       if (status == null) {
+               vduStatus.setState(VduStateType.UNKNOWN);
+       }
+       else if (status == DeploymentStatus.NOTFOUND) {
+               vduStatus.setState(VduStateType.NOTFOUND);
+       }
+       else if (status == DeploymentStatus.INSTALLED) {
+               vduStatus.setState(VduStateType.INSTANTIATED);
+       }
+       else if (status == DeploymentStatus.CREATED) {
+               // Deployment exists but is not installed.  This shouldn't really happen,
+               // since create + install or uninstall + delete are always done together.
+               // But account for it anyway, assuming the operation is still in progress.
+               String lastAction = deployment.getLastAction();
+               if (lastAction == null)
+                       vduStatus.setState(VduStateType.INSTANTIATING);
+               else
+                       vduStatus.setState(VduStateType.DELETING);
+       }
+       else if (status == DeploymentStatus.FAILED) {
+               vduStatus.setState(VduStateType.FAILED);
+       } else {
+               vduStatus.setState(VduStateType.UNKNOWN);
+       }
+       
+       vduStatus.setErrorMessage(deployment.getErrorMessage());
+       vduStatus.setLastAction(new PluginAction(deployment.getLastAction(), deployment.getActionStatus(), deployment.getErrorMessage()));
+       
+       return vduStatus;
+    }
+    
     /*
      * Return an OpenstackConfig object as expected by Cloudify Openstack Plug-in.
      * Base the values on the CloudSite definition.
      */
-    private OpenstackConfig getOpenstackConfig (CloudSite cloudSite, String tenantId) {
+    protected OpenstackConfig getOpenstackConfig (CloudSite cloudSite, String tenantId) {
         OpenstackConfig openstackConfig = new OpenstackConfig();
         openstackConfig.setRegion (cloudSite.getRegionId());
         openstackConfig.setAuthUrl (cloudSite.getIdentityService().getIdentityUrl());
@@ -1217,4 +1466,18 @@ public class MsoCloudifyUtils extends MsoCommonUtils {
         openstackConfig.setTenantName (tenantId);
         return openstackConfig;
     }
+    
+    /*
+     * Return an Azure object as expected by Cloudify Azure Plug-in.
+     * Base the values on the CloudSite definition.
+     */
+    protected AzureConfig getAzureConfig (CloudSite cloudSite, String tenantId) {
+        AzureConfig azureConfig = new AzureConfig();
+        // TODO: Use adminTenant for now, instead of adding another element
+        azureConfig.setSubscriptionId (cloudSite.getIdentityService().getAdminTenant());
+        azureConfig.setTenantId (tenantId);
+        azureConfig.setClientId (cloudSite.getIdentityService().getMsoId());
+        azureConfig.setClientSecret (cloudSite.getIdentityService().getMsoPass());
+        return azureConfig;
+    }
 }
index 92220f8..7046096 100644 (file)
 package org.openecomp.mso.openstack.utils;
 
 
-
 import java.util.HashSet;
 import java.util.ArrayList;
 import java.util.Set;
+
 import org.openecomp.mso.db.catalog.beans.HeatTemplateParam;
 import org.openecomp.mso.logger.MsoLogger;
 
 public class MsoHeatEnvironmentEntry {
 
-    private static final MsoLogger LOGGER = MsoLogger.getMsoLogger (MsoLogger.Catalog.RA);
-    
-       private Set<MsoHeatEnvironmentParameter> parameters = null;
-       private Set<MsoHeatEnvironmentResource> resources = null;
-       private StringBuilder rawEntry = null;
-       private boolean valid = true;
-       private String errorString = null;
-       private StringBuilder resourceRegistryEntryRaw = null;
-       
-       public MsoHeatEnvironmentEntry() {
-               super();
-       }
-       
-       public MsoHeatEnvironmentEntry(StringBuilder sb) {
-               this();
-               this.rawEntry = sb;
-               this.processRawEntry();
-       }
-       
-       private void processRawEntry() {
-               try {
-                       if (this.rawEntry == null || "".equals(this.rawEntry))
-                               return;
-                       byte[] b = this.rawEntry.toString().getBytes();
-                       MsoYamlEditorWithEnvt yaml = new MsoYamlEditorWithEnvt(b);
-                       this.parameters = yaml.getParameterListFromEnvt();
-                       //this.resources = yaml.getResourceListFromEnvt();
-                       StringBuilder sb = this.getResourceRegistryRawEntry();
-                       if (sb == null) {
-                               this.resourceRegistryEntryRaw = new StringBuilder("");
-                       } else {
-                               this.resourceRegistryEntryRaw = sb;
-                       }
-               } catch (Exception e) {
-                   LOGGER.debug("Exception:", e);
-                       this.valid = false;
-                       this.errorString = e.getMessage();
-                       //e.printStackTrace();
-               }
-       }
-       
-       public boolean isValid() {
-               return this.valid;
-       }
-       public String getErrorString() {
-               return this.errorString;
-       }
-       
-       public Set<MsoHeatEnvironmentParameter> getParameters() {
-               return this.parameters;
-       }
-       public Set<MsoHeatEnvironmentResource> getResources() {
-               return this.resources;
-       }
-       public void setParameters(Set<MsoHeatEnvironmentParameter> paramSet) {
-               if (paramSet == null) {
-                       this.parameters = null;
-               } else {
-                       this.parameters = paramSet;
-               }
-       }
-       public void setResources(Set<MsoHeatEnvironmentResource> resourceSet) {
-               if (resourceSet == null) {
-                       this.resources = null;
-               } else {
-                       this.resources = resourceSet;
-               }
-       }
-       
-       public void addParameter(MsoHeatEnvironmentParameter hep) {
-               if (this.parameters == null) {
-                       this.parameters = new HashSet<>();
-               }
-               this.parameters.add(hep);
-       }
-       public void addResource(MsoHeatEnvironmentResource her) {
-               if (this.resources == null) {
-                       this.resources = new HashSet<>();
-               }
-               this.resources.add(her);
-       }
-       
-       public int getNumberOfParameters() {
-               return this.parameters.size();
-       }
-       public int getNumberOfResources() {
-               return this.resources.size();
-       }
-       
-       public boolean hasResources() {
-               if (this.resources != null && this.resources.size() > 0) {
-                       return true;
-               } 
-               return false;
-       }
-       public boolean hasParameters() {
-               if (this.parameters != null && this.parameters.size() > 0) {
-                       return true;
-               }
-               return false;
-       }
-       
-       public boolean containsParameter(String paramName) {
-               boolean contains = false;
-               if (this.parameters == null || this.parameters.size() < 1) {
-                       return false;
-               }
-               if (this.parameters.contains(new MsoHeatEnvironmentParameter(paramName))) {
-                       contains = true;
-               }
-               return contains;
-       }
-       
-       public boolean containsParameter(String paramName, String paramAlias) {
-               if (this.containsParameter(paramName)) {
-                       return true;
-               }
-               if (this.containsParameter(paramAlias)) {
-                       return true;
-               }
-               return false;
-       }
-       
-       @Override
-       public String toString() {
-               return "MsoHeatEnvironmentEntry{" + "parameters=" + parameters +
-                       ", resourceRegistryEntryRaw='" + resourceRegistryEntryRaw + '\'' +
-                       '}';
-       }
-       
-       public StringBuilder toFullStringExcludeNonParams(Set<HeatTemplateParam> params) {
-               // Basically give back the envt - but exclude the params that aren't in the HeatTemplate 
-               
-               StringBuilder sb = new StringBuilder();
-               ArrayList<String> paramNameList = new ArrayList<String>(params.size());
-               for (HeatTemplateParam htp : params) {
-                       paramNameList.add(htp.getParamName());
-               }
-               
-               if (this.hasParameters()) {
-                       sb.append("parameters:\n");
-                       for (MsoHeatEnvironmentParameter hep : this.parameters) {
-                               String paramName = hep.getName();
-                               if (paramNameList.contains(paramName)) {
-                                       // This parameter *is* in the Heat Template - so include it:
-                                       sb.append("  " + hep.getName() + ": " + hep.getValue() + "\n");
-                                       // New - 1607 - if any of the params mapped badly - JUST RETURN THE ORIGINAL ENVT!
-                                       if (hep.getValue().startsWith("_BAD")) {
-                                               return this.rawEntry;
-                                       }
-                               } 
-                       }
-                       sb.append("\n");
-               }
+    private static final MsoLogger LOGGER = MsoLogger.getMsoLogger(MsoLogger.Catalog.RA);
+
+    private Set<MsoHeatEnvironmentParameter> parameters = null;
+    private Set<MsoHeatEnvironmentResource> resources = null;
+    private StringBuilder rawEntry = null;
+    private boolean valid = true;
+    private String errorString = null;
+    private StringBuilder resourceRegistryEntryRaw = null;
+
+    public MsoHeatEnvironmentEntry() {
+        super();
+    }
+
+    public MsoHeatEnvironmentEntry(StringBuilder sb) {
+        this();
+        this.rawEntry = sb;
+        this.processRawEntry();
+    }
+
+    private void processRawEntry() {
+        try {
+            if (this.rawEntry == null || "".equals(this.rawEntry))
+                return;
+            byte[] b = this.rawEntry.toString().getBytes();
+            MsoYamlEditorWithEnvt yaml = new MsoYamlEditorWithEnvt(b);
+            this.parameters = yaml.getParameterListFromEnvt();
+            //this.resources = yaml.getResourceListFromEnvt();
+            StringBuilder sb = this.getResourceRegistryRawEntry();
+            if (sb == null) {
+                this.resourceRegistryEntryRaw = new StringBuilder("");
+            } else {
+                this.resourceRegistryEntryRaw = sb;
+            }
+        } catch (Exception e) {
+            LOGGER.debug("Exception:", e);
+            this.valid = false;
+            this.errorString = e.getMessage();
+            //e.printStackTrace();
+        }
+    }
+
+    public boolean isValid() {
+        return this.valid;
+    }
+
+    public String getErrorString() {
+        return this.errorString;
+    }
+
+    public Set<MsoHeatEnvironmentParameter> getParameters() {
+        return this.parameters;
+    }
+
+    public Set<MsoHeatEnvironmentResource> getResources() {
+        return this.resources;
+    }
+
+    public void setParameters(Set<MsoHeatEnvironmentParameter> paramSet) {
+        if (paramSet == null) {
+            this.parameters = null;
+        } else {
+            this.parameters = paramSet;
+        }
+    }
+
+    public void setResources(Set<MsoHeatEnvironmentResource> resourceSet) {
+        if (resourceSet == null) {
+            this.resources = null;
+        } else {
+            this.resources = resourceSet;
+        }
+    }
+
+    public void addParameter(MsoHeatEnvironmentParameter hep) {
+        if (this.parameters == null) {
+            this.parameters = new HashSet<>();
+        }
+        this.parameters.add(hep);
+    }
+
+    public void addResource(MsoHeatEnvironmentResource her) {
+        if (this.resources == null) {
+            this.resources = new HashSet<>();
+        }
+        this.resources.add(her);
+    }
+
+    public int getNumberOfParameters() {
+        return this.parameters.size();
+    }
+
+    public int getNumberOfResources() {
+        return this.resources.size();
+    }
+
+    public boolean hasResources() {
+        if (this.resources != null && this.resources.size() > 0) {
+            return true;
+        }
+        return false;
+    }
+
+    public boolean hasParameters() {
+        if (this.parameters != null && this.parameters.size() > 0) {
+            return true;
+        }
+        return false;
+    }
+
+    public boolean containsParameter(String paramName) {
+        boolean contains = false;
+        if (this.parameters == null || this.parameters.size() < 1) {
+            return false;
+        }
+        if (this.parameters.contains(new MsoHeatEnvironmentParameter(paramName))) {
+            contains = true;
+        }
+        return contains;
+    }
+
+    public boolean containsParameter(String paramName, String paramAlias) {
+        if (this.containsParameter(paramName)) {
+            return true;
+        }
+        if (this.containsParameter(paramAlias)) {
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return "MsoHeatEnvironmentEntry{" + "parameters=" + parameters +
+                ", resourceRegistryEntryRaw='" + resourceRegistryEntryRaw + '\'' +
+                '}';
+    }
+
+    public StringBuilder toFullStringExcludeNonParams(Set<HeatTemplateParam> params) {
+        // Basically give back the envt - but exclude the params that aren't in the HeatTemplate
+
+        StringBuilder sb = new StringBuilder();
+        ArrayList<String> paramNameList = new ArrayList<String>(params.size());
+        for (HeatTemplateParam htp : params) {
+            paramNameList.add(htp.getParamName());
+        }
+
+        if (this.hasParameters()) {
+            sb.append("parameters:\n");
+            for (MsoHeatEnvironmentParameter hep : this.parameters) {
+                String paramName = hep.getName();
+                if (paramNameList.contains(paramName)) {
+                    // This parameter *is* in the Heat Template - so include it:
+                    sb.append("  " + hep.getName() + ": " + hep.getValue() + "\n");
+                    // New - 1607 - if any of the params mapped badly - JUST RETURN THE ORIGINAL ENVT!
+                    if (hep.getValue().startsWith("_BAD")) {
+                        return this.rawEntry;
+                    }
+                }
+            }
+            sb.append("\n");
+        }
 //             if (this.hasResources()) {
 //                     sb.append("resource_registry:\n");
 //                     for (MsoHeatEnvironmentResource her : this.resources) {
 //                             sb.append("   \"" + her.getName() + "\": " + her.getValue() + "\n");
 //                     }
 //             }
-               sb.append("\n");
-               sb.append(this.resourceRegistryEntryRaw);                               
-               return sb;
-       }
-       
-       public StringBuilder toFullString() {
-               StringBuilder sb = new StringBuilder();
-               
-               if (this.hasParameters()) {
-                       sb.append("parameters:\n");
-                       for (MsoHeatEnvironmentParameter hep : this.parameters) {
-                               sb.append("   " + hep.getName() + ":  " + hep.getValue() + "\n");
-                       }
-                       sb.append("\n");
-               }
+        sb.append("\n");
+        sb.append(this.resourceRegistryEntryRaw);
+        return sb;
+    }
+
+    public StringBuilder toFullString() {
+        StringBuilder sb = new StringBuilder();
+
+        if (this.hasParameters()) {
+            sb.append("parameters:\n");
+            for (MsoHeatEnvironmentParameter hep : this.parameters) {
+                sb.append("   " + hep.getName() + ":  " + hep.getValue() + "\n");
+            }
+            sb.append("\n");
+        }
 //             if (this.hasResources()) {
 //                     sb.append("resource_registry:\n");
 //                     for (MsoHeatEnvironmentResource her : this.resources) {
 //                             sb.append("   \"" + her.getName() + "\": " + her.getValue() + "\n");
 //                     }
 //             }
-               sb.append("\n");
-               sb.append(this.resourceRegistryEntryRaw);                       
-               return sb;
-       }
-       
-        public StringBuilder getRawEntry() {
-                return this.rawEntry;
-        }
-       
-       private StringBuilder getResourceRegistryRawEntry() {
-               
-               if (this.rawEntry == null) {
-                       return null;
-               }
-               
-               StringBuilder sb = new StringBuilder();
-               int indexOf = this.rawEntry.indexOf("resource_registry:");
-               if (indexOf < 0) { // no resource_registry:
-                       return null;
-               }
-               sb.append(this.rawEntry.substring(indexOf));
-               return sb;
-       }
-       
+        sb.append("\n");
+        sb.append(this.resourceRegistryEntryRaw);
+        return sb;
+    }
+
+    public StringBuilder getRawEntry() {
+        return this.rawEntry;
+    }
+
+    private StringBuilder getResourceRegistryRawEntry() {
+
+        if (this.rawEntry == null) {
+            return null;
+        }
+
+        StringBuilder sb = new StringBuilder();
+        int indexOf = this.rawEntry.indexOf("resource_registry:");
+        if (indexOf < 0) { // no resource_registry:
+            return null;
+        }
+        sb.append(this.rawEntry.substring(indexOf));
+        return sb;
+    }
+
+    public void setHPAParameters(StringBuilder hpasb) {
+        try {
+            MsoYamlEditorWithEnvt yaml = new MsoYamlEditorWithEnvt(hpasb.toString().getBytes());
+            Set<MsoHeatEnvironmentParameter> hpaParams = yaml.getParameterListFromEnvt();
+            for (MsoHeatEnvironmentParameter hpaparam : hpaParams) {
+                for (MsoHeatEnvironmentParameter param : this.parameters) {
+                    if (param.getName() == hpaparam.getName()) {
+                        param.setValue(hpaparam.getValue());
+                    }
+                }
+            }
+        } catch (Exception e) {
+            LOGGER.debug("Exception:", e);
+            this.errorString = e.getMessage();
+            //e.printStackTrace();
+        }
+    }
 }
index 7dd14d8..3f5da19 100644 (file)
@@ -30,6 +30,16 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import org.openecomp.mso.adapters.vdu.CloudInfo;
+import org.openecomp.mso.adapters.vdu.PluginAction;
+import org.openecomp.mso.adapters.vdu.VduArtifact;
+import org.openecomp.mso.adapters.vdu.VduArtifact.ArtifactType;
+import org.openecomp.mso.adapters.vdu.VduException;
+import org.openecomp.mso.adapters.vdu.VduInstance;
+import org.openecomp.mso.adapters.vdu.VduModelInfo;
+import org.openecomp.mso.adapters.vdu.VduPlugin;
+import org.openecomp.mso.adapters.vdu.VduStateType;
+import org.openecomp.mso.adapters.vdu.VduStatus;
 import org.openecomp.mso.cloud.CloudConfig;
 import org.openecomp.mso.cloud.CloudConfigFactory;
 import org.openecomp.mso.cloud.CloudIdentity;
@@ -52,7 +62,6 @@ import org.openecomp.mso.properties.MsoJavaProperties;
 import org.openecomp.mso.properties.MsoPropertiesException;
 import org.openecomp.mso.properties.MsoPropertiesFactory;
 
-import com.fasterxml.jackson.core.JsonParseException;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.woorea.openstack.base.client.OpenStackConnectException;
@@ -68,7 +77,7 @@ import com.woorea.openstack.keystone.model.Access;
 import com.woorea.openstack.keystone.model.Authentication;
 import com.woorea.openstack.keystone.utils.KeystoneUtils;
 
-public class MsoHeatUtils extends MsoCommonUtils {
+public class MsoHeatUtils extends MsoCommonUtils implements VduPlugin{
 
        private MsoPropertiesFactory msoPropertiesFactory;
 
@@ -110,6 +119,13 @@ public class MsoHeatUtils extends MsoCommonUtils {
 
     private static final ObjectMapper JSON_MAPPER = new ObjectMapper();
 
+    /**
+     * This constructor MUST be used ONLY in the JUNIT tests, not for real code.
+     */
+    public MsoHeatUtils() {
+       
+    }
+    
     /**
      * This constructor MUST be used ONLY in the JUNIT tests, not for real code.
      * The MsoPropertiesFactory will be added by EJB injection.
@@ -1643,4 +1659,204 @@ public class MsoHeatUtils extends MsoCommonUtils {
                return sb.toString();
        }
        
+       /*******************************************************************************
+     * 
+     * Methods (and associated utilities) to implement the VduPlugin interface
+     * 
+     *******************************************************************************/
+    
+    /**
+     * VduPlugin interface for instantiate function.
+     * 
+     * Translate the VduPlugin parameters to the corresponding 'createStack' parameters,
+     * and then invoke the existing function.
+     */
+    public VduInstance instantiateVdu (
+                       CloudInfo cloudInfo,
+                       String instanceName,
+                       Map<String,Object> inputs,
+                       VduModelInfo vduModel,
+                       boolean rollbackOnFailure)
+       throws VduException
+    {
+       String cloudSiteId = cloudInfo.getCloudSiteId();
+       String tenantId = cloudInfo.getTenantId();
+       
+       // Translate the VDU ModelInformation structure to that which is needed for
+       // creating the Heat stack.  Loop through the artifacts, looking specifically
+       // for MAIN_TEMPLATE and ENVIRONMENT.  Any other artifact will
+       // be attached as a FILE.
+       String heatTemplate = null;
+       Map<String,Object> nestedTemplates = new HashMap<>();
+       Map<String,Object> files = new HashMap<>();
+       String heatEnvironment = null;
+       
+       for (VduArtifact vduArtifact: vduModel.getArtifacts()) {
+               if (vduArtifact.getType() == ArtifactType.MAIN_TEMPLATE) {
+                       heatTemplate = new String(vduArtifact.getContent());
+               }
+               else if (vduArtifact.getType() == ArtifactType.NESTED_TEMPLATE) {
+                       nestedTemplates.put(vduArtifact.getName(), new String(vduArtifact.getContent()));
+               }
+               else if (vduArtifact.getType() == ArtifactType.ENVIRONMENT) {
+                       heatEnvironment = new String(vduArtifact.getContent());
+               }
+       }
+       
+       try {
+           StackInfo stackInfo = createStack (cloudSiteId,
+                    tenantId,
+                    instanceName,
+                    heatTemplate,
+                    inputs,
+                    true,      // poll for completion
+                    vduModel.getTimeoutMinutes(),
+                    heatEnvironment,
+                    nestedTemplates,
+                    files,
+                    rollbackOnFailure);
+               
+           // Populate a vduInstance from the StackInfo
+               VduInstance vduInstance = stackInfoToVduInstance(stackInfo);
+               
+               return vduInstance;
+       }
+       catch (Exception e) {
+               throw new VduException ("MsoHeatUtils (instantiateVDU): createStack Exception", e);
+       }
+    }
+    
+    
+    /**
+     * VduPlugin interface for query function.
+     */
+    public VduInstance queryVdu (CloudInfo cloudInfo, String instanceId)
+       throws VduException
+    {
+       String cloudSiteId = cloudInfo.getCloudSiteId();
+       String tenantId = cloudInfo.getTenantId();
+       
+       try {
+               // Query the Cloudify Deployment object and  populate a VduInstance
+               StackInfo stackInfo = queryStack (cloudSiteId, tenantId, instanceId);
+               
+               VduInstance vduInstance = stackInfoToVduInstance(stackInfo);
+               
+               return vduInstance;
+       }
+       catch (Exception e) {
+               throw new VduException ("MsoHeatUtile (queryVdu): queryStack Exception ", e);
+       }
+    }
+    
+    
+    /**
+     * VduPlugin interface for delete function.
+     */
+    public VduInstance deleteVdu (CloudInfo cloudInfo, String instanceId, int timeoutMinutes)
+       throws VduException
+    {
+       String cloudSiteId = cloudInfo.getCloudSiteId();
+       String tenantId = cloudInfo.getTenantId();
+       
+       try {
+               // Delete the Heat stack
+               StackInfo stackInfo = deleteStack (tenantId, cloudSiteId, instanceId, true);
+               
+               // Populate a VduInstance based on the deleted Cloudify Deployment object
+               VduInstance vduInstance = stackInfoToVduInstance(stackInfo);
+               
+               // Override return state to DELETED (HeatUtils sets to NOTFOUND)
+               vduInstance.getStatus().setState(VduStateType.DELETED);
+               
+               return vduInstance;
+       }
+       catch (Exception e) {
+               throw new VduException ("Delete VDU Exception", e);
+       }
+    }
+    
+    
+    /**
+     * VduPlugin interface for update function.
+     * 
+     * Update is currently not supported in the MsoHeatUtils implementation of VduPlugin.
+     * Just return a VduException.
+     * 
+     */
+    public VduInstance updateVdu (
+                       CloudInfo cloudInfo,
+                       String instanceId,
+                       Map<String,Object> inputs,
+                       VduModelInfo vduModel,
+                       boolean rollbackOnFailure)
+       throws VduException
+    {
+       throw new VduException ("MsoHeatUtils: updateVdu interface not supported");
+    }
+    
+       
+    /*
+     * Convert the local DeploymentInfo object (Cloudify-specific) to a generic VduInstance object
+     */
+    private VduInstance stackInfoToVduInstance (StackInfo stackInfo)
+    {
+       VduInstance vduInstance = new VduInstance();
+       
+       // The full canonical name as the instance UUID
+       vduInstance.setVduInstanceId(stackInfo.getCanonicalName());
+       vduInstance.setVduInstanceName(stackInfo.getName());
+       
+       // Copy inputs and outputs
+       vduInstance.setInputs(stackInfo.getParameters());
+       vduInstance.setOutputs(stackInfo.getOutputs());
+       
+       // Translate the status elements
+       vduInstance.setStatus(stackStatusToVduStatus (stackInfo));
+       
+       return vduInstance;
+    }
+    
+    private VduStatus stackStatusToVduStatus (StackInfo stackInfo)
+    {
+       VduStatus vduStatus = new VduStatus();
+       
+       // Map the status fields to more generic VduStatus.
+       // There are lots of HeatStatus values, so this is a bit long...
+       HeatStatus heatStatus = stackInfo.getStatus();
+       String statusMessage = stackInfo.getStatusMessage();
+       
+       if (heatStatus == HeatStatus.INIT  ||  heatStatus == HeatStatus.BUILDING) {
+               vduStatus.setState(VduStateType.INSTANTIATING);
+               vduStatus.setLastAction((new PluginAction ("create", "in_progress", statusMessage)));
+       }
+       else if (heatStatus == HeatStatus.NOTFOUND) {
+               vduStatus.setState(VduStateType.NOTFOUND);
+       }
+       else if (heatStatus == HeatStatus.CREATED) {
+               vduStatus.setState(VduStateType.INSTANTIATED);
+               vduStatus.setLastAction((new PluginAction ("create", "complete", statusMessage)));
+       }
+       else if (heatStatus == HeatStatus.UPDATED) {
+               vduStatus.setState(VduStateType.INSTANTIATED);
+               vduStatus.setLastAction((new PluginAction ("update", "complete", statusMessage)));
+       }
+       else if (heatStatus == HeatStatus.UPDATING) {
+               vduStatus.setState(VduStateType.UPDATING);
+               vduStatus.setLastAction((new PluginAction ("update", "in_progress", statusMessage)));
+       }
+       else if (heatStatus == HeatStatus.DELETING) {
+               vduStatus.setState(VduStateType.DELETING);
+               vduStatus.setLastAction((new PluginAction ("delete", "in_progress", statusMessage)));
+       }
+       else if (heatStatus == HeatStatus.FAILED) {
+               vduStatus.setState(VduStateType.FAILED);
+               vduStatus.setErrorMessage(stackInfo.getStatusMessage());
+       } else {
+               vduStatus.setState(VduStateType.UNKNOWN);
+       }
+       
+       return vduStatus;
+    }
+       
 }
diff --git a/adapters/mso-adapter-utils/src/test/java/org/openecomp/mso/adapters/vdu/BeansTest.java b/adapters/mso-adapter-utils/src/test/java/org/openecomp/mso/adapters/vdu/BeansTest.java
new file mode 100644 (file)
index 0000000..1452c15
--- /dev/null
@@ -0,0 +1,56 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2018 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.adapters.vdu;
+
+import org.junit.Test;
+
+import com.openpojo.reflection.PojoClass;
+import com.openpojo.reflection.PojoClassFilter;
+import com.openpojo.reflection.filters.FilterPackageInfo;
+import com.openpojo.validation.Validator;
+import com.openpojo.validation.ValidatorBuilder;
+import com.openpojo.validation.rule.impl.GetterMustExistRule;
+import com.openpojo.validation.test.impl.GetterTester;
+import com.openpojo.validation.test.impl.SetterTester;
+
+public class BeansTest {
+
+       private PojoClassFilter filterTestClasses = new FilterTestClasses();
+
+       @Test
+       public void pojoStructure() {
+               test("org.openecomp.mso.adapters.vdu");
+       }
+
+       private void test(String pojoPackage) {
+               Validator validator = ValidatorBuilder.create()
+                               .with(new GetterMustExistRule())
+                               .with(new SetterTester())
+                               .with(new GetterTester())
+                               .build();
+               validator.validate(pojoPackage, new FilterPackageInfo(), filterTestClasses);
+       }
+       private static class FilterTestClasses implements PojoClassFilter {
+               public boolean include(PojoClass pojoClass) {
+                       return !pojoClass.getSourcePath().contains("/test-classes/");
+               }
+       }
+}
diff --git a/adapters/mso-adapter-utils/src/test/java/org/openecomp/mso/cloudify/utils/MsoCloudifyUtilsTest.java b/adapters/mso-adapter-utils/src/test/java/org/openecomp/mso/cloudify/utils/MsoCloudifyUtilsTest.java
new file mode 100644 (file)
index 0000000..821522f
--- /dev/null
@@ -0,0 +1,143 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2018 Huawei Technologies Co., Ltd. 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.cloudify.utils;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.openecomp.mso.cloud.CloudConfigFactory;
+import org.openecomp.mso.cloud.CloudSite;
+import org.openecomp.mso.cloudify.beans.DeploymentInfo;
+import org.openecomp.mso.cloudify.exceptions.MsoCloudifyManagerNotFound;
+import org.openecomp.mso.cloudify.v3.client.Cloudify;
+import org.openecomp.mso.cloudify.v3.model.DeploymentOutputs;
+import org.openecomp.mso.openstack.exceptions.MsoException;
+import org.openecomp.mso.properties.MsoPropertiesFactory;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import java.util.HashMap;
+import java.util.Map;
+import static org.mockito.Mockito.mock;
+
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.doReturn;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({MsoCloudifyUtils.class})
+
+
+public class MsoCloudifyUtilsTest {
+
+
+    @Mock
+    MsoPropertiesFactory msoPropertiesFactory;
+
+    @Mock
+    CloudConfigFactory cloudConfigFactory;
+
+    @Mock
+    DeploymentInfo deploymentInfo;
+
+    @Mock
+    Cloudify cloudify;
+
+    @Mock
+    DeploymentOutputs deploymentOutputs;
+
+    @Mock
+    CloudSite cloudSite;
+
+    @Test(expected = NullPointerException.class)
+    public void testCreateandInstallDeployment() throws MsoException {
+
+        MsoCloudifyUtils mcu = new MsoCloudifyUtils("msoPropID", msoPropertiesFactory, cloudConfigFactory);
+        Map<String, Object> inputs = new HashMap<>();
+        inputs.put("1", "value");
+
+        mcu.createAndInstallDeployment("cloudSiteId", "tenantId", "deploymentId", "blueprintId"
+                , inputs, true, 1, true);
+
+        assert (mcu.createAndInstallDeployment("cloudSiteId", "tenantId", "deploymentId", "blueprintId"
+                , inputs, true, 1, true) != null);
+
+
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void testDeploymentOutputs() throws MsoException {
+
+        MsoCloudifyUtils mcu = new MsoCloudifyUtils("msoPropID", msoPropertiesFactory, cloudConfigFactory);
+        mcu.queryDeployment("cloudSiteId", "tenantId", "deploymentId");
+        assert (mcu.queryDeployment("cloudSiteId", "tenantId", "deploymentId") != null);
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void testUninstallAndDeleteDeployment() throws MsoException {
+
+        MsoCloudifyUtils mcu = new MsoCloudifyUtils("msoPropID", msoPropertiesFactory, cloudConfigFactory);
+        mcu.uninstallAndDeleteDeployment("cloudSiteId", "tenantId", "deploymentId", 1);
+        assert (mcu.uninstallAndDeleteDeployment("cloudSiteId", "tenantId", "deploymentId", 1) != null);
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void testIsBlueprintLoaded() throws MsoException {
+
+        MsoCloudifyUtils mcu = new MsoCloudifyUtils("msoPropID", msoPropertiesFactory, cloudConfigFactory);
+        mcu.isBlueprintLoaded("cloudSiteId", "blueprintId");
+        assertTrue(mcu.isBlueprintLoaded("cloudSiteId", "blueprintId"));
+    }
+
+    @Test(expected = MsoCloudifyManagerNotFound.class)
+    public void testCloudifyClient() throws MsoException {
+
+        MsoCloudifyUtils mcu = new MsoCloudifyUtils("msoPropID", msoPropertiesFactory, cloudConfigFactory);
+        mcu.getCloudifyClient(cloudSite);
+        assert (mcu.getCloudifyClient(cloudSite) != null);
+
+    }
+
+
+    @Test(expected = NullPointerException.class)
+    public void testuploadBlueprint() throws MsoException {
+
+            MsoCloudifyUtils mcu = new MsoCloudifyUtils("msoPropID", msoPropertiesFactory, cloudConfigFactory);
+
+            Map<String, byte[]> blueprintFiles = new HashMap<String, byte[]>();
+            byte[] byteArray = new byte[]{8, 1, 2, 8};
+            blueprintFiles.put("1", byteArray);
+
+            mcu.uploadBlueprint("cloudSiteId", "blueprintId", "mainFileName", blueprintFiles, false);
+
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void testqueryDeployment() throws MsoException {
+
+        MsoCloudifyUtils mcu = new MsoCloudifyUtils("msoPropID", msoPropertiesFactory, cloudConfigFactory);
+        mcu.queryDeployment(cloudify, "deploymentId");
+        assert (mcu.queryDeployment(cloudify, "deploymentId") != null);
+
+
+    }
+
+}
diff --git a/adapters/mso-adapter-utils/src/test/java/org/openecomp/mso/cloudify/utils/MsoCloudifyUtilsTest2.java b/adapters/mso-adapter-utils/src/test/java/org/openecomp/mso/cloudify/utils/MsoCloudifyUtilsTest2.java
new file mode 100644 (file)
index 0000000..05608b4
--- /dev/null
@@ -0,0 +1,254 @@
+/*-\r
+ * ============LICENSE_START=======================================================\r
+ * ONAP - SO\r
+ * ================================================================================\r
+ * Copyright (C) 2018 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.cloudify.utils;\r
+\r
+import static com.shazam.shazamcrest.MatcherAssert.assertThat;\r
+import static com.shazam.shazamcrest.matcher.Matchers.sameBeanAs;\r
+import static org.mockito.Mockito.doReturn;\r
+import static org.mockito.Mockito.when;\r
+\r
+import java.util.ArrayList;\r
+import java.util.HashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
+import java.util.Optional;\r
+\r
+import org.junit.Test;\r
+import org.mockito.Mockito;\r
+import org.openecomp.mso.adapters.vdu.CloudInfo;\r
+import org.openecomp.mso.adapters.vdu.PluginAction;\r
+import org.openecomp.mso.adapters.vdu.VduArtifact;\r
+import org.openecomp.mso.adapters.vdu.VduArtifact.ArtifactType;\r
+import org.openecomp.mso.adapters.vdu.VduInstance;\r
+import org.openecomp.mso.adapters.vdu.VduModelInfo;\r
+import org.openecomp.mso.adapters.vdu.VduStateType;\r
+import org.openecomp.mso.adapters.vdu.VduStatus;\r
+import org.openecomp.mso.cloud.CloudConfig;\r
+import org.openecomp.mso.cloud.CloudIdentity;\r
+import org.openecomp.mso.cloud.CloudSite;\r
+import org.openecomp.mso.cloudify.beans.DeploymentInfo;\r
+import org.openecomp.mso.cloudify.beans.DeploymentStatus;\r
+import org.openecomp.mso.cloudify.v3.client.Cloudify;\r
+import org.openecomp.mso.cloudify.v3.model.AzureConfig;\r
+import org.openecomp.mso.cloudify.v3.model.OpenstackConfig;\r
+import org.openecomp.mso.openstack.exceptions.MsoException;\r
+\r
+public class MsoCloudifyUtilsTest2 {\r
+\r
+       @Test\r
+       public void instantiateVduTest() throws MsoException {\r
+               VduInstance expected = new VduInstance();\r
+               expected.setVduInstanceId("id");\r
+               expected.setVduInstanceName("id");\r
+               VduStatus status = new VduStatus();\r
+               status.setState(VduStateType.INSTANTIATED);\r
+               status.setLastAction(new PluginAction(null, null, null));\r
+               expected.setStatus(status);\r
+\r
+               MsoCloudifyUtils cloudify = Mockito.spy(MsoCloudifyUtils.class);\r
+               CloudSite site = new CloudSite();\r
+               Optional<CloudSite> opSite = Optional.ofNullable(site);\r
+               CloudConfig config = Mockito.mock(CloudConfig.class);\r
+               cloudify.cloudConfig = config;\r
+               Cloudify cloudifyClient = new Cloudify("cloudSite");\r
+               CloudInfo cloudInfo = new CloudInfo();\r
+               cloudInfo.setCloudSiteId("cloudSiteId");\r
+               cloudInfo.setTenantId("tenantId");\r
+               VduModelInfo vduModel = new VduModelInfo();\r
+               vduModel.setModelCustomizationUUID("blueprintId");\r
+               vduModel.setTimeoutMinutes(1);\r
+               VduArtifact artifact = new VduArtifact();\r
+               artifact.setName("name");\r
+               artifact.setType(ArtifactType.MAIN_TEMPLATE);\r
+               byte[] content = new byte[1];\r
+               artifact.setContent(content);\r
+               List<VduArtifact> artifacts = new ArrayList<>();\r
+               artifacts.add(artifact);\r
+               vduModel.setArtifacts(artifacts);\r
+               DeploymentInfo deployment = new DeploymentInfo();\r
+               deployment.setId("id");\r
+               deployment.setStatus(DeploymentStatus.INSTALLED);\r
+               Map<String, byte[]> blueprintFiles = new HashMap<>();\r
+               blueprintFiles.put(artifact.getName(), artifact.getContent());\r
+               String instanceName = "instanceName";\r
+               Map<String, Object> inputs = new HashMap<>();\r
+               boolean rollbackOnFailure = true;\r
+\r
+               when(config.getCloudSite(cloudInfo.getCloudSiteId())).thenReturn(opSite);\r
+               doReturn(false).when(cloudify).isBlueprintLoaded(cloudInfo.getCloudSiteId(),\r
+                               vduModel.getModelCustomizationUUID());\r
+               doReturn(cloudifyClient).when(cloudify).getCloudifyClient(site);\r
+               doReturn(true).when(cloudify).uploadBlueprint(cloudifyClient, vduModel.getModelCustomizationUUID(),\r
+                               artifact.getName(), blueprintFiles);\r
+               doReturn(deployment).when(cloudify).createAndInstallDeployment(cloudInfo.getCloudSiteId(),\r
+                               cloudInfo.getTenantId(), instanceName, vduModel.getModelCustomizationUUID(), inputs, true,\r
+                               vduModel.getTimeoutMinutes(), rollbackOnFailure);\r
+\r
+               VduInstance actual = cloudify.instantiateVdu(cloudInfo, instanceName, inputs, vduModel, rollbackOnFailure);\r
+               assertThat(actual, sameBeanAs(expected));\r
+       }\r
+\r
+       @Test\r
+       public void queryVduTest() throws MsoException {\r
+               VduInstance expected = new VduInstance();\r
+               expected.setVduInstanceId("id");\r
+               expected.setVduInstanceName("id");\r
+               VduStatus status = new VduStatus();\r
+               status.setState(VduStateType.INSTANTIATED);\r
+               status.setLastAction(new PluginAction(null, null, null));\r
+               expected.setStatus(status);\r
+\r
+               CloudInfo cloudInfo = new CloudInfo();\r
+               cloudInfo.setCloudSiteId("cloudSiteId");\r
+               cloudInfo.setTenantId("tenantId");\r
+               DeploymentInfo deployment = new DeploymentInfo();\r
+               deployment.setId("id");\r
+               deployment.setStatus(DeploymentStatus.INSTALLED);\r
+               String instanceId = "instanceId";\r
+\r
+               MsoCloudifyUtils cloudify = Mockito.spy(MsoCloudifyUtils.class);\r
+\r
+               doReturn(deployment).when(cloudify).queryDeployment(cloudInfo.getCloudSiteId(), cloudInfo.getTenantId(),\r
+                               instanceId);\r
+\r
+               VduInstance actual = cloudify.queryVdu(cloudInfo, instanceId);\r
+\r
+               assertThat(actual, sameBeanAs(expected));\r
+       }\r
+\r
+       @Test\r
+       public void deleteVduTest() throws MsoException {\r
+               VduInstance expected = new VduInstance();\r
+               expected.setVduInstanceId("id");\r
+               expected.setVduInstanceName("id");\r
+               VduStatus status = new VduStatus();\r
+               status.setState(VduStateType.DELETING);\r
+               status.setLastAction(new PluginAction("deleting", null, null));\r
+               expected.setStatus(status);\r
+\r
+               CloudInfo cloudInfo = new CloudInfo();\r
+               cloudInfo.setCloudSiteId("cloudSiteId");\r
+               cloudInfo.setTenantId("tenantId");\r
+               String instanceId = "instanceId";\r
+               int timeoutMinutes = 1;\r
+               DeploymentInfo deployment = Mockito.mock(DeploymentInfo.class);\r
+               deployment.setId("id");\r
+               deployment.setStatus(DeploymentStatus.CREATED);\r
+               when(deployment.getId()).thenReturn("id");\r
+               when(deployment.getStatus()).thenReturn(DeploymentStatus.CREATED);\r
+               when(deployment.getLastAction()).thenReturn("deleting");\r
+               MsoCloudifyUtils cloudify = Mockito.spy(MsoCloudifyUtils.class);\r
+               doReturn(deployment).when(cloudify).uninstallAndDeleteDeployment(cloudInfo.getCloudSiteId(),\r
+                               cloudInfo.getTenantId(), instanceId, timeoutMinutes);\r
+\r
+               VduInstance actual = cloudify.deleteVdu(cloudInfo, instanceId, timeoutMinutes);\r
+\r
+               assertThat(actual, sameBeanAs(expected));\r
+       }\r
+\r
+       @Test\r
+       public void deploymentInfoToVduInstanceTest() {\r
+               VduInstance expected = new VduInstance();\r
+               expected.setVduInstanceId("id");\r
+               expected.setVduInstanceName("id");\r
+               VduStatus status = new VduStatus();\r
+               status.setState(VduStateType.DELETING);\r
+               status.setLastAction(new PluginAction("deleting", null, null));\r
+               expected.setStatus(status);\r
+\r
+               DeploymentInfo deployment = Mockito.mock(DeploymentInfo.class);\r
+               deployment.setId("id");\r
+               deployment.setStatus(DeploymentStatus.CREATED);\r
+               when(deployment.getId()).thenReturn("id");\r
+               when(deployment.getStatus()).thenReturn(DeploymentStatus.CREATED);\r
+               when(deployment.getLastAction()).thenReturn("deleting");\r
+\r
+               MsoCloudifyUtils cloudify = new MsoCloudifyUtils();\r
+\r
+               VduInstance actual = cloudify.deploymentInfoToVduInstance(deployment);\r
+\r
+               assertThat(actual, sameBeanAs(expected));\r
+       }\r
+\r
+       @Test\r
+       public void deploymentStatusToVduStatusTest() {\r
+               VduStatus expected = new VduStatus();\r
+               expected.setState(VduStateType.DELETING);\r
+               expected.setLastAction(new PluginAction("deleting", null, null));\r
+\r
+               DeploymentInfo deployment = Mockito.mock(DeploymentInfo.class);\r
+               deployment.setId("id");\r
+               deployment.setStatus(DeploymentStatus.CREATED);\r
+               when(deployment.getId()).thenReturn("id");\r
+               when(deployment.getStatus()).thenReturn(DeploymentStatus.CREATED);\r
+               when(deployment.getLastAction()).thenReturn("deleting");\r
+\r
+               MsoCloudifyUtils cloudify = new MsoCloudifyUtils();\r
+\r
+               VduStatus actual = cloudify.deploymentStatusToVduStatus(deployment);\r
+\r
+               assertThat(actual, sameBeanAs(expected));\r
+       }\r
+\r
+       @Test\r
+       public void getOpenstackConfigTest() {\r
+               OpenstackConfig expected = new OpenstackConfig();\r
+               expected.setRegion("regionId");\r
+               expected.setAuthUrl("identityUrl");\r
+               expected.setUsername("msoId");\r
+               expected.setPassword("msoPass");\r
+               expected.setTenantName("tenantId");\r
+\r
+               MsoCloudifyUtils cloudify = new MsoCloudifyUtils();\r
+               CloudSite cloudSite = Mockito.mock(CloudSite.class);\r
+               CloudIdentity cloudIdentity = Mockito.mock(CloudIdentity.class);\r
+               when(cloudSite.getIdentityService()).thenReturn(cloudIdentity);\r
+               when(cloudSite.getRegionId()).thenReturn("regionId");\r
+               when(cloudIdentity.getIdentityUrl()).thenReturn("identityUrl");\r
+               when(cloudIdentity.getMsoId()).thenReturn("msoId");\r
+               when(cloudIdentity.getMsoPass()).thenReturn("msoPass");\r
+               String tenantId = "tenantId";\r
+               OpenstackConfig actual = cloudify.getOpenstackConfig(cloudSite, tenantId);\r
+\r
+               assertThat(actual, sameBeanAs(expected));\r
+       }\r
+\r
+       @Test\r
+       public void getAzureConfigTest() {\r
+               AzureConfig expected = new AzureConfig();\r
+               expected.setSubscriptionId("subscriptionId");\r
+               expected.setTenantId("tenantId");\r
+               expected.setClientId("msoId");\r
+               expected.setClientSecret("msoPass");\r
+\r
+               MsoCloudifyUtils cloudify = new MsoCloudifyUtils();\r
+               CloudSite cloudSite = Mockito.mock(CloudSite.class);\r
+               CloudIdentity cloudIdentity = Mockito.mock(CloudIdentity.class);\r
+               when(cloudSite.getIdentityService()).thenReturn(cloudIdentity);\r
+               when(cloudIdentity.getAdminTenant()).thenReturn("subscriptionId");\r
+               when(cloudIdentity.getMsoId()).thenReturn("msoId");\r
+               when(cloudIdentity.getMsoPass()).thenReturn("msoPass");\r
+               String tenantId = "tenantId";\r
+               AzureConfig actual = cloudify.getAzureConfig(cloudSite, tenantId);\r
+\r
+               assertThat(actual, sameBeanAs(expected));\r
+       }\r
+}\r
diff --git a/adapters/mso-adapter-utils/src/test/java/org/openecomp/mso/openstack/utils/MsoHeatUtilsTest.java b/adapters/mso-adapter-utils/src/test/java/org/openecomp/mso/openstack/utils/MsoHeatUtilsTest.java
new file mode 100644 (file)
index 0000000..c50ffb0
--- /dev/null
@@ -0,0 +1,221 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2018 Huawei Technologies Co., Ltd. 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.openstack.utils;
+
+
+import com.woorea.openstack.heat.Heat;
+import com.woorea.openstack.heat.model.Stack;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.openecomp.mso.cloud.CloudConfigFactory;
+import org.openecomp.mso.cloud.CloudSite;
+import org.openecomp.mso.openstack.beans.HeatStatus;
+import org.openecomp.mso.openstack.beans.StackInfo;
+import org.openecomp.mso.openstack.exceptions.MsoException;
+import org.openecomp.mso.openstack.exceptions.MsoTenantNotFound;
+import org.openecomp.mso.properties.MsoPropertiesFactory;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.mockito.Mockito.doReturn;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({MsoHeatUtils.class})
+
+
+public class MsoHeatUtilsTest {
+
+    @Mock
+
+    StackInfo stackInfo;
+
+    @Mock
+
+    MsoPropertiesFactory msoPropertiesFactory;
+
+    @Mock
+
+    CloudConfigFactory cloudConfigFactory;
+
+    @Mock
+
+    Heat heatClient;
+
+    @Mock
+
+    CloudSite cloudSite;
+
+    @Test(expected = NullPointerException.class)
+    public void testCreateStack() throws MsoException
+    {
+
+        MsoHeatUtils mht = PowerMockito.spy(new MsoHeatUtils("msoPropID" ,msoPropertiesFactory,cloudConfigFactory));
+        Map<String,String>metadata=new HashMap<>();
+        metadata.put("1", "value");
+        mht.createStack("cloudSiteId",
+                "tenantId",
+                "stackName",
+                "heatTemplate",
+                 metadata,
+                 true,
+        1);
+           doReturn(mht.createStack("cloudSiteId",
+                   "tenantId",
+                   "stackName",
+                   "heatTemplate",
+                   metadata,
+        true,
+        1,
+        null, null,
+        null,
+        true));
+
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void testCreateStackOne() throws MsoException
+    {
+        MsoHeatUtils mht = PowerMockito.spy(new MsoHeatUtils("msoPropID" ,msoPropertiesFactory,cloudConfigFactory));
+        Map<String,String>metadata=new HashMap<>();
+        metadata.put("1", "value");
+        mht.createStack("cloudSiteId",
+                "tenantId",
+                "stackName",
+                "heatTemplate",
+                 metadata,
+                true,
+                1,
+                "env");
+        doReturn(mht.createStack("cloudSiteId",
+                "tenantId",
+                "stackName",
+                "heatTemplate",
+                metadata,
+                true,
+                1,
+                "env", null,
+                null,
+                true));
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void testCreateStackTwo() throws MsoException
+    {
+        MsoHeatUtils mht = PowerMockito.spy(new MsoHeatUtils("msoPropID" ,msoPropertiesFactory,cloudConfigFactory));
+        Map<String,String>metadata=new HashMap<>();
+        metadata.put("1", "value");
+        Map<String,Object>fileMap=new HashMap<>();
+        fileMap.put("2", "value");
+        mht.createStack("cloudSiteId",
+                "tenantId",
+                "stackName",
+                "heatTemplate",
+                 metadata,
+                true,
+                1,
+                "env",
+                 fileMap);
+        doReturn(mht.createStack("cloudSiteId",
+                "tenantId",
+                "stackName",
+                "heatTemplate",
+                metadata,
+                true,
+                1,
+                "env", fileMap,
+                null,
+                true));
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void testCreateStackThree() throws MsoException
+    {
+        MsoHeatUtils mht = PowerMockito.spy(new MsoHeatUtils("msoPropID" ,msoPropertiesFactory,cloudConfigFactory));
+        Map<String,String>metadata=new HashMap<>();
+        metadata.put("1", "value");
+        Map<String,Object>fileMap=new HashMap<>();
+        fileMap.put("2", "value");
+        Map<String,Object>heatFileMap=new HashMap<>();
+        heatFileMap.put("3", "value");
+        mht.createStack("cloudSiteId",
+                "tenantId",
+                "stackName",
+                "heatTemplate",
+                metadata,
+                true,
+                1,
+                "env",
+                fileMap,
+                heatFileMap);
+        doReturn(mht.createStack("cloudSiteId",
+                "tenantId",
+                "stackName",
+                "heatTemplate",
+                metadata,
+                true,
+                1,
+                "env", fileMap,
+                heatFileMap,
+                true));
+    }
+
+    @Test(expected = NullPointerException.class)
+
+
+    public void testqueryStack() throws MsoException
+    {
+        MsoHeatUtils mht = PowerMockito.spy(new MsoHeatUtils("msoPropID" ,msoPropertiesFactory,cloudConfigFactory));
+
+        mht.queryStack("cloudSiteId","tenantId","stackName");
+
+        try {
+            heatClient = mht.getHeatClient (cloudSite, "tenantId");
+            assertNotNull(heatClient);
+
+        } catch (MsoTenantNotFound e) {
+            doReturn(new StackInfo ("stackName", HeatStatus.NOTFOUND));
+        } catch (MsoException me) {
+
+            me.addContext ("QueryStack");
+            throw me;
+        }
+
+        Stack heatStack = mht.queryHeatStack (heatClient, "stackName");
+
+        assertNull(heatStack);
+        StackInfo stackInfo = new StackInfo ("stackName", HeatStatus.NOTFOUND);
+        doReturn(stackInfo);
+
+        assertNotNull(heatStack);
+        doReturn(new StackInfo (heatStack));
+
+
+
+    }
+
+}
diff --git a/adapters/mso-adapter-utils/src/test/java/org/openecomp/mso/openstack/utils/MsoHeatUtilsTest2.java b/adapters/mso-adapter-utils/src/test/java/org/openecomp/mso/openstack/utils/MsoHeatUtilsTest2.java
new file mode 100644 (file)
index 0000000..a0ab8e6
--- /dev/null
@@ -0,0 +1,169 @@
+/*-\r
+ * ============LICENSE_START=======================================================\r
+ * ONAP - SO\r
+ * ================================================================================\r
+ * Copyright (C) 2018 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.openstack.utils;\r
+\r
+import static com.shazam.shazamcrest.MatcherAssert.assertThat;\r
+import static com.shazam.shazamcrest.matcher.Matchers.sameBeanAs;\r
+import static org.mockito.Mockito.doReturn;\r
+import static org.mockito.Mockito.when;\r
+\r
+import java.util.ArrayList;\r
+import java.util.HashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
+import java.util.Optional;\r
+\r
+import org.junit.Test;\r
+import org.mockito.Mockito;\r
+import org.openecomp.mso.adapters.vdu.CloudInfo;\r
+import org.openecomp.mso.adapters.vdu.PluginAction;\r
+import org.openecomp.mso.adapters.vdu.VduArtifact;\r
+import org.openecomp.mso.adapters.vdu.VduArtifact.ArtifactType;\r
+import org.openecomp.mso.adapters.vdu.VduInstance;\r
+import org.openecomp.mso.adapters.vdu.VduModelInfo;\r
+import org.openecomp.mso.adapters.vdu.VduStateType;\r
+import org.openecomp.mso.adapters.vdu.VduStatus;\r
+import org.openecomp.mso.cloud.CloudConfig;\r
+import org.openecomp.mso.cloud.CloudSite;\r
+import org.openecomp.mso.cloudify.beans.DeploymentInfo;\r
+import org.openecomp.mso.cloudify.beans.DeploymentStatus;\r
+import org.openecomp.mso.cloudify.utils.MsoCloudifyUtils;\r
+import org.openecomp.mso.openstack.beans.HeatStatus;\r
+import org.openecomp.mso.openstack.beans.StackInfo;\r
+import org.openecomp.mso.openstack.exceptions.MsoException;\r
+\r
+import com.fasterxml.jackson.core.JsonProcessingException;\r
+\r
+public class MsoHeatUtilsTest2 {\r
+\r
+       @Test\r
+       public void instantiateVduTest() throws MsoException, JsonProcessingException {\r
+               VduInstance expected = new VduInstance();\r
+               expected.setVduInstanceId("canonicalName");\r
+               expected.setVduInstanceName("name");\r
+               VduStatus status = new VduStatus();\r
+               status.setState(VduStateType.INSTANTIATED);\r
+               status.setLastAction((new PluginAction("create", "complete", "")));\r
+               expected.setStatus(status);\r
+\r
+               MsoHeatUtils heatUtils = Mockito.spy(MsoHeatUtils.class);\r
+               CloudSite site = new CloudSite();\r
+               Optional<CloudSite> opSite = Optional.ofNullable(site);\r
+               CloudConfig config = Mockito.mock(CloudConfig.class);\r
+               heatUtils.cloudConfig = config;\r
+               CloudInfo cloudInfo = new CloudInfo();\r
+               cloudInfo.setCloudSiteId("cloudSiteId");\r
+               cloudInfo.setTenantId("tenantId");\r
+               VduModelInfo vduModel = new VduModelInfo();\r
+               vduModel.setModelCustomizationUUID("blueprintId");\r
+               vduModel.setTimeoutMinutes(1);\r
+               VduArtifact artifact = new VduArtifact();\r
+               artifact.setName("name");\r
+               artifact.setType(ArtifactType.MAIN_TEMPLATE);\r
+               byte[] content = new byte[1];\r
+               artifact.setContent(content);\r
+               List<VduArtifact> artifacts = new ArrayList<>();\r
+               artifacts.add(artifact);\r
+               vduModel.setArtifacts(artifacts);\r
+               Map<String, byte[]> blueprintFiles = new HashMap<>();\r
+               blueprintFiles.put(artifact.getName(), artifact.getContent());\r
+               String instanceName = "instanceName";\r
+               Map<String, Object> inputs = new HashMap<>();\r
+               boolean rollbackOnFailure = true;\r
+               String heatTemplate = new String(artifact.getContent());\r
+               when(config.getCloudSite(cloudInfo.getCloudSiteId())).thenReturn(opSite);\r
+               Map<String, Object> nestedTemplates = new HashMap<String, Object>();\r
+               Map<String, Object> files = new HashMap<String, Object>();\r
+\r
+               StackInfo stackInfo = new StackInfo();\r
+               stackInfo.setCanonicalName("canonicalName");\r
+               stackInfo.setName("name");\r
+               stackInfo.setStatus(HeatStatus.CREATED);\r
+\r
+               doReturn(stackInfo).when(heatUtils).createStack(cloudInfo.getCloudSiteId(), cloudInfo.getTenantId(),\r
+                               instanceName, heatTemplate, inputs, true, vduModel.getTimeoutMinutes(), null, nestedTemplates, files,\r
+                               rollbackOnFailure);\r
+\r
+               VduInstance actual = heatUtils.instantiateVdu(cloudInfo, instanceName, inputs, vduModel, rollbackOnFailure);\r
+               \r
+               assertThat(actual, sameBeanAs(expected));\r
+       }\r
+       \r
+       @Test\r
+       public void queryVduTest() throws MsoException, JsonProcessingException {\r
+               VduInstance expected = new VduInstance();\r
+               expected.setVduInstanceId("canonicalName");\r
+               expected.setVduInstanceName("name");\r
+               VduStatus status = new VduStatus();\r
+               status.setState(VduStateType.INSTANTIATED);\r
+               status.setLastAction((new PluginAction("create", "complete", "")));\r
+               expected.setStatus(status);\r
+\r
+               CloudInfo cloudInfo = new CloudInfo();\r
+               cloudInfo.setCloudSiteId("cloudSiteId");\r
+               cloudInfo.setTenantId("tenantId");\r
+               String instanceId = "instanceId";\r
+\r
+               StackInfo stackInfo = new StackInfo();\r
+               stackInfo.setCanonicalName("canonicalName");\r
+               stackInfo.setName("name");\r
+               stackInfo.setStatus(HeatStatus.CREATED);\r
+               \r
+               MsoHeatUtils heatUtils = Mockito.spy(MsoHeatUtils.class);\r
+\r
+               doReturn(stackInfo).when(heatUtils).queryStack(cloudInfo.getCloudSiteId(), cloudInfo.getTenantId(), instanceId);\r
+\r
+               VduInstance actual = heatUtils.queryVdu(cloudInfo, instanceId);\r
+               \r
+               assertThat(actual, sameBeanAs(expected));\r
+       }\r
+\r
+       @Test\r
+       public void deleteVduTest() throws MsoException {\r
+               VduInstance expected = new VduInstance();\r
+               expected.setVduInstanceId("canonicalName");\r
+               expected.setVduInstanceName("name");\r
+               VduStatus status = new VduStatus();\r
+               status.setState(VduStateType.DELETED);\r
+               expected.setStatus(status);\r
+\r
+               CloudInfo cloudInfo = new CloudInfo();\r
+               cloudInfo.setCloudSiteId("cloudSiteId");\r
+               cloudInfo.setTenantId("tenantId");\r
+               String instanceId = "instanceId";\r
+\r
+               StackInfo stackInfo = new StackInfo();\r
+               stackInfo.setCanonicalName("canonicalName");\r
+               stackInfo.setName("name");\r
+               stackInfo.setStatus(HeatStatus.NOTFOUND);\r
+               \r
+               int timeoutInMinutes = 1;\r
+               \r
+               MsoHeatUtils heatUtils = Mockito.spy(MsoHeatUtils.class);\r
+\r
+               doReturn(stackInfo).when(heatUtils).deleteStack( cloudInfo.getTenantId(), cloudInfo.getCloudSiteId(), instanceId, true);\r
+\r
+               VduInstance actual = heatUtils.deleteVdu(cloudInfo, instanceId, timeoutInMinutes);\r
+               \r
+               assertThat(actual, sameBeanAs(expected));\r
+       }\r
+\r
+}\r
diff --git a/adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/openstack/exceptions/MsoAdapterExceptionTest.java b/adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/openstack/exceptions/MsoAdapterExceptionTest.java
new file mode 100644 (file)
index 0000000..738fe9e
--- /dev/null
@@ -0,0 +1,26 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2018 Huawei 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.openstack.exceptions;
+
+public class MsoAdapterExceptionTest {
+    MsoAdapterException msoAdapterException = new MsoAdapterException("test");
+    MsoAdapterException msoAdapterExceptionThr = new MsoAdapterException("test" , new Throwable());
+}
diff --git a/adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/openstack/exceptions/MsoCloudIdentityNotFoundTest.java b/adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/openstack/exceptions/MsoCloudIdentityNotFoundTest.java
new file mode 100644 (file)
index 0000000..4027aa6
--- /dev/null
@@ -0,0 +1,26 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2018 Huawei 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.openstack.exceptions;
+
+public class MsoCloudIdentityNotFoundTest {
+    MsoCloudIdentityNotFound msoCloudIdentityNotFound = new MsoCloudIdentityNotFound();
+    MsoCloudIdentityNotFound msoCloudIdentityNotFoundStr = new MsoCloudIdentityNotFound("test");
+    public String str = msoCloudIdentityNotFound.toString();
+}
diff --git a/adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/openstack/exceptions/MsoCloudSiteNotFoundTest.java b/adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/openstack/exceptions/MsoCloudSiteNotFoundTest.java
new file mode 100644 (file)
index 0000000..cac0215
--- /dev/null
@@ -0,0 +1,27 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2018 Huawei 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.openstack.exceptions;
+
+public class MsoCloudSiteNotFoundTest {
+    MsoCloudSiteNotFound msoCloudSiteNotFound = new MsoCloudSiteNotFound();
+    MsoCloudSiteNotFound msoCloudSiteNotFoundStr = new MsoCloudSiteNotFound("test");
+    public String str = msoCloudSiteNotFoundStr.toString();
+
+}
diff --git a/adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/openstack/exceptions/MsoIOExceptionTest.java b/adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/openstack/exceptions/MsoIOExceptionTest.java
new file mode 100644 (file)
index 0000000..d1f4db7
--- /dev/null
@@ -0,0 +1,26 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2018 Huawei 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.openstack.exceptions;
+
+public class MsoIOExceptionTest {
+    MsoIOException msoIOException = new MsoIOException("test");
+    MsoIOException msoIOExceptionTh = new MsoIOException("test" , new Throwable());
+    public String str = msoIOException.toString();
+}
diff --git a/adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/openstack/exceptions/MsoNetworkAlreadyExistsTest.java b/adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/openstack/exceptions/MsoNetworkAlreadyExistsTest.java
new file mode 100644 (file)
index 0000000..c5217e4
--- /dev/null
@@ -0,0 +1,25 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2018 Huawei 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.openstack.exceptions;
+
+public class MsoNetworkAlreadyExistsTest {
+    MsoNetworkAlreadyExists msoNetworkAlreadyExists = new MsoNetworkAlreadyExists("test","test","test");
+}
diff --git a/adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/openstack/exceptions/MsoNetworkNotFoundTest.java b/adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/openstack/exceptions/MsoNetworkNotFoundTest.java
new file mode 100644 (file)
index 0000000..ea74efc
--- /dev/null
@@ -0,0 +1,25 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2018 Huawei 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.openstack.exceptions;
+
+public class MsoNetworkNotFoundTest {
+    MsoNetworkNotFound msoNetworkNotFound =new MsoNetworkNotFound("test","test","test");
+}
diff --git a/adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/openstack/exceptions/MsoOpenstackExceptionTest.java b/adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/openstack/exceptions/MsoOpenstackExceptionTest.java
new file mode 100644 (file)
index 0000000..58cea95
--- /dev/null
@@ -0,0 +1,28 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2018 Huawei 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.openstack.exceptions;
+
+public class MsoOpenstackExceptionTest {
+    MsoOpenstackException msoOpenstackException= new MsoOpenstackException(404,"test","test");
+    MsoOpenstackException msoOpenstackExceptionEx= new MsoOpenstackException(404,"test","test",new Exception());
+    public String str = msoOpenstackException.toString();
+
+}
diff --git a/adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/openstack/exceptions/MsoStackAlreadyExistsTest.java b/adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/openstack/exceptions/MsoStackAlreadyExistsTest.java
new file mode 100644 (file)
index 0000000..f36ddfe
--- /dev/null
@@ -0,0 +1,25 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2018 Huawei 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.openstack.exceptions;
+
+public class MsoStackAlreadyExistsTest {
+    MsoStackAlreadyExists msoStackAlreadyExists = new MsoStackAlreadyExists("test","test","test");
+}
diff --git a/adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/openstack/exceptions/MsoStackNotFoundTest.java b/adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/openstack/exceptions/MsoStackNotFoundTest.java
new file mode 100644 (file)
index 0000000..e422c04
--- /dev/null
@@ -0,0 +1,25 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2018 Huawei 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.openstack.exceptions;
+
+public class MsoStackNotFoundTest {
+    MsoStackNotFound msoStackNotFound = new MsoStackNotFound("test","test","test");
+}
diff --git a/adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/openstack/exceptions/MsoTenantAlreadyExistsTest.java b/adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/openstack/exceptions/MsoTenantAlreadyExistsTest.java
new file mode 100644 (file)
index 0000000..d9e8306
--- /dev/null
@@ -0,0 +1,25 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2018 Huawei 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.openstack.exceptions;
+
+public class MsoTenantAlreadyExistsTest {
+    MsoTenantAlreadyExists msoTenantAlreadyExists = new MsoTenantAlreadyExists("test","test");
+}
diff --git a/adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/openstack/exceptions/MsoTenantNotFoundTest.java b/adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/openstack/exceptions/MsoTenantNotFoundTest.java
new file mode 100644 (file)
index 0000000..a8dd6c6
--- /dev/null
@@ -0,0 +1,25 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2018 Huawei 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.openstack.exceptions;
+
+public class MsoTenantNotFoundTest {
+    MsoTenantNotFound msoTenantNotFound = new MsoTenantNotFound("test","test");
+}
diff --git a/adapters/mso-catalog-db-adapter/src/test/java/org/openecomp/mso/adapters/catalogdb/catalogrest/CatalogQueryExceptionTest.java b/adapters/mso-catalog-db-adapter/src/test/java/org/openecomp/mso/adapters/catalogdb/catalogrest/CatalogQueryExceptionTest.java
new file mode 100644 (file)
index 0000000..365c9ab
--- /dev/null
@@ -0,0 +1,55 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 Huawei Technologies Co., Ltd. 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.adapters.catalogdb.catalogrest;
+
+import org.junit.Test;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertEquals;
+
+public class CatalogQueryExceptionTest {
+    @Test
+    public void catalogQueryExceptionConstructor(){
+        CatalogQueryException messageCatalogQueryException = new CatalogQueryException("TestMessage");
+        assertNotNull(messageCatalogQueryException.getMessage());
+        assertEquals("TestMessage",messageCatalogQueryException.getMessage());
+
+        CatalogQueryException paramsCatalogQueryException = new CatalogQueryException("TestMessage",CatalogQueryExceptionCategory.INTERNAL,true,"messageID");
+        assertParams(paramsCatalogQueryException);
+
+        CatalogQueryException defaultCatalogQueryException = new CatalogQueryException();
+        defaultCatalogQueryException.setCategory(CatalogQueryExceptionCategory.INTERNAL);
+        defaultCatalogQueryException.setMessage("TestMessage");
+        defaultCatalogQueryException.setRolledBack(true);
+        defaultCatalogQueryException.setMessageId("messageID");
+        assertParams(defaultCatalogQueryException);
+    }
+
+    private void assertParams(CatalogQueryException paramsCatalogQueryException) {
+        assertNotNull(paramsCatalogQueryException.getMessage());
+        assertEquals("TestMessage",paramsCatalogQueryException.getMessage());
+        assertNotNull(paramsCatalogQueryException.getCategory());
+        assertEquals(CatalogQueryExceptionCategory.INTERNAL,paramsCatalogQueryException.getCategory());
+        assertNotNull(paramsCatalogQueryException.getRolledBack());
+        assertEquals(true,paramsCatalogQueryException.getRolledBack());
+        assertNotNull(paramsCatalogQueryException.getMessageId());
+        assertEquals("messageID",paramsCatalogQueryException.getMessageId());
+    }
+}
diff --git a/adapters/mso-requests-db-adapter/src/test/java/org/openecomp/mso/adapters/requestsdb/HealthCheckHandlerTestException.java b/adapters/mso-requests-db-adapter/src/test/java/org/openecomp/mso/adapters/requestsdb/HealthCheckHandlerTestException.java
new file mode 100644 (file)
index 0000000..994ce5d
--- /dev/null
@@ -0,0 +1,35 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2018 Huawei Technologies Co., Ltd. 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.adapters.requestsdb;
+
+import org.junit.Test;
+
+public class HealthCheckHandlerTestException {
+
+    @Test(expected = NullPointerException.class)
+    public void testHealthCheckSiteNameNull() {
+
+        HealthCheckHandler hcH =  new HealthCheckHandler();
+        hcH.healthcheck("request");
+    }
+}
+
+
index 5e3f79a..c3949a6 100644 (file)
 
 package org.openecomp.mso.adapters.sdnc;
 
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThat;
 import static org.junit.Assert.fail;
 
 import java.io.ByteArrayInputStream;
@@ -74,14 +79,14 @@ public class ObjectFactoryTest {
             fail ();
         }
         String marshalled = writer.toString ();
-        assert(marshalled.contains ("<RequestId>reqid</RequestId>"));
+        assertThat(marshalled, containsString("<RequestId>reqid</RequestId>"));
         
         InputStream inputStream = new ByteArrayInputStream(marshalled.getBytes(Charset.forName("UTF-8")));
         try {
             RequestHeader res2 = (RequestHeader) jaxbUnmarshaller.unmarshal (inputStream);
-            assert(res2.getCallbackUrl ().equals ("callback"));
-            assert(res2.getMsoAction ().equals ("action"));
-            assert(res2.getSvcOperation ().equals ("op"));
+            assertEquals("callback", res2.getCallbackUrl ());
+            assertEquals("action", res2.getMsoAction ());
+            assertEquals("op", res2.getSvcOperation ());
         } catch (JAXBException e) {
             e.printStackTrace();
             fail();
@@ -95,6 +100,14 @@ public class ObjectFactoryTest {
     public final void testCreateSDNCAdapterResponse () {
         ObjectFactory of = new ObjectFactory ();
         SDNCAdapterResponse ar = of.createSDNCAdapterResponse ();
-        assert (ar != null);
+        assertNotNull(ar);
     }
+    
+    @Test
+    public final void testCreateSDNCAdapterRequest () {
+        ObjectFactory of = new ObjectFactory ();
+        SDNCAdapterRequest ar = of.createSDNCAdapterRequest ();
+        assertNotNull(ar);
+    }
+    
 }
index fa96b79..b9d8840 100644 (file)
@@ -21,6 +21,9 @@
 
 package org.openecomp.mso.adapters.sdnc;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.openecomp.mso.adapters.sdnc.SDNCAdapterRequest;
@@ -46,9 +49,9 @@ public class SDNCAdapterRequestTest {
        public final void testtoString(){
                ((SDNCAdapterRequest) sd).setRequestData("data");
                ((SDNCAdapterRequest) sd).setRequestHeader(rh);
-        assert (((SDNCAdapterRequest) sd).getRequestData()!= null) ;
-               assert(((SDNCAdapterRequest) sd).getRequestData().equals("data"));
-               assert(((SDNCAdapterRequest) sd).getRequestHeader().equals(rh));                
+        assertNotNull(((SDNCAdapterRequest) sd).getRequestData()) ;
+        assertEquals("data", ((SDNCAdapterRequest) sd).getRequestData());
+        assertEquals(rh, ((SDNCAdapterRequest) sd).getRequestHeader());
        }
 
 }
index 88d2b95..39518e2 100644 (file)
 
 package org.openecomp.mso.adapters.sdnc.client;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
 import org.junit.Test;
-import org.openecomp.mso.adapters.sdnc.client.CallbackHeader;
 
 public class CallbackHeaderTest {
 
@@ -32,16 +34,16 @@ public class CallbackHeaderTest {
         cb.setRequestId("413658f4-7f42-482e-b834-23a5c15657da-1474471336781");
         cb.setResponseCode("200");
         cb.setResponseMessage("OK");
-        assert (cb.getRequestId() != null);
-        assert (cb.getResponseCode() != null);
-        assert (cb.getResponseMessage() != null);
-        assert (cb.getRequestId().equals("413658f4-7f42-482e-b834-23a5c15657da-1474471336781"));
-        assert (cb.getResponseCode().equals("200"));
-        assert (cb.getResponseMessage().equals("OK"));
+        assertNotNull(cb.getRequestId());
+        assertNotNull(cb.getResponseCode());
+        assertNotNull(cb.getResponseMessage());
+        assertEquals("413658f4-7f42-482e-b834-23a5c15657da-1474471336781", cb.getRequestId());
+        assertEquals("200", cb.getResponseCode());
+        assertEquals("OK", cb.getResponseMessage());
     }
 
     @Test
     public void testtoString() {
-        assert (cb.toString() != null);
+        assertNotNull(cb.toString());
     }
 }
index 63aa49c..ecffd1c 100644 (file)
@@ -21,6 +21,9 @@
 
 package org.openecomp.mso.adapters.sdnc.client;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
 import org.junit.Test;
 import org.openecomp.mso.adapters.sdnc.client.CallbackHeader;
 import org.openecomp.mso.adapters.sdnc.client.SDNCAdapterCallbackRequest;
@@ -35,17 +38,18 @@ public class SDNCAdapterCallbackRequestTest {
    {
        sdc.setCallbackHeader(ch);
        sdc.setRequestData("data");
-       assert(sdc.getCallbackHeader()!=null);
-       assert(sdc.getRequestData()!=null);
-       assert(sdc.getCallbackHeader().equals(ch));
-       assert(sdc.getRequestData().equals("data"));
+       assertNotNull(sdc.getCallbackHeader());
+       assertNotNull(sdc.getRequestData());
+       assertEquals(ch, sdc.getCallbackHeader());
+       assertEquals("data", sdc.getRequestData());
 
    }
    
    @Test
    public void testtoString()
    {
-       assert(ch.toString()!=null);
+       assertNotNull(ch.toString());
+       assertNotNull(sdc.toString());
    }
    
 }
index 17ba0d2..72b1170 100644 (file)
@@ -20,6 +20,8 @@
 
 package org.openecomp.mso.adapters.sdnc.impl;
 
+import static org.junit.Assert.*;
+
 import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.Test;
@@ -54,18 +56,31 @@ public class RequestTunablesTest {
     @Test
     public final void testRequestTunables () {
         RequestTunables rt = new RequestTunables (null, null, "op", null,msoPropertiesFactory);
-        assert(rt.getReqId ().length ()==0);
+        assertEquals(0, rt.getReqId ().length ());
         rt = new RequestTunables ("reqId", "msoAction", null, "query",msoPropertiesFactory);
         rt.setTunables ();
         System.out.println(rt.toString ());
       //  assert (rt.getReqMethod ().equals ("toto"));
-        assert (rt.getTimeout () != null);
-        assert (rt.getAction ().equals ("query"));
-        assert (rt.getMsoAction ().equals ("msoAction"));
-        assert (rt.getHeaderName ().equals ("sdnc-request-header"));
-        assert (rt.getOperation ().length () == 0);
-        assert (rt.getAsyncInd ().equals ("N"));
-        assert (rt.getReqId ().equals ("reqId"));
+        assertNotNull(rt.getTimeout ());
+        assertEquals("query", rt.getAction ());
+        assertEquals("msoAction", rt.getMsoAction ());
+        assertEquals("sdnc-request-header", rt.getHeaderName ());
+        assertEquals(0, rt.getOperation ().length ());
+        assertEquals("N", rt.getAsyncInd ());
+        assertEquals("reqId", rt.getReqId ());
+    }
+    
+    @Test
+    public final void testRequestTunablesSet() {
+       RequestTunables rt = new RequestTunables("reqId", "gammainternet", "service-configuration-operation", "changeactivate", msoPropertiesFactory);
+        rt.setTunables ();
+        assertNotNull(rt.getTimeout ());
+         assertEquals("changeactivate", rt.getAction ());
+         assertEquals("gammainternet", rt.getMsoAction ());
+         assertEquals("sdnc-request-header", rt.getHeaderName ());
+         assertEquals("service-configuration-operation", rt.getOperation ());
+         assertEquals("N", rt.getAsyncInd ());
+         assertEquals("reqId", rt.getReqId ());
     }
 
 }
index f8867ae..f9c885f 100644 (file)
@@ -43,7 +43,7 @@ public class SDNCResponseTest {
    @Test
    public void testtoString()
    {
-       assert(sdncresponse.toString()!=null);
+       assertNotNull(sdncresponse.toString());
    }
 }
    
\ No newline at end of file
index 275c2ac..77d22e4 100644 (file)
@@ -20,6 +20,8 @@
 
 package org.openecomp.mso.adapters.sdnc.util;
 
+import static org.junit.Assert.assertEquals;
+
 import java.util.UUID;
 import org.junit.Test;
 
@@ -35,8 +37,8 @@ public class SDNCRequestIdUtilTest {
        String postfixedRequestId = originalRequestId + "-1466203712068";
        String postfixedRequestId2 = originalRequestId + "-1466203712068-2";
 
-        assert(SDNCRequestIdUtil.getSDNCOriginalRequestId(postfixedRequestId).equals(originalRequestId));
-        assert(SDNCRequestIdUtil.getSDNCOriginalRequestId(postfixedRequestId2).equals(postfixedRequestId2));
+        assertEquals(originalRequestId, SDNCRequestIdUtil.getSDNCOriginalRequestId(postfixedRequestId));
+        assertEquals(postfixedRequestId2, SDNCRequestIdUtil.getSDNCOriginalRequestId(postfixedRequestId2));
        
     }
 
diff --git a/adapters/mso-vnf-adapter/src/main/java/org/openecomp/mso/adapters/vdu/mapper/VfModuleCustomizationToVduMapper.java b/adapters/mso-vnf-adapter/src/main/java/org/openecomp/mso/adapters/vdu/mapper/VfModuleCustomizationToVduMapper.java
new file mode 100644 (file)
index 0000000..22d988f
--- /dev/null
@@ -0,0 +1,174 @@
+/*-\r
+ * ============LICENSE_START=======================================================\r
+ * ONAP - SO\r
+ * ================================================================================\r
+ * Copyright (C) 2018 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.adapters.vdu.mapper;\r
+\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+import org.openecomp.mso.adapters.vdu.VduArtifact;\r
+import org.openecomp.mso.adapters.vdu.VduArtifact.ArtifactType;\r
+import org.openecomp.mso.adapters.vdu.VduModelInfo;\r
+import org.openecomp.mso.db.catalog.CatalogDatabase;\r
+import org.openecomp.mso.db.catalog.beans.HeatEnvironment;\r
+import org.openecomp.mso.db.catalog.beans.HeatFiles;\r
+import org.openecomp.mso.db.catalog.beans.HeatTemplate;\r
+import org.openecomp.mso.db.catalog.beans.VfModuleCustomization;\r
+import org.openecomp.mso.logger.MsoLogger;\r
+import org.springframework.stereotype.Component;\r
+\r
+@Component\r
+public class VfModuleCustomizationToVduMapper {\r
+\r
+       private static MsoLogger LOGGER = MsoLogger.getMsoLogger(MsoLogger.Catalog.RA);\r
+\r
+       public VduModelInfo mapVfModuleCustomizationToVdu(VfModuleCustomization vfModuleCustom) throws Exception {\r
+               CatalogDatabase db = CatalogDatabase.getInstance();\r
+               VduModelInfo vduModel = new VduModelInfo();\r
+               vduModel.setModelCustomizationUUID(vfModuleCustom.getModelCustomizationUuid());\r
+               try {\r
+                       // Map the cloud templates, attached files, and environment file\r
+                       mapCloudTemplates(\r
+                                       db.getHeatTemplateByArtifactUuid(vfModuleCustom.getVfModule().getHeatTemplateArtifactUUId()),\r
+                                       vduModel);\r
+                       mapCloudFiles(vfModuleCustom, vduModel);\r
+                       mapEnvironment(db.getHeatEnvironmentByArtifactUuid(vfModuleCustom.getHeatEnvironmentArtifactUuid()),\r
+                                       vduModel);\r
+               } catch (Exception e) {\r
+                       LOGGER.debug("unhandled exception in mapVfModuleCustomizationToVdu", e);\r
+                       throw new Exception("Exception during mapVfModuleCustomizationToVdu " + e.getMessage());\r
+               } finally {\r
+                       // Make sure DB session is closed\r
+                       db.close();\r
+               }\r
+\r
+               return vduModel;\r
+       }\r
+\r
+       public VduModelInfo mapVfModuleCustVolumeToVdu(VfModuleCustomization vfModuleCustom) throws Exception {\r
+               CatalogDatabase db = CatalogDatabase.getInstance();\r
+               VduModelInfo vduModel = new VduModelInfo();\r
+               vduModel.setModelCustomizationUUID(vfModuleCustom.getModelCustomizationUuid());\r
+               try {\r
+                       // Map the cloud templates, attached files, and environment file\r
+                       mapCloudTemplates(\r
+                                       db.getHeatTemplateByArtifactUuid(vfModuleCustom.getVfModule().getVolHeatTemplateArtifactUUId()),\r
+                                       vduModel);\r
+                       mapCloudFiles(vfModuleCustom, vduModel);\r
+                       mapEnvironment(db.getHeatEnvironmentByArtifactUuid(vfModuleCustom.getVolEnvironmentArtifactUuid()),\r
+                                       vduModel);\r
+               } catch (Exception e) {\r
+                       LOGGER.debug("unhandled exception in mapVfModuleCustVolumeToVdu", e);\r
+                       throw new Exception("Exception during mapVfModuleCustVolumeToVdu " + e.getMessage());\r
+               } finally {\r
+                       // Make sure DB session is closed\r
+                       db.close();\r
+               }\r
+\r
+               return vduModel;\r
+       }\r
+\r
+       private void mapCloudTemplates(HeatTemplate heatTemplate, VduModelInfo vduModel) throws Exception {\r
+               // TODO: These catalog objects will be refactored to be\r
+               // non-Heat-specific\r
+               CatalogDatabase db = CatalogDatabase.getInstance();\r
+               try {\r
+                       List<VduArtifact> vduArtifacts = vduModel.getArtifacts();\r
+\r
+                       // Main template. Also set the VDU timeout based on the main\r
+                       // template.\r
+                       vduArtifacts.add(mapHeatTemplateToVduArtifact(heatTemplate, ArtifactType.MAIN_TEMPLATE));\r
+                       vduModel.setTimeoutMinutes(heatTemplate.getTimeoutMinutes());\r
+                       \r
+                       // Nested templates\r
+                       Map<String,Object> nestedTemplates = db.getNestedTemplates(heatTemplate.getArtifactUuid());\r
+                       if (nestedTemplates != null) {\r
+                               for (String name : nestedTemplates.keySet()) {\r
+                                       String body = (String) nestedTemplates.get(name);\r
+                                       VduArtifact vduArtifact = new VduArtifact(name, body.getBytes(), ArtifactType.NESTED_TEMPLATE);\r
+                                       vduArtifacts.add(vduArtifact);\r
+                               }\r
+                       }\r
+                       \r
+               } catch (Exception e) {\r
+                       LOGGER.debug("unhandled exception in mapCloudTemplates", e);\r
+                       throw new Exception("Exception during mapCloudTemplates " + e.getMessage());\r
+               } finally {\r
+                       // Make sure DB session is closed\r
+                       db.close();\r
+               }\r
+       }\r
+\r
+       private VduArtifact mapHeatTemplateToVduArtifact(HeatTemplate heatTemplate, ArtifactType artifactType) {\r
+               VduArtifact vduArtifact = new VduArtifact();\r
+               vduArtifact.setName(heatTemplate.getTemplateName());\r
+               vduArtifact.setContent(heatTemplate.getHeatTemplate().getBytes());\r
+               vduArtifact.setType(artifactType);\r
+               return vduArtifact;\r
+       }\r
+\r
+       private void mapCloudFiles(VfModuleCustomization vfModuleCustom, VduModelInfo vduModel) throws Exception {\r
+               // TODO: These catalog objects will be refactored to be\r
+               // non-Heat-specific\r
+               CatalogDatabase db = CatalogDatabase.getInstance();\r
+\r
+               try{\r
+                       Map <String, HeatFiles> heatFiles = db.getHeatFilesForVfModule(vfModuleCustom.getVfModuleModelUuid());\r
+                       if (heatFiles != null) {\r
+                               for (HeatFiles heatFile: heatFiles.values()) {\r
+                                       mapCloudFileToVduArtifact(heatFile, ArtifactType.TEXT_FILE);\r
+                               }\r
+                       }\r
+               } catch (Exception e) {\r
+                       LOGGER.debug("unhandled exception in mapCloudFiles", e);\r
+                       throw new Exception("Exception during mapCloudFiles " + e.getMessage());\r
+               } finally {\r
+                       // Make sure DB session is closed\r
+                       db.close();\r
+               }\r
+               \r
+       }\r
+\r
+       private VduArtifact mapCloudFileToVduArtifact(HeatFiles heatFile, ArtifactType artifactType) {\r
+               VduArtifact vduArtifact = new VduArtifact();\r
+               vduArtifact.setName(heatFile.getFileName());\r
+               vduArtifact.setContent(heatFile.getFileBody().getBytes());\r
+               vduArtifact.setType(artifactType);\r
+               return vduArtifact;\r
+       }\r
+\r
+       private void mapEnvironment(HeatEnvironment heatEnvironment, VduModelInfo vduModel) {\r
+               // TODO: These catalog objects will be refactored to be\r
+               // non-Heat-specific\r
+               if (heatEnvironment != null) {\r
+                       List<VduArtifact> vduArtifacts = vduModel.getArtifacts();\r
+                       vduArtifacts.add(mapEnvironmentFileToVduArtifact(heatEnvironment));\r
+               }\r
+       }\r
+\r
+       private VduArtifact mapEnvironmentFileToVduArtifact(HeatEnvironment heatEnv) {\r
+               VduArtifact vduArtifact = new VduArtifact();\r
+               vduArtifact.setName(heatEnv.getName());\r
+               vduArtifact.setContent(heatEnv.getEnvironment().getBytes());\r
+               vduArtifact.setType(ArtifactType.ENVIRONMENT);\r
+               return vduArtifact;\r
+       }\r
+\r
+}
\ No newline at end of file
index 1db4c9f..32720e5 100644 (file)
@@ -75,22 +75,23 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 @WebService(serviceName = "VnfAdapter", endpointInterface = "org.openecomp.mso.adapters.vnf.MsoVnfAdapter", targetNamespace = "http://org.openecomp.mso/vnf")
 public class MsoVnfAdapterImpl implements MsoVnfAdapter {
 
-       CloudConfigFactory cloudConfigFactory = new CloudConfigFactory();
-       protected CloudConfig cloudConfig = null;
+    CloudConfigFactory cloudConfigFactory = new CloudConfigFactory();
+    protected CloudConfig cloudConfig = null;
 
-       MsoPropertiesFactory msoPropertiesFactory=new MsoPropertiesFactory();
+    MsoPropertiesFactory msoPropertiesFactory = new MsoPropertiesFactory();
 
-       private static final String MSO_PROP_VNF_ADAPTER = "MSO_PROP_VNF_ADAPTER";
+    private static final String MSO_PROP_VNF_ADAPTER = "MSO_PROP_VNF_ADAPTER";
     private static final String MSO_CONFIGURATION_ERROR = "MsoConfigurationError";
     private static final String VNF_ADAPTER_SERVICE_NAME = "MSO-BPMN:MSO-VnfAdapter.";
-    private static MsoLogger LOGGER = MsoLogger.getMsoLogger (MsoLogger.Catalog.RA);
-    private static MsoAlarmLogger alarmLogger = new MsoAlarmLogger ();
+    private static MsoLogger LOGGER = MsoLogger.getMsoLogger(MsoLogger.Catalog.RA);
+    private static MsoAlarmLogger alarmLogger = new MsoAlarmLogger();
     private static final String CHECK_REQD_PARAMS = "org.openecomp.mso.adapters.vnf.checkRequiredParameters";
     private static final String ADD_GET_FILES_ON_VOLUME_REQ = "org.openecomp.mso.adapters.vnf.addGetFilesOnVolumeReq";
     private static final ObjectMapper JSON_MAPPER = new ObjectMapper();
 
     /**
      * DO NOT use that constructor to instantiate this class, the msoPropertiesfactory will be NULL.
+     *
      * @see MsoVnfAdapterImpl#MsoVnfAdapterImpl(MsoPropertiesFactory, CloudConfigFactory)
      */
     public MsoVnfAdapterImpl() {
@@ -99,267 +100,268 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
 
     /**
      * This constructor MUST be used if this class is called with the new operator.
+     *
      * @param msoPropFactory
      */
     public MsoVnfAdapterImpl(MsoPropertiesFactory msoPropFactory, CloudConfigFactory cloudConfigFact) {
-       this.msoPropertiesFactory = msoPropFactory;
-       this.cloudConfigFactory = cloudConfigFact;
+        this.msoPropertiesFactory = msoPropFactory;
+        this.cloudConfigFactory = cloudConfigFact;
     }
 
     /**
      * Health Check web method. Does nothing but return to show the adapter is deployed.
      */
     @Override
-    public void healthCheck () {
-        LOGGER.debug ("Health check call in VNF Adapter");
+    public void healthCheck() {
+        LOGGER.debug("Health check call in VNF Adapter");
     }
 
     /**
      * This is the "Create VNF" web service implementation.
      * It will create a new VNF of the requested type in the specified cloud
      * and tenant. The tenant must exist before this service is called.
-     *
+     * <p>
      * If a VNF with the same name already exists, this can be considered a
      * success or failure, depending on the value of the 'failIfExists' parameter.
-     *
+     * <p>
      * All VNF types will be defined in the MSO catalog. The caller must request
      * one of these pre-defined types or an error will be returned. Within the
      * catalog, each VNF type references (among other things) a Heat template
      * which is used to deploy the required VNF artifacts (VMs, networks, etc.)
      * to the cloud.
-     *
+     * <p>
      * Depending on the Heat template, a variable set of input parameters will
      * be defined, some of which are required. The caller is responsible to
      * pass the necessary input data for the VNF or an error will be thrown.
-     *
+     * <p>
      * The method returns the vnfId (the canonical name), a Map of VNF output
      * attributes, and a VnfRollback object. This last object can be passed
      * as-is to the rollbackVnf operation to undo everything that was created
      * for the VNF. This is useful if a VNF is successfully created but the
      * orchestrator fails on a subsequent operation.
      *
-     * @param cloudSiteId CLLI code of the cloud site in which to create the VNF
-     * @param tenantId Openstack tenant identifier
-     * @param vnfType VNF type key, should match a VNF definition in catalog DB
-     * @param vnfVersion VNF version key, should match a VNF definition in catalog DB
-     * @param vnfName Name to be assigned to the new VNF
-     * @param inputs Map of key=value inputs for VNF stack creation
+     * @param cloudSiteId  CLLI code of the cloud site in which to create the VNF
+     * @param tenantId     Openstack tenant identifier
+     * @param vnfType      VNF type key, should match a VNF definition in catalog DB
+     * @param vnfVersion   VNF version key, should match a VNF definition in catalog DB
+     * @param vnfName      Name to be assigned to the new VNF
+     * @param inputs       Map of key=value inputs for VNF stack creation
      * @param failIfExists Flag whether already existing VNF should be considered
-     *        a success or failure
-     * @param msoRequest Request tracking information for logs
-     * @param vnfId Holder for output VNF Openstack ID
-     * @param outputs Holder for Map of VNF outputs from heat (assigned IPs, etc)
-     * @param rollback Holder for returning VnfRollback object
+     *                     a success or failure
+     * @param msoRequest   Request tracking information for logs
+     * @param vnfId        Holder for output VNF Openstack ID
+     * @param outputs      Holder for Map of VNF outputs from heat (assigned IPs, etc)
+     * @param rollback     Holder for returning VnfRollback object
      */
     @Override
-    public void createVnf (String cloudSiteId,
-                           String tenantId,
-                           String vnfType,
-                           String vnfVersion,
-                           String vnfName,
-                           String requestType,
-                           String volumeGroupHeatStackId,
-                           Map <String, String> inputs,
-                           Boolean failIfExists,
-                           Boolean backout,
-                           MsoRequest msoRequest,
-                           Holder <String> vnfId,
-                           Holder <Map <String, String>> outputs,
-                           Holder <VnfRollback> rollback) throws VnfException {
-       // Create a hook here to catch shortcut createVf requests:
-       if (requestType != null) {
-               if (requestType.startsWith("VFMOD")) {
-                       LOGGER.debug("Calling createVfModule from createVnf -- requestType=" + requestType);
-                       String newRequestType = requestType.substring(5);
-                       String vfVolGroupHeatStackId = "";
-                       String vfBaseHeatStackId = "";
-                       try {
-                               if (volumeGroupHeatStackId != null) {
-                                       vfVolGroupHeatStackId = volumeGroupHeatStackId.substring(0, volumeGroupHeatStackId.lastIndexOf("|"));
-                                       vfBaseHeatStackId = volumeGroupHeatStackId.substring(volumeGroupHeatStackId.lastIndexOf("|")+1);
-                               }
-                       } catch (Exception e) {
-                               // might be ok - both are just blank
-                               LOGGER.debug("ERROR trying to parse the volumeGroupHeatStackId " + volumeGroupHeatStackId,e);
-                       }
-                       this.createVfModule(cloudSiteId,
-                                       tenantId,
-                                       vnfType,
-                                       vnfVersion,
-                                       vnfName,
-                                       newRequestType,
-                                       vfVolGroupHeatStackId,
-                                       vfBaseHeatStackId,
+    public void createVnf(String cloudSiteId,
+                          String tenantId,
+                          String vnfType,
+                          String vnfVersion,
+                          String vnfName,
+                          String requestType,
+                          String volumeGroupHeatStackId,
+                          Map<String, String> inputs,
+                          Boolean failIfExists,
+                          Boolean backout,
+                          MsoRequest msoRequest,
+                          Holder<String> vnfId,
+                          Holder<Map<String, String>> outputs,
+                          Holder<VnfRollback> rollback) throws VnfException {
+        // Create a hook here to catch shortcut createVf requests:
+        if (requestType != null) {
+            if (requestType.startsWith("VFMOD")) {
+                LOGGER.debug("Calling createVfModule from createVnf -- requestType=" + requestType);
+                String newRequestType = requestType.substring(5);
+                String vfVolGroupHeatStackId = "";
+                String vfBaseHeatStackId = "";
+                try {
+                    if (volumeGroupHeatStackId != null) {
+                        vfVolGroupHeatStackId = volumeGroupHeatStackId.substring(0, volumeGroupHeatStackId.lastIndexOf("|"));
+                        vfBaseHeatStackId = volumeGroupHeatStackId.substring(volumeGroupHeatStackId.lastIndexOf("|") + 1);
+                    }
+                } catch (Exception e) {
+                    // might be ok - both are just blank
+                    LOGGER.debug("ERROR trying to parse the volumeGroupHeatStackId " + volumeGroupHeatStackId, e);
+                }
+                this.createVfModule(cloudSiteId,
+                        tenantId,
+                        vnfType,
+                        vnfVersion,
+                        vnfName,
+                        newRequestType,
+                        vfVolGroupHeatStackId,
+                        vfBaseHeatStackId,
                         null,
-                                       inputs,
-                                       failIfExists,
-                                       backout,
-                                       msoRequest,
-                                       vnfId,
-                                       outputs,
-                                       rollback);
-                       return;
-               }
-       }
-       // createVf will know if the requestType starts with "X" that it's the "old" way
-       StringBuilder newRequestTypeSb = new StringBuilder("X");
-       String vfVolGroupHeatStackId = "";
-       String vfBaseHeatStackId = "";
-       if (requestType != null) {
-               newRequestTypeSb.append(requestType);
-            }
-               this.createVfModule(cloudSiteId, 
-                                               tenantId,
-                               vnfType, 
-                               vnfVersion, 
-                                               vnfName,
-                               newRequestTypeSb.toString(), 
-                               vfVolGroupHeatStackId, 
-                               vfBaseHeatStackId, 
-                               null,
-                               inputs, 
-                               failIfExists, 
-                               backout, 
-                               msoRequest, 
-                               vnfId, 
-                               outputs, 
-                               rollback);
-       // End createVf shortcut
+                        inputs,
+                        failIfExists,
+                        backout,
+                        msoRequest,
+                        vnfId,
+                        outputs,
+                        rollback);
+                return;
+            }
+        }
+        // createVf will know if the requestType starts with "X" that it's the "old" way
+        StringBuilder newRequestTypeSb = new StringBuilder("X");
+        String vfVolGroupHeatStackId = "";
+        String vfBaseHeatStackId = "";
+        if (requestType != null) {
+            newRequestTypeSb.append(requestType);
         }
+        this.createVfModule(cloudSiteId,
+                tenantId,
+                vnfType,
+                vnfVersion,
+                vnfName,
+                newRequestTypeSb.toString(),
+                vfVolGroupHeatStackId,
+                vfBaseHeatStackId,
+                null,
+                inputs,
+                failIfExists,
+                backout,
+                msoRequest,
+                vnfId,
+                outputs,
+                rollback);
+        // End createVf shortcut
+    }
 
     @Override
-    public void updateVnf (String cloudSiteId,
-                           String tenantId,
-                           String vnfType,
-                           String vnfVersion,
-                           String vnfName,
-                           String requestType,
-                           String volumeGroupHeatStackId,
-                           Map <String, String> inputs,
-                           MsoRequest msoRequest,
-                           Holder <Map <String, String>> outputs,
-                           Holder <VnfRollback> rollback) throws VnfException {
-       // As of 1707 - this method should no longer be called
-       MsoLogger.setLogContext (msoRequest.getRequestId (), msoRequest.getServiceInstanceId ());
-       MsoLogger.setServiceName ("UpdateVnf");
-       LOGGER.debug("UpdateVnf called?? This should not be called any longer - update vfModule");
+    public void updateVnf(String cloudSiteId,
+                          String tenantId,
+                          String vnfType,
+                          String vnfVersion,
+                          String vnfName,
+                          String requestType,
+                          String volumeGroupHeatStackId,
+                          Map<String, String> inputs,
+                          MsoRequest msoRequest,
+                          Holder<Map<String, String>> outputs,
+                          Holder<VnfRollback> rollback) throws VnfException {
+        // As of 1707 - this method should no longer be called
+        MsoLogger.setLogContext(msoRequest.getRequestId(), msoRequest.getServiceInstanceId());
+        MsoLogger.setServiceName("UpdateVnf");
+        LOGGER.debug("UpdateVnf called?? This should not be called any longer - update vfModule");
     }
 
     /**
      * This is the "Query VNF" web service implementation.
      * It will look up a VNF by name or ID in the specified cloud and tenant.
-     *
+     * <p>
      * The method returns an indicator that the VNF exists, its Openstack internal
      * ID, its status, and the set of outputs (from when the stack was created).
      *
      * @param cloudSiteId CLLI code of the cloud site in which to query
-     * @param tenantId Openstack tenant identifier
-     * @param vnfName VNF Name or Openstack ID
-     * @param msoRequest Request tracking information for logs
-     * @param vnfExists Flag reporting the result of the query
-     * @param vnfId Holder for output VNF Openstack ID
-     * @param outputs Holder for Map of VNF outputs from heat (assigned IPs, etc)
+     * @param tenantId    Openstack tenant identifier
+     * @param vnfName     VNF Name or Openstack ID
+     * @param msoRequest  Request tracking information for logs
+     * @param vnfExists   Flag reporting the result of the query
+     * @param vnfId       Holder for output VNF Openstack ID
+     * @param outputs     Holder for Map of VNF outputs from heat (assigned IPs, etc)
      */
     @Override
-    public void queryVnf (String cloudSiteId,
-                          String tenantId,
-                          String vnfName,
-                          MsoRequest msoRequest,
-                          Holder <Boolean> vnfExists,
-                          Holder <String> vnfId,
-                          Holder <VnfStatus> status,
-                          Holder <Map <String, String>> outputs) throws VnfException {
-        MsoLogger.setLogContext (msoRequest);
-       MsoLogger.setServiceName ("QueryVnf");
-        LOGGER.debug ("Querying VNF " + vnfName + " in " + cloudSiteId + "/" + tenantId);
+    public void queryVnf(String cloudSiteId,
+                         String tenantId,
+                         String vnfName,
+                         MsoRequest msoRequest,
+                         Holder<Boolean> vnfExists,
+                         Holder<String> vnfId,
+                         Holder<VnfStatus> status,
+                         Holder<Map<String, String>> outputs) throws VnfException {
+        MsoLogger.setLogContext(msoRequest);
+        MsoLogger.setServiceName("QueryVnf");
+        LOGGER.debug("Querying VNF " + vnfName + " in " + cloudSiteId + "/" + tenantId);
 
         // Will capture execution time for metrics
-        long startTime = System.currentTimeMillis ();
+        long startTime = System.currentTimeMillis();
 
-        MsoHeatUtils heat = new MsoHeatUtils (MSO_PROP_VNF_ADAPTER, msoPropertiesFactory,cloudConfigFactory);
+        MsoHeatUtils heat = new MsoHeatUtils(MSO_PROP_VNF_ADAPTER, msoPropertiesFactory, cloudConfigFactory);
 
         StackInfo heatStack = null;
-        long subStartTime = System.currentTimeMillis ();
+        long subStartTime = System.currentTimeMillis();
         try {
-            heatStack = heat.queryStack (cloudSiteId, tenantId, vnfName);
-            LOGGER.recordMetricEvent (subStartTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully received response from Open Stack", "OpenStack", "QueryStack", vnfName);
+            heatStack = heat.queryStack(cloudSiteId, tenantId, vnfName);
+            LOGGER.recordMetricEvent(subStartTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully received response from Open Stack", "OpenStack", "QueryStack", vnfName);
         } catch (MsoException me) {
-            me.addContext ("QueryVNF");
+            me.addContext("QueryVNF");
             // Failed to query the Stack due to an openstack exception.
             // Convert to a generic VnfException
             String error = "Query VNF: " + vnfName + " in " + cloudSiteId + "/" + tenantId + ": " + me;
-            LOGGER.recordMetricEvent (subStartTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error, "OpenStack", "QueryStack", vnfName);
-            LOGGER.error (MessageEnum.RA_QUERY_VNF_ERR, vnfName, cloudSiteId, tenantId, "OpenStack", "QueryVNF", MsoLogger.ErrorCode.DataError, "Exception - queryStack", me);
-            LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error);
-            throw new VnfException (me);
+            LOGGER.recordMetricEvent(subStartTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error, "OpenStack", "QueryStack", vnfName);
+            LOGGER.error(MessageEnum.RA_QUERY_VNF_ERR, vnfName, cloudSiteId, tenantId, "OpenStack", "QueryVNF", MsoLogger.ErrorCode.DataError, "Exception - queryStack", me);
+            LOGGER.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error);
+            throw new VnfException(me);
         }
 
         // Populate the outputs based on the returned Stack information
         //
-        if (heatStack == null || heatStack.getStatus () == HeatStatus.NOTFOUND) {
+        if (heatStack == null || heatStack.getStatus() == HeatStatus.NOTFOUND) {
             // Not Found
             vnfExists.value = Boolean.FALSE;
             status.value = VnfStatus.NOTFOUND;
             vnfId.value = null;
             outputs.value = new HashMap<>(); // Return as an empty map
 
-            LOGGER.debug ("VNF " + vnfName + " not found");
+            LOGGER.debug("VNF " + vnfName + " not found");
         } else {
             vnfExists.value = Boolean.TRUE;
-            status.value = stackStatusToVnfStatus (heatStack.getStatus ());
-            vnfId.value = heatStack.getCanonicalName ();
-            outputs.value = copyStringOutputs (heatStack.getOutputs ());
+            status.value = stackStatusToVnfStatus(heatStack.getStatus());
+            vnfId.value = heatStack.getCanonicalName();
+            outputs.value = copyStringOutputs(heatStack.getOutputs());
 
-            LOGGER.debug ("VNF " + vnfName + " found, ID = " + vnfId.value);
+            LOGGER.debug("VNF " + vnfName + " found, ID = " + vnfId.value);
         }
-        LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully query VNF");
+        LOGGER.recordAuditEvent(startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully query VNF");
     }
 
     /**
      * This is the "Delete VNF" web service implementation.
      * It will delete a VNF by name or ID in the specified cloud and tenant.
-     *
+     * <p>
      * The method has no outputs.
      *
      * @param cloudSiteId CLLI code of the cloud site in which to delete
-     * @param tenantId Openstack tenant identifier
-     * @param vnfName VNF Name or Openstack ID
-     * @param msoRequest Request tracking information for logs
+     * @param tenantId    Openstack tenant identifier
+     * @param vnfName     VNF Name or Openstack ID
+     * @param msoRequest  Request tracking information for logs
      */
     @Override
-    public void deleteVnf (String cloudSiteId,
-                           String tenantId,
-                           String vnfName,
-                           MsoRequest msoRequest) throws VnfException {
-        MsoLogger.setLogContext (msoRequest);
-       MsoLogger.setServiceName ("DeleteVnf");
-        LOGGER.debug ("Deleting VNF " + vnfName + " in " + cloudSiteId + "/" + tenantId);
+    public void deleteVnf(String cloudSiteId,
+                          String tenantId,
+                          String vnfName,
+                          MsoRequest msoRequest) throws VnfException {
+        MsoLogger.setLogContext(msoRequest);
+        MsoLogger.setServiceName("DeleteVnf");
+        LOGGER.debug("Deleting VNF " + vnfName + " in " + cloudSiteId + "/" + tenantId);
         // Will capture execution time for metrics
-        long startTime = System.currentTimeMillis ();
+        long startTime = System.currentTimeMillis();
 
-        MsoHeatUtils heat = new MsoHeatUtils (MSO_PROP_VNF_ADAPTER, msoPropertiesFactory,cloudConfigFactory);
+        MsoHeatUtils heat = new MsoHeatUtils(MSO_PROP_VNF_ADAPTER, msoPropertiesFactory, cloudConfigFactory);
 
         // Use the MsoHeatUtils to delete the stack. Set the polling flag to true.
         // The possible outcomes of deleteStack are a StackInfo object with status
         // of NOTFOUND (on success) or FAILED (on error). Also, MsoOpenstackException
         // could be thrown.
-        long subStartTime = System.currentTimeMillis ();
+        long subStartTime = System.currentTimeMillis();
         try {
-            heat.deleteStack (tenantId, cloudSiteId, vnfName, true);
-            LOGGER.recordMetricEvent (subStartTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully received response from Open Stack", "OpenStack", "DeleteStack", vnfName);
+            heat.deleteStack(tenantId, cloudSiteId, vnfName, true);
+            LOGGER.recordMetricEvent(subStartTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully received response from Open Stack", "OpenStack", "DeleteStack", vnfName);
         } catch (MsoException me) {
-            me.addContext ("DeleteVNF");
+            me.addContext("DeleteVNF");
             // Failed to query the Stack due to an openstack exception.
             // Convert to a generic VnfException
             String error = "Delete VNF: " + vnfName + " in " + cloudSiteId + "/" + tenantId + ": " + me;
-            LOGGER.recordMetricEvent (subStartTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error, "OpenStack", "DeleteStack", vnfName);
-            LOGGER.error (MessageEnum.RA_DELETE_VNF_ERR, vnfName, cloudSiteId, tenantId, "OpenStack", "DeleteVNF", MsoLogger.ErrorCode.DataError, "Exception - DeleteVNF", me);
-            LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error);
-            throw new VnfException (me);
+            LOGGER.recordMetricEvent(subStartTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error, "OpenStack", "DeleteStack", vnfName);
+            LOGGER.error(MessageEnum.RA_DELETE_VNF_ERR, vnfName, cloudSiteId, tenantId, "OpenStack", "DeleteVNF", MsoLogger.ErrorCode.DataError, "Exception - DeleteVNF", me);
+            LOGGER.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error);
+            throw new VnfException(me);
         }
 
         // On success, nothing is returned.
-        LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully delete VNF");
+        LOGGER.recordAuditEvent(startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully delete VNF");
     }
 
     /**
@@ -369,49 +371,49 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
      * operation to undo the creation.
      */
     @Override
-    public void rollbackVnf (VnfRollback rollback) throws VnfException {
-        long startTime = System.currentTimeMillis ();
-        MsoLogger.setServiceName ("RollbackVnf");
-       // rollback may be null (e.g. if stack already existed when Create was called)
+    public void rollbackVnf(VnfRollback rollback) throws VnfException {
+        long startTime = System.currentTimeMillis();
+        MsoLogger.setServiceName("RollbackVnf");
+        // rollback may be null (e.g. if stack already existed when Create was called)
         if (rollback == null) {
-            LOGGER.info (MessageEnum.RA_ROLLBACK_NULL, "OpenStack", "rollbackVnf");
-            LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.BadRequest, "Rollback request content is null");
+            LOGGER.info(MessageEnum.RA_ROLLBACK_NULL, "OpenStack", "rollbackVnf");
+            LOGGER.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.BadRequest, "Rollback request content is null");
             return;
         }
 
         // Get the elements of the VnfRollback object for easier access
-        String cloudSiteId = rollback.getCloudSiteId ();
-        String tenantId = rollback.getTenantId ();
-        String vnfId = rollback.getVnfId ();
+        String cloudSiteId = rollback.getCloudSiteId();
+        String tenantId = rollback.getTenantId();
+        String vnfId = rollback.getVnfId();
 
-        MsoLogger.setLogContext (rollback.getMsoRequest());
+        MsoLogger.setLogContext(rollback.getMsoRequest());
 
-        LOGGER.debug ("Rolling Back VNF " + vnfId + " in " + cloudSiteId + "/" + tenantId);
+        LOGGER.debug("Rolling Back VNF " + vnfId + " in " + cloudSiteId + "/" + tenantId);
 
-        MsoHeatUtils heat = new MsoHeatUtils (MSO_PROP_VNF_ADAPTER, msoPropertiesFactory,cloudConfigFactory);
+        MsoHeatUtils heat = new MsoHeatUtils(MSO_PROP_VNF_ADAPTER, msoPropertiesFactory, cloudConfigFactory);
 
         // Use the MsoHeatUtils to delete the stack. Set the polling flag to true.
         // The possible outcomes of deleteStack are a StackInfo object with status
         // of NOTFOUND (on success) or FAILED (on error). Also, MsoOpenstackException
         // could be thrown.
-        long subStartTime = System.currentTimeMillis ();
+        long subStartTime = System.currentTimeMillis();
         try {
-            heat.deleteStack (tenantId, cloudSiteId, vnfId, true);
-            LOGGER.recordMetricEvent (subStartTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully received response from Open Stack", "OpenStack", "DeleteStack", null);
+            heat.deleteStack(tenantId, cloudSiteId, vnfId, true);
+            LOGGER.recordMetricEvent(subStartTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully received response from Open Stack", "OpenStack", "DeleteStack", null);
         } catch (MsoException me) {
             // Failed to rollback the Stack due to an openstack exception.
             // Convert to a generic VnfException
-            me.addContext ("RollbackVNF");
+            me.addContext("RollbackVNF");
             String error = "Rollback VNF: " + vnfId + " in " + cloudSiteId + "/" + tenantId + ": " + me;
-            LOGGER.recordMetricEvent (subStartTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error, "OpenStack", "DeleteStack", null);
-            LOGGER.error (MessageEnum.RA_DELETE_VNF_ERR, vnfId, cloudSiteId, tenantId, "OpenStack", "DeleteStack", MsoLogger.ErrorCode.DataError, "Exception - DeleteStack", me);
-            LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error);
-            throw new VnfException (me);
+            LOGGER.recordMetricEvent(subStartTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error, "OpenStack", "DeleteStack", null);
+            LOGGER.error(MessageEnum.RA_DELETE_VNF_ERR, vnfId, cloudSiteId, tenantId, "OpenStack", "DeleteStack", MsoLogger.ErrorCode.DataError, "Exception - DeleteStack", me);
+            LOGGER.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error);
+            throw new VnfException(me);
         }
-        LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully roll back VNF");
+        LOGGER.recordAuditEvent(startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully roll back VNF");
     }
 
-    private VnfStatus stackStatusToVnfStatus (HeatStatus stackStatus) {
+    private VnfStatus stackStatusToVnfStatus(HeatStatus stackStatus) {
         switch (stackStatus) {
             case CREATED:
                 return VnfStatus.ACTIVE;
@@ -424,50 +426,50 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
         }
     }
 
-    private Map <String, String> copyStringOutputs (Map <String, Object> stackOutputs) {
-        Map <String, String> stringOutputs = new HashMap <> ();
-        for (Map.Entry<String,Object> entry : stackOutputs.entrySet ()) {
+    private Map<String, String> copyStringOutputs(Map<String, Object> stackOutputs) {
+        Map<String, String> stringOutputs = new HashMap<>();
+        for (Map.Entry<String, Object> entry : stackOutputs.entrySet()) {
             String key = entry.getKey();
             Object value = entry.getValue();
             if (value instanceof String) {
-                stringOutputs.put (key, (String) value);
-            } else if (value instanceof Integer)  {
-               try {
-                       String str = "" + value;
-                       stringOutputs.put(key, str);
-               } catch (Exception e) {
-                       LOGGER.debug("Unable to add " + key + " to outputs",e);
-               }
+                stringOutputs.put(key, (String) value);
+            } else if (value instanceof Integer) {
+                try {
+                    String str = "" + value;
+                    stringOutputs.put(key, str);
+                } catch (Exception e) {
+                    LOGGER.debug("Unable to add " + key + " to outputs", e);
+                }
             } else if (value instanceof JsonNode) {
-               try {
-                       //String str = this.convertNode((JsonNode) value);
-                       String str = value.toString();
-                       stringOutputs.put(key, str);
-               } catch (Exception e) {
-                       LOGGER.debug("Unable to add " + key + " to outputs - exception converting JsonNode",e);
-               }
+                try {
+                    //String str = this.convertNode((JsonNode) value);
+                    String str = value.toString();
+                    stringOutputs.put(key, str);
+                } catch (Exception e) {
+                    LOGGER.debug("Unable to add " + key + " to outputs - exception converting JsonNode", e);
+                }
             } else if (value instanceof java.util.LinkedHashMap) {
-               try {
-                                       //String str = JSON_MAPPER.writeValueAsString(value);
-                       String str = value.toString();
-                       stringOutputs.put(key, str);
-               } catch (Exception e) {
-                       LOGGER.debug("Unable to add " + key + " to outputs - exception converting LinkedHashMap",e);
-               }
+                try {
+                    //String str = JSON_MAPPER.writeValueAsString(value);
+                    String str = value.toString();
+                    stringOutputs.put(key, str);
+                } catch (Exception e) {
+                    LOGGER.debug("Unable to add " + key + " to outputs - exception converting LinkedHashMap", e);
+                }
             } else {
-               try {
-                       String str = value.toString();
-                       stringOutputs.put(key, str);
-               } catch (Exception e) {
-                       LOGGER.debug("Unable to add " + key + " to outputs - unable to call .toString() " + e.getMessage(),e);
-               }
+                try {
+                    String str = value.toString();
+                    stringOutputs.put(key, str);
+                } catch (Exception e) {
+                    LOGGER.debug("Unable to add " + key + " to outputs - unable to call .toString() " + e.getMessage(), e);
+                }
             }
         }
         return stringOutputs;
     }
 
-    private Map <String, Object> copyStringInputs (Map <String, String> stringInputs) {
-        return new HashMap <> (stringInputs);
+    private Map<String, Object> copyStringInputs(Map<String, String> stringInputs) {
+        return new HashMap<>(stringInputs);
     }
 
     private boolean callHeatbridge(String heatStackId) {
@@ -484,7 +486,7 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
             boolean wait = p.waitFor(waitTimeMs, TimeUnit.MILLISECONDS);
 
             LOGGER.debug(" HeatBridgeMain.py returned " + wait + " with code " + p.exitValue());
-            return wait && p.exitValue()==0;
+            return wait && p.exitValue() == 0;
         } catch (IOException e) {
             LOGGER.debug(" HeatBridgeMain.py failed with IO Exception! " + e);
             return false;
@@ -502,34 +504,32 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
         StringBuilder sb = new StringBuilder(optionalName == null ? "\ninputs" : "\n" + optionalName);
         if (inputs == null) {
             sb.append("\tNULL");
-        }
-        else if (inputs.size() < 1) {
+        } else if (inputs.size() < 1) {
             sb.append("\tEMPTY");
         } else {
-            for (Map.Entry<String,Object> entry : inputs.entrySet()) {
+            for (Map.Entry<String, Object> entry : inputs.entrySet()) {
                 String outputString;
                 String str = entry.getKey();
                 Object value = entry.getValue();
                 try {
                     outputString = value.toString();
                 } catch (Exception e) {
-                    LOGGER.debug("Exception :",e);
+                    LOGGER.debug("Exception :", e);
                     outputString = "Unable to call toString() on the value for " + str;
                 }
                 sb.append("\t\nitem ").append(i++).append(": '").append(str).append("'='").append(outputString)
-                    .append("'");
+                        .append("'");
             }
         }
         LOGGER.debug(sb.toString());
     }
-    
+
     private void sendMapToDebug(Map<String, String> inputs) {
         int i = 0;
         StringBuilder sb = new StringBuilder("inputs:");
         if (inputs == null) {
             sb.append("\tNULL");
-        }
-        else if (inputs.size() < 1) {
+        } else if (inputs.size() < 1) {
             sb.append("\tEMPTY");
         } else {
             for (String str : inputs.keySet()) {
@@ -545,7 +545,7 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
             final String json = JSON_MAPPER.writeValueAsString(obj);
             return json;
         } catch (Exception e) {
-            LOGGER.debug("Error converting json to string " + e.getMessage(),e);
+            LOGGER.debug("Error converting json to string " + e.getMessage(), e);
         }
         return "[Error converting json to string]";
     }
@@ -560,14 +560,14 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
                 Object obj = objectMap.get(key);
                 if (obj instanceof String) {
                     stringMap.put(key, (String) objectMap.get(key));
-                } else if (obj instanceof JsonNode ){
+                } else if (obj instanceof JsonNode{
                     // This is a bit of mess - but I think it's the least impacting
                     // let's convert it BACK to a string - then it will get converted back later
                     try {
                         String str = this.convertNode((JsonNode) obj);
                         stringMap.put(key, str);
                     } catch (Exception e) {
-                                               LOGGER.debug("DANGER WILL ROBINSON: unable to convert value for JsonNode "+ key,e);
+                        LOGGER.debug("DANGER WILL ROBINSON: unable to convert value for JsonNode " + key, e);
                         //okay in this instance - only string values (fqdn) are expected to be needed
                     }
                 } else if (obj instanceof java.util.LinkedHashMap) {
@@ -576,21 +576,21 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
                         String str = JSON_MAPPER.writeValueAsString(obj);
                         stringMap.put(key, str);
                     } catch (Exception e) {
-                                               LOGGER.debug("DANGER WILL ROBINSON: unable to convert value for LinkedHashMap "+ key,e);
-                                       }
-                               }  else if (obj instanceof Integer) {
-                                       try {
-                                               String str = "" + obj;
-                                               stringMap.put(key, str);
-                                       } catch (Exception e) {
-                                               LOGGER.debug("DANGER WILL ROBINSON: unable to convert value for Integer "+ key,e);
+                        LOGGER.debug("DANGER WILL ROBINSON: unable to convert value for LinkedHashMap " + key, e);
+                    }
+                } else if (obj instanceof Integer) {
+                    try {
+                        String str = "" + obj;
+                        stringMap.put(key, str);
+                    } catch (Exception e) {
+                        LOGGER.debug("DANGER WILL ROBINSON: unable to convert value for Integer " + key, e);
                     }
                 } else {
                     try {
-                                               String str = obj.toString();
+                        String str = obj.toString();
                         stringMap.put(key, str);
                     } catch (Exception e) {
-                                               LOGGER.debug("DANGER WILL ROBINSON: unable to convert value "+ key + " (" + e.getMessage() + ")",e);
+                        LOGGER.debug("DANGER WILL ROBINSON: unable to convert value " + key + " (" + e.getMessage() + ")", e);
                     }
                 }
             }
@@ -601,24 +601,24 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
 
     @Override
     public void createVfModule(String cloudSiteId,
-            String tenantId,
-            String vnfType,
-            String vnfVersion,
-            String vnfName,
-            String requestType,
-            String volumeGroupHeatStackId,
-            String baseVfHeatStackId,
-            String modelCustomizationUuid,
-            Map <String, String> inputs,
-            Boolean failIfExists,
-            Boolean backout,
-            MsoRequest msoRequest,
-            Holder <String> vnfId,
-            Holder <Map <String, String>> outputs,
-            Holder <VnfRollback> rollback) throws VnfException {
-       String vfModuleName = vnfName;
-       String vfModuleType = vnfType;
-       String vfVersion = vnfVersion;
+                               String tenantId,
+                               String vnfType,
+                               String vnfVersion,
+                               String vnfName,
+                               String requestType,
+                               String volumeGroupHeatStackId,
+                               String baseVfHeatStackId,
+                               String modelCustomizationUuid,
+                               Map<String, String> inputs,
+                               Boolean failIfExists,
+                               Boolean backout,
+                               MsoRequest msoRequest,
+                               Holder<String> vnfId,
+                               Holder<Map<String, String>> outputs,
+                               Holder<VnfRollback> rollback) throws VnfException {
+        String vfModuleName = vnfName;
+        String vfModuleType = vnfType;
+        String vfVersion = vnfVersion;
         String mcu = modelCustomizationUuid;
         boolean useMCUuid = false;
         if (mcu != null && !mcu.isEmpty()) {
@@ -631,50 +631,60 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
                 useMCUuid = true;
             }
         }
-       MsoLogger.setLogContext (msoRequest);
-       MsoLogger.setServiceName ("CreateVfModule");
-       String requestTypeString = "";
+        MsoLogger.setLogContext(msoRequest);
+        MsoLogger.setServiceName("CreateVfModule");
+        String requestTypeString = "";
         if (requestType != null && !"".equals(requestType)) {
-               requestTypeString = requestType;
+            requestTypeString = requestType;
         }
         String nestedStackId = null;
         if (volumeGroupHeatStackId != null && !"".equals(volumeGroupHeatStackId)) {
-               if (!"null".equalsIgnoreCase(volumeGroupHeatStackId)) {
-                       nestedStackId = volumeGroupHeatStackId;
-               }
+            if (!"null".equalsIgnoreCase(volumeGroupHeatStackId)) {
+                nestedStackId = volumeGroupHeatStackId;
+            }
         }
         String nestedBaseStackId = null;
         if (baseVfHeatStackId != null && !"".equals(baseVfHeatStackId)) {
-               if (!"null".equalsIgnoreCase(baseVfHeatStackId)) {
-                       nestedBaseStackId = baseVfHeatStackId;
-               }
+            if (!"null".equalsIgnoreCase(baseVfHeatStackId)) {
+                nestedBaseStackId = baseVfHeatStackId;
+            }
         }
 
         if (inputs == null) {
-               // Create an empty set of inputs
-               inputs = new HashMap<>();
-               LOGGER.debug("inputs == null - setting to empty");
+            // Create an empty set of inputs
+            inputs = new HashMap<>();
+            LOGGER.debug("inputs == null - setting to empty");
         } else {
-               this.sendMapToDebug(inputs);
+            this.sendMapToDebug(inputs);
         }
         //This method will also handle doing things the "old" way - i.e., just orchestrate a VNF
         boolean oldWay = false;
         if (requestTypeString.startsWith("X")) {
-               oldWay = true;
-               LOGGER.debug("orchestrating a VNF - *NOT* a module!");
-               requestTypeString = requestTypeString.substring(1);
+            oldWay = true;
+            LOGGER.debug("orchestrating a VNF - *NOT* a module!");
+            requestTypeString = requestTypeString.substring(1);
         }
 
         // 1607 - let's parse out the request type we're being sent
         boolean isBaseRequest = false;
         boolean isVolumeRequest = false;
         if (requestTypeString.startsWith("VOLUME")) {
-               isVolumeRequest = true;
+            isVolumeRequest = true;
         }
 
         LOGGER.debug("requestTypeString = " + requestTypeString + ", nestedStackId = " + nestedStackId + ", nestedBaseStackId = " + nestedBaseStackId);
+
+        // TODO(sshank): Figure out the body format to be sent from Groovy.
+        String hpaEnviromnentString = "";
+        // Something similar to the following:
+        /*
+            if requestTypeString.substring(?) != "" {
+                hpaEnviromnentString = requestTypeString.substring(?)
+            }
+         */
+
         // Will capture execution time for metrics
-        long startTime = System.currentTimeMillis ();
+        long startTime = System.currentTimeMillis();
 
         // Build a default rollback object (no actions performed)
         VnfRollback vfRollback = new VnfRollback();
@@ -691,169 +701,169 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
         callHeatbridge(baseVfHeatStackId);
 
         // First, look up to see if the VF already exists.
-        MsoHeatUtils heat = new MsoHeatUtils (MSO_PROP_VNF_ADAPTER, msoPropertiesFactory,cloudConfigFactory);
+        MsoHeatUtils heat = new MsoHeatUtils(MSO_PROP_VNF_ADAPTER, msoPropertiesFactory, cloudConfigFactory);
 
         StackInfo heatStack = null;
-        long subStartTime1 = System.currentTimeMillis ();
+        long subStartTime1 = System.currentTimeMillis();
         try {
-            heatStack = heat.queryStack (cloudSiteId, tenantId, vfModuleName);
-            LOGGER.recordMetricEvent (subStartTime1, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully received response from Open Stack", "OpenStack", "QueryStack", vfModuleName);
+            heatStack = heat.queryStack(cloudSiteId, tenantId, vfModuleName);
+            LOGGER.recordMetricEvent(subStartTime1, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully received response from Open Stack", "OpenStack", "QueryStack", vfModuleName);
         } catch (MsoException me) {
-            String error = "Create VF Module: Query " + vfModuleName + " in " + cloudSiteId + "/" + tenantId + ": " + me ;
-            LOGGER.recordMetricEvent (subStartTime1, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error, "OpenStack", "QueryStack", vfModuleName);
-            LOGGER.error (MessageEnum.RA_QUERY_VNF_ERR, vfModuleName, cloudSiteId, tenantId, "OpenStack", "queryStack", MsoLogger.ErrorCode.DataError, "Exception - queryStack", me);
+            String error = "Create VF Module: Query " + vfModuleName + " in " + cloudSiteId + "/" + tenantId + ": " + me;
+            LOGGER.recordMetricEvent(subStartTime1, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error, "OpenStack", "QueryStack", vfModuleName);
+            LOGGER.error(MessageEnum.RA_QUERY_VNF_ERR, vfModuleName, cloudSiteId, tenantId, "OpenStack", "queryStack", MsoLogger.ErrorCode.DataError, "Exception - queryStack", me);
             // Failed to query the Stack due to an openstack exception.
             // Convert to a generic VnfException
-            me.addContext ("CreateVFModule");
-            LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error);
-            throw new VnfException (me);
+            me.addContext("CreateVFModule");
+            LOGGER.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error);
+            throw new VnfException(me);
         }
         // New with 1607 - more precise handling/messaging if the stack already exists
-        if (heatStack != null && !(heatStack.getStatus () == HeatStatus.NOTFOUND)) {
-               // INIT, CREATED, NOTFOUND, FAILED, BUILDING, DELETING, UNKNOWN, UPDATING, UPDATED
-               HeatStatus status = heatStack.getStatus();
-               if (status == HeatStatus.INIT || status == HeatStatus.BUILDING || status == HeatStatus.DELETING || status == HeatStatus.UPDATING) {
-                       // fail - it's in progress - return meaningful error
+        if (heatStack != null && !(heatStack.getStatus() == HeatStatus.NOTFOUND)) {
+            // INIT, CREATED, NOTFOUND, FAILED, BUILDING, DELETING, UNKNOWN, UPDATING, UPDATED
+            HeatStatus status = heatStack.getStatus();
+            if (status == HeatStatus.INIT || status == HeatStatus.BUILDING || status == HeatStatus.DELETING || status == HeatStatus.UPDATING) {
+                // fail - it's in progress - return meaningful error
                 String error = "Create VF: Stack " + vfModuleName + " already exists and has status " + status.toString() + " in " + cloudSiteId + "/" + tenantId + "; please wait for it to complete, or fix manually.";
-                LOGGER.error (MessageEnum.RA_VNF_ALREADY_EXIST, vfModuleName, cloudSiteId, tenantId, "OpenStack", "queryStack", MsoLogger.ErrorCode.DataError, "Stack " + vfModuleName + " already exists");
-                LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict, error);
-                throw new VnfAlreadyExists (vfModuleName, cloudSiteId, tenantId, heatStack.getCanonicalName ());
-               }
-               if (status == HeatStatus.FAILED) {
-                       // fail - it exists and is in a FAILED state
+                LOGGER.error(MessageEnum.RA_VNF_ALREADY_EXIST, vfModuleName, cloudSiteId, tenantId, "OpenStack", "queryStack", MsoLogger.ErrorCode.DataError, "Stack " + vfModuleName + " already exists");
+                LOGGER.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict, error);
+                throw new VnfAlreadyExists(vfModuleName, cloudSiteId, tenantId, heatStack.getCanonicalName());
+            }
+            if (status == HeatStatus.FAILED) {
+                // fail - it exists and is in a FAILED state
                 String error = "Create VF: Stack " + vfModuleName + " already exists and is in FAILED state in " + cloudSiteId + "/" + tenantId + "; requires manual intervention.";
-                LOGGER.error (MessageEnum.RA_VNF_ALREADY_EXIST, vfModuleName, cloudSiteId, tenantId, "OpenStack", "queryStack", MsoLogger.ErrorCode.DataError, "Stack " + vfModuleName + " already exists and is in FAILED state");
-                LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict, error);
-                throw new VnfAlreadyExists (vfModuleName, cloudSiteId, tenantId, heatStack.getCanonicalName ());
-               }
-               if (status == HeatStatus.UNKNOWN || status == HeatStatus.UPDATED) {
-                       // fail - it exists and is in a FAILED state
+                LOGGER.error(MessageEnum.RA_VNF_ALREADY_EXIST, vfModuleName, cloudSiteId, tenantId, "OpenStack", "queryStack", MsoLogger.ErrorCode.DataError, "Stack " + vfModuleName + " already exists and is in FAILED state");
+                LOGGER.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict, error);
+                throw new VnfAlreadyExists(vfModuleName, cloudSiteId, tenantId, heatStack.getCanonicalName());
+            }
+            if (status == HeatStatus.UNKNOWN || status == HeatStatus.UPDATED) {
+                // fail - it exists and is in a FAILED state
                 String error = "Create VF: Stack " + vfModuleName + " already exists and has status " + status.toString() + " in " + cloudSiteId + "/" + tenantId + "; requires manual intervention.";
-                LOGGER.error (MessageEnum.RA_VNF_ALREADY_EXIST, vfModuleName, cloudSiteId, tenantId, "OpenStack", "queryStack", MsoLogger.ErrorCode.DataError, "Stack " + vfModuleName + " already exists and is in UPDATED or UNKNOWN state");
-                LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict, error);
-                throw new VnfAlreadyExists (vfModuleName, cloudSiteId, tenantId, heatStack.getCanonicalName ());
-               }
-               if (status == HeatStatus.CREATED) {
-                       // fail - it exists
-                       if (failIfExists != null && failIfExists) {
-                               String error = "Create VF: Stack " + vfModuleName + " already exists in " + cloudSiteId + "/" + tenantId;
-                               LOGGER.error (MessageEnum.RA_VNF_ALREADY_EXIST, vfModuleName, cloudSiteId, tenantId, "OpenStack", "queryStack", MsoLogger.ErrorCode.DataError, "Stack " + vfModuleName + " already exists");
-                    LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict, error);
-                               throw new VnfAlreadyExists (vfModuleName, cloudSiteId, tenantId, heatStack.getCanonicalName ());
-                       } else {
-                               LOGGER.debug ("Found Existing stack, status=" + heatStack.getStatus ());
-                               // Populate the outputs from the existing stack.
-                               vnfId.value = heatStack.getCanonicalName ();
-                               outputs.value = copyStringOutputs (heatStack.getOutputs ());
-                               rollback.value = vfRollback; // Default rollback - no updates performed
-                       }
-               }
-            LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully create VF Module");
+                LOGGER.error(MessageEnum.RA_VNF_ALREADY_EXIST, vfModuleName, cloudSiteId, tenantId, "OpenStack", "queryStack", MsoLogger.ErrorCode.DataError, "Stack " + vfModuleName + " already exists and is in UPDATED or UNKNOWN state");
+                LOGGER.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict, error);
+                throw new VnfAlreadyExists(vfModuleName, cloudSiteId, tenantId, heatStack.getCanonicalName());
+            }
+            if (status == HeatStatus.CREATED) {
+                // fail - it exists
+                if (failIfExists != null && failIfExists) {
+                    String error = "Create VF: Stack " + vfModuleName + " already exists in " + cloudSiteId + "/" + tenantId;
+                    LOGGER.error(MessageEnum.RA_VNF_ALREADY_EXIST, vfModuleName, cloudSiteId, tenantId, "OpenStack", "queryStack", MsoLogger.ErrorCode.DataError, "Stack " + vfModuleName + " already exists");
+                    LOGGER.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict, error);
+                    throw new VnfAlreadyExists(vfModuleName, cloudSiteId, tenantId, heatStack.getCanonicalName());
+                } else {
+                    LOGGER.debug("Found Existing stack, status=" + heatStack.getStatus());
+                    // Populate the outputs from the existing stack.
+                    vnfId.value = heatStack.getCanonicalName();
+                    outputs.value = copyStringOutputs(heatStack.getOutputs());
+                    rollback.value = vfRollback; // Default rollback - no updates performed
+                }
+            }
+            LOGGER.recordAuditEvent(startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully create VF Module");
             return;
 
         }
 
         // handle a nestedStackId if sent- this one would be for the volume - so applies to both Vf and Vnf
         StackInfo nestedHeatStack = null;
-        long subStartTime2 = System.currentTimeMillis ();
+        long subStartTime2 = System.currentTimeMillis();
         Map<String, Object> nestedVolumeOutputs = null;
         if (nestedStackId != null) {
-               try {
-                       LOGGER.debug("Querying for nestedStackId = " + nestedStackId);
-                       nestedHeatStack = heat.queryStack(cloudSiteId, tenantId, nestedStackId);
-                LOGGER.recordMetricEvent (subStartTime2, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully received response from Open Stack", "OpenStack", "QueryStack", vfModuleName);
-               } catch (MsoException me) {
-                   // Failed to query the Stack due to an openstack exception.
-                   // Convert to a generic VnfException
-                   me.addContext ("CreateVFModule");
-                   String error = "Create VFModule: Attached heatStack ID Query " + nestedStackId + " in " + cloudSiteId + "/" + tenantId + ": " + me ;
-                LOGGER.recordMetricEvent (subStartTime2, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error, "OpenStack", "QueryStack", vfModuleName);
-                   LOGGER.error (MessageEnum.RA_QUERY_VNF_ERR, vfModuleName, cloudSiteId, tenantId, "OpenStack", "queryStack", MsoLogger.ErrorCode.BusinessProcesssError, "MsoException trying to query nested stack", me);
-                       LOGGER.debug("ERROR trying to query nested stack= " + error);
-                LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error);
-                   throw new VnfException (me);
-               }
-               if (nestedHeatStack == null || nestedHeatStack.getStatus() == HeatStatus.NOTFOUND) {
-                   String error = "Create VFModule: Attached heatStack ID DOES NOT EXIST " + nestedStackId + " in " + cloudSiteId + "/" + tenantId + " USER ERROR"  ;
-                   LOGGER.error (MessageEnum.RA_QUERY_VNF_ERR, vfModuleName, cloudSiteId, tenantId, error, "OpenStack", "queryStack", MsoLogger.ErrorCode.BusinessProcesssError, "Create VFModule: Attached heatStack ID DOES NOT EXIST");
-                LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict, error);
-                   LOGGER.debug(error);
-                   throw new VnfException (error, MsoExceptionCategory.USERDATA);
-               } else {
-                       LOGGER.debug("Found nested volume heat stack - copying values to inputs *later*");
-                       //this.sendMapToDebug(inputs);
-                       nestedVolumeOutputs = nestedHeatStack.getOutputs();
-                       this.sendMapToDebug(nestedVolumeOutputs, "volumeStackOutputs");
-                       //TODO
-                       //heat.copyStringOutputsToInputs(inputs, nestedHeatStack.getOutputs(), false);      
-                       //this.sendMapToDebug(inputs);
-               }
+            try {
+                LOGGER.debug("Querying for nestedStackId = " + nestedStackId);
+                nestedHeatStack = heat.queryStack(cloudSiteId, tenantId, nestedStackId);
+                LOGGER.recordMetricEvent(subStartTime2, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully received response from Open Stack", "OpenStack", "QueryStack", vfModuleName);
+            } catch (MsoException me) {
+                // Failed to query the Stack due to an openstack exception.
+                // Convert to a generic VnfException
+                me.addContext("CreateVFModule");
+                String error = "Create VFModule: Attached heatStack ID Query " + nestedStackId + " in " + cloudSiteId + "/" + tenantId + ": " + me;
+                LOGGER.recordMetricEvent(subStartTime2, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error, "OpenStack", "QueryStack", vfModuleName);
+                LOGGER.error(MessageEnum.RA_QUERY_VNF_ERR, vfModuleName, cloudSiteId, tenantId, "OpenStack", "queryStack", MsoLogger.ErrorCode.BusinessProcesssError, "MsoException trying to query nested stack", me);
+                LOGGER.debug("ERROR trying to query nested stack= " + error);
+                LOGGER.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error);
+                throw new VnfException(me);
+            }
+            if (nestedHeatStack == null || nestedHeatStack.getStatus() == HeatStatus.NOTFOUND) {
+                String error = "Create VFModule: Attached heatStack ID DOES NOT EXIST " + nestedStackId + " in " + cloudSiteId + "/" + tenantId + " USER ERROR";
+                LOGGER.error(MessageEnum.RA_QUERY_VNF_ERR, vfModuleName, cloudSiteId, tenantId, error, "OpenStack", "queryStack", MsoLogger.ErrorCode.BusinessProcesssError, "Create VFModule: Attached heatStack ID DOES NOT EXIST");
+                LOGGER.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict, error);
+                LOGGER.debug(error);
+                throw new VnfException(error, MsoExceptionCategory.USERDATA);
+            } else {
+                LOGGER.debug("Found nested volume heat stack - copying values to inputs *later*");
+                //this.sendMapToDebug(inputs);
+                nestedVolumeOutputs = nestedHeatStack.getOutputs();
+                this.sendMapToDebug(nestedVolumeOutputs, "volumeStackOutputs");
+                //TODO
+                //heat.copyStringOutputsToInputs(inputs, nestedHeatStack.getOutputs(), false);
+                //this.sendMapToDebug(inputs);
+            }
         }
 
         // handle a nestedBaseStackId if sent- this is the stack ID of the base. Should be null for VNF requests
         StackInfo nestedBaseHeatStack = null;
-        long subStartTime3 = System.currentTimeMillis ();
+        long subStartTime3 = System.currentTimeMillis();
         Map<String, Object> baseStackOutputs = null;
         if (nestedBaseStackId != null) {
-               try {
-                       LOGGER.debug("Querying for nestedBaseStackId = " + nestedBaseStackId);
-                       nestedBaseHeatStack = heat.queryStack(cloudSiteId, tenantId, nestedBaseStackId);
-                LOGGER.recordMetricEvent (subStartTime3, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully received response from Open Stack", "OpenStack", "QueryStack", vfModuleName);
-               } catch (MsoException me) {
-                   // Failed to query the Stack due to an openstack exception.
-                   // Convert to a generic VnfException
-                   me.addContext ("CreateVFModule");
-                   String error = "Create VFModule: Attached baseHeatStack ID Query " + nestedBaseStackId + " in " + cloudSiteId + "/" + tenantId + ": " + me ;
-                LOGGER.recordMetricEvent (subStartTime3, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error, "OpenStack", "QueryStack", vfModuleName);
-                   LOGGER.error (MessageEnum.RA_QUERY_VNF_ERR, vfModuleName, cloudSiteId, tenantId, "OpenStack", "QueryStack", MsoLogger.ErrorCode.BusinessProcesssError, "MsoException trying to query nested base stack", me);
-                       LOGGER.debug("ERROR trying to query nested base stack= " + error);
-                LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error);
-                   throw new VnfException (me);
-               }
-               if (nestedBaseHeatStack == null || nestedBaseHeatStack.getStatus() == HeatStatus.NOTFOUND) {
-                   String error = "Create VFModule: Attached base heatStack ID DOES NOT EXIST " + nestedBaseStackId + " in " + cloudSiteId + "/" + tenantId + " USER ERROR"  ;
-                   LOGGER.error (MessageEnum.RA_QUERY_VNF_ERR, vfModuleName, cloudSiteId, tenantId, error, "OpenStack", "QueryStack", MsoLogger.ErrorCode.BusinessProcesssError, "Create VFModule: Attached base heatStack ID DOES NOT EXIST");
-                LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict, error);
-                   LOGGER.debug(error);
-                   throw new VnfException (error, MsoExceptionCategory.USERDATA);
-               } else {
-                       LOGGER.debug("Found nested base heat stack - these values will be copied to inputs *later*");
-                       //this.sendMapToDebug(inputs);
-                       baseStackOutputs = nestedBaseHeatStack.getOutputs();
-                       this.sendMapToDebug(baseStackOutputs, "baseStackOutputs");
-                       //TODO
-                       //heat.copyStringOutputsToInputs(inputs, nestedBaseHeatStack.getOutputs(), false);      
-                       //this.sendMapToDebug(inputs);
-               }
+            try {
+                LOGGER.debug("Querying for nestedBaseStackId = " + nestedBaseStackId);
+                nestedBaseHeatStack = heat.queryStack(cloudSiteId, tenantId, nestedBaseStackId);
+                LOGGER.recordMetricEvent(subStartTime3, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully received response from Open Stack", "OpenStack", "QueryStack", vfModuleName);
+            } catch (MsoException me) {
+                // Failed to query the Stack due to an openstack exception.
+                // Convert to a generic VnfException
+                me.addContext("CreateVFModule");
+                String error = "Create VFModule: Attached baseHeatStack ID Query " + nestedBaseStackId + " in " + cloudSiteId + "/" + tenantId + ": " + me;
+                LOGGER.recordMetricEvent(subStartTime3, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error, "OpenStack", "QueryStack", vfModuleName);
+                LOGGER.error(MessageEnum.RA_QUERY_VNF_ERR, vfModuleName, cloudSiteId, tenantId, "OpenStack", "QueryStack", MsoLogger.ErrorCode.BusinessProcesssError, "MsoException trying to query nested base stack", me);
+                LOGGER.debug("ERROR trying to query nested base stack= " + error);
+                LOGGER.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error);
+                throw new VnfException(me);
+            }
+            if (nestedBaseHeatStack == null || nestedBaseHeatStack.getStatus() == HeatStatus.NOTFOUND) {
+                String error = "Create VFModule: Attached base heatStack ID DOES NOT EXIST " + nestedBaseStackId + " in " + cloudSiteId + "/" + tenantId + " USER ERROR";
+                LOGGER.error(MessageEnum.RA_QUERY_VNF_ERR, vfModuleName, cloudSiteId, tenantId, error, "OpenStack", "QueryStack", MsoLogger.ErrorCode.BusinessProcesssError, "Create VFModule: Attached base heatStack ID DOES NOT EXIST");
+                LOGGER.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict, error);
+                LOGGER.debug(error);
+                throw new VnfException(error, MsoExceptionCategory.USERDATA);
+            } else {
+                LOGGER.debug("Found nested base heat stack - these values will be copied to inputs *later*");
+                //this.sendMapToDebug(inputs);
+                baseStackOutputs = nestedBaseHeatStack.getOutputs();
+                this.sendMapToDebug(baseStackOutputs, "baseStackOutputs");
+                //TODO
+                //heat.copyStringOutputsToInputs(inputs, nestedBaseHeatStack.getOutputs(), false);
+                //this.sendMapToDebug(inputs);
+            }
         }
 
         // Ready to deploy the new VNF
 
         try (CatalogDatabase db = CatalogDatabase.getInstance()) {
             // Retrieve the VF
-               VfModule vf = null;
-               VnfResource vnfResource = null;
-               VfModuleCustomization vfmc = null;
-               LOGGER.debug("version: " + vfVersion);
+            VfModule vf = null;
+            VnfResource vnfResource = null;
+            VfModuleCustomization vfmc = null;
+            LOGGER.debug("version: " + vfVersion);
             if (useMCUuid) {
-                       // 1707 - db refactoring
-                       vfmc = db.getVfModuleCustomizationByModelCustomizationId(mcu);
-                       vf = vfmc != null ? vfmc.getVfModule() : null;
+                // 1707 - db refactoring
+                vfmc = db.getVfModuleCustomizationByModelCustomizationId(mcu);
+                vf = vfmc != null ? vfmc.getVfModule() : null;
                 // 1702 - this will be the new way going forward. We find the vf by mcu - otherwise, code is the same.
-                       //vf = db.getVfModuleByModelCustomizationUuid(mcu);
+                //vf = db.getVfModuleByModelCustomizationUuid(mcu);
                 if (vf == null) {
                     LOGGER.debug("Unable to find vfModuleCust with modelCustomizationUuid=" + mcu);
                     String error =
-                        "Create vfModule error: Unable to find vfModuleCust with modelCustomizationUuid=" + mcu;
+                            "Create vfModule error: Unable to find vfModuleCust with modelCustomizationUuid=" + mcu;
                     LOGGER.error(MessageEnum.RA_VNF_UNKNOWN_PARAM,
-                        "VF Module ModelCustomizationUuid", modelCustomizationUuid, "OpenStack", "",
-                        MsoLogger.ErrorCode.DataError,
-                        "Create VF Module: Unable to find vfModule with modelCustomizationUuid=" + mcu);
+                            "VF Module ModelCustomizationUuid", modelCustomizationUuid, "OpenStack", "",
+                            MsoLogger.ErrorCode.DataError,
+                            "Create VF Module: Unable to find vfModule with modelCustomizationUuid=" + mcu);
                     LOGGER.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound,
-                        error);
+                            error);
                     throw new VnfException(error, MsoExceptionCategory.USERDATA);
                 } else {
-                               LOGGER.debug("Found vfModuleCust entry " + vfmc.toString());
+                    LOGGER.debug("Found vfModuleCust entry " + vfmc.toString());
                 }
                 if (vf.isBase()) {
                     isBaseRequest = true;
@@ -862,27 +872,26 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
                     LOGGER.debug("This is *not* a BASE VF request!");
                     if (!isVolumeRequest && nestedBaseStackId == null) {
                         LOGGER.debug(
-                            "DANGER WILL ROBINSON! This is unexpected - no nestedBaseStackId with this non-base request");
+                                "DANGER WILL ROBINSON! This is unexpected - no nestedBaseStackId with this non-base request");
                     }
                 }
-               }
-               else { // This is to support gamma only - get info from vnf_resource table
-                               if (vfVersion != null && !vfVersion.isEmpty()) {
-                                       vnfResource = db.getVnfResource(vnfType, vnfVersion);
-                               } else {
-                                       vnfResource = db.getVnfResource(vnfType);
-                               }
-                               if (vnfResource == null) {
-                                       String error = "Create VNF: Unknown VNF Type: " + vnfType;
-                                       LOGGER.error(MessageEnum.RA_VNF_UNKNOWN_PARAM, "VNF Type",
-                                                       vnfType, "OpenStack", "", MsoLogger.ErrorCode.DataError, "Create VNF: Unknown VNF Type");
-                    LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, error);
-                                       throw new VnfException(error, MsoExceptionCategory.USERDATA);
-                               }
-                               LOGGER.debug("Got VNF module definition from Catalog: "
-                                               + vnfResource.toString());
-                       }
-                       // By here - we have either a vf or vnfResource
+            } else { // This is to support gamma only - get info from vnf_resource table
+                if (vfVersion != null && !vfVersion.isEmpty()) {
+                    vnfResource = db.getVnfResource(vnfType, vnfVersion);
+                } else {
+                    vnfResource = db.getVnfResource(vnfType);
+                }
+                if (vnfResource == null) {
+                    String error = "Create VNF: Unknown VNF Type: " + vnfType;
+                    LOGGER.error(MessageEnum.RA_VNF_UNKNOWN_PARAM, "VNF Type",
+                            vnfType, "OpenStack", "", MsoLogger.ErrorCode.DataError, "Create VNF: Unknown VNF Type");
+                    LOGGER.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, error);
+                    throw new VnfException(error, MsoExceptionCategory.USERDATA);
+                }
+                LOGGER.debug("Got VNF module definition from Catalog: "
+                        + vnfResource.toString());
+            }
+            // By here - we have either a vf or vnfResource
 
             //1607 - Add version check
             // First - see if it's in the VnfResource record
@@ -894,7 +903,7 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
                     vnfResource = db.getVnfResourceByModelUuid(vnfResourceModelUuid);
                     if (vnfResource == null) {
                         LOGGER.debug(
-                            "Unable to find vnfResource at " + vnfResourceModelUuid + " will not error for now...");
+                                "Unable to find vnfResource at " + vnfResourceModelUuid + " will not error for now...");
                     }
                 }
             }
@@ -939,25 +948,25 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
                             equalToMax = aicV.isTheSameVersion(maxVersionVnf);
                         } catch (Exception e) {
                             LOGGER.debug("An exception occured while trying to test AIC Version " + e.getMessage()
-                                + " - will default to not check", e);
+                                    + " - will default to not check", e);
                             doNotTest = true;
                         }
                         if (!doNotTest) {
                             if ((moreThanMin || equalToMin) // aic >= min
-                                && (equalToMax || !(moreThanMax))) { //aic <= max
+                                    && (equalToMax || !(moreThanMax))) { //aic <= max
                                 LOGGER.debug("VNF Resource " + vnfResource.getModelName() + ", ModelUuid=" + vnfResource
-                                    .getModelUuid() + " VersionMin=" + minVersionVnf + " VersionMax:" + maxVersionVnf
-                                    + " supported on Cloud: " + cloudSiteOpt.get().getId() + " with AIC_Version:"
-                                    + cloudSiteOpt.get().getAic_version());
+                                        .getModelUuid() + " VersionMin=" + minVersionVnf + " VersionMax:" + maxVersionVnf
+                                        + " supported on Cloud: " + cloudSiteOpt.get().getId() + " with AIC_Version:"
+                                        + cloudSiteOpt.get().getAic_version());
                             } else {
                                 // ERROR
                                 String error =
-                                    "VNF Resource type: " + vnfResource.getModelName() + ", ModelUuid=" + vnfResource
-                                        .getModelUuid() + " VersionMin=" + minVersionVnf + " VersionMax:"
-                                        + maxVersionVnf + " NOT supported on Cloud: " + cloudSiteOpt.get().getId()
-                                        + " with AIC_Version:" + cloudSiteOpt.get().getAic_version();
+                                        "VNF Resource type: " + vnfResource.getModelName() + ", ModelUuid=" + vnfResource
+                                                .getModelUuid() + " VersionMin=" + minVersionVnf + " VersionMax:"
+                                                + maxVersionVnf + " NOT supported on Cloud: " + cloudSiteOpt.get().getId()
+                                                + " with AIC_Version:" + cloudSiteOpt.get().getAic_version();
                                 LOGGER.error(MessageEnum.RA_CONFIG_EXC, error, "OpenStack", "",
-                                    MsoLogger.ErrorCode.BusinessProcesssError, "Exception - setVersion");
+                                        MsoLogger.ErrorCode.BusinessProcesssError, "Exception - setVersion");
                                 LOGGER.debug(error);
                                 throw new VnfException(error, MsoExceptionCategory.USERDATA);
                             }
@@ -970,7 +979,7 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
                 }
             } else {
                 LOGGER.debug(
-                    "AIC Version not set in VNF_Resource - this is expected thru 1607 - do not error here - not checked.");
+                        "AIC Version not set in VNF_Resource - this is expected thru 1607 - do not error here - not checked.");
             }
             // End Version check 1607
 
@@ -978,49 +987,49 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
             // with VNF_RESOURCE - we use the old methods.
             //Integer heatTemplateId = null;
             //Integer heatEnvtId = null;
-            
+
             String heatTemplateArtifactUuid = null;
             String heatEnvironmentArtifactUuid = null;
 
-                       if (!oldWay) {
-                               if (isVolumeRequest) {
-                                       heatTemplateArtifactUuid = vf.getVolHeatTemplateArtifactUUId();
-                                       heatEnvironmentArtifactUuid = vfmc.getVolEnvironmentArtifactUuid();
-                               } else {
-                                       heatTemplateArtifactUuid = vf.getHeatTemplateArtifactUUId();
-                                       heatEnvironmentArtifactUuid = vfmc.getHeatEnvironmentArtifactUuid();
-                               }
-                       } else {
-                               if (isVolumeRequest) {
-                                       LOGGER.debug("DANGER WILL ROBINSON! This should never apply - a VNF Request (gamma only now) *and* a volume request?");
-                               } else {
-                                       heatTemplateArtifactUuid = vnfResource.getTemplateId();
-                                       heatEnvironmentArtifactUuid = null;
-                               }
-                       }
-                       // By the time we get here - heatTemplateId and heatEnvtId should be populated (or null)
-                       HeatTemplate heatTemplate = null;
-                       if (heatTemplateArtifactUuid == null || "".equals(heatTemplateArtifactUuid)) {
-                               String error = "Create: No Heat Template ID defined in catalog database for " + vnfType + ", reqType=" + requestTypeString;
-                               LOGGER.error(MessageEnum.RA_VNF_UNKNOWN_PARAM, "Heat Template ID", vnfType, "OpenStack", "", MsoLogger.ErrorCode.DataError, "Create: No Heat Template ID defined in catalog database");
-                LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, error);
-                               alarmLogger.sendAlarm(MSO_CONFIGURATION_ERROR,
-                                               MsoAlarmLogger.CRITICAL, error);
-                               throw new VnfException(error, MsoExceptionCategory.INTERNAL);
-                       } else {
-                               heatTemplate = db.getHeatTemplateByArtifactUuidRegularQuery(heatTemplateArtifactUuid);
-                       }
-                       if (heatTemplate == null) {
-                               String error = "Create VF/VNF: no entry found for heat template ID = " + heatTemplateArtifactUuid;
-                               LOGGER.error(MessageEnum.RA_VNF_UNKNOWN_PARAM,
-                                               "Heat Template ID",
-                                               String.valueOf(heatTemplateArtifactUuid), "OpenStack", "", MsoLogger.ErrorCode.BusinessProcesssError, "Create VF/VNF: no entry found for heat template ID = " + heatTemplateArtifactUuid);
-                LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, error);
-                               alarmLogger.sendAlarm(MSO_CONFIGURATION_ERROR,
-                                               MsoAlarmLogger.CRITICAL, error);
-                               throw new VnfException(error, MsoExceptionCategory.INTERNAL);
-                       }
-                       LOGGER.debug("Got HEAT Template from DB");
+            if (!oldWay) {
+                if (isVolumeRequest) {
+                    heatTemplateArtifactUuid = vf.getVolHeatTemplateArtifactUUId();
+                    heatEnvironmentArtifactUuid = vfmc.getVolEnvironmentArtifactUuid();
+                } else {
+                    heatTemplateArtifactUuid = vf.getHeatTemplateArtifactUUId();
+                    heatEnvironmentArtifactUuid = vfmc.getHeatEnvironmentArtifactUuid();
+                }
+            } else {
+                if (isVolumeRequest) {
+                    LOGGER.debug("DANGER WILL ROBINSON! This should never apply - a VNF Request (gamma only now) *and* a volume request?");
+                } else {
+                    heatTemplateArtifactUuid = vnfResource.getTemplateId();
+                    heatEnvironmentArtifactUuid = null;
+                }
+            }
+            // By the time we get here - heatTemplateId and heatEnvtId should be populated (or null)
+            HeatTemplate heatTemplate = null;
+            if (heatTemplateArtifactUuid == null || "".equals(heatTemplateArtifactUuid)) {
+                String error = "Create: No Heat Template ID defined in catalog database for " + vnfType + ", reqType=" + requestTypeString;
+                LOGGER.error(MessageEnum.RA_VNF_UNKNOWN_PARAM, "Heat Template ID", vnfType, "OpenStack", "", MsoLogger.ErrorCode.DataError, "Create: No Heat Template ID defined in catalog database");
+                LOGGER.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, error);
+                alarmLogger.sendAlarm(MSO_CONFIGURATION_ERROR,
+                        MsoAlarmLogger.CRITICAL, error);
+                throw new VnfException(error, MsoExceptionCategory.INTERNAL);
+            } else {
+                heatTemplate = db.getHeatTemplateByArtifactUuidRegularQuery(heatTemplateArtifactUuid);
+            }
+            if (heatTemplate == null) {
+                String error = "Create VF/VNF: no entry found for heat template ID = " + heatTemplateArtifactUuid;
+                LOGGER.error(MessageEnum.RA_VNF_UNKNOWN_PARAM,
+                        "Heat Template ID",
+                        String.valueOf(heatTemplateArtifactUuid), "OpenStack", "", MsoLogger.ErrorCode.BusinessProcesssError, "Create VF/VNF: no entry found for heat template ID = " + heatTemplateArtifactUuid);
+                LOGGER.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, error);
+                alarmLogger.sendAlarm(MSO_CONFIGURATION_ERROR,
+                        MsoAlarmLogger.CRITICAL, error);
+                throw new VnfException(error, MsoExceptionCategory.INTERNAL);
+            }
+            LOGGER.debug("Got HEAT Template from DB");
 
             HeatEnvironment heatEnvironment = null;
             String heatEnvironmentString = null;
@@ -1030,13 +1039,13 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
                 heatEnvironment = db.getHeatEnvironmentByArtifactUuid(heatEnvironmentArtifactUuid);
                 if (heatEnvironment == null) {
                     String error = "Create VFModule: undefined Heat Environment. VFModule=" + vfModuleType
-                        + ", Environment ID="
-                        + heatEnvironmentArtifactUuid;
+                            + ", Environment ID="
+                            + heatEnvironmentArtifactUuid;
                     LOGGER.error(MessageEnum.RA_VNF_UNKNOWN_PARAM, "Heat Environment ID",
-                        String.valueOf(heatEnvironmentArtifactUuid), "OpenStack", "getHeatEnvironment",
-                        MsoLogger.ErrorCode.BusinessProcesssError, "Create VFModule: undefined Heat Environment");
+                            String.valueOf(heatEnvironmentArtifactUuid), "OpenStack", "getHeatEnvironment",
+                            MsoLogger.ErrorCode.BusinessProcesssError, "Create VFModule: undefined Heat Environment");
                     LOGGER.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound,
-                        error);
+                            error);
                     // Alarm on this error, configuration must be fixed
                     alarmLogger.sendAlarm(MSO_CONFIGURATION_ERROR, MsoAlarmLogger.CRITICAL, error);
 
@@ -1044,7 +1053,7 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
                 } else {
                     LOGGER.debug("Got Heat Environment from DB: " + heatEnvironment.toString());
                     heatEnvironmentString = heatEnvironment
-                        .getEnvironment(); //this.parseEnvironment (heatEnvironment.getEnvironment ());
+                            .getEnvironment(); //this.parseEnvironment (heatEnvironment.getEnvironment ());
                     LOGGER.debug("after parsing: " + heatEnvironmentString);
                 }
             } else {
@@ -1053,7 +1062,7 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
 
             // 1510 - Add the files: for nested templates *if* there are any
             LOGGER.debug("In MsoVnfAdapterImpl, createVfModule about to call db.getNestedTemplates avec templateId="
-                + heatTemplate.getArtifactUuid());
+                    + heatTemplate.getArtifactUuid());
             Map<String, Object> nestedTemplates = db.getNestedTemplates(heatTemplate.getArtifactUuid());
             Map<String, Object> nestedTemplatesChecked = new HashMap<>();
             if (nestedTemplates != null) {
@@ -1075,69 +1084,69 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
             // 1510 - Also add the files: for any get_files associated with this vnf_resource_id
             // *if* there are any
             Map<String, HeatFiles> heatFiles = null;
-                       Map<String, Object> heatFilesObjects = new HashMap<>();
+            Map<String, Object> heatFilesObjects = new HashMap<>();
 
             // Add ability to turn on adding get_files with volume requests (by property).
             boolean addGetFilesOnVolumeReq = false;
             try {
-               String propertyString = msoPropertiesFactory.getMsoJavaProperties(MSO_PROP_VNF_ADAPTER).getProperty(MsoVnfAdapterImpl.ADD_GET_FILES_ON_VOLUME_REQ, null);
-               if ("true".equalsIgnoreCase(propertyString) || "y".equalsIgnoreCase(propertyString)) {
-                       addGetFilesOnVolumeReq = true;
-                       LOGGER.debug("AddGetFilesOnVolumeReq - setting to true! " + propertyString);
-               }
+                String propertyString = msoPropertiesFactory.getMsoJavaProperties(MSO_PROP_VNF_ADAPTER).getProperty(MsoVnfAdapterImpl.ADD_GET_FILES_ON_VOLUME_REQ, null);
+                if ("true".equalsIgnoreCase(propertyString) || "y".equalsIgnoreCase(propertyString)) {
+                    addGetFilesOnVolumeReq = true;
+                    LOGGER.debug("AddGetFilesOnVolumeReq - setting to true! " + propertyString);
+                }
             } catch (Exception e) {
-               LOGGER.debug("An error occured trying to get property " + MsoVnfAdapterImpl.ADD_GET_FILES_ON_VOLUME_REQ + " - default to false", e);
-            }
-
-                       if (!isVolumeRequest || addGetFilesOnVolumeReq) {
-                               if (oldWay) {
-                                       LOGGER.debug("In MsoVnfAdapterImpl createVfModule, this should not happen - old way is gamma only - no heat files!");
-                                       //heatFiles = db.getHeatFiles(vnfResource.getId());
-                               } else {
-                                       // 1607 - now use VF_MODULE_TO_HEAT_FILES table
-                                       LOGGER.debug("In MsoVnfAdapterImpl createVfModule, about to call db.getHeatFilesForVfModule avec vfModuleId="
-                                                       + vf.getModelUUID());
-                                       heatFiles = db
-                                                       .getHeatFilesForVfModule(vf.getModelUUID());
-                               }
-                               if (heatFiles != null) {
-                                       // add these to stack - to be done in createStack
-                                       // here, we will map them to Map<String, Object> from
-                                       // Map<String, HeatFiles>
-                                       // this will match the nested templates format
-                                       LOGGER.debug("Contents of heatFiles - to be added to files: on stack:");
-
-                                       for (Map.Entry<String, HeatFiles> entry : heatFiles.entrySet()) {
-                                               String heatFileName = entry.getKey();
-                                               HeatFiles value = entry.getValue();
-                                               if (heatFileName.startsWith("_ERROR|")) {
-                                                       // This means there was an invalid entry in VF_MODULE_TO_HEAT_FILES table - the heat file it pointed to could not be found.
-                                                       String heatFileId = heatFileName.substring(heatFileName.lastIndexOf("|")+1);
-                                                       String error = "Create: No HEAT_FILES entry in catalog database for " + vfModuleType + " at HEAT_FILES index=" + heatFileId;
-                                                       LOGGER.debug(error);
-                                                       LOGGER.error (MessageEnum.RA_VNF_UNKNOWN_PARAM, "HEAT_FILES entry not found at " + heatFileId, vfModuleType, "OpenStack", "", MsoLogger.ErrorCode.BusinessProcesssError, "HEAT_FILES entry not found");
-                            LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, error);
-                                                       // Alarm on this error, configuration must be fixed
-                                                       alarmLogger.sendAlarm (MSO_CONFIGURATION_ERROR, MsoAlarmLogger.CRITICAL, error);
-                                                       throw new VnfException (error, MsoExceptionCategory.INTERNAL);
-                                               }
-                                               String heatFileBody = value.getFileBody();
-                                               String heatFileNameChecked = heatFileName;
-                                               LOGGER.debug(heatFileNameChecked + " -> "
-                                                               + heatFileBody);
-                                               heatFilesObjects.put(heatFileNameChecked, heatFileBody);
-                                       }
-                               } else {
-                                       LOGGER.debug("No heat files found -nothing to do here");
-                                       heatFilesObjects = null;
-                               }
-                       } else {
-                                       LOGGER.debug("Volume request - DO NOT CHECK for HEAT_FILES");
-                       }
+                LOGGER.debug("An error occured trying to get property " + MsoVnfAdapterImpl.ADD_GET_FILES_ON_VOLUME_REQ + " - default to false", e);
+            }
+
+            if (!isVolumeRequest || addGetFilesOnVolumeReq) {
+                if (oldWay) {
+                    LOGGER.debug("In MsoVnfAdapterImpl createVfModule, this should not happen - old way is gamma only - no heat files!");
+                    //heatFiles = db.getHeatFiles(vnfResource.getId());
+                } else {
+                    // 1607 - now use VF_MODULE_TO_HEAT_FILES table
+                    LOGGER.debug("In MsoVnfAdapterImpl createVfModule, about to call db.getHeatFilesForVfModule avec vfModuleId="
+                            + vf.getModelUUID());
+                    heatFiles = db
+                            .getHeatFilesForVfModule(vf.getModelUUID());
+                }
+                if (heatFiles != null) {
+                    // add these to stack - to be done in createStack
+                    // here, we will map them to Map<String, Object> from
+                    // Map<String, HeatFiles>
+                    // this will match the nested templates format
+                    LOGGER.debug("Contents of heatFiles - to be added to files: on stack:");
+
+                    for (Map.Entry<String, HeatFiles> entry : heatFiles.entrySet()) {
+                        String heatFileName = entry.getKey();
+                        HeatFiles value = entry.getValue();
+                        if (heatFileName.startsWith("_ERROR|")) {
+                            // This means there was an invalid entry in VF_MODULE_TO_HEAT_FILES table - the heat file it pointed to could not be found.
+                            String heatFileId = heatFileName.substring(heatFileName.lastIndexOf("|") + 1);
+                            String error = "Create: No HEAT_FILES entry in catalog database for " + vfModuleType + " at HEAT_FILES index=" + heatFileId;
+                            LOGGER.debug(error);
+                            LOGGER.error(MessageEnum.RA_VNF_UNKNOWN_PARAM, "HEAT_FILES entry not found at " + heatFileId, vfModuleType, "OpenStack", "", MsoLogger.ErrorCode.BusinessProcesssError, "HEAT_FILES entry not found");
+                            LOGGER.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, error);
+                            // Alarm on this error, configuration must be fixed
+                            alarmLogger.sendAlarm(MSO_CONFIGURATION_ERROR, MsoAlarmLogger.CRITICAL, error);
+                            throw new VnfException(error, MsoExceptionCategory.INTERNAL);
+                        }
+                        String heatFileBody = value.getFileBody();
+                        String heatFileNameChecked = heatFileName;
+                        LOGGER.debug(heatFileNameChecked + " -> "
+                                + heatFileBody);
+                        heatFilesObjects.put(heatFileNameChecked, heatFileBody);
+                    }
+                } else {
+                    LOGGER.debug("No heat files found -nothing to do here");
+                    heatFilesObjects = null;
+                }
+            } else {
+                LOGGER.debug("Volume request - DO NOT CHECK for HEAT_FILES");
+            }
 
             // Check that required parameters have been supplied
             StringBuilder missingParams = null;
-            List <String> paramList = new ArrayList <> ();
+            List<String> paramList = new ArrayList<>();
 
             // New for 1510 - consult the PARAM_ALIAS field to see if we've been
             // supplied an alias. Only check if we don't find it initially.
@@ -1147,11 +1156,11 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
             boolean checkRequiredParameters = true;
             try {
                 String propertyString = msoPropertiesFactory.getMsoJavaProperties(MSO_PROP_VNF_ADAPTER)
-                    .getProperty(MsoVnfAdapterImpl.CHECK_REQD_PARAMS, null);
+                        .getProperty(MsoVnfAdapterImpl.CHECK_REQD_PARAMS, null);
                 if ("false".equalsIgnoreCase(propertyString) || "n".equalsIgnoreCase(propertyString)) {
                     checkRequiredParameters = false;
                     LOGGER.debug("CheckRequiredParameters is FALSE. Will still check but then skip blocking..."
-                        + MsoVnfAdapterImpl.CHECK_REQD_PARAMS);
+                            + MsoVnfAdapterImpl.CHECK_REQD_PARAMS);
                 }
             } catch (Exception e) {
                 // No problem - default is true
@@ -1164,47 +1173,54 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
             MsoHeatEnvironmentEntry mhee = null;
             if (heatEnvironmentString != null && heatEnvironmentString.contains("parameters:")) {
                 //LOGGER.debug ("Have an Environment argument with a parameters: section - will bypass checking for valid params - but will still check for aliases");
-               LOGGER.debug("Enhanced environment checking enabled - 1604");
+                LOGGER.debug("Enhanced environment checking enabled - 1604");
                 StringBuilder sb = new StringBuilder(heatEnvironmentString);
                 //LOGGER.debug("About to create MHEE with " + sb);
                 mhee = new MsoHeatEnvironmentEntry(sb);
+
+                // sshank: hpaEnviromnentString is obtained from requestTypeString above.
+                if (hpaEnviromnentString != null && hpaEnviromnentString.contains("parameters:")) {
+                    StringBuilder hpasb = new StringBuilder(hpaEnviromnentString);
+                    mhee.setHPAParameters(hpasb);
+                }
+
                 StringBuilder sb2 = new StringBuilder("\nHeat Template Parameters:\n");
                 for (HeatTemplateParam parm : heatTemplate.getParameters()) {
-                       sb2.append("\t" + parm.getParamName() + ", required=" + parm.isRequired());
+                    sb2.append("\t" + parm.getParamName() + ", required=" + parm.isRequired());
                 }
                 if (!mhee.isValid()) {
-                       sb2.append("Environment says it's not valid! " + mhee.getErrorString());
+                    sb2.append("Environment says it's not valid! " + mhee.getErrorString());
                 } else {
-                       sb2.append("\nEnvironment:");
+                    sb2.append("\nEnvironment:");
                     sb2.append(mhee);
                 }
                 LOGGER.debug(sb2.toString());
             } else {
-               LOGGER.debug("NO ENVIRONMENT for this entry");
+                LOGGER.debug("NO ENVIRONMENT for this entry");
             }
             // New with 1707 - all variables converted to their native object types
             HashMap<String, Object> goldenInputs = null;
-            
+
             LOGGER.debug("Now handle the inputs....first convert");
             ArrayList<String> parameterNames = new ArrayList<>();
             HashMap<String, String> aliasToParam = new HashMap<>();
             StringBuilder sb = new StringBuilder("\nTemplate Parameters:\n");
             int cntr = 0;
-            try { 
-               for (HeatTemplateParam htp : heatTemplate.getParameters()) {
-                       sb.append("param[" + cntr++ + "]=" + htp.getParamName());
-                       parameterNames.add(htp.getParamName());
-                       if (htp.getParamAlias() != null && !"".equals(htp.getParamAlias())) {
-                               aliasToParam.put(htp.getParamAlias(), htp.getParamName());
-                               sb.append(" ** (alias=" + htp.getParamAlias() + ")");
-                       }
-                       sb.append("\n");
-               }
-               LOGGER.debug(sb.toString());
+            try {
+                for (HeatTemplateParam htp : heatTemplate.getParameters()) {
+                    sb.append("param[" + cntr++ + "]=" + htp.getParamName());
+                    parameterNames.add(htp.getParamName());
+                    if (htp.getParamAlias() != null && !"".equals(htp.getParamAlias())) {
+                        aliasToParam.put(htp.getParamAlias(), htp.getParamName());
+                        sb.append(" ** (alias=" + htp.getParamAlias() + ")");
+                    }
+                    sb.append("\n");
+                }
+                LOGGER.debug(sb.toString());
             } catch (Exception e) {
-               LOGGER.debug("??An exception occurred trying to go through Parameter Names " + e.getMessage(),e);
+                LOGGER.debug("??An exception occurred trying to go through Parameter Names " + e.getMessage(), e);
             }
-            // Step 1 - convert what we got as inputs (Map<String, String>) to a 
+            // Step 1 - convert what we got as inputs (Map<String, String>) to a
             // Map<String, Object> - where the object matches the param type identified in the template
             // This will also not copy over params that aren't identified in the template
             goldenInputs = heat.convertInputMap(inputs, heatTemplate);
@@ -1218,18 +1234,18 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
 
             for (HeatTemplateParam parm : heatTemplate.getParameters()) {
                 LOGGER.debug("Parameter:'" + parm.getParamName()
-                    + "', isRequired="
-                    + parm.isRequired()
-                    + ", alias="
-                    + parm.getParamAlias());
+                        + "', isRequired="
+                        + parm.isRequired()
+                        + ", alias="
+                        + parm.getParamAlias());
 
                 if (parm.isRequired() && (goldenInputs == null || !goldenInputs.containsKey(parm.getParamName()))) {
                     // The check for an alias was moved to the method in MsoHeatUtils - when we converted the Map<String, String> to Map<String, Object>
                     LOGGER.debug("**Parameter " + parm.getParamName()
-                        + " is required and not in the inputs...check environment");
+                            + " is required and not in the inputs...check environment");
                     if (mhee != null && mhee.containsParameter(parm.getParamName())) {
                         LOGGER.debug("Required parameter " + parm.getParamName()
-                            + " appears to be in environment - do not count as missing");
+                                + " appears to be in environment - do not count as missing");
                     } else {
                         LOGGER.debug("adding to missing parameters list: " + parm.getParamName());
                         if (missingParams == null) {
@@ -1246,9 +1262,9 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
                     // Problem - missing one or more required parameters
                     String error = "Create VFModule: Missing Required inputs: " + missingParams;
                     LOGGER.error(MessageEnum.RA_MISSING_PARAM, missingParams.toString(), "OpenStack", "",
-                        MsoLogger.ErrorCode.DataError, "Create VFModule: Missing Required inputs");
+                            MsoLogger.ErrorCode.DataError, "Create VFModule: Missing Required inputs");
                     LOGGER.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.BadRequest,
-                        error);
+                            error);
                     throw new VnfException(error, MsoExceptionCategory.USERDATA);
                 } else {
                     LOGGER.debug("found missing parameters - but checkRequiredParameters is false - will not block");
@@ -1256,13 +1272,13 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
             } else {
                 LOGGER.debug("No missing parameters found - ok to proceed");
             }
-            // We can now remove the recreating of the ENV with only legit params - that check is done for us, 
+            // We can now remove the recreating of the ENV with only legit params - that check is done for us,
             // and it causes problems with json that has arrays
             String newEnvironmentString = null;
             if (mhee != null) {
                 newEnvironmentString = mhee.getRawEntry().toString();
             }
-            
+
             // "Fix" the template if it has CR/LF (getting this from Oracle)
             String template = heatTemplate.getHeatTemplate();
             template = template.replaceAll("\r\n", "\n");
@@ -1281,50 +1297,50 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
                     LOGGER.debug("heat is not null!!");
                 }
                 heatStack = heat.createStack(cloudSiteId,
-                    tenantId,
-                    vfModuleName,
-                    template,
-                    goldenInputs,
-                    true,
-                    heatTemplate.getTimeoutMinutes(),
-                    newEnvironmentString,
-                    nestedTemplatesChecked,
-                    heatFilesObjects,
-                    backout.booleanValue());
+                        tenantId,
+                        vfModuleName,
+                        template,
+                        goldenInputs,
+                        true,
+                        heatTemplate.getTimeoutMinutes(),
+                        newEnvironmentString,
+                        nestedTemplatesChecked,
+                        heatFilesObjects,
+                        backout.booleanValue());
                 LOGGER
-                    .recordMetricEvent(createStackStarttime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc,
-                        "Successfully received response from Open Stack", "OpenStack", "CreateStack", vfModuleName);
+                        .recordMetricEvent(createStackStarttime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc,
+                                "Successfully received response from Open Stack", "OpenStack", "CreateStack", vfModuleName);
             } catch (MsoException me) {
                 me.addContext("CreateVFModule");
                 String error = "Create VF Module " + vfModuleType + " in " + cloudSiteId + "/" + tenantId + ": " + me;
                 LOGGER.recordMetricEvent(createStackStarttime, MsoLogger.StatusCode.ERROR,
-                    MsoLogger.ResponseCode.CommunicationError, error, "OpenStack", "CreateStack", vfModuleName);
+                        MsoLogger.ResponseCode.CommunicationError, error, "OpenStack", "CreateStack", vfModuleName);
                 LOGGER.error(MessageEnum.RA_CREATE_VNF_ERR, vfModuleType, cloudSiteId, tenantId, "OpenStack", "",
-                    MsoLogger.ErrorCode.DataError, "MsoException - createStack", me);
+                        MsoLogger.ErrorCode.DataError, "MsoException - createStack", me);
                 LOGGER
-                    .recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError,
-                        error);
+                        .recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError,
+                                error);
                 throw new VnfException(me);
             } catch (NullPointerException npe) {
                 String error = "Create VFModule " + vfModuleType + " in " + cloudSiteId + "/" + tenantId + ": " + npe;
                 LOGGER.recordMetricEvent(createStackStarttime, MsoLogger.StatusCode.ERROR,
-                    MsoLogger.ResponseCode.CommunicationError, error, "OpenStack", "CreateStack", vfModuleName);
+                        MsoLogger.ResponseCode.CommunicationError, error, "OpenStack", "CreateStack", vfModuleName);
                 LOGGER.error(MessageEnum.RA_CREATE_VNF_ERR, vfModuleType, cloudSiteId, tenantId, "OpenStack", "",
-                    MsoLogger.ErrorCode.DataError, "NullPointerException - createStack", npe);
+                        MsoLogger.ErrorCode.DataError, "NullPointerException - createStack", npe);
                 LOGGER
-                    .recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError,
-                        error);
+                        .recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError,
+                                error);
                 LOGGER.debug("NULL POINTER EXCEPTION at heat.createStack");
                 //npe.addContext ("CreateVNF");
                 throw new VnfException("NullPointerException during heat.createStack");
             } catch (Exception e) {
                 LOGGER.recordMetricEvent(createStackStarttime, MsoLogger.StatusCode.ERROR,
-                    MsoLogger.ResponseCode.CommunicationError, "Exception while creating stack with OpenStack",
-                    "OpenStack", "CreateStack", vfModuleName);
+                        MsoLogger.ResponseCode.CommunicationError, "Exception while creating stack with OpenStack",
+                        "OpenStack", "CreateStack", vfModuleName);
                 LOGGER.debug("unhandled exception at heat.createStack", e);
                 LOGGER
-                    .recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError,
-                        "Exception while creating stack with OpenStack");
+                        .recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError,
+                                "Exception while creating stack with OpenStack");
                 throw new VnfException("Exception during heat.createStack! " + e.getMessage());
             }
         } catch (Exception e) {
@@ -1336,30 +1352,30 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
 
         // Reach this point if createStack is successful.
         // Populate remaining rollback info and response parameters.
-        vfRollback.setVnfId (heatStack.getCanonicalName ());
-        vfRollback.setVnfCreated (true);
+        vfRollback.setVnfId(heatStack.getCanonicalName());
+        vfRollback.setVnfCreated(true);
 
-        vnfId.value = heatStack.getCanonicalName ();
-        outputs.value = copyStringOutputs (heatStack.getOutputs ());
+        vnfId.value = heatStack.getCanonicalName();
+        outputs.value = copyStringOutputs(heatStack.getOutputs());
         rollback.value = vfRollback;
 
-        LOGGER.debug ("VF Module " + vfModuleName + " successfully created");
-        LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully create VF Module");
+        LOGGER.debug("VF Module " + vfModuleName + " successfully created");
+        LOGGER.recordAuditEvent(startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully create VF Module");
     }
 
     @Override
-    public void deleteVfModule (String cloudSiteId,
-                           String tenantId,
-                           String vnfName,
-                           MsoRequest msoRequest,
-                           Holder <Map <String, String>> outputs) throws VnfException {
-        MsoLogger.setLogContext (msoRequest);
-       MsoLogger.setServiceName ("DeleteVf");
-        LOGGER.debug ("Deleting VF " + vnfName + " in " + cloudSiteId + "/" + tenantId);
+    public void deleteVfModule(String cloudSiteId,
+                               String tenantId,
+                               String vnfName,
+                               MsoRequest msoRequest,
+                               Holder<Map<String, String>> outputs) throws VnfException {
+        MsoLogger.setLogContext(msoRequest);
+        MsoLogger.setServiceName("DeleteVf");
+        LOGGER.debug("Deleting VF " + vnfName + " in " + cloudSiteId + "/" + tenantId);
         // Will capture execution time for metrics
-        long startTime = System.currentTimeMillis ();
+        long startTime = System.currentTimeMillis();
 
-        MsoHeatUtils heat = new MsoHeatUtils (MSO_PROP_VNF_ADAPTER, msoPropertiesFactory,cloudConfigFactory);
+        MsoHeatUtils heat = new MsoHeatUtils(MSO_PROP_VNF_ADAPTER, msoPropertiesFactory, cloudConfigFactory);
 
         // 1702 capture the output parameters on a delete
         // so we'll need to query first
@@ -1369,12 +1385,12 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
         } catch (MsoException me) {
             // Failed to query the Stack due to an openstack exception.
             // Convert to a generic VnfException
-            me.addContext ("DeleteVFModule");
+            me.addContext("DeleteVFModule");
             String error = "Delete VFModule: Query to get outputs: " + vnfName + " in " + cloudSiteId + "/" + tenantId + ": " + me;
-            LOGGER.recordMetricEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error, "OpenStack", "QueryStack", null);
-            LOGGER.error (MessageEnum.RA_QUERY_VNF_ERR, vnfName, cloudSiteId, tenantId, "OpenStack", "QueryStack", MsoLogger.ErrorCode.DataError, "Exception - QueryStack", me);
-            LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error);
-            throw new VnfException (me);
+            LOGGER.recordMetricEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error, "OpenStack", "QueryStack", null);
+            LOGGER.error(MessageEnum.RA_QUERY_VNF_ERR, vnfName, cloudSiteId, tenantId, "OpenStack", "QueryStack", MsoLogger.ErrorCode.DataError, "Exception - QueryStack", me);
+            LOGGER.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error);
+            throw new VnfException(me);
         }
         // call method which handles the conversion from Map<String,Object> to Map<String,String> for our expected Object types
         outputs.value = this.convertMapStringObjectToStringString(stackOutputs);
@@ -1383,57 +1399,57 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
         // The possible outcomes of deleteStack are a StackInfo object with status
         // of NOTFOUND (on success) or FAILED (on error). Also, MsoOpenstackException
         // could be thrown.
-        long subStartTime = System.currentTimeMillis ();
+        long subStartTime = System.currentTimeMillis();
         try {
-            heat.deleteStack (tenantId, cloudSiteId, vnfName, true);
-            LOGGER.recordMetricEvent (subStartTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully received response from Open Stack", "OpenStack", "DeleteStack", vnfName);
+            heat.deleteStack(tenantId, cloudSiteId, vnfName, true);
+            LOGGER.recordMetricEvent(subStartTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully received response from Open Stack", "OpenStack", "DeleteStack", vnfName);
         } catch (MsoException me) {
-            me.addContext ("DeleteVNF");
+            me.addContext("DeleteVNF");
             // Failed to query the Stack due to an openstack exception.
             // Convert to a generic VnfException
             String error = "Delete VF: " + vnfName + " in " + cloudSiteId + "/" + tenantId + ": " + me;
-            LOGGER.recordMetricEvent (subStartTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error, "OpenStack", "DeleteStack", vnfName);
-            LOGGER.error (MessageEnum.RA_DELETE_VNF_ERR, vnfName, cloudSiteId, tenantId, "OpenStack", "DeleteStack", MsoLogger.ErrorCode.DataError, "Exception - deleteStack", me);
-            LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error);
-            throw new VnfException (me);
+            LOGGER.recordMetricEvent(subStartTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error, "OpenStack", "DeleteStack", vnfName);
+            LOGGER.error(MessageEnum.RA_DELETE_VNF_ERR, vnfName, cloudSiteId, tenantId, "OpenStack", "DeleteStack", MsoLogger.ErrorCode.DataError, "Exception - deleteStack", me);
+            LOGGER.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error);
+            throw new VnfException(me);
         }
 
         // On success, nothing is returned.
-        LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully delete VF");
+        LOGGER.recordAuditEvent(startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully delete VF");
     }
 
     @Override
-    public void updateVfModule (String cloudSiteId,
-                           String tenantId,
-                           String vnfType,
-                           String vnfVersion,
-                           String vnfName,
-                           String requestType,
-                           String volumeGroupHeatStackId,
-                           String baseVfHeatStackId,
-                           String vfModuleStackId,
-                           String modelCustomizationUuid,
-                           Map <String, String> inputs,
-                           MsoRequest msoRequest,
-                           Holder <Map <String, String>> outputs,
-                           Holder <VnfRollback> rollback) throws VnfException {
+    public void updateVfModule(String cloudSiteId,
+                               String tenantId,
+                               String vnfType,
+                               String vnfVersion,
+                               String vnfName,
+                               String requestType,
+                               String volumeGroupHeatStackId,
+                               String baseVfHeatStackId,
+                               String vfModuleStackId,
+                               String modelCustomizationUuid,
+                               Map<String, String> inputs,
+                               MsoRequest msoRequest,
+                               Holder<Map<String, String>> outputs,
+                               Holder<VnfRollback> rollback) throws VnfException {
         String vfModuleName = vnfName;
         String vfModuleType = vnfType;
         String methodName = "updateVfModule";
-        MsoLogger.setLogContext (msoRequest.getRequestId (), msoRequest.getServiceInstanceId ());
+        MsoLogger.setLogContext(msoRequest.getRequestId(), msoRequest.getServiceInstanceId());
         String serviceName = VNF_ADAPTER_SERVICE_NAME + methodName;
-        MsoLogger.setServiceName (serviceName);
+        MsoLogger.setServiceName(serviceName);
 
         String strInit = "updateVfModule: cloudSiteId=" + cloudSiteId +
-            ",tenantId=" + tenantId +
-            ",vnfType=" + vnfType +
-            ",vnfVersion=" + vnfVersion +
-            ",vnfName=" + vnfName +
-            ",requestType=" + requestType +
-            ",volumeGroupHeatStackId=" + volumeGroupHeatStackId +
-            ",baseVfHeatStackId=" + baseVfHeatStackId +
-            ",vfModuleStackId=" + vfModuleStackId +
-            ",modelCustomizationUuid=" + modelCustomizationUuid;
+                ",tenantId=" + tenantId +
+                ",vnfType=" + vnfType +
+                ",vnfVersion=" + vnfVersion +
+                ",vnfName=" + vnfName +
+                ",requestType=" + requestType +
+                ",volumeGroupHeatStackId=" + volumeGroupHeatStackId +
+                ",baseVfHeatStackId=" + baseVfHeatStackId +
+                ",vfModuleStackId=" + vfModuleStackId +
+                ",modelCustomizationUuid=" + modelCustomizationUuid;
         LOGGER.debug(strInit);
 
         String mcu = modelCustomizationUuid;
@@ -1449,52 +1465,52 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
             }
         }
 
-       String requestTypeString = "";
+        String requestTypeString = "";
         if (requestType != null && !"".equals(requestType)) {
-               requestTypeString = requestType;
+            requestTypeString = requestType;
         }
         String nestedStackId = null;
         if (volumeGroupHeatStackId != null && !"".equals(volumeGroupHeatStackId)) {
-               if (!"null".equalsIgnoreCase(volumeGroupHeatStackId)) {
-                       nestedStackId = volumeGroupHeatStackId;
-               }
+            if (!"null".equalsIgnoreCase(volumeGroupHeatStackId)) {
+                nestedStackId = volumeGroupHeatStackId;
+            }
         }
         String nestedBaseStackId = null;
         if (baseVfHeatStackId != null && !"".equals(baseVfHeatStackId)) {
-               if (!"null".equalsIgnoreCase(baseVfHeatStackId)) {
-                       nestedBaseStackId = baseVfHeatStackId;
-               }
+            if (!"null".equalsIgnoreCase(baseVfHeatStackId)) {
+                nestedBaseStackId = baseVfHeatStackId;
+            }
         }
 
         if (inputs == null) {
-               // Create an empty set of inputs
-               inputs = new HashMap<>();
-               LOGGER.debug("inputs == null - setting to empty");
+            // Create an empty set of inputs
+            inputs = new HashMap<>();
+            LOGGER.debug("inputs == null - setting to empty");
         } else {
-               this.sendMapToDebug(inputs);
+            this.sendMapToDebug(inputs);
         }
         boolean isBaseRequest = false;
         boolean isVolumeRequest = false;
         if (requestTypeString.startsWith("VOLUME")) {
-               isVolumeRequest = true;
+            isVolumeRequest = true;
         }
         if (vfModuleName == null || "".equals(vfModuleName.trim())) {
-               if (vfModuleStackId != null) {
-                       vfModuleName = this.getVfModuleNameFromModuleStackId(vfModuleStackId);
-               }
+            if (vfModuleStackId != null) {
+                vfModuleName = this.getVfModuleNameFromModuleStackId(vfModuleStackId);
+            }
         }
 
-        LOGGER.debug ("Updating VFModule: " + vfModuleName + " of type " + vfModuleType + "in " + cloudSiteId + "/" + tenantId);
+        LOGGER.debug("Updating VFModule: " + vfModuleName + " of type " + vfModuleType + "in " + cloudSiteId + "/" + tenantId);
         LOGGER.debug("requestTypeString = " + requestTypeString + ", nestedVolumeStackId = " + nestedStackId + ", nestedBaseStackId = " + nestedBaseStackId);
 
         // Will capture execution time for metrics
-        long startTime = System.currentTimeMillis ();
+        long startTime = System.currentTimeMillis();
 
         // Build a default rollback object (no actions performed)
-        VnfRollback vfRollback = new VnfRollback ();
-        vfRollback.setCloudSiteId (cloudSiteId);
-        vfRollback.setTenantId (tenantId);
-        vfRollback.setMsoRequest (msoRequest);
+        VnfRollback vfRollback = new VnfRollback();
+        vfRollback.setCloudSiteId(cloudSiteId);
+        vfRollback.setTenantId(tenantId);
+        vfRollback.setMsoRequest(msoRequest);
         vfRollback.setRequestType(requestTypeString);
         vfRollback.setVolumeGroupHeatStackId(volumeGroupHeatStackId);
         vfRollback.setBaseGroupHeatStackId(baseVfHeatStackId);
@@ -1503,113 +1519,113 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
         vfRollback.setModelCustomizationUuid(mcu);
 
         // First, look up to see if the VNF already exists.
-        MsoHeatUtils heat = new MsoHeatUtils (MSO_PROP_VNF_ADAPTER, msoPropertiesFactory,cloudConfigFactory);
-        MsoHeatUtilsWithUpdate heatU = new MsoHeatUtilsWithUpdate (MSO_PROP_VNF_ADAPTER, msoPropertiesFactory,cloudConfigFactory);
+        MsoHeatUtils heat = new MsoHeatUtils(MSO_PROP_VNF_ADAPTER, msoPropertiesFactory, cloudConfigFactory);
+        MsoHeatUtilsWithUpdate heatU = new MsoHeatUtilsWithUpdate(MSO_PROP_VNF_ADAPTER, msoPropertiesFactory, cloudConfigFactory);
 
         StackInfo heatStack = null;
-        long queryStackStarttime = System.currentTimeMillis ();
+        long queryStackStarttime = System.currentTimeMillis();
         LOGGER.debug("UpdateVfModule - querying for " + vfModuleName);
         try {
-            heatStack = heat.queryStack (cloudSiteId, tenantId, vfModuleName);
-            LOGGER.recordMetricEvent (queryStackStarttime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully receive response from Open Stack", "OpenStack", "QueryStack", null);
+            heatStack = heat.queryStack(cloudSiteId, tenantId, vfModuleName);
+            LOGGER.recordMetricEvent(queryStackStarttime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully receive response from Open Stack", "OpenStack", "QueryStack", null);
         } catch (MsoException me) {
             // Failed to query the Stack due to an openstack exception.
             // Convert to a generic VnfException
-            me.addContext ("UpdateVFModule");
+            me.addContext("UpdateVFModule");
             String error = "Update VFModule: Query " + vfModuleName + " in " + cloudSiteId + "/" + tenantId + ": " + me;
-            LOGGER.recordMetricEvent (queryStackStarttime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error, "OpenStack", "QueryStack", null);
-            LOGGER.error (MessageEnum.RA_QUERY_VNF_ERR, vfModuleName, cloudSiteId, tenantId, "OpenStack", "QueryStack", MsoLogger.ErrorCode.DataError, "Exception - QueryStack", me);
-            LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error);
-            throw new VnfException (me);
+            LOGGER.recordMetricEvent(queryStackStarttime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error, "OpenStack", "QueryStack", null);
+            LOGGER.error(MessageEnum.RA_QUERY_VNF_ERR, vfModuleName, cloudSiteId, tenantId, "OpenStack", "QueryStack", MsoLogger.ErrorCode.DataError, "Exception - QueryStack", me);
+            LOGGER.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error);
+            throw new VnfException(me);
         }
 
         //TODO - do we need to check for the other status possibilities?
-        if (heatStack == null || heatStack.getStatus () == HeatStatus.NOTFOUND) {
+        if (heatStack == null || heatStack.getStatus() == HeatStatus.NOTFOUND) {
             // Not Found
             String error = "Update VF: Stack " + vfModuleName + " does not exist in " + cloudSiteId + "/" + tenantId;
-            LOGGER.error (MessageEnum.RA_VNF_NOT_EXIST, vfModuleName, cloudSiteId, tenantId, "OpenStack", "QueryStack", MsoLogger.ErrorCode.DataError, error);
-            LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, error);
-            throw new VnfNotFound (cloudSiteId, tenantId, vfModuleName);
+            LOGGER.error(MessageEnum.RA_VNF_NOT_EXIST, vfModuleName, cloudSiteId, tenantId, "OpenStack", "QueryStack", MsoLogger.ErrorCode.DataError, error);
+            LOGGER.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, error);
+            throw new VnfNotFound(cloudSiteId, tenantId, vfModuleName);
         } else {
-            LOGGER.debug ("Found Existing stack, status=" + heatStack.getStatus ());
+            LOGGER.debug("Found Existing stack, status=" + heatStack.getStatus());
             // Populate the outputs from the existing stack.
-            outputs.value = copyStringOutputs (heatStack.getOutputs ());
+            outputs.value = copyStringOutputs(heatStack.getOutputs());
             rollback.value = vfRollback; // Default rollback - no updates performed
         }
 
         // 1604 Cinder Volume support - handle a nestedStackId if sent (volumeGroupHeatStackId):
         StackInfo nestedHeatStack = null;
-        long queryStackStarttime2 = System.currentTimeMillis ();
+        long queryStackStarttime2 = System.currentTimeMillis();
         Map<String, Object> nestedVolumeOutputs = null;
         if (nestedStackId != null) {
-               try {
-                       LOGGER.debug("Querying for nestedStackId = " + nestedStackId);
-                       nestedHeatStack = heat.queryStack(cloudSiteId, tenantId, nestedStackId);
-                LOGGER.recordMetricEvent (queryStackStarttime2, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully receive response from Open Stack", "OpenStack", "QueryStack", null);
-               } catch (MsoException me) {
-                   // Failed to query the Stack due to an openstack exception.
-                   // Convert to a generic VnfException
-                   me.addContext ("UpdateVFModule");
-                   String error = "Update VF: Attached heatStack ID Query " + nestedStackId + " in " + cloudSiteId + "/" + tenantId + ": " + me ;
-                LOGGER.recordMetricEvent (queryStackStarttime2, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error, "OpenStack", "QueryStack", null);
-                   LOGGER.error (MessageEnum.RA_QUERY_VNF_ERR, vnfName, cloudSiteId, tenantId, "OpenStack", "QueryStack", MsoLogger.ErrorCode.DataError, "Exception - " + error, me);
-                       LOGGER.debug("ERROR trying to query nested stack= " + error);
-                LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error);
-                   throw new VnfException (me);
-               }
-               if (nestedHeatStack == null || nestedHeatStack.getStatus() == HeatStatus.NOTFOUND) {
-                       MsoLogger.setServiceName (serviceName);
-                   String error = "Update VFModule: Attached volume heatStack ID DOES NOT EXIST " + nestedStackId + " in " + cloudSiteId + "/" + tenantId + " USER ERROR"  ;
-                   LOGGER.error (MessageEnum.RA_QUERY_VNF_ERR, vnfName, cloudSiteId, tenantId, error, "OpenStack", "QueryStack", MsoLogger.ErrorCode.DataError, error);
-                   LOGGER.debug(error);
-                LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, error);
-                   throw new VnfException (error, MsoExceptionCategory.USERDATA);
-               } else {
-                       LOGGER.debug("Found nested heat stack - copying values to inputs *later*");
-                       nestedVolumeOutputs = nestedHeatStack.getOutputs();
-                       //this.sendMapToDebug(inputs);
-                       this.sendMapToDebug(nestedVolumeOutputs, "volumeStackOutputs");
-                       //TODO
-                       heat.copyStringOutputsToInputs(inputs, nestedHeatStack.getOutputs(), false);
-                       //this.sendMapToDebug(inputs);
-               }
+            try {
+                LOGGER.debug("Querying for nestedStackId = " + nestedStackId);
+                nestedHeatStack = heat.queryStack(cloudSiteId, tenantId, nestedStackId);
+                LOGGER.recordMetricEvent(queryStackStarttime2, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully receive response from Open Stack", "OpenStack", "QueryStack", null);
+            } catch (MsoException me) {
+                // Failed to query the Stack due to an openstack exception.
+                // Convert to a generic VnfException
+                me.addContext("UpdateVFModule");
+                String error = "Update VF: Attached heatStack ID Query " + nestedStackId + " in " + cloudSiteId + "/" + tenantId + ": " + me;
+                LOGGER.recordMetricEvent(queryStackStarttime2, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error, "OpenStack", "QueryStack", null);
+                LOGGER.error(MessageEnum.RA_QUERY_VNF_ERR, vnfName, cloudSiteId, tenantId, "OpenStack", "QueryStack", MsoLogger.ErrorCode.DataError, "Exception - " + error, me);
+                LOGGER.debug("ERROR trying to query nested stack= " + error);
+                LOGGER.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error);
+                throw new VnfException(me);
+            }
+            if (nestedHeatStack == null || nestedHeatStack.getStatus() == HeatStatus.NOTFOUND) {
+                MsoLogger.setServiceName(serviceName);
+                String error = "Update VFModule: Attached volume heatStack ID DOES NOT EXIST " + nestedStackId + " in " + cloudSiteId + "/" + tenantId + " USER ERROR";
+                LOGGER.error(MessageEnum.RA_QUERY_VNF_ERR, vnfName, cloudSiteId, tenantId, error, "OpenStack", "QueryStack", MsoLogger.ErrorCode.DataError, error);
+                LOGGER.debug(error);
+                LOGGER.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, error);
+                throw new VnfException(error, MsoExceptionCategory.USERDATA);
+            } else {
+                LOGGER.debug("Found nested heat stack - copying values to inputs *later*");
+                nestedVolumeOutputs = nestedHeatStack.getOutputs();
+                //this.sendMapToDebug(inputs);
+                this.sendMapToDebug(nestedVolumeOutputs, "volumeStackOutputs");
+                //TODO
+                heat.copyStringOutputsToInputs(inputs, nestedHeatStack.getOutputs(), false);
+                //this.sendMapToDebug(inputs);
+            }
         }
         // handle a nestedBaseStackId if sent - this is the stack ID of the base.
         StackInfo nestedBaseHeatStack = null;
         Map<String, Object> baseStackOutputs = null;
         if (nestedBaseStackId != null) {
-            long queryStackStarttime3 = System.currentTimeMillis ();
-               try {
-                       LOGGER.debug("Querying for nestedBaseStackId = " + nestedBaseStackId);
-                       nestedBaseHeatStack = heat.queryStack(cloudSiteId, tenantId, nestedBaseStackId);
-                LOGGER.recordMetricEvent (queryStackStarttime3, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully receive response from Open Stack", "OpenStack", "QueryStack", null);
-               } catch (MsoException me) {
-                   // Failed to query the Stack due to an openstack exception.
-                   // Convert to a generic VnfException
-                   me.addContext ("UpdateVfModule");
-                   String error = "Update VFModule: Attached baseHeatStack ID Query " + nestedBaseStackId + " in " + cloudSiteId + "/" + tenantId + ": " + me ;
-                LOGGER.recordMetricEvent (queryStackStarttime3, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error, "OpenStack", "QueryStack", null);
-                   LOGGER.error (MessageEnum.RA_QUERY_VNF_ERR, vfModuleName, cloudSiteId, tenantId, "OpenStack", "QueryStack", MsoLogger.ErrorCode.DataError, "Exception - " + error, me);
-                       LOGGER.debug("ERROR trying to query nested base stack= " + error);
-                LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error);
-                   throw new VnfException (me);
-               }
-               if (nestedBaseHeatStack == null || nestedBaseHeatStack.getStatus() == HeatStatus.NOTFOUND) {
-                       MsoLogger.setServiceName (serviceName);
-                   String error = "Update VFModule: Attached base heatStack ID DOES NOT EXIST " + nestedBaseStackId + " in " + cloudSiteId + "/" + tenantId + " USER ERROR"  ;
-                   LOGGER.error (MessageEnum.RA_QUERY_VNF_ERR, vfModuleName, cloudSiteId, tenantId, error, "OpenStack", "QueryStack", MsoLogger.ErrorCode.DataError, error);
-                LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, error);
-                   LOGGER.debug(error);
-                   throw new VnfException (error, MsoExceptionCategory.USERDATA);
-               } else {
-                       LOGGER.debug("Found nested base heat stack - copying values to inputs *later*");
-                       baseStackOutputs = nestedBaseHeatStack.getOutputs();
-                       //this.sendMapToDebug(inputs);
-                       this.sendMapToDebug(baseStackOutputs, "baseStackOutputs");
-                       //TODO
-                       heat.copyStringOutputsToInputs(inputs, nestedBaseHeatStack.getOutputs(), false);
-                       //this.sendMapToDebug(inputs);
-               }
+            long queryStackStarttime3 = System.currentTimeMillis();
+            try {
+                LOGGER.debug("Querying for nestedBaseStackId = " + nestedBaseStackId);
+                nestedBaseHeatStack = heat.queryStack(cloudSiteId, tenantId, nestedBaseStackId);
+                LOGGER.recordMetricEvent(queryStackStarttime3, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully receive response from Open Stack", "OpenStack", "QueryStack", null);
+            } catch (MsoException me) {
+                // Failed to query the Stack due to an openstack exception.
+                // Convert to a generic VnfException
+                me.addContext("UpdateVfModule");
+                String error = "Update VFModule: Attached baseHeatStack ID Query " + nestedBaseStackId + " in " + cloudSiteId + "/" + tenantId + ": " + me;
+                LOGGER.recordMetricEvent(queryStackStarttime3, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error, "OpenStack", "QueryStack", null);
+                LOGGER.error(MessageEnum.RA_QUERY_VNF_ERR, vfModuleName, cloudSiteId, tenantId, "OpenStack", "QueryStack", MsoLogger.ErrorCode.DataError, "Exception - " + error, me);
+                LOGGER.debug("ERROR trying to query nested base stack= " + error);
+                LOGGER.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error);
+                throw new VnfException(me);
+            }
+            if (nestedBaseHeatStack == null || nestedBaseHeatStack.getStatus() == HeatStatus.NOTFOUND) {
+                MsoLogger.setServiceName(serviceName);
+                String error = "Update VFModule: Attached base heatStack ID DOES NOT EXIST " + nestedBaseStackId + " in " + cloudSiteId + "/" + tenantId + " USER ERROR";
+                LOGGER.error(MessageEnum.RA_QUERY_VNF_ERR, vfModuleName, cloudSiteId, tenantId, error, "OpenStack", "QueryStack", MsoLogger.ErrorCode.DataError, error);
+                LOGGER.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, error);
+                LOGGER.debug(error);
+                throw new VnfException(error, MsoExceptionCategory.USERDATA);
+            } else {
+                LOGGER.debug("Found nested base heat stack - copying values to inputs *later*");
+                baseStackOutputs = nestedBaseHeatStack.getOutputs();
+                //this.sendMapToDebug(inputs);
+                this.sendMapToDebug(baseStackOutputs, "baseStackOutputs");
+                //TODO
+                heat.copyStringOutputsToInputs(inputs, nestedBaseHeatStack.getOutputs(), false);
+                //this.sendMapToDebug(inputs);
+            }
         }
 
         // Ready to deploy the new VNF
@@ -1620,36 +1636,36 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
         try (CatalogDatabase db = CatalogDatabase.getInstance()) {
             // Retrieve the VF definition
             VnfResource vnfResource = null;
-               VfModule vf = null;
-               VfModuleCustomization vfmc = null;
+            VfModule vf = null;
+            VfModuleCustomization vfmc = null;
             if (useMCUuid) {
-                       //vf = db.getVfModuleByModelCustomizationUuid(mcu);
-                       vfmc = db.getVfModuleCustomizationByModelCustomizationId(mcu);
-                       vf = vfmc != null ? vfmc.getVfModule() : null;
+                //vf = db.getVfModuleByModelCustomizationUuid(mcu);
+                vfmc = db.getVfModuleCustomizationByModelCustomizationId(mcu);
+                vf = vfmc != null ? vfmc.getVfModule() : null;
                 if (vf == null) {
                     LOGGER.debug("Unable to find a vfModule matching modelCustomizationUuid=" + mcu);
                 }
-               } else {
-                       LOGGER.debug("1707 and later - MUST PROVIDE Model Customization UUID!");
+            } else {
+                LOGGER.debug("1707 and later - MUST PROVIDE Model Customization UUID!");
             }
             if (vf == null) {
                 String error = "Update VfModule: unable to find vfModule with modelCustomizationUuid=" + mcu;
                 LOGGER.error(MessageEnum.RA_VNF_UNKNOWN_PARAM, "VF Module Type", vfModuleType, "OpenStack", "",
-                    MsoLogger.ErrorCode.DataError, error);
+                        MsoLogger.ErrorCode.DataError, error);
                 LOGGER.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataError, error);
                 throw new VnfException(error, MsoExceptionCategory.USERDATA);
             }
             LOGGER.debug("Got VF module definition from Catalog: " + vf.toString());
             if (vf.isBase()) {
-               isBaseRequest = true;
-               LOGGER.debug("This a BASE update request");
+                isBaseRequest = true;
+                LOGGER.debug("This a BASE update request");
             } else {
                 LOGGER.debug("This is *not* a BASE VF update request");
                 if (!isVolumeRequest && nestedBaseStackId == null) {
                     LOGGER.debug("This is unexpected - no nestedBaseStackId with this non-base request");
                 }
             }
-            
+
             //1607 - Add version check
             // First - see if it's in the VnfResource record
             // if we have a vf Module - then we have to query to get the VnfResource record.
@@ -1659,7 +1675,7 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
                 vnfResource = db.getVnfResourceByModelUuid(vnfResourceModelUuid);
                 if (vnfResource == null) {
                     LOGGER
-                        .debug("Unable to find vnfResource at " + vnfResourceModelUuid + " will not error for now...");
+                            .debug("Unable to find vnfResource at " + vnfResourceModelUuid + " will not error for now...");
                 }
             }
             String minVersionVnf = null;
@@ -1692,34 +1708,34 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
                     if (cloudSiteOpt.isPresent()) {
                         aicV.setVersion(cloudSiteOpt.get().getAic_version());
                         if ((aicV.isMoreRecentThan(minVersionVnf) || aicV.isTheSameVersion(minVersionVnf)) // aic >= min
-                            && (aicV.isTheSameVersion(maxVersionVnf) || !(aicV
-                            .isMoreRecentThan(maxVersionVnf)))) { //aic <= max
+                                && (aicV.isTheSameVersion(maxVersionVnf) || !(aicV
+                                .isMoreRecentThan(maxVersionVnf)))) { //aic <= max
                             LOGGER.debug("VNF Resource " + vnfResource.getModelName() + " VersionMin=" + minVersionVnf
-                                + " VersionMax:" + maxVersionVnf + " supported on Cloud: " + cloudSiteOpt.get().getId()
-                                + " with AIC_Version:" + cloudSiteOpt.get().getAic_version());
+                                    + " VersionMax:" + maxVersionVnf + " supported on Cloud: " + cloudSiteOpt.get().getId()
+                                    + " with AIC_Version:" + cloudSiteOpt.get().getAic_version());
                         } else {
                             // ERROR
                             String error =
-                                "VNF Resource type: " + vnfResource.getModelName() + " VersionMin=" + minVersionVnf
-                                    + " VersionMax:" + maxVersionVnf + " NOT supported on Cloud: " + cloudSiteOpt.get()
-                                    .getId() + " with AIC_Version:" + cloudSiteOpt.get().getAic_version();
+                                    "VNF Resource type: " + vnfResource.getModelName() + " VersionMin=" + minVersionVnf
+                                            + " VersionMax:" + maxVersionVnf + " NOT supported on Cloud: " + cloudSiteOpt.get()
+                                            .getId() + " with AIC_Version:" + cloudSiteOpt.get().getAic_version();
                             LOGGER.error(MessageEnum.RA_CONFIG_EXC, error, "OpenStack", "",
-                                MsoLogger.ErrorCode.BusinessProcesssError, "Exception - setVersion");
+                                    MsoLogger.ErrorCode.BusinessProcesssError, "Exception - setVersion");
                             LOGGER.debug(error);
                             throw new VnfException(error, MsoExceptionCategory.USERDATA);
                         }
                     } // let this error out downstream to avoid introducing uncertainty at this stage
                 } else {
-                                       LOGGER.debug("cloudConfig is NULL - cannot check cloud site version");
+                    LOGGER.debug("cloudConfig is NULL - cannot check cloud site version");
                 }
 
-                       } else {
-                               LOGGER.debug("AIC Version not set in VNF_Resource - do not error for now - not checked.");
+            } else {
+                LOGGER.debug("AIC Version not set in VNF_Resource - do not error for now - not checked.");
             }
-                       // End Version check 1607
-            
-                       String heatTemplateArtifactUuid = null;
-                       String heatEnvironmentArtifactUuid = null;
+            // End Version check 1607
+
+            String heatTemplateArtifactUuid = null;
+            String heatEnvironmentArtifactUuid = null;
 
             HeatTemplate heatTemplate = null;
             if (isVolumeRequest) {
@@ -1731,14 +1747,14 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
             }
             if (heatTemplateArtifactUuid == null) {
                 String error =
-                    "UpdateVF: No Heat Template ID defined in catalog database for " + vfModuleType + ", reqType="
-                        + requestTypeString;
+                        "UpdateVF: No Heat Template ID defined in catalog database for " + vfModuleType + ", reqType="
+                                + requestTypeString;
                 LOGGER.error(MessageEnum.RA_VNF_UNKNOWN_PARAM, "Heat Template ID", vfModuleType, "OpenStack", "",
-                    MsoLogger.ErrorCode.DataError, error);
+                        MsoLogger.ErrorCode.DataError, error);
                 LOGGER.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound,
-                    error);
+                        error);
                 alarmLogger.sendAlarm(MSO_CONFIGURATION_ERROR,
-                    MsoAlarmLogger.CRITICAL, error);
+                        MsoAlarmLogger.CRITICAL, error);
                 throw new VnfException(error, MsoExceptionCategory.INTERNAL);
             } else {
                 heatTemplate = db.getHeatTemplateByArtifactUuidRegularQuery(heatTemplateArtifactUuid);
@@ -1746,18 +1762,18 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
 
             if (heatTemplate == null) {
                 String error = "Update VNF: undefined Heat Template. VF="
-                    + vfModuleType + ", heat template id = " + heatTemplateArtifactUuid;
+                        + vfModuleType + ", heat template id = " + heatTemplateArtifactUuid;
                 LOGGER.error(MessageEnum.RA_VNF_UNKNOWN_PARAM,
-                    "Heat Template ID",
-                    String.valueOf(heatTemplateArtifactUuid), "OpenStack", "", MsoLogger.ErrorCode.DataError, error);
+                        "Heat Template ID",
+                        String.valueOf(heatTemplateArtifactUuid), "OpenStack", "", MsoLogger.ErrorCode.DataError, error);
                 LOGGER.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound,
-                    error);
+                        error);
                 // Alarm on this error, configuration must be fixed
                 alarmLogger.sendAlarm(MSO_CONFIGURATION_ERROR,
-                    MsoAlarmLogger.CRITICAL, error);
+                        MsoAlarmLogger.CRITICAL, error);
 
-                               throw new VnfException(error, MsoExceptionCategory.INTERNAL);
-                       }
+                throw new VnfException(error, MsoExceptionCategory.INTERNAL);
+            }
 
             LOGGER.debug("Got HEAT Template from DB: " + heatTemplate.toString());
 
@@ -1771,13 +1787,13 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
                 if (heatEnvironment == null) {
 
                     String error = "Update VNF: undefined Heat Environment. VF=" + vfModuleType
-                        + ", Environment ID="
-                        + heatEnvironmentArtifactUuid;
+                            + ", Environment ID="
+                            + heatEnvironmentArtifactUuid;
                     LOGGER.error(MessageEnum.RA_VNF_UNKNOWN_PARAM, "Heat Environment ID",
-                        String.valueOf(heatEnvironmentArtifactUuid), "OpenStack", "", MsoLogger.ErrorCode.DataError,
-                        error);
+                            String.valueOf(heatEnvironmentArtifactUuid), "OpenStack", "", MsoLogger.ErrorCode.DataError,
+                            error);
                     LOGGER.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound,
-                        error);
+                            error);
                     // Alarm on this error, configuration must be fixed
                     alarmLogger.sendAlarm(MSO_CONFIGURATION_ERROR, MsoAlarmLogger.CRITICAL, error);
 
@@ -1785,7 +1801,7 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
                 } else {
                     LOGGER.debug("Got Heat Environment from DB: " + heatEnvironment.toString());
                     heatEnvironmentString = heatEnvironment
-                        .getEnvironment(); //this.parseEnvironment (heatEnvironment.getEnvironment ());
+                            .getEnvironment(); //this.parseEnvironment (heatEnvironment.getEnvironment ());
                     LOGGER.debug("After parsing: " + heatEnvironmentString);
                 }
             } else {
@@ -1793,7 +1809,7 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
             }
 
             LOGGER.debug("In MsoVnfAdapterImpl, about to call db.getNestedTemplates avec templateId="
-                + heatTemplate.getArtifactUuid());
+                    + heatTemplate.getArtifactUuid());
             Map<String, Object> nestedTemplates = db.getNestedTemplates(heatTemplate.getArtifactUuid());
             Map<String, Object> nestedTemplatesChecked = new HashMap<>();
             if (nestedTemplates != null) {
@@ -1815,7 +1831,7 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
             // Also add the files: for any get_files associated with this VfModule
             // *if* there are any
             LOGGER.debug("In MsoVnfAdapterImpl.updateVfModule, about to call db.getHeatFiles avec vfModuleId="
-                + vf.getModelUUID());
+                    + vf.getModelUUID());
 
             Map<String, HeatFiles> heatFiles = null;
 //            Map <String, HeatFiles> heatFiles = db.getHeatFiles (vnf.getId ());
@@ -1825,21 +1841,21 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
             boolean addGetFilesOnVolumeReq = false;
             try {
                 String propertyString = msoPropertiesFactory.getMsoJavaProperties(MSO_PROP_VNF_ADAPTER)
-                    .getProperty(MsoVnfAdapterImpl.ADD_GET_FILES_ON_VOLUME_REQ, null);
+                        .getProperty(MsoVnfAdapterImpl.ADD_GET_FILES_ON_VOLUME_REQ, null);
                 if ("true".equalsIgnoreCase(propertyString) || "y".equalsIgnoreCase(propertyString)) {
                     addGetFilesOnVolumeReq = true;
                     LOGGER.debug("AddGetFilesOnVolumeReq - setting to true! " + propertyString);
                 }
             } catch (Exception e) {
                 LOGGER.debug("An error occured trying to get property " + MsoVnfAdapterImpl.ADD_GET_FILES_ON_VOLUME_REQ
-                    + " - default to false", e);
+                        + " - default to false", e);
             }
             if (!isVolumeRequest || addGetFilesOnVolumeReq) {
                 LOGGER.debug(
-                    "In MsoVnfAdapterImpl updateVfModule, about to call db.getHeatFilesForVfModule avec vfModuleId="
-                        + vf.getModelUUID());
+                        "In MsoVnfAdapterImpl updateVfModule, about to call db.getHeatFilesForVfModule avec vfModuleId="
+                                + vf.getModelUUID());
 
-               heatFiles = db.getHeatFilesForVfModule(vf.getModelUUID());
+                heatFiles = db.getHeatFilesForVfModule(vf.getModelUUID());
                 if (heatFiles != null) {
                     // add these to stack - to be done in createStack
                     // here, we will map them to Map<String, Object> from Map<String, HeatFiles>
@@ -1853,13 +1869,13 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
                             // This means there was an invalid entry in VF_MODULE_TO_HEAT_FILES table - the heat file it pointed to could not be found.
                             String heatFileId = heatFileName.substring(heatFileName.lastIndexOf("|") + 1);
                             String error = "Create: No HEAT_FILES entry in catalog database for " + vfModuleType
-                                + " at HEAT_FILES index=" + heatFileId;
+                                    + " at HEAT_FILES index=" + heatFileId;
                             LOGGER.debug(error);
                             LOGGER
-                                .error(MessageEnum.RA_VNF_UNKNOWN_PARAM, "HEAT_FILES entry not found at " + heatFileId,
-                                    vfModuleType, "OpenStack", "", MsoLogger.ErrorCode.DataError, error);
+                                    .error(MessageEnum.RA_VNF_UNKNOWN_PARAM, "HEAT_FILES entry not found at " + heatFileId,
+                                            vfModuleType, "OpenStack", "", MsoLogger.ErrorCode.DataError, error);
                             LOGGER.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR,
-                                MsoLogger.ResponseCode.DataNotFound, error);
+                                    MsoLogger.ResponseCode.DataNotFound, error);
                             // Alarm on this error, configuration must be fixed
                             alarmLogger.sendAlarm(MSO_CONFIGURATION_ERROR, MsoAlarmLogger.CRITICAL, error);
                             throw new VnfException(error, MsoExceptionCategory.INTERNAL);
@@ -1887,11 +1903,11 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
             boolean checkRequiredParameters = true;
             try {
                 String propertyString = msoPropertiesFactory.getMsoJavaProperties(MSO_PROP_VNF_ADAPTER)
-                    .getProperty(MsoVnfAdapterImpl.CHECK_REQD_PARAMS, null);
+                        .getProperty(MsoVnfAdapterImpl.CHECK_REQD_PARAMS, null);
                 if ("false".equalsIgnoreCase(propertyString) || "n".equalsIgnoreCase(propertyString)) {
                     checkRequiredParameters = false;
                     LOGGER.debug("CheckRequiredParameters is FALSE. Will still check but then skip blocking..."
-                        + MsoVnfAdapterImpl.CHECK_REQD_PARAMS);
+                            + MsoVnfAdapterImpl.CHECK_REQD_PARAMS);
                 }
             } catch (Exception e) {
                 // No problem - default is true
@@ -1909,17 +1925,17 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
                 mhee = new MsoHeatEnvironmentEntry(sb);
                 StringBuilder sb2 = new StringBuilder("\nHeat Template Parameters:\n");
                 for (HeatTemplateParam parm : heatTemplate.getParameters()) {
-                       sb2.append("\t" + parm.getParamName() + ", required=" + parm.isRequired());
+                    sb2.append("\t" + parm.getParamName() + ", required=" + parm.isRequired());
                 }
                 if (!mhee.isValid()) {
-                       sb2.append("Environment says it's not valid! " + mhee.getErrorString());
+                    sb2.append("Environment says it's not valid! " + mhee.getErrorString());
                 } else {
-                       sb2.append("\nEnvironment:");
+                    sb2.append("\nEnvironment:");
                     sb2.append(mhee);
                 }
                 LOGGER.debug(sb2.toString());
             } else {
-               LOGGER.debug("NO ENVIRONMENT for this entry");
+                LOGGER.debug("NO ENVIRONMENT for this entry");
             }
 
             // New for 1607 - support params of json type
@@ -1928,14 +1944,14 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
 
             for (HeatTemplateParam parm : heatTemplate.getParameters()) {
                 LOGGER.debug("Parameter:'" + parm.getParamName()
-                    + "', isRequired="
-                    + parm.isRequired()
-                    + ", alias="
-                    + parm.getParamAlias());
+                        + "', isRequired="
+                        + parm.isRequired()
+                        + ", alias="
+                        + parm.getParamAlias());
                 // handle json
                 String parameterType = parm.getParamType();
                 if (parameterType == null || "".equals(parameterType.trim())) {
-                       parameterType = "String";
+                    parameterType = "String";
                 }
                 JsonNode jsonNode = null;
                 if ("json".equalsIgnoreCase(parameterType) && inputs != null) {
@@ -1998,10 +2014,10 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
                         String alias = parm.getParamAlias();
                         String value = inputs.get(alias);
                         LOGGER.debug("*Found an Alias: paramName=" + realParamName
-                            + ",alias="
-                            + alias
-                            + ",value="
-                            + value);
+                                + ",alias="
+                                + alias
+                                + ",value="
+                                + value);
                         inputs.remove(alias);
                         inputs.put(realParamName, value);
                         LOGGER.debug(alias + " entry removed from inputs, added back using " + realParamName);
@@ -2010,7 +2026,7 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
                     else if (mhee != null && mhee.containsParameter(parm.getParamName())) {
 
                         LOGGER.debug("Required parameter " + parm.getParamName()
-                            + " appears to be in environment - do not count as missing");
+                                + " appears to be in environment - do not count as missing");
                     } else {
                         LOGGER.debug("adding to missing parameters list: " + parm.getParamName());
                         if (missingParams == null) {
@@ -2027,9 +2043,9 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
                 if (checkRequiredParameters) {
                     String error = "Update VNF: Missing Required inputs: " + missingParams;
                     LOGGER.error(MessageEnum.RA_MISSING_PARAM, missingParams.toString(), "OpenStack", "",
-                        MsoLogger.ErrorCode.DataError, error);
+                            MsoLogger.ErrorCode.DataError, error);
                     LOGGER.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.BadRequest,
-                        error);
+                            error);
                     throw new VnfException(error, MsoExceptionCategory.USERDATA);
                 } else {
                     LOGGER.debug("found missing parameters - but checkRequiredParameters is false - will not block");
@@ -2052,23 +2068,23 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
                 extraParams.removeAll(paramList);
                 if (!extraParams.isEmpty()) {
                     LOGGER.warn(MessageEnum.RA_VNF_EXTRA_PARAM, vnfType, extraParams.toString(), "OpenStack", "",
-                        MsoLogger.ErrorCode.DataError, "Extra params");
+                            MsoLogger.ErrorCode.DataError, "Extra params");
                     inputs.keySet().removeAll(extraParams);
                 }
             }
             // 1607 - when we get here - we have clean inputs. Create inputsTwo in case we have json
             Map<String, Object> inputsTwo = null;
             if (hasJson && jsonParams.size() > 0) {
-               inputsTwo = new HashMap<>();
-               for (Map.Entry<String, String> entry : inputs.entrySet()) {
-                       String keyParamName = entry.getKey();
-                       String value = entry.getValue();
-                       if (jsonParams.containsKey(keyParamName)) {
-                               inputsTwo.put(keyParamName, jsonParams.get(keyParamName));
-                       } else {
-                               inputsTwo.put(keyParamName, value);
-                       }
-               }
+                inputsTwo = new HashMap<>();
+                for (Map.Entry<String, String> entry : inputs.entrySet()) {
+                    String keyParamName = entry.getKey();
+                    String value = entry.getValue();
+                    if (jsonParams.containsKey(keyParamName)) {
+                        inputsTwo.put(keyParamName, jsonParams.get(keyParamName));
+                    } else {
+                        inputsTwo.put(keyParamName, value);
+                    }
+                }
             }
 
             // "Fix" the template if it has CR/LF (getting this from Oracle)
@@ -2082,45 +2098,45 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
             try {
                 if (!hasJson) {
                     heatStack = heatU.updateStack(cloudSiteId,
-                        tenantId,
-                        vfModuleName,
-                        template,
-                        copyStringInputs(inputs),
-                        true,
-                        heatTemplate.getTimeoutMinutes(),
-                        newEnvironmentString,
-                        //heatEnvironmentString,
-                        nestedTemplatesChecked,
-                        heatFilesObjects);
+                            tenantId,
+                            vfModuleName,
+                            template,
+                            copyStringInputs(inputs),
+                            true,
+                            heatTemplate.getTimeoutMinutes(),
+                            newEnvironmentString,
+                            //heatEnvironmentString,
+                            nestedTemplatesChecked,
+                            heatFilesObjects);
                     LOGGER.recordMetricEvent(updateStackStarttime, MsoLogger.StatusCode.COMPLETE,
-                        MsoLogger.ResponseCode.Suc, "Successfully receive response from Open Stack", "OpenStack",
-                        "UpdateStack", null);
+                            MsoLogger.ResponseCode.Suc, "Successfully receive response from Open Stack", "OpenStack",
+                            "UpdateStack", null);
                 } else {
                     heatStack = heatU.updateStack(cloudSiteId,
-                        tenantId,
-                        vfModuleName,
-                        template,
-                        inputsTwo,
-                        true,
-                        heatTemplate.getTimeoutMinutes(),
-                        newEnvironmentString,
-                        //heatEnvironmentString,
-                        nestedTemplatesChecked,
-                        heatFilesObjects);
+                            tenantId,
+                            vfModuleName,
+                            template,
+                            inputsTwo,
+                            true,
+                            heatTemplate.getTimeoutMinutes(),
+                            newEnvironmentString,
+                            //heatEnvironmentString,
+                            nestedTemplatesChecked,
+                            heatFilesObjects);
                     LOGGER.recordMetricEvent(updateStackStarttime, MsoLogger.StatusCode.COMPLETE,
-                        MsoLogger.ResponseCode.Suc, "Successfully receive response from Open Stack", "OpenStack",
-                        "UpdateStack", null);
-               }
+                            MsoLogger.ResponseCode.Suc, "Successfully receive response from Open Stack", "OpenStack",
+                            "UpdateStack", null);
+                }
             } catch (MsoException me) {
                 me.addContext("UpdateVFModule");
                 String error = "Update VFModule " + vfModuleType + " in " + cloudSiteId + "/" + tenantId + ": " + me;
                 LOGGER.recordMetricEvent(updateStackStarttime, MsoLogger.StatusCode.ERROR,
-                    MsoLogger.ResponseCode.CommunicationError, error, "OpenStack", "UpdateStack", null);
+                        MsoLogger.ResponseCode.CommunicationError, error, "OpenStack", "UpdateStack", null);
                 LOGGER.error(MessageEnum.RA_UPDATE_VNF_ERR, vfModuleType, cloudSiteId, tenantId, "OpenStack", "",
-                    MsoLogger.ErrorCode.DataError, "Exception - " + error, me);
+                        MsoLogger.ErrorCode.DataError, "Exception - " + error, me);
                 LOGGER
-                    .recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError,
-                        error);
+                        .recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError,
+                                error);
                 throw new VnfException(me);
             }
         }
@@ -2128,30 +2144,30 @@ public class MsoVnfAdapterImpl implements MsoVnfAdapter {
 
         // Reach this point if updateStack is successful.
         // Populate remaining rollback info and response parameters.
-        vfRollback.setVnfId (heatStack.getCanonicalName ());
-        vfRollback.setVnfCreated (true);
+        vfRollback.setVnfId(heatStack.getCanonicalName());
+        vfRollback.setVnfCreated(true);
 
-        outputs.value = copyStringOutputs (heatStack.getOutputs ());
+        outputs.value = copyStringOutputs(heatStack.getOutputs());
         rollback.value = vfRollback;
-        LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully update VF Module");
+        LOGGER.recordAuditEvent(startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully update VF Module");
     }
 
     private String getVfModuleNameFromModuleStackId(String vfModuleStackId) {
-       // expected format of vfModuleStackId is "MSOTEST51-vSAMP3_base_module-0/1fc1f86c-7b35-447f-99a6-c23ec176ae24"
-       // before the "/" is the vfModuleName and after the "/" is the heat stack id in Openstack
-       if (vfModuleStackId == null)
-               return null;
-       int index = vfModuleStackId.lastIndexOf('/');
-       if (index <= 0)
-               return null;
-       String vfModuleName = null;
-       try {
-               vfModuleName = vfModuleStackId.substring(0, index);
-       } catch (Exception e) {
-               LOGGER.debug("Exception", e);
-               vfModuleName = null;
-       }
-       return vfModuleName;
+        // expected format of vfModuleStackId is "MSOTEST51-vSAMP3_base_module-0/1fc1f86c-7b35-447f-99a6-c23ec176ae24"
+        // before the "/" is the vfModuleName and after the "/" is the heat stack id in Openstack
+        if (vfModuleStackId == null)
+            return null;
+        int index = vfModuleStackId.lastIndexOf('/');
+        if (index <= 0)
+            return null;
+        String vfModuleName = null;
+        try {
+            vfModuleName = vfModuleStackId.substring(0, index);
+        } catch (Exception e) {
+            LOGGER.debug("Exception", e);
+            vfModuleName = null;
+        }
+        return vfModuleName;
     }
 
 }
diff --git a/adapters/mso-vnf-adapter/src/main/java/org/openecomp/mso/adapters/vnf/MsoVnfPluginAdapterImpl.java b/adapters/mso-vnf-adapter/src/main/java/org/openecomp/mso/adapters/vnf/MsoVnfPluginAdapterImpl.java
new file mode 100644 (file)
index 0000000..0a0747a
--- /dev/null
@@ -0,0 +1,1239 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OPENECOMP - MSO
+ * ================================================================================
+ * 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=========================================================
+ */
+
+/**
+ * This VNF Adapter implementation is based on the VDU Plugin model.  It assumes that each
+ * VF Module definition in the MSO catalog is expressed via a set of template and/or file
+ * artifacts that are appropriate for some specific sub-orchestrator that provides an
+ * implementation of the VduPlugin interface.  This adapter handles all of the common
+ * VF Module logic, including:
+ * - catalog lookups for artifact retrieval
+ * - parameter filtering and validation
+ * - base and volume module queries
+ * - rollback logic
+ * - logging and error handling
+ * 
+ * Then based on the orchestration mode of the VNF, it will invoke different VDU plug-ins
+ * to perform the low level instantiations, deletions, and queries.  At this time, the
+ * set of available plug-ins is hard-coded, though in the future a dynamic selection
+ * is expected (e.g. via a service-provider interface).
+ */
+package org.openecomp.mso.adapters.vnf;
+
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+
+import javax.jws.WebService;
+import javax.xml.ws.Holder;
+
+import org.openecomp.mso.adapters.vdu.CloudInfo;
+import org.openecomp.mso.adapters.vdu.VduException;
+import org.openecomp.mso.adapters.vdu.VduInstance;
+import org.openecomp.mso.adapters.vdu.VduModelInfo;
+import org.openecomp.mso.adapters.vdu.VduPlugin;
+import org.openecomp.mso.adapters.vdu.VduStateType;
+import org.openecomp.mso.adapters.vdu.VduStatus;
+import org.openecomp.mso.adapters.vdu.mapper.VfModuleCustomizationToVduMapper;
+import org.openecomp.mso.adapters.vnf.exceptions.VnfAlreadyExists;
+import org.openecomp.mso.adapters.vnf.exceptions.VnfException;
+import org.openecomp.mso.cloud.CloudConfig;
+import org.openecomp.mso.cloud.CloudConfigFactory;
+import org.openecomp.mso.cloud.CloudSite;
+import org.openecomp.mso.cloudify.utils.MsoCloudifyUtils;
+import org.openecomp.mso.db.catalog.CatalogDatabase;
+import org.openecomp.mso.db.catalog.beans.HeatEnvironment;
+import org.openecomp.mso.db.catalog.beans.HeatTemplate;
+import org.openecomp.mso.db.catalog.beans.HeatTemplateParam;
+import org.openecomp.mso.db.catalog.beans.VfModule;
+import org.openecomp.mso.db.catalog.beans.VfModuleCustomization;
+import org.openecomp.mso.db.catalog.beans.VnfResource;
+import org.openecomp.mso.db.catalog.utils.MavenLikeVersioning;
+import org.openecomp.mso.entity.MsoRequest;
+import org.openecomp.mso.logger.MessageEnum;
+import org.openecomp.mso.logger.MsoAlarmLogger;
+import org.openecomp.mso.logger.MsoLogger;
+import org.openecomp.mso.openstack.beans.VnfRollback;
+import org.openecomp.mso.openstack.beans.VnfStatus;
+import org.openecomp.mso.openstack.exceptions.MsoCloudSiteNotFound;
+import org.openecomp.mso.openstack.exceptions.MsoException;
+import org.openecomp.mso.openstack.exceptions.MsoExceptionCategory;
+import org.openecomp.mso.openstack.utils.MsoHeatEnvironmentEntry;
+import org.openecomp.mso.openstack.utils.MsoHeatUtils;
+import org.openecomp.mso.properties.MsoPropertiesFactory;
+
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+@WebService(serviceName = "VnfAdapter", endpointInterface = "org.openecomp.mso.adapters.vnf.MsoVnfAdapter", targetNamespace = "http://org.openecomp.mso/vnf")
+public class MsoVnfPluginAdapterImpl implements MsoVnfAdapter {
+
+       CloudConfigFactory cloudConfigFactory = new CloudConfigFactory();
+       protected CloudConfig cloudConfig = cloudConfigFactory.getCloudConfig();
+       protected MsoHeatUtils heatUtils;
+       protected VfModuleCustomizationToVduMapper vduMapper;
+       protected MsoCloudifyUtils cloudifyUtils;
+       
+       MsoPropertiesFactory msoPropertiesFactory=new MsoPropertiesFactory();
+
+       private static final String MSO_PROP_VNF_ADAPTER = "MSO_PROP_VNF_ADAPTER";
+    private static final String MSO_CONFIGURATION_ERROR = "MsoConfigurationError";
+    private static MsoLogger LOGGER = MsoLogger.getMsoLogger (MsoLogger.Catalog.RA);
+    private static MsoAlarmLogger alarmLogger = new MsoAlarmLogger ();
+    private static final String CHECK_REQD_PARAMS = "org.openecomp.mso.adapters.vnf.checkRequiredParameters";
+    private static final ObjectMapper JSON_MAPPER = new ObjectMapper();
+
+    /**
+     * Health Check web method. Does nothing but return to show the adapter is deployed.
+     */
+    @Override
+    public void healthCheck () {
+        LOGGER.debug ("Health check call in VNF Plugin Adapter");
+    }
+
+    /**
+     * DO NOT use that constructor to instantiate this class, the msoPropertiesfactory will be NULL.
+     * @see MsoVnfPluginAdapterImpl#MsoVnfAdapterImpl(MsoPropertiesFactory, CloudConfigFactory)
+     */
+    public MsoVnfPluginAdapterImpl() {
+
+    }
+
+    /**
+     * This constructor MUST be used if this class is called with the new operator.
+     * @param msoPropFactory
+     */
+    public MsoVnfPluginAdapterImpl(MsoPropertiesFactory msoPropFactory, CloudConfigFactory cloudConfigFact) {
+       this.msoPropertiesFactory = msoPropFactory;
+       this.cloudConfigFactory = cloudConfigFact;
+       heatUtils = new MsoHeatUtils(MSO_PROP_VNF_ADAPTER, msoPropertiesFactory, cloudConfigFactory);
+       vduMapper = new VfModuleCustomizationToVduMapper();
+       cloudifyUtils = new MsoCloudifyUtils (MSO_PROP_VNF_ADAPTER, msoPropertiesFactory,cloudConfigFactory);
+    }
+
+    /**
+     * This is the "Create VNF" web service implementation.
+     * This function is now unsupported and will return an error.
+     *
+     */
+    @Override
+    public void createVnf (String cloudSiteId,
+                           String tenantId,
+                           String vnfType,
+                           String vnfVersion,
+                           String vnfName,
+                           String requestType,
+                           String volumeGroupHeatStackId,
+                           Map <String, String> inputs,
+                           Boolean failIfExists,
+                           Boolean backout,
+                           MsoRequest msoRequest,
+                           Holder <String> vnfId,
+                           Holder <Map <String, String>> outputs,
+                           Holder <VnfRollback> rollback)
+       throws VnfException
+    {
+       // This operation is no longer supported at the VNF level.  The adapter is only called to deploy modules.
+       LOGGER.debug ("CreateVNF command attempted but not supported");
+       throw new VnfException ("CreateVNF:  Unsupported command", MsoExceptionCategory.USERDATA);
+    }
+
+    /**
+     * This is the "Update VNF" web service implementation.
+     * This function is now unsupported and will return an error.
+     *
+     */
+    @Override
+    public void updateVnf (String cloudSiteId,
+                           String tenantId,
+                           String vnfType,
+                           String vnfVersion,
+                           String vnfName,
+                           String requestType,
+                           String volumeGroupHeatStackId,
+                           Map <String, String> inputs,
+                           MsoRequest msoRequest,
+                           Holder <Map <String, String>> outputs,
+                           Holder <VnfRollback> rollback)
+               throws VnfException
+       {
+       // This operation is no longer supported at the VNF level.  The adapter is only called to deploy modules.
+       LOGGER.debug ("UpdateVNF command attempted but not supported");
+       throw new VnfException ("UpdateVNF:  Unsupported command", MsoExceptionCategory.USERDATA);
+    }
+
+    /**
+     * This is the "Query VNF" web service implementation.
+     * 
+     * This really should be QueryVfModule, but nobody ever changed it.
+     *
+     * The method returns an indicator that the VNF exists, along with its status and outputs.
+     * The input "vnfName" will also be reflected back as its ID.
+     *
+     * @param cloudSiteId CLLI code of the cloud site in which to query
+     * @param tenantId Openstack tenant identifier
+     * @param vnfNameOrId VNF Name or ID to query
+     * @param msoRequest Request tracking information for logs
+     * @param vnfExists Flag reporting the result of the query
+     * @param vnfId Holder for output VNF ID
+     * @param outputs Holder for Map of outputs from the deployed VF Module (assigned IPs, etc)
+     */
+    @Override
+    public void queryVnf (String cloudSiteId,
+                          String tenantId,
+                          String vnfNameOrId,
+                          MsoRequest msoRequest,
+                          Holder <Boolean> vnfExists,
+                          Holder <String> vnfId,
+                          Holder <VnfStatus> status,
+                          Holder <Map <String, String>> outputs)
+        throws VnfException
+    {
+        MsoLogger.setLogContext (msoRequest);
+       MsoLogger.setServiceName ("QueryVnf");
+        LOGGER.debug ("Querying VNF " + vnfNameOrId + " in " + cloudSiteId + "/" + tenantId);
+
+        // Will capture execution time for metrics
+        long startTime = System.currentTimeMillis ();
+        long subStartTime = System.currentTimeMillis ();
+        
+        VduInstance vduInstance = null;
+       CloudInfo cloudInfo = new CloudInfo(cloudSiteId, tenantId, null);
+
+        VduPlugin vduPlugin = getVduPlugin(cloudSiteId);
+        
+       try {
+               vduInstance =  vduPlugin.queryVdu(cloudInfo, vnfNameOrId);
+               LOGGER.recordMetricEvent (subStartTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully received VDU Query response", "VDU", "QueryVDU", vnfNameOrId);
+       }
+       catch (VduException e) {
+               // Failed to query the VDU due to a plugin exception.
+               e.addContext ("QueryVNF");
+            String error = "Query VNF (VDU): " + vnfNameOrId + " in " + cloudSiteId + "/" + tenantId + ": " + e;
+            LOGGER.recordMetricEvent (subStartTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error, "VDU", "QueryVNF", vnfNameOrId);
+            LOGGER.error (MessageEnum.RA_QUERY_VNF_ERR, vnfNameOrId, cloudSiteId, tenantId, "VDU", "QueryVNF", MsoLogger.ErrorCode.DataError, "Exception - queryVDU", e);
+            LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error);
+            throw new VnfException (e);
+       }
+               
+       if (vduInstance != null  &&  vduInstance.getStatus().getState() != VduStateType.NOTFOUND) {
+            vnfExists.value = Boolean.TRUE;
+            status.value = vduStatusToVnfStatus(vduInstance);
+            vnfId.value = vduInstance.getVduInstanceId();
+            outputs.value = copyStringOutputs (vduInstance.getOutputs ());
+
+            LOGGER.debug ("VNF " + vnfNameOrId + " found, ID = " + vnfId.value);
+       }
+        else {
+            vnfExists.value = Boolean.FALSE;
+            status.value = VnfStatus.NOTFOUND;
+            vnfId.value = null;
+            outputs.value = new HashMap <String, String> (); // Return as an empty map
+
+            LOGGER.debug ("VNF " + vnfNameOrId + " not found");
+       }
+        LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully query VNF");
+        return;
+    }
+
+    
+    /**
+     * This is the "Delete VNF" web service implementation.
+     * This function is now unsupported and will return an error.
+     *
+     */
+    @Override
+    public void deleteVnf (String cloudSiteId,
+                           String tenantId,
+                           String vnfName,
+                           MsoRequest msoRequest) throws VnfException {
+        MsoLogger.setLogContext (msoRequest);
+       MsoLogger.setServiceName ("DeleteVnf");
+       
+       // This operation is no longer supported at the VNF level.  The adapter is only called to deploy modules.
+       LOGGER.debug ("DeleteVNF command attempted but not supported");
+       throw new VnfException ("DeleteVNF:  Unsupported command", MsoExceptionCategory.USERDATA);
+    }
+
+    /**
+     * This web service endpoint will rollback a previous Create VNF operation.
+     * A rollback object is returned to the client in a successful creation
+     * response. The client can pass that object as-is back to the rollbackVnf
+     * operation to undo the creation.
+     * 
+     * TODO: This should be rollbackVfModule and/or rollbackVolumeGroup,
+     * but APIs were apparently never updated.
+     */
+    @Override
+    public void rollbackVnf (VnfRollback rollback) throws VnfException {
+        long startTime = System.currentTimeMillis ();
+        MsoLogger.setServiceName ("RollbackVnf");
+       // rollback may be null (e.g. if stack already existed when Create was called)
+        if (rollback == null) {
+            LOGGER.info (MessageEnum.RA_ROLLBACK_NULL, "OpenStack", "rollbackVnf");
+            LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.BadRequest, "Rollback request content is null");
+            return;
+        }
+
+        // Don't rollback if nothing was done originally
+        if (!rollback.getVnfCreated()) {
+            LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Rollback VF Module - nothing to roll back");
+            return;
+        }
+        
+        // Get the elements of the VnfRollback object for easier access
+        String cloudSiteId = rollback.getCloudSiteId ();
+        String tenantId = rollback.getTenantId ();
+        CloudInfo cloudInfo = new CloudInfo (cloudSiteId, tenantId, null);
+
+        String vfModuleId = rollback.getVfModuleStackId ();
+
+        MsoLogger.setLogContext (rollback.getMsoRequest());
+
+        LOGGER.debug ("Rolling Back VF Module " + vfModuleId + " in " + cloudSiteId + "/" + tenantId);
+
+        VduInstance vduInstance = null;
+
+        // Use the VduPlugin to delete the VF Module.
+        VduPlugin vduPlugin = getVduPlugin(cloudSiteId);
+
+        long subStartTime = System.currentTimeMillis ();
+        try {
+               // TODO: Get a reasonable timeout.  Use a global property, or store the creation timeout in rollback object and use that.
+            vduInstance = vduPlugin.deleteVdu(cloudInfo, vfModuleId, 5);
+            
+            LOGGER.debug("Rolled back VDU instantiation: " + vduInstance.getVduInstanceId());
+            LOGGER.recordMetricEvent (subStartTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully received response from VDU Plugin", "VDU", "DeleteVdu", null);
+        }
+        catch (VduException ve) {
+            // Failed to rollback the VF Module due to a plugin exception.
+            // Convert to a generic VnfException
+            ve.addContext ("RollbackVFModule");
+            String error = "Rollback VF Module: " + vfModuleId + " in " + cloudSiteId + "/" + tenantId + ": " + ve;
+            LOGGER.recordMetricEvent (subStartTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error, "VDU", "DeleteVdu", null);
+            LOGGER.error (MessageEnum.RA_DELETE_VNF_ERR, vfModuleId, cloudSiteId, tenantId, "VDU", "DeleteVdu", MsoLogger.ErrorCode.DataError, "Exception - DeleteVdu", ve);
+            LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error);
+            throw new VnfException (ve);
+        }
+        LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully roll back VF Module");
+        return;
+    }
+
+
+    private VnfStatus vduStatusToVnfStatus (VduInstance vdu) {
+       // Determine the status based on last action & status
+       // DeploymentInfo object should be enhanced to report a better status internally.
+       VduStatus vduStatus = vdu.getStatus();
+       VduStateType status = vduStatus.getState();
+       
+       if (status == null) {
+               return VnfStatus.UNKNOWN;
+       }
+       else if (status == VduStateType.NOTFOUND) {
+                       return VnfStatus.NOTFOUND;
+       }
+       else if (status == VduStateType.INSTANTIATED) {
+                       return VnfStatus.ACTIVE;
+       }
+       else if (status == VduStateType.FAILED) {
+               return VnfStatus.FAILED;
+       }
+
+       return VnfStatus.UNKNOWN;
+    }
+    
+    /*
+        * Normalize an input value to an Object, based on the target parameter type.
+        * If the type is not recognized, it will just be returned unchanged (as a string).
+        */
+       private Object convertInputValue (String inputValue, HeatTemplateParam templateParam)
+       {
+               String type = templateParam.getParamType();
+               LOGGER.debug("Parameter: " + templateParam.getParamName() + " is of type " + type);
+               
+               if (type.equalsIgnoreCase("number")) {
+                       try {
+                               return Integer.valueOf(inputValue);
+                       }
+                       catch (Exception e) {
+                               LOGGER.debug("Unable to convert " + inputValue + " to an integer!");
+                               return null;
+                       }
+               } else if (type.equalsIgnoreCase("json")) {
+                       try {
+                               JsonNode jsonNode = new ObjectMapper().readTree(inputValue);
+                               return jsonNode;
+                       }
+                       catch (Exception e) {
+                               LOGGER.debug("Unable to convert " + inputValue + " to a JsonNode!");
+                               return null;
+                       }
+               } else if (type.equalsIgnoreCase("boolean")) {
+                       return new Boolean(inputValue);
+               }
+               
+               // Nothing else matched.  Return the original string
+               return inputValue;
+       }
+    
+    private Map <String, String> copyStringOutputs (Map <String, Object> stackOutputs) {
+        Map <String, String> stringOutputs = new HashMap <> ();
+        for (String key : stackOutputs.keySet ()) {
+            if (stackOutputs.get (key) instanceof String) {
+                stringOutputs.put (key, (String) stackOutputs.get (key));
+            } else if (stackOutputs.get(key) instanceof Integer)  {
+               try {
+                       String str = "" + stackOutputs.get(key);
+                       stringOutputs.put(key, str);
+               } catch (Exception e) {
+                       LOGGER.debug("Unable to add " + key + " to outputs");
+               }
+            } else if (stackOutputs.get(key) instanceof JsonNode) {
+               try {
+                       String str = this.convertNode((JsonNode) stackOutputs.get(key));
+                       stringOutputs.put(key, str);
+               } catch (Exception e) {
+                       LOGGER.debug("Unable to add " + key + " to outputs - exception converting JsonNode");
+               }
+            } else if (stackOutputs.get(key) instanceof java.util.LinkedHashMap) {
+               try {
+                                       String str = JSON_MAPPER.writeValueAsString(stackOutputs.get(key));
+                       stringOutputs.put(key, str);
+               } catch (Exception e) {
+                       LOGGER.debug("Unable to add " + key + " to outputs - exception converting LinkedHashMap");
+               }
+            } else {
+               try {
+                       String str = stackOutputs.get(key).toString();
+                       stringOutputs.put(key, str);
+               } catch (Exception e) {
+                       LOGGER.debug("Unable to add " + key + " to outputs - unable to call .toString() " + e.getMessage());
+               }
+            }
+        }
+        return stringOutputs;
+    }
+
+
+    private void sendMapToDebug(Map<String, Object> inputs, String optionalName) {
+       int i = 0;
+       StringBuilder sb = new StringBuilder(optionalName == null ? "\ninputs" : "\n" + optionalName);
+       if (inputs == null) {
+               sb.append("\tNULL");
+       }
+       else if (inputs.size() < 1) {
+               sb.append("\tEMPTY");
+       } else {
+               for (String str : inputs.keySet()) {
+                       String outputString;
+                       try {
+                               outputString = inputs.get(str).toString();
+                       } catch (Exception e) {
+                               outputString = "Unable to call toString() on the value for " + str;
+                       }
+                       sb.append("\t\nitem " + i++ + ": '" + str + "'='" + outputString + "'");
+               }
+       }
+       LOGGER.debug(sb.toString());
+       return; 
+    }
+    
+    private void sendMapToDebug(Map<String, String> inputs) {
+       int i = 0;
+       StringBuilder sb = new StringBuilder("inputs:");
+       if (inputs == null) {
+               sb.append("\tNULL");
+       }
+       else if (inputs.size() < 1) {
+               sb.append("\tEMPTY");
+       } else {
+               for (String str : inputs.keySet()) {
+                       sb.append("\titem " + i++ + ": " + str + "=" + inputs.get(str));
+               }
+       }
+       LOGGER.debug(sb.toString());
+       return;
+    }
+
+    private String convertNode(final JsonNode node) {
+        try {
+            final Object obj = JSON_MAPPER.treeToValue(node, Object.class);
+            final String json = JSON_MAPPER.writeValueAsString(obj);
+            return json;
+        } catch (JsonParseException jpe) {
+            LOGGER.debug("Error converting json to string " + jpe.getMessage());
+        } catch (Exception e) {
+            LOGGER.debug("Error converting json to string " + e.getMessage());
+        }
+        return "[Error converting json to string]";
+    }
+
+    private Map<String, String> convertMapStringObjectToStringString(Map<String, Object> objectMap) {
+        if (objectMap == null) {
+            return null;
+        }
+        Map<String, String> stringMap = new HashMap<>();
+        for (String key : objectMap.keySet()) {
+            if (!stringMap.containsKey(key)) {
+                Object obj = objectMap.get(key);
+                if (obj instanceof String) {
+                    stringMap.put(key, (String) objectMap.get(key));
+                } else if (obj instanceof JsonNode ){
+                    // This is a bit of mess - but I think it's the least impacting
+                    // let's convert it BACK to a string - then it will get converted back later
+                    try {
+                        String str = this.convertNode((JsonNode) obj);
+                        stringMap.put(key, str);
+                    } catch (Exception e) {
+                                               LOGGER.debug("DANGER WILL ROBINSON: unable to convert value for JsonNode "+ key);
+                        //okay in this instance - only string values (fqdn) are expected to be needed
+                    }
+                } else if (obj instanceof java.util.LinkedHashMap) {
+                    LOGGER.debug("LinkedHashMap - this is showing up as a LinkedHashMap instead of JsonNode");
+                    try {
+                        String str = JSON_MAPPER.writeValueAsString(obj);
+                        stringMap.put(key, str);
+                    } catch (Exception e) {
+                                               LOGGER.debug("DANGER WILL ROBINSON: unable to convert value for LinkedHashMap "+ key);
+                                       }
+                               }  else if (obj instanceof Integer) {
+                                       try {
+                                               String str = "" + obj;
+                                               stringMap.put(key, str);
+                                       } catch (Exception e) {
+                                               LOGGER.debug("DANGER WILL ROBINSON: unable to convert value for Integer "+ key);
+                    }
+                } else {
+                    try {
+                                               String str = obj.toString();
+                        stringMap.put(key, str);
+                    } catch (Exception e) {
+                                               LOGGER.debug("DANGER WILL ROBINSON: unable to convert value "+ key + " (" + e.getMessage() + ")");
+                    }
+                }
+            }
+        }
+
+        return stringMap;
+    }
+
+    /**
+     * This is the "Create VF Module" web service implementation.
+     * It will instantiate a new VF Module of the requested type in the specified cloud
+     * and tenant. The tenant must exist before this service is called.
+     *
+     * If a VF Module with the same name already exists, this can be considered a
+     * success or failure, depending on the value of the 'failIfExists' parameter.
+     *
+     * All VF Modules are defined in the MSO catalog. The caller must request one of
+     * the pre-defined module types or an error will be returned. Within the catalog,
+     * each VF Module references (among other things) a collection of artifacts that
+     * are used to deploy the required cloud resources (VMs, networks, etc.).
+     *
+     * Depending on the module templates, a variable set of input parameters will
+     * be defined, some of which are required. The caller is responsible to
+     * pass the necessary input data for the module or an error will be thrown.
+     *
+     * The method returns the vfModuleId, a Map of output attributes, and a VnfRollback
+     * object. This last object can be passed as-is to the rollbackVnf operation to
+     * undo everything that was created for the Module. This is useful if a VF module
+     * is successfully created but the orchestration fails on a subsequent step.
+     *
+     * @param cloudSiteId CLLI code of the cloud site in which to create the VNF
+     * @param tenantId Openstack tenant identifier
+     * @param vfModuleType VF Module type key, should match a VNF definition in catalog DB.
+     *        Deprecated - should use modelCustomizationUuid
+     * @param vnfVersion VNF version key, should match a VNF definition in catalog DB
+     *        Deprecated - VF Module versions also captured by modelCustomizationUuid
+     * @param vfModuleName Name to be assigned to the new VF Module
+     * @param requestType Indicates if this is a Volume Group or Module request
+     * @param volumeGroupId Identifier (i.e. deployment ID) for a Volume Group
+     *        to attach to a VF Module
+     * @param baseVfModuleId Identifier (i.e. deployment ID) of the Base Module if
+     *        this is an Add-on module
+     * @param modelCustomizationUuid Unique ID for the VF Module's model.  Replaces
+     *        the use of vfModuleType.
+     * @param inputs Map of key=value inputs for VNF stack creation
+     * @param failIfExists Flag whether already existing VNF should be considered
+     * @param backout Flag whether to suppress automatic backout (for testing)
+     * @param msoRequest Request tracking information for logs
+     * @param vnfId Holder for output VF Module instance ID in the cloud
+     * @param outputs Holder for Map of VNF outputs from Deployment (assigned IPs, etc)
+     * @param rollback Holder for returning VnfRollback object
+     */
+    public void createVfModule(String cloudSiteId,
+            String tenantId,
+            String vfModuleType,
+            String vnfVersion,
+            String vfModuleName,
+            String requestType,
+            String volumeGroupId,
+            String baseVfModuleId,
+            String modelCustomizationUuid,
+            Map <String, String> inputs,
+            Boolean failIfExists,
+            Boolean backout,
+            MsoRequest msoRequest,
+            Holder <String> vnfId,
+            Holder <Map <String, String>> outputs,
+            Holder <VnfRollback> rollback)
+        throws VnfException
+    {
+        // Will capture execution time for metrics
+        long startTime = System.currentTimeMillis ();
+        
+       MsoLogger.setLogContext (msoRequest);
+       MsoLogger.setServiceName ("CreateVfModule");
+
+        // Require a model customization ID.  Every VF Module definition must have one.
+        if (modelCustomizationUuid == null  ||  modelCustomizationUuid.isEmpty()) {
+                       LOGGER.debug("Missing required input: modelCustomizationUuid");
+                       String error = "Create vfModule error: Missing required input: modelCustomizationUuid";
+            LOGGER.error(MessageEnum.RA_VNF_UNKNOWN_PARAM,
+                    "VF Module ModelCustomizationUuid", "null", "VDU", "", MsoLogger.ErrorCode.DataError, "Create VF Module: Missing required input: modelCustomizationUuid");
+            LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, error);
+            throw new VnfException(error, MsoExceptionCategory.USERDATA);
+        }
+        
+        // Clean up some inputs to make comparisons easier
+        if (requestType == null)
+               requestType = "";
+        
+        if ("".equals(volumeGroupId) || "null".equals(volumeGroupId))
+               volumeGroupId = null;  
+        
+        if ("".equals(baseVfModuleId) || "null".equals(baseVfModuleId))
+               baseVfModuleId = null;
+
+        if (inputs == null) {
+               // Create an empty set of inputs
+               inputs = new HashMap<String,String>();
+               LOGGER.debug("inputs == null - setting to empty");
+        } else {
+               this.sendMapToDebug(inputs);
+        }
+        
+        // Check if this is for a "Volume" module
+        boolean isVolumeRequest = false;
+        if (requestType.startsWith("VOLUME")) {
+               isVolumeRequest = true;
+        }
+
+        LOGGER.debug("requestType = " + requestType + ", volumeGroupStackId = " + volumeGroupId + ", baseStackId = " + baseVfModuleId);
+
+        // Build a default rollback object (no actions performed)
+        VnfRollback vfRollback = new VnfRollback();
+        vfRollback.setCloudSiteId(cloudSiteId);
+        vfRollback.setTenantId(tenantId);
+        vfRollback.setMsoRequest(msoRequest);
+        vfRollback.setRequestType(requestType);
+        vfRollback.setIsBase(false);   // Until we know better
+        vfRollback.setVolumeGroupHeatStackId(volumeGroupId);
+        vfRollback.setBaseGroupHeatStackId(baseVfModuleId);
+        vfRollback.setModelCustomizationUuid(modelCustomizationUuid);
+        vfRollback.setMode("CFY");
+        
+               rollback.value = vfRollback; // Default rollback - no updates performed
+
+        // Get the VNF/VF Module definition from the Catalog DB first.
+        // There are three relevant records:  VfModule, VfModuleCustomization, VnfResource
+
+        CatalogDatabase db = CatalogDatabase.getInstance();
+       VfModule vfModule = null;
+       VnfResource vnfResource = null;
+       VfModuleCustomization vfModuleCust = null;
+
+        try {
+               vfModuleCust = db.getVfModuleCustomizationByModelCustomizationId(modelCustomizationUuid);
+               
+            if (vfModuleCust == null) {
+                       String error = "Create vfModule error: Unable to find vfModuleCust with modelCustomizationUuid=" + modelCustomizationUuid;
+                       LOGGER.debug(error);
+                LOGGER.error(MessageEnum.RA_VNF_UNKNOWN_PARAM,
+                            "VF Module ModelCustomizationUuid", modelCustomizationUuid, "CatalogDb", "", MsoLogger.ErrorCode.DataError, error);
+                LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, error);
+                throw new VnfException(error, MsoExceptionCategory.USERDATA);
+            } else {
+                       LOGGER.debug("Found vfModuleCust entry " + vfModuleCust.toString());
+            }
+
+            // Get the vfModule and vnfResource records
+               vfModule = vfModuleCust.getVfModule();
+               vnfResource = db.getVnfResourceByModelUuid(vfModule.getVnfResourceModelUUId());
+        }
+        catch (Exception e) {
+            db.close ();
+               LOGGER.debug("unhandled exception in create VF - [Query]" + e.getMessage());
+               throw new VnfException("Exception during create VF " + e.getMessage());
+        }
+
+        //  Perform a version check against cloudSite
+        // Obtain the cloud site information where we will create the VF Module
+        Optional<CloudSite> cloudSite = cloudConfig.getCloudSite (cloudSiteId);
+        if (!cloudSite.isPresent()) {
+            throw new VnfException (new MsoCloudSiteNotFound (cloudSiteId));
+        }
+               MavenLikeVersioning aicV = new MavenLikeVersioning();
+               aicV.setVersion(cloudSite.get().getAic_version());
+    
+               String vnfMin = vnfResource.getAicVersionMin();
+               String vnfMax = vnfResource.getAicVersionMax();
+               
+               if ( (vnfMin != null && !(aicV.isMoreRecentThan(vnfMin) || aicV.isTheSameVersion(vnfMin))) ||
+                    (vnfMax != null && aicV.isMoreRecentThan(vnfMax)))
+               {
+                       // ERROR
+                       String error = "VNF Resource type: " + vnfResource.getModelName() + ", ModelUuid=" + vnfResource.getModelUuid() + " VersionMin=" + vnfMin + " VersionMax:" + vnfMax + " NOT supported on Cloud: " + cloudSite.get().getId() + " with AIC_Version:" + cloudSite.get().getAic_version();
+                       LOGGER.error(MessageEnum.RA_CONFIG_EXC, error, "OpenStack", "", MsoLogger.ErrorCode.BusinessProcesssError, "Exception - setVersion");
+                       LOGGER.debug(error);
+                       throw new VnfException(error, MsoExceptionCategory.USERDATA);
+               }
+               // End Version check
+        
+        
+               VduInstance vduInstance = null;
+        CloudInfo cloudInfo = new CloudInfo (cloudSiteId, tenantId, null);
+        
+        // Use the VduPlugin.
+        VduPlugin vduPlugin = getVduPlugin(cloudSiteId);
+        
+        // First, look up to see if the VF already exists.
+
+        long subStartTime1 = System.currentTimeMillis ();
+        try {
+            vduInstance = vduPlugin.queryVdu (cloudInfo, vfModuleName);
+            LOGGER.recordMetricEvent (subStartTime1, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully received response from VduPlugin", "VDU", "QueryVDU", vfModuleName);
+        }
+        catch (VduException me) {
+            // Failed to query the VDU due to a plugin exception.
+            String error = "Create VF Module: Query " + vfModuleName + " in " + cloudSiteId + "/" + tenantId + ": " + me ;
+            LOGGER.error (MessageEnum.RA_QUERY_VNF_ERR, vfModuleName, cloudSiteId, tenantId, "VDU", "queryVdu", MsoLogger.ErrorCode.DataError, "Exception - queryVdu", me);
+            LOGGER.recordMetricEvent (subStartTime1, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error, "VDU", "QueryVdu", vfModuleName);
+            LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error);
+
+            // Convert to a generic VnfException
+            me.addContext ("CreateVFModule");
+            throw new VnfException (me);
+        }
+        
+        // More precise handling/messaging if the Module already exists
+        if (vduInstance != null && !(vduInstance.getStatus().getState() == VduStateType.NOTFOUND)) {
+               VduStateType status = vduInstance.getStatus().getState();
+                       LOGGER.debug ("Found Existing VDU, status=" + status);
+                       
+               if (status == VduStateType.INSTANTIATED) {
+                       if (failIfExists != null && failIfExists) {
+                       // fail - it exists
+                               String error = "Create VF: Deployment " + vfModuleName + " already exists in " + cloudSiteId + "/" + tenantId;
+                               LOGGER.error (MessageEnum.RA_VNF_ALREADY_EXIST, vfModuleName, cloudSiteId, tenantId, "VDU", "queryVdu", MsoLogger.ErrorCode.DataError, "VF Module " + vfModuleName + " already exists");
+                    LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict, error);
+                               throw new VnfAlreadyExists (vfModuleName, cloudSiteId, tenantId, vduInstance.getVduInstanceId());
+                       } else {
+                               // Found existing deployment and client has not requested "failIfExists".
+                               // Populate the outputs from the existing deployment.
+
+                               vnfId.value = vduInstance.getVduInstanceId();
+                               outputs.value = copyStringOutputs (vduInstance.getOutputs ());
+                    LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully create VF Module (found existing)");
+                    return;
+                       }
+               }
+               // Check through various detailed error cases
+               else if (status == VduStateType.INSTANTIATING || status == VduStateType.DELETING || status == VduStateType.UPDATING) {
+                       // fail - it's in progress - return meaningful error
+                String error = "Create VF: Deployment " + vfModuleName + " already exists and has status " + status.toString() + " in " + cloudSiteId + "/" + tenantId + "; please wait for it to complete, or fix manually.";
+                LOGGER.error (MessageEnum.RA_VNF_ALREADY_EXIST, vfModuleName, cloudSiteId, tenantId, "VDU", "queryVdu", MsoLogger.ErrorCode.DataError, "VF Module " + vfModuleName + " already exists");
+                LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict, error);
+                throw new VnfAlreadyExists (vfModuleName, cloudSiteId, tenantId, vduInstance.getVduInstanceId());
+               }
+               else if (status == VduStateType.FAILED) {
+                       // fail - it exists and is in a FAILED state
+                String error = "Create VF: Deployment " + vfModuleName + " already exists and is in FAILED state in " + cloudSiteId + "/" + tenantId + "; requires manual intervention.";
+                LOGGER.error (MessageEnum.RA_VNF_ALREADY_EXIST, vfModuleName, cloudSiteId, tenantId, "VDU", "queryVdu", MsoLogger.ErrorCode.DataError, "VF Module " + vfModuleName + " already exists and is in FAILED state");
+                LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict, error);
+                throw new VnfAlreadyExists (vfModuleName, cloudSiteId, tenantId, vduInstance.getVduInstanceId());
+               }
+               else if (status == VduStateType.UNKNOWN) {
+                       // fail - it exists and is in a UNKNOWN state
+                String error = "Create VF: Deployment " + vfModuleName + " already exists and has status " + status.toString() + " in " + cloudSiteId + "/" + tenantId + "; requires manual intervention.";
+                LOGGER.error (MessageEnum.RA_VNF_ALREADY_EXIST, vfModuleName, cloudSiteId, tenantId, "VDU", "queryVdu", MsoLogger.ErrorCode.DataError, "VF Module " + vfModuleName + " already exists and is in " + status.toString() + " state");
+                LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict, error);
+                throw new VnfAlreadyExists (vfModuleName, cloudSiteId, tenantId, vduInstance.getVduInstanceId());
+               }
+               else {
+                       // Unexpected, since all known status values have been tested for
+                String error = "Create VF: Deployment " + vfModuleName + " already exists with unexpected status " + status.toString() + " in " + cloudSiteId + "/" + tenantId + "; requires manual intervention.";
+                LOGGER.error (MessageEnum.RA_VNF_ALREADY_EXIST, vfModuleName, cloudSiteId, tenantId, "VDU", "queryVdu", MsoLogger.ErrorCode.DataError, "VF Module " + vfModuleName + " already exists and is in an unknown state");
+                LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict, error);
+                throw new VnfAlreadyExists (vfModuleName, cloudSiteId, tenantId, vduInstance.getVduInstanceId());
+               }
+        }
+   
+        
+        // Collect outputs from Base Modules and Volume Modules
+        Map<String, Object> baseModuleOutputs = null;
+        Map<String, Object> volumeGroupOutputs = null;
+
+        // If a Volume Group was provided, query its outputs for inclusion in Module input parameters
+        if (volumeGroupId != null) {
+            long subStartTime2 = System.currentTimeMillis ();
+            VduInstance volumeVdu = null;
+            try {
+                volumeVdu = vduPlugin.queryVdu (cloudInfo, volumeGroupId);
+                LOGGER.recordMetricEvent (subStartTime2, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Success response from VduPlugin", "VDU", "QueryVdu", volumeGroupId);
+            }
+            catch (VduException me) {
+                // Failed to query the Volume Group VDU due to a plugin exception.
+                String error = "Create VF Module: Query Volume Group " + volumeGroupId + " in " + cloudSiteId + "/" + tenantId + ": " + me ;
+                LOGGER.error (MessageEnum.RA_QUERY_VNF_ERR, volumeGroupId, cloudSiteId, tenantId, "VDU", "queryVdu(volume)", MsoLogger.ErrorCode.DataError, "Exception - queryVdu(volume)", me);
+                LOGGER.recordMetricEvent (subStartTime2, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error, "VDU", "QueryVdu(volume)", volumeGroupId);
+                LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error);
+
+                // Convert to a generic VnfException
+                me.addContext ("CreateVFModule(QueryVolume)");
+                throw new VnfException (me);
+            }
+            
+               if (volumeVdu == null || volumeVdu.getStatus().getState() == VduStateType.NOTFOUND) {
+                   String error = "Create VFModule: Attached Volume Group DOES NOT EXIST " + volumeGroupId + " in " + cloudSiteId + "/" + tenantId + " USER ERROR"  ;
+                   LOGGER.error (MessageEnum.RA_QUERY_VNF_ERR, volumeGroupId, cloudSiteId, tenantId, error, "VDU", "queryVdu(volume)", MsoLogger.ErrorCode.BusinessProcesssError, "Create VFModule: Attached Volume Group DOES NOT EXIST");
+                LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict, error);
+                   LOGGER.debug(error);
+                   throw new VnfException (error, MsoExceptionCategory.USERDATA);
+               } else {
+                       LOGGER.debug("Found nested volume group");
+                       volumeGroupOutputs = volumeVdu.getOutputs();
+                       this.sendMapToDebug(volumeGroupOutputs, "volumeGroupOutputs");
+               }
+        }
+       
+        // If this is an Add-On Module, query the Base Module outputs
+        // Note: This will be performed whether or not the current request is for an
+        //       Add-On Volume Group or Add-On VF Module
+
+        if (vfModule.isBase()) {
+            LOGGER.debug("This is a BASE Module request");
+            vfRollback.setIsBase(true);
+        } else {
+            LOGGER.debug("This is an Add-On Module request");
+            
+            // Add-On Modules should always have a Base, but just treat as a warning if not provided.
+            // Add-on Volume requests may or may not specify a base.
+            if (!isVolumeRequest && baseVfModuleId == null) {
+                LOGGER.debug ("WARNING:  Add-on Module request - no Base Module ID provided");
+            }
+
+            if (baseVfModuleId != null) {
+                   long subStartTime2 = System.currentTimeMillis ();
+                   VduInstance baseVdu = null;
+                   try {
+                       baseVdu = vduPlugin.queryVdu (cloudInfo, baseVfModuleId);
+                       LOGGER.recordMetricEvent (subStartTime2, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Success response from VduPlugin", "VDU", "QueryVdu(Base)", baseVfModuleId);
+                   }
+                   catch (MsoException me) {
+                       // Failed to query the Base VF Module due to a Vdu Plugin exception.
+                       String error = "Create VF Module: Query Base " + baseVfModuleId + " in " + cloudSiteId + "/" + tenantId + ": " + me ;
+                       LOGGER.error (MessageEnum.RA_QUERY_VNF_ERR, baseVfModuleId, cloudSiteId, tenantId, "VDU", "queryVdu(Base)", MsoLogger.ErrorCode.DataError, "Exception - queryVdu(Base)", me);
+                       LOGGER.recordMetricEvent (subStartTime2, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error, "VDU", "QueryVdu(Base)", baseVfModuleId);
+                       LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error);
+       
+                       // Convert to a generic VnfException
+                       me.addContext ("CreateVFModule(QueryBase)");
+                       throw new VnfException (me);
+                   }
+                   
+                       if (baseVdu == null || baseVdu.getStatus().getState() == VduStateType.NOTFOUND) {
+                           String error = "Create VFModule: Base Module DOES NOT EXIST " + baseVfModuleId + " in " + cloudSiteId + "/" + tenantId + " USER ERROR"  ;
+                           LOGGER.error (MessageEnum.RA_QUERY_VNF_ERR, baseVfModuleId, cloudSiteId, tenantId, error, "VDU", "queryVdu(Base)", MsoLogger.ErrorCode.BusinessProcesssError, "Create VFModule: Base Module DOES NOT EXIST");
+                       LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict, error);
+                           LOGGER.debug(error);
+                           throw new VnfException (error, MsoExceptionCategory.USERDATA);
+                       } else {
+                               LOGGER.debug("Found base module");
+                               baseModuleOutputs = baseVdu.getOutputs();
+                               this.sendMapToDebug(baseModuleOutputs, "baseModuleOutputs");
+                       }
+            }
+        }
+
+        // NOTE:  For this section, heatTemplate is used for all template artifacts.
+        // In final implementation (post-POC), the template object would either be generic or there would
+        // be a separate DB Table/Object for different sub-orchestrators.
+
+        // NOTE: The template is fixed for the VF Module.  The environment is part of the customization.
+
+               // NOTE: The template is fixed for the VF Module.  The environment is part of the customization.
+            String heatTemplateArtifactUuid = null;
+            String heatEnvironmentArtifactUuid = null;
+
+                       if (isVolumeRequest) {
+                               heatTemplateArtifactUuid = vfModule.getVolHeatTemplateArtifactUUId();
+                               heatEnvironmentArtifactUuid = vfModuleCust.getVolEnvironmentArtifactUuid();
+                       } else {
+                               heatTemplateArtifactUuid = vfModule.getHeatTemplateArtifactUUId();
+                               heatEnvironmentArtifactUuid = vfModuleCust.getHeatEnvironmentArtifactUuid();
+                       }
+                       
+                       if (heatTemplateArtifactUuid == null || heatTemplateArtifactUuid.equals("")) {
+                               String error = "Create: No Heat Template ID defined in catalog database for " + vfModuleType + ", reqType=" + requestType;
+                               LOGGER.error(MessageEnum.RA_VNF_UNKNOWN_PARAM, "Heat Template ID", vfModuleType, "Cloudify", "", MsoLogger.ErrorCode.DataError, "Create: No Heat Template ID defined in catalog database");
+                LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, error);
+                               alarmLogger.sendAlarm(MSO_CONFIGURATION_ERROR, MsoAlarmLogger.CRITICAL, error);
+                               throw new VnfException(error, MsoExceptionCategory.INTERNAL);
+                       }
+                       
+                       HeatTemplate heatTemplate = db.getHeatTemplateByArtifactUuidRegularQuery(heatTemplateArtifactUuid);
+
+                       if (heatTemplate == null) {
+                               String error = "Create VF/VNF: no entry found for heat template ID = " + heatTemplateArtifactUuid;
+                               LOGGER.error(MessageEnum.RA_VNF_UNKNOWN_PARAM,
+                                               "Heat Template ID",
+                                               String.valueOf(heatTemplateArtifactUuid), "Cloudify", "", MsoLogger.ErrorCode.BusinessProcesssError, "Create VF/VNF: no entry found for heat template ID = " + heatTemplateArtifactUuid);
+                LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, error);
+                               alarmLogger.sendAlarm(MSO_CONFIGURATION_ERROR, MsoAlarmLogger.CRITICAL, error);
+                               throw new VnfException(error, MsoExceptionCategory.INTERNAL);
+                       }
+                       LOGGER.debug("Got HEAT Template record from DB");
+
+                       // Next get the Environment record.  This is optional.
+            HeatEnvironment heatEnvironment = null;
+            if (heatEnvironmentArtifactUuid != null && !heatEnvironmentArtifactUuid.equals(""))
+            {
+                heatEnvironment = db.getHeatEnvironmentByArtifactUuid(heatEnvironmentArtifactUuid);
+                if (heatEnvironment == null) {
+                    String error = "Create VFModule: undefined Heat Environment. VFModule=" + vfModuleType
+                                   + ", Environment ID="
+                                   + heatEnvironmentArtifactUuid;
+                    LOGGER.error (MessageEnum.RA_VNF_UNKNOWN_PARAM, "Heat Environment ID", String.valueOf(heatEnvironmentArtifactUuid), "Cloudify", "getEnvironment", MsoLogger.ErrorCode.BusinessProcesssError, "Create VFModule: undefined Heat Environment");
+                    LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, error);
+                    // Alarm on this error, configuration must be fixed
+                    alarmLogger.sendAlarm (MSO_CONFIGURATION_ERROR, MsoAlarmLogger.CRITICAL, error);
+
+                    throw new VnfException (error, MsoExceptionCategory.INTERNAL);
+                }
+                LOGGER.debug ("Got Heat Environment from DB");
+            } else {
+                LOGGER.debug ("no environment parameter found for this Type " + vfModuleType);
+            }
+
+            
+         // Create the combined set of parameters from the incoming request, base-module outputs,
+            // volume-module outputs.  Also, convert all variables to their native object types.
+            
+            HashMap<String, Object> goldenInputs = new HashMap<>();
+            List<String> extraInputs = new ArrayList<>();
+
+               Boolean skipInputChecks = false;
+            
+               if (skipInputChecks) {
+                       goldenInputs = new HashMap<String,Object>();
+                       for (String key : inputs.keySet()) {
+                               goldenInputs.put(key, inputs.get(key));
+                       }
+               }
+               else {
+                       // Build maps for the parameters (including aliases) to simplify checks
+                       HashMap<String, HeatTemplateParam> params = new HashMap<>();
+                       
+                       Set<HeatTemplateParam> paramSet = heatTemplate.getParameters();
+                       LOGGER.debug("paramSet has " + paramSet.size() + " entries");
+                       
+                       for (HeatTemplateParam htp : paramSet) {
+                               params.put(htp.getParamName(), htp);
+
+                               // Include aliases.
+                               String alias = htp.getParamAlias();
+                               if (alias != null && !alias.equals("") && !params.containsKey(alias)) {
+                                       params.put(alias, htp);
+                               }
+                       }
+                       
+                       // First, convert all inputs to their "template" type
+                       for (String key : inputs.keySet()) {
+                               if (params.containsKey(key)) {
+                                       Object value = convertInputValue(inputs.get(key), params.get(key));
+                                       if (value != null) {
+                                               goldenInputs.put(key, value);
+                                       }
+                                       else {
+                                               LOGGER.debug("Failed to convert input " + key + "='" + inputs.get(key) + "' to " + params.get(key).getParamType());
+                                       }
+                               } else {
+                                       extraInputs.add(key);
+                               }
+                       }
+                       
+                       if (!extraInputs.isEmpty()) {
+                               LOGGER.debug("Ignoring extra inputs: " + extraInputs);
+                       }
+                       
+                       // Next add in Volume Group Outputs if there are any.  Copy directly without conversions.
+                       if (volumeGroupOutputs != null  &&  !volumeGroupOutputs.isEmpty()) {
+                               for (String key : volumeGroupOutputs.keySet()) {
+                                       if (params.containsKey(key)  &&  !goldenInputs.containsKey(key)) {
+                                               goldenInputs.put(key, volumeGroupOutputs.get(key));
+                                       }
+                               }
+                       }
+                       
+                       // Next add in Base Module Outputs if there are any.  Copy directly without conversions.
+                       if (baseModuleOutputs != null  &&  !baseModuleOutputs.isEmpty()) {
+                               for (String key : baseModuleOutputs.keySet()) {
+                                       if (params.containsKey(key)  &&  !goldenInputs.containsKey(key)) {
+                                               goldenInputs.put(key, baseModuleOutputs.get(key));
+                                       }
+                               }
+                       }
+                               
+                               // TODO:  The model should support a mechanism to pre-assign default parameter values
+                               // per "customization" (i.e. usage) of a given module.  In HEAT, this is specified by
+                               // an Environment file.  There is not a general mechanism in the model to handle this.
+                               // For the general case, any such parameter/values can be added dynamically to the
+                               // inputs (only if not already specified).
+                               
+                               
+                   // Check that required parameters have been supplied from any of the sources
+                   String missingParams = null;
+                   boolean checkRequiredParameters = true;
+                   try {
+                       String propertyString = this.msoPropertiesFactory.getMsoJavaProperties(MSO_PROP_VNF_ADAPTER)
+                                       .getProperty(MsoVnfPluginAdapterImpl.CHECK_REQD_PARAMS,null);
+                       if ("false".equalsIgnoreCase (propertyString) || "n".equalsIgnoreCase (propertyString)) {
+                           checkRequiredParameters = false;
+                           LOGGER.debug ("CheckRequiredParameters is FALSE. Will still check but then skip blocking..."
+                                         + MsoVnfPluginAdapterImpl.CHECK_REQD_PARAMS);
+                       }
+                   } catch (Exception e) {
+                       // No problem - default is true
+                       LOGGER.debug ("An exception occured trying to get property " + MsoVnfPluginAdapterImpl.CHECK_REQD_PARAMS, e);
+                   }
+                   
+                   // Do the actual parameter checking.
+                   // Include looking at the ENV file as a valid definition of a parameter value.
+                   // TODO:  This handling of ENV applies only to Heat.  A general mechanism to
+                   // support pre-set parameter/values does not yet exist in the model.
+                   //
+                               StringBuilder sb = new StringBuilder(heatEnvironment.getEnvironment());
+                               MsoHeatEnvironmentEntry mhee = new MsoHeatEnvironmentEntry (sb);
+                   for (HeatTemplateParam parm : heatTemplate.getParameters ()) {
+                       if (parm.isRequired () && (!goldenInputs.containsKey (parm.getParamName ()))) {
+                           if (mhee != null && mhee.containsParameter(parm.getParamName())) {
+                               LOGGER.debug ("Required parameter " + parm.getParamName ()
+                                             + " appears to be in environment - do not count as missing");
+                           } else {
+                                   LOGGER.debug ("adding to missing parameters list: " + parm.getParamName ());
+                                   if (missingParams == null) {
+                                       missingParams = parm.getParamName ();
+                                   } else {
+                                       missingParams += "," + parm.getParamName ();
+                                   }
+                           }
+                       }
+                   }
+                       
+                   if (missingParams != null) {
+                       if (checkRequiredParameters) {
+                               // Problem - missing one or more required parameters
+                               String error = "Create VFModule: Missing Required inputs: " + missingParams;
+                               LOGGER.error (MessageEnum.RA_MISSING_PARAM, missingParams, "VDU", "", MsoLogger.ErrorCode.DataError, "Create VFModule: Missing Required inputs");
+                           LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.BadRequest, error);
+                               throw new VnfException (error, MsoExceptionCategory.USERDATA);
+                       } else {
+                               LOGGER.debug ("found missing parameters [" + missingParams + "] - but checkRequiredParameters is false - will not block");
+                       }
+                   } else {
+                       LOGGER.debug ("No missing parameters found - ok to proceed");
+                   }
+
+                       } // NOTE: END PARAMETER CHECKING
+
+                       // Here we go...  ready to deploy the VF Module.
+               long instantiateVduStartTime = System.currentTimeMillis ();
+               if (backout == null) backout = true;
+               
+                       try {
+                               // Construct the VDU Model structure to pass to the targeted VduPlugin
+                               VduModelInfo vduModel = null;
+                               if (! isVolumeRequest) {
+                                       vduModel = vduMapper.mapVfModuleCustomizationToVdu(vfModuleCust);
+                               } else {
+                                       vduModel = vduMapper.mapVfModuleCustVolumeToVdu(vfModuleCust);
+                               }
+                       
+                               // Invoke the VduPlugin to instantiate the VF Module
+                               vduInstance = vduPlugin.instantiateVdu(cloudInfo, vfModuleName, goldenInputs, vduModel, backout);
+                               
+                   LOGGER.recordMetricEvent (instantiateVduStartTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully received response from VduPlugin", "VDU", "instantiateVdu", vfModuleName);
+                       }
+                       catch (VduException me) {
+                   // Failed to instantiate the VDU.
+                   me.addContext ("CreateVFModule");
+                   String error = "Create VF Module " + vfModuleType + " in " + cloudSiteId + "/" + tenantId + ": " + me;
+                   LOGGER.recordMetricEvent (instantiateVduStartTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error, "VDU", "instantiateVdu", vfModuleName);
+                   LOGGER.error (MessageEnum.RA_CREATE_VNF_ERR, vfModuleType, cloudSiteId, tenantId, "VDU", "", MsoLogger.ErrorCode.DataError, "MsoException - instantiateVdu", me);
+                   LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error);
+                   // Convert to a generic VnfException
+                   throw new VnfException (me);
+               }
+                   catch (NullPointerException npe) {
+                       String error = "Create VFModule " + vfModuleType + " in " + cloudSiteId + "/" + tenantId + ": " + npe;
+                       LOGGER.recordMetricEvent (instantiateVduStartTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, error, "VDU", "instantiateVdu", vfModuleName);
+                       LOGGER.error (MessageEnum.RA_CREATE_VNF_ERR, vfModuleType, cloudSiteId, tenantId, "VDU", "", MsoLogger.ErrorCode.DataError, "NullPointerException - instantiateVdu", npe);
+                       LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, error);
+                       LOGGER.debug("NULL POINTER EXCEPTION at vduPlugin.instantiateVdu", npe);
+                       throw new VnfException ("NullPointerException during instantiateVdu");
+                   }
+                       catch (Exception e) {
+                       String error = "Create VFModule " + vfModuleType + " in " + cloudSiteId + "/" + tenantId + ": " + e;
+                       LOGGER.recordMetricEvent (instantiateVduStartTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.UnknownError, error, "VDU", "instantiateVdu", vfModuleName);
+                       LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.UnknownError, error);
+                       LOGGER.debug("Unhandled exception at vduPlugin.instantiateVdu", e);
+                       } finally {
+                               db.close();
+                       }
+
+        // Reach this point if create is successful.
+        // Populate remaining rollback info and response parameters.
+        vfRollback.setVnfCreated (true);
+        vfRollback.setVnfId (vduInstance.getVduInstanceId());
+        vnfId.value = vduInstance.getVduInstanceId();
+        outputs.value = copyStringOutputs (vduInstance.getOutputs ());         
+
+        rollback.value = vfRollback;
+
+        LOGGER.debug ("VF Module " + vfModuleName + " successfully created");
+        LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully create VF Module");
+        return;
+    }
+
+    public void deleteVfModule (String cloudSiteId,
+            String tenantId,
+            String vfModuleId,
+            MsoRequest msoRequest,
+            Holder <Map <String, String>> outputs) throws VnfException
+       {
+               MsoLogger.setLogContext (msoRequest);
+               MsoLogger.setServiceName ("DeleteVfModule");
+               
+               LOGGER.debug ("Deleting VF Module " + vfModuleId + " in " + cloudSiteId + "/" + tenantId);
+               // Will capture execution time for metrics
+               long startTime = System.currentTimeMillis ();
+               
+               // Capture the output parameters on a delete, so need to query first
+               VduInstance vduInstance = null;
+               CloudInfo cloudInfo = new CloudInfo(cloudSiteId, tenantId, null);
+               
+               // Use the VduPlugin.
+               VduPlugin vduPlugin = getVduPlugin(cloudSiteId);
+               
+               try {
+                       vduInstance = vduPlugin.queryVdu (cloudInfo, vfModuleId);
+                       LOGGER.recordMetricEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully received VDU Query response", "VDU", "QueryVDU", vfModuleId);
+               }
+               catch (VduException e) {
+                       // Failed to query the VDU due to a plugin exception.
+                       // Convert to a generic VnfException
+                       e.addContext ("QueryVFModule");
+                       String error = "Query VfModule (VDU): " + vfModuleId + " in " + cloudSiteId + "/" + tenantId + ": " + e;
+                       LOGGER.recordMetricEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error, "VDU", "QueryVNF", vfModuleId);
+                       LOGGER.error (MessageEnum.RA_QUERY_VNF_ERR, vfModuleId, cloudSiteId, tenantId, "VDU", "QueryVFModule", MsoLogger.ErrorCode.DataError, "Exception - queryVDU", e);
+                       LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error);
+                       throw new VnfException (e);
+               }
+               
+               // call method which handles the conversion from Map<String,Object> to Map<String,String> for our expected Object types
+               outputs.value = convertMapStringObjectToStringString(vduInstance.getOutputs());
+               
+               // Use the VduPlugin to delete the VDU.
+               // The possible outcomes of deleteVdu are
+               // - a vnfInstance object with status of DELETED (success)
+               // - a vnfInstance object with status of NOTFOUND (VDU did not exist, treat as success)
+               // - a vnfInstance object with status of FAILED (error)
+               // Also, VduException could be thrown.
+               long subStartTime = System.currentTimeMillis ();
+               try {
+                       // TODO:  Get an appropriate timeout value - require access to the model
+                       vduPlugin.deleteVdu(cloudInfo, vfModuleId, 5);
+                       LOGGER.recordMetricEvent (subStartTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully received response from deleteVdu", "VDU", "DeleteVdu", vfModuleId);
+               } catch (VduException me) {
+                       me.addContext ("DeleteVfModule");
+                       // Convert to a generic VnfException
+                       String error = "Delete VF: " + vfModuleId + " in " + cloudSiteId + "/" + tenantId + ": " + me;
+                       LOGGER.recordMetricEvent (subStartTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error, "DeleteVdu", "DeleteVdu", vfModuleId);
+                       LOGGER.error (MessageEnum.RA_DELETE_VNF_ERR, vfModuleId, cloudSiteId, tenantId, "VDU", "DeleteVdu", MsoLogger.ErrorCode.DataError, "Exception - DeleteVdu: " + me.getMessage());
+                       LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, error);
+                       throw new VnfException (me);
+               }
+               
+               // On success, nothing is returned.
+               LOGGER.recordAuditEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully delete VF");
+               return;
+       }
+       
+       // Update VF Module not yet implemented for generic VDU plug-in model.
+       @Override
+       public void updateVfModule (String cloudSiteId,
+                   String tenantId,
+                   String vnfType,
+                   String vnfVersion,
+                   String vnfName,
+                   String requestType,
+                   String volumeGroupHeatStackId,
+                   String baseVfHeatStackId,
+                   String vfModuleStackId,
+                   String modelCustomizationUuid,
+                   Map <String, String> inputs,
+                   MsoRequest msoRequest,
+                   Holder <Map <String, String>> outputs,
+                   Holder <VnfRollback> rollback) throws VnfException
+       {
+               // This operation is not currently supported for VduPlugin-orchestrated VF Modules.
+               LOGGER.debug ("Update VF Module command attempted but not supported");
+               throw new VnfException ("UpdateVfModule:  Unsupported command", MsoExceptionCategory.USERDATA);
+       }
+    
+    /*
+     * Dynamic selection of a VduPlugin version.  For initial tests, base on the "orchestrator"
+     * defined for the target cloud.  Should really be looking at the VNF Model (ochestration_mode)
+     * but we don't currently have access to that in Query and Delete cases.
+     */
+    private VduPlugin getVduPlugin (String cloudSiteId) {
+       Optional<CloudSite> cloudSite = cloudConfig.getCloudSite(cloudSiteId);
+       if (cloudSite.isPresent()) {
+               String orchestrator = cloudSite.get().getOrchestrator();
+               
+               if (orchestrator.equalsIgnoreCase("CLOUDIFY")) {
+                       return cloudifyUtils;                           
+               }
+               else if (orchestrator.equalsIgnoreCase("HEAT")) {
+                       return heatUtils;
+               }
+       }
+       
+       // Default - return HEAT plugin, though will fail later
+       return heatUtils;
+    }
+
+}
index f7302c0..487e9c2 100644 (file)
@@ -74,9 +74,9 @@ public class VnfAdapterRestUtils
                        vnfAdapter = new MsoVnfAdapterImpl (msoPropertiesFactory, cloudConfigFactory);
                }
                else {
-                       // Don't expect this, but default is the HEAT adapter
-                       LOGGER.debug ("GetVnfAdapterImpl: Return Default (Heat) Adapter");
-                       vnfAdapter = new MsoVnfAdapterImpl (msoPropertiesFactory, cloudConfigFactory);
+                       // Default is the PLUGIN adapter
+                       LOGGER.debug ("GetVnfAdapterImpl: Return Default (Plugin) Adapter");
+                       vnfAdapter = new MsoVnfPluginAdapterImpl (msoPropertiesFactory, cloudConfigFactory);
                }
                
                return vnfAdapter;
diff --git a/adapters/mso-vnf-adapter/src/test/java/org/openecomp/mso/adapters/vnf/AriaVduPluginTest.java b/adapters/mso-vnf-adapter/src/test/java/org/openecomp/mso/adapters/vnf/AriaVduPluginTest.java
new file mode 100644 (file)
index 0000000..c6d5814
--- /dev/null
@@ -0,0 +1,41 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2018 Huawei 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.adapters.vnf;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openecomp.mso.vdu.utils.VduBlueprint;
+import org.openecomp.mso.vdu.utils.VduPlugin;
+
+import java.util.HashMap;
+
+public class AriaVduPluginTest {
+
+    VduPlugin vduPlugin = new AriaVduPlugin();
+
+    @Test(expected = RuntimeException.class)
+    public void instantiateVduFailedToCreateCSAR() throws Exception {
+        VduBlueprint blueprint = new VduBlueprint();
+        blueprint.setMainTemplateName("blueprintmain");
+        vduPlugin.instantiateVdu("cloudid", "tenantid", "vduinstancename",
+                new VduBlueprint(), new HashMap<>(), null, 100, true);
+        Assert.assertFalse(true);
+    }
+}
\ No newline at end of file
diff --git a/adapters/mso-vnf-adapter/src/test/java/org/openecomp/mso/adapters/vnf/MsoVnfPluginAdapterImplTest.java b/adapters/mso-vnf-adapter/src/test/java/org/openecomp/mso/adapters/vnf/MsoVnfPluginAdapterImplTest.java
new file mode 100644 (file)
index 0000000..37ca4f7
--- /dev/null
@@ -0,0 +1,151 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2018 Huawei 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.adapters.vnf;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.ws.Holder;
+
+import org.junit.Test;
+import org.openecomp.mso.adapters.vnf.exceptions.VnfException;
+import org.openecomp.mso.entity.MsoRequest;
+import org.openecomp.mso.openstack.beans.VnfRollback;
+
+public class MsoVnfPluginAdapterImplTest {
+
+       @Test(expected = NullPointerException.class)
+    public void queryVnfNullPointerExceptionTest() throws Exception {
+        MsoVnfPluginAdapterImpl instance = new MsoVnfPluginAdapterImpl();
+        MsoRequest msoRequest = new MsoRequest();
+        msoRequest.setRequestId("12345");
+        msoRequest.setServiceInstanceId("12345");
+
+        instance.queryVnf("siteid", "1234", "vfname",
+                msoRequest, new Holder<>(), new Holder<>(), new Holder<>(),
+                new Holder<>());
+    }
+
+       @Test(expected = VnfException.class)
+    public void deleteVnfVnfExceptionTest() throws Exception {
+               MsoVnfPluginAdapterImpl instance = new MsoVnfPluginAdapterImpl();
+        MsoRequest msoRequest = new MsoRequest();
+        msoRequest.setRequestId("12345");
+        msoRequest.setServiceInstanceId("12345");
+
+        instance.deleteVnf("12344", "234", "vnfname", msoRequest);
+
+    }
+
+       @Test
+       public void rollbackVnf() throws Exception {
+               MsoVnfPluginAdapterImpl instance = new MsoVnfPluginAdapterImpl();
+               MsoRequest msoRequest = new MsoRequest();
+               msoRequest.setRequestId("12345");
+               msoRequest.setServiceInstanceId("12345");
+
+        VnfRollback vnfRollback = new VnfRollback();
+        vnfRollback.setModelCustomizationUuid("1234");
+        vnfRollback.setVfModuleStackId("2134");
+        vnfRollback.setVnfId("123");
+        vnfRollback.setModelCustomizationUuid("1234");
+
+        instance.rollbackVnf(vnfRollback);
+       }
+
+       @Test(expected = VnfException.class)
+       public void createVfModuleVnfException() throws Exception {
+               MsoVnfPluginAdapterImpl instance = new MsoVnfPluginAdapterImpl();
+               MsoRequest msoRequest = new MsoRequest();
+               msoRequest.setRequestId("12345");
+               msoRequest.setServiceInstanceId("12345");
+
+               instance.createVfModule("123", "123", "vf", "v1", "module-005", "create", "3245", "234", "123", new HashMap<>(), true, true, msoRequest, new Holder<>(), new Holder<>(), new Holder<>());
+       }
+
+       @Test(expected = VnfException.class)
+       public void updateVfModuleVnfException() throws Exception {
+               MsoVnfPluginAdapterImpl instance = new MsoVnfPluginAdapterImpl();
+               MsoRequest msoRequest = new MsoRequest();
+               msoRequest.setRequestId("12345");
+               msoRequest.setServiceInstanceId("12345");
+
+               instance.updateVfModule("123", "1234", "fw", "v2", "vnf1", "create", "123", "12", "233", "234", new HashMap<>(), msoRequest, new Holder<>(), new Holder<>());
+       }
+
+       @Test
+       public void healthCheckVNFTest() {
+               MsoVnfPluginAdapterImpl instance = new MsoVnfPluginAdapterImpl();
+               instance.healthCheck();
+       }
+
+       @Test
+       public void createVnfTest() {
+               MsoVnfPluginAdapterImpl instance = new MsoVnfPluginAdapterImpl();
+               MsoRequest msoRequest = new MsoRequest();
+               msoRequest.setRequestId("12345");
+               msoRequest.setServiceInstanceId("12345");
+
+               Map<String, String> map = new HashMap<>();
+               map.put("key1", "value1");
+               try {
+                       instance.createVnf("mdt1", "88a6ca3ee0394ade9403f075db23167e", "vnf", "1", "vSAMP12", "VFMOD",
+                                       "volumeGroupHeatStackId|1", map,
+                                       Boolean.FALSE, Boolean.TRUE, msoRequest, new Holder<>(), new Holder<>(),
+                new Holder<>());
+               } catch (Exception e) {
+               }
+       }
+
+       @Test
+       public void updateVnfTest() {
+               MsoVnfPluginAdapterImpl instance = new MsoVnfPluginAdapterImpl();
+               MsoRequest msoRequest = new MsoRequest();
+               msoRequest.setRequestId("12345");
+               msoRequest.setServiceInstanceId("12345");
+
+               Map<String, String> map = new HashMap<>();
+               
+               map.put("key1", "value1");
+               try {
+                       instance.updateVnf("mdt1", "88a6ca3ee0394ade9403f075db23167e", "vnf", "1", "vSAMP12", "VFMOD",
+                                       "volumeGroupHeatStackId|1",  map, msoRequest, new Holder<>(),
+                new Holder<>());
+               } catch (Exception e) {
+
+               }
+       }
+
+       @Test
+       public void deleteVnfTest() {
+               MsoVnfPluginAdapterImpl instance = new MsoVnfPluginAdapterImpl();
+               MsoRequest msoRequest = new MsoRequest();
+               msoRequest.setRequestId("12345");
+               msoRequest.setServiceInstanceId("12345");
+               try {
+                       instance.deleteVnf("mdt1", "88a6ca3ee0394ade9403f075db23167e", "vSAMP12", msoRequest);
+               } catch (Exception e) {
+
+               }
+       }
+
+}
diff --git a/adapters/mso-workflow-message-adapter/src/test/java/org/openecomp/mso/adapters/workflowmessage/BPRestCallbackTest.java b/adapters/mso-workflow-message-adapter/src/test/java/org/openecomp/mso/adapters/workflowmessage/BPRestCallbackTest.java
new file mode 100644 (file)
index 0000000..8d2c938
--- /dev/null
@@ -0,0 +1,42 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2018 Huawei Technologies Co., Ltd. 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.adapters.workflowmessage;
+
+import org.apache.http.entity.ContentType;
+import org.junit.Test;
+import org.mockito.Mock;
+
+import static junit.framework.Assert.assertFalse;
+
+public class BPRestCallbackTest {
+
+    @Mock
+    ContentType contentType;
+
+    @Test
+    public void testSendExceptionCase() {
+
+        BPRestCallback test = new BPRestCallback();
+        test.send("workflowMessageUrl/", "messageType", "correlator", contentType,"message");
+        assertFalse(test.send("workflowMessageUrl/", "messageType", "correlator", contentType,"message"));
+
+        }
+    }
index 94447c3..20a3566 100644 (file)
                        <groupId>org.onap.sdc.sdc-tosca</groupId>
                        <artifactId>sdc-tosca</artifactId>
                        <version>1.3.3</version>
+                       <!-- sdc-tosca:1.3.3 depends on jtosca:1.3.4-SNAPSHOT,
+                            which must be excluded, and the release version
+                            of jtosca must be pulled in using an additional
+                            dependency, below -->
+                       <exclusions>
+                               <exclusion>
+                                       <groupId>org.onap.sdc.jtosca</groupId>
+                                       <artifactId>jtosca</artifactId>
+                               </exclusion>
+                       </exclusions>
+               </dependency> 
+               <dependency>
+                       <groupId>org.onap.sdc.jtosca</groupId>
+                       <artifactId>jtosca</artifactId>
+                       <version>1.3.4</version>
                </dependency> 
 
                <dependency>
index 669a3cb..32e7d4a 100644 (file)
@@ -15,7 +15,7 @@
        <properties>
                <camunda.version>7.8.0</camunda.version>
                <spring.version>4.3.2.RELEASE</spring.version>
-               <httpclient.version>3.1</httpclient.version>
+               <httpclient.version>4.5.5</httpclient.version>
                <jax.ws.rs>2.0.1</jax.ws.rs>
                <jackson.version>1.1.1</jackson.version>
                <maven.compiler.target>1.8</maven.compiler.target>
                        <artifactId>spring-test</artifactId>
                        <version>4.3.14.RELEASE</version>
                </dependency>
-                <dependency>
-                        <groupId>org.onap.sdc.sdc-tosca</groupId>
-                        <artifactId>sdc-tosca</artifactId>
-                        <version>1.3.3</version>
-                </dependency>
+               <dependency>
+                       <groupId>org.onap.sdc.sdc-tosca</groupId>
+                       <artifactId>sdc-tosca</artifactId>
+                       <version>1.3.3</version>
+                       <!-- sdc-tosca:1.3.3 depends on jtosca:1.3.4-SNAPSHOT,
+                            which must be excluded, and the release version
+                            of jtosca must be pulled in using an additional
+                            dependency, below -->
+                       <exclusions>
+                               <exclusion>
+                                       <groupId>org.onap.sdc.jtosca</groupId>
+                                       <artifactId>jtosca</artifactId>
+                               </exclusion>
+                       </exclusions>
+               </dependency>
+               <dependency>
+                       <groupId>org.onap.sdc.jtosca</groupId>
+                       <artifactId>jtosca</artifactId>
+                       <version>1.3.4</version>
+               </dependency>
                <dependency>
                        <groupId>org.camunda.bpm</groupId>
                        <artifactId>camunda-engine-spring</artifactId>
                        <version>1.6.12</version>
                </dependency>
                <dependency>
-                       <groupId>commons-httpclient</groupId>
-                       <artifactId>commons-httpclient</artifactId>
+                       <groupId>org.apache.httpcomponents</groupId>
+                       <artifactId>httpclient</artifactId>
                        <version>${httpclient.version}</version>
                </dependency>
                <dependency>
                        <artifactId>spring-web</artifactId>
                        <version>${spring.version}</version>
                </dependency>
+               <!-- bwj: duplicated one
                <dependency>
                        <groupId>org.springframework</groupId>
                        <artifactId>spring-test</artifactId>
                        <version>${spring.version}</version>
                </dependency>
+               -->
+               <!-- bwj: added -->
                <dependency>
-                       <groupId>commons-httpclient</groupId>
-                       <artifactId>commons-httpclient</artifactId>
-                       <version>${httpclient.version}</version>
+                       <groupId>com.googlecode.libphonenumber</groupId>
+                       <artifactId>libphonenumber</artifactId>
+                       <version>8.9.1</version>
                </dependency>
                <dependency>
                        <groupId>javax.ws.rs</groupId>
                <dependency>
                        <groupId>org.onap.appc.client</groupId>
                        <artifactId>client-lib</artifactId>
-                       <version>1.3.0-SNAPSHOT</version>
+                       <version>1.3.0</version>
                </dependency>
                <dependency>
                        <groupId>org.onap.appc.client</groupId>
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);
index b143204..ea49176 100644 (file)
@@ -229,7 +229,6 @@ public class VnfAdapterRestV1Test extends WorkflowTest {
        }
 
        @Test
-       @Ignore // 1802 merge
        @Deployment(resources = {
                "subprocess/VnfAdapterRestV1.bpmn"
                })
@@ -261,7 +260,6 @@ public class VnfAdapterRestV1Test extends WorkflowTest {
        }
 
        @Test
-       @Ignore // 1802 merge
        @Deployment(resources = {
                "subprocess/VnfAdapterRestV1.bpmn"
                })
@@ -293,7 +291,6 @@ public class VnfAdapterRestV1Test extends WorkflowTest {
        }
 
        @Test
-       @Ignore // 1802 merge
        @Deployment(resources = {
                "subprocess/VnfAdapterRestV1.bpmn"
                })
@@ -324,7 +321,6 @@ public class VnfAdapterRestV1Test extends WorkflowTest {
                logEnd();
        }
 
-       @Ignore // 1802 merge
        @Test
        @Deployment(resources = {
                "subprocess/VnfAdapterRestV1.bpmn"
@@ -357,7 +353,6 @@ public class VnfAdapterRestV1Test extends WorkflowTest {
        }
 
        @Test
-       @Ignore // 1802 merge
        @Deployment(resources = {
                "subprocess/VnfAdapterRestV1.bpmn"
                })
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")));
+    }
+
+}
index b4aca50..d518ab0 100644 (file)
@@ -80,6 +80,10 @@ public class StubResponseVNFAdapter {
                                .willReturn(aResponse()
                                .withStatus(statusCode)
                                .withHeader("Content-Type", "application/xml")));
+               stubFor(post(urlEqualTo("/vnfs/rest/v1/vnfs/" + vnfId + "/vf-modules" + vfModuleId))
+                               .willReturn(aResponse()
+                               .withStatus(statusCode)
+                               .withHeader("Content-Type", "application/xml")));
        }
        
        public static void mockVNFPut(String vfModuleId, int statusCode) {
@@ -87,6 +91,10 @@ public class StubResponseVNFAdapter {
                                .willReturn(aResponse()
                                .withStatus(statusCode)
                                .withHeader("Content-Type", "application/xml")));
+               stubFor(put(urlEqualTo("/vnfs/rest/v1/vnfs/vnfId/vf-modules" + vfModuleId))
+                               .willReturn(aResponse()
+                               .withStatus(statusCode)
+                               .withHeader("Content-Type", "application/xml")));
        }
        
        public static void mockVNFPut(String vnfId, String vfModuleId, int statusCode) {
@@ -94,6 +102,10 @@ public class StubResponseVNFAdapter {
                                .willReturn(aResponse()
                                .withStatus(statusCode)
                                .withHeader("Content-Type", "application/xml")));
+               stubFor(put(urlEqualTo("/vnfs/rest/v1/vnfs/" + vnfId + "/vf-modules" + vfModuleId))
+                               .willReturn(aResponse()
+                               .withStatus(statusCode)
+                               .withHeader("Content-Type", "application/xml")));
        }
        
        public static void mockVNFDelete(String vnfId, String vfModuleId, int statusCode) {
@@ -101,6 +113,10 @@ public class StubResponseVNFAdapter {
                                .willReturn(aResponse()
                                .withStatus(statusCode)
                                .withHeader("Content-Type", "application/xml")));
+               stubFor(delete(urlEqualTo("/vnfs/rest/v1/vnfs/" + vnfId + "/vf-modules" + vfModuleId))
+                               .willReturn(aResponse()
+                               .withStatus(statusCode)
+                               .withHeader("Content-Type", "application/xml")));
        }
        
        public static void mockVNFRollbackDelete(String vfModuleId, int statusCode) {
@@ -108,6 +124,10 @@ public class StubResponseVNFAdapter {
                                .willReturn(aResponse()
                                .withStatus(statusCode)
                                .withHeader("Content-Type", "application/xml")));
+               stubFor(delete(urlEqualTo("/vnfs/rest/v1/vnfs/vnfId/vf-modules" + vfModuleId + "/rollback"))
+                               .willReturn(aResponse()
+                               .withStatus(statusCode)
+                               .withHeader("Content-Type", "application/xml")));
        }
        
        public static void mockPutVNFVolumeGroup(String volumeGroupId, int statusCode) {
@@ -115,6 +135,10 @@ public class StubResponseVNFAdapter {
                                .willReturn(aResponse()
                                        .withStatus(statusCode)
                                        .withHeader("Content-Type", "application/xml")));
+               stubFor(put(urlEqualTo("/vnfs/rest/v1/volume-groups/" + volumeGroupId))
+                               .willReturn(aResponse()
+                                       .withStatus(statusCode)
+                                       .withHeader("Content-Type", "application/xml")));
        }
        
        public static void mockPutVNFVolumeGroupRollback(String volumeGroupId, int statusCode) {
@@ -122,24 +146,38 @@ public class StubResponseVNFAdapter {
                                .willReturn(aResponse()
                                .withStatus(statusCode)
                                .withHeader("Content-Type", "application/xml")));
+               stubFor(delete(urlMatching("/vnfs/rest/v1/volume-groups/" + volumeGroupId + "/rollback"))
+                               .willReturn(aResponse()
+                               .withStatus(statusCode)
+                               .withHeader("Content-Type", "application/xml")));
        }
        public static void mockPostVNFVolumeGroup(int statusCode) {
                stubFor(post(urlEqualTo("/vnfs/v1/volume-groups"))
                                .willReturn(aResponse()
                                        .withStatus(statusCode)
                                        .withHeader("Content-Type", "application/xml")));
+               stubFor(post(urlEqualTo("/vnfs/rest/v1/volume-groups"))
+                               .willReturn(aResponse()
+                                       .withStatus(statusCode)
+                                       .withHeader("Content-Type", "application/xml")));
        }
        
        public static void mockVNFAdapterRest(String vnfId) {
                stubFor(post(urlEqualTo("/vnfs/v1/vnfs/" + vnfId + "/vf-modules"))
                                .willReturn(aResponse()
                                                .withStatus(200)));
+               stubFor(post(urlEqualTo("/vnfs/rest/v1/vnfs/" + vnfId + "/vf-modules"))
+                               .willReturn(aResponse()
+                                               .withStatus(200)));
        }
 
        public static void mockVNFAdapterRest_500(String vnfId) {
                stubFor(post(urlEqualTo("/vnfs/v1/vnfs/" + vnfId + "/vf-modules"))
                                .willReturn(aResponse()
                                                .withStatus(500)));
+               stubFor(post(urlEqualTo("/vnfs/rest/v1/vnfs/" + vnfId + "/vf-modules"))
+                               .willReturn(aResponse()
+                                               .withStatus(500)));
        }
        
        public static void mockVfModuleDelete(String volumeGroupId) {
@@ -147,6 +185,10 @@ public class StubResponseVNFAdapter {
                                .willReturn(aResponse()
                                .withStatus(202)
                                .withHeader("Content-Type", "application/xml")));
+               stubFor(delete(urlMatching("/vnfs/rest/v1/volume-groups/"+ volumeGroupId))
+                               .willReturn(aResponse()
+                               .withStatus(202)
+                               .withHeader("Content-Type", "application/xml")));
        }
        
        public static void mockVfModuleDelete(String volumeGroupId, int statusCode) {
@@ -154,5 +196,9 @@ public class StubResponseVNFAdapter {
                                .willReturn(aResponse()
                                .withStatus(statusCode)
                                .withHeader("Content-Type", "application/xml")));
+               stubFor(delete(urlMatching("/vnfs/rest/v1/volume-groups/78987"))
+                               .willReturn(aResponse()
+                               .withStatus(statusCode)
+                               .withHeader("Content-Type", "application/xml")));
        }
 }
diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/client/sdnc/sync/CallbackHeaderTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/client/sdnc/sync/CallbackHeaderTest.java
new file mode 100644 (file)
index 0000000..995bb5b
--- /dev/null
@@ -0,0 +1,42 @@
+/*\r
+* ============LICENSE_START=======================================================\r
+* ONAP : SO\r
+* ================================================================================\r
+* Copyright 2018 TechMahindra\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.client.sdnc.sync;\r
+\r
+import static org.junit.Assert.*;\r
+\r
+import org.junit.Test;\r
+\r
+public class CallbackHeaderTest {\r
+       \r
+       CallbackHeader cbh = new CallbackHeader();\r
+       CallbackHeader cbh1 = new CallbackHeader("reqId", "respCode", "respMsg");\r
+\r
+       @Test\r
+       public void testCallbackHeader() {\r
+               cbh.setRequestId("requestId");\r
+               cbh.setResponseCode("responseCode");\r
+               cbh.setResponseMessage("responseMessage");\r
+               assertEquals(cbh.getRequestId(), "requestId");\r
+               assertEquals(cbh.getResponseCode(), "responseCode");\r
+               assertEquals(cbh.getResponseMessage(), "responseMessage");\r
+               assert(cbh.toString()!=null);\r
+       }\r
+\r
+}\r
diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/client/sdnc/sync/ObjectFactoryTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/client/sdnc/sync/ObjectFactoryTest.java
new file mode 100644 (file)
index 0000000..04bc7dc
--- /dev/null
@@ -0,0 +1,39 @@
+/*\r
+* ============LICENSE_START=======================================================\r
+* ONAP : SO\r
+* ================================================================================\r
+* Copyright 2018 TechMahindra\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.client.sdnc.sync;\r
+\r
+import static org.junit.Assert.*;\r
+\r
+import org.junit.Test;\r
+\r
+public class ObjectFactoryTest {\r
+       ObjectFactory of = new ObjectFactory();\r
+\r
+       @Test\r
+       public void testObjectFactory() {\r
+               of.createRequestHeader();\r
+               of.createSDNCAdapterRequest();\r
+               of.createSDNCAdapterResponse();\r
+               \r
+               \r
+       }\r
+\r
+}\r
diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/client/sdnc/sync/RequestHeaderTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/client/sdnc/sync/RequestHeaderTest.java
new file mode 100644 (file)
index 0000000..1d04572
--- /dev/null
@@ -0,0 +1,45 @@
+/*\r
+* ============LICENSE_START=======================================================\r
+* ONAP : SO\r
+* ================================================================================\r
+* Copyright 2018 TechMahindra\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.client.sdnc.sync;\r
+\r
+import static org.junit.Assert.*;\r
+\r
+import org.junit.Test;\r
+\r
+public class RequestHeaderTest {\r
+       RequestHeader rh = new RequestHeader();\r
+\r
+       @Test\r
+       public void testRequestHeader() {\r
+               rh.setRequestId("requestId");\r
+               rh.setSvcInstanceId("svcInstanceId");\r
+               rh.setSvcAction("svcAction");\r
+               rh.setSvcOperation("svcOperation");\r
+               rh.setCallbackUrl("callbackUrl");\r
+               rh.setMsoAction("msoAction");\r
+               assertEquals(rh.getRequestId(), "requestId");\r
+               assertEquals(rh.getSvcInstanceId(), "svcInstanceId");\r
+               assertEquals(rh.getSvcAction(), "svcAction");\r
+               assertEquals(rh.getSvcOperation(), "svcOperation");\r
+               assertEquals(rh.getCallbackUrl(), "callbackUrl");\r
+               assertEquals(rh.getMsoAction(), "msoAction");\r
+               assert(rh.toString()!=null);    \r
+       }\r
+}\r
diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/client/sdnc/sync/RequestTunablesTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/client/sdnc/sync/RequestTunablesTest.java
new file mode 100644 (file)
index 0000000..1219f69
--- /dev/null
@@ -0,0 +1,58 @@
+/*\r
+* ============LICENSE_START=======================================================\r
+* ONAP : SO\r
+* ================================================================================\r
+* Copyright 2018 TechMahindra\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.client.sdnc.sync;\r
+\r
+import static org.junit.Assert.*;\r
+\r
+import org.junit.Test;\r
+import org.openecomp.mso.properties.MsoPropertiesFactory;\r
+\r
+public class RequestTunablesTest {\r
+       MsoPropertiesFactory mpf = new MsoPropertiesFactory();\r
+       \r
+       RequestTunables rt = new RequestTunables("reqId", "msoAction", "operation", "action", mpf);\r
+\r
+       @Test\r
+       public void testRequestTunables() {\r
+               rt.setReqId("reqId");\r
+               rt.setReqMethod("reqMethod");\r
+               rt.setMsoAction("msoAction");\r
+               rt.setAction("action");\r
+               rt.setOperation("operation");\r
+               rt.setSdncUrl("sdncUrl");\r
+               rt.setTimeout("timeout");\r
+               rt.setAsyncInd("asyncInd");\r
+               rt.setHeaderName("headerName");\r
+               rt.setSdncaNotificationUrl("sdncaNotificationUrl");\r
+               rt.setNamespace("namespace");\r
+               assertEquals(rt.getReqId(), "reqId");\r
+               assertEquals(rt.getReqMethod(), "reqMethod");\r
+               assertEquals(rt.getMsoAction(), "msoAction");\r
+               assertEquals(rt.getAction(), "action");\r
+               assertEquals(rt.getOperation(), "operation");\r
+               assertEquals(rt.getSdncUrl(), "sdncUrl");\r
+               assertEquals(rt.getTimeout(), "timeout");\r
+               assertEquals(rt.getAsyncInd(), "asyncInd");\r
+               assertEquals(rt.getHeaderName(), "headerName");\r
+               assertEquals(rt.getSdncaNotificationUrl(), "sdncaNotificationUrl");\r
+               assertEquals(rt.getNamespace(), "namespace");\r
+               assert(rt.toString()!=null);    \r
+       }\r
+}\r
diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/client/sdnc/sync/SDNCAdapterCallbackRequestTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/client/sdnc/sync/SDNCAdapterCallbackRequestTest.java
new file mode 100644 (file)
index 0000000..53fbb0a
--- /dev/null
@@ -0,0 +1,41 @@
+/*\r
+* ============LICENSE_START=======================================================\r
+* ONAP : SO\r
+* ================================================================================\r
+* Copyright 2018 TechMahindra\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.client.sdnc.sync;\r
+\r
+import static org.junit.Assert.*;\r
+\r
+import org.junit.Test;\r
+\r
+public class SDNCAdapterCallbackRequestTest {\r
+       \r
+       SDNCAdapterCallbackRequest sdnccall = new SDNCAdapterCallbackRequest();\r
+       CallbackHeader cbh = new CallbackHeader();\r
+       Object o = new Object();\r
+\r
+       @Test\r
+       public void testSDNCAdapterCallbackRequest() {\r
+               sdnccall.setCallbackHeader(cbh);\r
+               sdnccall.setRequestData(o);\r
+               assertEquals(sdnccall.getCallbackHeader(), cbh);\r
+               assertEquals(sdnccall.getRequestData(), o);\r
+               assert(sdnccall.toString()!=null);      \r
+       }\r
+\r
+}\r
diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/client/sdnc/sync/SDNCAdapterRequestTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/client/sdnc/sync/SDNCAdapterRequestTest.java
new file mode 100644 (file)
index 0000000..6b10f25
--- /dev/null
@@ -0,0 +1,39 @@
+/*\r
+* ============LICENSE_START=======================================================\r
+* ONAP : SO\r
+* ================================================================================\r
+* Copyright 2018 TechMahindra\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.client.sdnc.sync;\r
+\r
+import static org.junit.Assert.*;\r
+\r
+import org.junit.Test;\r
+\r
+public class SDNCAdapterRequestTest {\r
+       \r
+       SDNCAdapterRequest adapter = new SDNCAdapterRequest();\r
+       RequestHeader rh = new RequestHeader();\r
+       Object o = new Object();\r
+\r
+       @Test\r
+       public void testSDNCAdapterRequest() {\r
+               adapter.setRequestHeader(rh);\r
+               adapter.setRequestData(o);\r
+               assertEquals(adapter.getRequestHeader(), rh);\r
+               assertEquals(adapter.getRequestData(), o);\r
+               }\r
+}\r
diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/client/sdnc/sync/SDNCResponseTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/client/sdnc/sync/SDNCResponseTest.java
new file mode 100644 (file)
index 0000000..d8c2324
--- /dev/null
@@ -0,0 +1,43 @@
+/*\r
+* ============LICENSE_START=======================================================\r
+* ONAP : SO\r
+* ================================================================================\r
+* Copyright 2018 TechMahindra\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.client.sdnc.sync;\r
+\r
+import static org.junit.Assert.*;\r
+\r
+import org.junit.Test;\r
+\r
+public class SDNCResponseTest {\r
+       \r
+       SDNCResponse sdnc = new SDNCResponse("reqId");\r
+       SDNCResponse sdnc1 = new SDNCResponse("reqId", 0, "respMsg");\r
+\r
+       @Test\r
+       public void testSDNCResponse() {\r
+               sdnc.setReqId("reqId");\r
+               sdnc.setRespCode(0);\r
+               sdnc.setRespMsg("respMsg");\r
+               sdnc.setSdncResp("sdncResp");\r
+               assertEquals(sdnc.getReqId(), "reqId");\r
+               assertEquals(sdnc.getRespCode(), 0);\r
+               assertEquals(sdnc.getRespMsg(), "respMsg");\r
+               assertEquals(sdnc.getSdncResp(), "sdncResp");\r
+               assert(sdnc.toString()!= null); \r
+       }\r
+}\r
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 1125386..e643409 100644 (file)
                        <artifactId>libphonenumber</artifactId>
                        <version>8.9.1</version>
                </dependency>
-
+               <dependency>
+                       <groupId>ch.qos.logback</groupId>
+                       <artifactId>logback-classic</artifactId>
+                       <version>1.2.3</version>
+               </dependency>
+               <dependency>
+                       <groupId>ch.qos.logback</groupId>
+                       <artifactId>logback-core</artifactId>
+                       <version>1.2.3</version>
+               </dependency>
+               <dependency>
+                       <groupId>org.slf4j</groupId>
+                       <artifactId>slf4j-api</artifactId>
+               </dependency>
        </dependencies>
 </project>
diff --git a/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/CompareModelofE2EServiceInstance.groovy b/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/CompareModelofE2EServiceInstance.groovy
new file mode 100644 (file)
index 0000000..c70c971
--- /dev/null
@@ -0,0 +1,261 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2018 Huawei Technologies Co., Ltd. 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.infrastructure.scripts;
+
+import static org.apache.commons.lang3.StringUtils.*;
+import groovy.xml.XmlUtil
+import groovy.json.*
+
+import org.openecomp.mso.bpmn.core.domain.ServiceDecomposition
+import org.openecomp.mso.bpmn.core.domain.ServiceInstance
+import org.openecomp.mso.bpmn.core.domain.CompareModelsResult
+import org.openecomp.mso.bpmn.core.domain.ModelInfo
+import org.openecomp.mso.bpmn.core.json.JsonUtils
+import org.openecomp.mso.bpmn.common.scripts.AaiUtil
+import org.openecomp.mso.bpmn.common.scripts.AbstractServiceTaskProcessor
+import org.openecomp.mso.bpmn.common.scripts.ExceptionUtil
+import org.openecomp.mso.bpmn.common.scripts.SDNCAdapterUtils
+import org.openecomp.mso.bpmn.common.scripts.VidUtils
+import org.openecomp.mso.bpmn.core.RollbackData
+import org.openecomp.mso.bpmn.core.WorkflowException
+import org.openecomp.mso.rest.APIResponse;
+import org.openecomp.mso.rest.RESTClient
+import org.openecomp.mso.rest.RESTConfig
+
+import java.util.UUID;
+import javax.xml.parsers.DocumentBuilder
+import javax.xml.parsers.DocumentBuilderFactory
+
+import org.camunda.bpm.engine.delegate.BpmnError
+import org.camunda.bpm.engine.delegate.DelegateExecution
+import org.json.JSONObject;
+import org.json.JSONArray;
+import org.apache.commons.lang3.*
+import org.apache.commons.codec.binary.Base64;
+import org.springframework.web.util.UriUtils;
+
+import org.w3c.dom.Document
+import org.w3c.dom.Element
+import org.w3c.dom.Node
+import org.w3c.dom.NodeList
+import org.xml.sax.InputSource
+/**
+ * This groovy class supports the <class>CompareModelofE2EServiceInstance.bpmn</class> process.
+ *
+ * Inputs:
+ * @param - msoRequestId
+ * @param - globalSubscriberId
+ * @param - subscriptionServiceType
+ * @param - serviceInstanceId
+ * @param - modelInvariantIdTarget
+ * @param - modelVersionIdTarget
+
+ *
+ * Outputs:
+ * @param - WorkflowException
+ */
+public class CompareModelofE2EServiceInstance extends AbstractServiceTaskProcessor {
+
+       String Prefix="CMPMDSI_"
+       private static final String DebugFlag = "isDebugEnabled"
+       
+       ExceptionUtil exceptionUtil = new ExceptionUtil()
+       JsonUtils jsonUtil = new JsonUtils()
+       VidUtils vidUtils = new VidUtils()
+
+       public void preProcessRequest (DelegateExecution execution) {
+               def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
+               execution.setVariable("prefix",Prefix)
+               String msg = ""
+               
+               utils.log("INFO", " *** preProcessRequest Request *** ", isDebugEnabled)
+       
+               try {
+                       // check for incoming json message/input
+                       String siRequest = execution.getVariable("bpmnRequest")
+                       utils.logAudit(siRequest)
+                       
+       
+                       String requestId = execution.getVariable("mso-request-id")
+                       execution.setVariable("msoRequestId", requestId)
+                       utils.log("INFO", "Input Request:" + siRequest + " reqId:" + requestId, isDebugEnabled)
+                       
+                       String serviceInstanceId = execution.getVariable("serviceInstanceId")
+                       if (isBlank(serviceInstanceId)) {
+                               msg = "Input serviceInstanceId' is null"
+                               exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
+                       }       
+
+                       /*
+                        * Extracting User Parameters from incoming Request and converting into a Map
+                        */
+                       def jsonSlurper = new JsonSlurper()
+                       def jsonOutput = new JsonOutput()
+       
+                       Map reqMap = jsonSlurper.parseText(siRequest)
+       
+                       //InputParams
+                       def userParams = reqMap.requestDetails?.requestParameters?.userParams
+       
+                       Map<String, String> inputMap = [:]
+                       if (userParams) {
+                               userParams.each {
+                                       userParam -> inputMap.put(userParam.name, userParam.value.toString())
+                               }
+                       }
+                       execution.setVariable("operationType", "CompareModel") 
+                       
+                       utils.log("DEBUG", "User Input Parameters map: " + userParams.toString(), isDebugEnabled)
+                       execution.setVariable("serviceInputParams", inputMap)
+       
+               } catch (BpmnError e) {
+                       throw e;
+               } catch (Exception ex){
+                       msg = "Exception in preProcessRequest " + ex.getMessage()
+                       utils.log("INFO", msg, isDebugEnabled)
+                       exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
+               }
+               utils.log("INFO"," ***** Exit preProcessRequest *****",  isDebugEnabled)
+       }
+
+       public void sendSyncResponse (DelegateExecution execution) {
+               def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
+               utils.log("INFO", " *** sendSyncResponse  *** ", isDebugEnabled)
+
+               try {
+                       CompareModelsResult compareModelsResult = execution.getVariable("compareModelsResult")
+                       
+                       // RESTResponse (for API Handler(APIH) Reply Task)
+                       String syncResponse = compareModelsResult.toString()
+                       utils.log("INFO", " sendSynchResponse: xmlSyncResponse - " + "\n" + syncResponse, isDebugEnabled)
+                       sendWorkflowResponse(execution, 202, syncResponse)
+
+               } catch (Exception ex) {
+                       String msg  = "Exception in sendSyncResponse: " + ex.getMessage()
+                       exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
+               }
+               utils.log("INFO"," ***** Exit sendSyncResopnse *****",  isDebugEnabled)
+       }
+       
+       public void sendSyncError (DelegateExecution execution) {
+               def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
+               utils.log("INFO", " *** sendSyncError *** ", isDebugEnabled)
+
+               try {
+                       String errorMessage = ""
+                       if (execution.getVariable("WorkflowException") instanceof WorkflowException) {
+                               WorkflowException wfe = execution.getVariable("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("INFO", " Sending Sync Error Activity Failed. " + "\n" + ex.getMessage(), isDebugEnabled)
+               }
+
+       }
+       
+       public void prepareCompletionRequest (DelegateExecution execution) {
+               def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
+               utils.log("INFO", " *** prepareCompletion *** ", isDebugEnabled)
+
+               try {
+                       String requestId = execution.getVariable("msoRequestId")
+                       String source = execution.getVariable("source")
+                       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>COMPAREMODEL</action>
+                                                       <source>${source}</source>
+                                               </request-info>
+                                               <aetgt:status-message>E2E Service Instance Compare model successfully.</aetgt:status-message>
+                                               <aetgt:mso-bpel-name>CompareModelofE2EServiceInstance</aetgt:mso-bpel-name>
+                                       </aetgt:MsoCompletionRequest>"""
+
+                       // Format Response
+                       String xmlMsoCompletionRequest = utils.formatXml(msoCompletionRequest)
+
+                       execution.setVariable("completionRequest", xmlMsoCompletionRequest)
+                       utils.log("INFO", " Overall SUCCESS Response going to CompleteMsoProcess - " + "\n" + xmlMsoCompletionRequest, isDebugEnabled)
+
+               } catch (Exception ex) {
+                       String msg = " Exception in prepareCompletion:" + ex.getMessage()
+                       utils.log("INFO", msg, isDebugEnabled)
+                       exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
+               }
+               utils.log("INFO", "*** Exit prepareCompletionRequest ***", isDebugEnabled)
+       }
+       
+       public void prepareFalloutRequest(DelegateExecution execution){
+               def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
+               utils.log("INFO", " *** prepareFalloutRequest *** ", isDebugEnabled)
+
+               try {
+                       WorkflowException wfex = execution.getVariable("WorkflowException")
+                       utils.log("INFO", " Input Workflow Exception: " + wfex.toString(), isDebugEnabled)
+                       String requestId = execution.getVariable("msoRequestId")
+                       String source = execution.getVariable("source")
+                       String requestInfo =
+                       """<request-info xmlns="http://org.openecomp/mso/infra/vnf-request/v1">
+                                       <request-id>${requestId}</request-id>
+                                       <action>COMPAREMODEL</action>
+                                       <source>${source}</source>
+                                  </request-info>"""
+
+                       String falloutRequest = exceptionUtil.processMainflowsBPMNException(execution, requestInfo)
+                       execution.setVariable("falloutRequest", falloutRequest)
+               } catch (Exception ex) {
+                       utils.log("INFO", "Exception prepareFalloutRequest:" + ex.getMessage(), isDebugEnabled)
+                       String errorException = "  Bpmn error encountered in CompareModelofE2EServiceInstance flow. FalloutHandlerRequest,  buildErrorResponse() - " + ex.getMessage()
+                       String requestId = execution.getVariable("msoRequestId")
+                       String falloutRequest =
+                       """<aetgt:FalloutHandlerRequest xmlns:aetgt="http://org.openecomp/mso/workflow/schema/v1"
+                                                                    xmlns:ns="http://org.openecomp/mso/request/types/v1"
+                                                                    xmlns:wfsch="http://org.openecomp/mso/workflow/schema/v1">
+                                          <request-info xmlns="http://org.openecomp/mso/infra/vnf-request/v1">
+                                             <request-id>${requestId}</request-id>
+                                             <action>COMPAREMODEL</action>
+                                             <source>UUI</source>
+                                          </request-info>
+                                               <aetgt:WorkflowException xmlns:aetgt="http://org.openecomp/mso/workflow/schema/v1">
+                                                       <aetgt:ErrorMessage>${errorException}</aetgt:ErrorMessage>
+                                                       <aetgt:ErrorCode>7000</aetgt:ErrorCode>
+                                               </aetgt:WorkflowException>
+                                       </aetgt:FalloutHandlerRequest>"""
+
+                       execution.setVariable("falloutRequest", falloutRequest)
+               }
+               utils.log("INFO", "*** Exit prepareFalloutRequest ***", isDebugEnabled)
+       }
+
+}
+       
diff --git a/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/DoCompareModelofE2EServiceInstance.groovy b/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/DoCompareModelofE2EServiceInstance.groovy
new file mode 100644 (file)
index 0000000..30db8c5
--- /dev/null
@@ -0,0 +1,260 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2018 Huawei Technologies Co., Ltd. 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.infrastructure.scripts;
+
+import static org.apache.commons.lang3.StringUtils.*;
+import groovy.xml.XmlUtil
+import groovy.json.*
+
+import org.openecomp.mso.bpmn.core.domain.ServiceDecomposition
+import org.openecomp.mso.bpmn.core.domain.ServiceInstance
+import org.openecomp.mso.bpmn.core.domain.ModelInfo
+import org.openecomp.mso.bpmn.core.domain.Resource
+import org.openecomp.mso.bpmn.core.domain.CompareModelsResult
+import org.openecomp.mso.bpmn.core.domain.ResourceModelInfo
+import org.openecomp.mso.bpmn.core.json.JsonUtils
+import org.openecomp.mso.bpmn.common.scripts.AaiUtil
+import org.openecomp.mso.bpmn.common.scripts.AbstractServiceTaskProcessor
+import org.openecomp.mso.bpmn.common.scripts.ExceptionUtil
+import org.openecomp.mso.bpmn.common.scripts.SDNCAdapterUtils
+import org.openecomp.mso.bpmn.core.RollbackData
+import org.openecomp.mso.bpmn.core.WorkflowException
+import org.openecomp.mso.rest.APIResponse;
+import org.openecomp.mso.rest.RESTClient
+import org.openecomp.mso.rest.RESTConfig
+
+
+import java.util.List
+import java.util.Map
+import java.util.UUID;
+import javax.xml.parsers.DocumentBuilder
+import javax.xml.parsers.DocumentBuilderFactory
+
+import org.camunda.bpm.engine.delegate.BpmnError
+import org.camunda.bpm.engine.delegate.DelegateExecution
+import org.json.JSONObject;
+import org.json.JSONArray;
+import org.apache.commons.lang3.*
+import org.apache.commons.codec.binary.Base64;
+import org.springframework.web.util.UriUtils;
+
+import org.w3c.dom.Document
+import org.w3c.dom.Element
+import org.w3c.dom.Node
+import org.w3c.dom.NodeList
+import org.xml.sax.InputSource
+/**
+ * This groovy class supports the <class>DoCompareModelofE2EServiceInstance.bpmn</class> process.
+ *
+ * Inputs:
+ * @param - msoRequestId
+ * @param - globalSubscriberId
+ * @param - subscriptionServiceType
+ * @param - serviceInstanceId
+ * @param - modelInvariantIdTarget
+ * @param - modelVersionIdTarget
+ *
+ * Outputs:
+ * @param - compareModelsResult CompareModelsResult
+
+ */
+public class DoCompareModelofE2EServiceInstance extends AbstractServiceTaskProcessor {
+
+       String Prefix="DCMPMDSI_"
+       private static final String DebugFlag = "isDebugEnabled"
+       
+       ExceptionUtil exceptionUtil = new ExceptionUtil()
+       JsonUtils jsonUtil = new JsonUtils()
+
+       public void preProcessRequest (DelegateExecution execution) {
+               execution.setVariable("isDebugLogEnabled","true")
+
+               def method = getClass().getSimpleName() + '.preProcessRequest(' +'execution=' + execution.getId() +')'
+               def isDebugEnabled = execution.getVariable("isDebugLogEnabled")
+               utils.log("INFO","Entered " + method, isDebugEnabled)
+               String msg = ""
+               utils.log("INFO"," ***** Enter CompareModelofE2EServiceInstance preProcessRequest *****",  isDebugEnabled)
+
+               execution.setVariable("prefix", Prefix)
+               //Inputs
+               
+               //subscriberInfo. for AAI GET
+               String globalSubscriberId = execution.getVariable("globalSubscriberId")
+               utils.log("INFO"," ***** globalSubscriberId *****" + globalSubscriberId,  isDebugEnabled)
+               
+               String serviceType = execution.getVariable("serviceType")
+               utils.log("INFO"," ***** serviceType *****" + serviceType,  isDebugEnabled)
+
+               if (isBlank(globalSubscriberId)) {
+                       msg = "Input globalSubscriberId is null"
+                       utils.log("INFO", msg, isDebugEnabled)
+                       exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
+               }
+
+               if (isBlank(serviceType)) {
+                       msg = "Input serviceType is null"
+                       utils.log("INFO", msg, isDebugEnabled)
+                       exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
+               }
+
+               String serviceInstanceId = execution.getVariable("serviceInstanceId")
+               if (isBlank(serviceInstanceId)){
+                       msg = "Input serviceInstanceId is null"
+                       utils.log("INFO", msg, isDebugEnabled)
+                       exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
+               }
+
+               String modelInvariantUuid = execution.getVariable('modelInvariantIdTarget')
+               if (isBlank(modelInvariantUuid)){
+                       msg = "Input modelInvariantUuid is null"
+                       utils.log("INFO", msg, isDebugEnabled)
+                       exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
+               }
+
+               String modelUuid = execution.getVariable('modelVersionIdTarget')
+               if (isBlank(modelUuid)){
+                       msg = "Input modelUuid is null"
+                       utils.log("INFO", msg, isDebugEnabled)
+                       exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
+               }
+
+               // Set Target Template info
+               execution.setVariable("model-invariant-id-target", modelInvariantUuid)
+               execution.setVariable("model-version-id-target", modelUuid)
+
+
+               utils.log("INFO", "Exited " + method, isDebugEnabled)
+       }
+       
+       public void postProcessAAIGET(DelegateExecution execution) {
+               def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
+               utils.log("INFO"," ***** postProcessAAIGET ***** ", isDebugEnabled)
+               String msg = ""
+
+               try {
+                       String serviceInstanceId = execution.getVariable("serviceInstanceId")
+                       boolean foundInAAI = execution.getVariable("GENGS_FoundIndicator")
+                       String serviceType = ""
+
+                       if(foundInAAI){
+                               utils.log("INFO","Found Service-instance in AAI", isDebugEnabled)
+
+                               String siData = execution.getVariable("GENGS_service")
+                               utils.log("INFO", "SI Data", isDebugEnabled)
+                               if (isBlank(siData))
+                               {
+                                       msg = "Could not retrive ServiceInstance data from AAI, Id:" + serviceInstanceId
+                                       utils.log("INFO", msg, isDebugEnabled)
+                                       exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
+                               }
+                               else
+                               {
+                                       utils.log("INFO", "SI Data" + siData, isDebugEnabled)
+                                       
+                                       // Get Template uuid and version
+                                       if (utils.nodeExists(siData, "model-invariant-id") && utils.nodeExists(siData, "model-version-id") ) {
+                                           utils.log("INFO", "SI Data model-invariant-id and model-version-id exist", isDebugEnabled)
+                                               
+                                           def modelInvariantId  = utils.getNodeText1(siData, "model-invariant-id")
+                                           def modelVersionId  = utils.getNodeText1(siData, "model-version-id")
+                                           
+                                           // Set Original Template info
+                                           execution.setVariable("model-invariant-id-original", modelInvariantId)
+                                           execution.setVariable("model-version-id-original", modelVersionId)                                  
+                                       }                                       
+                               }
+                       }else{
+                               boolean succInAAI = execution.getVariable("GENGS_SuccessIndicator")
+                               if(!succInAAI){
+                                       utils.log("INFO","Error getting Service-instance from AAI", + serviceInstanceId, isDebugEnabled)
+                                       WorkflowException workflowException = execution.getVariable("WorkflowException")
+                                       utils.logAudit("workflowException: " + workflowException)
+                                       if(workflowException != null){
+                                               exceptionUtil.buildAndThrowWorkflowException(execution, workflowException.getErrorCode(), workflowException.getErrorMessage())
+                                       }
+                                       else
+                                       {
+                                               msg = "Failure in postProcessAAIGET GENGS_SuccessIndicator:" + succInAAI
+                                               utils.log("INFO", msg, isDebugEnabled)
+                                               exceptionUtil.buildAndThrowWorkflowException(execution, 2500, msg)
+                                       }
+                               }
+
+                               utils.log("INFO","Service-instance NOT found in AAI. Silent Success", isDebugEnabled)
+                       }
+               }catch (BpmnError e) {
+                       throw e;
+               } catch (Exception ex) {
+                       msg = "Exception in DoDeleteE2EServiceInstance.postProcessAAIGET. " + ex.getMessage()
+                       utils.log("INFO", msg, isDebugEnabled)
+                       exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
+               }
+               utils.log("INFO"," *** Exit postProcessAAIGET *** ", isDebugEnabled)
+       }
+
+       public void postCompareModelVersions(DelegateExecution execution) {
+               def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
+
+                               
+               List<Resource> addResourceList = execution.getVariable("addResourceList")
+               List<Resource> delResourceList = execution.getVariable("delResourceList")
+               
+               CompareModelsResult cmpResult = new CompareModelsResult()
+               List<ResourceModelInfo> addedResourceList = new ArrayList<ResourceModelInfo>()
+               List<ResourceModelInfo> deletedResourceList = new ArrayList<ResourceModelInfo>()
+               
+               
+               String serviceModelUuid = execution.getVariable("model-version-id-target")
+        List<String> requestInputs = new ArrayList<String>()
+               ModelInfo mi = null;
+               for(Resource rc : addResourceList) {
+                       mi = rc.getModelInfo()
+                       String resourceCustomizationUuid = mi.getModelCustomizationUuid()
+                       ResourceModelInfo rmodel = new ResourceModelInfo()
+                       rmodel.setResourceName(mi.getModelName())
+                       rmodel.setResourceInvariantUuid(mi.getModelInvariantUuid())
+                       rmodel.setResourceUuid(mi.getModelUuid())
+                       rmodel.setResourceCustomizationUuid(resourceCustomizationUuid)
+                       addedResourceList.add(rmodel)
+                       
+                       Map<String, Object> resourceParameters = ResourceRequestBuilder.buildResouceRequest(serviceModelUuid, resourceCustomizationUuid, null)
+                       requestInputs.addAll(resourceParameters.keySet())                       
+               }
+               
+               for(Resource rc : deletedResourceList) {
+                       mi = rc.getModelInfo()
+                       String resourceCustomizationUuid = mi.getModelCustomizationUuid()
+                       ResourceModelInfo rmodel = new ResourceModelInfo()
+                       rmodel.setResourceName(mi.getModelName())
+                       rmodel.setResourceInvariantUuid(mi.getModelInvariantUuid())
+                       rmodel.setResourceUuid(mi.getModelUuid())
+                       rmodel.setResourceCustomizationUuid(resourceCustomizationUuid)
+                       deletedResourceList.add(rmodel)                 
+               }
+               
+               cmpResult.setAddedResourceList(addedResourceList)
+               cmpResult.setDeletedResourceList(deletedResourceList)
+               cmpResult.setRequestInputs(requestInputs)       
+
+               execution.setVariable("compareModelsResult", cmpResult)
+       }
+       
+}
+       
index 47ad795..a58ab9b 100644 (file)
@@ -411,8 +411,8 @@ public class DoCreateE2EServiceInstance extends AbstractServiceTaskProcessor {
             ServiceDecomposition serviceDecomposition = execution.getVariable("serviceDecomposition")
             List<Resource>  resourceList = serviceDecomposition.getServiceResources()
             
-            for(String resource : resourceList){
-                    resourceTemplateUUIDs  = resourceTemplateUUIDs + resource.getModelInfo().getModelCustomizationUuid() + ":"                            
+            for(Resource resource : resourceList){
+                    resourceTemplateUUIDs  = resourceTemplateUUIDs + resource.getModelInfo().getModelCustomizationUuid() + ":"
             }           
 
             def dbAdapterEndpoint = "http://mso.mso.testlab.openecomp.org:8080/dbadapters/RequestsDbAdapter"
@@ -425,13 +425,13 @@ public class DoCreateE2EServiceInstance extends AbstractServiceTaskProcessor {
                         <soapenv:Header/>
                         <soapenv:Body>
                             <ns:initResourceOperationStatus xmlns:ns="http://org.openecomp.mso/requestsdb">
-                            <serviceId>${serviceId}</serviceId>
-                            <operationId>${operationId}</operationId>
-                            <operationType>${operationType}</operationType>
-                            <resourceTemplateUUIDs>${resourceTemplateUUIDs}</resourceTemplateUUIDs>
-                        </ns:initResourceOperationStatus>
-                    </soapenv:Body>
-                </soapenv:Envelope>"""
+                                                               <serviceId>${serviceId}</serviceId>
+                                                               <operationId>${operationId}</operationId>
+                                                               <operationType>${operationType}</operationType>
+                                                               <resourceTemplateUUIDs>${resourceTemplateUUIDs}</resourceTemplateUUIDs>
+                            </ns:initResourceOperationStatus>
+                       </soapenv:Body>
+                       </soapenv:Envelope>"""
 
             payload = utils.formatXml(payload)
             execution.setVariable("CVFMI_initResOperStatusRequest", payload)
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 e7a88be..3071d1c 100644 (file)
@@ -114,7 +114,7 @@ csi.sendSyncError(execution)]]></bpmn:script>
       <bpmn:sequenceFlow id="SequenceFlow_01umodj" sourceRef="ScriptTask_0u8o9p2" targetRef="CallActivity_1ang7q8" />
     </bpmn:subProcess>
     <bpmn:scriptTask id="ScriptTask_0xupxj9" name="Send Sync Ack Response" scriptFormat="groovy">
-      <bpmn:incoming>SequenceFlow_0z4faf9</bpmn:incoming>
+      <bpmn:incoming>SequenceFlow_1853xxi</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_19eilro</bpmn:outgoing>
       <bpmn:script><![CDATA[import org.openecomp.mso.bpmn.infrastructure.scripts.*\r
 def csi = new  UpdateCustomE2EServiceInstance()\r
@@ -133,7 +133,7 @@ csi.sendSyncResponse(execution)]]></bpmn:script>
     <bpmn:sequenceFlow id="SequenceFlow_19eilro" sourceRef="ScriptTask_0xupxj9" targetRef="DoUpdateE2EServiceInstance" />
     <bpmn:sequenceFlow id="SequenceFlow_0klbpxx" sourceRef="DoUpdateE2EServiceInstance" targetRef="ExclusiveGateway_0aqn64l" />
     <bpmn:sequenceFlow id="SequenceFlow_0yayvrf" sourceRef="CallActivity_02fyxz0" targetRef="EndEvent_0bpd6c0" />
-    <bpmn:sequenceFlow id="SequenceFlow_0z4faf9" sourceRef="ScriptTask_1s09c7d" targetRef="ScriptTask_0xupxj9" />
+    <bpmn:sequenceFlow id="SequenceFlow_0z4faf9" sourceRef="ScriptTask_1s09c7d" targetRef="ScriptTask_09rx901" />
     <bpmn:sequenceFlow id="SequenceFlow_14zu6wr" name="yes" sourceRef="ExclusiveGateway_0aqn64l" targetRef="ScriptTask_0ttvn8r">
       <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression"><![CDATA[#{execution.getVariable("WorkflowException") == null}]]></bpmn:conditionExpression>
     </bpmn:sequenceFlow>
@@ -141,6 +141,37 @@ csi.sendSyncResponse(execution)]]></bpmn:script>
     <bpmn:sequenceFlow id="SequenceFlow_1fueo69" name="no" sourceRef="ExclusiveGateway_0aqn64l" targetRef="EndEvent_07uk5iy">
       <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression"><![CDATA[#{execution.getVariable("WorkflowException") != null}]]></bpmn:conditionExpression>
     </bpmn:sequenceFlow>
+    <bpmn:scriptTask id="ScriptTask_09rx901" name="Init Service Operation Status" scriptFormat="groovy">
+      <bpmn:incoming>SequenceFlow_0z4faf9</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0utlsnd</bpmn:outgoing>
+      <bpmn:script><![CDATA[import org.openecomp.mso.bpmn.infrastructure.scripts.*
+def csi= new UpdateCustomE2EServiceInstance()
+csi.prepareInitServiceOperationStatus(execution)]]></bpmn:script>
+    </bpmn:scriptTask>
+    <bpmn:serviceTask id="ServiceTask_0mr5k9q" name="Update Service Operation Status">
+      <bpmn:extensionElements>
+        <camunda:connector>
+          <camunda:inputOutput>
+            <camunda:inputParameter name="url">${CVFMI_dbAdapterEndpoint}</camunda:inputParameter>
+            <camunda:inputParameter name="headers">
+              <camunda:map>
+                <camunda:entry key="content-type">application/soap+xml</camunda:entry>
+                <camunda:entry key="Authorization">Basic QlBFTENsaWVudDpwYXNzd29yZDEk</camunda:entry>
+              </camunda:map>
+            </camunda:inputParameter>
+            <camunda:inputParameter name="payload">${CVFMI_updateServiceOperStatusRequest}</camunda:inputParameter>
+            <camunda:inputParameter name="method">POST</camunda:inputParameter>
+            <camunda:outputParameter name="CVFMI_dbResponseCode">${statusCode}</camunda:outputParameter>
+            <camunda:outputParameter name="CVFMI_dbResponse">${response}</camunda:outputParameter>
+          </camunda:inputOutput>
+          <camunda:connectorId>http-connector</camunda:connectorId>
+        </camunda:connector>
+      </bpmn:extensionElements>
+      <bpmn:incoming>SequenceFlow_0utlsnd</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_1853xxi</bpmn:outgoing>
+    </bpmn:serviceTask>
+    <bpmn:sequenceFlow id="SequenceFlow_0utlsnd" sourceRef="ScriptTask_09rx901" targetRef="ServiceTask_0mr5k9q" />
+    <bpmn:sequenceFlow id="SequenceFlow_1853xxi" sourceRef="ServiceTask_0mr5k9q" targetRef="ScriptTask_0xupxj9" />
   </bpmn:process>
   <bpmn:error id="Error_0nbdy47" name="MSOWorkflowException" errorCode="MSOWorkflowException" />
   <bpmndi:BPMNDiagram id="BPMNDiagram_1">
@@ -155,7 +186,7 @@ csi.sendSyncResponse(execution)]]></bpmn:script>
         <dc:Bounds x="463" y="632" width="394" height="188" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="CallActivity_0rhljy8_di" bpmnElement="DoUpdateE2EServiceInstance">
-        <dc:Bounds x="717" y="158" width="100" height="80" />
+        <dc:Bounds x="767" y="158" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="EndEvent_0bpd6c0_di" bpmnElement="EndEvent_0bpd6c0">
         <dc:Bounds x="1258" y="286" width="36" height="36" />
@@ -164,10 +195,10 @@ csi.sendSyncResponse(execution)]]></bpmn:script>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ScriptTask_1s09c7d_di" bpmnElement="ScriptTask_1s09c7d">
-        <dc:Bounds x="214" y="158" width="100" height="80" />
+        <dc:Bounds x="105" y="158" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ScriptTask_0ttvn8r_di" bpmnElement="ScriptTask_0ttvn8r">
-        <dc:Bounds x="1038" y="158" width="100" height="80" />
+        <dc:Bounds x="1073" y="158" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="CallActivity_02fyxz0_di" bpmnElement="CallActivity_02fyxz0">
         <dc:Bounds x="1226" y="158" width="100" height="80" />
@@ -176,39 +207,39 @@ csi.sendSyncResponse(execution)]]></bpmn:script>
         <dc:Bounds x="348" y="370" width="679" height="194" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ScriptTask_0xupxj9_di" bpmnElement="ScriptTask_0xupxj9">
-        <dc:Bounds x="459" y="158" width="100" height="80" />
+        <dc:Bounds x="600" y="158" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ExclusiveGateway_0aqn64l_di" bpmnElement="ExclusiveGateway_0aqn64l" isMarkerVisible="true">
-        <dc:Bounds x="903" y="173" width="50" height="50" />
+        <dc:Bounds x="942" y="173" width="50" height="50" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="903" y="145" width="50" height="12" />
+          <dc:Bounds x="943" y="145" width="49" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="EndEvent_07uk5iy_di" bpmnElement="EndEvent_07uk5iy">
-        <dc:Bounds x="910" y="286" width="36" height="36" />
+        <dc:Bounds x="949" y="286" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="883" y="322" width="0" height="12" />
+          <dc:Bounds x="877" y="322" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0s2spoq_di" bpmnElement="SequenceFlow_0s2spoq">
         <di:waypoint xsi:type="dc:Point" x="30" y="198" />
-        <di:waypoint xsi:type="dc:Point" x="214" y="198" />
+        <di:waypoint xsi:type="dc:Point" x="105" y="198" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="77" y="177" width="90" height="12" />
+          <dc:Bounds x="22.5" y="177" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_19eilro_di" bpmnElement="SequenceFlow_19eilro">
-        <di:waypoint xsi:type="dc:Point" x="559" y="198" />
-        <di:waypoint xsi:type="dc:Point" x="717" y="198" />
+        <di:waypoint xsi:type="dc:Point" x="700" y="198" />
+        <di:waypoint xsi:type="dc:Point" x="767" y="198" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="593" y="177" width="90" height="12" />
+          <dc:Bounds x="688.5" y="177" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0klbpxx_di" bpmnElement="SequenceFlow_0klbpxx">
-        <di:waypoint xsi:type="dc:Point" x="817" y="198" />
-        <di:waypoint xsi:type="dc:Point" x="903" y="198" />
+        <di:waypoint xsi:type="dc:Point" x="867" y="198" />
+        <di:waypoint xsi:type="dc:Point" x="942" y="198" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="815" y="177" width="90" height="12" />
+          <dc:Bounds x="859.5" y="177" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0yayvrf_di" bpmnElement="SequenceFlow_0yayvrf">
@@ -219,35 +250,33 @@ csi.sendSyncResponse(execution)]]></bpmn:script>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0z4faf9_di" bpmnElement="SequenceFlow_0z4faf9">
-        <di:waypoint xsi:type="dc:Point" x="314" y="198" />
-        <di:waypoint xsi:type="dc:Point" x="459" y="198" />
+        <di:waypoint xsi:type="dc:Point" x="205" y="198" />
+        <di:waypoint xsi:type="dc:Point" x="274" y="198" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="341.5" y="177" width="90" height="12" />
+          <dc:Bounds x="194.5" y="177" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_14zu6wr_di" bpmnElement="SequenceFlow_14zu6wr">
-        <di:waypoint xsi:type="dc:Point" x="953" y="198" />
-        <di:waypoint xsi:type="dc:Point" x="990" y="198" />
-        <di:waypoint xsi:type="dc:Point" x="990" y="198" />
-        <di:waypoint xsi:type="dc:Point" x="1038" y="198" />
+        <di:waypoint xsi:type="dc:Point" x="992" y="198" />
+        <di:waypoint xsi:type="dc:Point" x="1073" y="198" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="987" y="195" width="20" height="12" />
+          <dc:Bounds x="1023.5062499999999" y="195" width="19" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0je30si_di" bpmnElement="SequenceFlow_0je30si">
-        <di:waypoint xsi:type="dc:Point" x="1138" y="198" />
+        <di:waypoint xsi:type="dc:Point" x="1173" y="198" />
         <di:waypoint xsi:type="dc:Point" x="1226" y="198" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="1137" y="183" width="0" height="12" />
+          <dc:Bounds x="1154.5" y="177" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_1fueo69_di" bpmnElement="SequenceFlow_1fueo69">
-        <di:waypoint xsi:type="dc:Point" x="928" y="223" />
-        <di:waypoint xsi:type="dc:Point" x="928" y="250" />
-        <di:waypoint xsi:type="dc:Point" x="928" y="250" />
-        <di:waypoint xsi:type="dc:Point" x="928" y="286" />
+        <di:waypoint xsi:type="dc:Point" x="967" y="223" />
+        <di:waypoint xsi:type="dc:Point" x="967" y="250" />
+        <di:waypoint xsi:type="dc:Point" x="967" y="250" />
+        <di:waypoint xsi:type="dc:Point" x="967" y="286" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="901" y="228" width="15" height="12" />
+          <dc:Bounds x="942" y="228" width="12" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ScriptTask_0u3lw39_di" bpmnElement="ScriptTask_0u3lw39">
@@ -332,6 +361,26 @@ csi.sendSyncResponse(execution)]]></bpmn:script>
           <dc:Bounds x="715.5" y="459" width="0" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ScriptTask_09rx901_di" bpmnElement="ScriptTask_09rx901">
+        <dc:Bounds x="274" y="158" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ServiceTask_0mr5k9q_di" bpmnElement="ServiceTask_0mr5k9q">
+        <dc:Bounds x="444" y="158" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_0utlsnd_di" bpmnElement="SequenceFlow_0utlsnd">
+        <di:waypoint xsi:type="dc:Point" x="374" y="198" />
+        <di:waypoint xsi:type="dc:Point" x="444" y="198" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="409" y="177" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1853xxi_di" bpmnElement="SequenceFlow_1853xxi">
+        <di:waypoint xsi:type="dc:Point" x="544" y="198" />
+        <di:waypoint xsi:type="dc:Point" x="600" y="198" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="572" y="177" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
     </bpmndi:BPMNPlane>
   </bpmndi:BPMNDiagram>
 </bpmn:definitions>
index ddc87c7..d6dbf58 100644 (file)
@@ -1,5 +1,5 @@
 <?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:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="_MagIIMOUEeW8asg-vCEgWQ" targetNamespace="http://camunda.org/schema/1.0/bpmn" exporter="Camunda Modeler" exporterVersion="1.10.0" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
+<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:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="_MagIIMOUEeW8asg-vCEgWQ" 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="DoCreateE2EServiceInstanceV3" name="DoCreateE2EServiceInstanceV3" isExecutable="true">
     <bpmn2:startEvent id="createSI_startEvent" name="Start Flow">
       <bpmn2:outgoing>SequenceFlow_1qiiycn</bpmn2:outgoing>
@@ -96,16 +96,6 @@ dcsi.postProcessAAIGET(execution)]]></bpmn2:script>
 def ddsi = new DoCreateE2EServiceInstance()
 ddsi.postProcessAAIPUT(execution)]]></bpmn2:script>
     </bpmn2:scriptTask>
-    <bpmn2:scriptTask id="ScriptTask_1xdjlzm" name="Post Config Service Instance Creation" scriptFormat="groovy">
-      <bpmn2:incoming>SequenceFlow_16nxl6h</bpmn2:incoming>
-      <bpmn2:outgoing>SequenceFlow_0vbznai</bpmn2:outgoing>
-      <bpmn2:script><![CDATA[import org.openecomp.mso.bpmn.infrastructure.scripts.*
-def csi = new  DoCreateE2EServiceInstance()
-csi.postConfigRequest(execution)]]></bpmn2:script>
-    </bpmn2:scriptTask>
-    <bpmn2:endEvent id="EndEvent_0kbbt94">
-      <bpmn2:incoming>SequenceFlow_0vbznai</bpmn2:incoming>
-    </bpmn2:endEvent>
     <bpmn2:sequenceFlow id="SequenceFlow_1qctzm0" sourceRef="Task_0uiekmn" targetRef="Task_0raqlqc" />
     <bpmn2:scriptTask id="Task_0uiekmn" name="Prepare Resource Oper Status" scriptFormat="groovy">
       <bpmn2:incoming>SequenceFlow_1hbesp9</bpmn2:incoming>
@@ -134,68 +124,8 @@ ddsi.preInitResourcesOperStatus(execution)]]></bpmn2:script>
         </camunda:connector>
       </bpmn2:extensionElements>
       <bpmn2:incoming>SequenceFlow_1qctzm0</bpmn2:incoming>
-      <bpmn2:outgoing>SequenceFlow_10reo7r</bpmn2:outgoing>
+      <bpmn2:outgoing>SequenceFlow_13xfsff</bpmn2:outgoing>
     </bpmn2:serviceTask>
-    <bpmn2:serviceTask id="Task_0io5qby" name="Call Sync SDNC service Create " camunda:class="org.openecomp.mso.bpmn.infrastructure.workflow.serviceTask.SdncServiceTopologyOperationTask">
-      <bpmn2:incoming>SequenceFlow_1vprtt9</bpmn2:incoming>
-      <bpmn2:outgoing>SequenceFlow_11f2zuu</bpmn2:outgoing>
-    </bpmn2:serviceTask>
-    <bpmn2:sequenceFlow id="SequenceFlow_10reo7r" sourceRef="Task_0raqlqc" targetRef="ScriptTask_1y0los4" />
-    <bpmn2:sequenceFlow id="SequenceFlow_11f2zuu" sourceRef="Task_0io5qby" targetRef="IntermediateThrowEvent_0f2w7aj" />
-    <bpmn2:scriptTask id="ScriptTask_1y0los4" name="Sequence Resource" scriptFormat="groovy">
-      <bpmn2:incoming>SequenceFlow_10reo7r</bpmn2:incoming>
-      <bpmn2:outgoing>SequenceFlow_13d9g1n</bpmn2:outgoing>
-      <bpmn2:script><![CDATA[import org.openecomp.mso.bpmn.infrastructure.scripts.*
-def ddsi = new DoCreateE2EServiceInstance()
-ddsi.sequenceResoure(execution)]]></bpmn2:script>
-    </bpmn2:scriptTask>
-    <bpmn2:sequenceFlow id="SequenceFlow_13d9g1n" sourceRef="ScriptTask_1y0los4" targetRef="ExclusiveGateway_07rr3wp" />
-    <bpmn2:exclusiveGateway id="ExclusiveGateway_0n9y4du" name="All ResourceFinished?">
-      <bpmn2:incoming>SequenceFlow_1jenxlp</bpmn2:incoming>
-      <bpmn2:outgoing>SequenceFlow_0q6uy30</bpmn2:outgoing>
-      <bpmn2:outgoing>SequenceFlow_16nxl6h</bpmn2:outgoing>
-    </bpmn2:exclusiveGateway>
-    <bpmn2:sequenceFlow id="SequenceFlow_0q6uy30" name="no" sourceRef="ExclusiveGateway_0n9y4du" targetRef="ScriptTask_0l4nkqr">
-      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[#{(execution.getVariable("allResourceFinished" )  == "false" )}]]></bpmn2:conditionExpression>
-    </bpmn2:sequenceFlow>
-    <bpmn2:scriptTask id="ScriptTask_0y4u2ty" name="Parse Next Resource" scriptFormat="groovy">
-      <bpmn2:incoming>SequenceFlow_13c7bhn</bpmn2:incoming>
-      <bpmn2:outgoing>SequenceFlow_1jenxlp</bpmn2:outgoing>
-      <bpmn2:script><![CDATA[import org.openecomp.mso.bpmn.infrastructure.scripts.*
-def ddsi = new DoCreateE2EServiceInstance()
-ddsi.parseNextResource(execution)]]></bpmn2:script>
-    </bpmn2:scriptTask>
-    <bpmn2:sequenceFlow id="SequenceFlow_1jenxlp" sourceRef="ScriptTask_0y4u2ty" targetRef="ExclusiveGateway_0n9y4du" />
-    <bpmn2:scriptTask id="ScriptTask_0l4nkqr" name="Get Current Resource" scriptFormat="groovy">
-      <bpmn2:incoming>SequenceFlow_0q6uy30</bpmn2:incoming>
-      <bpmn2:incoming>SequenceFlow_1qozd66</bpmn2:incoming>
-      <bpmn2:outgoing>SequenceFlow_0uiygod</bpmn2:outgoing>
-      <bpmn2:script><![CDATA[import org.openecomp.mso.bpmn.infrastructure.scripts.*
-def ddsi = new DoCreateE2EServiceInstance()
-ddsi.getCurrentResoure(execution)]]></bpmn2:script>
-    </bpmn2:scriptTask>
-    <bpmn2:exclusiveGateway id="ExclusiveGateway_07rr3wp" name="Is SDN-C Service Needed">
-      <bpmn2:incoming>SequenceFlow_13d9g1n</bpmn2:incoming>
-      <bpmn2:outgoing>SequenceFlow_18wj44x</bpmn2:outgoing>
-      <bpmn2:outgoing>SequenceFlow_1vprtt9</bpmn2:outgoing>
-    </bpmn2:exclusiveGateway>
-    <bpmn2:sequenceFlow id="SequenceFlow_18wj44x" name="no" sourceRef="ExclusiveGateway_07rr3wp" targetRef="IntermediateThrowEvent_0f2w7aj">
-      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[#{(execution.getVariable("isContainsWanResource" )  == "false" )}]]></bpmn2:conditionExpression>
-    </bpmn2:sequenceFlow>
-    <bpmn2:scriptTask id="Task_0qlkmvt" name="Prepare resource recipe Request" scriptFormat="groovy">
-      <bpmn2:incoming>SequenceFlow_0uiygod</bpmn2:incoming>
-      <bpmn2:outgoing>SequenceFlow_1u9k0dm</bpmn2:outgoing>
-      <bpmn2:script><![CDATA[import org.openecomp.mso.bpmn.infrastructure.scripts.*
-def ddsi = new DoCreateE2EServiceInstance()
-ddsi.prepareResourceRecipeRequest(execution)]]></bpmn2:script>
-    </bpmn2:scriptTask>
-    <bpmn2:scriptTask id="Task_12ghoph" name="Execute Resource Recipe">
-      <bpmn2:incoming>SequenceFlow_1u9k0dm</bpmn2:incoming>
-      <bpmn2:outgoing>SequenceFlow_13c7bhn</bpmn2:outgoing>
-      <bpmn2:script><![CDATA[import org.openecomp.mso.bpmn.infrastructure.scripts.*
-def ddsi = new DoCreateE2EServiceInstance()
-ddsi.executeResourceRecipe(execution)]]></bpmn2:script>
-    </bpmn2:scriptTask>
     <bpmn2:intermediateThrowEvent id="IntermediateThrowEvent_0bq4fxs" name="Go to Decompose_Service">
       <bpmn2:incoming>SequenceFlow_0w9t6tc</bpmn2:incoming>
       <bpmn2:linkEventDefinition name="Decompose_Service" />
@@ -250,31 +180,11 @@ dcsi.prepareDecomposeService(execution)]]></bpmn2:script>
       <bpmn2:linkEventDefinition name="StartService" />
     </bpmn2:intermediateCatchEvent>
     <bpmn2:sequenceFlow id="SequenceFlow_1i7t9hq" sourceRef="IntermediateCatchEvent_0jrb3xu" targetRef="CustomE2EGetService" />
-    <bpmn2:intermediateThrowEvent id="IntermediateThrowEvent_0f2w7aj" name="GoTo ResourceLoop">
-      <bpmn2:incoming>SequenceFlow_18wj44x</bpmn2:incoming>
-      <bpmn2:incoming>SequenceFlow_11f2zuu</bpmn2:incoming>
-      <bpmn2:linkEventDefinition name="ResourceLoop" />
-    </bpmn2:intermediateThrowEvent>
-    <bpmn2:sequenceFlow id="SequenceFlow_1vprtt9" name="yes" sourceRef="ExclusiveGateway_07rr3wp" targetRef="Task_0io5qby">
-      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[#{(execution.getVariable("isContainsWanResource" )  == "true" )}]]></bpmn2:conditionExpression>
-    </bpmn2:sequenceFlow>
     <bpmn2:intermediateCatchEvent id="IntermediateCatchEvent_05dus9b" name="StartPrepareResource">
       <bpmn2:outgoing>SequenceFlow_1hbesp9</bpmn2:outgoing>
       <bpmn2:linkEventDefinition name="StartPrepareResource" />
     </bpmn2:intermediateCatchEvent>
     <bpmn2:sequenceFlow id="SequenceFlow_1hbesp9" sourceRef="IntermediateCatchEvent_05dus9b" targetRef="Task_0uiekmn" />
-    <bpmn2:intermediateCatchEvent id="IntermediateCatchEvent_02bah5m" name="ResourceLoop">
-      <bpmn2:outgoing>SequenceFlow_1qozd66</bpmn2:outgoing>
-      <bpmn2:linkEventDefinition name="ResourceLoop" />
-    </bpmn2:intermediateCatchEvent>
-    <bpmn2:sequenceFlow id="SequenceFlow_16nxl6h" name="yes" sourceRef="ExclusiveGateway_0n9y4du" targetRef="ScriptTask_1xdjlzm">
-      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[#{(execution.getVariable("allResourceFinished" )  == "true" )}]]></bpmn2:conditionExpression>
-    </bpmn2:sequenceFlow>
-    <bpmn2:sequenceFlow id="SequenceFlow_0uiygod" sourceRef="ScriptTask_0l4nkqr" targetRef="Task_0qlkmvt" />
-    <bpmn2:sequenceFlow id="SequenceFlow_1u9k0dm" sourceRef="Task_0qlkmvt" targetRef="Task_12ghoph" />
-    <bpmn2:sequenceFlow id="SequenceFlow_13c7bhn" sourceRef="Task_12ghoph" targetRef="ScriptTask_0y4u2ty" />
-    <bpmn2:sequenceFlow id="SequenceFlow_0vbznai" sourceRef="ScriptTask_1xdjlzm" targetRef="EndEvent_0kbbt94" />
-    <bpmn2:sequenceFlow id="SequenceFlow_1qozd66" sourceRef="IntermediateCatchEvent_02bah5m" targetRef="ScriptTask_0l4nkqr" />
     <bpmn2:sequenceFlow id="SequenceFlow_1gusrvp" sourceRef="Task_0ush1g4" targetRef="IntermediateThrowEvent_1mlbhmt" />
     <bpmn2:scriptTask id="Task_0ush1g4" name="Call Homing(To be Done)" scriptFormat="groovy">
       <bpmn2:incoming>SequenceFlow_027owbf</bpmn2:incoming>
@@ -283,6 +193,43 @@ dcsi.prepareDecomposeService(execution)]]></bpmn2:script>
 def dcsi= new DoCreateE2EServiceInstance()
 dcsi.doServiceHoming(execution)]]></bpmn2:script>
     </bpmn2:scriptTask>
+    <bpmn2:callActivity id="CallActivity_1ojtwas" name="Call DoCreateResources" calledElement="DoCreateResources">
+      <bpmn2:extensionElements>
+        <camunda:in source="nsServiceName" target="nsServiceName" />
+        <camunda:in source="nsServiceDescription" target="nsServiceDescription" />
+        <camunda:in source="globalSubscriberId" target="globalSubscriberId" />
+        <camunda:in source="serviceType" target="serviceType" />
+        <camunda:in source="serviceId" target="serviceId" />
+        <camunda:in source="operationId" target="operationId" />
+        <camunda:in source="resourceType" target="resourceType" />
+        <camunda:in source="resourceUUID" target="resourceUUID" />
+        <camunda:in source="resourceParameters" target="resourceParameters" />
+        <camunda:in source="operationType" target="operationType" />
+      </bpmn2:extensionElements>
+      <bpmn2:incoming>SequenceFlow_0bf6bzp</bpmn2:incoming>
+      <bpmn2:outgoing>SequenceFlow_0d0c20n</bpmn2:outgoing>
+    </bpmn2:callActivity>
+    <bpmn2:scriptTask id="ScriptTask_04b21gb" name="PreProcess for Add Resources" scriptFormat="groovy">
+      <bpmn2:incoming>SequenceFlow_13xfsff</bpmn2:incoming>
+      <bpmn2:outgoing>SequenceFlow_0bf6bzp</bpmn2:outgoing>
+      <bpmn2:script><![CDATA[import org.openecomp.mso.bpmn.infrastructure.scripts.*
+def csi = new  DoCreateE2EServiceInstance()
+csi.preProcessForAddResource(execution)]]></bpmn2:script>
+    </bpmn2:scriptTask>
+    <bpmn2:scriptTask id="ScriptTask_1y7jr4t" name="PostProcess for Add Resource" scriptFormat="groovy">
+      <bpmn2:incoming>SequenceFlow_0d0c20n</bpmn2:incoming>
+      <bpmn2:outgoing>SequenceFlow_0a6vgsu</bpmn2:outgoing>
+      <bpmn2:script><![CDATA[import org.openecomp.mso.bpmn.infrastructure.scripts.*
+def csi = new  DoCreateE2EServiceInstance()
+csi.postProcessForAddResource(execution)]]></bpmn2:script>
+    </bpmn2:scriptTask>
+    <bpmn2:sequenceFlow id="SequenceFlow_13xfsff" sourceRef="Task_0raqlqc" targetRef="ScriptTask_04b21gb" />
+    <bpmn2:sequenceFlow id="SequenceFlow_0bf6bzp" sourceRef="ScriptTask_04b21gb" targetRef="CallActivity_1ojtwas" />
+    <bpmn2:sequenceFlow id="SequenceFlow_0d0c20n" sourceRef="CallActivity_1ojtwas" targetRef="ScriptTask_1y7jr4t" />
+    <bpmn2:endEvent id="EndEvent_0hzmoug">
+      <bpmn2:incoming>SequenceFlow_0a6vgsu</bpmn2:incoming>
+    </bpmn2:endEvent>
+    <bpmn2:sequenceFlow id="SequenceFlow_0a6vgsu" sourceRef="ScriptTask_1y7jr4t" targetRef="EndEvent_0hzmoug" />
   </bpmn2:process>
   <bpmn2:error id="Error_2" name="MSOWorkflowException" errorCode="MSOWorkflowException" />
   <bpmn2:error id="Error_1" name="java.lang.Exception" errorCode="java.lang.Exception" />
@@ -390,15 +337,6 @@ dcsi.doServiceHoming(execution)]]></bpmn2:script>
           <dc:Bounds x="679" y="960" width="90" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNShape id="ScriptTask_1xdjlzm_di" bpmnElement="ScriptTask_1xdjlzm">
-        <dc:Bounds x="1119" y="485" width="100" height="80" />
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="EndEvent_01p249c_di" bpmnElement="EndEvent_0kbbt94">
-        <dc:Bounds x="1315" y="507" width="36" height="36" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="1197" y="547" width="90" height="12" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_1qctzm0_di" bpmnElement="SequenceFlow_1qctzm0">
         <di:waypoint xsi:type="dc:Point" x="296" y="300" />
         <di:waypoint xsi:type="dc:Point" x="402" y="300" />
@@ -412,82 +350,6 @@ dcsi.doServiceHoming(execution)]]></bpmn2:script>
       <bpmndi:BPMNShape id="ServiceTask_14tnuxf_di" bpmnElement="Task_0raqlqc">
         <dc:Bounds x="402" y="260" width="100" height="80" />
       </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="ServiceTask_0qi8cgg_di" bpmnElement="Task_0io5qby">
-        <dc:Bounds x="944" y="353" width="100" height="80" />
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="SequenceFlow_10reo7r_di" bpmnElement="SequenceFlow_10reo7r">
-        <di:waypoint xsi:type="dc:Point" x="502" y="300" />
-        <di:waypoint xsi:type="dc:Point" x="583" y="300" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="497.5" y="279" width="90" height="12" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="SequenceFlow_11f2zuu_di" bpmnElement="SequenceFlow_11f2zuu">
-        <di:waypoint xsi:type="dc:Point" x="1044" y="393" />
-        <di:waypoint xsi:type="dc:Point" x="1090" y="393" />
-        <di:waypoint xsi:type="dc:Point" x="1090" y="300" />
-        <di:waypoint xsi:type="dc:Point" x="1315" y="300" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="1060" y="340.5" width="90" height="12" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNShape id="ScriptTask_1y0los4_di" bpmnElement="ScriptTask_1y0los4">
-        <dc:Bounds x="583" y="260" width="100" height="80" />
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="SequenceFlow_13d9g1n_di" bpmnElement="SequenceFlow_13d9g1n">
-        <di:waypoint xsi:type="dc:Point" x="683" y="300" />
-        <di:waypoint xsi:type="dc:Point" x="753" y="300" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="673" y="279" width="90" height="12" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNShape id="ExclusiveGateway_0n9y4du_di" bpmnElement="ExclusiveGateway_0n9y4du" isMarkerVisible="true">
-        <dc:Bounds x="929" y="500" width="50" height="50" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="912" y="554" width="83" height="36" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="SequenceFlow_0q6uy30_di" bpmnElement="SequenceFlow_0q6uy30">
-        <di:waypoint xsi:type="dc:Point" x="954" y="550" />
-        <di:waypoint xsi:type="dc:Point" x="954" y="691" />
-        <di:waypoint xsi:type="dc:Point" x="246" y="691" />
-        <di:waypoint xsi:type="dc:Point" x="246" y="565" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="594" y="670" width="12" height="12" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNShape id="ScriptTask_0y4u2ty_di" bpmnElement="ScriptTask_0y4u2ty">
-        <dc:Bounds x="728" y="485" width="100" height="80" />
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="SequenceFlow_1jenxlp_di" bpmnElement="SequenceFlow_1jenxlp">
-        <di:waypoint xsi:type="dc:Point" x="828" y="525" />
-        <di:waypoint xsi:type="dc:Point" x="929" y="525" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="833.5" y="504" width="90" height="12" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNShape id="ScriptTask_0l4nkqr_di" bpmnElement="ScriptTask_0l4nkqr">
-        <dc:Bounds x="196" y="485" width="100" height="80" />
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="ExclusiveGateway_07rr3wp_di" bpmnElement="ExclusiveGateway_07rr3wp" isMarkerVisible="true">
-        <dc:Bounds x="753" y="275" width="50" height="50" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="736" y="329" width="87" height="24" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="SequenceFlow_18wj44x_di" bpmnElement="SequenceFlow_18wj44x">
-        <di:waypoint xsi:type="dc:Point" x="803" y="300" />
-        <di:waypoint xsi:type="dc:Point" x="1315" y="300" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="832.3633633633633" y="294" width="12" height="12" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNShape id="ScriptTask_0u88n0f_di" bpmnElement="Task_0qlkmvt">
-        <dc:Bounds x="357" y="485" width="100" height="80" />
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="ScriptTask_1y17r20_di" bpmnElement="Task_12ghoph">
-        <dc:Bounds x="551" y="485" width="100" height="80" />
-      </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="IntermediateThrowEvent_11saqvj_di" bpmnElement="IntermediateThrowEvent_0bq4fxs">
         <dc:Bounds x="1315" y="-207" width="36" height="36" />
         <bpmndi:BPMNLabel>
@@ -587,20 +449,6 @@ dcsi.doServiceHoming(execution)]]></bpmn2:script>
           <dc:Bounds x="125" y="76" width="0" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNShape id="IntermediateThrowEvent_0f2w7aj_di" bpmnElement="IntermediateThrowEvent_0f2w7aj">
-        <dc:Bounds x="1315" y="282" width="36" height="36" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="1299" y="323" width="73" height="24" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="SequenceFlow_1vprtt9_di" bpmnElement="SequenceFlow_1vprtt9">
-        <di:waypoint xsi:type="dc:Point" x="778" y="325" />
-        <di:waypoint xsi:type="dc:Point" x="778" y="393" />
-        <di:waypoint xsi:type="dc:Point" x="944" y="393" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="784" y="353" width="19" height="12" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="IntermediateCatchEvent_05dus9b_di" bpmnElement="IntermediateCatchEvent_05dus9b">
         <dc:Bounds x="18" y="282" width="36" height="36" />
         <bpmndi:BPMNLabel>
@@ -614,64 +462,65 @@ dcsi.doServiceHoming(execution)]]></bpmn2:script>
           <dc:Bounds x="125" y="279" width="0" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNShape id="IntermediateCatchEvent_02bah5m_di" bpmnElement="IntermediateCatchEvent_02bah5m">
-        <dc:Bounds x="18" y="507" width="36" height="36" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="2" y="543" width="73" height="12" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="SequenceFlow_16nxl6h_di" bpmnElement="SequenceFlow_16nxl6h">
-        <di:waypoint xsi:type="dc:Point" x="979" y="525" />
-        <di:waypoint xsi:type="dc:Point" x="1119" y="525" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="1040" y="504" width="19" height="12" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="SequenceFlow_0uiygod_di" bpmnElement="SequenceFlow_0uiygod">
-        <di:waypoint xsi:type="dc:Point" x="296" y="525" />
-        <di:waypoint xsi:type="dc:Point" x="357" y="525" />
+      <bpmndi:BPMNEdge id="SequenceFlow_1gusrvp_di" bpmnElement="SequenceFlow_1gusrvp">
+        <di:waypoint xsi:type="dc:Point" x="1157" y="-39" />
+        <di:waypoint xsi:type="dc:Point" x="1315" y="-39" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="326.5" y="504" width="0" height="12" />
+          <dc:Bounds x="1236" y="-60" width="0" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="SequenceFlow_1u9k0dm_di" bpmnElement="SequenceFlow_1u9k0dm">
-        <di:waypoint xsi:type="dc:Point" x="457" y="525" />
-        <di:waypoint xsi:type="dc:Point" x="551" y="525" />
+      <bpmndi:BPMNShape id="ScriptTask_0wr11dt_di" bpmnElement="Task_0ush1g4">
+        <dc:Bounds x="1057" y="-79" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="CallActivity_1ojtwas_di" bpmnElement="CallActivity_1ojtwas">
+        <dc:Bounds x="852" y="260" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_04b21gb_di" bpmnElement="ScriptTask_04b21gb">
+        <dc:Bounds x="629" y="260" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_1y7jr4t_di" bpmnElement="ScriptTask_1y7jr4t">
+        <dc:Bounds x="1068" y="260" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_13xfsff_di" bpmnElement="SequenceFlow_13xfsff">
+        <di:waypoint xsi:type="dc:Point" x="502" y="300" />
+        <di:waypoint xsi:type="dc:Point" x="629" y="300" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="504" y="504" width="0" height="12" />
+          <dc:Bounds x="565.5" y="279" width="0" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="SequenceFlow_13c7bhn_di" bpmnElement="SequenceFlow_13c7bhn">
-        <di:waypoint xsi:type="dc:Point" x="651" y="525" />
-        <di:waypoint xsi:type="dc:Point" x="728" y="525" />
+      <bpmndi:BPMNEdge id="SequenceFlow_0bf6bzp_di" bpmnElement="SequenceFlow_0bf6bzp">
+        <di:waypoint xsi:type="dc:Point" x="729" y="300" />
+        <di:waypoint xsi:type="dc:Point" x="789" y="300" />
+        <di:waypoint xsi:type="dc:Point" x="789" y="300" />
+        <di:waypoint xsi:type="dc:Point" x="852" y="300" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="689.5" y="504" width="0" height="12" />
+          <dc:Bounds x="804" y="294" width="0" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="SequenceFlow_0vbznai_di" bpmnElement="SequenceFlow_0vbznai">
-        <di:waypoint xsi:type="dc:Point" x="1219" y="525" />
-        <di:waypoint xsi:type="dc:Point" x="1315" y="525" />
+      <bpmndi:BPMNEdge id="SequenceFlow_0d0c20n_di" bpmnElement="SequenceFlow_0d0c20n">
+        <di:waypoint xsi:type="dc:Point" x="952" y="300" />
+        <di:waypoint xsi:type="dc:Point" x="1009" y="300" />
+        <di:waypoint xsi:type="dc:Point" x="1009" y="300" />
+        <di:waypoint xsi:type="dc:Point" x="1068" y="300" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="1267" y="504" width="0" height="12" />
+          <dc:Bounds x="1024" y="294" width="0" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="SequenceFlow_1qozd66_di" bpmnElement="SequenceFlow_1qozd66">
-        <di:waypoint xsi:type="dc:Point" x="54" y="525" />
-        <di:waypoint xsi:type="dc:Point" x="196" y="525" />
+      <bpmndi:BPMNShape id="EndEvent_0hzmoug_di" bpmnElement="EndEvent_0hzmoug">
+        <dc:Bounds x="1315" y="282.4076655052265" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="125" y="504" width="0" height="12" />
+          <dc:Bounds x="1333" y="322.4076655052265" width="0" height="12" />
         </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="SequenceFlow_1gusrvp_di" bpmnElement="SequenceFlow_1gusrvp">
-        <di:waypoint xsi:type="dc:Point" x="1157" y="-39" />
-        <di:waypoint xsi:type="dc:Point" x="1315" y="-39" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_0a6vgsu_di" bpmnElement="SequenceFlow_0a6vgsu">
+        <di:waypoint xsi:type="dc:Point" x="1168" y="300" />
+        <di:waypoint xsi:type="dc:Point" x="1242" y="300" />
+        <di:waypoint xsi:type="dc:Point" x="1242" y="300" />
+        <di:waypoint xsi:type="dc:Point" x="1315" y="300" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="1236" y="-60" width="0" height="12" />
+          <dc:Bounds x="1257" y="294" width="0" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNShape id="ScriptTask_0wr11dt_di" bpmnElement="Task_0ush1g4">
-        <dc:Bounds x="1057" y="-79" width="100" height="80" />
-      </bpmndi:BPMNShape>
     </bpmndi:BPMNPlane>
   </bpmndi:BPMNDiagram>
 </bpmn2:definitions>
index 53450fc..86b4226 100644 (file)
@@ -50,85 +50,15 @@ csi.preProcessForAddResource(execution)]]></bpmn2:script>
       <bpmn2:script><![CDATA[import org.openecomp.mso.bpmn.infrastructure.scripts.*
 def csi = new  DoUpdateE2EServiceInstance()
 csi.postProcessForAddResource(execution)]]></bpmn2:script>
-    </bpmn2:scriptTask>
-    <bpmn2:scriptTask id="ScriptTask_04rn9mp" name="Post Config Service Instance Update" scriptFormat="groovy">
-      <bpmn2:incoming>SequenceFlow_0cnuo36</bpmn2:incoming>
-      <bpmn2:outgoing>SequenceFlow_1ryg78h</bpmn2:outgoing>
-      <bpmn2:script><![CDATA[import org.openecomp.mso.bpmn.infrastructure.scripts.*
-def csi = new  DoUpdateE2EServiceInstance()
-csi.postConfigRequest(execution)]]></bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:intermediateCatchEvent id="StartEvent_StartResource" name="StartAddResources">
       <bpmn2:outgoing>SequenceFlow_115mdln</bpmn2:outgoing>
       <bpmn2:linkEventDefinition name="StartAddResource" />
     </bpmn2:intermediateCatchEvent>
     <bpmn2:intermediateThrowEvent id="IntermediateThrowEvent_1dwg5lz" name="GoToStartCompareModelVersions">
-      <bpmn2:incoming>SequenceFlow_1i45vfx</bpmn2:incoming>
+      <bpmn2:incoming>SequenceFlow_167wc99</bpmn2:incoming>
       <bpmn2:linkEventDefinition name="StartCompareModelVersions" />
     </bpmn2:intermediateThrowEvent>
-    <bpmn2:scriptTask id="ScriptTask_1wk7zcu" name="Prepare Update Service Oper Status(90%)" scriptFormat="groovy">
-      <bpmn2:incoming>SequenceFlow_1uu6uiu</bpmn2:incoming>
-      <bpmn2:outgoing>SequenceFlow_0gr3l25</bpmn2:outgoing>
-      <bpmn2:script><![CDATA[import org.openecomp.mso.bpmn.infrastructure.scripts.*
-execution.setVariable("progress", "90")
-def ddsi = new DoUpdateE2EServiceInstance()
-ddsi.preUpdateServiceOperationStatus(execution)]]></bpmn2:script>
-    </bpmn2:scriptTask>
-    <bpmn2:serviceTask id="ServiceTask_1a6cmdu" name="Update Service Oper Status">
-      <bpmn2:extensionElements>
-        <camunda:connector>
-          <camunda:inputOutput>
-            <camunda:inputParameter name="url">${URN_mso_openecomp_adapters_db_endpoint}</camunda:inputParameter>
-            <camunda:inputParameter name="headers">
-              <camunda:map>
-                <camunda:entry key="content-type">application/soap+xml</camunda:entry>
-                <camunda:entry key="Authorization">Basic QlBFTENsaWVudDpwYXNzd29yZDEk</camunda:entry>
-              </camunda:map>
-            </camunda:inputParameter>
-            <camunda:inputParameter name="payload">${CVFMI_updateServiceOperStatusRequest}</camunda:inputParameter>
-            <camunda:inputParameter name="method">POST</camunda:inputParameter>
-            <camunda:outputParameter name="CVFMI_dbResponseCode">${statusCode}</camunda:outputParameter>
-            <camunda:outputParameter name="CVFMI_dbResponse">${response}</camunda:outputParameter>
-          </camunda:inputOutput>
-          <camunda:connectorId>http-connector</camunda:connectorId>
-        </camunda:connector>
-      </bpmn2:extensionElements>
-      <bpmn2:incoming>SequenceFlow_0gr3l25</bpmn2:incoming>
-      <bpmn2:outgoing>SequenceFlow_0cnuo36</bpmn2:outgoing>
-    </bpmn2:serviceTask>
-    <bpmn2:sequenceFlow id="SequenceFlow_0gr3l25" sourceRef="ScriptTask_1wk7zcu" targetRef="ServiceTask_1a6cmdu" />
-    <bpmn2:sequenceFlow id="SequenceFlow_0cnuo36" sourceRef="ServiceTask_1a6cmdu" targetRef="ScriptTask_04rn9mp" />
-    <bpmn2:scriptTask id="ScriptTask_1pwo0jp" name="Prepare Resource Oper Status" scriptFormat="groovy">
-      <bpmn2:incoming>SequenceFlow_167wc99</bpmn2:incoming>
-      <bpmn2:outgoing>SequenceFlow_0aylb6e</bpmn2:outgoing>
-      <bpmn2:script><![CDATA[import org.openecomp.mso.bpmn.infrastructure.scripts.*
-def ddsi = new DoUpdateE2EServiceInstance()
-ddsi.preInitResourcesOperStatus(execution)]]></bpmn2:script>
-    </bpmn2:scriptTask>
-    <bpmn2:sequenceFlow id="SequenceFlow_0aylb6e" sourceRef="ScriptTask_1pwo0jp" targetRef="ServiceTask_1dqzdko" />
-    <bpmn2:serviceTask id="ServiceTask_1dqzdko" name="Init Resource Oper Status">
-      <bpmn2:extensionElements>
-        <camunda:connector>
-          <camunda:inputOutput>
-            <camunda:inputParameter name="url">${CVFMI_dbAdapterEndpoint}</camunda:inputParameter>
-            <camunda:inputParameter name="headers">
-              <camunda:map>
-                <camunda:entry key="content-type">application/soap+xml</camunda:entry>
-                <camunda:entry key="Authorization">Basic QlBFTENsaWVudDpwYXNzd29yZDEk</camunda:entry>
-              </camunda:map>
-            </camunda:inputParameter>
-            <camunda:inputParameter name="payload">${CVFMI_initResOperStatusRequest}</camunda:inputParameter>
-            <camunda:inputParameter name="method">POST</camunda:inputParameter>
-            <camunda:outputParameter name="CVFMI_dbResponseCode">${statusCode}</camunda:outputParameter>
-            <camunda:outputParameter name="CVFMI_dbResponse">${response}</camunda:outputParameter>
-          </camunda:inputOutput>
-          <camunda:connectorId>http-connector</camunda:connectorId>
-        </camunda:connector>
-      </bpmn2:extensionElements>
-      <bpmn2:incoming>SequenceFlow_0aylb6e</bpmn2:incoming>
-      <bpmn2:outgoing>SequenceFlow_1r1hl23</bpmn2:outgoing>
-    </bpmn2:serviceTask>
-    <bpmn2:sequenceFlow id="SequenceFlow_1r1hl23" sourceRef="ServiceTask_1dqzdko" targetRef="ScriptTask_17ssed5" />
     <bpmn2:sequenceFlow id="SequenceFlow_115mdln" sourceRef="StartEvent_StartResource" targetRef="Task_09laxun" />
     <bpmn2:sequenceFlow id="SequenceFlow_0yztz2p" sourceRef="Task_09laxun" targetRef="Task_1wyyy33" />
     <bpmn2:sequenceFlow id="SequenceFlow_0lblyhi" sourceRef="Task_1wyyy33" targetRef="Task_0ag30bf" />
@@ -210,21 +140,12 @@ ddsi.preCompareModelVersions(execution)]]></bpmn2:script>
       <bpmn2:outgoing>SequenceFlow_0qg0uyn</bpmn2:outgoing>
     </bpmn2:callActivity>
     <bpmn2:sequenceFlow id="SequenceFlow_0qg0uyn" sourceRef="CallActivity_18nvmnn" targetRef="ScriptTask_0i8cqdy_PostProcessAAIGET" />
-    <bpmn2:scriptTask id="ScriptTask_17ssed5" name="Post Resource Oper Status" scriptFormat="groovy">
-      <bpmn2:incoming>SequenceFlow_1r1hl23</bpmn2:incoming>
-      <bpmn2:outgoing>SequenceFlow_1i45vfx</bpmn2:outgoing>
-      <bpmn2:script><![CDATA[import org.openecomp.mso.bpmn.infrastructure.scripts.*
-def dcsi = new DoUpdateE2EServiceInstance()
-dcsi.postResourcesOperStatus(execution)]]></bpmn2:script>
-    </bpmn2:scriptTask>
-    <bpmn2:sequenceFlow id="SequenceFlow_1i45vfx" sourceRef="ScriptTask_17ssed5" targetRef="IntermediateThrowEvent_1dwg5lz" />
-    <bpmn2:scriptTask id="ScriptTask_0acnvkp" name="Prepare Resource Oper Status(10%)" scriptFormat="groovy">
+    <bpmn2:scriptTask id="ScriptTask_0acnvkp" name="Prepare Resource Oper Status" scriptFormat="groovy">
       <bpmn2:incoming>SequenceFlow_0l4gosl</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_0r6c0ci</bpmn2:outgoing>
       <bpmn2:script><![CDATA[import org.openecomp.mso.bpmn.infrastructure.scripts.*
-execution.setVariable("progress", "10")
 def ddsi = new DoUpdateE2EServiceInstance()
-ddsi.preUpdateServiceOperationStatus(execution)]]></bpmn2:script>
+ddsi.preInitResourcesOperStatus(execution)]]></bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:serviceTask id="ServiceTask_17u9q9u" name="Init Resource Oper Status">
       <bpmn2:extensionElements>
@@ -258,48 +179,9 @@ dcsi.postResourcesOperStatus(execution)]]></bpmn2:script>
     <bpmn2:sequenceFlow id="SequenceFlow_0r6c0ci" sourceRef="ScriptTask_0acnvkp" targetRef="ServiceTask_17u9q9u" />
     <bpmn2:sequenceFlow id="SequenceFlow_1muxopq" sourceRef="ServiceTask_17u9q9u" targetRef="ScriptTask_0r74c3c" />
     <bpmn2:intermediateThrowEvent id="IntermediateThrowEvent_0vneaao" name="GoTo StartDeleteResources">
-      <bpmn2:incoming>SequenceFlow_0s57qft</bpmn2:incoming>
+      <bpmn2:incoming>SequenceFlow_1nqfgvs</bpmn2:incoming>
       <bpmn2:linkEventDefinition name="StartDeleteResources" />
     </bpmn2:intermediateThrowEvent>
-    <bpmn2:scriptTask id="ScriptTask_1na4qzo" name="Prepare Resource Oper Status(60%)" scriptFormat="groovy">
-      <bpmn2:incoming>SequenceFlow_1nqfgvs</bpmn2:incoming>
-      <bpmn2:outgoing>SequenceFlow_1fa1yjd</bpmn2:outgoing>
-      <bpmn2:script><![CDATA[import org.openecomp.mso.bpmn.infrastructure.scripts.*
-execution.setVariable("progress", "60")
-def ddsi = new DoUpdateE2EServiceInstance()
-ddsi.preUpdateServiceOperationStatus(execution)]]></bpmn2:script>
-    </bpmn2:scriptTask>
-    <bpmn2:serviceTask id="ServiceTask_0c13nyt" name="Init Resource Oper Status">
-      <bpmn2:extensionElements>
-        <camunda:connector>
-          <camunda:inputOutput>
-            <camunda:inputParameter name="url">${CVFMI_dbAdapterEndpoint}</camunda:inputParameter>
-            <camunda:inputParameter name="headers">
-              <camunda:map>
-                <camunda:entry key="content-type">application/soap+xml</camunda:entry>
-                <camunda:entry key="Authorization">Basic QlBFTENsaWVudDpwYXNzd29yZDEk</camunda:entry>
-              </camunda:map>
-            </camunda:inputParameter>
-            <camunda:inputParameter name="payload">${CVFMI_initResOperStatusRequest}</camunda:inputParameter>
-            <camunda:inputParameter name="method">POST</camunda:inputParameter>
-            <camunda:outputParameter name="CVFMI_dbResponseCode">${statusCode}</camunda:outputParameter>
-            <camunda:outputParameter name="CVFMI_dbResponse">${response}</camunda:outputParameter>
-          </camunda:inputOutput>
-          <camunda:connectorId>http-connector</camunda:connectorId>
-        </camunda:connector>
-      </bpmn2:extensionElements>
-      <bpmn2:incoming>SequenceFlow_1fa1yjd</bpmn2:incoming>
-      <bpmn2:outgoing>SequenceFlow_1eg944u</bpmn2:outgoing>
-    </bpmn2:serviceTask>
-    <bpmn2:scriptTask id="ScriptTask_0iq531p" name="Post Resource Oper Status" scriptFormat="groovy">
-      <bpmn2:incoming>SequenceFlow_1eg944u</bpmn2:incoming>
-      <bpmn2:outgoing>SequenceFlow_0s57qft</bpmn2:outgoing>
-      <bpmn2:script><![CDATA[import org.openecomp.mso.bpmn.infrastructure.scripts.*
-def dcsi = new DoUpdateE2EServiceInstance()
-dcsi.postResourcesOperStatus(execution)]]></bpmn2:script>
-    </bpmn2:scriptTask>
-    <bpmn2:sequenceFlow id="SequenceFlow_0s57qft" sourceRef="ScriptTask_0iq531p" targetRef="IntermediateThrowEvent_0vneaao" />
-    <bpmn2:sequenceFlow id="SequenceFlow_1eg944u" sourceRef="ServiceTask_0c13nyt" targetRef="ScriptTask_0iq531p" />
     <bpmn2:callActivity id="CallActivity_1nm9zq7" name="Call Custom E2E Put Service" calledElement="CustomE2EPutService">
       <bpmn2:extensionElements>
         <camunda:in source="globalSubscriberId" target="GENPS_globalSubscriberId" />
@@ -377,25 +259,23 @@ ddsi.preUpdateServiceOperationStatus(execution)]]></bpmn2:script>
     <bpmn2:sequenceFlow id="SequenceFlow_0ku36oy" sourceRef="IntermediateCatchEvent_0z04o3s" targetRef="ScriptTask_0jsblrq" />
     <bpmn2:sequenceFlow id="SequenceFlow_0mwh16g" sourceRef="ScriptTask_0jsblrq" targetRef="ServiceTask_1ydxyw0" />
     <bpmn2:intermediateThrowEvent id="IntermediateThrowEvent_06lo96a" name="GoTo UpdateAAI">
-      <bpmn2:incoming>SequenceFlow_1ryg78h</bpmn2:incoming>
+      <bpmn2:incoming>SequenceFlow_1uu6uiu</bpmn2:incoming>
       <bpmn2:linkEventDefinition name="UpdateAAI" />
     </bpmn2:intermediateThrowEvent>
-    <bpmn2:sequenceFlow id="SequenceFlow_1ryg78h" sourceRef="ScriptTask_04rn9mp" targetRef="IntermediateThrowEvent_06lo96a" />
     <bpmn2:intermediateThrowEvent id="IntermediateThrowEvent_0hucdtk" name="GoTo FinishProcess">
       <bpmn2:incoming>SequenceFlow_0x0mhlj</bpmn2:incoming>
       <bpmn2:linkEventDefinition name="FinishProcess" />
     </bpmn2:intermediateThrowEvent>
     <bpmn2:sequenceFlow id="SequenceFlow_0x0mhlj" sourceRef="ScriptTask_0xtabf8" targetRef="IntermediateThrowEvent_0hucdtk" />
-    <bpmn2:sequenceFlow id="SequenceFlow_167wc99" sourceRef="ScriptTask_0i8cqdy_PostProcessAAIGET" targetRef="ScriptTask_1pwo0jp" />
+    <bpmn2:sequenceFlow id="SequenceFlow_167wc99" sourceRef="ScriptTask_0i8cqdy_PostProcessAAIGET" targetRef="IntermediateThrowEvent_1dwg5lz" />
     <bpmn2:intermediateThrowEvent id="IntermediateThrowEvent_09ur9ds" name="GoTo StartAddResources">
       <bpmn2:incoming>SequenceFlow_1sgsysh</bpmn2:incoming>
       <bpmn2:linkEventDefinition name="StartAddResource" />
     </bpmn2:intermediateThrowEvent>
     <bpmn2:sequenceFlow id="SequenceFlow_0l4gosl" sourceRef="ScriptTask_0wl77h6" targetRef="ScriptTask_0acnvkp" />
     <bpmn2:sequenceFlow id="SequenceFlow_1sgsysh" sourceRef="ScriptTask_0r74c3c" targetRef="IntermediateThrowEvent_09ur9ds" />
-    <bpmn2:sequenceFlow id="SequenceFlow_1fa1yjd" sourceRef="ScriptTask_1na4qzo" targetRef="ServiceTask_0c13nyt" />
-    <bpmn2:sequenceFlow id="SequenceFlow_1nqfgvs" sourceRef="Task_0ag30bf" targetRef="ScriptTask_1na4qzo" />
-    <bpmn2:sequenceFlow id="SequenceFlow_1uu6uiu" sourceRef="ScriptTask_00wgfrc" targetRef="ScriptTask_1wk7zcu" />
+    <bpmn2:sequenceFlow id="SequenceFlow_1nqfgvs" sourceRef="Task_0ag30bf" targetRef="IntermediateThrowEvent_0vneaao" />
+    <bpmn2:sequenceFlow id="SequenceFlow_1uu6uiu" sourceRef="ScriptTask_00wgfrc" targetRef="IntermediateThrowEvent_06lo96a" />
     <bpmn2:subProcess id="SubProcess_0jo0nms" name="Sub-process for Application Errors" triggeredByEvent="true">
       <bpmn2:startEvent id="StartEvent_06768u3">
         <bpmn2:outgoing>SequenceFlow_05j3sat</bpmn2:outgoing>
@@ -516,9 +396,6 @@ dcsi.preProcessAAIPUT(execution)]]></bpmn2:script>
       <bpmndi:BPMNShape id="ScriptTask_1fj89ew_di" bpmnElement="Task_0ag30bf">
         <dc:Bounds x="858" y="828" width="100" height="80" />
       </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="ScriptTask_04rn9mp_di" bpmnElement="ScriptTask_04rn9mp">
-        <dc:Bounds x="1675" y="1081" width="100" height="80" />
-      </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="IntermediateCatchEvent_0jks7by_di" bpmnElement="StartEvent_StartResource">
         <dc:Bounds x="74" y="850" width="36" height="36" />
         <bpmndi:BPMNLabel>
@@ -531,50 +408,6 @@ dcsi.preProcessAAIPUT(execution)]]></bpmn2:script>
           <dc:Bounds x="1925" y="444" width="90" height="24" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="ScriptTask_1wk7zcu_di" bpmnElement="ScriptTask_1wk7zcu">
-        <dc:Bounds x="1152" y="1081" width="100" height="80" />
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="ServiceTask_1a6cmdu_di" bpmnElement="ServiceTask_1a6cmdu">
-        <dc:Bounds x="1421" y="1081" width="100" height="80" />
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="SequenceFlow_0gr3l25_di" bpmnElement="SequenceFlow_0gr3l25">
-        <di:waypoint xsi:type="dc:Point" x="1252" y="1121" />
-        <di:waypoint xsi:type="dc:Point" x="1421" y="1121" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="1291.5" y="1100" width="90" height="12" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="SequenceFlow_0cnuo36_di" bpmnElement="SequenceFlow_0cnuo36">
-        <di:waypoint xsi:type="dc:Point" x="1521" y="1121" />
-        <di:waypoint xsi:type="dc:Point" x="1675" y="1121" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="1553" y="1100" width="90" height="12" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNShape id="ScriptTask_1pwo0jp_di" bpmnElement="ScriptTask_1pwo0jp">
-        <dc:Bounds x="1152" y="382" width="100" height="80" />
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="SequenceFlow_0aylb6e_di" bpmnElement="SequenceFlow_0aylb6e">
-        <di:waypoint xsi:type="dc:Point" x="1252" y="422" />
-        <di:waypoint xsi:type="dc:Point" x="1337" y="422" />
-        <di:waypoint xsi:type="dc:Point" x="1337" y="422" />
-        <di:waypoint xsi:type="dc:Point" x="1421" y="422" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="1307" y="416" width="90" height="12" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNShape id="ServiceTask_1dqzdko_di" bpmnElement="ServiceTask_1dqzdko">
-        <dc:Bounds x="1421" y="382" width="100" height="80" />
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="SequenceFlow_1r1hl23_di" bpmnElement="SequenceFlow_1r1hl23">
-        <di:waypoint xsi:type="dc:Point" x="1521" y="422" />
-        <di:waypoint xsi:type="dc:Point" x="1598" y="422" />
-        <di:waypoint xsi:type="dc:Point" x="1598" y="422" />
-        <di:waypoint xsi:type="dc:Point" x="1675" y="422" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="1568" y="416" width="90" height="12" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_115mdln_di" bpmnElement="SequenceFlow_115mdln">
         <di:waypoint xsi:type="dc:Point" x="110" y="868" />
         <di:waypoint xsi:type="dc:Point" x="293" y="868" />
@@ -682,16 +515,6 @@ dcsi.preProcessAAIPUT(execution)]]></bpmn2:script>
           <dc:Bounds x="724.5" y="400" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNShape id="ScriptTask_17ssed5_di" bpmnElement="ScriptTask_17ssed5">
-        <dc:Bounds x="1675" y="382" width="100" height="80" />
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="SequenceFlow_1i45vfx_di" bpmnElement="SequenceFlow_1i45vfx">
-        <di:waypoint xsi:type="dc:Point" x="1775" y="422" />
-        <di:waypoint xsi:type="dc:Point" x="1951" y="422" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="1818" y="401" width="90" height="12" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ScriptTask_0acnvkp_di" bpmnElement="ScriptTask_0acnvkp">
         <dc:Bounds x="1152" y="600" width="100" height="80" />
       </bpmndi:BPMNShape>
@@ -721,29 +544,6 @@ dcsi.preProcessAAIPUT(execution)]]></bpmn2:script>
           <dc:Bounds x="1925" y="890" width="90" height="24" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="ScriptTask_1na4qzo_di" bpmnElement="ScriptTask_1na4qzo">
-        <dc:Bounds x="1152" y="828" width="100" height="80" />
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="ServiceTask_0c13nyt_di" bpmnElement="ServiceTask_0c13nyt">
-        <dc:Bounds x="1421" y="828" width="100" height="80" />
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="ScriptTask_0iq531p_di" bpmnElement="ScriptTask_0iq531p">
-        <dc:Bounds x="1675" y="828" width="100" height="80" />
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="SequenceFlow_0s57qft_di" bpmnElement="SequenceFlow_0s57qft">
-        <di:waypoint xsi:type="dc:Point" x="1775" y="868" />
-        <di:waypoint xsi:type="dc:Point" x="1951" y="868" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="1818" y="847" width="90" height="12" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="SequenceFlow_1eg944u_di" bpmnElement="SequenceFlow_1eg944u">
-        <di:waypoint xsi:type="dc:Point" x="1521" y="868" />
-        <di:waypoint xsi:type="dc:Point" x="1675" y="868" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="1553" y="847" width="90" height="12" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="CallActivity_1nm9zq7_di" bpmnElement="CallActivity_1nm9zq7">
         <dc:Bounds x="1410" y="1333" width="100" height="80" />
       </bpmndi:BPMNShape>
@@ -829,13 +629,6 @@ dcsi.preProcessAAIPUT(execution)]]></bpmn2:script>
           <dc:Bounds x="1939" y="1143" width="82" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="SequenceFlow_1ryg78h_di" bpmnElement="SequenceFlow_1ryg78h">
-        <di:waypoint xsi:type="dc:Point" x="1775" y="1121" />
-        <di:waypoint xsi:type="dc:Point" x="1951" y="1121" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="1863" y="1100" width="0" height="12" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="IntermediateThrowEvent_0hucdtk_di" bpmnElement="IntermediateThrowEvent_0hucdtk">
         <dc:Bounds x="1951" y="1355" width="36" height="36" />
         <bpmndi:BPMNLabel>
@@ -853,9 +646,9 @@ dcsi.preProcessAAIPUT(execution)]]></bpmn2:script>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_167wc99_di" bpmnElement="SequenceFlow_167wc99">
         <di:waypoint xsi:type="dc:Point" x="958" y="422" />
-        <di:waypoint xsi:type="dc:Point" x="1152" y="422" />
+        <di:waypoint xsi:type="dc:Point" x="1951" y="422" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="1055" y="401" width="0" height="12" />
+          <dc:Bounds x="1409.5" y="401" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="IntermediateThrowEvent_09ur9ds_di" bpmnElement="IntermediateThrowEvent_09ur9ds">
@@ -878,25 +671,18 @@ dcsi.preProcessAAIPUT(execution)]]></bpmn2:script>
           <dc:Bounds x="1863" y="619" width="0" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="SequenceFlow_1fa1yjd_di" bpmnElement="SequenceFlow_1fa1yjd">
-        <di:waypoint xsi:type="dc:Point" x="1252" y="868" />
-        <di:waypoint xsi:type="dc:Point" x="1421" y="868" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="1336.5" y="847" width="0" height="12" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_1nqfgvs_di" bpmnElement="SequenceFlow_1nqfgvs">
         <di:waypoint xsi:type="dc:Point" x="958" y="868" />
-        <di:waypoint xsi:type="dc:Point" x="1152" y="868" />
+        <di:waypoint xsi:type="dc:Point" x="1951" y="868" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="1055" y="847" width="0" height="12" />
+          <dc:Bounds x="1409.5" y="847" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_1uu6uiu_di" bpmnElement="SequenceFlow_1uu6uiu">
         <di:waypoint xsi:type="dc:Point" x="958" y="1121" />
-        <di:waypoint xsi:type="dc:Point" x="1152" y="1121" />
+        <di:waypoint xsi:type="dc:Point" x="1951" y="1121" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="1055" y="1100" width="0" height="12" />
+          <dc:Bounds x="1409.5" y="1100" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="SubProcess_0jo0nms_di" bpmnElement="SubProcess_0jo0nms" isExpanded="true">
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"
+                                                  }
                                                ]
                                }
                }
index 0dc8d6d..b2db869 100644 (file)
@@ -31,7 +31,7 @@
                <dependency>\r
                        <groupId>commons-fileupload</groupId>\r
                        <artifactId>commons-fileupload</artifactId>\r
-                       <version>1.3.2</version>\r
+                       <version>1.3.3</version>\r
                </dependency>\r
                <dependency>\r
                        <groupId>javax.ws.rs</groupId>\r
diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/AzureConfig.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/AzureConfig.java
new file mode 100644 (file)
index 0000000..ddfd1fd
--- /dev/null
@@ -0,0 +1,75 @@
+/*-\r
+ * ============LICENSE_START=======================================================\r
+ * ONAP - SO\r
+ * ================================================================================\r
+ * Copyright (C) 2018 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.cloudify.v3.model;\r
+\r
+import java.io.Serializable;\r
+\r
+import com.fasterxml.jackson.annotation.JsonProperty;\r
+\r
+public class AzureConfig implements Serializable {\r
+\r
+       private static final long serialVersionUID = 1L;\r
+       \r
+       @JsonProperty("subscription_id")\r
+       String subscriptionId;\r
+\r
+       @JsonProperty("tenant_id")\r
+       String tenantId;\r
+\r
+       @JsonProperty("client_id")\r
+       String clientId;\r
+\r
+       @JsonProperty("client_secret")\r
+       String clientSecret;\r
+\r
+       public String getSubscriptionId() {\r
+               return subscriptionId;\r
+       }\r
+\r
+       public void setSubscriptionId(String subscriptionId) {\r
+               this.subscriptionId = subscriptionId;\r
+       }\r
+\r
+       public String getTenantId() {\r
+               return tenantId;\r
+       }\r
+\r
+       public void setTenantId(String tenantId) {\r
+               this.tenantId = tenantId;\r
+       }\r
+\r
+       public String getClientId() {\r
+               return clientId;\r
+       }\r
+\r
+       public void setClientId(String clientId) {\r
+               this.clientId = clientId;\r
+       }\r
+\r
+       public String getClientSecret() {\r
+               return clientSecret;\r
+       }\r
+\r
+       public void setClientSecret(String clientSecret) {\r
+               this.clientSecret = clientSecret;\r
+       }\r
+       \r
+}
\ No newline at end of file
index 97bfc0d..93b6c8f 100644 (file)
@@ -21,7 +21,7 @@
                <jax-rs-version>1.1.1</jax-rs-version>
                <json4s-jackson-version>3.2.4</json4s-jackson-version>
                <json4s-core-version>3.0.0</json4s-core-version>
-               <fasterxml-json-version>2.2.2</fasterxml-json-version>
+               <fasterxml-json-version>2.8.7</fasterxml-json-version>
                <scala-lang-version>2.9.1-1</scala-lang-version>
                <reflections-version>0.9.9-RC1</reflections-version>
                <javassist-version>3.16.1-GA</javassist-version>
@@ -94,9 +94,9 @@
                  <version>1.9.13</version>
                </dependency>
                <dependency>
-                 <groupId>org.codehaus.jackson</groupId>
-                 <artifactId>jackson-mapper-asl</artifactId>
-                 <version>1.9.13</version>
+                 <groupId>com.fasterxml.jackson.core</groupId>
+                 <artifactId>jackson-databind</artifactId>
+                 <version>2.8.7</version>
                </dependency>
 
                <dependency>
index 6d6227a..2e0b53d 100644 (file)
@@ -40,7 +40,7 @@ import javax.ws.rs.core.Response;
 \r
 import org.apache.http.HttpResponse;\r
 import org.apache.http.HttpStatus;\r
-import org.codehaus.jackson.map.ObjectMapper;\r
+import com.fasterxml.jackson.databind.ObjectMapper;\r
 import org.hibernate.Session;\r
 import org.json.JSONObject;\r
 import org.openecomp.mso.apihandler.common.ErrorNumbers;\r
index e7ff2f6..5b48cbe 100644 (file)
@@ -23,7 +23,7 @@ package org.openecomp.mso.apihandlerinfra.e2eserviceinstancebeans;
 \r
 import java.sql.Timestamp;\r
 \r
-import org.codehaus.jackson.map.annotate.JsonSerialize;\r
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;\r
 \r
 @JsonSerialize(include = JsonSerialize.Inclusion.NON_DEFAULT)\r
 public class E2ERequest {\r
index 4920814..590ac7c 100644 (file)
@@ -670,7 +670,7 @@ public class E2EServiceInstancesTest {
                Response resp = instance.createE2EServiceInstance(request, "v3");\r
                String respStr = resp.getEntity().toString();\r
                assertTrue(respStr\r
-            .contains("Mapping of request to JSON object failed.  No content to map to Object due to end of input"));\r
+            .contains("Mapping of request to JSON object failed.  No content to map due to end-of-input"));\r
        }\r
 \r
        @Ignore // 1802 merge\r
index 3c35fed..b182192 100644 (file)
@@ -22,6 +22,9 @@ package org.openecomp.mso.apihandlerinfra;
 
 import static org.junit.Assert.assertTrue;
 
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
 import java.lang.reflect.Field;
 import java.net.URI;
 import java.sql.Timestamp;
@@ -34,20 +37,38 @@ import javax.ws.rs.core.UriInfo;
 import mockit.Mock;
 import mockit.MockUp;
 
+import org.apache.http.HttpResponse;
+import org.apache.http.ProtocolVersion;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.entity.BasicHttpEntity;
+import org.apache.http.message.BasicHttpResponse;
+import org.junit.AfterClass;
 import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.mockito.Mockito;
 
+import org.openecomp.mso.apihandler.common.CamundaClient;
 import org.openecomp.mso.apihandlerinfra.networkbeans.NetworkRequest;
+import org.openecomp.mso.db.catalog.CatalogDatabase;
+import org.openecomp.mso.db.catalog.beans.NetworkRecipe;
+import org.openecomp.mso.db.catalog.beans.VfModule;
+import org.openecomp.mso.db.catalog.beans.VnfResource;
+import org.openecomp.mso.properties.MsoPropertiesFactory;
 import org.openecomp.mso.requestsdb.InfraActiveRequests;
 import org.openecomp.mso.requestsdb.InfraRequests;
 import org.openecomp.mso.requestsdb.RequestsDatabase;
 
 public class NetworkRequestHandlerTest {
+       private static final String REQ_XML = "<network-request xmlns=\"http://org.openecomp/mso/infra/network-request/v1\"> <request-info> <request-id>e1fc3ed3-31e5-48a8-913b-23184c1e9443</request-id><action>CREATE</action> <source>VID</source> <service-instance-id>e1fc3ed3-31e5-48a8-913b-23184c1e9443</service-instance-id></request-info> <network-inputs> <network-id>e1fc3ed3-31e5-48a8-913b-23184c1e9443</network-id> <network-name>nwInstanceName</network-name> <network-type>nwModelName</network-type><modelCustomizationId>e1fc3ed3-31e5-48a8-913b-23184c1e9443</modelCustomizationId> <aic-cloud-region>e1fc3ed3-31e5-48a8-913b-23184c1e9443</aic-cloud-region> <tenant-id>e1fc3ed3-31e5-48a8-913b-23184c1e9443</tenant-id><service-id>e1fc3ed3-31e5-48a8-913b-23184c1e9443</service-id> <backout-on-failure>false</backout-on-failure><sdncVersion>1802</sdncVersion><service-instance-id>e1fc3ed3-31e5-48a8-913b-23184c1e9443</service-instance-id></network-inputs> <network-params></network-params> </network-request>";
+
+       private static MockUp<RequestsDatabase> mockRDB;
+       private static MockUp<NetworkMsoInfraRequest> mockMsoRequest;
+       private static MockUp<CatalogDatabase> mockCDB;
+       private static MockUp<CamundaClient> mockCamundaClient;
 
        NetworkRequestHandler handler = null;
-       
-UriInfo uriInfo = null;
+       UriInfo uriInfo = null;
        
        @Before
        public void setup() throws Exception{
@@ -63,31 +84,127 @@ UriInfo uriInfo = null;
         f1.set(handler, uriInfo);
 
        }
+
+       @BeforeClass
+       public static void setUp() throws Exception {
+               MsoPropertiesFactory msoPropertiesFactory = new MsoPropertiesFactory();
+               msoPropertiesFactory.removeAllMsoProperties();
+               msoPropertiesFactory.initializeMsoProperties(Constants.MSO_PROP_APIHANDLER_INFRA, "src/test/resources/mso.apihandler-infra.properties");
+
+               mockRDB = new MockUp<RequestsDatabase>() {
+                       @Mock
+                       public InfraActiveRequests checkDuplicateByVnfName (String vnfName, String action, String requestType) {
+                               return null;
+                       }
+                       @Mock
+                       public int updateInfraStatus (String requestId, String requestStatus, long progress, String lastModifiedBy) {
+                               return 1;
+                       }
+
+                       @Mock
+                       public int updateInfraFinalStatus (String requestId, String requestStatus, String statusMessage, long progress, String responseBody, String lastModifiedBy) {
+                               return 1;
+                       }
+               };
+
+               mockMsoRequest = new MockUp<NetworkMsoInfraRequest>() {
+                       @Mock
+                       public void createRequestRecord (Status status) {
+                               return;
+                       }
+               };
+
+               mockCDB = new MockUp<CatalogDatabase>() {
+                       @Mock
+                       public NetworkRecipe getNetworkRecipe (String networkType, String action, String serviceType) {
+                               final NetworkRecipe networkRecipe = new NetworkRecipe();
+                               networkRecipe.setOrchestrationUri("test/vnf");
+                               networkRecipe.setRecipeTimeout(180);
+                               return networkRecipe;
+                       }
+
+                       @Mock
+                       public VfModule getVfModuleType(String type, String version) {
+                               final VfModule vfModule = new VfModule();
+                               return vfModule;
+                       }
+
+                       @Mock
+                       public VnfResource getVnfResource (String vnfType, String serviceVersion) {
+                               final VnfResource vnfResource = new VnfResource();
+                               return vnfResource;
+                       }
+               };
+
+               mockCamundaClient = new MockUp<CamundaClient>() {
+                       @Mock
+                       public HttpResponse post(String camundaReqXML, String requestId,
+                                                                        String requestTimeout, String schemaVersion, String serviceInstanceId, String action)
+                                       throws ClientProtocolException, IOException {
+                               ProtocolVersion pv = new ProtocolVersion("HTTP",1,1);
+                               HttpResponse resp = new BasicHttpResponse(pv,200, "test response");
+                               BasicHttpEntity entity = new BasicHttpEntity();
+                               String body = "{\"response\":\"success\",\"message\":\"success\"}";
+                               InputStream instream = new ByteArrayInputStream(body.getBytes());
+                               entity.setContent(instream);
+                               resp.setEntity(entity);
+                               return resp;
+                       }
+               };
+
+       }
+
+       @AfterClass
+       public static void tearDown() {
+               mockRDB.tearDown();
+               mockMsoRequest.tearDown();
+               mockCDB.tearDown();
+               mockCamundaClient.tearDown();
+       }
        
        @Test
        public void manageVnfRequestTest(){
                Mockito.when(uriInfo.getRequestUri()).thenReturn(URI.create("http://localhost:8080/test"));
-               Response resp = handler.manageNetworkRequest("<name>Test</name>", "v2");
+               Response resp = handler.manageNetworkRequest(REQ_XML, "v2");
                assertTrue(null != resp);
        }
 
        @Test
        public void manageVnfRequestTestV1(){
                Mockito.when(uriInfo.getRequestUri()).thenReturn(URI.create("http://localhost:8080/test"));
-               Response resp = handler.manageNetworkRequest("<name>Test</name>", "v1");
+               Response resp = handler.manageNetworkRequest(REQ_XML, "v1");
                assertTrue(null != resp);
        }
        
        @Test
        public void manageVnfRequestTestV3(){
                Mockito.when(uriInfo.getRequestUri()).thenReturn(URI.create("http://localhost:8080/test"));
-               Response resp = handler.manageNetworkRequest("<name>Test</name>", "v3");
+               Response resp = handler.manageNetworkRequest(REQ_XML, "v3");
                assertTrue(null != resp);
        }
+
+       /*@Test
+       public void manageNetworkRequestTestV3Duplicate(){
+
+               MockUp<RequestsDatabase> mockDuplicate = new MockUp<RequestsDatabase>() {
+                       @Mock
+                       public InfraActiveRequests checkDuplicateByVnfName(String vnfName, String action, String requestType) {
+                               return new InfraActiveRequests();
+                       }
+               };
+
+               try {
+                       Mockito.when(uriInfo.getRequestUri()).thenReturn(URI.create("http://localhost:8080/test"));
+                       Response resp = handler.manageNetworkRequest(REQ_XML, "v3");
+                       assertTrue(null != resp);
+               } finally {
+                       mockDuplicate.tearDown();
+               }
+       }*/
        
        @Test
        public void manageVnfRequestTestInvalidVersion(){
-               Response resp = handler.manageNetworkRequest("<name>Test</name>", "v249");
+               Response resp = handler.manageNetworkRequest(REQ_XML, "v249");
                assertTrue(null != resp);
        }
        
@@ -102,7 +219,7 @@ UriInfo uriInfo = null;
                                return false;
                        }
                };
-               Response resp = handler.manageNetworkRequest("<name>Test</name>", "v2");
+               Response resp = handler.manageNetworkRequest(REQ_XML, "v2");
                assertTrue(null != resp);
        }
        
index 78ed076..ffdf5d4 100644 (file)
@@ -22,14 +22,78 @@ package org.openecomp.mso.apihandlerinfra;
 
 import static org.junit.Assert.assertTrue;
 
+import mockit.Mock;
+import mockit.MockUp;
+import org.apache.http.HttpResponse;
+import org.apache.http.ProtocolVersion;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.entity.BasicHttpEntity;
+import org.apache.http.message.BasicHttpResponse;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
 import org.junit.Test;
+import org.openecomp.mso.apihandler.common.CamundaClient;
+import org.openecomp.mso.apihandlerinfra.volumebeans.ActionType;
+import org.openecomp.mso.apihandlerinfra.volumebeans.RequestStatusType;
 import org.openecomp.mso.apihandlerinfra.volumebeans.VolumeRequest;
+import org.openecomp.mso.db.catalog.CatalogDatabase;
+import org.openecomp.mso.db.catalog.beans.NetworkRecipe;
+import org.openecomp.mso.db.catalog.beans.VfModule;
+import org.openecomp.mso.db.catalog.beans.VnfResource;
+import org.openecomp.mso.properties.MsoPropertiesFactory;
+import org.openecomp.mso.requestsdb.InfraActiveRequests;
 import org.openecomp.mso.requestsdb.InfraRequests;
+import org.openecomp.mso.requestsdb.RequestsDatabase;
+
+import javax.ws.rs.core.Response;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.sql.Timestamp;
+import java.time.LocalDateTime;
+import java.util.Collections;
+import java.util.List;
 
 public class VolumeInfoHandlerTest {
 
        VolumeInfoHandler handler = new VolumeInfoHandler();
-       
+
+       private static MockUp<RequestsDatabase> mockRDB;
+
+       @BeforeClass
+       public static void setUp() throws Exception {
+               MsoPropertiesFactory msoPropertiesFactory = new MsoPropertiesFactory();
+               msoPropertiesFactory.removeAllMsoProperties();
+               msoPropertiesFactory.initializeMsoProperties(Constants.MSO_PROP_APIHANDLER_INFRA, "src/test/resources/mso.apihandler-infra.properties");
+
+               mockRDB = new MockUp<RequestsDatabase>() {
+                       @Mock
+                       public List<InfraActiveRequests> getRequestListFromInfraActive (String queryAttributeName,
+                                                                                                                                                       String queryValue,
+                                                                                                                                                       String requestType) {
+                               final InfraActiveRequests requests = new InfraActiveRequests();
+                               requests.setAction(ActionType.CREATE.name());
+                               requests.setRequestStatus(RequestStatusType.IN_PROGRESS.name());
+                               requests.setStartTime(Timestamp.valueOf(LocalDateTime.now()));
+                               return Collections.singletonList(requests);
+                       }
+                       @Mock
+                       public InfraActiveRequests getRequestFromInfraActive (String requestId, String requestType) {
+                               final InfraActiveRequests requests = new InfraActiveRequests();
+                               requests.setAction(ActionType.CREATE.name());
+                               requests.setRequestStatus(RequestStatusType.IN_PROGRESS.name());
+                               requests.setStartTime(Timestamp.valueOf(LocalDateTime.now()));
+                               return requests;
+                       }
+               };
+
+       }
+
+       @AfterClass
+       public static void tearDown() {
+               mockRDB.tearDown();
+       }
+
        @Test
        public void fillVnfRequestTestV3(){
                VolumeRequest qr = new VolumeRequest();
@@ -51,4 +115,21 @@ public class VolumeInfoHandlerTest {
                String vnfid = (String)qr.getVolumeParams();
                assertTrue(vnfid.equals("test"));
        }
+
+       @Test
+       public void queryFilters() {
+               final Response response = handler.queryFilters("vnf-type", "svc-type", "aicNode", "tenant-id",
+                               "vg-id", "vg-name", "v3");
+       }
+
+       @Test
+       public void queryFilters2() {
+               final Response response = handler.queryFilters(null, "svc-type", "aicNode", "tenant-id",
+                               "vg-id", "vg-name", "v3");
+       }
+
+       @Test
+       public void getRequest() {
+               final Response response = handler.getRequest("request-id", "v3");
+       }
 }
diff --git a/mso-catalog-db/src/test/java/org/openecomp/mso/db/catalog/CatalogDbSessionFactoryManagerTest.java b/mso-catalog-db/src/test/java/org/openecomp/mso/db/catalog/CatalogDbSessionFactoryManagerTest.java
new file mode 100644 (file)
index 0000000..42b93b1
--- /dev/null
@@ -0,0 +1,47 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 Huawei Technologies Co., Ltd. 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.db.catalog;
+
+import org.junit.Test;
+import org.mockito.Mock;
+import org.openecomp.mso.db.catalog.CatalogDbSessionFactoryManager;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.mockito.Mockito.*;
+
+
+public class CatalogDbSessionFactoryManagerTest {
+    @Test
+    public void testgetHibernateConfigFile() {
+        CatalogDbSessionFactoryManager catalogDbSessionFactoryManager = new CatalogDbSessionFactoryManager();
+        System.setProperty("mso.db", "MYSQL");
+        assertNotNull(catalogDbSessionFactoryManager.getHibernateConfigFile());
+    }
+
+    @Test
+    public void testgetHibernateConfigFileNonMSODB() {
+        CatalogDbSessionFactoryManager catalogDbSessionFactoryManager = new CatalogDbSessionFactoryManager();
+        System.setProperty("mso.db", "test");
+        assertNull(catalogDbSessionFactoryManager.getHibernateConfigFile());
+    }
+}
diff --git a/mso-catalog-db/src/test/java/org/openecomp/mso/db/catalog/test/AllottedResourceCustomizationTest.java b/mso-catalog-db/src/test/java/org/openecomp/mso/db/catalog/test/AllottedResourceCustomizationTest.java
new file mode 100644 (file)
index 0000000..101cd5e
--- /dev/null
@@ -0,0 +1,91 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 Huawei Technologies Co., Ltd. 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.db.catalog.test;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openecomp.mso.db.catalog.beans.AllottedResource;
+import org.openecomp.mso.db.catalog.beans.AllottedResourceCustomization;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.sql.Timestamp;
+
+public class AllottedResourceCustomizationTest {
+    @Test
+    public void test(){
+        AllottedResource allottedResource = new AllottedResource();
+        allottedResource.setModelUuid("ModelUuid");
+        allottedResource.setCreated(new Timestamp(System.currentTimeMillis()));
+        allottedResource.setModelVersion("ModelVersion");
+        allottedResource.setDescription("Description");
+        allottedResource.setModelInvariantUuid("ModelInvariantUuid");
+        allottedResource.setModelName("ModelName");
+        allottedResource.setSubcategory("Subcategory");
+        allottedResource.setToscaNodeType("ToscaNodeType");
+        allottedResource.setVersion("Version");
+
+        AllottedResourceCustomization allottedResourceCustomization = new AllottedResourceCustomization();
+        allottedResourceCustomization.setCreated(new Timestamp(System.currentTimeMillis()));
+        allottedResourceCustomization.setAllottedResource(allottedResource);
+        allottedResourceCustomization.setVersion("Version");
+        allottedResourceCustomization.setArModelUuid("ArModelUuid");
+        allottedResourceCustomization.setMaxInstances(100);
+        allottedResourceCustomization.setMinInstances(1);
+        allottedResourceCustomization.setModelCustomizationUuid("ModelCustomizationUuid");
+        allottedResourceCustomization.setModelInstanceName("ModelInstanceName");
+        allottedResourceCustomization.setNfFunction("NfFunction");
+        allottedResourceCustomization.setNfNamingCode("NfNamingCode");
+        allottedResourceCustomization.setNfRole("NfRole");
+        allottedResourceCustomization.setNfType("NfType");
+        allottedResourceCustomization.setTargetNetworkRole("TargetNetworkRole");
+        allottedResourceCustomization.setProvidingServiceModelUuid("ProvidingServiceModelUuid");
+        allottedResourceCustomization.setProvidingServiceModelInvariantUuid("ProvidingServiceModelInvariantUuid");
+        allottedResourceCustomization.setProvidingServiceModelName("ProvidingServiceModelName");
+
+        assertNotNull(allottedResource.getModelUuid());
+        assertNotNull(allottedResource.getCreated());
+        assertNotNull(allottedResource.getModelVersion());
+        assertNotNull(allottedResource.getDescription());
+        assertNotNull(allottedResource.getModelInvariantUuid());
+        assertNotNull(allottedResource.getModelName());
+        assertNotNull(allottedResource.getSubcategory());
+        assertNotNull(allottedResource.getToscaNodeType());
+        assertNotNull(allottedResource.getVersion());
+
+        assertNotNull(allottedResourceCustomization.getAllottedResource());
+        assertNotNull(allottedResourceCustomization.getVersion());
+        assertNotNull(allottedResourceCustomization.getCreated());
+        assertNotNull(allottedResourceCustomization.getArModelUuid());
+        assertNotNull(allottedResourceCustomization.getMaxInstances());
+        assertNotNull(allottedResourceCustomization.getMinInstances());
+        assertNotNull(allottedResourceCustomization.getModelCustomizationUuid());
+        assertNotNull(allottedResourceCustomization.getModelInstanceName());
+        assertNotNull(allottedResourceCustomization.getNfFunction());
+        assertNotNull(allottedResourceCustomization.getNfNamingCode());
+        assertNotNull(allottedResourceCustomization.getNfRole());
+        assertNotNull(allottedResourceCustomization.getNfType());
+        assertNotNull(allottedResourceCustomization.getTargetNetworkRole());
+        assertNotNull(allottedResourceCustomization.getProvidingServiceModelUuid());
+        assertNotNull(allottedResourceCustomization.getProvidingServiceModelInvariantUuid());
+        assertNotNull(allottedResourceCustomization.getProvidingServiceModelName());
+    }
+}
index 7e6a5da..3db674b 100644 (file)
@@ -7,9 +7,9 @@
  * 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.
@@ -22,6 +22,9 @@ package org.openecomp.mso.db.catalog.test;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
 
 import java.io.Serializable;
 import java.util.ArrayList;
@@ -37,33 +40,14 @@ import org.hibernate.NonUniqueResultException;
 import org.hibernate.Query;
 import org.hibernate.Session;
 import org.junit.After;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
 import org.openecomp.mso.db.catalog.CatalogDatabase;
-import org.openecomp.mso.db.catalog.beans.AllottedResource;
-import org.openecomp.mso.db.catalog.beans.AllottedResourceCustomization;
-import org.openecomp.mso.db.catalog.beans.HeatEnvironment;
-import org.openecomp.mso.db.catalog.beans.HeatFiles;
-import org.openecomp.mso.db.catalog.beans.HeatTemplate;
-import org.openecomp.mso.db.catalog.beans.HeatTemplateParam;
-import org.openecomp.mso.db.catalog.beans.NetworkResource;
-import org.openecomp.mso.db.catalog.beans.NetworkResourceCustomization;
-import org.openecomp.mso.db.catalog.beans.Service;
-import org.openecomp.mso.db.catalog.beans.ServiceRecipe;
-import org.openecomp.mso.db.catalog.beans.ServiceToResourceCustomization;
-import org.openecomp.mso.db.catalog.beans.TempNetworkHeatTemplateLookup;
-import org.openecomp.mso.db.catalog.beans.ToscaCsar;
-import org.openecomp.mso.db.catalog.beans.VfModule;
-import org.openecomp.mso.db.catalog.beans.VfModuleCustomization;
-import org.openecomp.mso.db.catalog.beans.VfModuleToHeatFiles;
-import org.openecomp.mso.db.catalog.beans.VnfComponent;
-import org.openecomp.mso.db.catalog.beans.VnfComponentsRecipe;
-import org.openecomp.mso.db.catalog.beans.VnfRecipe;
-import org.openecomp.mso.db.catalog.beans.VnfResource;
-import org.openecomp.mso.db.catalog.beans.VnfResourceCustomization;
+import org.openecomp.mso.db.catalog.beans.*;
 import org.openecomp.mso.db.catalog.utils.RecordNotFoundException;
 
 import mockit.Mock;
@@ -77,6 +61,9 @@ public class CatalogDatabaseTest {
     private MockUp<CatalogDatabase> mockCd = null;
     private MockUp<Session> mockedSession = null;
     private MockUp<Query> mockUpQuery = null;
+    private MockUp<Query> mockUpQuery2 = null;
+    private MockUp<Query> mockUpQuery3 = null;
+    private MockUp<Query> mockUpQuery4 = null;
     @Before
     public void setup(){
         cd = CatalogDatabase.getInstance();
@@ -861,7 +848,9 @@ public class CatalogDatabaseTest {
 
         assertEquals("123-uuid", service.getModelUUID());
 
-
+        map.remove("serviceNameVersionId");
+        service = cd.getService(map, "123");
+        assertNotNull(service);
     }
 
     @Test
@@ -2428,8 +2417,64 @@ public class CatalogDatabaseTest {
     }
     @Test
     public void getVnfResourceCustomizationByVnfModelCustomizationNameAndModelVersionIdTest(){
-       thrown.expect(Exception.class);
-        cd.getVnfResourceCustomizationByVnfModelCustomizationNameAndModelVersionId("4993493","test");
+
+        mockUpQuery = new MockUp<Query>() {
+
+            @Mock
+            public List<VnfResourceCustomization> list() {
+                VnfResourceCustomization vnfResourceCustomization = new VnfResourceCustomization();
+                return Arrays.asList(vnfResourceCustomization);
+            }
+        };
+
+        mockedSession = new MockUp<Session>() {
+            @Mock
+            public Query createQuery(String hql) {
+                assertTrue(hql.contains("SELECT vrc FROM VnfResourceCustomization as vrc WHERE vrc.vnfResourceModelUuid IN (SELECT vr.modelUuid FROM VnfResource vr WHERE vr.modelUuid = :modelVersionId)AND vrc.modelInstanceName = :modelCustomizationName"));
+                return mockUpQuery.getMockInstance();
+            }
+        };
+
+        mockCd = new MockUp<CatalogDatabase>() {
+            @Mock
+            private Session getSession() {
+                return mockedSession.getMockInstance();
+            }
+        };
+        assertNotNull(cd.getVnfResourceCustomizationByVnfModelCustomizationNameAndModelVersionId("modelCustomizationName","modelVersionId"));
+
+        VnfResourceCustomization result = cd.getVnfResourceCustomizationByVnfModelCustomizationNameAndModelVersionId("4993493", "test");
+        assertNotNull(result);
+    }
+
+    @Test
+    public void getVnfResourceCustomizationByVnfModelCustomizationNameAndModelVersionId_NullReturnTest(){
+
+        mockUpQuery = new MockUp<Query>() {
+
+            @Mock
+            public List<VnfResourceCustomization> list() {
+                return Arrays.asList();
+            }
+        };
+
+        mockedSession = new MockUp<Session>() {
+            @Mock
+            public Query createQuery(String hql) {
+                assertTrue(hql.contains("SELECT vrc FROM VnfResourceCustomization as vrc WHERE vrc.vnfResourceModelUuid IN (SELECT vr.modelUuid FROM VnfResource vr WHERE vr.modelUuid = :modelVersionId)AND vrc.modelInstanceName = :modelCustomizationName"));
+                return mockUpQuery.getMockInstance();
+            }
+        };
+
+        mockCd = new MockUp<CatalogDatabase>() {
+            @Mock
+            private Session getSession() {
+                return mockedSession.getMockInstance();
+            }
+        };
+
+        VnfResourceCustomization result = cd.getVnfResourceCustomizationByVnfModelCustomizationNameAndModelVersionId("4993493", "test");
+        assertNull(result);
     }
     @Test
     public void getAllVfModuleCustomizationstest(){
@@ -2480,22 +2525,48 @@ public class CatalogDatabaseTest {
     }
     @Test
     public void getSTRTest(){
-       thrown.expect(Exception.class);
-        cd.getSTR("4993493","test","vnf");
+        mockUpQuery = new MockUp<Query>() {
+
+            @Mock
+            public List<ServiceToResourceCustomization> list() {
+                ServiceToResourceCustomization vnfResourceCustomization = new ServiceToResourceCustomization();
+                return Arrays.asList(vnfResourceCustomization);
+            }
+        };
+
+        mockedSession = new MockUp<Session>() {
+            @Mock
+            public Query createQuery(String hql) {
+                return mockUpQuery.getMockInstance();
+            }
+        };
+
+        mockCd = new MockUp<CatalogDatabase>() {
+            @Mock
+            private Session getSession() {
+                return mockedSession.getMockInstance();
+            }
+        };
+
+        List<ServiceToResourceCustomization> str = cd.getSTR("4993493", "test", "vnf");
+        assertFalse(str.isEmpty());
+
     }
     @Test
     public void getVRCtoVFMCTest(){
-       mockUpQuery = new MockUp<Query>() {
+        mockUpQuery = new MockUp<Query>() {
 
             @Mock
-            public List<VfModule> list() throws Exception {
-                return Collections.emptyList();
+            public List<VnfResCustomToVfModuleCustom> list() {
+                VnfResCustomToVfModuleCustom vnfResourceCustomization = new VnfResCustomToVfModuleCustom();
+                return Arrays.asList(vnfResourceCustomization);
             }
         };
 
         mockedSession = new MockUp<Session>() {
             @Mock
             public Query createQuery(String hql) {
+                assertTrue(hql.contains("FROM VnfResCustomToVfModuleCustom WHERE vnfResourceCustModelCustomizationUuid = :vrc_mcu AND vfModuleCustModelCustomizationUuid = :vfmc_mcu"));
                 return mockUpQuery.getMockInstance();
             }
         };
@@ -2506,7 +2577,9 @@ public class CatalogDatabaseTest {
                 return mockedSession.getMockInstance();
             }
         };
-        assertEquals(cd.getVRCtoVFMC("4993493","388492").size(), 0);
+
+        List<VnfResCustomToVfModuleCustom> vrCtoVFMC = cd.getVRCtoVFMC("4993493", "388492");
+        assertFalse(vrCtoVFMC.isEmpty());
     }
     @Test
     public void getVfModuleTypeByUuidTestException(){
@@ -2516,8 +2589,30 @@ public class CatalogDatabaseTest {
 
     @Test
     public void getTempNetworkHeatTemplateLookupTest(){
-       thrown.expect(Exception.class);
-        cd.getTempNetworkHeatTemplateLookup("4993493");
+        mockUpQuery = new MockUp<Query>() {
+
+            @Mock
+            public List<TempNetworkHeatTemplateLookup> list() {
+                TempNetworkHeatTemplateLookup vnfResourceCustomization = new TempNetworkHeatTemplateLookup();
+                return Arrays.asList(vnfResourceCustomization);
+            }
+        };
+
+        mockedSession = new MockUp<Session>() {
+            @Mock
+            public Query createQuery(String hql) {
+                return mockUpQuery.getMockInstance();
+            }
+        };
+
+        mockCd = new MockUp<CatalogDatabase>() {
+            @Mock
+            private Session getSession() {
+                return mockedSession.getMockInstance();
+            }
+        };
+        List<TempNetworkHeatTemplateLookup> tempNetworkHeatTemplateLookup = cd.getTempNetworkHeatTemplateLookup("4993493");
+        assertFalse(tempNetworkHeatTemplateLookup.isEmpty());
     }
 
     @Test
@@ -2604,8 +2699,56 @@ public class CatalogDatabaseTest {
     }
     @Test
     public void getAllAllottedResourcesByServiceModelUuidTest(){
-       thrown.expect(Exception.class);
-        cd.getAllAllottedResourcesByServiceModelUuid("4993493");
+        mockUpQuery = new MockUp<Query>() {
+
+            @Mock
+            public List<ServiceToResourceCustomization> list() {
+                ServiceToResourceCustomization vnfResourceCustomization = new ServiceToResourceCustomization();
+                return Arrays.asList(vnfResourceCustomization);
+            }
+        };
+        mockUpQuery2 = new MockUp<Query>() {
+
+            @Mock
+            public List<AllottedResourceCustomization> list() {
+                AllottedResourceCustomization vnfResourceCustomization = new AllottedResourceCustomization();
+                return Arrays.asList(vnfResourceCustomization);
+            }
+        };
+        mockUpQuery3 = new MockUp<Query>() {
+
+            @Mock
+            public List<AllottedResource> list() {
+                AllottedResource vnfResourceCustomization = new AllottedResource();
+                return Arrays.asList(vnfResourceCustomization);
+            }
+        };
+        mockedSession = new MockUp<Session>() {
+            @Mock
+            public Query createQuery(String hql) {
+                if(hql.contains("ServiceToResourceCustomization")){
+                    return mockUpQuery.getMockInstance();
+
+                }else if(hql.contains("AllottedResource " )){
+                    return mockUpQuery3.getMockInstance();
+
+                } else{
+                    return mockUpQuery2.getMockInstance();
+                }
+
+
+            }
+        };
+
+        mockCd = new MockUp<CatalogDatabase>() {
+            @Mock
+            private Session getSession() {
+                return mockedSession.getMockInstance();
+            }
+        };
+
+        List<AllottedResourceCustomization> allAllottedResourcesByServiceModelUuid = cd.getAllAllottedResourcesByServiceModelUuid("4993493");
+        assertFalse(allAllottedResourcesByServiceModelUuid.isEmpty());
     }
     @Test
     public void getAllAllottedResourcesByServiceModelInvariantUuidTest(){
@@ -2614,8 +2757,68 @@ public class CatalogDatabaseTest {
     }
     @Test
     public void getAllAllottedResourcesByServiceModelInvariantUuid2Test(){
-       thrown.expect(Exception.class);
-        cd.getAllAllottedResourcesByServiceModelInvariantUuid("4993493","test");
+
+        mockUpQuery = new MockUp<Query>() {
+
+            @Mock
+            public List<ServiceToResourceCustomization> list() {
+                ServiceToResourceCustomization vnfResourceCustomization = new ServiceToResourceCustomization();
+                return Arrays.asList(vnfResourceCustomization);
+            }
+        };
+        mockUpQuery2 = new MockUp<Query>() {
+
+            @Mock
+            public List<AllottedResourceCustomization> list() {
+                AllottedResourceCustomization vnfResourceCustomization = new AllottedResourceCustomization();
+                return Arrays.asList(vnfResourceCustomization);
+            }
+        };
+        mockUpQuery3 = new MockUp<Query>() {
+
+            @Mock
+            public List<AllottedResource> list() {
+                AllottedResource vnfResourceCustomization = new AllottedResource();
+                return Arrays.asList(vnfResourceCustomization);
+            }
+        };
+        mockUpQuery4 = new MockUp<Query>() {
+
+            @Mock
+            public List<Service> list() {
+                Service vnfResourceCustomization = new Service();
+                return Arrays.asList(vnfResourceCustomization);
+            }
+        };
+        mockedSession = new MockUp<Session>() {
+            @Mock
+            public Query createQuery(String hql) {
+                if(hql.contains("ServiceToResourceCustomization")){
+                    return mockUpQuery.getMockInstance();
+
+                }else if(hql.contains("AllottedResource " )){
+                    return mockUpQuery3.getMockInstance();
+
+                } else if(hql.contains(" Service ")){
+                    return mockUpQuery4.getMockInstance();
+                }else{
+                    return mockUpQuery2.getMockInstance();
+                }
+
+
+            }
+        };
+
+        mockCd = new MockUp<CatalogDatabase>() {
+            @Mock
+            private Session getSession() {
+                return mockedSession.getMockInstance();
+            }
+        };
+
+
+        List<AllottedResourceCustomization> allottedResourceCustomizations = cd.getAllAllottedResourcesByServiceModelInvariantUuid("4993493", "test");
+        assertFalse(allottedResourceCustomizations.isEmpty());
     }
     @Test
     public void getAllAllottedResourcesByArModelCustomizationUuidTest(){
@@ -2660,11 +2863,12 @@ public class CatalogDatabaseTest {
     }
     @Test
     public void getVfModuleTest(){
-       mockUpQuery = new MockUp<Query>() {
+        mockUpQuery = new MockUp<Query>() {
 
             @Mock
-            public List<VfModule> list() throws Exception {
-                return Collections.emptyList();
+            public List<VfModule> list() {
+                VfModule vnfResourceCustomization = new VfModule();
+                return Arrays.asList(vnfResourceCustomization);
             }
         };
 
@@ -2681,7 +2885,9 @@ public class CatalogDatabaseTest {
                 return mockedSession.getMockInstance();
             }
         };
-        assertEquals(cd.getVfModule("4993493","test","get","v2","vnf").size(), 0);
+
+        List<VfModule> vfModule = cd.getVfModule("4993493", "test", "get", "v2", "vnf");
+        assertFalse(vfModule.isEmpty());
     }
     @Test
     public void getVnfComponentsRecipeTest(){
@@ -2698,52 +2904,75 @@ public class CatalogDatabaseTest {
     }
     @Test
     public void getAllVnfResourcesTest(){
-       thrown.expect(Exception.class);
-        cd.getAllVnfResources();
+        mockUpQuery = new MockUp<Query>() {
+
+            @Mock
+            public List<VnfResource> list() {
+                VnfResource vnfResourceCustomization = new VnfResource();
+                return Arrays.asList(vnfResourceCustomization);
+            }
+        };
+
+        mockedSession = new MockUp<Session>() {
+            @Mock
+            public Query createQuery(String hql) {
+                assertTrue(hql.contains("FROM VnfResource"));
+                return mockUpQuery.getMockInstance();
+            }
+        };
+
+        mockCd = new MockUp<CatalogDatabase>() {
+            @Mock
+            private Session getSession() {
+                return mockedSession.getMockInstance();
+            }
+        };
+        List<VnfResource> allVnfResources = cd.getAllVnfResources();
+        assertFalse(allVnfResources.isEmpty());
     }
     @Test
     public void getVnfResourcesByRoleTest(){
-       thrown.expect(Exception.class);
-        cd.getVnfResourcesByRole("4993493");
+        mockUpQuery = new MockUp<Query>() {
+
+            @Mock
+            public List<VnfResource> list() {
+                VnfResource vnfResourceCustomization = new VnfResource();
+                return Arrays.asList(vnfResourceCustomization);
+            }
+        };
+
+        mockedSession = new MockUp<Session>() {
+            @Mock
+            public Query createQuery(String hql) {
+                assertTrue(hql.contains("FROM VnfResource WHERE vnfRole = :vnfRole"));
+                return mockUpQuery.getMockInstance();
+            }
+        };
+
+        mockCd = new MockUp<CatalogDatabase>() {
+            @Mock
+            private Session getSession() {
+                return mockedSession.getMockInstance();
+            }
+        };
+        List<VnfResource> vnfResourcesByRole = cd.getVnfResourcesByRole("4993493");
+        assertFalse(vnfResourcesByRole.isEmpty());
     }
     @Test
     public void getVnfResourceCustomizationsByRoleTest(){
-       thrown.expect(Exception.class);
-        cd.getVnfResourceCustomizationsByRole("4993493");
-    }
-    @Test
-    public void getAllNetworkResourcesTest(){
-       thrown.expect(Exception.class);
-        cd.getAllNetworkResources();
-    }
-    @Test
-    public void getAllNetworkResourceCustomizationsTest(){
-       thrown.expect(Exception.class);
-        cd.getAllNetworkResourceCustomizations();
-    }
-    @Test
-    public void getAllVfModulesTest(){
-       thrown.expect(Exception.class);
-        cd.getAllVfModules();
-    }
-    @Test
-    public void getAllVfModuleCustomizationsTest(){
-       thrown.expect(Exception.class);
-        cd.getAllVfModuleCustomizations();
-    }
-    @Test
-    public void getAllHeatEnvironmentTest(){
-       mockUpQuery = new MockUp<Query>() {
+        mockUpQuery = new MockUp<Query>() {
 
             @Mock
-            public List<VfModule> list() throws Exception {
-                return Collections.emptyList();
+            public List<VnfResourceCustomization> list() {
+                VnfResourceCustomization vnfResourceCustomization = new VnfResourceCustomization();
+                return Arrays.asList(vnfResourceCustomization);
             }
         };
 
         mockedSession = new MockUp<Session>() {
             @Mock
             public Query createQuery(String hql) {
+                assertTrue(hql.contains("FROM VnfResourceCustomization WHERE nfRole = :vnfRole"));
                 return mockUpQuery.getMockInstance();
             }
         };
@@ -2754,13 +2983,154 @@ public class CatalogDatabaseTest {
                 return mockedSession.getMockInstance();
             }
         };
-        assertEquals(cd.getAllHeatEnvironment().size(), 0);
+        List<VnfResourceCustomization> vnfResourceCustomizationsByRole = cd.getVnfResourceCustomizationsByRole("4993493");
+        assertFalse(vnfResourceCustomizationsByRole.isEmpty());
     }
     @Test
-    public void getHeatEnvironment2Test(){
-       thrown.expect(Exception.class);
-        cd.getHeatEnvironment(4993493);
-    }
+    public void getAllNetworkResourcesTest(){
+        mockUpQuery = new MockUp<Query>() {
+
+            @Mock
+            public List<NetworkResource> list() {
+                NetworkResource vnfResourceCustomization = new NetworkResource();
+                return Arrays.asList(vnfResourceCustomization);
+            }
+        };
+
+        mockedSession = new MockUp<Session>() {
+            @Mock
+            public Query createQuery(String hql) {
+                assertTrue(hql.contains("FROM NetworkResource"));
+                return mockUpQuery.getMockInstance();
+            }
+        };
+
+        mockCd = new MockUp<CatalogDatabase>() {
+            @Mock
+            private Session getSession() {
+                return mockedSession.getMockInstance();
+            }
+        };
+        List<NetworkResource> allNetworkResources = cd.getAllNetworkResources();
+        assertFalse(allNetworkResources.isEmpty());
+    }
+    @Test
+    public void getAllNetworkResourceCustomizationsTest(){
+        mockUpQuery = new MockUp<Query>() {
+
+            @Mock
+            public List<NetworkResourceCustomization> list() {
+                NetworkResourceCustomization vnfResourceCustomization = new NetworkResourceCustomization();
+                return Arrays.asList(vnfResourceCustomization);
+            }
+        };
+
+        mockedSession = new MockUp<Session>() {
+            @Mock
+            public Query createQuery(String hql) {
+                assertTrue(hql.contains("FROM NetworkResourceCustomization"));
+                return mockUpQuery.getMockInstance();
+            }
+        };
+
+        mockCd = new MockUp<CatalogDatabase>() {
+            @Mock
+            private Session getSession() {
+                return mockedSession.getMockInstance();
+            }
+        };
+        List<NetworkResourceCustomization> allNetworkResourceCustomizations = cd.getAllNetworkResourceCustomizations();
+        assertFalse(allNetworkResourceCustomizations.isEmpty());
+    }
+    @Test
+    public void getAllVfModulesTest(){
+        mockUpQuery = new MockUp<Query>() {
+
+            @Mock
+            public List<VfModule> list() {
+                VfModule vnfResourceCustomization = new VfModule();
+                return Arrays.asList(vnfResourceCustomization);
+            }
+        };
+
+        mockedSession = new MockUp<Session>() {
+            @Mock
+            public Query createQuery(String hql) {
+                assertTrue(hql.contains("FROM VfModule"));
+                return mockUpQuery.getMockInstance();
+            }
+        };
+
+        mockCd = new MockUp<CatalogDatabase>() {
+            @Mock
+            private Session getSession() {
+                return mockedSession.getMockInstance();
+            }
+        };
+        List<VfModule> allVfModules = cd.getAllVfModules();
+        assertFalse(allVfModules.isEmpty());
+    }
+    @Test
+    public void getAllVfModuleCustomizationsTest(){
+        mockUpQuery = new MockUp<Query>() {
+
+            @Mock
+            public List<VfModuleCustomization> list() {
+                VfModuleCustomization vnfResourceCustomization = new VfModuleCustomization();
+                return Arrays.asList(vnfResourceCustomization);
+            }
+        };
+
+        mockedSession = new MockUp<Session>() {
+            @Mock
+            public Query createQuery(String hql) {
+                assertTrue(hql.contains("FROM VfModuleCustomization"));
+                return mockUpQuery.getMockInstance();
+            }
+        };
+
+        mockCd = new MockUp<CatalogDatabase>() {
+            @Mock
+            private Session getSession() {
+                return mockedSession.getMockInstance();
+            }
+        };
+        List<VfModuleCustomization> allVfModuleCustomizations = cd.getAllVfModuleCustomizations();
+        assertFalse(allVfModuleCustomizations.isEmpty());
+    }
+    @Test
+    public void getAllHeatEnvironmentTest(){
+        mockUpQuery = new MockUp<Query>() {
+
+            @Mock
+            public List<HeatEnvironment> list() {
+                HeatEnvironment vnfResourceCustomization = new HeatEnvironment();
+                return Arrays.asList(vnfResourceCustomization);
+            }
+        };
+
+        mockedSession = new MockUp<Session>() {
+            @Mock
+            public Query createQuery(String hql) {
+                assertTrue(hql.contains("FROM HeatEnvironment"));
+                return mockUpQuery.getMockInstance();
+            }
+        };
+
+        mockCd = new MockUp<CatalogDatabase>() {
+            @Mock
+            private Session getSession() {
+                return mockedSession.getMockInstance();
+            }
+        };
+        List<HeatEnvironment> allHeatEnvironment = cd.getAllHeatEnvironment();
+        assertFalse(allHeatEnvironment.isEmpty());
+    }
+    @Test
+    public void getHeatEnvironment2Test(){
+       thrown.expect(Exception.class);
+        cd.getHeatEnvironment(4993493);
+    }
     @Test
     public void getNestedTemplatesTest(){
        thrown.expect(Exception.class);
@@ -2913,12 +3283,6 @@ public class CatalogDatabaseTest {
         cd.saveTempNetworkHeatTemplateLookup(t);
     }
     @Test
-    public void saveVfModuleToHeatFiles(){
-        VfModuleToHeatFiles v = new VfModuleToHeatFiles();
-        thrown.expect(Exception.class);
-        cd.saveVfModuleToHeatFiles(v);
-    }
-    @Test
     public void saveVnfResourceToVfModuleCustomizationTest() throws RecordNotFoundException {
         VnfResourceCustomization v =new VnfResourceCustomization();
         VfModuleCustomization vm = new VfModuleCustomization();
@@ -3015,28 +3379,89 @@ public class CatalogDatabaseTest {
     }
     @Test
     public void getNetworkRecipe2Test(){
-       thrown.expect(Exception.class);
-        cd.getNetworkRecipe("test","test1");
+        mockUpQuery = new MockUp<Query>() {
+            @Mock
+            public List<NetworkRecipe> list() {
+                NetworkRecipe heatTemplate = new NetworkRecipe();
+                return Arrays.asList(heatTemplate);
+            }
+        };
+
+        mockedSession = new MockUp<Session>() {
+            @Mock
+            public Query createQuery(String hql) {
+                return mockUpQuery.getMockInstance();
+            }
+        };
+
+        mockCd = new MockUp<CatalogDatabase>() {
+            @Mock
+            private Session getSession() {
+                return mockedSession.getMockInstance();
+            }
+        };
+        NetworkRecipe networkRecipe = cd.getNetworkRecipe("test","test1");assertNotNull(networkRecipe);
+        assertNotNull(networkRecipe);
+
     }
     @Test
     public void getNetworkResourceByModelCustUuidTest(){
 
         cd.getNetworkResourceByModelCustUuid("test");
     }
-    @Test
-    public void getVnfComponentsRecipe2Test(){
-       thrown.expect(Exception.class);
-        cd.getVnfComponentsRecipe("test1","test2","test3","test4");
-    }
+
     @Test
     public void getVnfComponentsRecipeByVfModuleModelUUIdTest(){
-       thrown.expect(Exception.class);
-        cd.getVnfComponentsRecipeByVfModuleModelUUId("test1","test2","test3");
+        mockUpQuery = new MockUp<Query>() {
+            @Mock
+            public List<VnfComponentsRecipe> list() {
+                VnfComponentsRecipe heatTemplate = new VnfComponentsRecipe();
+                return Arrays.asList(heatTemplate);
+            }
+        };
+
+        mockedSession = new MockUp<Session>() {
+            @Mock
+            public Query createQuery(String hql) {
+                return mockUpQuery.getMockInstance();
+            }
+        };
+
+        mockCd = new MockUp<CatalogDatabase>() {
+            @Mock
+            private Session getSession() {
+                return mockedSession.getMockInstance();
+            }
+        };
+        VnfComponentsRecipe vnfComponentsRecipeByVfModuleModelUUId = cd.getVnfComponentsRecipeByVfModuleModelUUId("test1", "test2", "test3");
+        assertNotNull(vnfComponentsRecipeByVfModuleModelUUId);
     }
     @Test
     public void getVnfComponentRecipesTest(){
-       thrown.expect(Exception.class);
-        cd.getVnfComponentRecipes("test");
+        mockUpQuery = new MockUp<Query>() {
+            @Mock
+            public List<VnfComponentsRecipe> list() {
+                VnfComponentsRecipe heatTemplate = new VnfComponentsRecipe();
+                return Arrays.asList(heatTemplate);
+            }
+        };
+
+        mockedSession = new MockUp<Session>() {
+            @Mock
+            public Query createQuery(String hql) {
+                return mockUpQuery.getMockInstance();
+            }
+        };
+
+        mockCd = new MockUp<CatalogDatabase>() {
+            @Mock
+            private Session getSession() {
+                return mockedSession.getMockInstance();
+            }
+        };
+        List<VnfComponentsRecipe> test = cd.getVnfComponentRecipes("test");
+        assertNotNull(test);
+        assertFalse(test.isEmpty());
     }
     @Test
     public void saveOrUpdateVnfComponentTest(){
@@ -3047,29 +3472,135 @@ public class CatalogDatabaseTest {
 
     @Test
     public void getVfModule2Test(){
-       thrown.expect(Exception.class);
-        cd.getVfModule("test");
+        mockUpQuery = new MockUp<Query>() {
+            @Mock
+            public List<VfModule> list() {
+                VfModule heatTemplate = new VfModule();
+                return Arrays.asList(heatTemplate);
+            }
+        };
+
+        mockedSession = new MockUp<Session>() {
+            @Mock
+            public Query createQuery(String hql) {
+                return mockUpQuery.getMockInstance();
+            }
+        };
+
+        mockCd = new MockUp<CatalogDatabase>() {
+            @Mock
+            private Session getSession() {
+                return mockedSession.getMockInstance();
+            }
+        };
+        VfModule test = cd.getVfModule("test");
+        assertNotNull(test);
     }
     @Test
     public void getVfModuleByModelUUIDTest(){
-       thrown.expect(Exception.class);
-        cd.getVfModuleByModelUUID("test");
+        mockUpQuery = new MockUp<Query>() {
+            @Mock
+            public List<VfModule> list() {
+                VfModule heatTemplate = new VfModule();
+                return Arrays.asList(heatTemplate);
+            }
+        };
+
+        mockedSession = new MockUp<Session>() {
+            @Mock
+            public Query createQuery(String hql) {
+                return mockUpQuery.getMockInstance();
+            }
+        };
+
+        mockCd = new MockUp<CatalogDatabase>() {
+            @Mock
+            private Session getSession() {
+                return mockedSession.getMockInstance();
+            }
+        };
+
+        VfModule test = cd.getVfModuleByModelUUID("test");
+        assertNotNull(test);
     }
     @Test
     public void getServiceRecipeByModelUUIDTest(){
-       thrown.expect(Exception.class);
-        cd.getServiceRecipeByModelUUID("test1","test2");
+        mockUpQuery = new MockUp<Query>() {
+            @Mock
+            public List<ServiceRecipe> list() {
+                ServiceRecipe heatTemplate = new ServiceRecipe();
+                return Arrays.asList(heatTemplate);
+            }
+        };
+
+        mockedSession = new MockUp<Session>() {
+            @Mock
+            public Query createQuery(String hql) {
+                return mockUpQuery.getMockInstance();
+            }
+        };
+
+        mockCd = new MockUp<CatalogDatabase>() {
+            @Mock
+            private Session getSession() {
+                return mockedSession.getMockInstance();
+            }
+        };
+
+        Assert.assertNotNull(cd.getServiceRecipeByModelUUID("test1", "test2"));
     }
     @Test
     public void getModelRecipeTest(){
-       thrown.expect(Exception.class);
-        cd.getModelRecipe("test1","test2","test3");
-    }
-    @Test
-    public void healthCheck(){
-       thrown.expect(Exception.class);
-        cd.healthCheck();
-    }
+        mockUpQuery = new MockUp<Query>() {
+            @Mock
+            public List<Object> list() {
+                return new ArrayList();
+            }
+        };
+
+        mockedSession = new MockUp<Session>() {
+            @Mock
+            public Query createQuery(String hql) {
+                return mockUpQuery.getMockInstance();
+            }
+        };
+
+        mockCd = new MockUp<CatalogDatabase>() {
+            @Mock
+            private Session getSession() {
+                return mockedSession.getMockInstance();
+            }
+        };
+
+        Assert.assertNull(cd.getModelRecipe("test1", "test2", "test3"));
+    }
+    @Test
+    @Ignore
+    public void healthCheck(){
+        mockUpQuery = new MockUp<Query>() {
+            @Mock
+            public List<HeatTemplate> list() {
+                HeatTemplate heatTemplate = new HeatTemplate();
+                return Arrays.asList(heatTemplate);
+            }
+        };
+
+        mockedSession = new MockUp<Session>() {
+            @Mock
+            public Query createSQLQuery(String hql) {
+                return mockUpQuery.getMockInstance();
+            }
+
+        };
+
+        mockCd = new MockUp<CatalogDatabase>() {
+            @Mock
+            private Session getSession() {
+                return mockedSession.getMockInstance();
+            }
+        };
+        assertNotNull(cd.healthCheck());
+    }
     @Test
     public void executeQuerySingleRow(){
         VnfComponent ar = new VnfComponent();
@@ -3077,10 +3608,521 @@ public class CatalogDatabaseTest {
         thrown.expect(Exception.class);
         cd.executeQuerySingleRow("tets",variables,false);
     }
+
     @Test
     public void executeQueryMultipleRows(){
         HashMap<String, String> variables = new HashMap<>();
-        thrown.expect(Exception.class);
-        cd.executeQueryMultipleRows("select",variables,false);
+
+        mockUpQuery = new MockUp<Query>() {
+            @Mock
+            public List<HeatTemplate> list() {
+                HeatTemplate heatTemplate = new HeatTemplate();
+                return Arrays.asList(heatTemplate);
+            }
+        };
+
+        mockedSession = new MockUp<Session>() {
+            @Mock
+            public Query createQuery(String hql) {
+                return mockUpQuery.getMockInstance();
+            }
+        };
+
+        mockCd = new MockUp<CatalogDatabase>() {
+            @Mock
+            private Session getSession() {
+                return mockedSession.getMockInstance();
+            }
+        };
+
+
+        List<Object> select = cd.executeQueryMultipleRows("select", variables, false);
+        assertFalse(select.isEmpty());
+    }
+
+    @Test
+    public void getArRecipeByNameVersion(){
+        mockUpQuery = new MockUp<Query>() {
+            @Mock
+            public List<ArRecipe> list() {
+                ArRecipe arRecipe = new ArRecipe();
+                return Arrays.asList(arRecipe);
+            }
+        };
+
+        mockedSession = new MockUp<Session>() {
+            @Mock
+            public Query createQuery(String hql) {
+                return mockUpQuery.getMockInstance();
+            }
+        };
+
+        mockCd = new MockUp<CatalogDatabase>() {
+            @Mock
+            private Session getSession() {
+                return mockedSession.getMockInstance();
+            }
+        };
+        assertNotNull(cd.getArRecipeByNameVersion("select","variables","String"));
+    }
+    @Test
+    public void getVnfComponentsRecipe(){
+        mockUpQuery = new MockUp<Query>() {
+            @Mock
+            public List<VnfComponentsRecipe> list() {
+                VnfComponentsRecipe heatTemplate = new VnfComponentsRecipe();
+                return Arrays.asList(heatTemplate);
+            }
+        };
+
+        mockedSession = new MockUp<Session>() {
+            @Mock
+            public Query createQuery(String hql) {
+                return mockUpQuery.getMockInstance();
+            }
+        };
+
+        mockCd = new MockUp<CatalogDatabase>() {
+            @Mock
+            private Session getSession() {
+                return mockedSession.getMockInstance();
+            }
+        };
+        assertNotNull(cd.getVnfComponentsRecipe("vnfType","vnfComponentType","action","serviceType"));
+    }
+    @Test
+    public void getNetworkRecipeByNameVersion(){
+        mockUpQuery = new MockUp<Query>() {
+            @Mock
+            public List<NetworkRecipe> list() {
+                NetworkRecipe heatTemplate = new NetworkRecipe();
+                return Arrays.asList(heatTemplate);
+            }
+        };
+
+        mockedSession = new MockUp<Session>() {
+            @Mock
+            public Query createQuery(String hql) {
+                return mockUpQuery.getMockInstance();
+            }
+        };
+
+        mockCd = new MockUp<CatalogDatabase>() {
+            @Mock
+            private Session getSession() {
+                return mockedSession.getMockInstance();
+            }
+        };
+        assertNotNull(cd.getNetworkRecipeByNameVersion("modelName","modelVersion","action"));
+    }
+    @Test
+    public void saveOrUpdateVfModuleCustomization(){
+        mockUpQuery = new MockUp<Query>() {
+            @Mock
+            public List<NetworkRecipe> list() {
+                NetworkRecipe heatTemplate = new NetworkRecipe();
+                return Arrays.asList(heatTemplate);
+            }
+        };
+
+        mockedSession = new MockUp<Session>() {
+            @Mock
+            public Query createQuery(String hql) {
+                return mockUpQuery.getMockInstance();
+            }
+        };
+
+        mockCd = new MockUp<CatalogDatabase>() {
+            @Mock
+            private Session getSession() {
+                return mockedSession.getMockInstance();
+            }
+        };
+
+        VfModuleCustomization vfModuleCustomization = new VfModuleCustomization();
+        vfModuleCustomization.setHeatEnvironmentArtifactUuid("HeatEnvironmentArtifactUuid");
+        vfModuleCustomization.setVolEnvironmentArtifactUuid("VolEnvironmentArtifactUuid");
+        vfModuleCustomization.setVfModuleModelUuid("VfModuleModelUuid");
+        vfModuleCustomization.setModelCustomizationUuid("ModelCustomizationUuid");
+        cd.saveOrUpdateVfModuleCustomization(vfModuleCustomization);
+    }
+    @Test
+    public void saveServiceToNetworks(){
+        mockUpQuery = new MockUp<Query>() {
+
+            @Mock
+            public List<Service> list() {
+                Service service = new Service();
+                service.setModelUUID("123-uuid");
+                return Arrays.asList(service);
+            }
+        };
+
+        mockedSession = new MockUp<Session>() {
+            @Mock
+            public Query createQuery(String hql) {
+                return mockUpQuery.getMockInstance();
+            }
+        };
+
+        mockCd = new MockUp<CatalogDatabase>() {
+            @Mock
+            private Session getSession() {
+                return mockedSession.getMockInstance();
+            }
+        };
+
+        ServiceToNetworks serviceToNetworks = new ServiceToNetworks();
+        cd.saveServiceToNetworks(serviceToNetworks);
+    }
+    @Test
+    public void saveVfModuleToHeatFiles() {
+        mockUpQuery = new MockUp<Query>() {
+
+            @Mock
+            public List<Service> list() {
+                Service service = new Service();
+                service.setModelUUID("123-uuid");
+                return Arrays.asList(service);
+            }
+        };
+
+        mockedSession = new MockUp<Session>() {
+            @Mock
+            public Query createQuery(String hql) {
+                return mockUpQuery.getMockInstance();
+            }
+        };
+
+        mockCd = new MockUp<CatalogDatabase>() {
+            @Mock
+            private Session getSession() {
+                return mockedSession.getMockInstance();
+            }
+        };
+
+        VfModuleToHeatFiles vfModuleToHeatFiles = new VfModuleToHeatFiles();
+
+        cd.saveVfModuleToHeatFiles(vfModuleToHeatFiles);
+    }
+    @Test
+    public void saveTempNetworkHeatTemplateLookup() {
+        mockUpQuery = new MockUp<Query>() {
+
+            @Mock
+            public List<Service> list() {
+                Service service = new Service();
+                service.setModelUUID("123-uuid");
+                return Arrays.asList(service);
+            }
+        };
+
+        mockedSession = new MockUp<Session>() {
+            @Mock
+            public Query createQuery(String hql) {
+                return mockUpQuery.getMockInstance();
+            }
+        };
+
+        mockCd = new MockUp<CatalogDatabase>() {
+            @Mock
+            private Session getSession() {
+                return mockedSession.getMockInstance();
+            }
+        };
+
+        TempNetworkHeatTemplateLookup tempNetworkHeatTemplateLookup = new TempNetworkHeatTemplateLookup();
+
+        cd.saveTempNetworkHeatTemplateLookup(tempNetworkHeatTemplateLookup);
+    }
+    @Test
+    public void getToscaCsarByServiceModelUUID() {
+        mockUpQuery = new MockUp<Query>() {
+
+            @Mock
+            public List<Service> list() {
+                Service service = new Service();
+                service.setModelUUID("123-uuid");
+                return Arrays.asList(service);
+            }
+        };
+
+        mockedSession = new MockUp<Session>() {
+            @Mock
+            public Query createQuery(String hql) {
+                return mockUpQuery.getMockInstance();
+            }
+        };
+
+        mockCd = new MockUp<CatalogDatabase>() {
+            @Mock
+            private Session getSession() {
+                return mockedSession.getMockInstance();
+            }
+        };
+
+
+        assertNull(cd.getToscaCsarByServiceModelUUID("uuid-123"));
+        cd.close();
+    }
+    @Test
+    public void getVnfRecipeByNameVersion(){
+        mockUpQuery = new MockUp<Query>() {
+
+            @Mock
+            public List<VnfRecipe> list() {
+                VnfRecipe vnfRecipe = new VnfRecipe();
+                return Arrays.asList(vnfRecipe);
+            }
+        };
+
+        mockedSession = new MockUp<Session>() {
+            @Mock
+            public Query createQuery(String hql) {
+                return mockUpQuery.getMockInstance();
+            }
+        };
+
+        mockCd = new MockUp<CatalogDatabase>() {
+            @Mock
+            private Session getSession() {
+                return mockedSession.getMockInstance();
+            }
+        };
+        assertNotNull(cd.getVnfRecipeByNameVersion("modelName","modelVersion","action"));
+    }
+    @Test
+    public void getVnfRecipeByModuleUuid(){
+        mockUpQuery = new MockUp<Query>() {
+
+            @Mock
+            public List<VnfRecipe> list() {
+                VnfRecipe vnfRecipe = new VnfRecipe();
+                return Arrays.asList(vnfRecipe);
+            }
+        };
+
+        mockedSession = new MockUp<Session>() {
+            @Mock
+            public Query createQuery(String hql) {
+                return mockUpQuery.getMockInstance();
+            }
+        };
+
+        mockCd = new MockUp<CatalogDatabase>() {
+            @Mock
+            private Session getSession() {
+                return mockedSession.getMockInstance();
+            }
+        };
+        assertNull(cd.getVnfRecipeByModuleUuid("vnfModelUuid","action"));
+    }
+    @Test
+    public void getVfModuleType(){
+        mockUpQuery = new MockUp<Query>() {
+
+            @Mock
+            public List<VnfRecipe> list() {
+                VnfRecipe vnfRecipe = new VnfRecipe();
+                return Arrays.asList(vnfRecipe);
+            }
+        };
+
+        mockedSession = new MockUp<Session>() {
+            @Mock
+            public Query createQuery(String hql) {
+                return mockUpQuery.getMockInstance();
+            }
+        };
+
+        mockCd = new MockUp<CatalogDatabase>() {
+            @Mock
+            private Session getSession() {
+                return mockedSession.getMockInstance();
+            }
+        };
+        assertNull(cd.getVfModuleType("type","version"));
+    }
+    @Test
+    public void getVfModuleByModelInvariantUuidAndModelVersion(){
+        mockUpQuery = new MockUp<Query>() {
+
+            @Mock
+            public List<VnfRecipe> list() {
+                VnfRecipe vnfRecipe = new VnfRecipe();
+                return Arrays.asList(vnfRecipe);
+            }
+        };
+
+        mockedSession = new MockUp<Session>() {
+            @Mock
+            public Query createQuery(String hql) {
+                return mockUpQuery.getMockInstance();
+            }
+        };
+
+        mockCd = new MockUp<CatalogDatabase>() {
+            @Mock
+            private Session getSession() {
+                return mockedSession.getMockInstance();
+            }
+        };
+        assertNull(cd.getVfModuleByModelInvariantUuidAndModelVersion("modelInvariantUuid","modelVersion"));
+    }
+    @Test
+    public void getVnfResourceCustomizationByModelCustomizationUuid(){
+        mockUpQuery = new MockUp<Query>() {
+
+            @Mock
+            public List<VnfRecipe> list() {
+                VnfRecipe vnfRecipe = new VnfRecipe();
+                return Arrays.asList(vnfRecipe);
+            }
+        };
+
+        mockedSession = new MockUp<Session>() {
+            @Mock
+            public Query createQuery(String hql) {
+                return mockUpQuery.getMockInstance();
+            }
+        };
+
+        mockCd = new MockUp<CatalogDatabase>() {
+            @Mock
+            private Session getSession() {
+                return mockedSession.getMockInstance();
+            }
+        };
+        assertNull(cd.getVnfResourceCustomizationByModelCustomizationUuid("modelCustomizationUuid"));
+    }
+    @Test
+    public void getVfModuleByModelCustomizationIdAndVersion(){
+        mockUpQuery = new MockUp<Query>() {
+
+            @Mock
+            public List<VnfRecipe> list() {
+                VnfRecipe vnfRecipe = new VnfRecipe();
+                return Arrays.asList(vnfRecipe);
+            }
+        };
+
+        mockedSession = new MockUp<Session>() {
+            @Mock
+            public Query createQuery(String hql) {
+                return mockUpQuery.getMockInstance();
+            }
+        };
+
+        mockCd = new MockUp<CatalogDatabase>() {
+            @Mock
+            private Session getSession() {
+                return mockedSession.getMockInstance();
+            }
+        };
+        assertNull(cd.getVfModuleByModelCustomizationIdAndVersion("modelCustomizationUuid","modelVersionId"));
+    }
+    @Test
+    public void getVfModuleByModelCustomizationIdModelVersionAndModelInvariantId(){
+        mockUpQuery = new MockUp<Query>() {
+
+            @Mock
+            public List<VnfRecipe> list() {
+                VnfRecipe vnfRecipe = new VnfRecipe();
+                return Arrays.asList(vnfRecipe);
+            }
+        };
+
+        mockedSession = new MockUp<Session>() {
+            @Mock
+            public Query createQuery(String hql) {
+                return mockUpQuery.getMockInstance();
+            }
+        };
+
+        mockCd = new MockUp<CatalogDatabase>() {
+            @Mock
+            private Session getSession() {
+                return mockedSession.getMockInstance();
+            }
+        };
+        assertNull(cd.getVfModuleByModelCustomizationIdModelVersionAndModelInvariantId("modelCustomizationUuid","modelVersion","modelInvariantId"));
+    }
+    @Test
+    public void getVnfResourceCustomizationByModelInvariantId(){
+        mockUpQuery = new MockUp<Query>() {
+
+            @Mock
+            public List<VnfRecipe> list() {
+                VnfRecipe vnfRecipe = new VnfRecipe();
+                return Arrays.asList(vnfRecipe);
+            }
+        };
+
+        mockedSession = new MockUp<Session>() {
+            @Mock
+            public Query createQuery(String hql) {
+                return mockUpQuery.getMockInstance();
+            }
+        };
+
+        mockCd = new MockUp<CatalogDatabase>() {
+            @Mock
+            private Session getSession() {
+                return mockedSession.getMockInstance();
+            }
+        };
+        assertNull(cd.getVnfResourceCustomizationByModelInvariantId("modelInvariantId","modelVersion","modelCustomizationName"));
+    }
+    @Test
+    public void getVfModuleCustomizationByVnfModuleCustomizationUuid(){
+        mockUpQuery = new MockUp<Query>() {
+
+            @Mock
+            public List<VnfRecipe> list() {
+                VnfRecipe vnfRecipe = new VnfRecipe();
+                return Arrays.asList(vnfRecipe);
+            }
+        };
+
+        mockedSession = new MockUp<Session>() {
+            @Mock
+            public Query createQuery(String hql) {
+                return mockUpQuery.getMockInstance();
+            }
+        };
+
+        mockCd = new MockUp<CatalogDatabase>() {
+            @Mock
+            private Session getSession() {
+                return mockedSession.getMockInstance();
+            }
+        };
+        assertNotNull(cd.getVfModuleCustomizationByVnfModuleCustomizationUuid("modelCustomizationUuid"));
+    }
+    @Test
+    public void getVnfResourceCustomizationByVnfModelCustomizationNameAndModelVersionId(){
+        mockUpQuery = new MockUp<Query>() {
+
+            @Mock
+            public List<VnfResourceCustomization> list() {
+                VnfResourceCustomization vnfResourceCustomization = new VnfResourceCustomization();
+                return Arrays.asList(vnfResourceCustomization);
+            }
+        };
+
+        mockedSession = new MockUp<Session>() {
+            @Mock
+            public Query createQuery(String hql) {
+                return mockUpQuery.getMockInstance();
+            }
+        };
+
+        mockCd = new MockUp<CatalogDatabase>() {
+            @Mock
+            private Session getSession() {
+                return mockedSession.getMockInstance();
+            }
+        };
+        assertNotNull(cd.getVnfResourceCustomizationByVnfModelCustomizationNameAndModelVersionId("modelCustomizationName","modelVersionId"));
     }
 }
diff --git a/mso-catalog-db/src/test/java/org/openecomp/mso/db/catalog/test/RecordNotFoundExceptionTest.java b/mso-catalog-db/src/test/java/org/openecomp/mso/db/catalog/test/RecordNotFoundExceptionTest.java
new file mode 100644 (file)
index 0000000..dac5fb7
--- /dev/null
@@ -0,0 +1,42 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 Huawei Technologies Co., Ltd. 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.db.catalog.test;
+
+import org.junit.Test;
+import org.openecomp.mso.db.catalog.beans.VfModule;
+import org.openecomp.mso.db.catalog.utils.RecordNotFoundException;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertEquals;
+
+
+public class RecordNotFoundExceptionTest {
+
+    @Test
+    public void paramConstructor(){
+        RecordNotFoundException ex = new RecordNotFoundException("Exceoption raised", new Exception());
+        assertNotNull(ex);
+        assertNotNull(ex.getMessage());
+    }
+}
diff --git a/pom.xml b/pom.xml
index 3dffe16..9d1bcc5 100644 (file)
--- a/pom.xml
+++ b/pom.xml
     <dependency>
       <groupId>org.jboss.resteasy</groupId>
       <artifactId>resteasy-jackson2-provider</artifactId>
-      <version>${resteasy.version}</version>
+      <version>3.1.0.Final</version>
     </dependency>
        <dependency>
                <groupId>org.hamcrest</groupId>