Merge "Fix problem with singleton impact on TC execution"
authorSeshu Kumar M <seshu.kumar.m@huawei.com>
Wed, 18 Jul 2018 13:19:12 +0000 (13:19 +0000)
committerGerrit Code Review <gerrit@onap.org>
Wed, 18 Jul 2018 13:19:12 +0000 (13:19 +0000)
101 files changed:
adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/adapters/vdu/VduArtifact.java
adapters/mso-catalog-db-adapter/src/main/java/org/openecomp/mso/adapters/catalogdb/catalogrest/QueryAllottedResourceCustomization.java
adapters/mso-vnf-adapter/src/main/java/org/openecomp/mso/adapters/vdu/mapper/VfModuleCustomizationToVduMapper.java
adapters/mso-vnf-adapter/src/test/java/org/openecomp/mso/adapters/vdu/mapper/VfModuleCustomizationToVduMapperTest.java [new file with mode: 0644]
aria/multivim-plugin/src/main/python/multivim-plugin/cinder_plugin/__init__.py [deleted file]
aria/multivim-plugin/src/main/python/multivim-plugin/cinder_plugin/tests/__init__.py [deleted file]
aria/multivim-plugin/src/main/python/multivim-plugin/cinder_plugin/tests/test_volume.py [deleted file]
aria/multivim-plugin/src/main/python/multivim-plugin/cinder_plugin/volume.py [deleted file]
aria/multivim-plugin/src/main/python/multivim-plugin/glance_plugin/__init__.py [deleted file]
aria/multivim-plugin/src/main/python/multivim-plugin/glance_plugin/image.py [deleted file]
aria/multivim-plugin/src/main/python/multivim-plugin/glance_plugin/tests/resources/test-image-start.yaml [deleted file]
aria/multivim-plugin/src/main/python/multivim-plugin/glance_plugin/tests/test.py [deleted file]
aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/__init__.py [deleted file]
aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/floatingip.py [deleted file]
aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/network.py [deleted file]
aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/port.py [deleted file]
aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/router.py [deleted file]
aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/security_group.py [deleted file]
aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/subnet.py [deleted file]
aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/tests/__init__.py [deleted file]
aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/tests/test.py [deleted file]
aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/tests/test_port.py [deleted file]
aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/tests/test_security_group.py [deleted file]
aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/__init__.py [deleted file]
aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/floatingip.py [deleted file]
aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/keypair.py [deleted file]
aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/security_group.py [deleted file]
aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/server.py [deleted file]
aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/__init__.py [deleted file]
aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/resources/test-keypair-validation-blueprint.yaml [deleted file]
aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/resources/test-server-create-secgroup.yaml [deleted file]
aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/resources/test-start-operation-retry-blueprint.yaml [deleted file]
aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/test_relationships.py [deleted file]
aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/test_server.py [deleted file]
aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/test_server_image_and_flavor.py [deleted file]
aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/test_userdata.py [deleted file]
aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/test_validation.py [deleted file]
aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/userdata.py [deleted file]
asdc-controller/src/main/java/org/openecomp/mso/asdc/client/ASDCController.java
bpmn/MSOCommonBPMN/pom.xml
bpmn/MSOCommonBPMN/src/main/groovy/org/openecomp/mso/bpmn/common/scripts/OofHoming.groovy
bpmn/MSOCommonBPMN/src/main/groovy/org/openecomp/mso/bpmn/common/scripts/OofUtils.groovy
bpmn/MSOCommonBPMN/src/main/java/org/openecomp/mso/client/appc/ApplicationControllerAction.java
bpmn/MSOCommonBPMN/src/main/java/org/openecomp/mso/client/appc/ApplicationControllerClient.java
bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/bpmn/common/OofHomingTest.java
bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/client/appc/ApplicationControllerClientTest.java
bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCallback2AR1Vnf
bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCallback2AR1Vnf2Net
bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCallbackInfraVnf
bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCallbackNoSolutionFound
bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCatalogResp.json
bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/CreateVFCNSResource.groovy
bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/CreateVfModuleInfra.groovy
bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/DoCreateResources.groovy
bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/DoDeleteVFCNetworkServiceInstance.groovy
bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/DoScaleVFCNetworkServiceInstance.groovy
bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/DoUpdateE2EServiceInstance.groovy
bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/DoUpdateE2EServiceInstanceRollback.groovy
bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/ScaleCustomE2EServiceInstance.groovy
bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/UpdateCustomE2EServiceInstance.groovy
bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/vcpe/scripts/CreateVcpeResCustService.groovy
bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/vcpe/scripts/DeleteVcpeResCustService.groovy
bpmn/MSOInfrastructureBPMN/src/main/java/org/openecomp/mso/bpmn/infrastructure/properties/BPMNProperties.java
bpmn/MSOInfrastructureBPMN/src/main/resources/process/CreateCustom3rdONAPServiceInstance.bpmn [new file with mode: 0644]
bpmn/MSOInfrastructureBPMN/src/main/resources/process/CreateVcpeResCustService.bpmn
bpmn/MSOInfrastructureBPMN/src/main/resources/process/CreateVcpeResCustServiceV2.bpmn
bpmn/MSOInfrastructureBPMN/src/main/resources/process/CreateVfModuleInfra.bpmn
bpmn/MSOInfrastructureBPMN/src/main/resources/process/DeleteCustom3rdONAPServiceInstance.bpmn [new file with mode: 0644]
bpmn/MSOInfrastructureBPMN/src/main/resources/subprocess/DoCreateVnfAndModules.bpmn
bpmn/MSOInfrastructureBPMN/src/main/resources/subprocess/DoUpdateE2EServiceInstance.bpmn
bpmn/MSOInfrastructureBPMN/src/test/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/DoCustomDeleteE2EServiceInstanceTest.groovy
bpmn/MSOInfrastructureBPMN/src/test/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/ScaleCustomE2EServiceInstanceTest.groovy
bpmn/MSOInfrastructureBPMN/src/test/groovy/org/openecomp/mso/bpmn/vcpe/scripts/CreateVcpeResCustServiceTest.groovy
bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/CreateVcpeResCustService/arGetById.xml
bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/CreateVcpeResCustService/getCatalogServiceResourcesData.json
bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/DeleteVcpeResCustService/arGetTXCById.xml
bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/DoCreateAllottedResourceTXCRollback/arGetById.xml
bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/DoDeleteAllottedResourceTXC/arGetById.xml
bpmn/MSOInfrastructureBPMN/src/test/resources/mso.bpmn.urn.properties
common/pom.xml
docs/Install_Docker.rst
docs/SO_Interface.rst [moved from docs/SO_R1_Interface.rst with 95% similarity]
docs/images/SO_1.png [new file with mode: 0644]
docs/images/SO_Architecture_1.png
docs/images/SO_R1_1.png [deleted file]
docs/index.rst
docs/installation.rst
docs/offered_consumed_apis.rst
docs/release-notes.rst
mso-api-handlers/mso-api-handler-common/pom.xml
mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/CamundaClient.java
mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/CamundaTaskClient.java
mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/RequestClient.java
mso-api-handlers/mso-api-handler-common/src/test/java/org/openecomp/mso/apihandler/common/CamundaTaskClientTest.java [new file with mode: 0644]
mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/E2EServiceInstances.java
mso-catalog-db/src/main/java/org/openecomp/mso/db/catalog/CatalogDatabase.java
mso-catalog-db/src/main/java/org/openecomp/mso/db/catalog/beans/HeatEnvironment.java
mso-catalog-db/src/main/java/org/openecomp/mso/db/catalog/beans/HeatFiles.java
packages/docker/src/main/docker/docker-files/Dockerfile.mso-chef-final
pom.xml
version.properties

index 394d13d..7696f3b 100644 (file)
@@ -20,6 +20,9 @@
 \r
 package org.openecomp.mso.adapters.vdu;\r
 \r
+import java.util.Arrays;\r
+import java.util.Objects;\r
+\r
 public class VduArtifact {\r
        \r
        // Enumerate the types of artifacts permitted.  This may need to be a variable string\r
@@ -59,6 +62,19 @@ public class VduArtifact {
        }\r
        public void setType(ArtifactType type) {\r
                this.type = type;\r
-       }       \r
-       \r
+       }\r
+\r
+       @Override\r
+       public boolean equals(Object o) {\r
+               if (this == o) {\r
+                       return true;\r
+               }\r
+               if (o == null || getClass() != o.getClass()) {\r
+                       return false;\r
+               }\r
+               VduArtifact that = (VduArtifact) o;\r
+               return Objects.equals(name, that.name) &&\r
+                               Arrays.equals(content, that.content) &&\r
+                               type == that.type;\r
+       }\r
 }
\ No newline at end of file
index 450ffd6..b249b58 100644 (file)
@@ -96,8 +96,8 @@ public class QueryAllottedResourceCustomization extends CatalogQuery {
                    put(valueMap, "MODEL_CUSTOMIZATION_UUID", o.getModelCustomizationUuid());
                    put(valueMap, "MODEL_INSTANCE_NAME",      o.getModelInstanceName());
                            put(valueMap, "TOSCA_NODE_TYPE",      arNull ? null : o.getAllottedResource().getToscaNodeType());
-                           put(valueMap, "ALLOTTED_RESOURCE_TYPE",     arNull ? null : o.getAllottedResource().getSubcategory());
-                           put(valueMap, "ALLOTTED_RESOURCE_ROLE",     o.getTargetNetworkRole());
+                           put(valueMap, "ALLOTTED_RESOURCE_TYPE",     o.getNfType());
+                           put(valueMap, "ALLOTTED_RESOURCE_ROLE",     o.getNfRole());
                            put(valueMap, "NF_TYPE",     o.getNfType());
                            put(valueMap, "NF_ROLE",     o.getNfRole());
                            put(valueMap, "NF_FUNCTION",     o.getNfFunction());
index b04f3c3..d26d3f6 100644 (file)
@@ -20,7 +20,6 @@
 
 package org.openecomp.mso.adapters.vdu.mapper;
 
-import java.sql.SQLException;
 import java.util.List;
 import java.util.Map;
 import org.openecomp.mso.adapters.vdu.VduArtifact;
@@ -39,11 +38,10 @@ public class VfModuleCustomizationToVduMapper {
 
        private static MsoLogger LOGGER = MsoLogger.getMsoLogger(MsoLogger.Catalog.RA);
 
-       public VduModelInfo mapVfModuleCustomizationToVdu(VfModuleCustomization vfModuleCustom) throws SQLException {
-               CatalogDatabase db = CatalogDatabase.getInstance();
+       public VduModelInfo mapVfModuleCustomizationToVdu(VfModuleCustomization vfModuleCustom) {
                VduModelInfo vduModel = new VduModelInfo();
                vduModel.setModelCustomizationUUID(vfModuleCustom.getModelCustomizationUuid());
-               try {
+               try (CatalogDatabase db = CatalogDatabase.getInstance()) {
                        // Map the cloud templates, attached files, and environment file
                        mapCloudTemplates(
                                        db.getHeatTemplateByArtifactUuid(vfModuleCustom.getVfModule().getHeatTemplateArtifactUUId()),
@@ -51,22 +49,14 @@ public class VfModuleCustomizationToVduMapper {
                        mapCloudFiles(vfModuleCustom, vduModel);
                        mapEnvironment(db.getHeatEnvironmentByArtifactUuid(vfModuleCustom.getHeatEnvironmentArtifactUuid()),
                                        vduModel);
-               } catch (SQLException e) {
-                       LOGGER.debug("unhandled exception in mapVfModuleCustomizationToVdu", e);
-                       throw new SQLException("Exception during mapVfModuleCustomizationToVdu " + e.getMessage());
-               } finally {
-                       // Make sure DB session is closed
-                       db.close();
                }
-
                return vduModel;
        }
 
-       public VduModelInfo mapVfModuleCustVolumeToVdu(VfModuleCustomization vfModuleCustom) throws SQLException {
-               CatalogDatabase db = CatalogDatabase.getInstance();
+       public VduModelInfo mapVfModuleCustVolumeToVdu(VfModuleCustomization vfModuleCustom) {
                VduModelInfo vduModel = new VduModelInfo();
                vduModel.setModelCustomizationUUID(vfModuleCustom.getModelCustomizationUuid());
-               try {
+               try (CatalogDatabase db = CatalogDatabase.getInstance()) {
                        // Map the cloud templates, attached files, and environment file
                        mapCloudTemplates(
                                        db.getHeatTemplateByArtifactUuid(vfModuleCustom.getVfModule().getVolHeatTemplateArtifactUUId()),
@@ -74,29 +64,20 @@ public class VfModuleCustomizationToVduMapper {
                        mapCloudFiles(vfModuleCustom, vduModel);
                        mapEnvironment(db.getHeatEnvironmentByArtifactUuid(vfModuleCustom.getVolEnvironmentArtifactUuid()),
                                        vduModel);
-               } catch (SQLException e) {
-                       LOGGER.debug("unhandled exception in mapVfModuleCustVolumeToVdu", e);
-                       throw new SQLException("Exception during mapVfModuleCustVolumeToVdu " + e.getMessage());
-               } finally {
-                       // Make sure DB session is closed
-                       db.close();
                }
-
                return vduModel;
        }
 
-       private void mapCloudTemplates(HeatTemplate heatTemplate, VduModelInfo vduModel) throws SQLException {
+       private void mapCloudTemplates(HeatTemplate heatTemplate, VduModelInfo vduModel) {
                // TODO: These catalog objects will be refactored to be
                // non-Heat-specific
-               CatalogDatabase db = CatalogDatabase.getInstance();
-               try {
+               try (CatalogDatabase db = CatalogDatabase.getInstance()) {
                        List<VduArtifact> vduArtifacts = vduModel.getArtifacts();
 
                        // Main template. Also set the VDU timeout based on the main
                        // template.
                        vduArtifacts.add(mapHeatTemplateToVduArtifact(heatTemplate, ArtifactType.MAIN_TEMPLATE));
                        vduModel.setTimeoutMinutes(heatTemplate.getTimeoutMinutes());
-                       
                        // Nested templates
                        Map<String,Object> nestedTemplates = db.getNestedTemplates(heatTemplate.getArtifactUuid());
                        if (nestedTemplates != null) {
@@ -106,13 +87,9 @@ public class VfModuleCustomizationToVduMapper {
                                        vduArtifacts.add(vduArtifact);
                                }
                        }
-                       
                } catch (IllegalArgumentException e) {
                        LOGGER.debug("unhandled exception in mapCloudTemplates", e);
                        throw new IllegalArgumentException("Exception during mapCloudTemplates " + e.getMessage());
-               } finally {
-                       // Make sure DB session is closed
-                       db.close();
                }
        }
 
@@ -124,26 +101,20 @@ public class VfModuleCustomizationToVduMapper {
                return vduArtifact;
        }
 
-       private void mapCloudFiles(VfModuleCustomization vfModuleCustom, VduModelInfo vduModel) throws SQLException {
+       private void mapCloudFiles(VfModuleCustomization vfModuleCustom, VduModelInfo vduModel) {
                // TODO: These catalog objects will be refactored to be
                // non-Heat-specific
-               CatalogDatabase db = CatalogDatabase.getInstance();
-
-               try{
+               try (CatalogDatabase db = CatalogDatabase.getInstance()) {
                        Map <String, HeatFiles> heatFiles = db.getHeatFilesForVfModule(vfModuleCustom.getVfModuleModelUuid());
                        if (heatFiles != null) {
                                for (HeatFiles heatFile: heatFiles.values()) {
-                                       mapCloudFileToVduArtifact(heatFile, ArtifactType.TEXT_FILE);
+                                       vduModel.getArtifacts().add(mapCloudFileToVduArtifact(heatFile, ArtifactType.TEXT_FILE));
                                }
                        }
                } catch (IllegalArgumentException e) {
                        LOGGER.debug("unhandled exception in mapCloudFiles", e);
                        throw new IllegalArgumentException("Exception during mapCloudFiles " + e.getMessage());
-               } finally {
-                       // Make sure DB session is closed
-                       db.close();
                }
-               
        }
 
        private VduArtifact mapCloudFileToVduArtifact(HeatFiles heatFile, ArtifactType artifactType) {
diff --git a/adapters/mso-vnf-adapter/src/test/java/org/openecomp/mso/adapters/vdu/mapper/VfModuleCustomizationToVduMapperTest.java b/adapters/mso-vnf-adapter/src/test/java/org/openecomp/mso/adapters/vdu/mapper/VfModuleCustomizationToVduMapperTest.java
new file mode 100644 (file)
index 0000000..ffa6bcd
--- /dev/null
@@ -0,0 +1,158 @@
+/*-
+ * ============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.adapters.vdu.mapper;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.openecomp.mso.adapters.vdu.VduArtifact;
+import org.openecomp.mso.adapters.vdu.VduArtifact.ArtifactType;
+import org.openecomp.mso.adapters.vdu.VduModelInfo;
+import org.openecomp.mso.db.catalog.CatalogDatabase;
+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.VfModule;
+import org.openecomp.mso.db.catalog.beans.VfModuleCustomization;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({CatalogDatabase.class})
+public class VfModuleCustomizationToVduMapperTest {
+
+    private static final String HEAT_TEMPLATE_ARTIFACT_UUID = "testHeatTemplate";
+    private static final String VF_MODULE_MODEL_UUID = "vfModuleUuid";
+    private static final String HEAT_ENV_ARTIFACT_UUID = "heatEnvArtifactUuid";
+    private static final String MAIN_TEMPLATE_NAME = "testTempName";
+    private static final String MAIN_TEMPLATE_BODY = "testTempBody";
+    private static final String NESTED_TEMPLATE_KEY = "testKey";
+    private static final String NESTED_TEMPLATE_VALUE = "nestedTemplateTest";
+    private static final String HEAT_FILE_NAME = "heatFileName";
+    private static final String HEAT_FILE_BODY = "heatFileBodyTest";
+    private static final String HEAT_ENV_NAME = "heatEnvName";
+    private static final String HEAT_ENV = "heatEnv";
+    private static final String VOL_HEAT_TEMPLATE_ARTIFACT = "volEnvArtifact";
+    private static final String VOL_ENV_ARTIFACT_UUID = "volEnvArtifactUuid";
+
+    private VfModuleCustomizationToVduMapper testedObject;
+    private CatalogDatabase catalogDatabaseMock;
+
+    @Before
+    public void init() {
+        PowerMockito.mockStatic(CatalogDatabase.class);
+        catalogDatabaseMock = mock(CatalogDatabase.class);
+        testedObject = new VfModuleCustomizationToVduMapper();
+        PowerMockito.when(CatalogDatabase.getInstance()).thenReturn(catalogDatabaseMock);
+        when(catalogDatabaseMock.getNestedTemplates(HEAT_TEMPLATE_ARTIFACT_UUID)).thenReturn(createNestedTemplates());
+        when(catalogDatabaseMock.getHeatFilesForVfModule(VF_MODULE_MODEL_UUID)).thenReturn(createHeatFileMap());
+    }
+
+    @Test
+    public void mapVfModuleCustomizationToVdu_successful() {
+        when(catalogDatabaseMock.getHeatTemplateByArtifactUuid(HEAT_TEMPLATE_ARTIFACT_UUID))
+                .thenReturn(createHeatTemplate());
+        when(catalogDatabaseMock.getHeatEnvironmentByArtifactUuid(HEAT_ENV_ARTIFACT_UUID))
+                .thenReturn(createHeatEnvironment());
+        VduModelInfo result = testedObject.mapVfModuleCustomizationToVdu(createVfModuleCustomization());
+        assertThat(result.getArtifacts()).containsExactly(createExpectedResultArray());
+    }
+
+    @Test
+    public void mapVfModuleCustVolumeToVdu_successful() {
+        when(catalogDatabaseMock.getHeatTemplateByArtifactUuid(VOL_HEAT_TEMPLATE_ARTIFACT))
+                .thenReturn(createHeatTemplate());
+        when(catalogDatabaseMock.getHeatEnvironmentByArtifactUuid(VOL_ENV_ARTIFACT_UUID))
+                .thenReturn(createHeatEnvironment());
+        VduModelInfo result = testedObject.mapVfModuleCustVolumeToVdu(createVfModuleCustomization());
+        assertThat(result.getArtifacts()).containsExactly(createExpectedResultArray());
+    }
+
+    private VfModuleCustomization createVfModuleCustomization() {
+        VfModuleCustomization vfModuleCustomization = new VfModuleCustomization();
+        VfModule vfModule = new VfModule();
+        vfModule.setHeatTemplateArtifactUUId(HEAT_TEMPLATE_ARTIFACT_UUID);
+        vfModule.setVolHeatTemplateArtifactUUId(VOL_HEAT_TEMPLATE_ARTIFACT);
+        vfModuleCustomization.setVfModule(vfModule);
+        vfModuleCustomization.setVfModuleModelUuid(VF_MODULE_MODEL_UUID);
+        vfModuleCustomization.setHeatEnvironmentArtifactUuid(HEAT_ENV_ARTIFACT_UUID);
+        vfModuleCustomization.setVolEnvironmentArtifactUuid(VOL_ENV_ARTIFACT_UUID);
+        return vfModuleCustomization;
+    }
+
+    private HeatTemplate createHeatTemplate() {
+        HeatTemplate heatTemplate = new HeatTemplate();
+        heatTemplate.setTemplateName(MAIN_TEMPLATE_NAME);
+        heatTemplate.setTemplateBody(MAIN_TEMPLATE_BODY);
+        heatTemplate.setArtifactUuid(HEAT_TEMPLATE_ARTIFACT_UUID);
+        return heatTemplate;
+    }
+
+    private Map<String, Object> createNestedTemplates() {
+        Map<String, Object> map = new HashMap<>();
+        map.put(NESTED_TEMPLATE_KEY, NESTED_TEMPLATE_VALUE);
+        return map;
+    }
+
+    private Map<String, HeatFiles> createHeatFileMap() {
+        HeatFiles heatFiles = new HeatFiles();
+        heatFiles.setFileName(HEAT_FILE_NAME);
+        heatFiles.setFileBody(HEAT_FILE_BODY);
+        Map<String, HeatFiles> map = new HashMap<>();
+        map.put("heatFileKey", heatFiles);
+        return map;
+    }
+
+    private HeatEnvironment createHeatEnvironment() {
+        HeatEnvironment heatEnvironment = new HeatEnvironment();
+        heatEnvironment.setName(HEAT_ENV_NAME);
+        heatEnvironment.setEnvironment(HEAT_ENV);
+        return heatEnvironment;
+    }
+
+
+    private VduArtifact[] createExpectedResultArray() {
+        VduArtifact[] vduArtifactsArray = new VduArtifact[4];
+        vduArtifactsArray[0] = new VduArtifact(MAIN_TEMPLATE_NAME, MAIN_TEMPLATE_BODY.getBytes(),
+                ArtifactType.MAIN_TEMPLATE);
+        vduArtifactsArray[1] = new VduArtifact(NESTED_TEMPLATE_KEY, NESTED_TEMPLATE_VALUE.getBytes(),
+                ArtifactType.NESTED_TEMPLATE);
+        vduArtifactsArray[2] = createVduArtifact(HEAT_FILE_NAME, HEAT_FILE_BODY, ArtifactType.TEXT_FILE);
+        vduArtifactsArray[3] = createVduArtifact(HEAT_ENV_NAME, HEAT_ENV, ArtifactType.ENVIRONMENT);
+        return vduArtifactsArray;
+    }
+
+    private VduArtifact createVduArtifact(String name, String content, ArtifactType artifactType) {
+        VduArtifact vduArtifact = new VduArtifact();
+        vduArtifact.setName(name);
+        vduArtifact.setContent(content.getBytes());
+        vduArtifact.setType(artifactType);
+        return vduArtifact;
+    }
+
+}
diff --git a/aria/multivim-plugin/src/main/python/multivim-plugin/cinder_plugin/__init__.py b/aria/multivim-plugin/src/main/python/multivim-plugin/cinder_plugin/__init__.py
deleted file mode 100644 (file)
index a9dfcc4..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-#########
-# Copyright (c) 2014 GigaSpaces Technologies 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.
diff --git a/aria/multivim-plugin/src/main/python/multivim-plugin/cinder_plugin/tests/__init__.py b/aria/multivim-plugin/src/main/python/multivim-plugin/cinder_plugin/tests/__init__.py
deleted file mode 100644 (file)
index a9dfcc4..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-#########
-# Copyright (c) 2014 GigaSpaces Technologies 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.
diff --git a/aria/multivim-plugin/src/main/python/multivim-plugin/cinder_plugin/tests/test_volume.py b/aria/multivim-plugin/src/main/python/multivim-plugin/cinder_plugin/tests/test_volume.py
deleted file mode 100644 (file)
index 0ee85bc..0000000
+++ /dev/null
@@ -1,342 +0,0 @@
-#########
-# Copyright (c) 2014 GigaSpaces Technologies 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.
-
-import mock
-import unittest
-
-from cloudify import mocks as cfy_mocks
-from cloudify import exceptions as cfy_exc
-from cloudify.state import current_ctx
-from cinder_plugin import volume
-from nova_plugin import server
-from openstack_plugin_common import (OPENSTACK_ID_PROPERTY,
-                                     OPENSTACK_TYPE_PROPERTY,
-                                     OPENSTACK_NAME_PROPERTY)
-
-
-class TestCinderVolume(unittest.TestCase):
-
-    def _mock(self, **kwargs):
-        ctx = cfy_mocks.MockCloudifyContext(**kwargs)
-        current_ctx.set(ctx)
-        return ctx
-
-    def tearDown(self):
-        current_ctx.clear()
-
-    def test_create_new(self):
-        volume_name = 'fake volume name'
-        volume_description = 'fake volume'
-        volume_id = '00000000-0000-0000-0000-000000000000'
-        volume_size = 10
-
-        volume_properties = {
-            'volume': {
-                'size': volume_size,
-                'description': volume_description
-            },
-            'use_external_resource': False,
-            'device_name': '/dev/fake',
-            'resource_id': volume_name,
-        }
-
-        creating_volume_m = mock.Mock()
-        creating_volume_m.id = volume_id
-        creating_volume_m.status = volume.VOLUME_STATUS_CREATING
-        available_volume_m = mock.Mock()
-        available_volume_m.id = volume_id
-        available_volume_m.status = volume.VOLUME_STATUS_AVAILABLE
-        cinder_client_m = mock.Mock()
-        cinder_client_m.volumes = mock.Mock()
-        cinder_client_m.volumes.create = mock.Mock(
-            return_value=creating_volume_m)
-        cinder_client_m.volumes.get = mock.Mock(
-            return_value=available_volume_m)
-        ctx_m = self._mock(node_id='a', properties=volume_properties)
-
-        volume.create(cinder_client=cinder_client_m, args={}, ctx=ctx_m,
-                      status_attempts=10, status_timeout=2)
-
-        cinder_client_m.volumes.create.assert_called_once_with(
-            size=volume_size,
-            name=volume_name,
-            description=volume_description)
-        cinder_client_m.volumes.get.assert_called_once_with(volume_id)
-        self.assertEqual(
-            volume_id,
-            ctx_m.instance.runtime_properties[OPENSTACK_ID_PROPERTY])
-        self.assertEqual(
-            volume.VOLUME_OPENSTACK_TYPE,
-            ctx_m.instance.runtime_properties[OPENSTACK_TYPE_PROPERTY])
-
-    def test_create_use_existing(self):
-        volume_id = '00000000-0000-0000-0000-000000000000'
-
-        volume_properties = {
-            'use_external_resource': True,
-            'device_name': '/dev/fake',
-            'resource_id': volume_id,
-        }
-        existing_volume_m = mock.Mock()
-        existing_volume_m.id = volume_id
-        existing_volume_m.status = volume.VOLUME_STATUS_AVAILABLE
-        cinder_client_m = mock.Mock()
-        cinder_client_m.volumes = mock.Mock()
-        cinder_client_m.volumes.create = mock.Mock()
-        cinder_client_m.cosmo_get_if_exists = mock.Mock(
-            return_value=existing_volume_m)
-        cinder_client_m.get_id_from_resource = mock.Mock(
-            return_value=volume_id)
-        ctx_m = self._mock(node_id='a', properties=volume_properties)
-
-        volume.create(cinder_client=cinder_client_m, args={}, ctx=ctx_m,
-                      status_attempts=10, status_timeout=2)
-
-        self.assertFalse(cinder_client_m.volumes.create.called)
-        self.assertEqual(
-            volume_id,
-            ctx_m.instance.runtime_properties[OPENSTACK_ID_PROPERTY])
-        self.assertEqual(
-            volume.VOLUME_OPENSTACK_TYPE,
-            ctx_m.instance.runtime_properties[OPENSTACK_TYPE_PROPERTY])
-
-    def test_delete(self):
-        volume_id = '00000000-0000-0000-0000-000000000000'
-        volume_name = 'test-volume'
-
-        volume_properties = {
-            'use_external_resource': False,
-        }
-
-        cinder_client_m = mock.Mock()
-        cinder_client_m.cosmo_delete_resource = mock.Mock()
-
-        ctx_m = self._mock(node_id='a', properties=volume_properties)
-        ctx_m.instance.runtime_properties[OPENSTACK_ID_PROPERTY] = volume_id
-        ctx_m.instance.runtime_properties[OPENSTACK_TYPE_PROPERTY] = \
-            volume.VOLUME_OPENSTACK_TYPE
-        ctx_m.instance.runtime_properties[OPENSTACK_NAME_PROPERTY] = \
-            volume_name
-
-        volume.delete(cinder_client=cinder_client_m, ctx=ctx_m)
-
-        cinder_client_m.cosmo_delete_resource.assert_called_once_with(
-            volume.VOLUME_OPENSTACK_TYPE, volume_id)
-        self.assertTrue(
-            OPENSTACK_ID_PROPERTY not in ctx_m.instance.runtime_properties)
-        self.assertTrue(OPENSTACK_TYPE_PROPERTY
-                        not in ctx_m.instance.runtime_properties)
-        self.assertTrue(OPENSTACK_NAME_PROPERTY
-                        not in ctx_m.instance.runtime_properties)
-
-    @mock.patch('openstack_plugin_common.NovaClientWithSugar')
-    @mock.patch('openstack_plugin_common.CinderClientWithSugar')
-    @mock.patch.object(volume, 'wait_until_status', return_value=(None, True))
-    def test_attach(self, wait_until_status_m, cinder_m, nova_m):
-        volume_id = '00000000-0000-0000-0000-000000000000'
-        server_id = '11111111-1111-1111-1111-111111111111'
-        device_name = '/dev/fake'
-
-        volume_ctx = cfy_mocks.MockContext({
-            'node': cfy_mocks.MockContext({
-                'properties': {volume.DEVICE_NAME_PROPERTY: device_name}
-            }),
-            'instance': cfy_mocks.MockContext({
-                'runtime_properties': {
-                    OPENSTACK_ID_PROPERTY: volume_id,
-                }
-            })
-        })
-        server_ctx = cfy_mocks.MockContext({
-            'node': cfy_mocks.MockContext({
-                'properties': {}
-            }),
-            'instance': cfy_mocks.MockContext({
-                'runtime_properties': {
-                    server.OPENSTACK_ID_PROPERTY: server_id
-                }
-            })
-        })
-
-        ctx_m = self._mock(node_id='a',
-                           target=server_ctx,
-                           source=volume_ctx)
-
-        nova_instance = nova_m.return_value
-        cinder_instance = cinder_m.return_value
-
-        server.attach_volume(ctx=ctx_m, status_attempts=10,
-                             status_timeout=2)
-
-        nova_instance.volumes.create_server_volume.assert_called_once_with(
-            server_id, volume_id, device_name)
-        wait_until_status_m.assert_called_once_with(
-            cinder_client=cinder_instance,
-            volume_id=volume_id,
-            status=volume.VOLUME_STATUS_IN_USE,
-            num_tries=10,
-            timeout=2,
-            )
-
-    @mock.patch('openstack_plugin_common.NovaClientWithSugar')
-    @mock.patch('openstack_plugin_common.CinderClientWithSugar')
-    def _test_cleanup__after_attach_fails(
-            self, expected_err_cls, expect_cleanup,
-            wait_until_status_m, cinder_m, nova_m):
-        volume_id = '00000000-0000-0000-0000-000000000000'
-        server_id = '11111111-1111-1111-1111-111111111111'
-        attachment_id = '22222222-2222-2222-2222-222222222222'
-        device_name = '/dev/fake'
-
-        attachment = {'id': attachment_id,
-                      'server_id': server_id,
-                      'volume_id': volume_id}
-
-        volume_ctx = cfy_mocks.MockContext({
-            'node': cfy_mocks.MockContext({
-                'properties': {volume.DEVICE_NAME_PROPERTY: device_name}
-            }),
-            'instance': cfy_mocks.MockContext({
-                'runtime_properties': {
-                    OPENSTACK_ID_PROPERTY: volume_id,
-                }
-            })
-        })
-        server_ctx = cfy_mocks.MockContext({
-            'node': cfy_mocks.MockContext({
-                'properties': {}
-            }),
-            'instance': cfy_mocks.MockContext({
-                'runtime_properties': {
-                    server.OPENSTACK_ID_PROPERTY: server_id
-                }
-            })
-        })
-
-        ctx_m = self._mock(node_id='a',
-                           target=server_ctx,
-                           source=volume_ctx)
-
-        attached_volume = mock.Mock(id=volume_id,
-                                    status=volume.VOLUME_STATUS_IN_USE,
-                                    attachments=[attachment])
-        nova_instance = nova_m.return_value
-        cinder_instance = cinder_m.return_value
-        cinder_instance.volumes.get.return_value = attached_volume
-
-        with self.assertRaises(expected_err_cls):
-            server.attach_volume(ctx=ctx_m, status_attempts=10,
-                                 status_timeout=2)
-
-        nova_instance.volumes.create_server_volume.assert_called_once_with(
-            server_id, volume_id, device_name)
-        volume.wait_until_status.assert_any_call(
-            cinder_client=cinder_instance,
-            volume_id=volume_id,
-            status=volume.VOLUME_STATUS_IN_USE,
-            num_tries=10,
-            timeout=2,
-            )
-        if expect_cleanup:
-            nova_instance.volumes.delete_server_volume.assert_called_once_with(
-                server_id, attachment_id)
-            self.assertEqual(2, volume.wait_until_status.call_count)
-            volume.wait_until_status.assert_called_with(
-                cinder_client=cinder_instance,
-                volume_id=volume_id,
-                status=volume.VOLUME_STATUS_AVAILABLE,
-                num_tries=10,
-                timeout=2)
-
-    def test_cleanup_after_waituntilstatus_throws_recoverable_error(self):
-        err = cfy_exc.RecoverableError('Some recoverable error')
-        with mock.patch.object(volume, 'wait_until_status',
-                               side_effect=[err, (None, True)]) as wait_mock:
-            self._test_cleanup__after_attach_fails(type(err), True, wait_mock)
-
-    def test_cleanup_after_waituntilstatus_throws_any_not_nonrecov_error(self):
-        class ArbitraryNonRecoverableException(Exception):
-            pass
-        err = ArbitraryNonRecoverableException('An exception')
-        with mock.patch.object(volume, 'wait_until_status',
-                               side_effect=[err, (None, True)]) as wait_mock:
-            self._test_cleanup__after_attach_fails(type(err), True, wait_mock)
-
-    def test_cleanup_after_waituntilstatus_lets_nonrecov_errors_pass(self):
-        err = cfy_exc.NonRecoverableError('Some non recoverable error')
-        with mock.patch.object(volume, 'wait_until_status',
-                               side_effect=[err, (None, True)]) as wait_mock:
-            self._test_cleanup__after_attach_fails(type(err), False, wait_mock)
-
-    @mock.patch.object(volume, 'wait_until_status', return_value=(None, False))
-    def test_cleanup_after_waituntilstatus_times_out(self, wait_mock):
-        self._test_cleanup__after_attach_fails(cfy_exc.RecoverableError, True,
-                                               wait_mock)
-
-    @mock.patch('openstack_plugin_common.NovaClientWithSugar')
-    @mock.patch('openstack_plugin_common.CinderClientWithSugar')
-    @mock.patch.object(volume, 'wait_until_status', return_value=(None, True))
-    def test_detach(self, wait_until_status_m, cinder_m, nova_m):
-        volume_id = '00000000-0000-0000-0000-000000000000'
-        server_id = '11111111-1111-1111-1111-111111111111'
-        attachment_id = '22222222-2222-2222-2222-222222222222'
-
-        attachment = {'id': attachment_id,
-                      'server_id': server_id,
-                      'volume_id': volume_id}
-
-        volume_ctx = cfy_mocks.MockContext({
-            'node': cfy_mocks.MockContext({
-                'properties': {}
-            }),
-            'instance': cfy_mocks.MockContext({
-                'runtime_properties': {
-                    OPENSTACK_ID_PROPERTY: volume_id,
-                }
-            })
-        })
-        server_ctx = cfy_mocks.MockContext({
-            'node': cfy_mocks.MockContext({
-                'properties': {}
-            }),
-            'instance': cfy_mocks.MockContext({
-                'runtime_properties': {
-                    server.OPENSTACK_ID_PROPERTY: server_id
-                }
-            })
-        })
-
-        ctx_m = self._mock(node_id='a',
-                           target=server_ctx,
-                           source=volume_ctx)
-
-        attached_volume = mock.Mock(id=volume_id,
-                                    status=volume.VOLUME_STATUS_IN_USE,
-                                    attachments=[attachment])
-        nova_instance = nova_m.return_value
-        cinder_instance = cinder_m.return_value
-        cinder_instance.volumes.get.return_value = attached_volume
-
-        server.detach_volume(ctx=ctx_m, status_attempts=10, status_timeout=2)
-
-        nova_instance.volumes.delete_server_volume.assert_called_once_with(
-            server_id, attachment_id)
-        volume.wait_until_status.assert_called_once_with(
-            cinder_client=cinder_instance,
-            volume_id=volume_id,
-            status=volume.VOLUME_STATUS_AVAILABLE,
-            num_tries=10,
-            timeout=2,
-            )
diff --git a/aria/multivim-plugin/src/main/python/multivim-plugin/cinder_plugin/volume.py b/aria/multivim-plugin/src/main/python/multivim-plugin/cinder_plugin/volume.py
deleted file mode 100644 (file)
index 168681b..0000000
+++ /dev/null
@@ -1,125 +0,0 @@
-#########
-# Copyright (c) 2014 GigaSpaces Technologies 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.
-
-import time
-
-from cloudify import ctx
-from cloudify.decorators import operation
-from cloudify import exceptions as cfy_exc
-
-from openstack_plugin_common import (delete_resource_and_runtime_properties,
-                                     with_cinder_client,
-                                     get_resource_id,
-                                     transform_resource_name,
-                                     use_external_resource,
-                                     validate_resource,
-                                     COMMON_RUNTIME_PROPERTIES_KEYS,
-                                     OPENSTACK_AZ_PROPERTY,
-                                     OPENSTACK_ID_PROPERTY,
-                                     OPENSTACK_TYPE_PROPERTY,
-                                     OPENSTACK_NAME_PROPERTY)
-from glance_plugin.image import handle_image_from_relationship
-
-VOLUME_STATUS_CREATING = 'creating'
-VOLUME_STATUS_DELETING = 'deleting'
-VOLUME_STATUS_AVAILABLE = 'available'
-VOLUME_STATUS_IN_USE = 'in-use'
-VOLUME_STATUS_ERROR = 'error'
-VOLUME_STATUS_ERROR_DELETING = 'error_deleting'
-VOLUME_ERROR_STATUSES = (VOLUME_STATUS_ERROR, VOLUME_STATUS_ERROR_DELETING)
-
-# Note: The 'device_name' property should actually be a property of the
-# relationship between a server and a volume; It'll move to that
-# relationship type once relationship properties are better supported.
-DEVICE_NAME_PROPERTY = 'device_name'
-
-VOLUME_OPENSTACK_TYPE = 'volume'
-
-RUNTIME_PROPERTIES_KEYS = COMMON_RUNTIME_PROPERTIES_KEYS
-
-
-@operation
-@with_cinder_client
-def create(cinder_client, status_attempts, status_timeout, args, **kwargs):
-
-    if use_external_resource(ctx, cinder_client, VOLUME_OPENSTACK_TYPE,
-                             'name'):
-        return
-
-    name = get_resource_id(ctx, VOLUME_OPENSTACK_TYPE)
-    volume_dict = {'name': name}
-    volume_dict.update(ctx.node.properties['volume'], **args)
-    handle_image_from_relationship(volume_dict, 'imageRef', ctx)
-    volume_dict['name'] = transform_resource_name(
-        ctx, volume_dict['name'])
-
-    v = cinder_client.volumes.create(**volume_dict)
-
-    ctx.instance.runtime_properties[OPENSTACK_ID_PROPERTY] = v.id
-    ctx.instance.runtime_properties[OPENSTACK_TYPE_PROPERTY] = \
-        VOLUME_OPENSTACK_TYPE
-    ctx.instance.runtime_properties[OPENSTACK_NAME_PROPERTY] = \
-        volume_dict['name']
-    wait_until_status(cinder_client=cinder_client,
-                      volume_id=v.id,
-                      status=VOLUME_STATUS_AVAILABLE,
-                      num_tries=status_attempts,
-                      timeout=status_timeout,
-                      )
-    ctx.instance.runtime_properties[OPENSTACK_AZ_PROPERTY] = \
-        v.availability_zone
-
-
-@operation
-@with_cinder_client
-def delete(cinder_client, **kwargs):
-    delete_resource_and_runtime_properties(ctx, cinder_client,
-                                           RUNTIME_PROPERTIES_KEYS)
-
-
-@with_cinder_client
-def wait_until_status(cinder_client, volume_id, status, num_tries,
-                      timeout):
-    for _ in range(num_tries):
-        volume = cinder_client.volumes.get(volume_id)
-
-        if volume.status in VOLUME_ERROR_STATUSES:
-            raise cfy_exc.NonRecoverableError(
-                "Volume {0} is in error state".format(volume_id))
-
-        if volume.status == status:
-            return volume, True
-        time.sleep(timeout)
-
-    ctx.logger.warning("Volume {0} current state: '{1}', "
-                       "expected state: '{2}'".format(volume_id,
-                                                      volume.status,
-                                                      status))
-    return volume, False
-
-
-@with_cinder_client
-def get_attachment(cinder_client, volume_id, server_id):
-    volume = cinder_client.volumes.get(volume_id)
-    for attachment in volume.attachments:
-        if attachment['server_id'] == server_id:
-            return attachment
-
-
-@operation
-@with_cinder_client
-def creation_validation(cinder_client, **kwargs):
-    validate_resource(ctx, cinder_client, VOLUME_OPENSTACK_TYPE,
-                      'name')
diff --git a/aria/multivim-plugin/src/main/python/multivim-plugin/glance_plugin/__init__.py b/aria/multivim-plugin/src/main/python/multivim-plugin/glance_plugin/__init__.py
deleted file mode 100644 (file)
index 809f033..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-#########
-# Copyright (c) 2015 GigaSpaces Technologies 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.
diff --git a/aria/multivim-plugin/src/main/python/multivim-plugin/glance_plugin/image.py b/aria/multivim-plugin/src/main/python/multivim-plugin/glance_plugin/image.py
deleted file mode 100644 (file)
index a8d5b20..0000000
+++ /dev/null
@@ -1,177 +0,0 @@
-#########
-# Copyright (c) 2015 GigaSpaces Technologies 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.
-import httplib
-from urlparse import urlparse
-
-from cloudify import ctx
-from cloudify.decorators import operation
-from cloudify.exceptions import NonRecoverableError
-
-from openstack_plugin_common import (
-    with_glance_client,
-    get_resource_id,
-    use_external_resource,
-    get_openstack_ids_of_connected_nodes_by_openstack_type,
-    delete_resource_and_runtime_properties,
-    validate_resource,
-    COMMON_RUNTIME_PROPERTIES_KEYS,
-    OPENSTACK_ID_PROPERTY,
-    OPENSTACK_TYPE_PROPERTY,
-    OPENSTACK_NAME_PROPERTY)
-
-
-IMAGE_OPENSTACK_TYPE = 'image'
-IMAGE_STATUS_ACTIVE = 'active'
-
-RUNTIME_PROPERTIES_KEYS = COMMON_RUNTIME_PROPERTIES_KEYS
-REQUIRED_PROPERTIES = ['container_format', 'disk_format']
-
-
-@operation
-@with_glance_client
-def create(glance_client, **kwargs):
-    if use_external_resource(ctx, glance_client, IMAGE_OPENSTACK_TYPE):
-        return
-
-    img_dict = {
-        'name': get_resource_id(ctx, IMAGE_OPENSTACK_TYPE)
-    }
-    _validate_image_dictionary()
-    img_properties = ctx.node.properties['image']
-    img_dict.update({key: value for key, value in img_properties.iteritems()
-                    if key != 'data'})
-    img = glance_client.images.create(**img_dict)
-    img_path = img_properties.get('data', '')
-    img_url = ctx.node.properties.get('image_url')
-    try:
-        _validate_image()
-        if img_path:
-            with open(img_path, 'rb') as image_file:
-                glance_client.images.upload(
-                    image_id=img.id,
-                    image_data=image_file)
-        elif img_url:
-            img = glance_client.images.add_location(img.id, img_url, {})
-
-    except:
-        _remove_protected(glance_client)
-        glance_client.images.delete(image_id=img.id)
-        raise
-
-    ctx.instance.runtime_properties[OPENSTACK_ID_PROPERTY] = img.id
-    ctx.instance.runtime_properties[OPENSTACK_TYPE_PROPERTY] = \
-        IMAGE_OPENSTACK_TYPE
-    ctx.instance.runtime_properties[OPENSTACK_NAME_PROPERTY] = img.name
-
-
-def _get_image_by_ctx(glance_client, ctx):
-    return glance_client.images.get(
-        image_id=ctx.instance.runtime_properties[OPENSTACK_ID_PROPERTY])
-
-
-@operation
-@with_glance_client
-def start(glance_client, start_retry_interval, **kwargs):
-    img = _get_image_by_ctx(glance_client, ctx)
-    if img.status != IMAGE_STATUS_ACTIVE:
-        return ctx.operation.retry(
-            message='Waiting for image to get uploaded',
-            retry_after=start_retry_interval)
-
-
-@operation
-@with_glance_client
-def delete(glance_client, **kwargs):
-    _remove_protected(glance_client)
-    delete_resource_and_runtime_properties(ctx, glance_client,
-                                           RUNTIME_PROPERTIES_KEYS)
-
-
-@operation
-@with_glance_client
-def creation_validation(glance_client, **kwargs):
-    validate_resource(ctx, glance_client, IMAGE_OPENSTACK_TYPE)
-    _validate_image_dictionary()
-    _validate_image()
-
-
-def _validate_image_dictionary():
-    img = ctx.node.properties['image']
-    missing = ''
-    try:
-        for prop in REQUIRED_PROPERTIES:
-            if prop not in img:
-                missing += '{0} '.format(prop)
-    except TypeError:
-        missing = ' '.join(REQUIRED_PROPERTIES)
-    if missing:
-        raise NonRecoverableError('Required properties are missing: {'
-                                  '0}. Please update your image '
-                                  'dictionary.'.format(missing))
-
-
-def _validate_image():
-    img = ctx.node.properties['image']
-    img_path = img.get('data')
-    img_url = ctx.node.properties.get('image_url')
-    if not img_url and not img_path:
-        raise NonRecoverableError('Neither image url nor image path was '
-                                  'provided')
-    if img_url and img_path:
-        raise NonRecoverableError('Multiple image sources provided')
-    if img_url:
-        _check_url(img_url)
-    if img_path:
-        _check_path()
-
-
-def _check_url(url):
-    p = urlparse(url)
-    conn = httplib.HTTPConnection(p.netloc)
-    conn.request('HEAD', p.path)
-    resp = conn.getresponse()
-    if resp.status >= 400:
-        raise NonRecoverableError('Invalid image URL')
-
-
-def _check_path():
-    img = ctx.node.properties['image']
-    img_path = img.get('data')
-    try:
-        with open(img_path, 'rb'):
-            pass
-    except TypeError:
-        if not img.get('url'):
-            raise NonRecoverableError('No path or url provided')
-    except IOError:
-        raise NonRecoverableError(
-            'Unable to open image file with path: "{}"'.format(img_path))
-
-
-def _remove_protected(glance_client):
-    if use_external_resource(ctx, glance_client, IMAGE_OPENSTACK_TYPE):
-        return
-
-    is_protected = ctx.node.properties['image'].get('protected', False)
-    if is_protected:
-        img_id = ctx.instance.runtime_properties[OPENSTACK_ID_PROPERTY]
-        glance_client.images.update(img_id, protected=False)
-
-
-def handle_image_from_relationship(obj_dict, property_name_to_put, ctx):
-    images = get_openstack_ids_of_connected_nodes_by_openstack_type(
-        ctx, IMAGE_OPENSTACK_TYPE)
-    if images:
-        obj_dict.update({property_name_to_put: images[0]})
diff --git a/aria/multivim-plugin/src/main/python/multivim-plugin/glance_plugin/tests/resources/test-image-start.yaml b/aria/multivim-plugin/src/main/python/multivim-plugin/glance_plugin/tests/resources/test-image-start.yaml
deleted file mode 100644 (file)
index 12c9aa7..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-
-tosca_definitions_version: cloudify_dsl_1_3
-
-imports:
-  - https://raw.githubusercontent.com/cloudify-cosmo/cloudify-manager/4.1/resources/rest-service/cloudify/types/types.yaml
-  - plugin.yaml
-
-inputs:
-  use_password:
-    type: boolean
-    default: false
-
-node_templates:
-  image:
-    type: cloudify.openstack.nodes.Image
-    properties:
-      image:
-        disk_format: test_format
-        container_format: test_format
-        data: test_path
-      openstack_config:
-        username: aaa
-        password: aaa
-        tenant_name: aaa
-        auth_url: aaa
-    interfaces:
-      cloudify.interfaces.lifecycle:
-        start:
-          inputs:
-            start_retry_interval: 1
diff --git a/aria/multivim-plugin/src/main/python/multivim-plugin/glance_plugin/tests/test.py b/aria/multivim-plugin/src/main/python/multivim-plugin/glance_plugin/tests/test.py
deleted file mode 100644 (file)
index 4a88cba..0000000
+++ /dev/null
@@ -1,148 +0,0 @@
-#########
-# Copyright (c) 2014 GigaSpaces Technologies 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.
-
-import mock
-import os
-import tempfile
-import unittest
-
-import glance_plugin
-from glance_plugin import image
-
-from cloudify.mocks import MockCloudifyContext
-from cloudify.test_utils import workflow_test
-from cloudify.exceptions import NonRecoverableError
-
-
-def ctx_mock(image_dict):
-    return MockCloudifyContext(
-        node_id='d',
-        properties=image_dict)
-
-
-class TestCheckImage(unittest.TestCase):
-
-    @mock.patch('glance_plugin.image.ctx',
-                ctx_mock({'image': {}}))
-    def test_check_image_no_file_no_url(self):
-        # Test if it throws exception no file & no url
-        self.assertRaises(NonRecoverableError,
-                          image._validate_image)
-
-    @mock.patch('glance_plugin.image.ctx',
-                ctx_mock({'image_url': 'test-url', 'image': {'data': '.'}}))
-    def test_check_image_and_url(self):
-        # Test if it throws exception file & url
-        self.assertRaises(NonRecoverableError,
-                          image._validate_image)
-
-    @mock.patch('glance_plugin.image.ctx',
-                ctx_mock({'image_url': 'test-url', 'image': {}}))
-    def test_check_image_url(self):
-        # test if it passes no file & url
-        http_connection_mock = mock.MagicMock()
-        http_connection_mock.return_value.getresponse.return_value.status = 200
-        with mock.patch('httplib.HTTPConnection', http_connection_mock):
-            glance_plugin.image._validate_image()
-
-    def test_check_image_file(self):
-        # test if it passes file & no url
-        image_file_path = tempfile.mkstemp()[1]
-        with mock.patch('glance_plugin.image.ctx',
-                        ctx_mock({'image': {'data': image_file_path}})):
-            glance_plugin.image._validate_image()
-
-    @mock.patch('glance_plugin.image.ctx',
-                ctx_mock({'image': {'data': '/test/path'}}))
-    # test when open file throws IO error
-    def test_check_image_bad_file(self):
-        open_name = '%s.open' % __name__
-        with mock.patch(open_name, create=True) as mock_open:
-            mock_open.side_effect = [mock_open(read_data='Data').return_value]
-            self.assertRaises(NonRecoverableError,
-                              glance_plugin.image._validate_image)
-
-    @mock.patch('glance_plugin.image.ctx',
-                ctx_mock({'image_url': '?', 'image': {}}))
-    # test when bad url
-    def test_check_image_bad_url(self):
-        http_connection_mock = mock.MagicMock()
-        http_connection_mock.return_value.getresponse.return_value.status = 400
-        with mock.patch('httplib.HTTPConnection', http_connection_mock):
-            self.assertRaises(NonRecoverableError,
-                              glance_plugin.image._validate_image)
-
-
-class TestValidateProperties(unittest.TestCase):
-
-    @mock.patch('glance_plugin.image.ctx',
-                ctx_mock({'image': {'container_format': 'bare'}}))
-    def test_check_image_container_format_no_disk_format(self):
-        # Test if it throws exception no file & no url
-        self.assertRaises(NonRecoverableError,
-                          image._validate_image_dictionary)
-
-    @mock.patch('glance_plugin.image.ctx',
-                ctx_mock({'image': {'disk_format': 'qcow2'}}))
-    def test_check_image_no_container_format_disk_format(self):
-        # Test if it throws exception no container_format & disk_format
-        self.assertRaises(NonRecoverableError,
-                          image._validate_image_dictionary)
-
-    @mock.patch('glance_plugin.image.ctx',
-                ctx_mock({'image': {}}))
-    def test_check_image_no_container_format_no_disk_format(self):
-        # Test if it throws exception no container_format & no disk_format
-        self.assertRaises(NonRecoverableError,
-                          image._validate_image_dictionary)
-
-    @mock.patch('glance_plugin.image.ctx',
-                ctx_mock(
-                    {'image':
-                        {'container_format': 'bare',
-                         'disk_format': 'qcow2'}}))
-    def test_check_image_container_format_disk_format(self):
-        # Test if it do not throw exception container_format & disk_format
-        image._validate_image_dictionary()
-
-
-class TestStartImage(unittest.TestCase):
-    blueprint_path = os.path.join('resources',
-                                  'test-image-start.yaml')
-
-    @mock.patch('glance_plugin.image.create')
-    @workflow_test(blueprint_path, copy_plugin_yaml=True)
-    def test_image_lifecycle_start(self, cfy_local, *_):
-        test_vars = {
-            'counter': 0,
-            'image': mock.MagicMock()
-        }
-
-        def _mock_get_image_by_ctx(*_):
-            i = test_vars['image']
-            if test_vars['counter'] == 0:
-                i.status = 'different image status'
-            else:
-                i.status = glance_plugin.image.IMAGE_STATUS_ACTIVE
-            test_vars['counter'] += 1
-            return i
-
-        with mock.patch('openstack_plugin_common.GlanceClient'):
-            with mock.patch('glance_plugin.image._get_image_by_ctx',
-                            side_effect=_mock_get_image_by_ctx):
-                cfy_local.execute('install', task_retries=3)
-
-        self.assertEqual(2, test_vars['counter'])
-        self.assertEqual(0, test_vars['image'].start.call_count)
diff --git a/aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/__init__.py b/aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/__init__.py
deleted file mode 100644 (file)
index 04cb21f..0000000
+++ /dev/null
@@ -1 +0,0 @@
-__author__ = 'idanmo'
diff --git a/aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/floatingip.py b/aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/floatingip.py
deleted file mode 100644 (file)
index 1a9d044..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-#########
-# Copyright (c) 2014 GigaSpaces Technologies 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.
-
-from cloudify import ctx
-from cloudify.decorators import operation
-from cloudify.exceptions import NonRecoverableError
-from openstack_plugin_common import (
-    with_neutron_client,
-    provider,
-    is_external_relationship,
-    is_external_relationship_not_conditionally_created,
-    OPENSTACK_ID_PROPERTY
-)
-from openstack_plugin_common.floatingip import (
-    use_external_floatingip,
-    set_floatingip_runtime_properties,
-    delete_floatingip,
-    floatingip_creation_validation
-)
-
-
-@operation
-@with_neutron_client
-def create(neutron_client, args, **kwargs):
-
-    if use_external_floatingip(neutron_client, 'floating_ip_address',
-                               lambda ext_fip: ext_fip['floating_ip_address']):
-        return
-
-    floatingip = {
-        # No defaults
-    }
-    floatingip.update(ctx.node.properties['floatingip'], **args)
-
-    # Sugar: floating_network_name -> (resolve) -> floating_network_id
-    if 'floating_network_name' in floatingip:
-        floatingip['floating_network_id'] = neutron_client.cosmo_get_named(
-            'network', floatingip['floating_network_name'])['id']
-        del floatingip['floating_network_name']
-    elif 'floating_network_id' not in floatingip:
-        provider_context = provider(ctx)
-        ext_network = provider_context.ext_network
-        if ext_network:
-            floatingip['floating_network_id'] = ext_network['id']
-        else:
-            raise NonRecoverableError(
-                'Missing floating network id, name or external network')
-
-    fip = neutron_client.create_floatingip(
-        {'floatingip': floatingip})['floatingip']
-    set_floatingip_runtime_properties(fip['id'], fip['floating_ip_address'])
-
-    ctx.logger.info('Floating IP creation response: {0}'.format(fip))
-
-
-@operation
-@with_neutron_client
-def delete(neutron_client, **kwargs):
-    delete_floatingip(neutron_client)
-
-
-@operation
-@with_neutron_client
-def creation_validation(neutron_client, **kwargs):
-    floatingip_creation_validation(neutron_client, 'floating_ip_address')
-
-
-@operation
-@with_neutron_client
-def connect_port(neutron_client, **kwargs):
-    if is_external_relationship_not_conditionally_created(ctx):
-        return
-
-    port_id = ctx.source.instance.runtime_properties[OPENSTACK_ID_PROPERTY]
-    floating_ip_id = ctx.target.instance.runtime_properties[
-        OPENSTACK_ID_PROPERTY]
-    fip = {'port_id': port_id}
-    neutron_client.update_floatingip(floating_ip_id, {'floatingip': fip})
-
-
-@operation
-@with_neutron_client
-def disconnect_port(neutron_client, **kwargs):
-    if is_external_relationship(ctx):
-        ctx.logger.info('Not disassociating floatingip and port since '
-                        'external floatingip and port are being used')
-        return
-
-    floating_ip_id = ctx.target.instance.runtime_properties[
-        OPENSTACK_ID_PROPERTY]
-    fip = {'port_id': None}
-    neutron_client.update_floatingip(floating_ip_id, {'floatingip': fip})
diff --git a/aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/network.py b/aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/network.py
deleted file mode 100644 (file)
index eadcc3b..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-#########
-# Copyright (c) 2014 GigaSpaces Technologies 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.
-
-from cloudify import ctx
-from cloudify.decorators import operation
-from cloudify.exceptions import NonRecoverableError
-from openstack_plugin_common import (
-    transform_resource_name,
-    with_neutron_client,
-    get_resource_id,
-    is_external_resource,
-    is_external_resource_not_conditionally_created,
-    delete_resource_and_runtime_properties,
-    use_external_resource,
-    validate_resource,
-    OPENSTACK_ID_PROPERTY,
-    OPENSTACK_TYPE_PROPERTY,
-    OPENSTACK_NAME_PROPERTY,
-    COMMON_RUNTIME_PROPERTIES_KEYS
-)
-
-NETWORK_OPENSTACK_TYPE = 'network'
-
-# Runtime properties
-RUNTIME_PROPERTIES_KEYS = COMMON_RUNTIME_PROPERTIES_KEYS
-
-
-@operation
-@with_neutron_client
-def create(neutron_client, args, **kwargs):
-
-    if use_external_resource(ctx, neutron_client, NETWORK_OPENSTACK_TYPE):
-        return
-
-    network = {
-        'admin_state_up': True,
-        'name': get_resource_id(ctx, NETWORK_OPENSTACK_TYPE),
-    }
-    network.update(ctx.node.properties['network'], **args)
-    transform_resource_name(ctx, network)
-
-    net = neutron_client.create_network({'network': network})['network']
-    ctx.instance.runtime_properties[OPENSTACK_ID_PROPERTY] = net['id']
-    ctx.instance.runtime_properties[OPENSTACK_TYPE_PROPERTY] =\
-        NETWORK_OPENSTACK_TYPE
-    ctx.instance.runtime_properties[OPENSTACK_NAME_PROPERTY] = net['name']
-
-
-@operation
-@with_neutron_client
-def start(neutron_client, **kwargs):
-    network_id = ctx.instance.runtime_properties[OPENSTACK_ID_PROPERTY]
-
-    if is_external_resource_not_conditionally_created(ctx):
-        ctx.logger.info('Validating external network is started')
-        if not neutron_client.show_network(
-                network_id)['network']['admin_state_up']:
-            raise NonRecoverableError(
-                'Expected external resource network {0} to be in '
-                '"admin_state_up"=True'.format(network_id))
-        return
-
-    neutron_client.update_network(
-        network_id, {
-            'network': {
-                'admin_state_up': True
-            }
-        })
-
-
-@operation
-@with_neutron_client
-def stop(neutron_client, **kwargs):
-    if is_external_resource(ctx):
-        ctx.logger.info('Not stopping network since an external network is '
-                        'being used')
-        return
-
-    neutron_client.update_network(
-        ctx.instance.runtime_properties[OPENSTACK_ID_PROPERTY], {
-            'network': {
-                'admin_state_up': False
-            }
-        })
-
-
-@operation
-@with_neutron_client
-def delete(neutron_client, **kwargs):
-    delete_resource_and_runtime_properties(ctx, neutron_client,
-                                           RUNTIME_PROPERTIES_KEYS)
-
-
-@operation
-@with_neutron_client
-def creation_validation(neutron_client, **kwargs):
-    validate_resource(ctx, neutron_client, NETWORK_OPENSTACK_TYPE)
diff --git a/aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/port.py b/aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/port.py
deleted file mode 100644 (file)
index 4db4c44..0000000
+++ /dev/null
@@ -1,222 +0,0 @@
-#########
-# Copyright (c) 2014 GigaSpaces Technologies 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.
-
-from cloudify import ctx
-from cloudify.decorators import operation
-from cloudify.exceptions import NonRecoverableError
-
-import neutronclient.common.exceptions as neutron_exceptions
-
-from openstack_plugin_common import (
-    transform_resource_name,
-    with_neutron_client,
-    with_nova_client,
-    get_resource_id,
-    get_openstack_id_of_single_connected_node_by_openstack_type,
-    delete_resource_and_runtime_properties,
-    delete_runtime_properties,
-    use_external_resource,
-    is_external_relationship,
-    validate_resource,
-    OPENSTACK_ID_PROPERTY,
-    OPENSTACK_TYPE_PROPERTY,
-    OPENSTACK_NAME_PROPERTY,
-    COMMON_RUNTIME_PROPERTIES_KEYS,
-    is_external_relationship_not_conditionally_created)
-
-from neutron_plugin.network import NETWORK_OPENSTACK_TYPE
-from neutron_plugin.subnet import SUBNET_OPENSTACK_TYPE
-from openstack_plugin_common.floatingip import get_server_floating_ip
-
-PORT_OPENSTACK_TYPE = 'port'
-
-# Runtime properties
-FIXED_IP_ADDRESS_PROPERTY = 'fixed_ip_address'  # the fixed ip address
-MAC_ADDRESS_PROPERTY = 'mac_address'  # the mac address
-RUNTIME_PROPERTIES_KEYS = \
-    COMMON_RUNTIME_PROPERTIES_KEYS + [FIXED_IP_ADDRESS_PROPERTY,
-                                      MAC_ADDRESS_PROPERTY]
-
-NO_SG_PORT_CONNECTION_RETRY_INTERVAL = 3
-
-
-@operation
-@with_neutron_client
-def create(neutron_client, args, **kwargs):
-
-    ext_port = use_external_resource(ctx, neutron_client, PORT_OPENSTACK_TYPE)
-    if ext_port:
-        try:
-            net_id = \
-                get_openstack_id_of_single_connected_node_by_openstack_type(
-                    ctx, NETWORK_OPENSTACK_TYPE, True)
-
-            if net_id:
-                port_id = ctx.instance.runtime_properties[
-                    OPENSTACK_ID_PROPERTY]
-
-                if neutron_client.show_port(
-                        port_id)['port']['network_id'] != net_id:
-                    raise NonRecoverableError(
-                        'Expected external resources port {0} and network {1} '
-                        'to be connected'.format(port_id, net_id))
-
-            ctx.instance.runtime_properties[FIXED_IP_ADDRESS_PROPERTY] = \
-                _get_fixed_ip(ext_port)
-            ctx.instance.runtime_properties[MAC_ADDRESS_PROPERTY] = \
-                ext_port['mac_address']
-            return
-        except Exception:
-            delete_runtime_properties(ctx, RUNTIME_PROPERTIES_KEYS)
-            raise
-
-    net_id = get_openstack_id_of_single_connected_node_by_openstack_type(
-        ctx, NETWORK_OPENSTACK_TYPE)
-
-    port = {
-        'name': get_resource_id(ctx, PORT_OPENSTACK_TYPE),
-        'network_id': net_id,
-        'security_groups': [],
-    }
-
-    _handle_fixed_ips(port)
-    port.update(ctx.node.properties['port'], **args)
-    transform_resource_name(ctx, port)
-
-    p = neutron_client.create_port({'port': port})['port']
-    ctx.instance.runtime_properties[OPENSTACK_ID_PROPERTY] = p['id']
-    ctx.instance.runtime_properties[OPENSTACK_TYPE_PROPERTY] =\
-        PORT_OPENSTACK_TYPE
-    ctx.instance.runtime_properties[OPENSTACK_NAME_PROPERTY] = p['name']
-    ctx.instance.runtime_properties[FIXED_IP_ADDRESS_PROPERTY] = \
-        _get_fixed_ip(p)
-    ctx.instance.runtime_properties[MAC_ADDRESS_PROPERTY] = p['mac_address']
-
-
-@operation
-@with_neutron_client
-def delete(neutron_client, **kwargs):
-    try:
-        delete_resource_and_runtime_properties(ctx, neutron_client,
-                                               RUNTIME_PROPERTIES_KEYS)
-    except neutron_exceptions.NeutronClientException, e:
-        if e.status_code == 404:
-            # port was probably deleted when an attached device was deleted
-            delete_runtime_properties(ctx, RUNTIME_PROPERTIES_KEYS)
-        else:
-            raise
-
-
-@operation
-@with_nova_client
-@with_neutron_client
-def detach(nova_client, neutron_client, **kwargs):
-
-    if is_external_relationship(ctx):
-        ctx.logger.info('Not detaching port from server since '
-                        'external port and server are being used')
-        return
-
-    port_id = ctx.target.instance.runtime_properties[OPENSTACK_ID_PROPERTY]
-    server_id = ctx.source.instance.runtime_properties[OPENSTACK_ID_PROPERTY]
-
-    server_floating_ip = get_server_floating_ip(neutron_client, server_id)
-    if server_floating_ip:
-        ctx.logger.info('We have floating ip {0} attached to server'
-                        .format(server_floating_ip['floating_ip_address']))
-        server = nova_client.servers.get(server_id)
-        server.remove_floating_ip(server_floating_ip['floating_ip_address'])
-        return ctx.operation.retry(
-            message='Waiting for the floating ip {0} to '
-                    'detach from server {1}..'
-                    .format(server_floating_ip['floating_ip_address'],
-                            server_id),
-            retry_after=10)
-    change = {
-        'port': {
-            'device_id': '',
-            'device_owner': ''
-        }
-    }
-    ctx.logger.info('Detaching port {0}...'.format(port_id))
-    neutron_client.update_port(port_id, change)
-    ctx.logger.info('Successfully detached port {0}'.format(port_id))
-
-
-@operation
-@with_neutron_client
-def connect_security_group(neutron_client, **kwargs):
-    port_id = ctx.source.instance.runtime_properties[OPENSTACK_ID_PROPERTY]
-    security_group_id = ctx.target.instance.runtime_properties[
-        OPENSTACK_ID_PROPERTY]
-
-    if is_external_relationship_not_conditionally_created(ctx):
-        ctx.logger.info('Validating external port and security-group are '
-                        'connected')
-        if any(sg for sg in neutron_client.show_port(port_id)['port'].get(
-                'security_groups', []) if sg == security_group_id):
-            return
-        raise NonRecoverableError(
-            'Expected external resources port {0} and security-group {1} to '
-            'be connected'.format(port_id, security_group_id))
-
-    # WARNING: non-atomic operation
-    port = neutron_client.cosmo_get('port', id=port_id)
-    ctx.logger.info(
-        "connect_security_group(): source_id={0} target={1}".format(
-            port_id, ctx.target.instance.runtime_properties))
-    sgs = port['security_groups'] + [security_group_id]
-    neutron_client.update_port(port_id, {'port': {'security_groups': sgs}})
-
-    # Double check if SG has been actually updated (a race-condition
-    # in OpenStack):
-    port_info = neutron_client.show_port(port_id)['port']
-    port_security_groups = port_info.get('security_groups', [])
-    if security_group_id not in port_security_groups:
-        return ctx.operation.retry(
-            message='Security group connection (`{0}\' -> `{1}\')'
-                    ' has not been established!'.format(port_id,
-                                                        security_group_id),
-            retry_after=NO_SG_PORT_CONNECTION_RETRY_INTERVAL
-        )
-
-
-@operation
-@with_neutron_client
-def creation_validation(neutron_client, **kwargs):
-    validate_resource(ctx, neutron_client, PORT_OPENSTACK_TYPE)
-
-
-def _get_fixed_ip(port):
-    # a port may have no fixed IP if it's set on a network without subnets
-    return port['fixed_ips'][0]['ip_address'] if port['fixed_ips'] else None
-
-
-def _handle_fixed_ips(port):
-    fixed_ips_element = {}
-
-    # checking for fixed ip property
-    if ctx.node.properties['fixed_ip']:
-        fixed_ips_element['ip_address'] = ctx.node.properties['fixed_ip']
-
-    # checking for a connected subnet
-    subnet_id = get_openstack_id_of_single_connected_node_by_openstack_type(
-        ctx, SUBNET_OPENSTACK_TYPE, if_exists=True)
-    if subnet_id:
-        fixed_ips_element['subnet_id'] = subnet_id
-
-    # applying fixed ip parameter, if available
-    if fixed_ips_element:
-        port['fixed_ips'] = [fixed_ips_element]
diff --git a/aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/router.py b/aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/router.py
deleted file mode 100644 (file)
index 1a2851e..0000000
+++ /dev/null
@@ -1,215 +0,0 @@
-#########
-# Copyright (c) 2014 GigaSpaces Technologies 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.
-
-import warnings
-
-from cloudify import ctx
-from cloudify.decorators import operation
-from cloudify.exceptions import NonRecoverableError
-
-from openstack_plugin_common import (
-    provider,
-    transform_resource_name,
-    get_resource_id,
-    with_neutron_client,
-    use_external_resource,
-    is_external_relationship,
-    is_external_relationship_not_conditionally_created,
-    delete_runtime_properties,
-    get_openstack_ids_of_connected_nodes_by_openstack_type,
-    delete_resource_and_runtime_properties,
-    get_resource_by_name_or_id,
-    validate_resource,
-    COMMON_RUNTIME_PROPERTIES_KEYS,
-    OPENSTACK_ID_PROPERTY,
-    OPENSTACK_TYPE_PROPERTY,
-    OPENSTACK_NAME_PROPERTY
-)
-
-from neutron_plugin.network import NETWORK_OPENSTACK_TYPE
-
-
-ROUTER_OPENSTACK_TYPE = 'router'
-
-# Runtime properties
-RUNTIME_PROPERTIES_KEYS = COMMON_RUNTIME_PROPERTIES_KEYS
-
-
-@operation
-@with_neutron_client
-def create(neutron_client, args, **kwargs):
-
-    if use_external_resource(ctx, neutron_client, ROUTER_OPENSTACK_TYPE):
-        try:
-            ext_net_id_by_rel = _get_connected_ext_net_id(neutron_client)
-
-            if ext_net_id_by_rel:
-                router_id = \
-                    ctx.instance.runtime_properties[OPENSTACK_ID_PROPERTY]
-
-                router = neutron_client.show_router(router_id)['router']
-                if not (router['external_gateway_info'] and 'network_id' in
-                        router['external_gateway_info'] and
-                        router['external_gateway_info']['network_id'] ==
-                        ext_net_id_by_rel):
-                    raise NonRecoverableError(
-                        'Expected external resources router {0} and '
-                        'external network {1} to be connected'.format(
-                            router_id, ext_net_id_by_rel))
-            return
-        except Exception:
-            delete_runtime_properties(ctx, RUNTIME_PROPERTIES_KEYS)
-            raise
-
-    router = {
-        'name': get_resource_id(ctx, ROUTER_OPENSTACK_TYPE),
-    }
-    router.update(ctx.node.properties['router'], **args)
-    transform_resource_name(ctx, router)
-
-    _handle_external_network_config(router, neutron_client)
-
-    r = neutron_client.create_router({'router': router})['router']
-
-    ctx.instance.runtime_properties[OPENSTACK_ID_PROPERTY] = r['id']
-    ctx.instance.runtime_properties[OPENSTACK_TYPE_PROPERTY] =\
-        ROUTER_OPENSTACK_TYPE
-    ctx.instance.runtime_properties[OPENSTACK_NAME_PROPERTY] = r['name']
-
-
-@operation
-@with_neutron_client
-def connect_subnet(neutron_client, **kwargs):
-    router_id = ctx.target.instance.runtime_properties[OPENSTACK_ID_PROPERTY]
-    subnet_id = ctx.source.instance.runtime_properties[OPENSTACK_ID_PROPERTY]
-
-    if is_external_relationship_not_conditionally_created(ctx):
-        ctx.logger.info('Validating external subnet and router '
-                        'are associated')
-        for port in neutron_client.list_ports(device_id=router_id)['ports']:
-            for fixed_ip in port.get('fixed_ips', []):
-                if fixed_ip.get('subnet_id') == subnet_id:
-                    return
-        raise NonRecoverableError(
-            'Expected external resources router {0} and subnet {1} to be '
-            'connected'.format(router_id, subnet_id))
-
-    neutron_client.add_interface_router(router_id, {'subnet_id': subnet_id})
-
-
-@operation
-@with_neutron_client
-def disconnect_subnet(neutron_client, **kwargs):
-    if is_external_relationship(ctx):
-        ctx.logger.info('Not connecting subnet and router since external '
-                        'subnet and router are being used')
-        return
-
-    neutron_client.remove_interface_router(
-        ctx.target.instance.runtime_properties[OPENSTACK_ID_PROPERTY], {
-            'subnet_id': ctx.source.instance.runtime_properties[
-                OPENSTACK_ID_PROPERTY]
-        }
-    )
-
-
-@operation
-@with_neutron_client
-def delete(neutron_client, **kwargs):
-    delete_resource_and_runtime_properties(ctx, neutron_client,
-                                           RUNTIME_PROPERTIES_KEYS)
-
-
-@operation
-@with_neutron_client
-def creation_validation(neutron_client, **kwargs):
-    validate_resource(ctx, neutron_client, ROUTER_OPENSTACK_TYPE)
-
-
-def _insert_ext_net_id_to_router_config(ext_net_id, router):
-    router['external_gateway_info'] = router.get(
-        'external_gateway_info', {})
-    router['external_gateway_info']['network_id'] = ext_net_id
-
-
-def _handle_external_network_config(router, neutron_client):
-    # attempting to find an external network for the router to connect to -
-    # first by either a network name or id passed in explicitly; then by a
-    # network connected by a relationship; with a final optional fallback to an
-    # external network set in the Provider-context. Otherwise the router will
-    # simply not get connected to an external network
-
-    provider_context = provider(ctx)
-
-    ext_net_id_by_rel = _get_connected_ext_net_id(neutron_client)
-    ext_net_by_property = ctx.node.properties['external_network']
-
-    # the following is meant for backwards compatibility with the
-    # 'network_name' sugaring
-    if 'external_gateway_info' in router and 'network_name' in \
-            router['external_gateway_info']:
-        warnings.warn(
-            'Passing external "network_name" inside the '
-            'external_gateway_info key of the "router" property is now '
-            'deprecated; Use the "external_network" property instead',
-            DeprecationWarning)
-
-        ext_net_by_property = router['external_gateway_info']['network_name']
-        del (router['external_gateway_info']['network_name'])
-
-    # need to check if the user explicitly passed network_id in the external
-    # gateway configuration as it affects external network behavior by
-    # relationship and/or provider context
-    if 'external_gateway_info' in router and 'network_id' in \
-            router['external_gateway_info']:
-        ext_net_by_property = router['external_gateway_info']['network_name']
-
-    if ext_net_by_property and ext_net_id_by_rel:
-        raise RuntimeError(
-            "Router can't have an external network connected by both a "
-            'relationship and by a network name/id')
-
-    if ext_net_by_property:
-        ext_net_id = get_resource_by_name_or_id(
-            ext_net_by_property, NETWORK_OPENSTACK_TYPE, neutron_client)['id']
-        _insert_ext_net_id_to_router_config(ext_net_id, router)
-    elif ext_net_id_by_rel:
-        _insert_ext_net_id_to_router_config(ext_net_id_by_rel, router)
-    elif ctx.node.properties['default_to_managers_external_network'] and \
-            provider_context.ext_network:
-        _insert_ext_net_id_to_router_config(provider_context.ext_network['id'],
-                                            router)
-
-
-def _check_if_network_is_external(neutron_client, network_id):
-    return neutron_client.show_network(
-        network_id)['network']['router:external']
-
-
-def _get_connected_ext_net_id(neutron_client):
-    ext_net_ids = \
-        [net_id
-            for net_id in
-            get_openstack_ids_of_connected_nodes_by_openstack_type(
-                ctx, NETWORK_OPENSTACK_TYPE) if
-            _check_if_network_is_external(neutron_client, net_id)]
-
-    if len(ext_net_ids) > 1:
-        raise NonRecoverableError(
-            'More than one external network is connected to router {0}'
-            ' by a relationship; External network IDs: {0}'.format(
-                ext_net_ids))
-
-    return ext_net_ids[0] if ext_net_ids else None
diff --git a/aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/security_group.py b/aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/security_group.py
deleted file mode 100644 (file)
index 5f335f4..0000000
+++ /dev/null
@@ -1,130 +0,0 @@
-#########
-# Copyright (c) 2014 GigaSpaces Technologies 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.
-
-from time import sleep
-
-from requests.exceptions import RequestException
-
-from cloudify import ctx
-from cloudify.decorators import operation
-from cloudify.exceptions import NonRecoverableError
-from openstack_plugin_common import (
-    transform_resource_name,
-    with_neutron_client,
-    delete_resource_and_runtime_properties,
-)
-from openstack_plugin_common.security_group import (
-    build_sg_data,
-    process_rules,
-    use_external_sg,
-    set_sg_runtime_properties,
-    delete_sg,
-    sg_creation_validation,
-    RUNTIME_PROPERTIES_KEYS
-)
-
-DEFAULT_RULE_VALUES = {
-    'direction': 'ingress',
-    'ethertype': 'IPv4',
-    'port_range_min': 1,
-    'port_range_max': 65535,
-    'protocol': 'tcp',
-    'remote_group_id': None,
-    'remote_ip_prefix': '0.0.0.0/0',
-}
-
-
-@operation
-@with_neutron_client
-def create(
-    neutron_client, args,
-    status_attempts=10, status_timeout=2, **kwargs
-):
-
-    security_group = build_sg_data(args)
-    if not security_group['description']:
-        security_group['description'] = ctx.node.properties['description']
-
-    sg_rules = process_rules(neutron_client, DEFAULT_RULE_VALUES,
-                             'remote_ip_prefix', 'remote_group_id',
-                             'port_range_min', 'port_range_max')
-
-    disable_default_egress_rules = ctx.node.properties.get(
-        'disable_default_egress_rules')
-
-    if use_external_sg(neutron_client):
-        return
-
-    transform_resource_name(ctx, security_group)
-
-    sg = neutron_client.create_security_group(
-        {'security_group': security_group})['security_group']
-
-    for attempt in range(max(status_attempts, 1)):
-        sleep(status_timeout)
-        try:
-            neutron_client.show_security_group(sg['id'])
-        except RequestException as e:
-            ctx.logger.debug("Waiting for SG to be visible. Attempt {}".format(
-                attempt))
-        else:
-            break
-    else:
-        raise NonRecoverableError(
-            "Timed out waiting for security_group to exist", e)
-
-    set_sg_runtime_properties(sg, neutron_client)
-
-    try:
-        if disable_default_egress_rules:
-            for er in _egress_rules(_rules_for_sg_id(neutron_client,
-                                                     sg['id'])):
-                neutron_client.delete_security_group_rule(er['id'])
-
-        for sgr in sg_rules:
-            sgr['security_group_id'] = sg['id']
-            neutron_client.create_security_group_rule(
-                {'security_group_rule': sgr})
-    except Exception:
-        try:
-            delete_resource_and_runtime_properties(
-                ctx, neutron_client,
-                RUNTIME_PROPERTIES_KEYS)
-        except Exception as e:
-            raise NonRecoverableError(
-                'Exception while tearing down for retry', e)
-        raise
-
-
-@operation
-@with_neutron_client
-def delete(neutron_client, **kwargs):
-    delete_sg(neutron_client)
-
-
-@operation
-@with_neutron_client
-def creation_validation(neutron_client, **kwargs):
-    sg_creation_validation(neutron_client, 'remote_ip_prefix')
-
-
-def _egress_rules(rules):
-    return [rule for rule in rules if rule.get('direction') == 'egress']
-
-
-def _rules_for_sg_id(neutron_client, id):
-    rules = neutron_client.list_security_group_rules()['security_group_rules']
-    rules = [rule for rule in rules if rule['security_group_id'] == id]
-    return rules
diff --git a/aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/subnet.py b/aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/subnet.py
deleted file mode 100644 (file)
index 6e97c96..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-#########
-# Copyright (c) 2014 GigaSpaces Technologies 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.
-
-from cloudify import ctx
-from cloudify.decorators import operation
-from cloudify.exceptions import NonRecoverableError
-from openstack_plugin_common import (
-    with_neutron_client,
-    transform_resource_name,
-    get_resource_id,
-    get_openstack_id_of_single_connected_node_by_openstack_type,
-    delete_resource_and_runtime_properties,
-    delete_runtime_properties,
-    use_external_resource,
-    validate_resource,
-    validate_ip_or_range_syntax,
-    OPENSTACK_ID_PROPERTY,
-    OPENSTACK_TYPE_PROPERTY,
-    OPENSTACK_NAME_PROPERTY,
-    COMMON_RUNTIME_PROPERTIES_KEYS
-)
-
-from neutron_plugin.network import NETWORK_OPENSTACK_TYPE
-
-SUBNET_OPENSTACK_TYPE = 'subnet'
-
-# Runtime properties
-RUNTIME_PROPERTIES_KEYS = COMMON_RUNTIME_PROPERTIES_KEYS
-
-
-@operation
-@with_neutron_client
-def create(neutron_client, args, **kwargs):
-
-    if use_external_resource(ctx, neutron_client, SUBNET_OPENSTACK_TYPE):
-        try:
-            net_id = \
-                get_openstack_id_of_single_connected_node_by_openstack_type(
-                    ctx, NETWORK_OPENSTACK_TYPE, True)
-
-            if net_id:
-                subnet_id = \
-                    ctx.instance.runtime_properties[OPENSTACK_ID_PROPERTY]
-
-                if neutron_client.show_subnet(
-                        subnet_id)['subnet']['network_id'] != net_id:
-                    raise NonRecoverableError(
-                        'Expected external resources subnet {0} and network'
-                        ' {1} to be connected'.format(subnet_id, net_id))
-            return
-        except Exception:
-            delete_runtime_properties(ctx, RUNTIME_PROPERTIES_KEYS)
-            raise
-
-    net_id = get_openstack_id_of_single_connected_node_by_openstack_type(
-        ctx, NETWORK_OPENSTACK_TYPE)
-    subnet = {
-        'name': get_resource_id(ctx, SUBNET_OPENSTACK_TYPE),
-        'network_id': net_id,
-    }
-    subnet.update(ctx.node.properties['subnet'], **args)
-    transform_resource_name(ctx, subnet)
-
-    s = neutron_client.create_subnet({'subnet': subnet})['subnet']
-    ctx.instance.runtime_properties[OPENSTACK_ID_PROPERTY] = s['id']
-    ctx.instance.runtime_properties[OPENSTACK_TYPE_PROPERTY] = \
-        SUBNET_OPENSTACK_TYPE
-    ctx.instance.runtime_properties[OPENSTACK_NAME_PROPERTY] = subnet['name']
-
-
-@operation
-@with_neutron_client
-def delete(neutron_client, **kwargs):
-    delete_resource_and_runtime_properties(ctx, neutron_client,
-                                           RUNTIME_PROPERTIES_KEYS)
-
-
-@operation
-@with_neutron_client
-def creation_validation(neutron_client, args, **kwargs):
-    validate_resource(ctx, neutron_client, SUBNET_OPENSTACK_TYPE)
-    subnet = dict(ctx.node.properties['subnet'], **args)
-
-    if 'cidr' not in subnet:
-        err = '"cidr" property must appear under the "subnet" property of a ' \
-              'subnet node'
-        ctx.logger.error('VALIDATION ERROR: ' + err)
-        raise NonRecoverableError(err)
-    validate_ip_or_range_syntax(ctx, subnet['cidr'])
diff --git a/aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/tests/__init__.py b/aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/tests/__init__.py
deleted file mode 100644 (file)
index 04cb21f..0000000
+++ /dev/null
@@ -1 +0,0 @@
-__author__ = 'idanmo'
diff --git a/aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/tests/test.py b/aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/tests/test.py
deleted file mode 100644 (file)
index 459c23a..0000000
+++ /dev/null
@@ -1,220 +0,0 @@
-#########
-# Copyright (c) 2014 GigaSpaces Technologies 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.
-
-import mock
-import random
-import string
-import unittest
-
-from cloudify.exceptions import NonRecoverableError
-from cloudify.context import BootstrapContext
-
-from cloudify.mocks import MockCloudifyContext
-
-import openstack_plugin_common as common
-import openstack_plugin_common.tests.test as common_test
-
-import neutron_plugin
-import neutron_plugin.network
-import neutron_plugin.port
-import neutron_plugin.router
-import neutron_plugin.security_group
-
-
-class ResourcesRenamingTest(unittest.TestCase):
-    def setUp(self):
-        neutron_plugin.port._find_network_in_related_nodes = mock.Mock()
-        # *** Configs from files ********************
-        common.Config.get = mock.Mock()
-        common.Config.get.return_value = {}
-        # *** Neutron ********************
-        self.neutron_mock = mock.Mock()
-
-        def neutron_mock_connect(unused_self, unused_cfg):
-            return self.neutron_mock
-        common.NeutronClient.connect = neutron_mock_connect
-
-        self.neutron_mock.cosmo_list = mock.Mock()
-        self.neutron_mock.cosmo_list.return_value = []
-
-    def _setup_ctx(self, obj_type):
-        ctx = common_test.create_mock_ctx_with_provider_info(
-            node_id='__cloudify_id_something_001',
-            properties={
-                obj_type: {
-                    'name': obj_type + '_name',
-                },
-                'rules': []  # For security_group
-            }
-        )
-        return ctx
-
-    def _test(self, obj_type):
-        ctx = self._setup_ctx(obj_type)
-        attr = getattr(self.neutron_mock, 'create_' + obj_type)
-        attr.return_value = {
-            obj_type: {
-                'id': obj_type + '_id',
-            }
-        }
-        getattr(neutron_plugin, obj_type).create(ctx)
-        calls = attr.mock_calls
-        self.assertEquals(len(calls), 1)  # Exactly one object created
-        # Indexes into call[]:
-        # 0 - the only call
-        # 1 - regular arguments
-        # 0 - first argument
-        arg = calls[0][1][0]
-        self.assertEquals(arg[obj_type]['name'], 'p2_' + obj_type + '_name')
-
-    def test_network(self):
-        self._test('network')
-
-    def test_port(self):
-        self._test('port')
-
-    def test_router(self):
-        self._test('router')
-
-    def test_security_group(self):
-        self._test('security_group')
-
-    # Network chosen arbitrary for this test.
-    # Just testing something without prefix.
-    def test_network_no_prefix(self):
-        ctx = self._setup_ctx('network')
-        for pctx in common_test.BOOTSTRAP_CONTEXTS_WITHOUT_PREFIX:
-            ctx._bootstrap_context = BootstrapContext(pctx)
-            self.neutron_mock.create_network.reset_mock()
-            self.neutron_mock.create_network.return_value = {
-                'network': {
-                    'id': 'network_id',
-                }
-            }
-            neutron_plugin.network.create(ctx)
-            calls = self.neutron_mock.create_network.mock_calls
-            self.assertEquals(len(calls), 1)  # Exactly one network created
-            # Indexes into call[]:
-            # 0 - the only call
-            # 1 - regular arguments
-            # 0 - first argument
-            arg = calls[0][1][0]
-            self.assertEquals(arg['network']['name'], 'network_name',
-                              "Failed with context: " + str(pctx))
-
-
-def _rand_str(n):
-    chars = string.ascii_uppercase + string.digits
-    return ''.join(random.choice(chars) for _ in range(n))
-
-
-class SecurityGroupTest(unittest.TestCase):
-    def setUp(self):
-        # *** Configs from files ********************
-        common.Config.get = mock.Mock()
-        common.Config.get.return_value = {}
-        # *** Neutron ********************
-        self.neutron_mock = mock.Mock()
-
-        def neutron_mock_connect(unused_self, unused_cfg):
-            return self.neutron_mock
-        common.NeutronClient.connect = neutron_mock_connect
-        neutron_plugin.security_group._rules_for_sg_id = mock.Mock()
-        neutron_plugin.security_group._rules_for_sg_id.return_value = []
-
-    def _setup_ctx(self):
-        sg_name = _rand_str(6) + '_new'
-        ctx = MockCloudifyContext(properties={
-            'security_group': {
-                'name': sg_name,
-                'description': 'blah'
-            },
-            'rules': [{'port': 80}],
-            'disable_default_egress_rules': True,
-        })
-        return ctx
-
-    def test_sg_new(self):
-        ctx = self._setup_ctx()
-        self.neutron_mock.cosmo_list = mock.Mock()
-        self.neutron_mock.cosmo_list.return_value = []
-        self.neutron_mock.create_security_group = mock.Mock()
-        self.neutron_mock.create_security_group.return_value = {
-            'security_group': {
-                'description': 'blah',
-                'id': ctx['security_group']['name'] + '_id',
-            }
-        }
-        neutron_plugin.security_group.create(ctx)
-        self.assertTrue(self.neutron_mock.create_security_group.mock_calls)
-
-    def test_sg_use_existing(self):
-        ctx = self._setup_ctx()
-        self.neutron_mock.cosmo_list = mock.Mock()
-        self.neutron_mock.cosmo_list.return_value = [{
-            'id': ctx['security_group']['name'] + '_existing_id',
-            'description': 'blah',
-            'security_group_rules': [{
-                'remote_group_id': None,
-                'direction': 'ingress',
-                'protocol': 'tcp',
-                'ethertype': 'IPv4',
-                'port_range_max': 80,
-                'port_range_min': 80,
-                'remote_ip_prefix': '0.0.0.0/0',
-            }]
-        }]
-        self.neutron_mock.create_security_group = mock.Mock()
-        self.neutron_mock.create_security_group.return_value = {
-            'security_group': {
-                'description': 'blah',
-                'id': ctx['security_group']['name'] + '_id',
-            }
-        }
-        neutron_plugin.security_group.create(ctx)
-        self.assertFalse(self.neutron_mock.create_security_group.mock_calls)
-
-    def test_sg_use_existing_with_other_rules(self):
-        ctx = self._setup_ctx()
-        self.neutron_mock.cosmo_list = mock.Mock()
-        self.neutron_mock.cosmo_list.return_value = [{
-            'id': ctx['security_group']['name'] + '_existing_id',
-            'description': 'blah',
-            'security_group_rules': [{
-                'remote_group_id': None,
-                'direction': 'ingress',
-                'protocol': 'tcp',
-                'ethertype': 'IPv4',
-                'port_range_max': 81,  # Note the different port!
-                'port_range_min': 81,  # Note the different port!
-                'remote_ip_prefix': '0.0.0.0/0',
-            }]
-        }]
-        self.neutron_mock.create_security_group = mock.Mock()
-        self.neutron_mock.create_security_group.return_value = {
-            'security_group': {
-                'description': 'blah',
-                'id': ctx['security_group']['name'] + '_id',
-            }
-        }
-        self.assertRaises(
-            NonRecoverableError,
-            neutron_plugin.security_group.create,
-            ctx
-        )
-
-
-if __name__ == '__main__':
-    unittest.main()
diff --git a/aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/tests/test_port.py b/aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/tests/test_port.py
deleted file mode 100644 (file)
index 1acee3d..0000000
+++ /dev/null
@@ -1,156 +0,0 @@
-########
-# Copyright (c) 2014 GigaSpaces Technologies 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.
-
-import unittest
-
-import mock
-
-import neutron_plugin.port
-from cloudify.mocks import (MockCloudifyContext,
-                            MockNodeInstanceContext,
-                            MockRelationshipSubjectContext)
-from openstack_plugin_common import (NeutronClientWithSugar,
-                                     OPENSTACK_ID_PROPERTY)
-from cloudify.exceptions import OperationRetry
-
-
-class TestPort(unittest.TestCase):
-
-    def test_fixed_ips_no_fixed_ips(self):
-        node_props = {'fixed_ip': ''}
-
-        with mock.patch(
-                'neutron_plugin.port.'
-                'get_openstack_id_of_single_connected_node_by_openstack_type',
-                self._get_connected_subnet_mock(return_empty=True)):
-            with mock.patch(
-                    'neutron_plugin.port.ctx',
-                    self._get_mock_ctx_with_node_properties(node_props)):
-
-                port = {}
-                neutron_plugin.port._handle_fixed_ips(port)
-
-        self.assertNotIn('fixed_ips', port)
-
-    def test_fixed_ips_subnet_only(self):
-        node_props = {'fixed_ip': ''}
-
-        with mock.patch(
-                'neutron_plugin.port.'
-                'get_openstack_id_of_single_connected_node_by_openstack_type',
-                self._get_connected_subnet_mock(return_empty=False)):
-            with mock.patch(
-                    'neutron_plugin.port.ctx',
-                    self._get_mock_ctx_with_node_properties(node_props)):
-
-                port = {}
-                neutron_plugin.port._handle_fixed_ips(port)
-
-        self.assertEquals([{'subnet_id': 'some-subnet-id'}],
-                          port.get('fixed_ips'))
-
-    def test_fixed_ips_ip_address_only(self):
-        node_props = {'fixed_ip': '1.2.3.4'}
-
-        with mock.patch(
-                'neutron_plugin.port.'
-                'get_openstack_id_of_single_connected_node_by_openstack_type',
-                self._get_connected_subnet_mock(return_empty=True)):
-            with mock.patch(
-                    'neutron_plugin.port.ctx',
-                    self._get_mock_ctx_with_node_properties(node_props)):
-
-                port = {}
-                neutron_plugin.port._handle_fixed_ips(port)
-
-        self.assertEquals([{'ip_address': '1.2.3.4'}],
-                          port.get('fixed_ips'))
-
-    def test_fixed_ips_subnet_and_ip_address(self):
-        node_props = {'fixed_ip': '1.2.3.4'}
-
-        with mock.patch(
-                'neutron_plugin.port.'
-                'get_openstack_id_of_single_connected_node_by_openstack_type',
-                self._get_connected_subnet_mock(return_empty=False)):
-            with mock.patch(
-                    'neutron_plugin.port.ctx',
-                    self._get_mock_ctx_with_node_properties(node_props)):
-
-                port = {}
-                neutron_plugin.port._handle_fixed_ips(port)
-
-        self.assertEquals([{'ip_address': '1.2.3.4',
-                            'subnet_id': 'some-subnet-id'}],
-                          port.get('fixed_ips'))
-
-    @staticmethod
-    def _get_connected_subnet_mock(return_empty=True):
-        return lambda *args, **kw: None if return_empty else 'some-subnet-id'
-
-    @staticmethod
-    def _get_mock_ctx_with_node_properties(properties):
-        return MockCloudifyContext(node_id='test_node_id',
-                                   properties=properties)
-
-
-class MockNeutronClient(NeutronClientWithSugar):
-    """A fake neutron client with hard-coded test data."""
-    def __init__(self, update):
-        self.update = update
-        self.body = {'port': {'id': 'test-id', 'security_groups': []}}
-
-    def show_port(self, *_):
-        return self.body
-
-    def update_port(self, _, b, **__):
-        if self.update:
-            self.body.update(b)
-        return
-
-    def cosmo_get(self, *_, **__):
-        return self.body['port']
-
-
-class TestPortSG(unittest.TestCase):
-    @mock.patch('openstack_plugin_common._put_client_in_kw')
-    def test_connect_sg_to_port(self, *_):
-        mock_neutron = MockNeutronClient(update=True)
-        ctx = MockCloudifyContext(
-            source=MockRelationshipSubjectContext(node=mock.MagicMock(),
-                                                  instance=mock.MagicMock()),
-            target=MockRelationshipSubjectContext(node=mock.MagicMock(),
-                                                  instance=mock.MagicMock()))
-
-        with mock.patch('neutron_plugin.port.ctx', ctx):
-            neutron_plugin.port.connect_security_group(mock_neutron)
-            self.assertIsNone(ctx.operation._operation_retry)
-
-    @mock.patch('openstack_plugin_common._put_client_in_kw')
-    def test_connect_sg_to_port_race_condition(self, *_):
-        mock_neutron = MockNeutronClient(update=False)
-
-        ctx = MockCloudifyContext(
-            source=MockRelationshipSubjectContext(node=mock.MagicMock(),
-                                                  instance=mock.MagicMock()),
-            target=MockRelationshipSubjectContext(
-                node=mock.MagicMock(),
-                instance=MockNodeInstanceContext(
-                    runtime_properties={
-                        OPENSTACK_ID_PROPERTY: 'test-sg-id'})))
-        with mock.patch('neutron_plugin.port.ctx', ctx):
-            neutron_plugin.port.connect_security_group(mock_neutron, ctx=ctx)
-            self.assertIsInstance(ctx.operation._operation_retry,
-                                  OperationRetry)
diff --git a/aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/tests/test_security_group.py b/aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/tests/test_security_group.py
deleted file mode 100644 (file)
index e958cdd..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
-# -*- coding: utf-8 -*-
-#########
-# Copyright (c) 2016 GigaSpaces Technologies 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.
-
-import unittest
-
-from mock import Mock, patch
-from requests.exceptions import RequestException
-
-from neutron_plugin import security_group
-
-from cloudify.exceptions import NonRecoverableError
-from cloudify.state import current_ctx
-
-from cloudify.mocks import MockCloudifyContext
-
-
-class FakeException(Exception):
-    pass
-
-
-@patch('openstack_plugin_common.OpenStackClient._validate_auth_params')
-@patch('openstack_plugin_common.NeutronClientWithSugar')
-class TestSecurityGroup(unittest.TestCase):
-
-    def setUp(self):
-        super(TestSecurityGroup, self).setUp()
-        self.nova_client = Mock()
-
-        self.ctx = MockCloudifyContext(
-            node_id='test',
-            deployment_id='test',
-            properties={
-                'description': 'The best Security Group. Great',
-                'rules': [],
-                'resource_id': 'mock_sg',
-                'security_group': {
-                },
-                'server': {},
-                'openstack_config': {
-                    'auth_url': 'things/v3',
-                },
-            },
-            operation={'retry_number': 0},
-            provider_context={'resources': {}}
-        )
-        current_ctx.set(self.ctx)
-        self.addCleanup(current_ctx.clear)
-
-        findctx = patch(
-            'openstack_plugin_common._find_context_in_kw',
-            return_value=self.ctx,
-        )
-        findctx.start()
-        self.addCleanup(findctx.stop)
-
-    def test_set_sg_runtime_properties(self, mock_nc, *_):
-        security_group.create(
-            nova_client=self.nova_client,
-            ctx=self.ctx,
-            args={},
-            )
-
-        self.assertEqual(
-            {
-                'external_type': 'security_group',
-                'external_id': mock_nc().get_id_from_resource(),
-                'external_name': mock_nc().get_name_from_resource(),
-            },
-            self.ctx.instance.runtime_properties
-        )
-
-    def test_create_sg_wait_timeout(self, mock_nc, *_):
-        mock_nc().show_security_group.side_effect = RequestException
-
-        with self.assertRaises(NonRecoverableError):
-            security_group.create(
-                nova_client=self.nova_client,
-                ctx=self.ctx,
-                args={},
-                status_attempts=3,
-                status_timeout=0.001,
-                )
-
-    @patch(
-        'neutron_plugin.security_group.delete_resource_and_runtime_properties')
-    def test_dont_duplicate_if_failed_rule(self, mock_del_res, mock_nc, *_):
-        self.ctx.node.properties['rules'] = [
-            {
-                'port': '🍷',
-            },
-        ]
-        mock_nc().create_security_group_rule.side_effect = FakeException
-        mock_del_res.side_effect = FakeException('the 2nd')
-
-        with self.assertRaises(NonRecoverableError) as e:
-            security_group.create(
-                nova_client=self.nova_client,
-                ctx=self.ctx,
-                args={},
-                )
-
-        self.assertIn('the 2nd', str(e.exception))
diff --git a/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/__init__.py b/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/__init__.py
deleted file mode 100644 (file)
index bb53327..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-#########
-# Copyright (c) 2014 GigaSpaces Technologies 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.
-
-__author__ = 'idanmo'
diff --git a/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/floatingip.py b/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/floatingip.py
deleted file mode 100644 (file)
index e770c54..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-#########
-# Copyright (c) 2014 GigaSpaces Technologies 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.
-
-from cloudify import ctx
-from cloudify.decorators import operation
-from openstack_plugin_common import with_nova_client
-from openstack_plugin_common.floatingip import (
-    use_external_floatingip,
-    set_floatingip_runtime_properties,
-    delete_floatingip,
-    floatingip_creation_validation
-)
-
-
-# random note regarding nova floating-ips: floating ips on nova-net have
-# pre-assigned ids, and thus a call "nova.floating_ips.get(<fip_id>)" will
-# return a value even if the floating-ip isn't even allocated.
-# currently all lookups in the code, including by id, use search (i.e.
-# nova.<type>.findall) and lists, which won't return such unallocated
-# resources.
-
-@operation
-@with_nova_client
-def create(nova_client, args, **kwargs):
-
-    if use_external_floatingip(nova_client, 'ip',
-                               lambda ext_fip: ext_fip.ip):
-        return
-
-    floatingip = {
-        'pool': None
-    }
-    floatingip.update(ctx.node.properties['floatingip'], **args)
-
-    fip = nova_client.floating_ips.create(floatingip['pool'])
-    set_floatingip_runtime_properties(fip.id, fip.ip)
-
-
-@operation
-@with_nova_client
-def delete(nova_client, **kwargs):
-    delete_floatingip(nova_client)
-
-
-@operation
-@with_nova_client
-def creation_validation(nova_client, **kwargs):
-    floatingip_creation_validation(nova_client, 'ip')
diff --git a/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/keypair.py b/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/keypair.py
deleted file mode 100644 (file)
index 92281ab..0000000
+++ /dev/null
@@ -1,202 +0,0 @@
-#########
-# Copyright (c) 2014 GigaSpaces Technologies 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.
-
-import os
-import errno
-from getpass import getuser
-
-from cloudify import ctx
-from cloudify.decorators import operation
-from cloudify.exceptions import NonRecoverableError
-from openstack_plugin_common import (
-    with_nova_client,
-    validate_resource,
-    use_external_resource,
-    transform_resource_name,
-    is_external_resource,
-    is_external_resource_not_conditionally_created,
-    delete_runtime_properties,
-    get_resource_id,
-    delete_resource_and_runtime_properties,
-    OPENSTACK_ID_PROPERTY,
-    OPENSTACK_TYPE_PROPERTY,
-    OPENSTACK_NAME_PROPERTY,
-    COMMON_RUNTIME_PROPERTIES_KEYS
-)
-
-RUNTIME_PROPERTIES_KEYS = COMMON_RUNTIME_PROPERTIES_KEYS
-KEYPAIR_OPENSTACK_TYPE = 'keypair'
-
-PRIVATE_KEY_PATH_PROP = 'private_key_path'
-
-
-@operation
-@with_nova_client
-def create(nova_client, args, **kwargs):
-
-    private_key_path = _get_private_key_path()
-    pk_exists = _check_private_key_exists(private_key_path)
-
-    if use_external_resource(ctx, nova_client, KEYPAIR_OPENSTACK_TYPE):
-        if not pk_exists:
-            delete_runtime_properties(ctx, RUNTIME_PROPERTIES_KEYS)
-            raise NonRecoverableError(
-                'Failed to use external keypair (node {0}): the public key {1}'
-                ' is available on Openstack, but the private key could not be '
-                'found at {2}'.format(ctx.node.id,
-                                      ctx.node.properties['resource_id'],
-                                      private_key_path))
-        return
-
-    if pk_exists:
-        raise NonRecoverableError(
-            "Can't create keypair - private key path already exists: {0}"
-            .format(private_key_path))
-
-    keypair = {
-        'name': get_resource_id(ctx, KEYPAIR_OPENSTACK_TYPE),
-    }
-    keypair.update(ctx.node.properties['keypair'], **args)
-    transform_resource_name(ctx, keypair)
-
-    keypair = nova_client.keypairs.create(keypair['name'],
-                                          keypair.get('public_key'))
-    ctx.instance.runtime_properties[OPENSTACK_ID_PROPERTY] = keypair.id
-    ctx.instance.runtime_properties[OPENSTACK_TYPE_PROPERTY] = \
-        KEYPAIR_OPENSTACK_TYPE
-    ctx.instance.runtime_properties[OPENSTACK_NAME_PROPERTY] = keypair.name
-
-    try:
-        # write private key file
-        _mkdir_p(os.path.dirname(private_key_path))
-        with open(private_key_path, 'w') as f:
-            f.write(keypair.private_key)
-        os.chmod(private_key_path, 0600)
-    except Exception:
-        _delete_private_key_file()
-        delete_resource_and_runtime_properties(ctx, nova_client,
-                                               RUNTIME_PROPERTIES_KEYS)
-        raise
-
-
-@operation
-@with_nova_client
-def delete(nova_client, **kwargs):
-    if not is_external_resource(ctx):
-        ctx.logger.info('deleting keypair')
-
-        _delete_private_key_file()
-
-        nova_client.keypairs.delete(
-            ctx.instance.runtime_properties[OPENSTACK_ID_PROPERTY])
-    else:
-        ctx.logger.info('not deleting keypair since an external keypair is '
-                        'being used')
-
-    delete_runtime_properties(ctx, RUNTIME_PROPERTIES_KEYS)
-
-
-@operation
-@with_nova_client
-def creation_validation(nova_client, **kwargs):
-
-    def validate_private_key_permissions(private_key_path):
-        ctx.logger.debug('checking whether private key file {0} has the '
-                         'correct permissions'.format(private_key_path))
-        if not os.access(private_key_path, os.R_OK):
-            err = 'private key file {0} is not readable'\
-                .format(private_key_path)
-            ctx.logger.error('VALIDATION ERROR: ' + err)
-            raise NonRecoverableError(err)
-        ctx.logger.debug('OK: private key file {0} has the correct '
-                         'permissions'.format(private_key_path))
-
-    def validate_path_owner(path):
-        ctx.logger.debug('checking whether directory {0} is owned by the '
-                         'current user'.format(path))
-        from pwd import getpwnam, getpwuid
-
-        user = getuser()
-        owner = getpwuid(os.stat(path).st_uid).pw_name
-        current_user_id = str(getpwnam(user).pw_uid)
-        owner_id = str(os.stat(path).st_uid)
-
-        if not current_user_id == owner_id:
-            err = '{0} is not owned by the current user (it is owned by {1})'\
-                  .format(path, owner)
-            ctx.logger.warning('VALIDATION WARNING: {0}'.format(err))
-            return
-        ctx.logger.debug('OK: {0} is owned by the current user'.format(path))
-
-    validate_resource(ctx, nova_client, KEYPAIR_OPENSTACK_TYPE)
-
-    private_key_path = _get_private_key_path()
-    pk_exists = _check_private_key_exists(private_key_path)
-
-    if is_external_resource_not_conditionally_created(ctx):
-        if pk_exists:
-            if os.name == 'posix':
-                validate_private_key_permissions(private_key_path)
-                validate_path_owner(private_key_path)
-        else:
-            err = "can't use external keypair: the public key {0} is " \
-                  "available on Openstack, but the private key could not be " \
-                  "found at {1}".format(ctx.node.properties['resource_id'],
-                                        private_key_path)
-            ctx.logger.error('VALIDATION ERROR: {0}'.format(err))
-            raise NonRecoverableError(err)
-    else:
-        if pk_exists:
-            err = 'private key path already exists: {0}'.format(
-                private_key_path)
-            ctx.logger.error('VALIDATION ERROR: {0}'.format(err))
-            raise NonRecoverableError(err)
-        else:
-            err = 'private key directory {0} is not writable'
-            while private_key_path:
-                if os.path.isdir(private_key_path):
-                    if not os.access(private_key_path, os.W_OK | os.X_OK):
-                        raise NonRecoverableError(err.format(private_key_path))
-                    else:
-                        break
-                private_key_path, _ = os.path.split(private_key_path)
-
-    ctx.logger.debug('OK: keypair configuration is valid')
-
-
-def _get_private_key_path():
-    return os.path.expanduser(ctx.node.properties[PRIVATE_KEY_PATH_PROP])
-
-
-def _delete_private_key_file():
-    private_key_path = _get_private_key_path()
-    ctx.logger.debug('deleting private key file at {0}'.format(
-        private_key_path))
-    try:
-        os.remove(private_key_path)
-    except OSError as e:
-        if e.errno == errno.ENOENT:
-            # file was already deleted somehow
-            pass
-        raise
-
-
-def _check_private_key_exists(private_key_path):
-    return os.path.isfile(private_key_path)
-
-
-def _mkdir_p(path):
-    if path and not os.path.isdir(path):
-        os.makedirs(path)
diff --git a/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/security_group.py b/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/security_group.py
deleted file mode 100644 (file)
index 283eae8..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-#########
-# Copyright (c) 2014 GigaSpaces Technologies 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.
-
-from cloudify import ctx
-from cloudify.decorators import operation
-from openstack_plugin_common import (
-    transform_resource_name,
-    with_nova_client,
-    delete_resource_and_runtime_properties
-)
-from openstack_plugin_common.security_group import (
-    build_sg_data,
-    process_rules,
-    use_external_sg,
-    set_sg_runtime_properties,
-    delete_sg,
-    sg_creation_validation,
-    RUNTIME_PROPERTIES_KEYS
-)
-
-
-@operation
-@with_nova_client
-def create(nova_client, args, **kwargs):
-
-    security_group = build_sg_data(args)
-    security_group['description'] = ctx.node.properties['description']
-
-    sgr_default_values = {
-        'ip_protocol': 'tcp',
-        'from_port': 1,
-        'to_port': 65535,
-        'cidr': '0.0.0.0/0',
-        # 'group_id': None,
-        # 'parent_group_id': None,
-    }
-    sg_rules = process_rules(nova_client, sgr_default_values,
-                             'cidr', 'group_id', 'from_port', 'to_port')
-
-    if use_external_sg(nova_client):
-        return
-
-    transform_resource_name(ctx, security_group)
-
-    sg = nova_client.security_groups.create(
-        security_group['name'], security_group['description'])
-
-    set_sg_runtime_properties(sg, nova_client)
-
-    try:
-        for sgr in sg_rules:
-            sgr['parent_group_id'] = sg.id
-            nova_client.security_group_rules.create(**sgr)
-    except Exception:
-        delete_resource_and_runtime_properties(ctx, nova_client,
-                                               RUNTIME_PROPERTIES_KEYS)
-        raise
-
-
-@operation
-@with_nova_client
-def delete(nova_client, **kwargs):
-    delete_sg(nova_client)
-
-
-@operation
-@with_nova_client
-def creation_validation(nova_client, **kwargs):
-    sg_creation_validation(nova_client, 'cidr')
diff --git a/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/server.py b/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/server.py
deleted file mode 100644 (file)
index 6726f24..0000000
+++ /dev/null
@@ -1,944 +0,0 @@
-#########
-# Copyright (c) 2014 GigaSpaces Technologies 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.
-
-
-import os
-import time
-import copy
-import operator
-
-from novaclient import exceptions as nova_exceptions
-
-from cloudify import ctx
-from cloudify.manager import get_rest_client
-from cloudify.decorators import operation
-from cloudify.exceptions import NonRecoverableError, RecoverableError
-from cinder_plugin import volume
-from openstack_plugin_common import (
-    provider,
-    transform_resource_name,
-    get_resource_id,
-    get_openstack_ids_of_connected_nodes_by_openstack_type,
-    with_nova_client,
-    with_cinder_client,
-    assign_payload_as_runtime_properties,
-    get_openstack_id_of_single_connected_node_by_openstack_type,
-    get_openstack_names_of_connected_nodes_by_openstack_type,
-    get_single_connected_node_by_openstack_type,
-    is_external_resource,
-    is_external_resource_by_properties,
-    is_external_resource_not_conditionally_created,
-    is_external_relationship_not_conditionally_created,
-    use_external_resource,
-    delete_runtime_properties,
-    is_external_relationship,
-    validate_resource,
-    USE_EXTERNAL_RESOURCE_PROPERTY,
-    OPENSTACK_AZ_PROPERTY,
-    OPENSTACK_ID_PROPERTY,
-    OPENSTACK_TYPE_PROPERTY,
-    OPENSTACK_NAME_PROPERTY,
-    COMMON_RUNTIME_PROPERTIES_KEYS,
-    with_neutron_client)
-from nova_plugin.keypair import KEYPAIR_OPENSTACK_TYPE
-from nova_plugin import userdata
-from openstack_plugin_common.floatingip import (IP_ADDRESS_PROPERTY,
-                                                get_server_floating_ip)
-from neutron_plugin.network import NETWORK_OPENSTACK_TYPE
-from neutron_plugin.port import PORT_OPENSTACK_TYPE
-from cinder_plugin.volume import VOLUME_OPENSTACK_TYPE
-from openstack_plugin_common.security_group import \
-    SECURITY_GROUP_OPENSTACK_TYPE
-from glance_plugin.image import handle_image_from_relationship
-
-SERVER_OPENSTACK_TYPE = 'server'
-
-# server status constants. Full lists here: http://docs.openstack.org/api/openstack-compute/2/content/List_Servers-d1e2078.html  # NOQA
-SERVER_STATUS_ACTIVE = 'ACTIVE'
-SERVER_STATUS_BUILD = 'BUILD'
-SERVER_STATUS_SHUTOFF = 'SHUTOFF'
-
-OS_EXT_STS_TASK_STATE = 'OS-EXT-STS:task_state'
-SERVER_TASK_STATE_POWERING_ON = 'powering-on'
-
-MUST_SPECIFY_NETWORK_EXCEPTION_TEXT = 'More than one possible network found.'
-SERVER_DELETE_CHECK_SLEEP = 2
-
-# Runtime properties
-NETWORKS_PROPERTY = 'networks'  # all of the server's ips
-IP_PROPERTY = 'ip'  # the server's private ip
-ADMIN_PASSWORD_PROPERTY = 'password'  # the server's password
-RUNTIME_PROPERTIES_KEYS = COMMON_RUNTIME_PROPERTIES_KEYS + \
-    [NETWORKS_PROPERTY, IP_PROPERTY, ADMIN_PASSWORD_PROPERTY]
-
-
-def _get_management_network_id_and_name(neutron_client, ctx):
-    """Examine the context to find the management network id and name."""
-    management_network_id = None
-    management_network_name = None
-    provider_context = provider(ctx)
-
-    if ('management_network_name' in ctx.node.properties) and \
-            ctx.node.properties['management_network_name']:
-        management_network_name = \
-            ctx.node.properties['management_network_name']
-        management_network_name = transform_resource_name(
-            ctx, management_network_name)
-        management_network_id = neutron_client.cosmo_get_named(
-            'network', management_network_name)
-        management_network_id = management_network_id['id']
-    else:
-        int_network = provider_context.int_network
-        if int_network:
-            management_network_id = int_network['id']
-            management_network_name = int_network['name']  # Already transform.
-
-    return management_network_id, management_network_name
-
-
-def _merge_nics(management_network_id, *nics_sources):
-    """Merge nics_sources into a single nics list, insert mgmt network if
-    needed.
-    nics_sources are lists of networks received from several sources
-    (server properties, relationships to networks, relationships to ports).
-    Merge them into a single list, and if the management network isn't present
-    there, prepend it as the first network.
-    """
-    merged = []
-    for nics in nics_sources:
-        merged.extend(nics)
-    if management_network_id is not None and \
-            not any(nic['net-id'] == management_network_id for nic in merged):
-        merged.insert(0, {'net-id': management_network_id})
-    return merged
-
-
-def _normalize_nics(nics):
-    """Transform the NICs passed to the form expected by openstack.
-
-    If both net-id and port-id are provided, remove net-id: it is ignored
-    by openstack anyway.
-    """
-    def _normalize(nic):
-        if 'port-id' in nic and 'net-id' in nic:
-            nic = nic.copy()
-            del nic['net-id']
-        return nic
-    return [_normalize(nic) for nic in nics]
-
-
-def _prepare_server_nics(neutron_client, ctx, server):
-    """Update server['nics'] based on declared relationships.
-
-    server['nics'] should contain the pre-declared nics, then the networks
-    that the server has a declared relationship to, then the networks
-    of the ports the server has a relationship to.
-
-    If that doesn't include the management network, it should be prepended
-    as the first network.
-
-    The management network id and name are stored in the server meta properties
-    """
-    network_ids = get_openstack_ids_of_connected_nodes_by_openstack_type(
-        ctx, NETWORK_OPENSTACK_TYPE)
-    port_ids = get_openstack_ids_of_connected_nodes_by_openstack_type(
-        ctx, PORT_OPENSTACK_TYPE)
-    management_network_id, management_network_name = \
-        _get_management_network_id_and_name(neutron_client, ctx)
-    if management_network_id is None and (network_ids or port_ids):
-        # Known limitation
-        raise NonRecoverableError(
-            "Nova server with NICs requires "
-            "'management_network_name' in properties or id "
-            "from provider context, which was not supplied")
-
-    nics = _merge_nics(
-        management_network_id,
-        server.get('nics', []),
-        [{'net-id': net_id} for net_id in network_ids],
-        get_port_networks(neutron_client, port_ids))
-
-    nics = _normalize_nics(nics)
-
-    server['nics'] = nics
-    if management_network_id is not None:
-        server['meta']['cloudify_management_network_id'] = \
-            management_network_id
-    if management_network_name is not None:
-        server['meta']['cloudify_management_network_name'] = \
-            management_network_name
-
-
-def _get_boot_volume_relationships(type_name, ctx):
-    ctx.logger.debug('Instance relationship target instances: {0}'.format(str([
-        rel.target.instance.runtime_properties
-        for rel in ctx.instance.relationships])))
-    targets = [
-            rel.target.instance
-            for rel in ctx.instance.relationships
-            if rel.target.instance.runtime_properties.get(
-                OPENSTACK_TYPE_PROPERTY) == type_name and
-            rel.target.node.properties.get('boot', False)]
-
-    if not targets:
-        return None
-    elif len(targets) > 1:
-        raise NonRecoverableError("2 boot volumes not supported")
-    return targets[0]
-
-
-def _handle_boot_volume(server, ctx):
-    boot_volume = _get_boot_volume_relationships(VOLUME_OPENSTACK_TYPE, ctx)
-    if boot_volume:
-        boot_volume_id = boot_volume.runtime_properties[OPENSTACK_ID_PROPERTY]
-        ctx.logger.info('boot_volume_id: {0}'.format(boot_volume_id))
-        az = boot_volume.runtime_properties[OPENSTACK_AZ_PROPERTY]
-        # If a block device mapping already exists we shouldn't overwrite it
-        # completely
-        bdm = server.setdefault('block_device_mapping', {})
-        bdm['vda'] = '{0}:::0'.format(boot_volume_id)
-        # Some nova configurations allow cross-az server-volume connections, so
-        # we can't treat that as an error.
-        if not server.get('availability_zone'):
-            server['availability_zone'] = az
-
-
-@operation
-@with_nova_client
-@with_neutron_client
-def create(nova_client, neutron_client, args, **kwargs):
-    """
-    Creates a server. Exposes the parameters mentioned in
-    http://docs.openstack.org/developer/python-novaclient/api/novaclient.v1_1
-    .servers.html#novaclient.v1_1.servers.ServerManager.create
-    """
-
-    external_server = use_external_resource(ctx, nova_client,
-                                            SERVER_OPENSTACK_TYPE)
-
-    if external_server:
-        _set_network_and_ip_runtime_properties(external_server)
-        if ctx._local:
-            return
-        else:
-            network_ids = \
-                get_openstack_ids_of_connected_nodes_by_openstack_type(
-                    ctx, NETWORK_OPENSTACK_TYPE)
-            port_ids = get_openstack_ids_of_connected_nodes_by_openstack_type(
-                ctx, PORT_OPENSTACK_TYPE)
-            try:
-                _validate_external_server_nics(
-                    neutron_client,
-                    network_ids,
-                    port_ids
-                )
-                _validate_external_server_keypair(nova_client)
-                return
-            except Exception:
-                delete_runtime_properties(ctx, RUNTIME_PROPERTIES_KEYS)
-                raise
-
-    provider_context = provider(ctx)
-
-    def rename(name):
-        return transform_resource_name(ctx, name)
-
-    server = {
-        'name': get_resource_id(ctx, SERVER_OPENSTACK_TYPE),
-    }
-    server.update(copy.deepcopy(ctx.node.properties['server']))
-    server.update(copy.deepcopy(args))
-
-    _handle_boot_volume(server, ctx)
-    handle_image_from_relationship(server, 'image', ctx)
-
-    if 'meta' not in server:
-        server['meta'] = dict()
-
-    transform_resource_name(ctx, server)
-
-    ctx.logger.debug(
-        "server.create() server before transformations: {0}".format(server))
-
-    for key in 'block_device_mapping', 'block_device_mapping_v2':
-        if key in server:
-            # if there is a connected boot volume, don't require the `image`
-            # property.
-            # However, python-novaclient requires an `image` input anyway, and
-            # checks it for truthiness when deciding whether to pass it along
-            # to the API
-            if 'image' not in server:
-                server['image'] = ctx.node.properties.get('image')
-            break
-    else:
-        _handle_image_or_flavor(server, nova_client, 'image')
-    _handle_image_or_flavor(server, nova_client, 'flavor')
-
-    if provider_context.agents_security_group:
-        security_groups = server.get('security_groups', [])
-        asg = provider_context.agents_security_group['name']
-        if asg not in security_groups:
-            security_groups.append(asg)
-        server['security_groups'] = security_groups
-    elif not server.get('security_groups', []):
-        # Make sure that if the server is connected to a security group
-        # from CREATE time so that there the user can control
-        # that there is never a time that a running server is not protected.
-        security_group_names = \
-            get_openstack_names_of_connected_nodes_by_openstack_type(
-                ctx,
-                SECURITY_GROUP_OPENSTACK_TYPE)
-        server['security_groups'] = security_group_names
-
-    # server keypair handling
-    keypair_id = get_openstack_id_of_single_connected_node_by_openstack_type(
-        ctx, KEYPAIR_OPENSTACK_TYPE, True)
-
-    if 'key_name' in server:
-        if keypair_id:
-            raise NonRecoverableError("server can't both have the "
-                                      '"key_name" nested property and be '
-                                      'connected to a keypair via a '
-                                      'relationship at the same time')
-        server['key_name'] = rename(server['key_name'])
-    elif keypair_id:
-        server['key_name'] = _get_keypair_name_by_id(nova_client, keypair_id)
-    elif provider_context.agents_keypair:
-        server['key_name'] = provider_context.agents_keypair['name']
-    else:
-        server['key_name'] = None
-        ctx.logger.info(
-            'server must have a keypair, yet no keypair was connected to the '
-            'server node, the "key_name" nested property '
-            "wasn't used, and there is no agent keypair in the provider "
-            "context. Agent installation can have issues.")
-
-    _fail_on_missing_required_parameters(
-        server,
-        ('name', 'flavor'),
-        'server')
-
-    _prepare_server_nics(neutron_client, ctx, server)
-
-    ctx.logger.debug(
-        "server.create() server after transformations: {0}".format(server))
-
-    userdata.handle_userdata(server)
-
-    ctx.logger.info("Creating VM with parameters: {0}".format(str(server)))
-    # Store the server dictionary contents in runtime properties
-    assign_payload_as_runtime_properties(ctx, SERVER_OPENSTACK_TYPE, server)
-    ctx.logger.debug(
-        "Asking Nova to create server. All possible parameters are: {0})"
-        .format(','.join(server.keys())))
-
-    try:
-        s = nova_client.servers.create(**server)
-    except nova_exceptions.BadRequest as e:
-        if 'Block Device Mapping is Invalid' in str(e):
-            return ctx.operation.retry(
-                message='Block Device Mapping is not created yet',
-                retry_after=30)
-        if str(e).startswith(MUST_SPECIFY_NETWORK_EXCEPTION_TEXT):
-            raise NonRecoverableError(
-                "Can not provision server: management_network_name or id"
-                " is not specified but there are several networks that the "
-                "server can be connected to.")
-        raise
-    ctx.instance.runtime_properties[OPENSTACK_ID_PROPERTY] = s.id
-    ctx.instance.runtime_properties[OPENSTACK_TYPE_PROPERTY] = \
-        SERVER_OPENSTACK_TYPE
-    ctx.instance.runtime_properties[OPENSTACK_NAME_PROPERTY] = server['name']
-
-
-def get_port_networks(neutron_client, port_ids):
-
-    def get_network(port_id):
-        port = neutron_client.show_port(port_id)
-        return {
-            'net-id': port['port']['network_id'],
-            'port-id': port['port']['id']
-        }
-
-    return map(get_network, port_ids)
-
-
-@operation
-@with_nova_client
-def start(nova_client, start_retry_interval, private_key_path, **kwargs):
-    server = get_server_by_context(nova_client)
-
-    if is_external_resource_not_conditionally_created(ctx):
-        ctx.logger.info('Validating external server is started')
-        if server.status != SERVER_STATUS_ACTIVE:
-            raise NonRecoverableError(
-                'Expected external resource server {0} to be in '
-                '"{1}" status'.format(server.id, SERVER_STATUS_ACTIVE))
-        return
-
-    if server.status == SERVER_STATUS_ACTIVE:
-        ctx.logger.info('Server is {0}'.format(server.status))
-
-        if ctx.node.properties['use_password']:
-            private_key = _get_private_key(private_key_path)
-            ctx.logger.debug('retrieving password for server')
-            password = server.get_password(private_key)
-
-            if not password:
-                return ctx.operation.retry(
-                    message='Waiting for server to post generated password',
-                    retry_after=start_retry_interval)
-
-            ctx.instance.runtime_properties[ADMIN_PASSWORD_PROPERTY] = password
-            ctx.logger.info('Server has been set with a password')
-
-        _set_network_and_ip_runtime_properties(server)
-        return
-
-    server_task_state = getattr(server, OS_EXT_STS_TASK_STATE)
-
-    if server.status == SERVER_STATUS_SHUTOFF and \
-            server_task_state != SERVER_TASK_STATE_POWERING_ON:
-        ctx.logger.info('Server is in {0} status - starting server...'.format(
-            SERVER_STATUS_SHUTOFF))
-        server.start()
-        server_task_state = SERVER_TASK_STATE_POWERING_ON
-
-    if server.status == SERVER_STATUS_BUILD or \
-            server_task_state == SERVER_TASK_STATE_POWERING_ON:
-        return ctx.operation.retry(
-            message='Waiting for server to be in {0} state but is in {1}:{2} '
-                    'state. Retrying...'.format(SERVER_STATUS_ACTIVE,
-                                                server.status,
-                                                server_task_state),
-            retry_after=start_retry_interval)
-
-    raise NonRecoverableError(
-        'Unexpected server state {0}:{1}'.format(server.status,
-                                                 server_task_state))
-
-
-@operation
-@with_nova_client
-def stop(nova_client, **kwargs):
-    """
-    Stop server.
-
-    Depends on OpenStack implementation, server.stop() might not be supported.
-    """
-    if is_external_resource(ctx):
-        ctx.logger.info('Not stopping server since an external server is '
-                        'being used')
-        return
-
-    server = get_server_by_context(nova_client)
-
-    if server.status != SERVER_STATUS_SHUTOFF:
-        nova_client.servers.stop(server)
-    else:
-        ctx.logger.info('Server is already stopped')
-
-
-@operation
-@with_nova_client
-def delete(nova_client, **kwargs):
-    if not is_external_resource(ctx):
-        ctx.logger.info('deleting server')
-        server = get_server_by_context(nova_client)
-        nova_client.servers.delete(server)
-        _wait_for_server_to_be_deleted(nova_client, server)
-    else:
-        ctx.logger.info('not deleting server since an external server is '
-                        'being used')
-
-    delete_runtime_properties(ctx, RUNTIME_PROPERTIES_KEYS)
-
-
-def _wait_for_server_to_be_deleted(nova_client,
-                                   server,
-                                   timeout=120,
-                                   sleep_interval=5):
-    timeout = time.time() + timeout
-    while time.time() < timeout:
-        try:
-            server = nova_client.servers.get(server)
-            ctx.logger.debug('Waiting for server "{}" to be deleted. current'
-                             ' status: {}'.format(server.id, server.status))
-            time.sleep(sleep_interval)
-        except nova_exceptions.NotFound:
-            return
-    # recoverable error
-    raise RuntimeError('Server {} has not been deleted. waited for {} seconds'
-                       .format(server.id, timeout))
-
-
-def get_server_by_context(nova_client):
-    return nova_client.servers.get(
-        ctx.instance.runtime_properties[OPENSTACK_ID_PROPERTY])
-
-
-def _set_network_and_ip_runtime_properties(server):
-
-    ips = {}
-
-    if not server.networks:
-        raise NonRecoverableError(
-            'The server was created but not attached to a network. '
-            'Cloudify requires that a server is connected to '
-            'at least one port.'
-        )
-
-    manager_network_ip = None
-    management_network_name = server.metadata.get(
-        'cloudify_management_network_name')
-
-    for network, network_ips in server.networks.items():
-        if (management_network_name and
-                network == management_network_name) or not \
-                manager_network_ip:
-            manager_network_ip = next(iter(network_ips or []), None)
-        ips[network] = network_ips
-    ctx.instance.runtime_properties[NETWORKS_PROPERTY] = ips
-    # The ip of this instance in the management network
-    ctx.instance.runtime_properties[IP_PROPERTY] = manager_network_ip
-
-
-@operation
-@with_nova_client
-def connect_floatingip(nova_client, fixed_ip, **kwargs):
-    server_id = ctx.source.instance.runtime_properties[OPENSTACK_ID_PROPERTY]
-    floating_ip_id = ctx.target.instance.runtime_properties[
-        OPENSTACK_ID_PROPERTY]
-
-    if is_external_relationship_not_conditionally_created(ctx):
-        ctx.logger.info('Validating external floatingip and server '
-                        'are associated')
-        if nova_client.floating_ips.get(floating_ip_id).instance_id ==\
-                server_id:
-            return
-        raise NonRecoverableError(
-            'Expected external resources server {0} and floating-ip {1} to be '
-            'connected'.format(server_id, floating_ip_id))
-
-    floating_ip_address = ctx.target.instance.runtime_properties[
-        IP_ADDRESS_PROPERTY]
-    server = nova_client.servers.get(server_id)
-    server.add_floating_ip(floating_ip_address, fixed_ip or None)
-
-    server = nova_client.servers.get(server_id)
-    all_server_ips = reduce(operator.add, server.networks.values())
-    if floating_ip_address not in all_server_ips:
-        return ctx.operation.retry(message='Failed to assign floating ip {0}'
-                                           ' to machine {1}.'
-                                   .format(floating_ip_address, server_id))
-
-
-@operation
-@with_nova_client
-@with_neutron_client
-def disconnect_floatingip(nova_client, neutron_client, **kwargs):
-    if is_external_relationship(ctx):
-        ctx.logger.info('Not disassociating floatingip and server since '
-                        'external floatingip and server are being used')
-        return
-
-    server_id = ctx.source.instance.runtime_properties[OPENSTACK_ID_PROPERTY]
-    ctx.logger.info("Remove floating ip {0}".format(
-        ctx.target.instance.runtime_properties[IP_ADDRESS_PROPERTY]))
-    server_floating_ip = get_server_floating_ip(neutron_client, server_id)
-    if server_floating_ip:
-        server = nova_client.servers.get(server_id)
-        server.remove_floating_ip(server_floating_ip['floating_ip_address'])
-        ctx.logger.info("Floating ip {0} detached from server"
-                        .format(server_floating_ip['floating_ip_address']))
-
-
-@operation
-@with_nova_client
-def connect_security_group(nova_client, **kwargs):
-    server_id = ctx.source.instance.runtime_properties[OPENSTACK_ID_PROPERTY]
-    security_group_id = ctx.target.instance.runtime_properties[
-        OPENSTACK_ID_PROPERTY]
-    security_group_name = ctx.target.instance.runtime_properties[
-        OPENSTACK_NAME_PROPERTY]
-
-    if is_external_relationship_not_conditionally_created(ctx):
-        ctx.logger.info('Validating external security group and server '
-                        'are associated')
-        server = nova_client.servers.get(server_id)
-        if [sg for sg in server.list_security_group() if sg.id ==
-                security_group_id]:
-            return
-        raise NonRecoverableError(
-            'Expected external resources server {0} and security-group {1} to '
-            'be connected'.format(server_id, security_group_id))
-
-    server = nova_client.servers.get(server_id)
-    for security_group in server.list_security_group():
-        # Since some security groups are already attached in
-        # create this will ensure that they are not attached twice.
-        if security_group_id != security_group.id and \
-                security_group_name != security_group.name:
-            # to support nova security groups as well,
-            # we connect the security group by name
-            # (as connecting by id
-            # doesn't seem to work well for nova SGs)
-            server.add_security_group(security_group_name)
-
-    _validate_security_group_and_server_connection_status(nova_client,
-                                                          server_id,
-                                                          security_group_id,
-                                                          security_group_name,
-                                                          is_connected=True)
-
-
-@operation
-@with_nova_client
-def disconnect_security_group(nova_client, **kwargs):
-    if is_external_relationship(ctx):
-        ctx.logger.info('Not disconnecting security group and server since '
-                        'external security group and server are being used')
-        return
-
-    server_id = ctx.source.instance.runtime_properties[OPENSTACK_ID_PROPERTY]
-    security_group_id = ctx.target.instance.runtime_properties[
-        OPENSTACK_ID_PROPERTY]
-    security_group_name = ctx.target.instance.runtime_properties[
-        OPENSTACK_NAME_PROPERTY]
-    server = nova_client.servers.get(server_id)
-    # to support nova security groups as well, we disconnect the security group
-    # by name (as disconnecting by id doesn't seem to work well for nova SGs)
-    server.remove_security_group(security_group_name)
-
-    _validate_security_group_and_server_connection_status(nova_client,
-                                                          server_id,
-                                                          security_group_id,
-                                                          security_group_name,
-                                                          is_connected=False)
-
-
-@operation
-@with_nova_client
-@with_cinder_client
-def attach_volume(nova_client, cinder_client, status_attempts,
-                  status_timeout, **kwargs):
-    server_id = ctx.target.instance.runtime_properties[OPENSTACK_ID_PROPERTY]
-    volume_id = ctx.source.instance.runtime_properties[OPENSTACK_ID_PROPERTY]
-
-    if is_external_relationship_not_conditionally_created(ctx):
-        ctx.logger.info('Validating external volume and server '
-                        'are connected')
-        attachment = volume.get_attachment(cinder_client=cinder_client,
-                                           volume_id=volume_id,
-                                           server_id=server_id)
-        if attachment:
-            return
-        else:
-            raise NonRecoverableError(
-                'Expected external resources server {0} and volume {1} to be '
-                'connected'.format(server_id, volume_id))
-
-    # Note: The 'device_name' property should actually be a property of the
-    # relationship between a server and a volume; It'll move to that
-    # relationship type once relationship properties are better supported.
-    device = ctx.source.node.properties[volume.DEVICE_NAME_PROPERTY]
-    nova_client.volumes.create_server_volume(
-        server_id,
-        volume_id,
-        device if device != 'auto' else None)
-    try:
-        vol, wait_succeeded = volume.wait_until_status(
-            cinder_client=cinder_client,
-            volume_id=volume_id,
-            status=volume.VOLUME_STATUS_IN_USE,
-            num_tries=status_attempts,
-            timeout=status_timeout
-        )
-        if not wait_succeeded:
-            raise RecoverableError(
-                'Waiting for volume status {0} failed - detaching volume and '
-                'retrying..'.format(volume.VOLUME_STATUS_IN_USE))
-        if device == 'auto':
-            # The device name was assigned automatically so we
-            # query the actual device name
-            attachment = volume.get_attachment(
-                cinder_client=cinder_client,
-                volume_id=volume_id,
-                server_id=server_id
-            )
-            device_name = attachment['device']
-            ctx.logger.info('Detected device name for attachment of volume '
-                            '{0} to server {1}: {2}'
-                            .format(volume_id, server_id, device_name))
-            ctx.source.instance.runtime_properties[
-                volume.DEVICE_NAME_PROPERTY] = device_name
-    except Exception, e:
-        if not isinstance(e, NonRecoverableError):
-            _prepare_attach_volume_to_be_repeated(
-                nova_client, cinder_client, server_id, volume_id,
-                status_attempts, status_timeout)
-        raise
-
-
-def _prepare_attach_volume_to_be_repeated(
-        nova_client, cinder_client, server_id, volume_id,
-        status_attempts, status_timeout):
-
-    ctx.logger.info('Cleaning after a failed attach_volume() call')
-    try:
-        _detach_volume(nova_client, cinder_client, server_id, volume_id,
-                       status_attempts, status_timeout)
-    except Exception, e:
-        ctx.logger.error('Cleaning after a failed attach_volume() call failed '
-                         'raising a \'{0}\' exception.'.format(e))
-        raise NonRecoverableError(e)
-
-
-def _detach_volume(nova_client, cinder_client, server_id, volume_id,
-                   status_attempts, status_timeout):
-    attachment = volume.get_attachment(cinder_client=cinder_client,
-                                       volume_id=volume_id,
-                                       server_id=server_id)
-    if attachment:
-        nova_client.volumes.delete_server_volume(server_id, attachment['id'])
-        volume.wait_until_status(cinder_client=cinder_client,
-                                 volume_id=volume_id,
-                                 status=volume.VOLUME_STATUS_AVAILABLE,
-                                 num_tries=status_attempts,
-                                 timeout=status_timeout)
-
-
-@operation
-@with_nova_client
-@with_cinder_client
-def detach_volume(nova_client, cinder_client, status_attempts,
-                  status_timeout, **kwargs):
-    if is_external_relationship(ctx):
-        ctx.logger.info('Not detaching volume from server since '
-                        'external volume and server are being used')
-        return
-
-    server_id = ctx.target.instance.runtime_properties[OPENSTACK_ID_PROPERTY]
-    volume_id = ctx.source.instance.runtime_properties[OPENSTACK_ID_PROPERTY]
-
-    _detach_volume(nova_client, cinder_client, server_id, volume_id,
-                   status_attempts, status_timeout)
-
-
-def _fail_on_missing_required_parameters(obj, required_parameters, hint_where):
-    for k in required_parameters:
-        if k not in obj:
-            raise NonRecoverableError(
-                "Required parameter '{0}' is missing (under host's "
-                "properties.{1}). Required parameters are: {2}"
-                .format(k, hint_where, required_parameters))
-
-
-def _validate_external_server_keypair(nova_client):
-    keypair_id = get_openstack_id_of_single_connected_node_by_openstack_type(
-        ctx, KEYPAIR_OPENSTACK_TYPE, True)
-    if not keypair_id:
-        return
-
-    keypair_instance_id = \
-        [node_instance_id for node_instance_id, runtime_props in
-         ctx.capabilities.get_all().iteritems() if
-         runtime_props.get(OPENSTACK_ID_PROPERTY) == keypair_id][0]
-    keypair_node_properties = _get_properties_by_node_instance_id(
-        keypair_instance_id)
-    if not is_external_resource_by_properties(keypair_node_properties):
-        raise NonRecoverableError(
-            "Can't connect a new keypair node to a server node "
-            "with '{0}'=True".format(USE_EXTERNAL_RESOURCE_PROPERTY))
-
-    server = get_server_by_context(nova_client)
-    if keypair_id == _get_keypair_name_by_id(nova_client, server.key_name):
-        return
-    raise NonRecoverableError(
-        "Expected external resources server {0} and keypair {1} to be "
-        "connected".format(server.id, keypair_id))
-
-
-def _get_keypair_name_by_id(nova_client, key_name):
-    keypair = nova_client.cosmo_get_named(KEYPAIR_OPENSTACK_TYPE, key_name)
-    return keypair.id
-
-
-def _validate_external_server_nics(neutron_client, network_ids, port_ids):
-    # validate no new nics are being assigned to an existing server (which
-    # isn't possible on Openstack)
-    new_nic_nodes = \
-        [node_instance_id for node_instance_id, runtime_props in
-         ctx.capabilities.get_all().iteritems() if runtime_props.get(
-             OPENSTACK_TYPE_PROPERTY) in (PORT_OPENSTACK_TYPE,
-                                          NETWORK_OPENSTACK_TYPE) and
-         not is_external_resource_by_properties(
-             _get_properties_by_node_instance_id(node_instance_id))]
-    if new_nic_nodes:
-        raise NonRecoverableError(
-            "Can't connect new port and/or network nodes to a server node "
-            "with '{0}'=True".format(USE_EXTERNAL_RESOURCE_PROPERTY))
-
-    # validate all expected connected networks and ports are indeed already
-    # connected to the server. note that additional networks (e.g. the
-    # management network) may be connected as well with no error raised
-    if not network_ids and not port_ids:
-        return
-
-    server_id = ctx.instance.runtime_properties[OPENSTACK_ID_PROPERTY]
-    connected_ports = neutron_client.list_ports(device_id=server_id)['ports']
-
-    # not counting networks connected by a connected port since allegedly
-    # the connection should be on a separate port
-    connected_ports_networks = {port['network_id'] for port in
-                                connected_ports if port['id'] not in port_ids}
-    connected_ports_ids = {port['id'] for port in
-                           connected_ports}
-    disconnected_networks = [network_id for network_id in network_ids if
-                             network_id not in connected_ports_networks]
-    disconnected_ports = [port_id for port_id in port_ids if port_id not
-                          in connected_ports_ids]
-    if disconnected_networks or disconnected_ports:
-        raise NonRecoverableError(
-            'Expected external resources to be connected to external server {'
-            '0}: Networks - {1}; Ports - {2}'.format(server_id,
-                                                     disconnected_networks,
-                                                     disconnected_ports))
-
-
-def _get_properties_by_node_instance_id(node_instance_id):
-    client = get_rest_client()
-    node_instance = client.node_instances.get(node_instance_id)
-    node = client.nodes.get(ctx.deployment.id, node_instance.node_id)
-    return node.properties
-
-
-@operation
-@with_nova_client
-def creation_validation(nova_client, args, **kwargs):
-
-    def validate_server_property_value_exists(server_props, property_name):
-        ctx.logger.debug(
-            'checking whether {0} exists...'.format(property_name))
-
-        serv_props_copy = server_props.copy()
-        try:
-            handle_image_from_relationship(serv_props_copy, 'image', ctx)
-            _handle_image_or_flavor(serv_props_copy, nova_client,
-                                    property_name)
-        except (NonRecoverableError, nova_exceptions.NotFound) as e:
-            # temporary error - once image/flavor_name get removed, these
-            # errors won't be relevant anymore
-            err = str(e)
-            ctx.logger.error('VALIDATION ERROR: ' + err)
-            raise NonRecoverableError(err)
-
-        prop_value_id = str(serv_props_copy[property_name])
-        prop_values = list(nova_client.cosmo_list(property_name))
-        for f in prop_values:
-            if prop_value_id == f.id:
-                ctx.logger.debug('OK: {0} exists'.format(property_name))
-                return
-        err = '{0} {1} does not exist'.format(property_name, prop_value_id)
-        ctx.logger.error('VALIDATION ERROR: ' + err)
-        if prop_values:
-            ctx.logger.info('list of available {0}s:'.format(property_name))
-            for f in prop_values:
-                ctx.logger.info('    {0:>10} - {1}'.format(f.id, f.name))
-        else:
-            ctx.logger.info('there are no available {0}s'.format(
-                property_name))
-        raise NonRecoverableError(err)
-
-    validate_resource(ctx, nova_client, SERVER_OPENSTACK_TYPE)
-
-    server_props = dict(ctx.node.properties['server'], **args)
-    validate_server_property_value_exists(server_props, 'flavor')
-
-
-def _get_private_key(private_key_path):
-    pk_node_by_rel = \
-        get_single_connected_node_by_openstack_type(
-            ctx, KEYPAIR_OPENSTACK_TYPE, True)
-
-    if private_key_path:
-        if pk_node_by_rel:
-            raise NonRecoverableError("server can't both have a "
-                                      '"private_key_path" input and be '
-                                      'connected to a keypair via a '
-                                      'relationship at the same time')
-        key_path = private_key_path
-    else:
-        if pk_node_by_rel and pk_node_by_rel.properties['private_key_path']:
-            key_path = pk_node_by_rel.properties['private_key_path']
-        else:
-            key_path = ctx.bootstrap_context.cloudify_agent.agent_key_path
-
-    if key_path:
-        key_path = os.path.expanduser(key_path)
-        if os.path.isfile(key_path):
-            return key_path
-
-    err_message = 'Cannot find private key file'
-    if key_path:
-        err_message += '; expected file path was {0}'.format(key_path)
-    raise NonRecoverableError(err_message)
-
-
-def _validate_security_group_and_server_connection_status(
-        nova_client, server_id, sg_id, sg_name, is_connected):
-
-    # verifying the security group got connected or disconnected
-    # successfully - this is due to Openstack concurrency issues that may
-    # take place when attempting to connect/disconnect multiple SGs to the
-    # same server at the same time
-    server = nova_client.servers.get(server_id)
-
-    if is_connected ^ any(sg for sg in server.list_security_group() if
-                          sg.id == sg_id):
-        raise RecoverableError(
-            message='Security group {0} did not get {2} server {1} '
-                    'properly'
-            .format(
-                sg_name,
-                server.name,
-                'connected to' if is_connected else 'disconnected from'))
-
-
-def _handle_image_or_flavor(server, nova_client, prop_name):
-    if prop_name not in server and '{0}_name'.format(prop_name) not in server:
-        # setting image or flavor - looking it up by name; if not found, then
-        # the value is assumed to be the id
-        server[prop_name] = ctx.node.properties[prop_name]
-
-        # temporary error message: once the 'image' and 'flavor' properties
-        # become mandatory, this will become less relevant
-        if not server[prop_name]:
-            raise NonRecoverableError(
-                'must set {0} by either setting a "{0}" property or by setting'
-                ' a "{0}" or "{0}_name" (deprecated) field under the "server" '
-                'property'.format(prop_name))
-
-        image_or_flavor = \
-            nova_client.cosmo_get_if_exists(prop_name, name=server[prop_name])
-        if image_or_flavor:
-            server[prop_name] = image_or_flavor.id
-    else:  # Deprecated sugar
-        if '{0}_name'.format(prop_name) in server:
-            prop_name_plural = nova_client.cosmo_plural(prop_name)
-            server[prop_name] = \
-                getattr(nova_client, prop_name_plural).find(
-                    name=server['{0}_name'.format(prop_name)]).id
-            del server['{0}_name'.format(prop_name)]
diff --git a/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/__init__.py b/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/__init__.py
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/resources/test-keypair-validation-blueprint.yaml b/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/resources/test-keypair-validation-blueprint.yaml
deleted file mode 100644 (file)
index 22b7fb5..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-tosca_definitions_version: cloudify_dsl_1_3
-
-imports:
-  - https://raw.githubusercontent.com/cloudify-cosmo/cloudify-manager/4.1/resources/rest-service/cloudify/types/types.yaml
-  - plugin.yaml
-
-inputs:
-  private_key: {}
-  is_keypair_external: {}
-
-
-node_templates:
-
-  keypair:
-    type: cloudify.openstack.nodes.KeyPair
-    properties:
-      private_key_path: { get_input: private_key }
-      use_external_resource: { get_input: is_keypair_external }
-      openstack_config:
-        username: aaa
-        password: aaa
-        tenant_name: aaa
-        auth_url: aaa
diff --git a/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/resources/test-server-create-secgroup.yaml b/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/resources/test-server-create-secgroup.yaml
deleted file mode 100644 (file)
index 70b75f6..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-tosca_definitions_version: cloudify_dsl_1_3
-
-imports:
-  - https://raw.githubusercontent.com/cloudify-cosmo/cloudify-manager/4.1/resources/rest-service/cloudify/types/types.yaml
-  - plugin.yaml
-
-inputs:
-  use_password:
-    type: boolean
-    default: false
-
-node_templates:
-
-  security_group:
-    type: cloudify.openstack.nodes.SecurityGroup
-
-  server:
-    type: cloudify.openstack.nodes.Server
-    properties:
-      install_agent: false
-      use_password: { get_input: use_password }
-      openstack_config:
-        username: aaa
-        password: aaa
-        tenant_name: aaa
-        auth_url: aaa
-      server:
-        key_name: 'aa'
-    relationships:
-      - type: cloudify.openstack.server_connected_to_security_group
-        target: security_group
diff --git a/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/resources/test-start-operation-retry-blueprint.yaml b/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/resources/test-start-operation-retry-blueprint.yaml
deleted file mode 100644 (file)
index 275806c..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-tosca_definitions_version: cloudify_dsl_1_3
-
-imports:
-  - https://raw.githubusercontent.com/cloudify-cosmo/cloudify-manager/4.1/resources/rest-service/cloudify/types/types.yaml
-  - plugin.yaml
-
-inputs:
-  use_password:
-    type: boolean
-    default: false
-
-node_templates:
-  server:
-    type: cloudify.openstack.nodes.Server
-    properties:
-      install_agent: false
-      use_password: { get_input: use_password }
-      server:
-        key_name: key
-        scheduler_hints:
-          group: affinity-group-id
-      openstack_config:
-        username: aaa
-        password: aaa
-        tenant_name: aaa
-        auth_url: aaa
-    interfaces:
-      cloudify.interfaces.lifecycle:
-        start:
-          inputs:
-            start_retry_interval: 1
diff --git a/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/test_relationships.py b/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/test_relationships.py
deleted file mode 100644 (file)
index 2814057..0000000
+++ /dev/null
@@ -1,228 +0,0 @@
-#########
-# Copyright (c) 2016 GigaSpaces Technologies 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.
-
-"""Test the functions related to retrieving relationship information.
-
-Functions under test are mostly inside openstack_plugin_common:
-get_relationships_by_openstack_type
-get_connected_nodes_by_openstack_type
-get_openstack_ids_of_connected_nodes_by_openstack_type
-get_single_connected_node_by_openstack_type
-"""
-
-import uuid
-from unittest import TestCase
-
-from neutron_plugin.network import NETWORK_OPENSTACK_TYPE
-
-from cloudify.exceptions import NonRecoverableError
-
-from cloudify.mocks import (
-    MockCloudifyContext,
-    MockNodeContext,
-    MockNodeInstanceContext,
-    MockRelationshipContext,
-    MockRelationshipSubjectContext,
-)
-from openstack_plugin_common import (
-    OPENSTACK_ID_PROPERTY,
-    OPENSTACK_TYPE_PROPERTY,
-    get_openstack_id_of_single_connected_node_by_openstack_type,
-    get_openstack_ids_of_connected_nodes_by_openstack_type,
-    get_relationships_by_openstack_type,
-    get_single_connected_node_by_openstack_type,
-)
-
-
-class RelationshipsTestBase(TestCase):
-    def _make_vm_ctx_with_relationships(self, rel_specs, properties=None):
-        """Prepare a mock CloudifyContext from the given relationship spec.
-
-        rel_specs is an ordered collection of relationship specs - dicts
-        with the keys "node" and "instance" used to construct the
-        MockNodeContext and the MockNodeInstanceContext, and optionally a
-        "type" key.
-        Examples: [
-            {},
-            {"node": {"id": 5}},
-            {
-                "type": "some_type",
-                "instance": {
-                    "id": 3,
-                    "runtime_properties":{}
-                }
-            }
-        ]
-        """
-        if properties is None:
-            properties = {}
-        relationships = []
-        for rel_spec in rel_specs:
-            node = rel_spec.get('node', {})
-            node_id = node.pop('id', uuid.uuid4().hex)
-
-            instance = rel_spec.get('instance', {})
-            instance_id = instance.pop('id', '{0}_{1}'.format(
-                node_id, uuid.uuid4().hex))
-            if 'properties' not in node:
-                node['properties'] = {}
-            node_ctx = MockNodeContext(id=node_id, **node)
-            instance_ctx = MockNodeInstanceContext(id=instance_id, **instance)
-
-            rel_subject_ctx = MockRelationshipSubjectContext(
-                node=node_ctx, instance=instance_ctx)
-            rel_type = rel_spec.get('type')
-            rel_ctx = MockRelationshipContext(target=rel_subject_ctx,
-                                              type=rel_type)
-            relationships.append(rel_ctx)
-        return MockCloudifyContext(node_id='vm', properties=properties,
-                                   relationships=relationships)
-
-
-class TestGettingRelatedResources(RelationshipsTestBase):
-
-    def test_get_relationships_finds_all_by_type(self):
-        """get_relationships_by_openstack_type returns all rels that match."""
-        rel_specs = [{
-            'instance': {
-                'id': instance_id,
-                'runtime_properties': {
-                    OPENSTACK_TYPE_PROPERTY: NETWORK_OPENSTACK_TYPE
-                }
-            }
-        } for instance_id in range(3)]
-
-        rel_specs.append({
-            'instance': {
-                'runtime_properties': {
-                    OPENSTACK_TYPE_PROPERTY: 'something else'
-                }
-            }
-        })
-
-        ctx = self._make_vm_ctx_with_relationships(rel_specs)
-        filtered = get_relationships_by_openstack_type(ctx,
-                                                       NETWORK_OPENSTACK_TYPE)
-        self.assertEqual(3, len(filtered))
-
-    def test_get_ids_of_nodes_by_type(self):
-
-        rel_spec = {
-            'instance': {
-                'runtime_properties': {
-                    OPENSTACK_TYPE_PROPERTY: NETWORK_OPENSTACK_TYPE,
-                    OPENSTACK_ID_PROPERTY: 'the node id'
-                }
-            }
-        }
-        ctx = self._make_vm_ctx_with_relationships([rel_spec])
-        ids = get_openstack_ids_of_connected_nodes_by_openstack_type(
-            ctx, NETWORK_OPENSTACK_TYPE)
-        self.assertEqual(['the node id'], ids)
-
-
-class TestGetSingleByID(RelationshipsTestBase):
-    def _make_instances(self, ids):
-        """Mock a context with relationships to instances with given ids."""
-        rel_specs = [{
-            'node': {
-                'id': node_id
-            },
-            'instance': {
-                'runtime_properties': {
-                    OPENSTACK_TYPE_PROPERTY: NETWORK_OPENSTACK_TYPE,
-                    OPENSTACK_ID_PROPERTY: node_id
-                }
-            }
-        } for node_id in ids]
-        return self._make_vm_ctx_with_relationships(rel_specs)
-
-    def test_get_single_id(self):
-        ctx = self._make_instances(['the node id'])
-        found_id = get_openstack_id_of_single_connected_node_by_openstack_type(
-            ctx, NETWORK_OPENSTACK_TYPE)
-        self.assertEqual('the node id', found_id)
-
-    def test_get_single_id_two_found(self):
-        ctx = self._make_instances([0, 1])
-        self.assertRaises(
-            NonRecoverableError,
-            get_openstack_id_of_single_connected_node_by_openstack_type, ctx,
-            NETWORK_OPENSTACK_TYPE)
-
-    def test_get_single_id_two_found_if_exists_true(self):
-        ctx = self._make_instances([0, 1])
-
-        try:
-            get_openstack_id_of_single_connected_node_by_openstack_type(
-                ctx, NETWORK_OPENSTACK_TYPE, if_exists=True)
-        except NonRecoverableError as e:
-            self.assertIn(NETWORK_OPENSTACK_TYPE, e.message)
-        else:
-            self.fail()
-
-    def test_get_single_id_if_exists_none_found(self):
-        ctx = self._make_instances([])
-        found = get_openstack_id_of_single_connected_node_by_openstack_type(
-            ctx, NETWORK_OPENSTACK_TYPE, if_exists=True)
-        self.assertIsNone(found)
-
-    def test_get_single_id_none_found(self):
-        rel_spec = []
-        ctx = self._make_vm_ctx_with_relationships(rel_spec)
-        self.assertRaises(
-            NonRecoverableError,
-            get_openstack_id_of_single_connected_node_by_openstack_type,
-            ctx,
-            NETWORK_OPENSTACK_TYPE)
-
-    def test_get_single_node(self):
-        ctx = self._make_instances(['the node id'])
-        found_node = get_single_connected_node_by_openstack_type(
-            ctx, NETWORK_OPENSTACK_TYPE)
-        self.assertEqual('the node id', found_node.id)
-
-    def test_get_single_node_two_found(self):
-        ctx = self._make_instances([0, 1])
-        self.assertRaises(
-            NonRecoverableError,
-            get_single_connected_node_by_openstack_type,
-            ctx, NETWORK_OPENSTACK_TYPE)
-
-    def test_get_single_node_two_found_if_exists(self):
-        ctx = self._make_instances([0, 1])
-
-        self.assertRaises(
-            NonRecoverableError,
-            get_single_connected_node_by_openstack_type,
-            ctx,
-            NETWORK_OPENSTACK_TYPE,
-            if_exists=True)
-
-    def test_get_single_node_if_exists_none_found(self):
-        ctx = self._make_instances([])
-
-        found = get_single_connected_node_by_openstack_type(
-            ctx, NETWORK_OPENSTACK_TYPE, if_exists=True)
-        self.assertIsNone(found)
-
-    def test_get_single_node_none_found(self):
-        ctx = self._make_instances([])
-
-        self.assertRaises(
-            NonRecoverableError,
-            get_single_connected_node_by_openstack_type,
-            ctx,
-            NETWORK_OPENSTACK_TYPE)
diff --git a/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/test_server.py b/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/test_server.py
deleted file mode 100644 (file)
index a509305..0000000
+++ /dev/null
@@ -1,551 +0,0 @@
-#########
-# Copyright (c) 2014 GigaSpaces Technologies 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.
-
-from os import path
-import tempfile
-
-import unittest
-import mock
-
-import nova_plugin
-from cloudify.test_utils import workflow_test
-
-from openstack_plugin_common import NeutronClientWithSugar, \
-    OPENSTACK_TYPE_PROPERTY, OPENSTACK_ID_PROPERTY
-from neutron_plugin.network import NETWORK_OPENSTACK_TYPE
-from neutron_plugin.port import PORT_OPENSTACK_TYPE
-from nova_plugin.tests.test_relationships import RelationshipsTestBase
-from nova_plugin.server import _prepare_server_nics
-from cinder_plugin.volume import VOLUME_OPENSTACK_TYPE
-from cloudify.exceptions import NonRecoverableError
-from cloudify.state import current_ctx
-
-from cloudify.utils import setup_logger
-
-from cloudify.mocks import (
-    MockNodeContext,
-    MockCloudifyContext,
-    MockNodeInstanceContext,
-    MockRelationshipContext,
-    MockRelationshipSubjectContext
-)
-
-
-class TestServer(unittest.TestCase):
-
-    blueprint_path = path.join('resources',
-                               'test-start-operation-retry-blueprint.yaml')
-
-    @mock.patch('nova_plugin.server.create')
-    @mock.patch('nova_plugin.server._set_network_and_ip_runtime_properties')
-    @workflow_test(blueprint_path, copy_plugin_yaml=True)
-    def test_nova_server_lifecycle_start(self, cfy_local, *_):
-
-        test_vars = {
-            'counter': 0,
-            'server': mock.MagicMock()
-        }
-
-        def mock_get_server_by_context(*_):
-            s = test_vars['server']
-            if test_vars['counter'] == 0:
-                s.status = nova_plugin.server.SERVER_STATUS_BUILD
-            else:
-                s.status = nova_plugin.server.SERVER_STATUS_ACTIVE
-            test_vars['counter'] += 1
-            return s
-
-        with mock.patch('nova_plugin.server.get_server_by_context',
-                        new=mock_get_server_by_context):
-            cfy_local.execute('install', task_retries=3)
-
-        self.assertEqual(2, test_vars['counter'])
-        self.assertEqual(0, test_vars['server'].start.call_count)
-
-    @workflow_test(blueprint_path, copy_plugin_yaml=True)
-    @mock.patch('nova_plugin.server.create')
-    @mock.patch('nova_plugin.server._set_network_and_ip_runtime_properties')
-    def test_nova_server_lifecycle_start_after_stop(self, cfy_local, *_):
-
-        test_vars = {
-            'counter': 0,
-            'server': mock.MagicMock()
-        }
-
-        def mock_get_server_by_context(_):
-            s = test_vars['server']
-            if test_vars['counter'] == 0:
-                s.status = nova_plugin.server.SERVER_STATUS_SHUTOFF
-            elif test_vars['counter'] == 1:
-                setattr(s,
-                        nova_plugin.server.OS_EXT_STS_TASK_STATE,
-                        nova_plugin.server.SERVER_TASK_STATE_POWERING_ON)
-            else:
-                s.status = nova_plugin.server.SERVER_STATUS_ACTIVE
-            test_vars['counter'] += 1
-            test_vars['server'] = s
-            return s
-
-        with mock.patch('nova_plugin.server.get_server_by_context',
-                        new=mock_get_server_by_context):
-            cfy_local.execute('install', task_retries=3)
-
-        self.assertEqual(1, test_vars['server'].start.call_count)
-        self.assertEqual(3, test_vars['counter'])
-
-    @workflow_test(blueprint_path, copy_plugin_yaml=True)
-    @mock.patch('nova_plugin.server.create')
-    @mock.patch('nova_plugin.server._set_network_and_ip_runtime_properties')
-    def test_nova_server_lifecycle_start_unknown_status(self, cfy_local, *_):
-        test_vars = {
-            'counter': 0,
-            'server': mock.MagicMock()
-        }
-
-        def mock_get_server_by_context(_):
-            s = test_vars['server']
-            if test_vars['counter'] == 0:
-                s.status = '### unknown-status ###'
-            test_vars['counter'] += 1
-            test_vars['server'] = s
-            return s
-
-        with mock.patch('nova_plugin.server.get_server_by_context',
-                        new=mock_get_server_by_context):
-            self.assertRaisesRegexp(RuntimeError,
-                                    'Unexpected server state',
-                                    cfy_local.execute,
-                                    'install')
-
-        self.assertEqual(0, test_vars['server'].start.call_count)
-        self.assertEqual(1, test_vars['counter'])
-
-    @workflow_test(blueprint_path, copy_plugin_yaml=True)
-    @mock.patch('nova_plugin.server.start')
-    @mock.patch('nova_plugin.server._handle_image_or_flavor')
-    @mock.patch('nova_plugin.server._fail_on_missing_required_parameters')
-    @mock.patch('openstack_plugin_common.nova_client')
-    def test_nova_server_creation_param_integrity(
-            self, cfy_local, mock_nova, *args):
-        cfy_local.execute('install', task_retries=0)
-        calls = mock_nova.Client.return_value.servers.method_calls
-        self.assertEqual(1, len(calls))
-        kws = calls[0][2]
-        self.assertIn('scheduler_hints', kws)
-        self.assertEqual(kws['scheduler_hints'],
-                         {'group': 'affinity-group-id'},
-                         'expecting \'scheduler_hints\' value to exist')
-
-    @workflow_test(blueprint_path, copy_plugin_yaml=True,
-                   inputs={'use_password': True})
-    @mock.patch('nova_plugin.server.create')
-    @mock.patch('nova_plugin.server._set_network_and_ip_runtime_properties')
-    @mock.patch(
-        'nova_plugin.server.get_single_connected_node_by_openstack_type',
-        autospec=True, return_value=None)
-    def test_nova_server_with_use_password(self, cfy_local, *_):
-
-        test_vars = {
-            'counter': 0,
-            'server': mock.MagicMock()
-        }
-
-        tmp_path = tempfile.NamedTemporaryFile(prefix='key_name')
-        key_path = tmp_path.name
-
-        def mock_get_server_by_context(_):
-            s = test_vars['server']
-            if test_vars['counter'] == 0:
-                s.status = nova_plugin.server.SERVER_STATUS_BUILD
-            else:
-                s.status = nova_plugin.server.SERVER_STATUS_ACTIVE
-            test_vars['counter'] += 1
-
-            def check_agent_key_path(private_key):
-                self.assertEqual(private_key, key_path)
-                return private_key
-
-            s.get_password = check_agent_key_path
-            return s
-
-        with mock.patch('nova_plugin.server.get_server_by_context',
-                        mock_get_server_by_context):
-            with mock.patch(
-                    'cloudify.context.BootstrapContext.'
-                    'CloudifyAgent.agent_key_path',
-                    new_callable=mock.PropertyMock, return_value=key_path):
-                cfy_local.execute('install', task_retries=5)
-
-
-class TestMergeNICs(unittest.TestCase):
-    def test_merge_prepends_management_network(self):
-        """When the mgmt network isnt in a relationship, its the 1st nic."""
-        mgmt_network_id = 'management network'
-        nics = [{'net-id': 'other network'}]
-
-        merged = nova_plugin.server._merge_nics(mgmt_network_id, nics)
-
-        self.assertEqual(len(merged), 2)
-        self.assertEqual(merged[0]['net-id'], 'management network')
-
-    def test_management_network_in_relationships(self):
-        """When the mgmt network was in a relationship, it's not prepended."""
-        mgmt_network_id = 'management network'
-        nics = [{'net-id': 'other network'}, {'net-id': 'management network'}]
-
-        merged = nova_plugin.server._merge_nics(mgmt_network_id, nics)
-
-        self.assertEqual(nics, merged)
-
-
-class TestNormalizeNICs(unittest.TestCase):
-    def test_normalize_port_priority(self):
-        """Whe there's both net-id and port-id, port-id is used."""
-        nics = [{'net-id': '1'}, {'port-id': '2'}, {'net-id': 3, 'port-id': 4}]
-        normalized = nova_plugin.server._normalize_nics(nics)
-        expected = [{'net-id': '1'}, {'port-id': '2'}, {'port-id': 4}]
-        self.assertEqual(expected, normalized)
-
-
-class MockNeutronClient(NeutronClientWithSugar):
-    """A fake neutron client with hard-coded test data."""
-
-    @mock.patch('openstack_plugin_common.OpenStackClient.__init__',
-                new=mock.Mock())
-    def __init__(self):
-        super(MockNeutronClient, self).__init__()
-
-    @staticmethod
-    def _search_filter(objs, search_params):
-        """Mock neutron's filtering by attributes in list_* methods.
-
-        list_* methods (list_networks, list_ports)
-        """
-        def _matches(obj, search_params):
-            return all(obj[k] == v for k, v in search_params.items())
-        return [obj for obj in objs if _matches(obj, search_params)]
-
-    def list_networks(self, **search_params):
-        networks = [
-            {'name': 'network1', 'id': '1'},
-            {'name': 'network2', 'id': '2'},
-            {'name': 'network3', 'id': '3'},
-            {'name': 'network4', 'id': '4'},
-            {'name': 'network5', 'id': '5'},
-            {'name': 'network6', 'id': '6'},
-            {'name': 'other', 'id': 'other'}
-        ]
-        return {'networks': self._search_filter(networks, search_params)}
-
-    def list_ports(self, **search_params):
-        ports = [
-            {'name': 'port1', 'id': '1', 'network_id': '1'},
-            {'name': 'port2', 'id': '2', 'network_id': '1'},
-            {'name': 'port3', 'id': '3', 'network_id': '2'},
-            {'name': 'port4', 'id': '4', 'network_id': '2'},
-        ]
-        return {'ports': self._search_filter(ports, search_params)}
-
-    def show_port(self, port_id):
-        ports = self.list_ports(id=port_id)
-        return {'port': ports['ports'][0]}
-
-
-class NICTestBase(RelationshipsTestBase):
-    """Base test class for the NICs tests.
-
-    It comes with helper methods to create a mock cloudify context, with
-    the specified relationships.
-    """
-    mock_neutron = MockNeutronClient()
-
-    def _relationship_spec(self, obj, objtype):
-        return {'node': {'properties': obj},
-                'instance': {
-                    'runtime_properties': {OPENSTACK_TYPE_PROPERTY: objtype,
-                                           OPENSTACK_ID_PROPERTY: obj['id']}}}
-
-    def _make_vm_ctx_with_ports(self, management_network_name, ports):
-        port_specs = [self._relationship_spec(obj, PORT_OPENSTACK_TYPE)
-                      for obj in ports]
-        vm_properties = {'management_network_name': management_network_name}
-        return self._make_vm_ctx_with_relationships(port_specs,
-                                                    vm_properties)
-
-    def _make_vm_ctx_with_networks(self, management_network_name, networks):
-        network_specs = [self._relationship_spec(obj, NETWORK_OPENSTACK_TYPE)
-                         for obj in networks]
-        vm_properties = {'management_network_name': management_network_name}
-        return self._make_vm_ctx_with_relationships(network_specs,
-                                                    vm_properties)
-
-
-class TestServerNICs(NICTestBase):
-    """Test preparing the NICs list from server<->network relationships.
-
-    Each test creates a cloudify context that represents a openstack VM
-    with relationships to networks. Then, examine the NICs list produced from
-    the relationships.
-    """
-    def test_nova_server_creation_nics_ordering(self):
-        """NIC list keeps the order of the relationships.
-
-        The nics= list passed to nova.server.create should be ordered
-        depending on the relationships to the networks (as defined in the
-        blueprint).
-        """
-        ctx = self._make_vm_ctx_with_networks(
-            management_network_name='network1',
-            networks=[
-                {'id': '1'},
-                {'id': '2'},
-                {'id': '3'},
-                {'id': '4'},
-                {'id': '5'},
-                {'id': '6'},
-            ])
-        server = {'meta': {}}
-
-        _prepare_server_nics(
-            self.mock_neutron, ctx, server)
-
-        self.assertEqual(
-            ['1', '2', '3', '4', '5', '6'],
-            [n['net-id'] for n in server['nics']])
-
-    def test_server_creation_prepends_mgmt_network(self):
-        """If the management network isn't in a relation, it's the first NIC.
-
-        Creating the server examines the relationships, and if it doesn't find
-        a relationship to the management network, it adds the management
-        network to the NICs list, as the first element.
-        """
-        ctx = self._make_vm_ctx_with_networks(
-            management_network_name='other',
-            networks=[
-                {'id': '1'},
-                {'id': '2'},
-                {'id': '3'},
-                {'id': '4'},
-                {'id': '5'},
-                {'id': '6'},
-            ])
-        server = {'meta': {}}
-
-        _prepare_server_nics(
-            self.mock_neutron, ctx, server)
-
-        first_nic = server['nics'][0]
-        self.assertEqual('other', first_nic['net-id'])
-        self.assertEqual(7, len(server['nics']))
-
-    def test_server_creation_uses_relation_mgmt_nic(self):
-        """If the management network is in a relation, it isn't prepended.
-
-        If the server has a relationship to the management network,
-        a new NIC isn't prepended to the list.
-        """
-        ctx = self._make_vm_ctx_with_networks(
-            management_network_name='network1',
-            networks=[
-                {'id': '1'},
-                {'id': '2'},
-                {'id': '3'},
-                {'id': '4'},
-                {'id': '5'},
-                {'id': '6'},
-            ])
-        server = {'meta': {}}
-
-        _prepare_server_nics(
-            self.mock_neutron, ctx, server)
-        self.assertEqual(6, len(server['nics']))
-
-
-class TestServerPortNICs(NICTestBase):
-    """Test preparing the NICs list from server<->port relationships.
-
-    Create a cloudify ctx representing a vm with relationships to
-    openstack ports. Then examine the resulting NICs list: check that it
-    contains the networks that the ports were connected to, and that each
-    connection uses the port that was provided.
-    """
-
-    def test_network_with_port(self):
-        """Port on the management network is used to connect to it.
-
-        The NICs list entry for the management network contains the
-        port-id of the port from the relationship, but doesn't contain net-id.
-        """
-        ports = [{'id': '1'}]
-        ctx = self._make_vm_ctx_with_ports('network1', ports)
-        server = {'meta': {}}
-
-        _prepare_server_nics(
-            self.mock_neutron, ctx, server)
-
-        self.assertEqual([{'port-id': '1'}], server['nics'])
-
-    def test_port_not_to_mgmt_network(self):
-        """A NICs list entry is added with the network and the port.
-
-        A relationship to a port must not only add a NIC, but the NIC must
-        also make sure to use that port.
-        """
-        ports = [{'id': '1'}]
-        ctx = self._make_vm_ctx_with_ports('other', ports)
-        server = {'meta': {}}
-
-        _prepare_server_nics(
-            self.mock_neutron, ctx, server)
-        expected = [
-            {'net-id': 'other'},
-            {'port-id': '1'}
-        ]
-        self.assertEqual(expected, server['nics'])
-
-
-class TestBootFromVolume(unittest.TestCase):
-
-    @mock.patch('nova_plugin.server._get_boot_volume_relationships',
-                autospec=True)
-    def test_handle_boot_volume(self, mock_get_rels):
-        mock_get_rels.return_value.runtime_properties = {
-                'external_id': 'test-id',
-                'availability_zone': 'test-az',
-                }
-        server = {}
-        ctx = mock.MagicMock()
-        nova_plugin.server._handle_boot_volume(server, ctx)
-        self.assertEqual({'vda': 'test-id:::0'},
-                         server['block_device_mapping'])
-        self.assertEqual('test-az',
-                         server['availability_zone'])
-
-    @mock.patch('nova_plugin.server._get_boot_volume_relationships',
-                autospec=True, return_value=[])
-    def test_handle_boot_volume_no_boot_volume(self, *_):
-        server = {}
-        ctx = mock.MagicMock()
-        nova_plugin.server._handle_boot_volume(server, ctx)
-        self.assertNotIn('block_device_mapping', server)
-
-
-class TestImageFromRelationships(unittest.TestCase):
-
-    @mock.patch('glance_plugin.image.'
-                'get_openstack_ids_of_connected_nodes_by_openstack_type',
-                autospec=True, return_value=['test-id'])
-    def test_handle_boot_image(self, *_):
-        server = {}
-        ctx = mock.MagicMock()
-        nova_plugin.server.handle_image_from_relationship(server, 'image', ctx)
-        self.assertEqual({'image': 'test-id'}, server)
-
-    @mock.patch('glance_plugin.image.'
-                'get_openstack_ids_of_connected_nodes_by_openstack_type',
-                autospec=True, return_value=[])
-    def test_handle_boot_image_no_image(self, *_):
-        server = {}
-        ctx = mock.MagicMock()
-        nova_plugin.server.handle_image_from_relationship(server, 'image', ctx)
-        self.assertNotIn('image', server)
-
-
-class TestServerRelationships(unittest.TestCase):
-
-    def _get_ctx_mock(self, instance_id, boot):
-        rel_specs = [MockRelationshipContext(
-            target=MockRelationshipSubjectContext(node=MockNodeContext(
-                properties={'boot': boot}), instance=MockNodeInstanceContext(
-                runtime_properties={
-                    OPENSTACK_TYPE_PROPERTY: VOLUME_OPENSTACK_TYPE,
-                    OPENSTACK_ID_PROPERTY: instance_id
-                })))]
-        ctx = mock.MagicMock()
-        ctx.instance = MockNodeInstanceContext(relationships=rel_specs)
-        ctx.logger = setup_logger('mock-logger')
-        return ctx
-
-    def test_boot_volume_relationship(self):
-        instance_id = 'test-id'
-        ctx = self._get_ctx_mock(instance_id, True)
-        result = nova_plugin.server._get_boot_volume_relationships(
-            VOLUME_OPENSTACK_TYPE, ctx)
-        self.assertEqual(
-                instance_id,
-                result.runtime_properties['external_id'])
-
-    def test_no_boot_volume_relationship(self):
-        instance_id = 'test-id'
-        ctx = self._get_ctx_mock(instance_id, False)
-        result = nova_plugin.server._get_boot_volume_relationships(
-            VOLUME_OPENSTACK_TYPE, ctx)
-        self.assertFalse(result)
-
-
-class TestServerNetworkRuntimeProperties(unittest.TestCase):
-
-    @property
-    def mock_ctx(self):
-        return MockCloudifyContext(
-            node_id='test',
-            deployment_id='test',
-            properties={},
-            operation={'retry_number': 0},
-            provider_context={'resources': {}}
-        )
-
-    def test_server_networks_runtime_properties_empty_server(self):
-        ctx = self.mock_ctx
-        current_ctx.set(ctx=ctx)
-        server = mock.MagicMock()
-        setattr(server, 'networks', {})
-        with self.assertRaisesRegexp(
-                NonRecoverableError,
-                'The server was created but not attached to a network.'):
-            nova_plugin.server._set_network_and_ip_runtime_properties(server)
-
-    def test_server_networks_runtime_properties_valid_networks(self):
-        ctx = self.mock_ctx
-        current_ctx.set(ctx=ctx)
-        server = mock.MagicMock()
-        network_id = 'management_network'
-        network_ips = ['good', 'bad1', 'bad2']
-        setattr(server,
-                'networks',
-                {network_id: network_ips})
-        nova_plugin.server._set_network_and_ip_runtime_properties(server)
-        self.assertIn('networks', ctx.instance.runtime_properties.keys())
-        self.assertIn('ip', ctx.instance.runtime_properties.keys())
-        self.assertEquals(ctx.instance.runtime_properties['ip'], 'good')
-        self.assertEquals(ctx.instance.runtime_properties['networks'],
-                          {network_id: network_ips})
-
-    def test_server_networks_runtime_properties_empty_networks(self):
-        ctx = self.mock_ctx
-        current_ctx.set(ctx=ctx)
-        server = mock.MagicMock()
-        network_id = 'management_network'
-        network_ips = []
-        setattr(server,
-                'networks',
-                {network_id: network_ips})
-        nova_plugin.server._set_network_and_ip_runtime_properties(server)
-        self.assertIn('networks', ctx.instance.runtime_properties.keys())
-        self.assertIn('ip', ctx.instance.runtime_properties.keys())
-        self.assertEquals(ctx.instance.runtime_properties['ip'], None)
-        self.assertEquals(ctx.instance.runtime_properties['networks'],
-                          {network_id: network_ips})
diff --git a/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/test_server_image_and_flavor.py b/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/test_server_image_and_flavor.py
deleted file mode 100644 (file)
index 2ae4758..0000000
+++ /dev/null
@@ -1,228 +0,0 @@
-#########
-# Copyright (c) 2014 GigaSpaces Technologies 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.
-
-
-import unittest
-
-import mock
-from novaclient import exceptions as nova_exceptions
-
-import nova_plugin.server as server
-from cloudify.exceptions import NonRecoverableError
-from cloudify.mocks import MockCloudifyContext
-
-
-class TestServerImageAndFlavor(unittest.TestCase):
-
-    def test_no_image_and_no_flavor(self):
-        node_props = {
-            'image': '',
-            'flavor': ''
-        }
-        with mock.patch('nova_plugin.server.ctx',
-                        self._get_mock_ctx_with_node_properties(node_props)):
-            nova_client = self._get_mocked_nova_client()
-
-            serv = {}
-            self.assertRaises(NonRecoverableError,
-                              server._handle_image_or_flavor,
-                              serv, nova_client, 'image')
-            self.assertRaises(NonRecoverableError,
-                              server._handle_image_or_flavor,
-                              serv, nova_client, 'flavor')
-
-    def test_image_and_flavor_properties_as_names(self):
-        node_props = {
-            'image': 'some-image-name',
-            'flavor': 'some-flavor-name'
-        }
-        with mock.patch('nova_plugin.server.ctx',
-                        self._get_mock_ctx_with_node_properties(node_props)):
-            nova_client = self._get_mocked_nova_client()
-
-            serv = {}
-            server._handle_image_or_flavor(serv, nova_client, 'image')
-            server._handle_image_or_flavor(serv, nova_client, 'flavor')
-
-        self.assertEquals('some-image-id', serv.get('image'))
-        self.assertEquals('some-flavor-id', serv.get('flavor'))
-
-    def test_image_and_flavor_properties_as_ids(self):
-        node_props = {
-            'image': 'some-image-id',
-            'flavor': 'some-flavor-id'
-        }
-        with mock.patch('nova_plugin.server.ctx',
-                        self._get_mock_ctx_with_node_properties(node_props)):
-            nova_client = self._get_mocked_nova_client()
-
-            serv = {}
-            server._handle_image_or_flavor(serv, nova_client, 'image')
-            server._handle_image_or_flavor(serv, nova_client, 'flavor')
-
-        self.assertEquals('some-image-id', serv.get('image'))
-        self.assertEquals('some-flavor-id', serv.get('flavor'))
-
-    def test_image_id_and_flavor_id(self):
-        node_props = {
-            'image': '',
-            'flavor': ''
-        }
-        with mock.patch('nova_plugin.server.ctx',
-                        self._get_mock_ctx_with_node_properties(node_props)):
-            nova_client = self._get_mocked_nova_client()
-
-            serv = {}
-            serv['image'] = 'some-image-id'
-            serv['flavor'] = 'some-flavor-id'
-            server._handle_image_or_flavor(serv, nova_client, 'image')
-            server._handle_image_or_flavor(serv, nova_client, 'flavor')
-
-        self.assertEquals('some-image-id', serv.get('image'))
-        self.assertEquals('some-flavor-id', serv.get('flavor'))
-
-    def test_image_name_and_flavor_name(self):
-        node_props = {
-            'image': '',
-            'flavor': ''
-        }
-        with mock.patch('nova_plugin.server.ctx',
-                        self._get_mock_ctx_with_node_properties(node_props)):
-            nova_client = self._get_mocked_nova_client()
-
-            serv = {}
-            serv['image_name'] = 'some-image-name'
-            serv['flavor_name'] = 'some-flavor-name'
-            server._handle_image_or_flavor(serv, nova_client, 'image')
-            server._handle_image_or_flavor(serv, nova_client, 'flavor')
-
-        self.assertEquals('some-image-id', serv.get('image'))
-        self.assertNotIn('image_name', serv)
-        self.assertEquals('some-flavor-id', serv.get('flavor'))
-        self.assertNotIn('flavor_name', serv)
-
-    def test_unknown_image_name_and_flavor_name(self):
-        node_props = {
-            'image': '',
-            'flavor': ''
-        }
-        with mock.patch('nova_plugin.server.ctx',
-                        self._get_mock_ctx_with_node_properties(node_props)):
-            nova_client = self._get_mocked_nova_client()
-
-            serv = {}
-            serv['image_name'] = 'some-unknown-image-name'
-            serv['flavor_name'] = 'some-unknown-flavor-name'
-
-            self.assertRaises(nova_exceptions.NotFound,
-                              server._handle_image_or_flavor,
-                              serv, nova_client, 'image')
-            self.assertRaises(nova_exceptions.NotFound,
-                              server._handle_image_or_flavor,
-                              serv, nova_client, 'flavor')
-
-    def test_image_id_and_flavor_id_override_on_properties(self):
-        node_props = {
-            'image': 'properties-image-id',
-            'flavor': 'properties-flavor-id'
-        }
-        with mock.patch('nova_plugin.server.ctx',
-                        self._get_mock_ctx_with_node_properties(node_props)):
-            nova_client = self._get_mocked_nova_client()
-
-            serv = {}
-            serv['image'] = 'some-image-id'
-            serv['flavor'] = 'some-flavor-id'
-            server._handle_image_or_flavor(serv, nova_client, 'image')
-            server._handle_image_or_flavor(serv, nova_client, 'flavor')
-
-        self.assertEquals('some-image-id', serv.get('image'))
-        self.assertEquals('some-flavor-id', serv.get('flavor'))
-
-    def test_image_name_and_flavor_name_override_on_properties(self):
-        node_props = {
-            'image': 'properties-image-id',
-            'flavor': 'properties-flavor-id'
-        }
-        with mock.patch('nova_plugin.server.ctx',
-                        self._get_mock_ctx_with_node_properties(node_props)):
-            nova_client = self._get_mocked_nova_client()
-
-            serv = {}
-            serv['image_name'] = 'some-image-name'
-            serv['flavor_name'] = 'some-flavor-name'
-            server._handle_image_or_flavor(serv, nova_client, 'image')
-            server._handle_image_or_flavor(serv, nova_client, 'flavor')
-
-        self.assertEquals('some-image-id', serv.get('image'))
-        self.assertNotIn('image_name', serv)
-        self.assertEquals('some-flavor-id', serv.get('flavor'))
-        self.assertNotIn('flavor_name', serv)
-
-    def test_image_name_and_flavor_name_override_on_image_and_flavor_ids(self):
-        node_props = {
-            'image': '',
-            'flavor': ''
-        }
-        with mock.patch('nova_plugin.server.ctx',
-                        self._get_mock_ctx_with_node_properties(node_props)):
-            nova_client = self._get_mocked_nova_client()
-
-            serv = {}
-            serv['image'] = 'some-bad-image-id'
-            serv['image_name'] = 'some-image-name'
-            serv['flavor'] = 'some-bad-flavor-id'
-            serv['flavor_name'] = 'some-flavor-name'
-            server._handle_image_or_flavor(serv, nova_client, 'image')
-            server._handle_image_or_flavor(serv, nova_client, 'flavor')
-
-        self.assertEquals('some-image-id', serv.get('image'))
-        self.assertNotIn('image_name', serv)
-        self.assertEquals('some-flavor-id', serv.get('flavor'))
-        self.assertNotIn('flavor_name', serv)
-
-    @staticmethod
-    def _get_mocked_nova_client():
-        nova_client = mock.MagicMock()
-
-        def mock_get_if_exists(prop_name, **kwargs):
-            is_image = prop_name == 'image'
-            searched_name = kwargs.get('name')
-            if (is_image and searched_name == 'some-image-name') or \
-                    (not is_image and searched_name == 'some-flavor-name'):
-                result = mock.MagicMock()
-                result.id = 'some-image-id' if \
-                    is_image else 'some-flavor-id'
-                return result
-            return []
-
-        def mock_find_generator(prop_name):
-            def mock_find(**kwargs):
-                result = mock_get_if_exists(prop_name, **kwargs)
-                if not result:
-                    raise nova_exceptions.NotFound(404)
-                return result
-            return mock_find
-
-        nova_client.cosmo_plural = lambda x: '{0}s'.format(x)
-        nova_client.cosmo_get_if_exists = mock_get_if_exists
-        nova_client.images.find = mock_find_generator('image')
-        nova_client.flavors.find = mock_find_generator('flavor')
-        return nova_client
-
-    @staticmethod
-    def _get_mock_ctx_with_node_properties(properties):
-        return MockCloudifyContext(node_id='test_node_id',
-                                   properties=properties)
diff --git a/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/test_userdata.py b/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/test_userdata.py
deleted file mode 100644 (file)
index d7f056d..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-#########
-# Copyright (c) 2015 GigaSpaces Technologies 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.
-
-import unittest
-
-import mock
-
-from cloudify.mocks import MockCloudifyContext
-
-from nova_plugin import userdata
-
-
-def ctx_mock():
-    result = MockCloudifyContext(
-        node_id='d',
-        properties={})
-    result.node.type_hierarchy = ['cloudify.nodes.Compute']
-    return result
-
-
-class TestServerUserdataHandling(unittest.TestCase):
-
-    @mock.patch('nova_plugin.userdata.ctx', ctx_mock())
-    def test_no_userdata(self):
-        server_conf = {}
-        userdata.handle_userdata(server_conf)
-        self.assertEqual(server_conf, {})
-
-    def test_agent_installation_userdata(self):
-        ctx = ctx_mock()
-        ctx.agent.init_script = lambda: 'SCRIPT'
-        with mock.patch('nova_plugin.userdata.ctx', ctx):
-            server_conf = {}
-            userdata.handle_userdata(server_conf)
-            self.assertEqual(server_conf, {'userdata': 'SCRIPT'})
-
-    @mock.patch('nova_plugin.userdata.ctx', ctx_mock())
-    def test_existing_userdata(self):
-        server_conf = {'userdata': 'EXISTING'}
-        server_conf_copy = server_conf.copy()
-        userdata.handle_userdata(server_conf)
-        self.assertEqual(server_conf, server_conf_copy)
-
-    def test_existing_and_agent_installation_userdata(self):
-        ctx = ctx_mock()
-        ctx.agent.init_script = lambda: '#! SCRIPT'
-        with mock.patch('nova_plugin.userdata.ctx', ctx):
-            server_conf = {'userdata': '#! EXISTING'}
-            userdata.handle_userdata(server_conf)
-            self.assertTrue(server_conf['userdata'].startswith(
-                'Content-Type: multi'))
diff --git a/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/test_validation.py b/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/test_validation.py
deleted file mode 100644 (file)
index aa1dfdd..0000000
+++ /dev/null
@@ -1,194 +0,0 @@
-#########
-# Copyright (c) 2016 GigaSpaces Technologies 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.
-
-import os
-from os import path
-import tempfile
-import shutil
-
-import unittest
-import mock
-
-from cloudify.test_utils import workflow_test
-from nova_plugin.keypair import creation_validation
-from cloudify.exceptions import NonRecoverableError
-
-PRIVATE_KEY_NAME = 'private_key'
-
-
-class TestValidation(unittest.TestCase):
-
-    blueprint_path = path.join('resources',
-                               'test-keypair-validation-blueprint.yaml')
-
-    def setUp(self):
-        _, fp = tempfile.mkstemp()
-        self.private_key = fp
-        _, fp = tempfile.mkstemp()
-        self.not_readable_private_key = fp
-        os.chmod(self.not_readable_private_key, 0o200)
-        self.temp_dir = tempfile.mkdtemp()
-        self.not_writable_temp_dir_r = tempfile.mkdtemp()
-        os.chmod(self.not_writable_temp_dir_r, 0o400)
-        self.not_writable_temp_dir_rx = tempfile.mkdtemp()
-        os.chmod(self.not_writable_temp_dir_rx, 0o500)
-        self.not_writable_temp_dir_rw = tempfile.mkdtemp()
-        os.chmod(self.not_writable_temp_dir_rw, 0o600)
-
-    def tearDown(self):
-        if self.private_key:
-            os.remove(self.private_key)
-
-        if self.not_readable_private_key:
-            os.remove(self.not_readable_private_key)
-
-        shutil.rmtree(self.not_writable_temp_dir_r, ignore_errors=True)
-        shutil.rmtree(self.not_writable_temp_dir_rx, ignore_errors=True)
-        shutil.rmtree(self.not_writable_temp_dir_rw, ignore_errors=True)
-        shutil.rmtree(self.temp_dir, ignore_errors=True)
-
-    def new_keypair_create(self, *args, **kwargs):
-        creation_validation(*args, **kwargs)
-
-    def new_keypair_create_with_exception(self, *args, **kwargs):
-        self.assertRaises(NonRecoverableError, creation_validation,
-                          *args, **kwargs)
-
-    def get_keypair_inputs_private_key(self, is_external, **kwargs):
-        return {
-            'private_key': self.private_key,
-            'is_keypair_external': is_external
-        }
-
-    def get_keypair_inputs_not_readable_private_key(self,
-                                                    is_external, **kwargs):
-        return {
-            'private_key': self.not_readable_private_key,
-            'is_keypair_external': is_external
-        }
-
-    def get_keypair_inputs_not_writable_dir_r(self, is_external, **kwargs):
-        return {
-            'private_key': path.join(self.not_writable_temp_dir_r,
-                                     PRIVATE_KEY_NAME),
-            'is_keypair_external': is_external
-        }
-
-    def get_keypair_inputs_not_writable_dir_rx(self, is_external, **kwargs):
-        return {
-            'private_key': path.join(self.not_writable_temp_dir_rx,
-                                     PRIVATE_KEY_NAME),
-            'is_keypair_external': is_external
-        }
-
-    def get_keypair_inputs_not_writable_dir_rw(self, is_external, **kwargs):
-        return {
-            'private_key': path.join(self.not_writable_temp_dir_rw,
-                                     PRIVATE_KEY_NAME),
-            'is_keypair_external': is_external
-        }
-
-    def get_keypair_inputs_temp_dir(self, is_external, **kwargs):
-        return {
-            'private_key': path.join(self.temp_dir, PRIVATE_KEY_NAME),
-            'is_keypair_external': is_external
-        }
-
-    @workflow_test(blueprint_path, inputs={
-        'private_key': '',
-        'is_keypair_external': False
-    })
-    @mock.patch('nova_plugin.keypair.validate_resource')
-    def test_keypair_valid_config(self, cfy_local, *args):
-
-        with mock.patch('nova_plugin.keypair.create',
-                        new=self.new_keypair_create):
-            cfy_local.execute('install', task_retries=0)
-
-    @workflow_test(blueprint_path, inputs='get_keypair_inputs_private_key',
-                   input_func_kwargs={'is_external': True})
-    @mock.patch('nova_plugin.keypair.validate_resource')
-    def test_keypair_valid_config_external(self, cfy_local, *args):
-
-        with mock.patch('nova_plugin.keypair.create',
-                        new=self.new_keypair_create):
-            cfy_local.execute('install', task_retries=0)
-
-    @workflow_test(blueprint_path, inputs='get_keypair_inputs_temp_dir',
-                   input_func_kwargs={'is_external': True})
-    @mock.patch('nova_plugin.keypair.validate_resource')
-    def test_keypair_no_private_key(self, cfy_local, *args):
-
-        with mock.patch('nova_plugin.keypair.create',
-                        new=self.new_keypair_create_with_exception):
-            cfy_local.execute('install', task_retries=0)
-
-    @workflow_test(blueprint_path, inputs='get_keypair_inputs_private_key',
-                   input_func_kwargs={'is_external': False})
-    @mock.patch('nova_plugin.keypair.validate_resource')
-    def test_keypair_local_and_exists(self, cfy_local, *args):
-
-        with mock.patch('nova_plugin.keypair.create',
-                        new=self.new_keypair_create_with_exception):
-            cfy_local.execute('install', task_retries=0)
-
-    @workflow_test(blueprint_path, inputs='get_keypair_inputs_temp_dir',
-                   input_func_kwargs={'is_external': False})
-    @mock.patch('nova_plugin.keypair.validate_resource')
-    def test_keypair_local_temp_dir(self, cfy_local, *args):
-
-        with mock.patch('nova_plugin.keypair.create',
-                        new=self.new_keypair_create):
-            cfy_local.execute('install', task_retries=0)
-
-    @workflow_test(blueprint_path,
-                   inputs='get_keypair_inputs_not_writable_dir_r',
-                   input_func_kwargs={'is_external': False})
-    @mock.patch('nova_plugin.keypair.validate_resource')
-    def test_keypair_local_non_writable_dir_r(self, cfy_local, *args):
-
-        with mock.patch('nova_plugin.keypair.create',
-                        new=self.new_keypair_create_with_exception):
-            cfy_local.execute('install', task_retries=0)
-
-    @workflow_test(blueprint_path,
-                   inputs='get_keypair_inputs_not_writable_dir_rx',
-                   input_func_kwargs={'is_external': False})
-    @mock.patch('nova_plugin.keypair.validate_resource')
-    def test_keypair_local_non_writable_dir_rx(self, cfy_local, *args):
-
-        with mock.patch('nova_plugin.keypair.create',
-                        new=self.new_keypair_create_with_exception):
-            cfy_local.execute('install', task_retries=0)
-
-    @workflow_test(blueprint_path,
-                   inputs='get_keypair_inputs_not_writable_dir_rw',
-                   input_func_kwargs={'is_external': False})
-    @mock.patch('nova_plugin.keypair.validate_resource')
-    def test_keypair_local_non_writable_dir_rw(self, cfy_local, *args):
-
-        with mock.patch('nova_plugin.keypair.create',
-                        new=self.new_keypair_create_with_exception):
-            cfy_local.execute('install', task_retries=0)
-
-    @workflow_test(blueprint_path,
-                   inputs='get_keypair_inputs_not_readable_private_key',
-                   input_func_kwargs={'is_external': True})
-    @mock.patch('nova_plugin.keypair.validate_resource')
-    def test_keypair_not_readable_private_key(self, cfy_local, *args):
-
-        with mock.patch('nova_plugin.keypair.create',
-                        new=self.new_keypair_create_with_exception):
-            cfy_local.execute('install', task_retries=0)
diff --git a/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/userdata.py b/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/userdata.py
deleted file mode 100644 (file)
index ba63bb5..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-#########
-# Copyright (c) 2015 GigaSpaces Technologies 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.
-
-import requests
-
-from cloudify import compute
-from cloudify import exceptions
-from cloudify import ctx
-
-
-def handle_userdata(server):
-
-    existing_userdata = server.get('userdata')
-    install_agent_userdata = ctx.agent.init_script()
-
-    if not (existing_userdata or install_agent_userdata):
-        return
-
-    if isinstance(existing_userdata, dict):
-        ud_type = existing_userdata['type']
-        if ud_type not in userdata_handlers:
-            raise exceptions.NonRecoverableError(
-                "Invalid type '{0}' for server userdata)".format(ud_type))
-        existing_userdata = userdata_handlers[ud_type](existing_userdata)
-
-    if not existing_userdata:
-        final_userdata = install_agent_userdata
-    elif not install_agent_userdata:
-        final_userdata = existing_userdata
-    else:
-        final_userdata = compute.create_multi_mimetype_userdata(
-            [existing_userdata, install_agent_userdata])
-    server['userdata'] = final_userdata
-
-
-userdata_handlers = {
-    'http': lambda params: requests.get(params['url']).text
-}
index c452089..867efd5 100644 (file)
@@ -492,17 +492,17 @@ public class ASDCController {
        try {\r
                LOGGER.info(MessageEnum.ASDC_RECEIVE_SERVICE_NOTIF, "***WRITE FILE ARTIFACT NAME", "ASDC", artifact.getArtifactName());\r
 \r
-               FileOutputStream outFile = new FileOutputStream(System.getProperty("mso.config.path") + "/ASDC" + "/" + artifact.getArtifactName());\r
-               outFile.write(payloadBytes, 0, payloadBytes.length);\r
-               outFile.close();\r
-               } catch (Exception e) { \r
-                       LOGGER.debug("Exception :",e);\r
-                LOGGER.error(MessageEnum.ASDC_ARTIFACT_DOWNLOAD_FAIL,\r
-                                       artifact.getArtifactName (),\r
-                                       artifact.getArtifactURL (),\r
-                                       artifact.getArtifactUUID (),\r
-                                       resultArtifact.getDistributionMessageResult (), "", "", MsoLogger.ErrorCode.DataError, "ASDC write to file failed"); \r
-            } \r
+               try (FileOutputStream outFile = new FileOutputStream(System.getProperty("mso.config.path") + "/ASDC" + "/" + artifact.getArtifactName())) {\r
+                outFile.write(payloadBytes, 0, payloadBytes.length);\r
+               }\r
+        } catch (Exception e) {\r
+            LOGGER.debug("Exception :",e);\r
+            LOGGER.error(MessageEnum.ASDC_ARTIFACT_DOWNLOAD_FAIL,\r
+                    artifact.getArtifactName (),\r
+                    artifact.getArtifactURL (),\r
+                    artifact.getArtifactUUID (),\r
+                    resultArtifact.getDistributionMessageResult (), "", "", MsoLogger.ErrorCode.DataError, "ASDC write to file failed");\r
+        }\r
        \r
     }\r
 \r
index 3174135..1d255c4 100644 (file)
                <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>
                        <artifactId>client-kit</artifactId>
-                       <version>1.3.0-SNAPSHOT</version>
+                       <version>1.3.0</version>
                </dependency>
                <dependency>
                        <groupId>org.aspectj</groupId>
index f0f239b..1b5a2ec 100644 (file)
@@ -28,6 +28,7 @@ import org.openecomp.mso.bpmn.common.scripts.SDNCAdapterUtils
 import org.openecomp.mso.bpmn.core.domain.CloudFlavor
 import org.openecomp.mso.bpmn.core.domain.InventoryType
 import org.openecomp.mso.bpmn.core.domain.Resource
+import org.openecomp.mso.bpmn.core.domain.ResourceType
 import org.openecomp.mso.bpmn.core.domain.ServiceDecomposition
 import org.openecomp.mso.bpmn.core.domain.Subscriber
 import org.openecomp.mso.bpmn.core.domain.VnfResource
@@ -73,6 +74,8 @@ class OofHoming extends AbstractServiceTaskProcessor {
             utils.log("DEBUG", "Incoming Request Id is: " + requestId, isDebugEnabled)
             String serviceInstanceId = execution.getVariable("serviceInstanceId")
             utils.log("DEBUG", "Incoming Service Instance Id is: " + serviceInstanceId, isDebugEnabled)
+            String serviceInstanceName = execution.getVariable("serviceInstanceName")
+            utils.log("DEBUG", "Incoming Service Instance Name is: " + serviceInstanceName, isDebugEnabled)
             ServiceDecomposition serviceDecomposition = execution.getVariable("serviceDecomposition")
             utils.log("DEBUG", "Incoming Service Decomposition is: " + serviceDecomposition, isDebugEnabled)
             String subscriberInfo = execution.getVariable("subscriberInfo")
@@ -86,21 +89,24 @@ class OofHoming extends AbstractServiceTaskProcessor {
 
             if (isBlank(requestId) ||
                     isBlank(serviceInstanceId) ||
+                    isBlank(serviceInstanceName) ||
                     isBlank(serviceDecomposition.toString()) ||
-                    isBlank(subscriberInfo) ||
-                    isBlank(customerLocation.toString()) ||
-                    isBlank(cloudOwner) ||
-                    isBlank(cloudRegionId)) {
+                    isBlank(customerLocation.toString())) {
                 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 = null
+                if (isBlank(subscriberInfo)) {
+                    subscriber = new Subscriber("", "", "")
+                } 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 = new Subscriber(subId, subName, subCommonSiteId)
                 }
-                Subscriber subscriber = new Subscriber(subId, subName, subCommonSiteId)
 
                 //Authentication
                 def authHeader = ""
@@ -205,9 +211,16 @@ class OofHoming extends AbstractServiceTaskProcessor {
                     JSONObject placement = arrSol.getJSONObject(j)
                     utils.log("DEBUG", "****** JSONObject is: " + placement + " *****", "true")
                     String jsonServiceResourceId = placement.getString("serviceResourceId")
+                    String jsonResourceModuleName = placement.getString("resourceModuleName")
                     for (Resource resource : resourceList) {
                         String serviceResourceId = resource.getResourceId()
-                        if (serviceResourceId.equalsIgnoreCase(jsonServiceResourceId)) {
+                        String resourceModuleName = ""
+                        if (resource.getResourceType() == ResourceType.ALLOTTED_RESOURCE ||
+                            resource.getResourceType() == ResourceType.VNF) {
+                            resourceModuleName = resource.getNfFunction()
+                            }
+                        if (serviceResourceId.equalsIgnoreCase(jsonServiceResourceId) ||
+                            resourceModuleName.equalsIgnoreCase(jsonResourceModuleName)) {
                             JSONObject solution = placement.getJSONObject("solution")
                             String solutionType = solution.getString("identifierType")
                             String inventoryType = ""
@@ -244,14 +257,17 @@ class OofHoming extends AbstractServiceTaskProcessor {
                                     flavorsArrayList.add(cloudFlavor)
                                 }
                             }
-                            Map<String, String> assignmentMap = jsonUtil.entryArrayToMap(execution, assignmentArr.toString(), "key", "value")
+                            Map<String, String> assignmentMap = jsonUtil.entryArrayToMap(execution,
+                                    assignmentArr.toString(), "key", "value")
                             String cloudOwner = assignmentMap.get("cloudOwner")
-                            String cloudRegionId = assignmentMap.get("cloudRegionId")
+                            String cloudRegionId = assignmentMap.get("locationId")
                             resource.getHomingSolution().setCloudOwner(cloudOwner)
                             resource.getHomingSolution().setCloudRegionId(cloudRegionId)
                             if (flavorsArrayList != null && flavorsArrayList.size != 0) {
                                 resource.getHomingSolution().setFlavors(flavorsArrayList)
                                 execution.setVariable(cloudRegionId + "_flavorList", flavorsArrayList)
+                                utils.log("DEBUG", "***** _flavorList is: " + flavorsArrayList.toString() +
+                                        " *****", "true")
                             }
 
                             if (inventoryType.equalsIgnoreCase("service")) {
index 79134fe..b61739f 100644 (file)
@@ -1,19 +1,21 @@
 package org.openecomp.mso.bpmn.common.scripts
 
-import org.apache.commons.lang3.StringUtils
-import org.camunda.bpm.engine.delegate.DelegateExecution;
+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.AllottedResource
 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 java.lang.reflect.Array
+
 import static org.openecomp.mso.bpmn.common.scripts.GenericUtils.*
 
 class OofUtils {
@@ -47,7 +49,7 @@ class OofUtils {
     String buildRequest(DelegateExecution execution,
                         String requestId,
                         ServiceDecomposition decomposition,
-                        Subscriber subscriber,
+                        Subscriber subscriber = null,
                         Map customerLocation,
                         ArrayList existingCandidates = null,
                         ArrayList excludedCandidates = null,
@@ -60,13 +62,19 @@ class OofUtils {
         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)
+
+        serviceInstanceId = execution.getVariable("serviceInstanceId")
+        serviceInstanceName = execution.getVariable("serviceInstanceName")
+
+        if (serviceInstanceId == null || serviceInstanceId == "null") {
+            utils.log("DEBUG", "Unable to obtain Service Instance Id", isDebugEnabled)
             exceptionUtil.buildAndThrowWorkflowException(execution, 400, "Internal Error - Unable to " +
-                    "obtain Service Instance Id, ServiceInstance Object is null")
-        } else {
-            serviceInstanceId = serviceInstance.getInstanceId()
-            serviceInstanceName = serviceInstance.getInstanceName()
+                    "obtain Service Instance Id, execution.getVariable(\"serviceInstanceName\") is null")
+        }
+        if (serviceInstanceName == null || serviceInstanceName == "null") {
+            utils.log("DEBUG", "Unable to obtain Service Instance Name", isDebugEnabled)
+            exceptionUtil.buildAndThrowWorkflowException(execution, 400, "Internal Error - Unable to " +
+                    "obtain Service Instance Name, execution.getVariable(\"serviceInstanceName\") is null")
         }
         //Model Info
         ModelInfo model = decomposition.getModelInfo()
@@ -76,9 +84,14 @@ class OofUtils {
         String modelName = model.getModelName()
         String modelVersion = model.getModelVersion()
         //Subscriber Info
-        String subscriberId = subscriber.getGlobalId()
-        String subscriberName = subscriber.getName()
-        String commonSiteId = subscriber.getCommonSiteId()
+        String subscriberId = ""
+        String subscriberName = ""
+        String commonSiteId = ""
+        if (subscriber != null){
+            subscriberId = subscriber.getGlobalId()
+            subscriberName = subscriber.getName()
+            commonSiteId = subscriber.getCommonSiteId()
+        }
 
         //Determine RequestType
         //TODO Figure out better way to determine this
@@ -94,28 +107,40 @@ class OofUtils {
         //Demands
         String placementDemands = ""
         StringBuilder sb = new StringBuilder()
-        List<Resource> resourceList = decomposition.getServiceAllottedResources()
+        List<AllottedResource> allottedResourceList = decomposition.getServiceAllottedResources()
         List<VnfResource> vnfResourceList = decomposition.getServiceVnfs()
 
-        if (resourceList.isEmpty() || resourceList == null) {
+        if (allottedResourceList.isEmpty() || allottedResourceList == null) {
             utils.log("DEBUG", "Allotted Resources List is empty - will try to get service VNFs instead.",
                     isDebugEnabled)
-            resourceList = decomposition.getServiceVnfs()
+            allottedResourceList = decomposition.getServiceVnfs()
         }
 
-        if (resourceList.isEmpty() || resourceList == null) {
+        if (allottedResourceList.isEmpty() || allottedResourceList == null) {
             utils.log("DEBUG", "Resources List is Empty", isDebugEnabled)
         } else {
-            for (Resource resource : resourceList) {
-                ModelInfo resourceModelInfo = resource.getModelInfo()
+            for (AllottedResource resource : allottedResourceList) {
+                utils.log("DEBUG", "Allotted Resource: " + resource.toString(),
+                        isDebugEnabled)
                 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 resourceModuleName = resource.getNfFunction()
+                utils.log("DEBUG", "resourceModuleName: " + resourceModuleName,
+                        isDebugEnabled)
+                def resourceModelInvariantId = "no-resourceModelInvariantId"
+                def resourceModelVersionId = "no-resourceModelVersionId"
+
+                List modelIdLst = execution.getVariable("homingModelIds")
+                utils.log("DEBUG", "Incoming modelIdLst is: " + modelIdLst.toString(), isDebugEnabled)
+                for (Map modelId : modelIdLst )
+                    if (resourceModuleName == modelId.resourceModuleName) {
+                        resourceModelInvariantId = modelId.resourceModelInvariantId
+                        resourceModelVersionId = modelId.resourceModelVersionId
+                    }
+
+                def resourceModelName = "" //Optional
+                def resourceModelVersion = "" //Optional
+                def resourceModelType = "" //Optional
+                def tenantId = "" //Optional
                 def requiredCandidatesJson = ""
 
                 requiredCandidatesJson = createCandidateJson(
@@ -124,22 +149,56 @@ class OofUtils {
                         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" +
-                        "},"
+                        "      {\n" +
+                        "      \"resourceModuleName\": \"${resourceModuleName}\",\n" +
+                        "      \"serviceResourceId\": \"${serviceResourceId}\",\n" +
+                        "      \"tenantId\": \"${tenantId}\",\n" +
+                        "      \"resourceModelInfo\": {\n" +
+                        "        \"modelInvariantId\": \"${resourceModelInvariantId}\",\n" +
+                        "        \"modelVersionId\": \"${resourceModelVersionId}\",\n" +
+                        "        \"modelName\": \"${resourceModelName}\",\n" +
+                        "        \"modelType\": \"${resourceModelType}\",\n" +
+                        "        \"modelVersion\": \"${resourceModelVersion}\",\n" +
+                        "        \"modelCustomizationName\": \"\"\n" +
+                        "        }" + requiredCandidatesJson + "\n" +
+                        "      },"
 
                 placementDemands = sb.append(demand)
             }
+            for (VnfResource vnfResource : vnfResourceList) {
+                utils.log("DEBUG", "VNF Resource: " + vnfResource.toString(),
+                        isDebugEnabled)
+                ModelInfo vnfResourceModelInfo = vnfResource.getModelInfo()
+                def serviceResourceId = vnfResource.getResourceId()
+                def resourceModuleName = vnfResource.getNfFunction()
+                utils.log("DEBUG", "resourceModuleName: " + resourceModuleName,
+                        isDebugEnabled)
+                def resourceModelInvariantId = vnfResourceModelInfo.getModelInvariantUuid()
+                def resourceModelName = vnfResourceModelInfo.getModelName()
+                def resourceModelVersion = vnfResourceModelInfo.getModelVersion()
+                def resourceModelVersionId = vnfResourceModelInfo.getModelUuid()
+                def resourceModelType = vnfResourceModelInfo.getModelType()
+                def tenantId = "" //Optional
+                def requiredCandidatesJson = ""
+
+
+                String placementDemand =
+                        "      {\n" +
+                        "      \"resourceModuleName\": \"${resourceModuleName}\",\n" +
+                        "      \"serviceResourceId\": \"${serviceResourceId}\",\n" +
+                        "      \"tenantId\": \"${tenantId}\",\n" +
+                        "      \"resourceModelInfo\": {\n" +
+                        "        \"modelInvariantId\": \"${resourceModelInvariantId}\",\n" +
+                        "        \"modelVersionId\": \"${resourceModelVersionId}\",\n" +
+                        "        \"modelName\": \"${resourceModelName}\",\n" +
+                        "        \"modelType\": \"${resourceModelType}\",\n" +
+                        "        \"modelVersion\": \"${resourceModelVersion}\",\n" +
+                        "        \"modelCustomizationName\": \"\"\n" +
+                        "        }" + requiredCandidatesJson + "\n" +
+                        "      },"
+
+                placementDemands = sb.append(placementDemand)
+            }
             placementDemands = placementDemands.substring(0, placementDemands.length() - 1)
         }
 
@@ -265,11 +324,14 @@ class OofUtils {
                 } else {
                     return
                 }
-            } else if (JsonUtils.jsonElementExist(response, "requestError") == true) {
+            } else if (response.contains("error") || response.contains("Error") ) {
                 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("Unable to find any candidate for demand")) {
+                    errorMessage = "OOF Async Callback Response contains error: Unable to find any candidate for " +
+                            "demand *** Response: " + response.toString()
                 } 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
index 713e25a..3c00627 100644 (file)
@@ -84,6 +84,7 @@ public class ApplicationControllerAction {
                                        }
                                        break;
                                case ConfigModify:
+                               case ConfigScaleOut:
                                        appCStatus = payloadAction(action, msoRequestId, vnfId, payload, controllerType);
                                        break;
                                case UpgradePreCheck:
index 4255df3..c9e2e88 100644 (file)
@@ -51,7 +51,7 @@ import com.att.eelf.configuration.EELFManager;
 
 public class ApplicationControllerClient {
        
-       public static final String DEFAULT_CONTROLLER_TYPE = "appc";
+       public static final String DEFAULT_CONTROLLER_TYPE = "SDNC";
 
        private static final String CLIENT_NAME = "MSO";
 
@@ -86,7 +86,10 @@ public class ApplicationControllerClient {
         * @param controllerType the controller type: "appc" or "sdnc".
         */
        public ApplicationControllerClient(String controllerType) {
-               this.controllerType = controllerType;
+               if (controllerType == null) {
+                       controllerType = DEFAULT_CONTROLLER_TYPE;
+               }
+               this.controllerType = controllerType.toUpperCase();
                appCSupport = new ApplicationControllerSupport();
        }
        
@@ -109,6 +112,10 @@ public class ApplicationControllerClient {
 
        protected LifeCycleManagerStateful createAppCClient(String controllerType) {
                try {
+                       if (controllerType == null) {
+                               controllerType = DEFAULT_CONTROLLER_TYPE;
+                       }
+                       controllerType = controllerType.toUpperCase();
                        return AppcClientServiceFactoryProvider.getFactory(AppcLifeCycleManagerServiceFactory.class)
                                        .createLifeCycleManagerStateful(new ApplicationContext(), getLCMProperties(controllerType));
                } catch (AppcClientException e) {
@@ -142,21 +149,15 @@ public class ApplicationControllerClient {
                Properties properties = new Properties();
                Map<String, String> globalProperties = PropertyConfiguration.getInstance()
                                .getProperties("mso.bpmn.urn.properties");
-               if (controllerType==null || controllerType.length()==0 || controllerType.equalsIgnoreCase("appc")) {
-                       properties.put("topic.read", globalProperties.get("appc.client.topic.read"));
-                       properties.put("topic.write", globalProperties.get("appc.client.topic.write"));
-               } else {
-                       properties.put("topic.read", globalProperties.get("appc.client.topic." + controllerType + ".read"));
-                       properties.put("topic.write", globalProperties.get("appc.client.topic." + controllerType + ".write"));
-               }
-               properties.put("topic.sdnc.read", globalProperties.get("appc.client.topic.sdnc.read"));
-               properties.put("topic.sdnc.write", globalProperties.get("appc.client.topic.sdnc.write"));
-               properties.put("sdnc-topic.read", globalProperties.get("appc.client.topic.sdnc.read"));
-               properties.put("sdnc-topic.write", globalProperties.get("appc.client.topic.sdnc.write"));
+               
+               properties.put("topic.read", globalProperties.get("appc.client.topic.read"));
+               properties.put("topic.write", globalProperties.get("appc.client.topic.write"));
+               properties.put("SDNC-topic.read", globalProperties.get("appc.client.topic.sdnc.read"));
+               properties.put("SDNC-topic.write", globalProperties.get("appc.client.topic.sdnc.write"));
                properties.put("topic.read.timeout", globalProperties.get("appc.client.topic.read.timeout"));
                properties.put("client.response.timeout", globalProperties.get("appc.client.response.timeout"));
                properties.put("poolMembers", globalProperties.get("appc.client.poolMembers"));
-               properties.put("client.controllerType", controllerType);
+               properties.put("controllerType", controllerType);
                properties.put("client.key", globalProperties.get("appc.client.key"));
                properties.put("client.secret", globalProperties.get("appc.client.secret"));
                properties.put("client.name", CLIENT_NAME);
index 9020701..1f64fb5 100644 (file)
@@ -41,6 +41,7 @@ import org.openecomp.mso.bpmn.mock.FileUtil;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.UUID;
@@ -97,7 +98,7 @@ public class OofHomingTest extends WorkflowTest {
         List<AllottedResource> arList = new ArrayList<AllottedResource>();
         AllottedResource ar = new AllottedResource();
         ar.setResourceId("testResourceIdAR");
-        ar.setResourceInstanceName("testARInstanceName");
+        ar.setNfFunction("testARFunctionName");
         ModelInfo arModel = new ModelInfo();
         arModel.setModelCustomizationUuid("testModelCustomizationUuidAR");
         arModel.setModelInvariantUuid("testModelInvariantIdAR");
@@ -108,7 +109,7 @@ public class OofHomingTest extends WorkflowTest {
         ar.setModelInfo(arModel);
         AllottedResource ar2 = new AllottedResource();
         ar2.setResourceId("testResourceIdAR2");
-        ar2.setResourceInstanceName("testAR2InstanceName");
+        ar2.setNfFunction("testAR2FunctionName");
         ModelInfo arModel2 = new ModelInfo();
         arModel2.setModelCustomizationUuid("testModelCustomizationUuidAR2");
         arModel2.setModelInvariantUuid("testModelInvariantIdAR2");
@@ -123,7 +124,7 @@ public class OofHomingTest extends WorkflowTest {
         List<VnfResource> vnfList = new ArrayList<VnfResource>();
         VnfResource vnf = new VnfResource();
         vnf.setResourceId("testResourceIdVNF");
-        vnf.setResourceInstanceName("testVnfInstanceName");
+        vnf.setNfFunction("testVnfFunctionName");
         ArrayList<CloudFlavor> flavors = new ArrayList<>();
         CloudFlavor flavor1 = new CloudFlavor("flavorLabel1xxx", "vimFlavorxxx");
         CloudFlavor flavor2 = new CloudFlavor("flavorLabel2xxx", "vimFlavorxxx");
@@ -478,9 +479,9 @@ public class OofHomingTest extends WorkflowTest {
         //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());
+        Boolean errorMatch = workflowException.toString().contains("WorkflowException[processKey=Homing,errorCode=400,errorMessage=OOF Async Callback " +
+                        "Response contains error: Unable to find any candidate for demand *** Response:");
+        assert(errorMatch);
     }
 
     @Test
@@ -546,10 +547,12 @@ public class OofHomingTest extends WorkflowTest {
         variables.put("customerLocation", customerLocation);
         variables.put("cloudOwner", "amazon");
         variables.put("cloudRegionId", "TNZED");
-        variables.put("isDebugLogEnabled", "true");
+        variables.put("vgMuxInfraModelInvariantId", "testModelInvariantIdAR");
+        variables.put("vgMuxInfraModelId", "testArModelUuid");
         //     variables.put("mso-request-id", "testRequestId");
         variables.put("msoRequestId", "testRequestId");
-        variables.put("serviceInstanceId", "testServiceInstanceId");
+        variables.put("serviceInstanceId", "testServiceInstanceId123");
+        variables.put("serviceInstanceName", "testServiceName");
         variables.put("serviceDecomposition", serviceDecomposition);
         variables.put("subscriberInfo", subscriber2);
     }
@@ -588,9 +591,12 @@ public class OofHomingTest extends WorkflowTest {
         variables.put("customerLocation", customerLocation);
         variables.put("cloudOwner", "amazon");
         variables.put("cloudRegionId", "TNZED");
+        variables.put("vgMuxInfraModelInvariantId", "testModelInvariantIdAR");
+        variables.put("vgMuxInfraModelId", "testArModelUuid");
         variables.put("isDebugLogEnabled", "true");
         variables.put("msoRequestId", "testRequestId");
-        variables.put("serviceInstanceId", "testServiceInstanceId");
+        variables.put("serviceInstanceId", "testServiceInstanceId123");
+        variables.put("serviceInstanceName", "testServiceName");
         variables.put("serviceDecomposition", serviceDecomposition);
         variables.put("subscriberInfo", subscriber2);
     }
@@ -607,10 +613,13 @@ public class OofHomingTest extends WorkflowTest {
         variables.put("customerLocation", customerLocation);
         variables.put("cloudOwner", "amazon");
         variables.put("cloudRegionId", "TNZED");
+        variables.put("vgMuxInfraModelInvariantId", "testModelInvariantIdAR");
+        variables.put("vgMuxInfraModelId", "testArModelUuid");
         variables.put("isDebugLogEnabled", "true");
         //     variables.put("mso-request-id", "testRequestId");
         variables.put("msoRequestId", "testRequestId");
-        variables.put("serviceInstanceId", "testServiceInstanceId");
+        variables.put("serviceInstanceId", "testServiceInstanceId123");
+        variables.put("serviceInstanceName", "testServiceName");
         variables.put("serviceDecomposition", null);
         variables.put("subscriberInfo", subscriber2);
     }
@@ -717,18 +726,22 @@ public class OofHomingTest extends WorkflowTest {
                 "\"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\"" +
+                "\"subscriberCommonSiteId\":\"\"},\"placementDemands\":[{\"resourceModuleName\":\"testARFunctionName\"" +
                 ",\"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\":" +
+                "\"\",\"resourceModelInfo\":{\"modelInvariantId\":\"no-resourceModelInvariantId\"," +
+                "\"modelVersionId\":\"no-resourceModelVersionId\",\"modelName\":\"\",\"modelType\":" +
+                "\"\",\"modelVersion\":\"\",\"modelCustomizationName\":\"\"}}," +
+                "{\"resourceModuleName\":\"testAR2FunctionName\",\"serviceResourceId\":\"testResourceIdAR2\"," +
+                "\"tenantId\":\"\",\"resourceModelInfo\":{\"modelInvariantId\":\"no-resourceModelInvariantId\"," +
+                "\"modelVersionId\":\"no-resourceModelVersionId\",\"modelName\":\"\"," +
+                "\"modelType\":\"\",\"modelVersion\":\"\"," +
+                "\"modelCustomizationName\":\"\"}},{\"resourceModuleName\":\"testVnfFunctionName\",\"serviceResourceId\":\"" +
+                "testResourceIdVNF\",\"tenantId\":\"\",\"resourceModelInfo\":{\"modelInvariantId\"" +
+                ":\"testModelInvariantIdVNF\",\"modelVersionId\":\"testVnfModelUuid\",\"modelName\":\"" +
+                "testModelNameVNF\",\"modelType\":\"testModelTypeVNF\",\"modelVersion\":\"testModelVersionVNF\"" +
+                ",\"modelCustomizationName\":\"\"}}]},\"serviceInfo\":" +
                 "{\"serviceInstanceId\":\"testServiceInstanceId123\"," +
-                "\"serviceName\":\"null\",\"modelInfo\":{\"modelType\":\"\",\"modelInvariantId\":" +
+                "\"serviceName\":\"testServiceName\",\"modelInfo\":{\"modelType\":\"\",\"modelInvariantId\":" +
                 "\"testModelInvariantId\",\"modelVersionId\":\"testModelUuid\",\"modelName\":\"testModelName\"," +
                 "\"modelVersion\":\"testModelVersion\",\"modelCustomizationName\":\"" +
                 "\"}}}";
index ec093be..59be823 100644 (file)
@@ -44,13 +44,13 @@ public class ApplicationControllerClientTest {
        @Test\r
        public void testClientCreation() {\r
                ApplicationControllerClient client = new ApplicationControllerClient("appc");\r
-               assertEquals(client.getControllerType(), "appc");\r
+               assertEquals(client.getControllerType(), "APPC");\r
                assertNotNull(client.getAppCClient());\r
        }\r
 \r
        @Test\r
        public void createRequest_CheckLock_RequestBuilt() {\r
-               ApplicationControllerClient client = new ApplicationControllerClient("appc");\r
+               ApplicationControllerClient client = new ApplicationControllerClient("APPC");\r
                ActionIdentifiers actionIdentifiers = new ActionIdentifiers();\r
                actionIdentifiers.setVnfId("vnfId");\r
                CheckLockInput checkLockInput = (CheckLockInput) client.createRequest(Action.CheckLock, actionIdentifiers, null,\r
@@ -95,18 +95,19 @@ public class ApplicationControllerClientTest {
 \r
        @Test\r
        public void test_getLCMPropertiesHelper() {\r
-               ApplicationControllerClient client = new ApplicationControllerClient("appc");\r
+               ApplicationControllerClient client = new ApplicationControllerClient();\r
                Properties properties = client.getLCMProperties();\r
                assertEquals(properties.get("topic.read"), "APPC-TEST-AMDOCS2");\r
                assertEquals(properties.get("topic.write"), "APPC-TEST-AMDOCS1-DEV3");\r
-               assertEquals(properties.get("topic.sdnc.read"), "SDNC-LCM-READ");\r
-               assertEquals(properties.get("topic.sdnc.write"), "SDNC-LCM-WRITE");\r
+               assertEquals(properties.get("SDNC-topic.read"), "SDNC-LCM-READ");\r
+               assertEquals(properties.get("SDNC-topic.write"), "SDNC-LCM-WRITE");\r
                assertEquals(properties.get("topic.read.timeout"), "120000");\r
                assertEquals(properties.get("client.response.timeout"), "120000");\r
                assertEquals(properties.get("poolMembers"),\r
                                "uebsb93kcdc.it.att.com:3904,uebsb92kcdc.it.att.com:3904,uebsb91kcdc.it.att.com:3904");\r
                assertEquals(properties.get("client.key"), "iaEMAfjsVsZnraBP");\r
                assertEquals(properties.get("client.secret"), "wcivUjsjXzmGFBfxMmyJu9dz");\r
+               assertEquals(properties.get("controllerType"), "appc");\r
        }\r
 \r
 }
\ No newline at end of file
index 8087238..53cd70c 100644 (file)
@@ -54,7 +54,7 @@
                         "value": "False"
                     },
                     {
-                        "key": "cloudRegionId",
+                        "key": "locationId",
                         "value": "dfwtx"
                     }
                 ]
@@ -79,7 +79,7 @@
                         "value": "False"
                     },
                     {
-                        "key": "cloudRegionId",
+                        "key": "locationId",
                         "value": "testCloudRegionId2"
                     }
                 ]
                             "value": "aic"
                         },
                         {
-                            "key": "cloudRegionId",
+                            "key": "locationId",
                             "value": "testCloudRegionId3"
                         },
                         {   "key":"flavors",
index 8766df8..d955877 100644 (file)
@@ -55,7 +55,7 @@
                     { "key": "cloudOwner", "value": "aic" },
                     { "key": "vnfHostName", "value": "MDTNJ01" },
                     { "key": "isRehome", "value": "False" },
-                    { "key": "cloudRegionId", "value": "dfwtx" }
+                    { "key": "locationId", "value": "dfwtx" }
                 ]
             },
             {
@@ -69,7 +69,7 @@
                     { "key": "cloudOwner", "value": "aic" },
                     { "key": "vnfHostName", "value": "testVnfHostname2" },
                     { "key": "isRehome", "value": "False" },
-                    { "key": "cloudRegionId", "value": "testCloudRegionId2" }
+                    { "key": "locationId", "value": "testCloudRegionId2" }
                 ]
             },
             {
@@ -83,7 +83,7 @@
                     { "key": "cloudOwner", "value": "aic" },
                     { "key": "vnfHostName", "value": "testVnfHostNameNet" },
                     { "key": "isRehome", "value": "False" },
-                    { "key": "cloudRegionId", "value": "testCloudRegionIdNet" }
+                    { "key": "locationId", "value": "testCloudRegionIdNet" }
                 ]
             },
             {
@@ -96,7 +96,7 @@
                 },
                 "assignmentInfo": [
                     { "key": "cloudOwner", "value": "aic" },
-                    { "key": "cloudRegionId", "value": "testCloudRegionIdNet2" }
+                    { "key": "locationId", "value": "testCloudRegionIdNet2" }
                 ]
             },
             {
                 },
                 "assignmentInfo": [
                     { "key": "cloudOwner", "value": "aic" },
-                    { "key": "cloudRegionId", "value": "testCloudRegionId3" },
+                    { "key": "locationId", "value": "testCloudRegionId3" },
                     { "key":"flavors", "value":{ "flavorLabel1xxx":"vimFlavorxxx", "flavorLabel2xxx":"vimFlavorxxx"}}
                 ]
             }
index 8e6f2d4..15e601b 100644 (file)
@@ -17,7 +17,7 @@
                { "key": "cloudOwner", "value": "amazon" },
                { "key": "vnfHostName", "value": "ahr344gh" },
                { "key": "isRehome", "value": "False" },
-               { "key": "cloudRegionId", "value": "1ac71fb8-ad43-4e16-9459-c3f372b8236d" }
+               { "key": "locationId", "value": "1ac71fb8-ad43-4e16-9459-c3f372b8236d" }
             ]
          },
          {
@@ -30,7 +30,7 @@
             },
             "assignmentInfo": [
                { "key": "cloudOwner", "value": "amazon" },
-               { "key": "cloudRegionId", "value": "1ac71fb8-ad43-4e16-9459-c3f372b8236d" },
+               { "key": "locationId", "value": "1ac71fb8-ad43-4e16-9459-c3f372b8236d" },
                { "key":"flavors", "value":{ "flavorLabel1xxx":"vimFlavorxxx", "flavorLabel2xxx":"vimFlavorxxx"}}
             ]
          }
index 8bb29f0..2024df4 100644 (file)
@@ -1,10 +1,18 @@
 {
-  "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"
+  "plans":[
+    {
+      "name":"356fdb73-cef2-4dda-8865-31fd6733d6e4",
+      "message":"Unable to find any candidate for demand vGW",
+      "links":[
+        [
+          {
+            "rel":"self",
+            "href":"http://172.17.0.6:8091/v1/plans/1c15e194-6df5-43fe-a5ff-42e6093b8ddd"
+          }
+        ]
+      ],
+      "id":"1c15e194-6df5-43fe-a5ff-42e6093b8ddd",
+      "status":"error"
+    }
+  ]
 }
\ No newline at end of file
index 09026d1..8894316 100644 (file)
@@ -37,7 +37,7 @@
             },
             "nfRole": "",
             "nfType": "",
-            "nfFunction": "",
+            "nfFunction": "ADIoDvCE",
             "nfNamingCode": "",
             "multiStageDesign": "N"
         }
index 1ec1df1..fd819fd 100644 (file)
@@ -241,7 +241,7 @@ public class CreateVFCNSResource extends AbstractServiceTaskProcessor {
         String serviceId = execution.getVariable("serviceInstanceId")\r
         String addRelationPayload = """<relationship xmlns="http://org.openecomp.aai.inventory/v11">\r
                                             <related-to>service-instance</related-to>\r
-                                            <related-link>/aai/v11/business/customers/customer/${globalSubscriberId}/service-subscriptions/service-subscription/${serviceType}/service-instances/service-instance/${nsInstanceId}</related-link>\r
+                                            <related-link>/aai/v11/business/customers/customer/${globalSubscriberId}/service-subscriptions/service-subscription/${serviceType}/service-instances/service-instance/${serviceId}</related-link>\r
                                             <relationship-data>\r
                                                 <relationship-key>customer.global-customer-id</relationship-key>\r
                                                 <relationship-value>${globalSubscriberId}</relationship-value>\r
@@ -252,12 +252,12 @@ public class CreateVFCNSResource extends AbstractServiceTaskProcessor {
                                             </relationship-data>\r
                                            <relationship-data>\r
                                                 <relationship-key>service-instance.service-instance-id</relationship-key>\r
-                                                <relationship-value>${nsInstanceId}</relationship-value>\r
+                                                <relationship-value>${serviceId}</relationship-value>\r
                                             </relationship-data>           \r
                                         </relationship>"""\r
         String endpoint = execution.getVariable("URN_aai_endpoint")  \r
         utils.log("INFO","Add Relationship req:\n" + addRelationPayload,  isDebugEnabled)\r
-        String url = endpoint + "/aai/v11/business/customers/customer/" + globalSubscriberId + "/service-subscriptions/service-subscription/" + serviceType + "/service-instances/service-instance/" + serviceId + "/relationship-list/relationship"\r
+        String url = endpoint + "/aai/v11/business/customers/customer/" + globalSubscriberId + "/service-subscriptions/service-subscription/" + serviceType + "/service-instances/service-instance/" + nsInstanceId + "/relationship-list/relationship"\r
         APIResponse aaiRsp = executeAAIPutCall(execution, url, addRelationPayload)\r
         utils.log("INFO","aai response status code:" + aaiRsp.getStatusCode(),  isDebugEnabled)\r
         utils.log("INFO","aai response content:" + aaiRsp.getResponseBodyAsString(),  isDebugEnabled)\r
index 797086b..0a53526 100644 (file)
@@ -23,6 +23,15 @@ package org.openecomp.mso.bpmn.infrastructure.scripts;
 import groovy.json.JsonSlurper\r
 import groovy.json.JsonOutput\r
 \r
+import javax.xml.parsers.DocumentBuilder\r
+import javax.xml.parsers.DocumentBuilderFactory\r
+\r
+import org.w3c.dom.Document\r
+import org.w3c.dom.Element\r
+import org.w3c.dom.Node\r
+import org.w3c.dom.NodeList\r
+import org.xml.sax.InputSource\r
+\r
 import org.camunda.bpm.engine.delegate.BpmnError\r
 import org.camunda.bpm.engine.delegate.DelegateExecution\r
 import org.onap.appc.client.lcm.model.Action\r
@@ -42,6 +51,12 @@ public class CreateVfModuleInfra extends AbstractServiceTaskProcessor {
 \r
        ExceptionUtil exceptionUtil = new ExceptionUtil()\r
        JsonUtils jsonUtil = new JsonUtils()\r
+       \r
+       private AbstractServiceTaskProcessor taskProcessor\r
+       \r
+       public SDNCAdapterUtils(AbstractServiceTaskProcessor taskProcessor) {\r
+               this.taskProcessor = taskProcessor\r
+       }       \r
 \r
        /**\r
         * Validates the request message and sets up the workflow.\r
@@ -217,6 +232,7 @@ public class CreateVfModuleInfra extends AbstractServiceTaskProcessor {
                        execution.setVariable(prefix + 'vfModuleId', newVfModuleId)\r
                        execution.setVariable('actionHealthCheck', Action.HealthCheck)\r
                        execution.setVariable('actionConfigScaleOut', Action.ConfigScaleOut)\r
+                       execution.setVariable('controllerType', "APPC")\r
                        def controllerType = execution.getVariable('controllerType')\r
                        execution.setVariable(prefix + 'controllerType', controllerType)\r
                        execution.setVariable('healthCheckIndex0', 0)\r
@@ -303,11 +319,55 @@ public class CreateVfModuleInfra extends AbstractServiceTaskProcessor {
                if(vnf.isPresent()){\r
                        def vnfOrchestrationStatus = vnf.get().getOrchestrationStatus();\r
                        if("active".equalsIgnoreCase(vnfOrchestrationStatus)){\r
-                               execution.setVariable("runHealthCheck", true);\r
+                               execution.setVariable("runHealthCheck", false);\r
                                execution.setVariable("runConfigScaleOut", true);\r
                        }\r
                }\r
        }\r
+       \r
+       /**\r
+        * Retrieve data for ConfigScaleOut from SDNC topology\r
+        */\r
+       \r
+       public void retreiveConfigScaleOutData(DelegateExecution execution){\r
+               def isDebugEnabled = execution.getVariable("isDebugLogEnabled")\r
+               def vfModuleId = execution.getVariable("CVFMI_vfModuleId")\r
+               String ipAddress = "";\r
+               String oamIpAddress = "";\r
+               String vnfHostIpAddress = "";\r
+\r
+               String vnfGetSDNC = execution.getVariable("DCVFM_getSDNCAdapterResponse");\r
+\r
+               String data = utils.getNodeXml(vnfGetSDNC, "response-data")\r
+               data = data.replaceAll("&lt;", "<")\r
+               data = data.replaceAll("&gt;", ">")\r
+\r
+               InputSource source = new InputSource(new StringReader(data));\r
+               DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();\r
+               docFactory.setNamespaceAware(true)\r
+               DocumentBuilder docBuilder = docFactory.newDocumentBuilder()\r
+               Document responseXml = docBuilder.parse(source)\r
+\r
+               NodeList paramsList = responseXml.getElementsByTagNameNS("*", "vnf-parameters")\r
+               for (int z = 0; z < paramsList.getLength(); z++) {\r
+                       Node node = paramsList.item(z)\r
+                       Element eElement = (Element) node\r
+                       String vnfParameterName = utils.getElementText(eElement, "vnf-parameter-name")\r
+                       String vnfParameterValue = utils.getElementText(eElement, "vnf-parameter-value")\r
+                       if (vnfParameterName.equals("vlb_private_ip_1")) {\r
+                               vnfHostIpAddress = vnfParameterValue\r
+                       }\r
+                       else if (vnfParameterName.equals("vdns_private_ip_0")) {\r
+                               ipAddress = vnfParameterValue\r
+                       }\r
+                       else if (vnfParameterName.equals("vdns_private_ip_1")) {                        \r
+                               oamIpAddress = vnfParameterValue\r
+                       }\r
+               }\r
+\r
+               String payload = "{\"request-parameters\":{\"vnf-host-ip-address\":\"" + vnfHostIpAddress + "\",\"vf-module-id\":\"" + vfModuleId + "\"},\"configuration-parameters\":{\"ip-addr\":\"" + ipAddress +"\", \"oam-ip-addr\":\""+ oamIpAddress +"\",\"enabled\":\"true\"}}"\r
+               execution.setVariable("payload", payload);\r
+       }\r
 \r
        /**\r
         *\r
index ae75d54..ab84168 100644 (file)
@@ -105,7 +105,10 @@ public class DoCreateResources extends AbstractServiceTaskProcessor
         List<NetworkResource> networkResourceList = new ArrayList<NetworkResource>()
 
         List<Resource> sequencedResourceList = new ArrayList<Resource>()
-        def resourceSequence = BPMNProperties.getResourceSequenceProp()
+        
+        String serviceDecompose = execution.getVariable("serviceDecomposition")
+        String serviceModelName = jsonUtil.getJsonValue(serviceDecompose, "serviceResources.modelInfo.modelName")
+        def resourceSequence = BPMNProperties.getResourceSequenceProp(serviceModelName)
 
         if(resourceSequence != null) {
             // sequence is defined in config file
@@ -245,10 +248,19 @@ public class DoCreateResources extends AbstractServiceTaskProcessor
                 //String requestAction = resourceInput.getOperationType()
                 String requestAction = "createInstance"
                 JSONObject resourceRecipe = cutils.getResourceRecipe(execution, resourceInput.getResourceModelInfo().getModelUuid(), requestAction)
-         String recipeURL = BPMNProperties.getProperty("bpelURL", "http://mso:8080") + resourceRecipe.getString("orchestrationUri")
-                int recipeTimeOut = resourceRecipe.getInt("recipeTimeout")
-                String recipeParamXsd = resourceRecipe.get("paramXSD")
-                HttpResponse resp = BpmnRestClient.post(recipeURL, requestId, recipeTimeOut, requestAction, serviceInstanceId, serviceType, resourceInput.toString(), recipeParamXsd)
+
+         if (resourceRecipe != null) {
+             String recipeURL = BPMNProperties.getProperty("bpelURL", "http://mso:8080") + resourceRecipe.getString("orchestrationUri")
+             int recipeTimeOut = resourceRecipe.getInt("recipeTimeout")
+             String recipeParamXsd = resourceRecipe.get("paramXSD")
+             HttpResponse resp = BpmnRestClient.post(recipeURL, requestId, recipeTimeOut, requestAction, serviceInstanceId, serviceType, resourceInput.toString(), recipeParamXsd)
+         } else {
+             String exceptionMessage = "Resource receipe is not found for resource modeluuid: " +
+                     resourceInput.getResourceModelInfo().getModelUuid()
+             utils.log("ERROR", exceptionMessage, isDebugEnabled)
+             exceptionUtil.buildAndThrowWorkflowException(execution, 500, exceptionMessage)
+         }
+
          utils.log("INFO", "======== end executeResourceRecipe Process ======== ", isDebugEnabled)
         }
     
index f0ecbab..d3e89df 100644 (file)
@@ -107,7 +107,7 @@ public class DoDeleteVFCNetworkServiceInstance extends AbstractServiceTaskProces
      */\r
     public void deleteNSRelationship(DelegateExecution execution) {\r
         def isDebugEnabled=execution.getVariable("isDebugLogEnabled")\r
-        utils.log("INFO"," ***** addNSRelationship *****",  isDebugEnabled)\r
+        utils.log("INFO"," ***** deleteNSRelationship *****",  isDebugEnabled)\r
         String nsInstanceId = execution.getVariable("resourceInstanceId")\r
         if(nsInstanceId == null || nsInstanceId == ""){\r
             utils.log("INFO"," Delete NS failed",  isDebugEnabled)\r
@@ -133,13 +133,13 @@ public class DoDeleteVFCNetworkServiceInstance extends AbstractServiceTaskProces
                                             </relationship-data>           \r
                                         </relationship>"""\r
         String endpoint = execution.getVariable("URN_aai_endpoint")\r
-        utils.log("INFO","Add Relationship req:\n" + deleteRelationPayload,  isDebugEnabled)\r
+        utils.log("INFO","Delete Relationship req:\n" + deleteRelationPayload,  isDebugEnabled)\r
         String url = endpoint + "/aai/v11/business/customers/customer/" + globalSubscriberId + "/service-subscriptions/service-subscription/" + serviceType + "/service-instances/service-instance/" + serviceId + "/relationship-list/relationship"\r
 \r
         APIResponse aaiRsp = executeAAIDeleteCall(execution, url, deleteRelationPayload)\r
         utils.log("INFO","aai response status code:" + aaiRsp.getStatusCode(),  isDebugEnabled)\r
         utils.log("INFO","aai response content:" + aaiRsp.getResponseBodyAsString(),  isDebugEnabled)\r
-        utils.log("INFO"," *****Exit addNSRelationship *****",  isDebugEnabled)\r
+        utils.log("INFO"," *****Exit deleteNSRelationship *****",  isDebugEnabled)\r
     }\r
 \r
     public APIResponse executeAAIDeleteCall(DelegateExecution execution, String url, String payload){\r
index 0e4aea0..c1ffc5a 100644 (file)
@@ -95,15 +95,15 @@ public class DoScaleVFCNetworkServiceInstance extends AbstractServiceTaskProcess
      * scale NS task
      */
     public void scaleNetworkService(DelegateExecution execution) {
+        def isDebugEnabled = execution.getVariable("isDebugLogEnabled")
 
         String saleNsRequest = execution.getVariable("reqBody")
         String[] nsReqStr = saleNsRequest.split("\\|")
 
-        def jobIdArray = ['jobId001', 'jobId002'] as String[]
-
         for (int i = 0; i < nsReqStr.length; i++) {
             JSONObject reqBodyJsonObj = new JSONObject(nsReqStr[i])
             String nsInstanceId = reqBodyJsonObj.getJSONObject("nsScaleParameters").getString("nsInstanceId")
+            String nodeTemplateUUID = reqBodyJsonObj.getJSONObject("nsOperationKey").getString("nodeTemplateUUID")
             reqBodyJsonObj.getJSONObject("nsScaleParameters").remove("nsInstanceId")
             String reqBody = reqBodyJsonObj.toString()
 
@@ -113,15 +113,19 @@ public class DoScaleVFCNetworkServiceInstance extends AbstractServiceTaskProcess
 
             String returnCode = apiResponse.getStatusCode()
             String aaiResponseAsString = apiResponse.getResponseBodyAsString()
-            String jobId = "";
-            if (returnCode == "200") {
+            String jobId = ""
+            if (returnCode == "200" || returnCode == "202") {
                 jobId = jsonUtil.getJsonValue(aaiResponseAsString, "jobId")
             }
-
-            execution.setVariable("jobId", jobIdArray[i])
+            utils.log("INFO", "scaleNetworkService get a ns scale job Id:" + jobId, isDebugEnabled)
+            execution.setVariable("jobId", jobId)
+            execution.setVariable("nodeTemplateUUID", nodeTemplateUUID)
 
             String isScaleFinished = ""
 
+            if(jobId =="" || jobId == null){
+                continue
+            }
             // query the requested network service scale status, if finished, then start the next one, otherwise, wait
             while (isScaleFinished != "finished" && isScaleFinished != "error"){
                 timeDelay()
index dff1ecf..74c991e 100644 (file)
@@ -126,11 +126,16 @@ public class DoUpdateE2EServiceInstance extends AbstractServiceTaskProcessor {
                        \r
                        // user params\r
                        String uuiRequest = execution.getVariable("uuiRequest")\r
+            \r
+                       // target model Invariant uuid\r
+                       String modelInvariantUuid = jsonUtil.getJsonValue(uuiRequest, "service.serviceInvariantUuid")\r
+                       execution.setVariable("modelInvariantUuid", modelInvariantUuid)            \r
+                       utils.log("INFO", "modelInvariantUuid: " + modelInvariantUuid, isDebugEnabled)            \r
+            \r
                        // target model uuid\r
                        String modelUuid = jsonUtil.getJsonValue(uuiRequest, "service.serviceUuid")\r
-                       execution.setVariable("modelUuid", modelUuid)\r
-                       \r
-                       utils.log("INFO","modelUuid: " + modelUuid, isDebugEnabled)\r
+                       execution.setVariable("modelUuid", modelUuid)                   \r
+                       utils.log("INFO", "modelUuid: " + modelUuid, isDebugEnabled)\r
                                \r
                } catch (BpmnError e) {\r
                        throw e;\r
@@ -327,9 +332,20 @@ public class DoUpdateE2EServiceInstance extends AbstractServiceTaskProcessor {
                String msg = ""\r
                utils.log("INFO"," ***** preProcessAAIPUT *****",  isDebugEnabled)\r
 \r
-               String modelUuid = execution.getVariable("modelUuid")\r
+\r
                String serviceInstanceVersion = execution.getVariable("serviceInstanceVersion")\r
-               execution.setVariable("GENPS_serviceResourceVersion", serviceInstanceVersion)\r
+               //execution.setVariable("GENPS_serviceResourceVersion", serviceInstanceVersion)\r
+        \r
+               //requestDetails.modelInfo.for AAI PUT servieInstanceData\r
+               //requestDetails.requestInfo. for AAI GET/PUT serviceInstanceData\r
+               String serviceInstanceName = execution.getVariable("serviceInstanceName")\r
+               String serviceInstanceId = execution.getVariable("serviceInstanceId")\r
+               //aai serviceType and Role can be setted as fixed value now.\r
+               String aaiServiceType = "E2E Service"\r
+               String aaiServiceRole = "E2E Service"\r
+               String modelInvariantUuid = execution.getVariable("modelInvariantUuid")\r
+               String modelUuid = execution.getVariable("modelUuid")\r
+\r
 \r
                AaiUtil aaiUriUtil = new AaiUtil(this)\r
                utils.log("INFO","start create aai uri: " + aaiUriUtil, isDebugEnabled) \r
@@ -341,7 +357,13 @@ public class DoUpdateE2EServiceInstance extends AbstractServiceTaskProcessor {
                //update target model to aai\r
                String serviceInstanceData =\r
                                """<service-instance xmlns=\"${namespace}\">\r
-                              <model-version-id">${modelUuid}</model-version-id>\r
+                    <service-instance-id>${serviceInstanceId}</service-instance-id>\r
+                    <service-instance-name>${serviceInstanceName}</service-instance-name>\r
+                    <service-type>${aaiServiceType}</service-type>\r
+                    <service-role>${aaiServiceRole}</service-role>\r
+                    <resource-version>${serviceInstanceVersion}</resource-version>\r
+                    <model-invariant-id>${modelInvariantUuid}</model-invariant-id>\r
+                    <model-version-id>${modelUuid}</model-version-id>                    \r
                                 </service-instance>""".trim()\r
 \r
                execution.setVariable("serviceInstanceData", serviceInstanceData)\r
index 1e70f95..a55ca02 100644 (file)
@@ -25,7 +25,9 @@ import groovy.xml.XmlUtil
 import groovy.json.*
 
 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
@@ -64,6 +66,7 @@ import org.springframework.web.util.UriUtils;
 public class DoUpdateE2EServiceInstanceRollback extends AbstractServiceTaskProcessor{
 
        String Prefix="DUPDSIRB_"
+       ExceptionUtil exceptionUtil = new ExceptionUtil()
 
        public void preProcessRequest(DelegateExecution execution) {
                def isDebugEnabled = execution.getVariable("isDebugLogEnabled")
@@ -259,13 +262,36 @@ public class DoUpdateE2EServiceInstanceRollback extends AbstractServiceTaskProce
                String msg = ""
                utils.log("INFO"," ***** preProcessAAIPUT *****",  isDebugEnabled)
 
-               String modelUuid = execution.getVariable("model-version-id-original")
                String serviceInstanceVersion = execution.getVariable("serviceInstanceVersion_n")
-               execution.setVariable("GENPS_serviceResourceVersion", serviceInstanceVersion)
+//             execution.setVariable("GENPS_serviceResourceVersion", serviceInstanceVersion)
+        
+               //requestDetails.modelInfo.for AAI PUT servieInstanceData
+               //requestDetails.requestInfo. for AAI GET/PUT serviceInstanceData
+               String serviceInstanceName = execution.getVariable("serviceInstanceName")
+               String serviceInstanceId = execution.getVariable("serviceInstanceId")
+               //aai serviceType and Role can be setted as fixed value now.
+               String aaiServiceType = "E2E Service"
+               String aaiServiceRole = "E2E Service"
+               String modelInvariantUuid = execution.getVariable("modelInvariantUuid")
+               String modelUuid = execution.getVariable("model-version-id-original")
+
+               //AAI PUT      
+               AaiUtil aaiUriUtil = new AaiUtil(this)
+               utils.log("INFO","start create aai uri: " + aaiUriUtil, isDebugEnabled)
+               String aai_uri = aaiUriUtil.getBusinessCustomerUri(execution)
+               utils.log("INFO","aai_uri: " + aai_uri, isDebugEnabled)
+               String namespace = aaiUriUtil.getNamespaceFromUri(aai_uri)
+               utils.log("INFO","namespace: " + namespace, isDebugEnabled)
 
                String serviceInstanceData =
                                """<service-instance xmlns=\"${namespace}\">
-                              <resource-version">${modelUuid}</resource-version>
+                    <service-instance-id>${serviceInstanceId}</service-instance-id>
+                    <service-instance-name>${serviceInstanceName}</service-instance-name>
+                    <service-type>${aaiServiceType}</service-type>
+                    <service-role>${aaiServiceRole}</service-role>
+                    <resource-version>${serviceInstanceVersion}</resource-version>
+                    <model-invariant-id>${modelInvariantUuid}</model-invariant-id>
+                    <model-version-id>${modelUuid}</model-version-id>   
                                 </service-instance>""".trim()
 
                execution.setVariable("serviceInstanceData", serviceInstanceData)
index 58f644d..4eca37b 100644 (file)
@@ -125,9 +125,7 @@ public class ScaleCustomE2EServiceInstance extends AbstractServiceTaskProcessor
             String operationId = execution.getVariable("operationId")
             String serviceInstanceId = execution.getVariable("serviceInstanceId")
             // RESTResponse for API Handler (APIH) Reply Task
-            String scaleServiceRestRequest = """{"service":{"serviceId":"${serviceInstanceId}","operationId":"${
-                operationId
-            }"}}""".trim()
+            String scaleServiceRestRequest = """{"operationId":"${operationId}"}""".trim()
             utils.log("DEBUG", " sendSyncResponse to APIH:" + "\n" + scaleServiceRestRequest, isDebugEnabled)
             sendWorkflowResponse(execution, 202, scaleServiceRestRequest)
             execution.setVariable("sentSyncResponse", true)
@@ -256,7 +254,7 @@ public class ScaleCustomE2EServiceInstance extends AbstractServiceTaskProcessor
         utils.log("INFO", " ======== STARTED prepareInitServiceOperationStatus Process ======== ", isDebugEnabled)
         try{
             String serviceId = execution.getVariable("serviceInstanceId")
-            String serviceName = execution.getVariable("serviceInstanceName")
+            //String serviceName = execution.getVariable("serviceInstanceName")
             String operationId = execution.getVariable("operationId")
             String operationType = "SCALE"
             String userId = ""
@@ -280,7 +278,6 @@ public class ScaleCustomE2EServiceInstance extends AbstractServiceTaskProcessor
                             <ns:updateServiceOperationStatus xmlns:ns="http://org.openecomp.mso/requestsdb">
                             <serviceId>${serviceId}</serviceId>
                             <operationId>${operationId}</operationId>
-                            <serviceName>${serviceName}</serviceName>
                             <operationType>${operationType}</operationType>
                             <userId>${userId}</userId>
                             <result>${result}</result>
index a964a7e..f3f1a96 100644 (file)
@@ -413,7 +413,6 @@ public class UpdateCustomE2EServiceInstance extends AbstractServiceTaskProcessor
                             <ns:updateServiceOperationStatus xmlns:ns="http://org.openecomp.mso/requestsdb">
                             <serviceId>${serviceId}</serviceId>
                             <operationId>${operationId}</operationId>
-                            <serviceName>${serviceName}</serviceName>
                             <operationType>${operationType}</operationType>
                             <userId>${userId}</userId>
                             <result>${result}</result>
index 694aafc..68f50e0 100644 (file)
@@ -76,6 +76,7 @@ public class CreateVcpeResCustService extends AbstractServiceTaskProcessor {
         execution.setVariable("homingService", "")
         execution.setVariable("cloudOwner", "")
         execution.setVariable("cloudRegionId", "")
+        execution.setVariable("homingModelIds", "")
 
         //TODO
         execution.setVariable("sdncVersion", "1707")
@@ -129,6 +130,11 @@ public class CreateVcpeResCustService extends AbstractServiceTaskProcessor {
 
             serviceInstanceId = UriUtils.encode(serviceInstanceId, "UTF-8")
             execution.setVariable("serviceInstanceId", serviceInstanceId)
+            utils.log("DEBUG", "Incoming serviceInstanceId is: " + serviceInstanceId, isDebugEnabled)
+
+            String serviceInstanceName = jsonUtil.getJsonValue(createVcpeServiceRequest, "requestDetails.requestInfo.instanceName")
+            execution.setVariable("serviceInstanceName", serviceInstanceName)
+            utils.log("DEBUG", "Incoming serviceInstanceName is: " + serviceInstanceName, isDebugEnabled)
 
             String requestAction = execution.getVariable("requestAction")
             execution.setVariable("requestAction", requestAction)
@@ -194,28 +200,47 @@ public class CreateVcpeResCustService extends AbstractServiceTaskProcessor {
             def userParams = reqMap.requestDetails?.requestParameters?.userParams
 
             Map<String, String> inputMap = [:]
-
-          if (userParams) {
+            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)
+                    userParam ->
+                        if ("Customer_Location".equals(userParam?.name)) {
+                            execution.setVariable("customerLocation", userParam.value)
+                            userParam.value.each {
+                                param ->
+                                    inputMap.put(param.key, param.value)
+                            }
+                        }
+                        if ("Homing_Model_Ids".equals(userParam?.name)) {
+                            utils.log("DEBUG", "Homing_Model_Ids: " + userParam.value.toString() + "  ---- Type is:" +
+                                    userParam.value.getClass() , isDebugEnabled)
+                            def modelIdLst = []
+                            userParam.value.each {
+                                param ->
+                                    def valueMap = [:]
+                                    param.each {
+                                        entry ->
+                                            valueMap.put(entry.key, entry.value)
                                     }
-                                }
-                                if("Homing_Solution".equals(userParam?.name)) {
-                                    execution.setVariable("homingService", userParam.value)
-                                    inputMap.put("Homing_Solution", userParam.value)
-                                } else {
-                                    execution.setVariable("homingService", "oof")
-                                }
-                }
+                                    modelIdLst.add(valueMap)
+                                    utils.log("DEBUG", "Param: " + param.toString() + "  ---- Type is:" +
+                                            param.getClass() , isDebugEnabled)
+                            }
+                            execution.setVariable("homingModelIds", modelIdLst)
+                        }
+                        if ("BRG_WAN_MAC_Address".equals(userParam?.name)) {
+                            execution.setVariable("brgWanMacAddress", userParam.value)
+                            inputMap.put("BRG_WAN_MAC_Address", userParam.value)
+                        }
+                        if ("Homing_Solution".equals(userParam?.name)) {
+                            execution.setVariable("homingService", userParam.value)
+                            inputMap.put("Homing_Solution", userParam.value)
+                        }
+                  }
+            }
+
+            if (execution.getVariable("homingService") == "") {
+                // Set Default Homing to OOF if not set
+                execution.setVariable("homingService", "oof")
             }
 
             utils.log("DEBUG", "User Input Parameters map: " + userParams.toString(), isDebugEnabled)
@@ -417,7 +442,7 @@ public class CreateVcpeResCustService extends AbstractServiceTaskProcessor {
             VnfResource vr = it.next()
 
             String role = vr.getNfRole()
-            if (role == "BRG" || role == "TunnelXConn") {
+            if (role == "BRG" || role == "TunnelXConn" || role == "Tunnel XConn") {
                 it.remove()
             }
         }
@@ -451,7 +476,7 @@ public class CreateVcpeResCustService extends AbstractServiceTaskProcessor {
 
                     utils.log("DEBUG", " getting model info for AllottedResource # :" + allottedResource.toJsonStringNoRootName(), isDebugEnabled)
                     utils.log("DEBUG", " allottedResource.getAllottedResourceType() :" + allottedResource.getAllottedResourceType(), isDebugEnabled)
-                    if ("TunnelXConn".equalsIgnoreCase(allottedResource.getAllottedResourceType())) {
+                    if ("TunnelXConn".equalsIgnoreCase(allottedResource.getAllottedResourceType()) || "Tunnel XConn".equalsIgnoreCase(allottedResource.getAllottedResourceType())) {
                         //set create flag to true
                         execution.setVariable("createTXCAR", true)
                         ModelInfo allottedResourceModelInfo = allottedResource.getModelInfo()
index aa16d3b..08edb88 100644 (file)
@@ -242,8 +242,8 @@ public class DeleteVcpeResCustService extends AbstractServiceTaskProcessor {
                                        \r
                                        if(isBlank(type) || isBlank(id)) {\r
                                                \r
-                                       } else if(type == "TunnelXConn") {\r
-                                               utils.log("DEBUG","TunnelXConn AR found", isDebugEnabled)\r
+                                       } else if(type == "TunnelXConn" || type == "Tunnel XConn") {\r
+                                               utils.log("DEBUG","Tunnel XConn AR found", isDebugEnabled)\r
                                                TXC_found = true\r
                                                TXC_id = id\r
                                                \r
index dbb552c..64d8530 100644 (file)
@@ -47,8 +47,8 @@ public class BPMNProperties {
         return value;
     }
 
-    public static List<String> getResourceSequenceProp() {
-        String resourceSequence = getProperty("mso.workflow.custom.VolTE.resource.sequence", null);
+    public static List<String> getResourceSequenceProp(String input) {
+        String resourceSequence = getProperty("mso.workflow.custom." + input + ".resource.sequence", null);
         if (resourceSequence != null) {
             return Arrays.asList(resourceSequence.split(","));
         }
diff --git a/bpmn/MSOInfrastructureBPMN/src/main/resources/process/CreateCustom3rdONAPServiceInstance.bpmn b/bpmn/MSOInfrastructureBPMN/src/main/resources/process/CreateCustom3rdONAPServiceInstance.bpmn
new file mode 100644 (file)
index 0000000..71f4a28
--- /dev/null
@@ -0,0 +1,391 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="1.11.3">
+  <bpmn:process id="CreateCustomE2EServiceInstance" name="CreateCustomE2EServiceInstance" isExecutable="true">
+    <bpmn:startEvent id="StartEvent_00qj6ro" name="Create SI Start Flow">
+      <bpmn:outgoing>SequenceFlow_0s2spoq</bpmn:outgoing>
+    </bpmn:startEvent>
+    <bpmn:subProcess id="SubProcess_0ka59nc" name="Sub-process for UnexpectedErrors" triggeredByEvent="true">
+      <bpmn:scriptTask id="ScriptTask_0u3lw39" name="Handle Unexpected Error" scriptFormat="groovy">
+        <bpmn:incoming>SequenceFlow_1dsbjjb</bpmn:incoming>
+        <bpmn:outgoing>SequenceFlow_1yay321</bpmn:outgoing>
+        <bpmn:script><![CDATA[import org.openecomp.mso.bpmn.common.scripts.*
+ExceptionUtil ex = new ExceptionUtil()
+ex.processJavaException(execution)]]></bpmn:script>
+      </bpmn:scriptTask>
+      <bpmn:startEvent id="StartEvent_0v1ffn4">
+        <bpmn:outgoing>SequenceFlow_1dsbjjb</bpmn:outgoing>
+        <bpmn:errorEventDefinition />
+      </bpmn:startEvent>
+      <bpmn:endEvent id="EndEvent_0eznq6x">
+        <bpmn:incoming>SequenceFlow_1yay321</bpmn:incoming>
+      </bpmn:endEvent>
+      <bpmn:sequenceFlow id="SequenceFlow_1dsbjjb" name="" sourceRef="StartEvent_0v1ffn4" targetRef="ScriptTask_0u3lw39" />
+      <bpmn:sequenceFlow id="SequenceFlow_1yay321" name="" sourceRef="ScriptTask_0u3lw39" targetRef="EndEvent_0eznq6x" />
+    </bpmn:subProcess>
+    <bpmn:callActivity id="DoCreateE2EServiceInstance" name="Call DoCreateE2EServiceInstance&#10;" calledElement="DoCreateE2EServiceInstanceV3">
+      <bpmn:extensionElements>
+        <camunda:out source="WorkflowException" target="WorkflowException" />
+        <camunda:in source="msoRequestId" target="msoRequestId" />
+        <camunda:out source="rollbackData" target="rollbackData" />
+        <camunda:in source="serviceInstanceId" target="serviceInstanceId" />
+        <camunda:in source="serviceInstanceName" target="serviceInstanceName" />
+        <camunda:in source="serviceModelInfo" target="serviceModelInfo" />
+        <camunda:in source="productFamilyId" target="productFamilyId" />
+        <camunda:in source="disableRollback" target="disableRollback" />
+        <camunda:in source="serviceInputParams" target="serviceInputParams" />
+        <camunda:out source="rolledBack" target="rolledBack" />
+        <camunda:out source="serviceInstanceName" target="serviceInstanceName" />
+        <camunda:in source="failIfExists" target="failIfExists" />
+        <camunda:in source="globalSubscriberId" target="globalSubscriberId" />
+        <camunda:in source="subscriptionServiceType" target="subscriptionServiceType" />
+        <camunda:in sourceExpression="1610" target="sdncVersion" />
+        <camunda:in source="initialStatus" target="initialStatus" />
+        <camunda:in source="serviceType" target="serviceType" />
+        <camunda:in source="uuiRequest" target="uuiRequest" />
+        <camunda:in source="requestAction" target="operationType" />
+        <camunda:in source="operationId" target="operationId" />
+      </bpmn:extensionElements>
+      <bpmn:incoming>SequenceFlow_19eilro</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0klbpxx</bpmn:outgoing>
+    </bpmn:callActivity>
+    <bpmn:endEvent id="EndEvent_0bpd6c0" name="End">
+      <bpmn:incoming>SequenceFlow_0yayvrf</bpmn:incoming>
+    </bpmn:endEvent>
+    <bpmn:scriptTask id="ScriptTask_1s09c7d" name="Pre Process Incoming Request" scriptFormat="groovy">
+      <bpmn:incoming>SequenceFlow_0s2spoq</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0z4faf9</bpmn:outgoing>
+      <bpmn:script><![CDATA[import org.openecomp.mso.bpmn.infrastructure.scripts.*
+def csi= new CreateCustomE2EServiceInstance()
+csi.preProcessRequest(execution)]]></bpmn:script>
+    </bpmn:scriptTask>
+    <bpmn:scriptTask id="ScriptTask_0ttvn8r" name="Prepare Completion Request" scriptFormat="groovy">
+      <bpmn:incoming>SequenceFlow_14zu6wr</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0je30si</bpmn:outgoing>
+      <bpmn:script><![CDATA[import org.openecomp.mso.bpmn.infrastructure.scripts.*
+def csi = new CreateCustomE2EServiceInstance()
+csi.prepareCompletionRequest(execution)]]></bpmn:script>
+    </bpmn:scriptTask>
+    <bpmn:callActivity id="CallActivity_02fyxz0" name="Call CompleteMsoProcess" calledElement="CompleteMsoProcess">
+      <bpmn:extensionElements>
+        <camunda:in source="completionRequest" target="CompleteMsoProcessRequest" />
+        <camunda:in source="mso-request-id" target="mso-request-id" />
+        <camunda:in source="mso-service-instance-id" target="mso-service-instance-id" />
+        <camunda:out source="CMSO_ResponseCode" target="CMSO_ResponseCode" />
+        <camunda:out source="CompleteMsoProcessResponse" target="CompleteMsoProcessResponse" />
+        <camunda:out source="CMSO_ErrorResponse" target="CMSO_ErrorResponse" />
+      </bpmn:extensionElements>
+      <bpmn:incoming>SequenceFlow_0je30si</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0yayvrf</bpmn:outgoing>
+    </bpmn:callActivity>
+    <bpmn:subProcess id="SubProcess_0vaws86" name="Sub-process for FalloutHandler and Rollback" triggeredByEvent="true">
+      <bpmn:startEvent id="StartEvent_0dug28e">
+        <bpmn:outgoing>SequenceFlow_0e1r62n</bpmn:outgoing>
+        <bpmn:errorEventDefinition />
+      </bpmn:startEvent>
+      <bpmn:endEvent id="EndEvent_03wysuk">
+        <bpmn:incoming>SequenceFlow_1ysapam</bpmn:incoming>
+      </bpmn:endEvent>
+      <bpmn:scriptTask id="ScriptTask_0u8o9p2" name="Prepare Fallout Request" scriptFormat="groovy">
+        <bpmn:incoming>SequenceFlow_0n9pexp</bpmn:incoming>
+        <bpmn:outgoing>SequenceFlow_01umodj</bpmn:outgoing>
+        <bpmn:script><![CDATA[import org.openecomp.mso.bpmn.infrastructure.scripts.*
+def csi = new CreateCustomE2EServiceInstance()
+csi.prepareFalloutRequest(execution)]]></bpmn:script>
+      </bpmn:scriptTask>
+      <bpmn:callActivity id="CallActivity_1ang7q8" name="Call FalloutHandler" calledElement="FalloutHandler">
+        <bpmn:extensionElements>
+          <camunda:in source="falloutRequest" target="FalloutHandlerRequest" />
+          <camunda:in source="mso-request-id" target="mso-request-id" />
+          <camunda:in source="mso-service-instance-id" target="mso-service-instance-id" />
+          <camunda:out source="FH_ResponseCode" target="FH_ResponseCode" />
+          <camunda:out source="FalloutHandlerResponse" target="FalloutHandlerResponse" />
+          <camunda:out source="FH_ErrorResponse" target="FH_ErrorResponse" />
+        </bpmn:extensionElements>
+        <bpmn:incoming>SequenceFlow_01umodj</bpmn:incoming>
+        <bpmn:outgoing>SequenceFlow_1ysapam</bpmn:outgoing>
+      </bpmn:callActivity>
+      <bpmn:scriptTask id="ScriptTask_1rn6nqi" name="Send Error Response">
+        <bpmn:incoming>SequenceFlow_0e1r62n</bpmn:incoming>
+        <bpmn:outgoing>SequenceFlow_0n9pexp</bpmn:outgoing>
+        <bpmn:script><![CDATA[import org.openecomp.mso.bpmn.infrastructure.scripts.*
+def csi = new  CreateCustomE2EServiceInstance()
+csi.sendSyncError(execution)]]></bpmn:script>
+      </bpmn:scriptTask>
+      <bpmn:sequenceFlow id="SequenceFlow_0e1r62n" sourceRef="StartEvent_0dug28e" targetRef="ScriptTask_1rn6nqi" />
+      <bpmn:sequenceFlow id="SequenceFlow_1ysapam" sourceRef="CallActivity_1ang7q8" targetRef="EndEvent_03wysuk" />
+      <bpmn:sequenceFlow id="SequenceFlow_0n9pexp" sourceRef="ScriptTask_1rn6nqi" targetRef="ScriptTask_0u8o9p2" />
+      <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_081z8l2</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_19eilro</bpmn:outgoing>
+      <bpmn:script><![CDATA[import org.openecomp.mso.bpmn.infrastructure.scripts.*
+def csi = new  CreateCustomE2EServiceInstance()
+csi.sendSyncResponse(execution)]]></bpmn:script>
+    </bpmn:scriptTask>
+    <bpmn:exclusiveGateway id="ExclusiveGateway_0aqn64l" name="Success?">
+      <bpmn:incoming>SequenceFlow_0klbpxx</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_14zu6wr</bpmn:outgoing>
+      <bpmn:outgoing>SequenceFlow_1fueo69</bpmn:outgoing>
+    </bpmn:exclusiveGateway>
+    <bpmn:endEvent id="EndEvent_07uk5iy">
+      <bpmn:incoming>SequenceFlow_1fueo69</bpmn:incoming>
+      <bpmn:errorEventDefinition errorRef="Error_0nbdy47" />
+    </bpmn:endEvent>
+    <bpmn:sequenceFlow id="SequenceFlow_0s2spoq" sourceRef="StartEvent_00qj6ro" targetRef="ScriptTask_1s09c7d" />
+    <bpmn:sequenceFlow id="SequenceFlow_19eilro" sourceRef="ScriptTask_0xupxj9" targetRef="DoCreateE2EServiceInstance" />
+    <bpmn:sequenceFlow id="SequenceFlow_0klbpxx" sourceRef="DoCreateE2EServiceInstance" targetRef="ExclusiveGateway_0aqn64l" />
+    <bpmn:sequenceFlow id="SequenceFlow_0yayvrf" sourceRef="CallActivity_02fyxz0" targetRef="EndEvent_0bpd6c0" />
+    <bpmn:sequenceFlow id="SequenceFlow_0z4faf9" sourceRef="ScriptTask_1s09c7d" targetRef="Task_1tqjch6" />
+    <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>
+    <bpmn:sequenceFlow id="SequenceFlow_0je30si" sourceRef="ScriptTask_0ttvn8r" targetRef="CallActivity_02fyxz0" />
+    <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:sequenceFlow id="SequenceFlow_1euqjsp" sourceRef="Task_1tqjch6" targetRef="Task_19mxcw3" />
+    <bpmn:scriptTask id="Task_1tqjch6" name="Init Service Operation Status" scriptFormat="groovy">
+      <bpmn:incoming>SequenceFlow_0z4faf9</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_1euqjsp</bpmn:outgoing>
+      <bpmn:script><![CDATA[import org.openecomp.mso.bpmn.infrastructure.scripts.*
+def csi= new CreateCustomE2EServiceInstance()
+csi.prepareInitServiceOperationStatus(execution)]]></bpmn:script>
+    </bpmn:scriptTask>
+    <bpmn:serviceTask id="Task_19mxcw3" 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_1euqjsp</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_081z8l2</bpmn:outgoing>
+    </bpmn:serviceTask>
+    <bpmn:sequenceFlow id="SequenceFlow_081z8l2" sourceRef="Task_19mxcw3" targetRef="ScriptTask_0xupxj9" />
+  </bpmn:process>
+  <bpmn:error id="Error_0nbdy47" name="MSOWorkflowException" errorCode="MSOWorkflowException" />
+  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
+    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="CreateCustomE2EServiceInstance">
+      <bpmndi:BPMNShape id="StartEvent_00qj6ro_di" bpmnElement="StartEvent_00qj6ro">
+        <dc:Bounds x="-6" y="180" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="-24" y="221" width="73" height="24" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="SubProcess_0ka59nc_di" bpmnElement="SubProcess_0ka59nc" isExpanded="true">
+        <dc:Bounds x="463" y="632" width="394" height="188" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="CallActivity_0rhljy8_di" bpmnElement="DoCreateE2EServiceInstance">
+        <dc:Bounds x="751" 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" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1268" y="322" width="22" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_1s09c7d_di" bpmnElement="ScriptTask_1s09c7d">
+        <dc:Bounds x="115" 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" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="CallActivity_02fyxz0_di" bpmnElement="CallActivity_02fyxz0">
+        <dc:Bounds x="1226" y="158" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="SubProcess_0vaws86_di" bpmnElement="SubProcess_0vaws86" isExpanded="true">
+        <dc:Bounds x="348" y="370" width="679" height="194" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_0xupxj9_di" bpmnElement="ScriptTask_0xupxj9">
+        <dc:Bounds x="610" 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" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="903" y="145" width="50" 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" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="883" y="322" width="0" 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="115" y="198" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="27.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="710" y="198" />
+        <di:waypoint xsi:type="dc:Point" x="751" y="198" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="685.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="851" y="198" />
+        <di:waypoint xsi:type="dc:Point" x="903" y="198" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="832" y="177" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0yayvrf_di" bpmnElement="SequenceFlow_0yayvrf">
+        <di:waypoint xsi:type="dc:Point" x="1276" y="238" />
+        <di:waypoint xsi:type="dc:Point" x="1276" y="286" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1246" y="262" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0z4faf9_di" bpmnElement="SequenceFlow_0z4faf9">
+        <di:waypoint xsi:type="dc:Point" x="215" y="198" />
+        <di:waypoint xsi:type="dc:Point" x="273" y="198" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="199" 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" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="987" y="195" width="20" 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="1226" y="198" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1137" y="183" width="0" 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" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="901" y="228" width="15" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ScriptTask_0u3lw39_di" bpmnElement="ScriptTask_0u3lw39">
+        <dc:Bounds x="611" y="687" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="StartEvent_0v1ffn4_di" bpmnElement="StartEvent_0v1ffn4">
+        <dc:Bounds x="496" y="709" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="469" y="750" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="EndEvent_0eznq6x_di" bpmnElement="EndEvent_0eznq6x">
+        <dc:Bounds x="772" y="709" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="745" y="750" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="StartEvent_0dug28e_di" bpmnElement="StartEvent_0dug28e">
+        <dc:Bounds x="363" y="456" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="336" y="497" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="EndEvent_03wysuk_di" bpmnElement="EndEvent_03wysuk">
+        <dc:Bounds x="942" y="456" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="915" y="497" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_0u8o9p2_di" bpmnElement="ScriptTask_0u8o9p2">
+        <dc:Bounds x="621" y="434" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="CallActivity_1ang7q8_di" bpmnElement="CallActivity_1ang7q8">
+        <dc:Bounds x="798" y="434" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_1rn6nqi_di" bpmnElement="ScriptTask_1rn6nqi">
+        <dc:Bounds x="443" y="434" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_1dsbjjb_di" bpmnElement="SequenceFlow_1dsbjjb">
+        <di:waypoint xsi:type="dc:Point" x="532" y="727" />
+        <di:waypoint xsi:type="dc:Point" x="611" y="727" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="529.5" y="727" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1yay321_di" bpmnElement="SequenceFlow_1yay321">
+        <di:waypoint xsi:type="dc:Point" x="711" y="727" />
+        <di:waypoint xsi:type="dc:Point" x="772" y="727" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="701.5" y="727" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0e1r62n_di" bpmnElement="SequenceFlow_0e1r62n">
+        <di:waypoint xsi:type="dc:Point" x="399" y="474" />
+        <di:waypoint xsi:type="dc:Point" x="421" y="474" />
+        <di:waypoint xsi:type="dc:Point" x="421" y="474" />
+        <di:waypoint xsi:type="dc:Point" x="442" y="474" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="391" y="474" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1ysapam_di" bpmnElement="SequenceFlow_1ysapam">
+        <di:waypoint xsi:type="dc:Point" x="898" y="474" />
+        <di:waypoint xsi:type="dc:Point" x="942" y="474" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="875" y="459" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0n9pexp_di" bpmnElement="SequenceFlow_0n9pexp">
+        <di:waypoint xsi:type="dc:Point" x="543" y="474" />
+        <di:waypoint xsi:type="dc:Point" x="570" y="474" />
+        <di:waypoint xsi:type="dc:Point" x="570" y="474" />
+        <di:waypoint xsi:type="dc:Point" x="621" y="474" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="540" y="474" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_01umodj_di" bpmnElement="SequenceFlow_01umodj">
+        <di:waypoint xsi:type="dc:Point" x="721" y="474" />
+        <di:waypoint xsi:type="dc:Point" x="798" y="474" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="715.5" y="459" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1euqjsp_di" bpmnElement="SequenceFlow_1euqjsp">
+        <di:waypoint xsi:type="dc:Point" x="373" y="198" />
+        <di:waypoint xsi:type="dc:Point" x="446" y="198" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="364.5" y="177" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ScriptTask_1a3vwas_di" bpmnElement="Task_1tqjch6">
+        <dc:Bounds x="273" y="158" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ServiceTask_1afiuuq_di" bpmnElement="Task_19mxcw3">
+        <dc:Bounds x="446" y="158" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_081z8l2_di" bpmnElement="SequenceFlow_081z8l2">
+        <di:waypoint xsi:type="dc:Point" x="546" y="198" />
+        <di:waypoint xsi:type="dc:Point" x="610" y="198" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="533" y="177" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+    </bpmndi:BPMNPlane>
+  </bpmndi:BPMNDiagram>
+</bpmn:definitions>
index ea48104..876f91f 100644 (file)
@@ -451,6 +451,8 @@ CreateVcpeResCustService.prepareCreateAllottedResourceTXC(execution)]]></bpmn2:s
         <camunda:in source="customerLocation" target="customerLocation" />
         <camunda:in source="cloudOwner" target="cloudOwner" />
         <camunda:in source="cloudRegionId" target="cloudRegionId" />
+        <camunda:in source="serviceInstanceName" target="serviceInstanceName" />
+        <camunda:in source="homingModelIds" target="homingModelIds" />
       </bpmn2:extensionElements>
       <bpmn2:incoming>SequenceFlow_11efpvh</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_1jbuf1t</bpmn2:outgoing>
@@ -514,6 +516,7 @@ CreateVcpeResCustService.prepareCreateAllottedResourceBRG(execution)]]></bpmn2:s
         <camunda:in source="serviceModelInfo" target="serviceModelInfo" />
         <camunda:in source="globalSubscriberId" target="globalSubscriberId" />
         <camunda:in source="serviceDecomposition" target="serviceDecomposition" />
+        <camunda:in source="RegionOne_flavorList" target="RegionOne_flavorList" />
       </bpmn2:extensionElements>
       <bpmn2:incoming>SequenceFlow_0ws7fjn</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_1mkdhw9</bpmn2:outgoing>
index 94b88f7..99b1ff5 100644 (file)
@@ -585,6 +585,7 @@ CreateVcpeResCustService.validateVnfCreate(execution)]]></bpmn2:script>
       <bpmn2:extensionElements>
         <camunda:in source="timeoutForPnfEntryNotification" target="timeoutForPnfEntryNotification" />
         <camunda:in source="correlationId" target="correlationId" />
+        <camunda:in businessKey="#{execution.processBusinessKey}" />
       </bpmn2:extensionElements>
       <bpmn2:incoming>SequenceFlow_0gj4vud</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_0clhseq</bpmn2:outgoing>
index f882094..c0c2f26 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="_pNTO8MRhEeWv36YLr7PC3Q" 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="_pNTO8MRhEeWv36YLr7PC3Q" targetNamespace="http://camunda.org/schema/1.0/bpmn" exporter="Camunda Modeler" exporterVersion="1.8.2" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
   <bpmn2:process id="CreateVfModuleInfra" name="CreateVfModuleInfra" isExecutable="true">
     <bpmn2:startEvent id="StartEvent_1" name="Start">
       <bpmn2:outgoing>SequenceFlow_1</bpmn2:outgoing>
@@ -38,6 +38,7 @@
         <camunda:in source="CVFMI_usePreload" target="usePreload" />
         <camunda:in source="CVFMI_vfModuleInputParams" target="vfModuleInputParams" />
         <camunda:in source="CVFMI_aLaCarte" target="aLaCarte" />
+        <camunda:out source="DCVFM_getSDNCAdapterResponse" target="DCVFM_getSDNCAdapterResponse" />
       </bpmn2:extensionElements>
       <bpmn2:incoming>SequenceFlow_1y7d5qk</bpmn2:incoming>
       <bpmn2:incoming>SequenceFlow_1vx081s</bpmn2:incoming>
@@ -215,7 +216,7 @@ exceptionUtil.processJavaException(execution)]]></bpmn2:script>
         <camunda:in source="CVFMI_vnfId" target="vnfId" />
         <camunda:in source="CVFMI_requestId" target="msoRequestId" />
         <camunda:in source="CVFMI_vnfName" target="vnfName" />
-        <camunda:in source="CVFMO_controllerType" target="controllerType" />
+        <camunda:in source="CVFMI_controllerType" target="controllerType" />
         <camunda:in source="healthCheckIndex0" target="healthCheckIndex" />
         <camunda:out source="errorCode" target="errorCode" />
         <camunda:out source="errorText" target="errorText" />
@@ -247,7 +248,8 @@ exceptionUtil.processJavaException(execution)]]></bpmn2:script>
         <camunda:in source="CVFMI_vnfId" target="vnfId" />
         <camunda:in source="CVFMI_requestId" target="msoRequestId" />
         <camunda:in source="CVFMI_vnfName" target="vnfName" />
-        <camunda:in source="CVFMO_controllerType" target="controllerType" />
+        <camunda:in source="CVFMI_controllerType" target="controllerType" />
+        <camunda:in source="payload" target="payload" />
         <camunda:in source="healthCheckIndex0" target="healthCheckIndex" />
         <camunda:out source="errorCode" target="errorConfigScaleOutCode" />
         <camunda:out source="errorText" target="errorText" />
@@ -255,7 +257,7 @@ exceptionUtil.processJavaException(execution)]]></bpmn2:script>
         <camunda:out source="failedActivity" target="failedActivity" />
         <camunda:in source="CVFMI_vfModuleId" target="vfModuleId" />
       </bpmn2:extensionElements>
-      <bpmn2:incoming>SequenceFlow_020dbkp</bpmn2:incoming>
+      <bpmn2:incoming>SequenceFlow_09i6f7t</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_1tk5ru7</bpmn2:outgoing>
     </bpmn2:callActivity>
     <bpmn2:sequenceFlow id="SequenceFlow_1crl7uf" sourceRef="ServiceTask_1" targetRef="UpdateInfraRequestResponseCheck" />
@@ -287,7 +289,7 @@ exceptionUtil.processJavaException(execution)]]></bpmn2:script>
       <bpmn2:outgoing>SequenceFlow_020dbkp</bpmn2:outgoing>
       <bpmn2:outgoing>SequenceFlow_0u8zesf</bpmn2:outgoing>
     </bpmn2:exclusiveGateway>
-    <bpmn2:sequenceFlow id="SequenceFlow_020dbkp" name="yes" sourceRef="ExclusiveGateway_0c8x2mq" targetRef="CallActivity_17ukiqm">
+    <bpmn2:sequenceFlow id="SequenceFlow_020dbkp" name="yes" sourceRef="ExclusiveGateway_0c8x2mq" targetRef="Task_09om99x">
       <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression" language="groovy"><![CDATA[execution.getVariable("runConfigScaleOut")]]></bpmn2:conditionExpression>
     </bpmn2:sequenceFlow>
     <bpmn2:sequenceFlow id="SequenceFlow_0u8zesf" name="no" sourceRef="ExclusiveGateway_0c8x2mq" targetRef="PrepareMSOCompletionHandler" />
@@ -299,6 +301,14 @@ exceptionUtil.processJavaException(execution)]]></bpmn2:script>
 def createVfModule = new CreateVfModuleInfra()
 createVfModule.queryAAIForVnfOrchestrationStatus(execution)]]></bpmn2:script>
     </bpmn2:scriptTask>
+    <bpmn2:sequenceFlow id="SequenceFlow_09i6f7t" sourceRef="Task_09om99x" targetRef="CallActivity_17ukiqm" />
+    <bpmn2:scriptTask id="Task_09om99x" name="Retreive Data for Config ScaleOut" scriptFormat="groovy">
+      <bpmn2:incoming>SequenceFlow_020dbkp</bpmn2:incoming>
+      <bpmn2:outgoing>SequenceFlow_09i6f7t</bpmn2:outgoing>
+      <bpmn2:script><![CDATA[import org.openecomp.mso.bpmn.infrastructure.scripts.*
+def createVfModule = new CreateVfModuleInfra()
+createVfModule.retreiveConfigScaleOutData(execution)]]></bpmn2:script>
+    </bpmn2:scriptTask>
   </bpmn2:process>
   <bpmn2:error id="Error_1" name="MSOWorkflowException" errorCode="MSOWorkflowException" />
   <bpmn2:error id="Error_2" name="REST Fault" errorCode="RESTFault" />
@@ -582,7 +592,7 @@ createVfModule.queryAAIForVnfOrchestrationStatus(execution)]]></bpmn2:script>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="CallActivity_17ukiqm_di" bpmnElement="CallActivity_17ukiqm">
-        <dc:Bounds x="472" y="189" width="145" height="80" />
+        <dc:Bounds x="472" y="120" width="145" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_1crl7uf_di" bpmnElement="SequenceFlow_1crl7uf">
         <di:waypoint xsi:type="dc:Point" x="377" y="367" />
@@ -592,36 +602,36 @@ createVfModule.queryAAIForVnfOrchestrationStatus(execution)]]></bpmn2:script>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ExclusiveGateway_1hncvjy_di" bpmnElement="ExclusiveGateway_1hncvjy" isMarkerVisible="true">
-        <dc:Bounds x="675" y="204" width="50" height="50" />
+        <dc:Bounds x="675" y="135" width="50" height="50" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="657" y="170" width="86" height="24" />
+          <dc:Bounds x="659" y="101" width="82" height="24" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_1tk5ru7_di" bpmnElement="SequenceFlow_1tk5ru7">
-        <di:waypoint xsi:type="dc:Point" x="617" y="229" />
-        <di:waypoint xsi:type="dc:Point" x="675" y="229" />
+        <di:waypoint xsi:type="dc:Point" x="617" y="160" />
+        <di:waypoint xsi:type="dc:Point" x="675" y="160" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="601" y="208" width="90" height="12" />
+          <dc:Bounds x="601" y="139" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0td7d9m_di" bpmnElement="SequenceFlow_0td7d9m">
-        <di:waypoint xsi:type="dc:Point" x="700" y="254" />
-        <di:waypoint xsi:type="dc:Point" x="701" y="327" />
+        <di:waypoint xsi:type="dc:Point" x="700" y="185" />
+        <di:waypoint xsi:type="dc:Point" x="702" y="327" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="706.5002014596164" y="260.46992001430345" width="15" height="12" />
+          <dc:Bounds x="708" y="122" width="12" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="EndEvent_0a97jcr_di" bpmnElement="EndEvent_0a97jcr">
-        <dc:Bounds x="773" y="211" width="36" height="36" />
+        <dc:Bounds x="773" y="142" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="701" y="252" width="90" height="12" />
+          <dc:Bounds x="701" y="183" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0h5cld9_di" bpmnElement="SequenceFlow_0h5cld9">
-        <di:waypoint xsi:type="dc:Point" x="725" y="229" />
-        <di:waypoint xsi:type="dc:Point" x="773" y="229" />
+        <di:waypoint xsi:type="dc:Point" x="725" y="160" />
+        <di:waypoint xsi:type="dc:Point" x="773" y="160" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="729" y="235" width="20" height="12" />
+          <dc:Bounds x="730" y="166" width="18" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ExclusiveGateway_1qozral_di" bpmnElement="ExclusiveGateway_1qozral" isMarkerVisible="true">
@@ -652,9 +662,9 @@ createVfModule.queryAAIForVnfOrchestrationStatus(execution)]]></bpmn2:script>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_020dbkp_di" bpmnElement="SequenceFlow_020dbkp">
         <di:waypoint xsi:type="dc:Point" x="545" y="342" />
-        <di:waypoint xsi:type="dc:Point" x="545" y="269" />
+        <di:waypoint xsi:type="dc:Point" x="545" y="309" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="550" y="307" width="20" height="12" />
+          <dc:Bounds x="515" y="321.9537912405942" width="18" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0u8zesf_di" bpmnElement="SequenceFlow_0u8zesf">
@@ -674,6 +684,16 @@ createVfModule.queryAAIForVnfOrchestrationStatus(execution)]]></bpmn2:script>
       <bpmndi:BPMNShape id="ScriptTask_19vqej7_di" bpmnElement="Task_1o3z68c">
         <dc:Bounds x="460" y="-6" width="100" height="80" />
       </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_09i6f7t_di" bpmnElement="SequenceFlow_09i6f7t">
+        <di:waypoint xsi:type="dc:Point" x="545" y="229" />
+        <di:waypoint xsi:type="dc:Point" x="545" y="200" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="560" y="208.5" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ScriptTask_1s0bky7_di" bpmnElement="Task_09om99x">
+        <dc:Bounds x="495" y="229" width="100" height="80" />
+      </bpmndi:BPMNShape>
     </bpmndi:BPMNPlane>
   </bpmndi:BPMNDiagram>
 </bpmn2:definitions>
diff --git a/bpmn/MSOInfrastructureBPMN/src/main/resources/process/DeleteCustom3rdONAPServiceInstance.bpmn b/bpmn/MSOInfrastructureBPMN/src/main/resources/process/DeleteCustom3rdONAPServiceInstance.bpmn
new file mode 100644 (file)
index 0000000..e0747eb
--- /dev/null
@@ -0,0 +1,381 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="1.11.3">
+  <bpmn:process id="DeleteCustomE2EServiceInstance" isExecutable="true">
+    <bpmn:startEvent id="StartEvent_00m8zen" name="Delete SI Start Flow">
+      <bpmn:outgoing>SequenceFlow_1wxumid</bpmn:outgoing>
+    </bpmn:startEvent>
+    <bpmn:subProcess id="SubProcess_0amn8vu" name="Sub-process for UnexpectedErrors" triggeredByEvent="true">
+      <bpmn:scriptTask id="ScriptTask_1c6ogpt" name="Handle Unexpected Error" scriptFormat="groovy">
+        <bpmn:incoming>SequenceFlow_0guajy5</bpmn:incoming>
+        <bpmn:outgoing>SequenceFlow_0dbt753</bpmn:outgoing>
+        <bpmn:script><![CDATA[import org.openecomp.mso.bpmn.common.scripts.*
+ExceptionUtil ex = new ExceptionUtil()
+ex.processJavaException(execution)]]></bpmn:script>
+      </bpmn:scriptTask>
+      <bpmn:startEvent id="StartEvent_121296y">
+        <bpmn:outgoing>SequenceFlow_0guajy5</bpmn:outgoing>
+        <bpmn:errorEventDefinition />
+      </bpmn:startEvent>
+      <bpmn:endEvent id="EndEvent_1dw3dwx">
+        <bpmn:incoming>SequenceFlow_0dbt753</bpmn:incoming>
+      </bpmn:endEvent>
+      <bpmn:sequenceFlow id="SequenceFlow_0guajy5" name="" sourceRef="StartEvent_121296y" targetRef="ScriptTask_1c6ogpt" />
+      <bpmn:sequenceFlow id="SequenceFlow_0dbt753" name="" sourceRef="ScriptTask_1c6ogpt" targetRef="EndEvent_1dw3dwx" />
+    </bpmn:subProcess>
+    <bpmn:callActivity id="CallActivity_1vyx9hu" name="Call DoCustomDeleteE2EServiceInstance&#10;" calledElement="DoDeleteE2EServiceInstance">
+      <bpmn:extensionElements>
+        <camunda:out source="WorkflowException" target="WorkflowException" />
+        <camunda:in source="msoRequestId" target="msoRequestId" />
+        <camunda:in source="serviceInstanceId" target="serviceInstanceId" />
+        <camunda:in source="serviceInstanceName" target="serviceInstanceName" />
+        <camunda:in source="serviceModelInfo" target="serviceModelInfo" />
+        <camunda:in source="productFamilyId" target="productFamilyId" />
+        <camunda:in source="disableRollback" target="disableRollback" />
+        <camunda:in source="serviceInputParams" target="serviceInputParams" />
+        <camunda:in source="failIfExists" target="failIfExists" />
+        <camunda:in source="globalSubscriberId" target="globalSubscriberId" />
+        <camunda:in source="serviceType" target="serviceType" />
+        <camunda:in sourceExpression="1610" target="sdncVersion" />
+        <camunda:in source="operationId" target="operationId" />
+        <camunda:in source="operationType" target="operationType" />
+      </bpmn:extensionElements>
+      <bpmn:incoming>SequenceFlow_0zf2qyk</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_07hrbs0</bpmn:outgoing>
+    </bpmn:callActivity>
+    <bpmn:endEvent id="EndEvent_0db8bs6" name="End">
+      <bpmn:incoming>SequenceFlow_1ab5l2q</bpmn:incoming>
+    </bpmn:endEvent>
+    <bpmn:scriptTask id="ScriptTask_0a63hms" name="Pre Process Incoming Request" scriptFormat="groovy">
+      <bpmn:incoming>SequenceFlow_1wxumid</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0yowshs</bpmn:outgoing>
+      <bpmn:script><![CDATA[import org.openecomp.mso.bpmn.infrastructure.scripts.*
+def csi= new DeleteCustomE2EServiceInstance()
+csi.preProcessRequest(execution)]]></bpmn:script>
+    </bpmn:scriptTask>
+    <bpmn:scriptTask id="ScriptTask_1fzpbop" name="Prepare Completion Request" scriptFormat="groovy">
+      <bpmn:incoming>SequenceFlow_04urx2e</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_1ii935p</bpmn:outgoing>
+      <bpmn:script><![CDATA[import org.openecomp.mso.bpmn.infrastructure.scripts.*
+def csi = new DeleteCustomE2EServiceInstance()
+csi.prepareCompletionRequest(execution)]]></bpmn:script>
+    </bpmn:scriptTask>
+    <bpmn:callActivity id="CallActivity_1wx4ihe" name="Call CompleteMsoProcess" calledElement="CompleteMsoProcess">
+      <bpmn:extensionElements>
+        <camunda:in source="completionRequest" target="CompleteMsoProcessRequest" />
+        <camunda:in source="mso-request-id" target="mso-request-id" />
+        <camunda:in source="mso-service-instance-id" target="mso-service-instance-id" />
+        <camunda:out source="CMSO_ResponseCode" target="CMSO_ResponseCode" />
+        <camunda:out source="CompleteMsoProcessResponse" target="CompleteMsoProcessResponse" />
+        <camunda:out source="CMSO_ErrorResponse" target="CMSO_ErrorResponse" />
+      </bpmn:extensionElements>
+      <bpmn:incoming>SequenceFlow_1ii935p</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_1ab5l2q</bpmn:outgoing>
+    </bpmn:callActivity>
+    <bpmn:subProcess id="SubProcess_1vbcima" name="Sub-process for FalloutHandler " triggeredByEvent="true">
+      <bpmn:startEvent id="StartEvent_0jybicw">
+        <bpmn:outgoing>SequenceFlow_0for83z</bpmn:outgoing>
+        <bpmn:errorEventDefinition />
+      </bpmn:startEvent>
+      <bpmn:endEvent id="EndEvent_1jegbhy">
+        <bpmn:incoming>SequenceFlow_0hrazlh</bpmn:incoming>
+      </bpmn:endEvent>
+      <bpmn:scriptTask id="ScriptTask_0so3xj0" name="Prepare Fallout Request" scriptFormat="groovy">
+        <bpmn:incoming>SequenceFlow_1s1cbgf</bpmn:incoming>
+        <bpmn:outgoing>SequenceFlow_1py6yqz</bpmn:outgoing>
+        <bpmn:script><![CDATA[import org.openecomp.mso.bpmn.infrastructure.scripts.*
+def csi = new DeleteCustomE2EServiceInstance()
+csi.prepareFalloutRequest(execution)]]></bpmn:script>
+      </bpmn:scriptTask>
+      <bpmn:callActivity id="CallActivity_1qhekgt" name="Call FalloutHandler" calledElement="FalloutHandler">
+        <bpmn:extensionElements>
+          <camunda:in source="falloutRequest" target="FalloutHandlerRequest" />
+          <camunda:in source="mso-request-id" target="mso-request-id" />
+          <camunda:in source="mso-service-instance-id" target="mso-service-instance-id" />
+          <camunda:out source="FH_ResponseCode" target="FH_ResponseCode" />
+          <camunda:out source="FalloutHandlerResponse" target="FalloutHandlerResponse" />
+          <camunda:out source="FH_ErrorResponse" target="FH_ErrorResponse" />
+        </bpmn:extensionElements>
+        <bpmn:incoming>SequenceFlow_1py6yqz</bpmn:incoming>
+        <bpmn:outgoing>SequenceFlow_0hrazlh</bpmn:outgoing>
+      </bpmn:callActivity>
+      <bpmn:scriptTask id="ScriptTask_006nty7" name="Send Error Response">
+        <bpmn:incoming>SequenceFlow_0for83z</bpmn:incoming>
+        <bpmn:outgoing>SequenceFlow_1s1cbgf</bpmn:outgoing>
+        <bpmn:script><![CDATA[import org.openecomp.mso.bpmn.infrastructure.scripts.*
+def csi = new  DeleteCustomE2EServiceInstance()
+csi.sendSyncError(execution)]]></bpmn:script>
+      </bpmn:scriptTask>
+      <bpmn:sequenceFlow id="SequenceFlow_0for83z" sourceRef="StartEvent_0jybicw" targetRef="ScriptTask_006nty7" />
+      <bpmn:sequenceFlow id="SequenceFlow_0hrazlh" sourceRef="CallActivity_1qhekgt" targetRef="EndEvent_1jegbhy" />
+      <bpmn:sequenceFlow id="SequenceFlow_1s1cbgf" sourceRef="ScriptTask_006nty7" targetRef="ScriptTask_0so3xj0" />
+      <bpmn:sequenceFlow id="SequenceFlow_1py6yqz" sourceRef="ScriptTask_0so3xj0" targetRef="CallActivity_1qhekgt" />
+    </bpmn:subProcess>
+    <bpmn:scriptTask id="ScriptTask_1mao77y" name="Send Sync Ack Response" scriptFormat="groovy">
+      <bpmn:incoming>SequenceFlow_1dkcu9o</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0zf2qyk</bpmn:outgoing>
+      <bpmn:script><![CDATA[import org.openecomp.mso.bpmn.infrastructure.scripts.*
+def csi = new  DeleteCustomE2EServiceInstance()
+csi.sendSyncResponse(execution)]]></bpmn:script>
+    </bpmn:scriptTask>
+    <bpmn:exclusiveGateway id="ExclusiveGateway_0vu8gx6" name="Success?" default="SequenceFlow_1t6ekab">
+      <bpmn:incoming>SequenceFlow_07hrbs0</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_04urx2e</bpmn:outgoing>
+      <bpmn:outgoing>SequenceFlow_1t6ekab</bpmn:outgoing>
+    </bpmn:exclusiveGateway>
+    <bpmn:endEvent id="EndEvent_1i1g9s6">
+      <bpmn:incoming>SequenceFlow_1t6ekab</bpmn:incoming>
+      <bpmn:errorEventDefinition errorRef="Error_1erlsmy" />
+    </bpmn:endEvent>
+    <bpmn:sequenceFlow id="SequenceFlow_1wxumid" sourceRef="StartEvent_00m8zen" targetRef="ScriptTask_0a63hms" />
+    <bpmn:sequenceFlow id="SequenceFlow_0zf2qyk" sourceRef="ScriptTask_1mao77y" targetRef="CallActivity_1vyx9hu" />
+    <bpmn:sequenceFlow id="SequenceFlow_07hrbs0" sourceRef="CallActivity_1vyx9hu" targetRef="ExclusiveGateway_0vu8gx6" />
+    <bpmn:sequenceFlow id="SequenceFlow_1ab5l2q" sourceRef="CallActivity_1wx4ihe" targetRef="EndEvent_0db8bs6" />
+    <bpmn:sequenceFlow id="SequenceFlow_0yowshs" sourceRef="ScriptTask_0a63hms" targetRef="Task_1jksf62" />
+    <bpmn:sequenceFlow id="SequenceFlow_04urx2e" name="yes" sourceRef="ExclusiveGateway_0vu8gx6" targetRef="ScriptTask_1fzpbop">
+      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression"><![CDATA[#{execution.getVariable("WorkflowException") == null}]]></bpmn:conditionExpression>
+    </bpmn:sequenceFlow>
+    <bpmn:sequenceFlow id="SequenceFlow_1ii935p" sourceRef="ScriptTask_1fzpbop" targetRef="CallActivity_1wx4ihe" />
+    <bpmn:sequenceFlow id="SequenceFlow_1t6ekab" name="no" sourceRef="ExclusiveGateway_0vu8gx6" targetRef="EndEvent_1i1g9s6" />
+    <bpmn:sequenceFlow id="SequenceFlow_0c4t26p" sourceRef="Task_1jksf62" targetRef="ServiceTask_0j9q5xe" />
+    <bpmn:scriptTask id="Task_1jksf62" name="prepare init operation status" scriptFormat="groovy">
+      <bpmn:incoming>SequenceFlow_0yowshs</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0c4t26p</bpmn:outgoing>
+      <bpmn:script><![CDATA[import org.openecomp.mso.bpmn.infrastructure.scripts.*
+def csi= new DeleteCustomE2EServiceInstance()
+csi.prepareInitServiceOperationStatus(execution)]]></bpmn:script>
+    </bpmn:scriptTask>
+    <bpmn:serviceTask id="ServiceTask_0j9q5xe" 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_0c4t26p</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_1dkcu9o</bpmn:outgoing>
+    </bpmn:serviceTask>
+    <bpmn:sequenceFlow id="SequenceFlow_1dkcu9o" sourceRef="ServiceTask_0j9q5xe" targetRef="ScriptTask_1mao77y" />
+  </bpmn:process>
+  <bpmn:error id="Error_1erlsmy" name="MSO Workflow Exception" errorCode="MSOWorkflowException" />
+  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
+    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="DeleteCustomE2EServiceInstance">
+      <bpmndi:BPMNShape id="StartEvent_00m8zen_di" bpmnElement="StartEvent_00m8zen">
+        <dc:Bounds x="490" y="209" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="471" y="250" width="74" height="24" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="SubProcess_0amn8vu_di" bpmnElement="SubProcess_0amn8vu" isExpanded="true">
+        <dc:Bounds x="834" y="660" width="394" height="188" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="CallActivity_1vyx9hu_di" bpmnElement="CallActivity_1vyx9hu">
+        <dc:Bounds x="1121" y="187" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="EndEvent_0db8bs6_di" bpmnElement="EndEvent_0db8bs6">
+        <dc:Bounds x="1646" y="304" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1657" y="340" width="19" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_0a63hms_di" bpmnElement="ScriptTask_0a63hms">
+        <dc:Bounds x="562" y="187" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_1fzpbop_di" bpmnElement="ScriptTask_1fzpbop">
+        <dc:Bounds x="1453" y="187" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="CallActivity_1wx4ihe_di" bpmnElement="CallActivity_1wx4ihe">
+        <dc:Bounds x="1614" y="187" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="SubProcess_1vbcima_di" bpmnElement="SubProcess_1vbcima" isExpanded="true">
+        <dc:Bounds x="736" y="374" width="679" height="194" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_1mao77y_di" bpmnElement="ScriptTask_1mao77y">
+        <dc:Bounds x="970" y="187" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ExclusiveGateway_0vu8gx6_di" bpmnElement="ExclusiveGateway_0vu8gx6" isMarkerVisible="true">
+        <dc:Bounds x="1318" y="202" width="50" height="50" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1318" y="174" width="49" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="EndEvent_1i1g9s6_di" bpmnElement="EndEvent_1i1g9s6">
+        <dc:Bounds x="1325" y="304" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1298" y="340" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_1wxumid_di" bpmnElement="SequenceFlow_1wxumid">
+        <di:waypoint xsi:type="dc:Point" x="526" y="227" />
+        <di:waypoint xsi:type="dc:Point" x="562" y="227" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="499" y="206" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0zf2qyk_di" bpmnElement="SequenceFlow_0zf2qyk">
+        <di:waypoint xsi:type="dc:Point" x="1070" y="227" />
+        <di:waypoint xsi:type="dc:Point" x="1121" y="227" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1050.5" y="206" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_07hrbs0_di" bpmnElement="SequenceFlow_07hrbs0">
+        <di:waypoint xsi:type="dc:Point" x="1221" y="227" />
+        <di:waypoint xsi:type="dc:Point" x="1318" y="227" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1225.5" y="212" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1ab5l2q_di" bpmnElement="SequenceFlow_1ab5l2q">
+        <di:waypoint xsi:type="dc:Point" x="1664" y="267" />
+        <di:waypoint xsi:type="dc:Point" x="1664" y="304" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1634" y="279.5" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0yowshs_di" bpmnElement="SequenceFlow_0yowshs">
+        <di:waypoint xsi:type="dc:Point" x="662" y="227" />
+        <di:waypoint xsi:type="dc:Point" x="707" y="227" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="639.5" y="206" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_04urx2e_di" bpmnElement="SequenceFlow_04urx2e">
+        <di:waypoint xsi:type="dc:Point" x="1368" y="227" />
+        <di:waypoint xsi:type="dc:Point" x="1453" y="227" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1370.25" y="203" width="18" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1ii935p_di" bpmnElement="SequenceFlow_1ii935p">
+        <di:waypoint xsi:type="dc:Point" x="1553" y="227" />
+        <di:waypoint xsi:type="dc:Point" x="1614" y="227" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1495" y="212" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1t6ekab_di" bpmnElement="SequenceFlow_1t6ekab">
+        <di:waypoint xsi:type="dc:Point" x="1343" y="252" />
+        <di:waypoint xsi:type="dc:Point" x="1343" y="277" />
+        <di:waypoint xsi:type="dc:Point" x="1343" y="277" />
+        <di:waypoint xsi:type="dc:Point" x="1343" y="304" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1352" y="277" width="12" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ScriptTask_1c6ogpt_di" bpmnElement="ScriptTask_1c6ogpt">
+        <dc:Bounds x="982" y="715" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="StartEvent_121296y_di" bpmnElement="StartEvent_121296y">
+        <dc:Bounds x="867" y="737" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="795" y="778" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="EndEvent_1dw3dwx_di" bpmnElement="EndEvent_1dw3dwx">
+        <dc:Bounds x="1143" y="737" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1071" y="778" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="StartEvent_0jybicw_di" bpmnElement="StartEvent_0jybicw">
+        <dc:Bounds x="752" y="460" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="680" y="501" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="EndEvent_1jegbhy_di" bpmnElement="EndEvent_1jegbhy">
+        <dc:Bounds x="1331" y="460" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1259" y="501" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_0so3xj0_di" bpmnElement="ScriptTask_0so3xj0">
+        <dc:Bounds x="1010" y="438" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="CallActivity_1qhekgt_di" bpmnElement="CallActivity_1qhekgt">
+        <dc:Bounds x="1187" y="438" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_006nty7_di" bpmnElement="ScriptTask_006nty7">
+        <dc:Bounds x="832" y="438" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_0guajy5_di" bpmnElement="SequenceFlow_0guajy5">
+        <di:waypoint xsi:type="dc:Point" x="903" y="755" />
+        <di:waypoint xsi:type="dc:Point" x="982" y="755" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="856" y="755" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0dbt753_di" bpmnElement="SequenceFlow_0dbt753">
+        <di:waypoint xsi:type="dc:Point" x="1082" y="755" />
+        <di:waypoint xsi:type="dc:Point" x="1143" y="755" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1028" y="755" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0for83z_di" bpmnElement="SequenceFlow_0for83z">
+        <di:waypoint xsi:type="dc:Point" x="788" y="478" />
+        <di:waypoint xsi:type="dc:Point" x="810" y="478" />
+        <di:waypoint xsi:type="dc:Point" x="810" y="478" />
+        <di:waypoint xsi:type="dc:Point" x="831" y="478" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="735" y="478" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0hrazlh_di" bpmnElement="SequenceFlow_0hrazlh">
+        <di:waypoint xsi:type="dc:Point" x="1287" y="478" />
+        <di:waypoint xsi:type="dc:Point" x="1331" y="478" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1219" y="463" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1s1cbgf_di" bpmnElement="SequenceFlow_1s1cbgf">
+        <di:waypoint xsi:type="dc:Point" x="932" y="478" />
+        <di:waypoint xsi:type="dc:Point" x="959" y="478" />
+        <di:waypoint xsi:type="dc:Point" x="959" y="478" />
+        <di:waypoint xsi:type="dc:Point" x="1010" y="478" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="884" y="478" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1py6yqz_di" bpmnElement="SequenceFlow_1py6yqz">
+        <di:waypoint xsi:type="dc:Point" x="1110" y="478" />
+        <di:waypoint xsi:type="dc:Point" x="1187" y="478" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1060" y="463" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0c4t26p_di" bpmnElement="SequenceFlow_0c4t26p">
+        <di:waypoint xsi:type="dc:Point" x="807" y="227" />
+        <di:waypoint xsi:type="dc:Point" x="833" y="227" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="820" y="206" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ScriptTask_1joo7s7_di" bpmnElement="Task_1jksf62">
+        <dc:Bounds x="707" y="187" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ServiceTask_0j9q5xe_di" bpmnElement="ServiceTask_0j9q5xe">
+        <dc:Bounds x="833" y="187" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_1dkcu9o_di" bpmnElement="SequenceFlow_1dkcu9o">
+        <di:waypoint xsi:type="dc:Point" x="933" y="227" />
+        <di:waypoint xsi:type="dc:Point" x="970" y="227" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="951.5" y="206" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+    </bpmndi:BPMNPlane>
+  </bpmndi:BPMNDiagram>
+</bpmn:definitions>
index 675b8fa..8cbc7e9 100644 (file)
@@ -40,6 +40,7 @@ doCreateVnfAndModules.preProcessRequest(execution)]]></bpmn:script>
         <camunda:in source="tenantId" target="tenantId" />
         <camunda:in source="false" target="usePreload" />
         <camunda:in source="aLaCarte" target="aLaCarte" />
+        <camunda:in source="RegionOne_flavorList" target="RegionOne_flavorList" />
       </bpmn:extensionElements>
       <bpmn:incoming>SequenceFlow_1hf7k7q</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_1ixcnb6</bpmn:outgoing>
@@ -127,6 +128,7 @@ doCreateVnfAndModules.validateAddOnModule(execution)]]></bpmn:script>
         <camunda:in source="tenantId" target="tenantId" />
         <camunda:in source="rollbackData" target="rollbackData" />
         <camunda:in source="vnfResourceDecomposition" target="vnfResourceDecomposition" />
+        <camunda:in source="RegionOne_flavorList" target="RegionOne_flavorList" />
       </bpmn:extensionElements>
       <bpmn:incoming>SequenceFlow_19ohb1a</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_07u8e3l</bpmn:outgoing>
index 35cd039..41c9a67 100644 (file)
@@ -156,17 +156,17 @@ csi.postConfigRequest(execution)]]></bpmn2:script>
       <bpmn2:scriptTask id="ScriptTask_1awrp72" name="Pre Process Exception" scriptFormat="groovy">
         <bpmn2:incoming>SequenceFlow_05j3sat</bpmn2:incoming>
         <bpmn2:outgoing>SequenceFlow_19ly8h7</bpmn2:outgoing>
-        <bpmn2:script><![CDATA[import org.openecomp.mso.bpmn.infrastructure.scripts.*\r
-def dcsi = new DoCreateResources()\r
-dcsi.preProcessRollback(execution)\r
+        <bpmn2:script><![CDATA[import org.openecomp.mso.bpmn.infrastructure.scripts.*
+def dcsi = new DoUpdateE2EServiceInstance()
+dcsi.preProcessRollback(execution)
 ]]></bpmn2:script>
       </bpmn2:scriptTask>
       <bpmn2:scriptTask id="ScriptTask_0vc9jgo" name="Post Process Exception" scriptFormat="groovy">
         <bpmn2:incoming>SequenceFlow_19ly8h7</bpmn2:incoming>
         <bpmn2:outgoing>SequenceFlow_02znk15</bpmn2:outgoing>
-        <bpmn2:script><![CDATA[import org.openecomp.mso.bpmn.infrastructure.scripts.*\r
-def dcsi = new DoCreateResources()\r
-dcsi.postProcessRollback(execution)\r
+        <bpmn2:script><![CDATA[import org.openecomp.mso.bpmn.infrastructure.scripts.*
+def dcsi = new DoUpdateE2EServiceInstance()
+dcsi.postProcessRollback(execution)
 ]]></bpmn2:script>
       </bpmn2:scriptTask>
       <bpmn2:sequenceFlow id="SequenceFlow_05j3sat" sourceRef="StartEvent_06768u3" targetRef="ScriptTask_1awrp72" />
index 5b5a700..c301b65 100644 (file)
@@ -1,6 +1,7 @@
 package org.openecomp.mso.bpmn.infrastructure.scripts
 
 import com.github.tomakehurst.wiremock.junit.WireMockRule
+import org.camunda.bpm.engine.delegate.BpmnError
 import org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity
 import org.junit.Before
 import org.junit.BeforeClass
@@ -8,18 +9,14 @@ import org.junit.Ignore
 import org.junit.Rule
 import org.junit.Test
 import org.mockito.MockitoAnnotations
-import org.openecomp.mso.bpmn.infrastructure.scripts.DoCustomDeleteE2EServiceInstance
 import org.openecomp.mso.bpmn.mock.FileUtil
 import org.openecomp.mso.bpmn.vcpe.scripts.GroovyTestBase
 
+import static org.assertj.core.api.Assertions.assertThatThrownBy
+import static org.mockito.Matchers.anyString
 import static org.mockito.Mockito.verify
 import static org.mockito.Mockito.when
-import static org.mockito.Mockito.when
-import static org.mockito.Mockito.when
-import static org.mockito.Mockito.when
-import static org.mockito.Mockito.when
-import static org.mockito.Mockito.when
-import static org.mockito.Mockito.when
+import static org.mockito.Mockito.eq
 
 class DoCustomDeleteE2EServiceInstanceTest extends GroovyTestBase {
 
@@ -58,9 +55,8 @@ class DoCustomDeleteE2EServiceInstanceTest extends GroovyTestBase {
         verify(mex).setVariable("siParamsXml", "")
     }
 
-    @Ignore
     @Test
-    public void postProcessAAIGETTest(){
+    public void postProcessAAIGETSuccessTest(){
         ExecutionEntity mex = setupMock()
         def map = setupMap(mex)
         initPreProcess(mex)
@@ -70,11 +66,22 @@ class DoCustomDeleteE2EServiceInstanceTest extends GroovyTestBase {
         when(mex.getVariable("GENGS_service")).thenReturn(aaiGetResponse)
         DoCustomDeleteE2EServiceInstance instance = new DoCustomDeleteE2EServiceInstance()
         instance.postProcessAAIGET(mex)
-               // TODO: what to test here?
-//        verify(mex).setVariable("subscriptionServiceType", "e2eserviceInstance/delete")
+
+        verify(mex).setVariable(eq("serviceRelationShip"), anyString())
+    }
+
+    @Test
+    public void postProcessAAIGETFailureTest(){
+        ExecutionEntity mex = setupMock()
+        def map = setupMap(mex)
+        initPreProcess(mex)
+        when(mex.getVariable("GENGS_FoundIndicator")).thenReturn(false)
+        when(mex.getVariable("GENGS_SuccessIndicator")).thenReturn(false)
+
+        DoCustomDeleteE2EServiceInstance instance = new DoCustomDeleteE2EServiceInstance()
+        assertThatThrownBy { instance.postProcessAAIGET(mex) } isInstanceOf BpmnError.class
     }
 
-    @Ignore
     @Test
     public void preInitResourcesOperStatusTest(){
         ExecutionEntity mex = setupMock()
@@ -83,8 +90,8 @@ class DoCustomDeleteE2EServiceInstanceTest extends GroovyTestBase {
         when(mex.getVariable("serviceRelationShip")).thenReturn("[{\"resourceInstanceId\":\"3333\",\"resourceType\":\"overlay\"},{\"resourceInstanceId\":\"4444\",\"resourceType\":\"underlay\"},{\"resourceInstanceId\":\"1111\",\"resourceType\":\"vIMS\"},{\"resourceInstanceId\":\"222\",\"resourceType\":\"vEPC\"}]")
         DoCustomDeleteE2EServiceInstance instance = new DoCustomDeleteE2EServiceInstance()
         instance.preInitResourcesOperStatus(mex)
-               // TODO: what to test here?
-//        verify(mex).setVariable("CVFMI_dbAdapterEndpoint", "http://localhost:8080/mso")
+
+        verify(mex).setVariable(eq("CVFMI_initResOperStatusRequest"), anyString())
     }
 
     @Test
@@ -98,7 +105,6 @@ class DoCustomDeleteE2EServiceInstanceTest extends GroovyTestBase {
         verify(mex).setVariable("resourceType", "overlay")
     }
 
-    @Ignore
     @Test
     public void postProcessSDNCDeleteTest(){
         ExecutionEntity mex = setupMock()
@@ -111,8 +117,7 @@ class DoCustomDeleteE2EServiceInstanceTest extends GroovyTestBase {
         String response = FileUtil.readResourceFile("__files/GenericFlows/SDNCDeleteResponse.xml")
         String method = "deleteE2E";
         instance.postProcessSDNCDelete(mex, response, method)
-               // TODO: what to test here?
-//        verify(mex).setVariable("DDELSI_sdncRequestDataResponseCode", "0")
+               // following method doesn't do anything currently -> nothing to check
     }
 
     @Test
index e7ffe05..063f4b5 100644 (file)
@@ -89,7 +89,6 @@ class SacleCustomE2EServiceInstanceTest{
                             <ns:updateServiceOperationStatus xmlns:ns="http://org.openecomp.mso/requestsdb">
                             <serviceId>56c881ad-6c9d-4b79-aacc-401e5640b47f</serviceId>
                             <operationId>0a5b1651-c56e-4263-8c26-c8f8a6ef72d8</operationId>
-                            <serviceName>XXXX</serviceName>
                             <operationType>SCALE</operationType>
                             <userId></userId>
                             <result>processing</result>
@@ -163,7 +162,7 @@ class SacleCustomE2EServiceInstanceTest{
         ExecutionEntity mockExecution = mock(ExecutionEntity.class)
 
         when(mockExecution.getVariable("serviceInstanceId")).thenReturn("56c881ad-6c9d-4b79-aacc-401e5640b47f")
-        when(mockExecution.getVariable("serviceInstanceName")).thenReturn("XXXX")
+        //when(mockExecution.getVariable("serviceInstanceName")).thenReturn("XXXX")
         when(mockExecution.getVariable("operationId")).thenReturn("0a5b1651-c56e-4263-8c26-c8f8a6ef72d8")
 
         ScaleCustomE2EServiceInstance scaleCustomE2EServiceInstance = new ScaleCustomE2EServiceInstance()
index a735121..a8401d7 100644 (file)
@@ -469,7 +469,7 @@ class CreateVcpeResCustServiceTest extends GroovyTestBase {
                verify(mex).setVariable("createTXCAR", true)
                verify(mex).setVariable("allottedResourceModelInfoTXC", "modelB")
                verify(mex).setVariable("allottedResourceRoleTXC", "TXCr")
-               verify(mex).setVariable("allottedResourceTypeTXC", "TunnelXConn")
+               verify(mex).setVariable("allottedResourceTypeTXC", "Tunnel XConn")
                verify(mex).setVariable("parentServiceInstanceIdTXC", "homeB")
        }
                        
@@ -489,7 +489,7 @@ class CreateVcpeResCustServiceTest extends GroovyTestBase {
                verify(mex, never()).setVariable("createTXCAR", true)
                verify(mex, never()).setVariable("allottedResourceModelInfoTXC", "modelB")
                verify(mex, never()).setVariable("allottedResourceRoleTXC", "TXCr")
-               verify(mex, never()).setVariable("allottedResourceTypeTXC", "TunnelXConn")
+               verify(mex, never()).setVariable("allottedResourceTypeTXC", "Tunnel XConn")
                verify(mex, never()).setVariable("parentServiceInstanceIdTXC", "homeB")
        }
                        
@@ -1087,7 +1087,7 @@ class CreateVcpeResCustServiceTest extends GroovyTestBase {
        private ServiceDecomposition initFilterVnfs(ExecutionEntity mex) {
                List<VnfResource> vnflst = new LinkedList<>()
                vnflst.add(makeVnf("", "BRG"))
-               vnflst.add(makeVnf("2", "TunnelXConn"))
+               vnflst.add(makeVnf("2", "Tunnel XConn"))
                vnflst.add(makeVnf("3", ""))
                vnflst.add(makeVnf("4", "BRG"))
                vnflst.add(makeVnf("5", "other"))
@@ -1149,7 +1149,7 @@ class CreateVcpeResCustServiceTest extends GroovyTestBase {
                HomingSolution home = mock(HomingSolution.class)
                
                when(ar.toJsonStringNoRootName()).thenReturn("json"+id)
-               when(ar.getAllottedResourceType()).thenReturn("TunnelXConn")
+               when(ar.getAllottedResourceType()).thenReturn("Tunnel XConn")
                when(ar.getModelInfo()).thenReturn(mod)
                when(ar.getAllottedResourceRole()).thenReturn("TXCr")
                when(ar.getHomingSolution()).thenReturn(home)
@@ -1186,7 +1186,7 @@ class CreateVcpeResCustServiceTest extends GroovyTestBase {
                vnflst.add(makeVnf("A", "BRG"))
                vnflst.add(makeVnf("B", ""))
                vnflst.add(makeVnf("C", ""))
-               vnflst.add(makeVnf("D", "TunnelXConn"))
+               vnflst.add(makeVnf("D", "Tunnel XConn"))
                
                when(mex.getVariable(DBGFLAG)).thenReturn("true")
                when(mex.getVariable("createVcpeServiceRequest")).thenReturn(request)
index bb7f4c2..f206344 100644 (file)
@@ -1,9 +1,9 @@
 <allotted-resource xmlns="http://org.openecomp.aai.inventory/v9">
    <id>ar-1</id>
    <orchestration-status>Active</orchestration-status>
-   <role>TunnelXConn</role>
-   <type>TunnelXConn</type>
-   <description>TunnelXConn</description>
+   <role>Tunnel XConn</role>
+   <type>Tunnel XConn</type>
+   <description>Tunnel XConn</description>
    <selflink/>
    <resource-version>1490627351232</resource-version>
    <relationship-list>
index 81fdcc7..e99dd9c 100644 (file)
@@ -63,8 +63,8 @@
                                "modelInstanceName"      : "Pri_IP_MUX_Demux 1"
                        },
                        "toscaNodeType"              : null,
-                       "allottedResourceType"              : "TunnelXConn",
-                       "allottedResourceRole"              : "TunnelXConn",
+                       "allottedResourceType"              : "Tunnel XConn",
+                       "allottedResourceRole"              : "Tunnel XConn",
                        "providingServiceModelInvariantUuid"              : null,
                        "nfFunction"              : null,
                        "nfType"              : null,
index 65cee9f..97992fc 100644 (file)
@@ -1,9 +1,9 @@
 <allotted-resource xmlns="http://org.openecomp.aai.inventory/v9">
    <id>ar-txcA</id>
    <orchestration-status>Active</orchestration-status>
-   <role>TunnelXConn</role>
-   <type>TunnelXConn</type>
-   <description>TunnelXConn</description>
+   <role>Tunnel XConn</role>
+   <type>Tunnel XConn</type>
+   <description>Tunnel XConn</description>
    <selflink/>
    <resource-version>1490627351232</resource-version>
    <relationship-list>
index bb7f4c2..f206344 100644 (file)
@@ -1,9 +1,9 @@
 <allotted-resource xmlns="http://org.openecomp.aai.inventory/v9">
    <id>ar-1</id>
    <orchestration-status>Active</orchestration-status>
-   <role>TunnelXConn</role>
-   <type>TunnelXConn</type>
-   <description>TunnelXConn</description>
+   <role>Tunnel XConn</role>
+   <type>Tunnel XConn</type>
+   <description>Tunnel XConn</description>
    <selflink/>
    <resource-version>1490627351232</resource-version>
    <relationship-list>
index bb7f4c2..f206344 100644 (file)
@@ -1,9 +1,9 @@
 <allotted-resource xmlns="http://org.openecomp.aai.inventory/v9">
    <id>ar-1</id>
    <orchestration-status>Active</orchestration-status>
-   <role>TunnelXConn</role>
-   <type>TunnelXConn</type>
-   <description>TunnelXConn</description>
+   <role>Tunnel XConn</role>
+   <type>Tunnel XConn</type>
+   <description>Tunnel XConn</description>
    <selflink/>
    <resource-version>1490627351232</resource-version>
    <relationship-list>
index fc84d9e..6dac08d 100644 (file)
@@ -114,10 +114,10 @@ policy.environment=TEST
 policy.endpoint=http://localhost:28090/pdp/api/\r
 policy.default.disposition=Skip\r
 \r
-appc.client.topic.read=APPC-CL-FUSION-LCM-RESPONSE\r
-appc.client.topic.write=APPC-CL-FUSION-LCM\r
-appc.client.topic.sdnc.read=SDNC-LCM-READ\r
-appc.client.topic.sdnc.write=SDNC-LCM-WRITE\r
+appc.client.topic.read=APPC-LCM-WRITE \r
+appc.client.topic.write=APPC-LCM-READ \r
+appc.client.topic.sdnc.read=SDNC-LCM-WRITE \r
+appc.client.topic.sdnc.write=SDNC-LCM-READ\r
 appc.client.topic.read.timeout=100\r
 appc.client.response.timeout=300\r
 appc.client.poolMembers=localhost:28090\r
index aa3b095..86b9f36 100644 (file)
                 <dependency>
                     <groupId>org.onap.appc.client</groupId>
                     <artifactId>client-kit</artifactId>
-                    <version>1.3.0-SNAPSHOT</version>
+                    <version>1.3.0</version>
                 </dependency>
                 <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.springframework</groupId>
index 5712691..22a76a4 100644 (file)
@@ -1,6 +1,6 @@
 .. This work is licensed under a Creative Commons Attribution 4.0 International License.\r
 .. http://creativecommons.org/licenses/by/4.0\r
-.. Copyright 2017 Huawei Technologies Co., Ltd.\r
+.. Copyright 2018 Huawei Technologies Co., Ltd.\r
 \r
 Install Docker\r
 ===============\r
similarity index 95%
rename from docs/SO_R1_Interface.rst
rename to docs/SO_Interface.rst
index bd65408..15e75fa 100644 (file)
@@ -1,11 +1,11 @@
 .. This work is licensed under a Creative Commons Attribution 4.0 International License.
 .. http://creativecommons.org/licenses/by/4.0
-.. Copyright 2017 Huawei Technologies Co., Ltd.
+.. Copyright 2018 Huawei Technologies Co., Ltd.
 
 SO Interfaces
 ================================
 
-.. image:: images/SO_R1_1.png
+.. image:: images/SO_1.png
 
 SO APIs
 =================================
@@ -1771,33 +1771,65 @@ Service Object
 +------------------------------+-----------------+------------------------------------+
 |Attribute                     |Content          |Description                         |
 +==============================+=================+====================================+
-|modelName                     |String           |Service instance name.              |
+|name                          |String           |Service instance name.              |
 +------------------------------+-----------------+------------------------------------+
 |description                   |String           |Service instance description        |
 +------------------------------+-----------------+------------------------------------+
-|modelUUID                     |String           |Model UUID                          |
+|serviceUuid                   |String           |Model UUID                          |
 +------------------------------+-----------------+------------------------------------+
-|modelInvariantUUID            |String           |Model Invariant UUID                |
+|serviceInvariantUuid          |String           |Model Invariant UUID                |
 +------------------------------+-----------------+------------------------------------+
-|created                       |Timestamp        |Cretaed Timestamp                   |
+|gloabalSubscriberId           |String           |Customer Id                         |
 +------------------------------+-----------------+------------------------------------+
-|toscaCsarArtifactUUID         |String           |tosca Csar Artifact UUID            |
+|serviceType                   |String           |service Type                        |
 +------------------------------+-----------------+------------------------------------+
-|modelVersion                  |String           |Model Version                       |
+|parameters                    |Object           |Parameter Object                    |
 +------------------------------+-----------------+------------------------------------+
-|category                      |String           |category                            |
+
+Parameter Object
+
 +------------------------------+-----------------+------------------------------------+
-|serviceType                   |String           |service Type                        |
+|Attribute                     |Content          |Description                         |
++==============================+=================+====================================+
+|locationConstraints           |List of object   |location infor for each vnf         |
++------------------------------+-----------------+------------------------------------+
+|resource                      |List of Resource |resource of service/resource        |
++------------------------------+-----------------+------------------------------------+
+|requestInputs                 |key-value map    |input of service/resource
++------------------------------+-----------------+------------------------------------+
+
+LocationConstraint Object
+
++------------------------------+-----------------+------------------------------------+
+|Attribute                     |Content          |Description                         |
++==============================+=================+====================================+
+|vnfProfileId                  |String           |Customization id for VNF            |
++------------------------------+-----------------+------------------------------------+
+|locationConstraints           |Object           |DC location info of VNF             |
 +------------------------------+-----------------+------------------------------------+
-|serviceRole                   |String           |service Role                        |
+
+VnfLocationConstraint Object
+
++------------------------------+-----------------+------------------------------------+
+|Attribute                     |Content          |Description                         |
++==============================+=================+====================================+
+|vimId                         |String           |VIM id from ESR definition          |
++------------------------------+-----------------+------------------------------------+
+
+Resource Object
+
++------------------------------+-----------------+------------------------------------+
+|Attribute                     |Content          |Description                         |
++==============================+=================+====================================+
+|resourceName                  |String           |The resource name                   |
 +------------------------------+-----------------+------------------------------------+
-|environmentContext            |String           |environment Context                 |
+|resourceInvariantUuid         |String           |The resource invariant UUID.        |
 +------------------------------+-----------------+------------------------------------+
-|workloadContext               |String           |workload Context                    |
+|resourceUuid                  |String           |The resource UUID.                  |
 +------------------------------+-----------------+------------------------------------+
-|recipes                       |Object           |recipes                             |
+|resourceCustomizationUuid     |String           |The resource customization UUID.    |
 +------------------------------+-----------------+------------------------------------+
-|serviceResourceCustomizations |Object           |serviceResourceCustomizations       |
+|parameters                    |Object           |Parameter of resource               |
 +------------------------------+-----------------+------------------------------------+
 
 Response:
@@ -4257,4 +4289,191 @@ HTTP Response Code:
 |401               |Unauthorized         |
 +------------------+---------------------+
 |500               |Error                |
-+------------------+---------------------+
\ No newline at end of file
++------------------+---------------------+
+
+
+OOF/HAS create update API
++++++++++++++++++++++++++
+
++--------------------+--------------------------+
+|Interface Definition|Description               |
++====================+==========================+
+|URI                 |/api/oof/v1/placement     |
++--------------------+--------------------------+
+|Operation Type      |POST                      |
++--------------------+--------------------------+
+
+
+Request Parameters:
+
++-------------------+---------+-----------+-------+-------------------------------------------------------------+
+|Attribute          |Required |Cardinality|Content|Description                                                  |
++===================+=========+===========+=======+=============================================================+
+|requestInfo        |Y        |1          |Object |The content of the RequestInfo object.                       |
++-------------------+---------+-----------+-------+-------------------------------------------------------------+
+|placementInfo      |Y        |1          |Object |The Content of the PlacementInfo object.                     |
++-------------------+---------+-----------+-------+-------------------------------------------------------------+
+|licenseInfo        |N        |1          |Object |The Content of the LicenseInfo object.                       |
++-------------------+---------+-----------+-------+-------------------------------------------------------------+
+|serviceInfo        |Y        |1          |Object |The Content of the ServiceInfo object.                       |
++-------------------+---------+-----------+-------+-------------------------------------------------------------+
+
+
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|Attribute          |Required |Cardinality|Content|Description                                                            |
++===================+=========+===========+=======+=======================================================================+
+|transactionId      |Y        |1          |String |A unique ID to track an ONAP transaction.                              |
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|requestId          |Y        |1          |String |A unique ID to track multiple requests.                                |
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|callbackUrl        |Y        |1          |String |The end point of a callback service where recommendations are posted.  |
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|callbackHeader            |N        |1              |String |The header information a client expecting in a async callback.         |
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|sourceId           |Y        |1          |String |The unique ID of a client making an optimization call.                 |
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|requestType        |Y        |1          |String |The type of a request                                                  |
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|numSolutions       |N        |1          |Integer|Expected number of solutions.                                          |
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|optimizers         |Y        |1..N       |List of Strings|A list of optimization services.                               |
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|timeout            |N        |1          |Integer|A tolerance window (in secs) for expecting solutions. Default is 600 secs.|
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+
+
+PlacementInfo Object
+
++-------------------+---------+-----------+-------+-------------------------------------------------------------+
+|Attribute          |Required |Cardinality|Content|Description                                                  |
++===================+=========+===========+=======+=============================================================+
+|requestParameters  |C        |1          |String |A JSON object conaining service and customer-specific data. A client or service designer is required to specify the parameters of interest for a given service and their location in the JSON blob through optimization query policies. This attribute is only required if a request contains service or customer-specific information.|
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|placementDemands   |Y        |1..N       |List of PlacementDemand Object|The resource information for a placement service.|
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|subscriberInfo            |N        |1              |Object |The information of a service subscriber.                               |
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+
+PlacementDemand Object
+
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|Attribute          |Required |Cardinality|Content|Description                                                            |
++===================+=========+===========+=======+=======================================================================+
+|resourceModuleName |Y        |1          |String |A resource name as defined in a service model.                         |
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|serviceResourceId  |Y        |1          |String |A unique resource Id with a local scope between client and OOF.        |
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|tenantId           |N        |1          |String |A tenant Id as defined in the ordering system.                         |
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|resourceModelInfo  |Y        |1          |Object |Resource model information as defined in SDC.                          |
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|existingCandidates |N        |1..N       |List of Candidates Objects | The existing placement information of a resource. |
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|excludedCandidates |N        |1..N       |List of Candidates Objects |Candidates that need to be excluded from solutions.|
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|requiredCandidates |N        |1..N       |List of Candidates Objects |Candidates that must be included in solutions.     |
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+
+
+SubscriberInfo Object
+
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|Attribute          |Required |Cardinality|Content|Description                                                            |
++===================+=========+===========+=======+=======================================================================+
+|globalSubscriberId |Y        |1          |String |An ID of a subscriber.                                                 |
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|subscriberName     |Y        |1.N        |String |The name of a subscriber. If the name is not known, the value must be 'unknown'.|
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|subscriberCommonSiteId        |N        |1          |String |Id representing a subscriber location.                                 |
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+
+ModelMetaData Object
+
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|Attribute          |Required |Cardinality|Content|Description                                                            |
++===================+=========+===========+=======+=======================================================================+
+|modelInvariantId   |Y        |1          |String |A model invariant Id as defined in a service model.                    |
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|modelVersionId     |Y        |1          |String |A unique model Id as defined in a service model.                       |
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|modelName          |N        |1          |String |A model name as defined in a service model.                            |
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|modelType          |N        |1          |String |A model type as defined in a service model.                            |
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|modelVersion       |N        |1          |String |A model version as defined in a service model.                         |
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|modelCustomizationName |N    |1          |String |A model customization name as defined in a service model.              |
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+
+
+Candidates Object
+
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|Attribute          |Required |Cardinality|Content|Description                                                            |
++===================+=========+===========+=======+=======================================================================+
+|identifierType     |Y        |1          |String |The type of a candidate.                                               |
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|identifiers        |Y        |1..N       |List   |A list of identifiers.                                                 |
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|cloudOwner            |C            |1              |String |The name of a cloud owner. Only required if identifierType is cloud_region_id.|
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+
+
+ServiceInfo Object
+
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|Attribute          |Required |Cardinality|Content|Description                                                            |
++===================+=========+===========+=======+=======================================================================+
+|serviceInstanceId  |Y        |1          |String |A service instance id associated with a request.                       |
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|modelInfo          |Y        |1          |ModelMetaData Object |A list of identifiers.                                   |
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|serviceName       |Y        |1              |String |The name of a service                                                  |
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+
+LicenseInfo Object
+
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|Attribute          |Required |Cardinality|Content|Description                                                            |
++===================+=========+===========+=======+=======================================================================+
+|licenseDemands     |Y        |1..N       |List of LicenseDemands Object |A list of resources for license selection.      |
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+
+LicenseDemand Object
+
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|Attribute          |Required |Cardinality|Content|Description                                                            |
++===================+=========+===========+=======+=======================================================================+
+|resourceModuleName |Y        |1          |String |A resource name as defined in a service model.                         |
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|serviceResourceId  |Y        |1          |String |A unique resource Id with a local scope between client and OOF.        |
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|resourceModelInfo  |Y        |1          |ModelMetaData Object |Resource model information as defined in a service model.|
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|existingLicenses   |N        |1          |LicenseModel Object  |Existing license information assigned to a resource.     |
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+
+LicenseModel Object
+
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|Attribute          |Required |Cardinality|Content|Description                                                            |
++===================+=========+===========+=======+=======================================================================+
+|entitlementPoolUUID|Y        |1..N       |List   |Entitlement pool UUIDs associated with a resource.                     |
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|licenseKeyGroupUUID|Y        |1..N       |List   |License key groups associated with a resource.                         |
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+
+
+Response Body
+
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|Attribute          |Required |Cardinality|Content|Description                                                            |
++===================+=========+===========+=======+=======================================================================+
+|requestId          |Y        |1          |String |A unique Id for an ONAP transaction.                                   |
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|transactionId      |Y        |1          |String |A unique ID to track multiple requests associated with a transaction.  |
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|statusMessage      |N        |1          |String |Reasoning if a requestStatus is failed.                                |
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
+|requestStatus      |Y        |1          |String |The status of a request.                                               |
++-------------------+---------+-----------+-------+-----------------------------------------------------------------------+
\ No newline at end of file
diff --git a/docs/images/SO_1.png b/docs/images/SO_1.png
new file mode 100644 (file)
index 0000000..8e477ac
Binary files /dev/null and b/docs/images/SO_1.png differ
index a50c01b..53836ff 100644 (file)
Binary files a/docs/images/SO_Architecture_1.png and b/docs/images/SO_Architecture_1.png differ
diff --git a/docs/images/SO_R1_1.png b/docs/images/SO_R1_1.png
deleted file mode 100644 (file)
index 06d9eb3..0000000
Binary files a/docs/images/SO_R1_1.png and /dev/null differ
index 9fd4cc3..86b6447 100644 (file)
@@ -1,6 +1,6 @@
 .. This work is licensed under a Creative Commons Attribution 4.0 International License.\r
 .. http://creativecommons.org/licenses/by/4.0\r
-.. Copyright 2017 Huawei Technologies Co., Ltd.\r
+.. Copyright 2018 Huawei Technologies Co., Ltd.\r
 \r
 ONAP SO\r
 ========================================\r
index 07f534e..cde26e0 100644 (file)
@@ -1,7 +1,7 @@
-.. _open_cli_schema_version_1_0:
+.. _onap_so_schema_version_2_0:
 .. This work is licensed under a Creative Commons Attribution 4.0 International License.
 .. http://creativecommons.org/licenses/by/4.0
-.. Copyright 2017 Huawei Technologies Co., Ltd.
+.. Copyright 2018 Huawei Technologies Co., Ltd.
 
 Install and Configure Service Orchestrator
 ==========================================
index 8888c64..f18b5bd 100644 (file)
@@ -1,6 +1,6 @@
 .. This work is licensed under a Creative Commons Attribution 4.0 International License.\r
 .. http://creativecommons.org/licenses/by/4.0\r
-.. Copyright 2017 Huawei Technologies Co., Ltd.\r
+.. Copyright 2018 Huawei Technologies Co., Ltd.\r
 \r
 SO Offered and Consumed APIs\r
 =====================================\r
@@ -12,4 +12,4 @@ All the Service Orchestrator APIs, both inward and outward are documented in the
 .. toctree::\r
    :maxdepth: 1\r
    \r
-   SO_R1_Interface.rst\r
+   SO_Interface.rst\r
index f05f9ce..b27b2a3 100644 (file)
@@ -1,6 +1,6 @@
 .. This work is licensed under a Creative Commons Attribution 4.0 International License.
 .. http://creativecommons.org/licenses/by/4.0
-.. Copyright 2017 Huawei Intellectual Property.  All rights reserved.
+.. Copyright 2018 Huawei Intellectual Property.  All rights reserved.
 
 
 Service Orchestrator Release Notes
@@ -11,11 +11,12 @@ The SO provides the highest level of service orchestration in the ONAP architect
 Version: 1.2.2
 --------------
 
-:Release Date: 2018-05-24
+:Release Date: 2018-06-07
 
 The Beijing release is the second release of the Service Orchestrator (SO) project.
 
 **New Features**
+
 * Enhance Platform maturity by improving CLAMP maturity matrix see `Wiki <https://wiki.onap.org/display/DW/Beijing+Release+Platform+Maturity>`_.
 * Manual scaling of network services and VNFs.
 * Homing and placement capabiliities through OOF interaction. 
@@ -24,20 +25,30 @@ The Beijing release is the second release of the Service Orchestrator (SO) proje
 * Integrated to OOF 
 * Integrated to OOM
  
-Bug Fixes
----------
-The defects fixed in this release could be found `here<https://jira.onap.org/issues/?jql=project%20%3D%20SO%20AND%20affectedVersion%20%3D%20%22Beijing%20Release%22%20AND%20status%20%3D%20Closed%20>`_.
+**Bug Fixes**
+
+       The defects fixed in this release could be found `here <https://jira.onap.org/issues/?jql=project%20%3D%20SO%20AND%20affectedVersion%20%3D%20%22Beijing%20Release%22%20AND%20status%20%3D%20Closed%20>`_.
 
 **Known Issues**
-**Security Issues**
-SO CII Badging details can be found `here<https://bestpractices.coreinfrastructure.org/en/projects/1702>`_. 
-The remaining security issues and their workarounds are captured `here <https://wiki.onap.org/pages/viewpage.action?pageId=28377799>`_.
+
+       SO docker image is still on ecmop and not onap in the repository. 
+       This will be addressed in the next release.
+
+**Security Notes**
+
+       SO code has been formally scanned during build time using NexusIQ and all Critical vulnerabilities have been addressed, items that remain open have been assessed for risk and determined to be false positive. The SO open Critical security vulnerabilities and their risk assessment have been documented as part of the `project <https://wiki.onap.org/pages/viewpage.action?pageId=28377799>`_.
+
+Quick Links:
+
+- `SO project page <https://wiki.onap.org/display/DW/Service+Orchestrator+Project>`_
+- `Passing Badge information for SO <https://bestpractices.coreinfrastructure.org/en/projects/1702>`_
+- `Project Vulnerability Review Table for SO <https://wiki.onap.org/pages/viewpage.action?pageId=28377799>`_
 
 **Upgrade Notes**
+       NA
 
 **Deprecation Notes**
-
+       NA
 
 Version: 1.1.2
 --------------
@@ -93,6 +104,7 @@ Following are the deprecated SO projects in gerrit repo:
 - mso/mso-config
        
 **Other**
+       NA
 
 ===========
 
index 5b15c5f..6ca1f3d 100644 (file)
                        <artifactId>mso-requests-db</artifactId>
                        <version>${project.version}</version>
                </dependency>
+               <dependency>
+                       <groupId>org.assertj</groupId>
+                       <artifactId>assertj-core</artifactId>
+                       <version>3.10.0</version>
+                       <scope>test</scope>
+               </dependency>
 
        </dependencies>
        <build>
index d03aaef..c0cfdf9 100644 (file)
@@ -191,6 +191,7 @@ public class CamundaClient extends RequestClient{
                        CamundaInput vfModuleTypeInput = new CamundaInput();
                        CamundaInput networkTypeInput = new CamundaInput();
                        CamundaInput recipeParamsInput = new CamundaInput();
+                       host.setValue(parseURL());
                        requestIdInput.setValue(StringUtils.defaultString(requestClientParamater.getRequestId()));
                        isBaseVfModuleInput.setValue(requestClientParamater.isBaseVfModule());
                        recipeTimeoutInput.setValue(requestClientParamater.getRecipeTimeout());
index 845b140..cbbbff3 100644 (file)
@@ -64,19 +64,18 @@ public class CamundaTaskClient extends RequestClient{
        @Override\r
        public HttpResponse post(String camundaReqXML, String requestId,\r
                        String requestTimeout, String schemaVersion, String serviceInstanceId, String action) {\r
-               msoLogger.debug("Method not supported");\r
-               return null;\r
+               throw new UnsupportedOperationException("Method not supported.");\r
        }\r
 \r
        @Override\r
        public HttpResponse post(RequestClientParamater params) {\r
-               return null;\r
+               throw new UnsupportedOperationException("Method not supported.");\r
        }\r
 \r
        @Override\r
-       public HttpResponse get() throws IOException{\r
+       public HttpResponse get() throws IOException {\r
                HttpGet get = new HttpGet(url);\r
-               msoLogger.debug("Camunda Task url is: "+ url);  \r
+               msoLogger.debug("Camunda Task url is: "+ url);\r
                String encryptedCredentials;\r
                if(props!=null){\r
                        encryptedCredentials = props.getProperty(CommonConstants.CAMUNDA_AUTH,null);\r
index ed5d076..66369a8 100644 (file)
@@ -24,7 +24,6 @@ import java.io.IOException;
 import java.security.GeneralSecurityException;
 
 import org.apache.http.HttpResponse;
-import org.apache.http.client.ClientProtocolException;
 import org.apache.http.client.HttpClient;
 import org.openecomp.mso.logger.MsoLogger;
 import org.openecomp.mso.properties.MsoJavaProperties;
@@ -65,7 +64,7 @@ public abstract class RequestClient {
                this.client = client;
        }
 
-       public abstract HttpResponse post(String request, String requestId, String requestTimeout, String schemaVersion, String serviceInstanceId, String action) throws ClientProtocolException, IOException;
+       public abstract HttpResponse post(String request, String requestId, String requestTimeout, String schemaVersion, String serviceInstanceId, String action) throws IOException;
 
        public abstract HttpResponse post(String request) throws IOException;
 
diff --git a/mso-api-handlers/mso-api-handler-common/src/test/java/org/openecomp/mso/apihandler/common/CamundaTaskClientTest.java b/mso-api-handlers/mso-api-handler-common/src/test/java/org/openecomp/mso/apihandler/common/CamundaTaskClientTest.java
new file mode 100644 (file)
index 0000000..f892d13
--- /dev/null
@@ -0,0 +1,132 @@
+/*-
+ * ============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.apihandler.common;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import org.apache.http.HttpEntity;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.methods.HttpRequestBase;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+import org.openecomp.mso.properties.MsoJavaProperties;
+
+public class CamundaTaskClientTest {
+
+    private CamundaTaskClient testedObject = new CamundaTaskClient();
+    private HttpClient httpClientMock;
+    private static final String JSON_REQUEST = "{\"value1\": \"aaa\",\"value2\": \"bbb\"}";
+    private static final String URL_SCHEMA = "http";
+    private static final String HOST = "testhost";
+    private static final int PORT = 1234;
+    private static final String URL_PATH = "/requestMethodSuccessful";
+    private static final String URL = URL_SCHEMA + "://" + HOST + ":" + PORT + URL_PATH;
+    private static final String AUTHORIZATION_HEADER_NAME = "Authorization";
+
+    @Before
+    public void init() {
+        testedObject = new CamundaTaskClient();
+        httpClientMock = mock(HttpClient.class);
+        testedObject.setClient(httpClientMock);
+        testedObject.setUrl(URL);
+    }
+
+    @Test
+    public void postMethodSuccessful() throws IOException {
+        ArgumentCaptor<HttpPost> httpPostCaptor = ArgumentCaptor.forClass(HttpPost.class);
+        testedObject.post(JSON_REQUEST);
+        verify(httpClientMock).execute(httpPostCaptor.capture());
+        checkUri(httpPostCaptor.getValue());
+        assertThat(httpPostCaptor.getValue().getEntity().getContentType().getValue()).
+                isEqualTo(CommonConstants.CONTENT_TYPE_JSON);
+        assertThat(getJsonFromEntity(httpPostCaptor.getValue().getEntity())).isEqualTo(JSON_REQUEST);
+    }
+
+    @Test
+    public void postMethodSuccessfulWithCredentials() throws IOException {
+        ArgumentCaptor<HttpPost> httpPostCaptor = ArgumentCaptor.forClass(HttpPost.class);
+        testedObject.setProps(createMsoJavaProperties());
+        testedObject.post(JSON_REQUEST);
+        verify(httpClientMock).execute(httpPostCaptor.capture());
+        assertThat(httpPostCaptor.getValue().getHeaders(AUTHORIZATION_HEADER_NAME)).isNotEmpty();
+    }
+
+    @Test
+    public void getMethodSuccessful() throws IOException {
+        ArgumentCaptor<HttpGet> httpGetCaptor = ArgumentCaptor.forClass(HttpGet.class);
+        testedObject.get();
+        verify(httpClientMock).execute(httpGetCaptor.capture());
+        checkUri(httpGetCaptor.getValue());
+    }
+
+    @Test
+    public void getMethodSuccessfulWithCredentials() throws IOException {
+        ArgumentCaptor<HttpGet> httpGetCaptor = ArgumentCaptor.forClass(HttpGet.class);
+        testedObject.setUrl(URL);
+        testedObject.setProps(createMsoJavaProperties());
+        testedObject.get();
+        verify(httpClientMock).execute(httpGetCaptor.capture());
+        assertThat(httpGetCaptor.getValue().getHeaders(AUTHORIZATION_HEADER_NAME)).isNotEmpty();
+    }
+
+    @Test(expected = UnsupportedOperationException.class)
+    public void postMethodUnsupported() {
+        testedObject.post("", "", "", "", "", "");
+    }
+
+    @Test(expected = UnsupportedOperationException.class)
+    public void postMethodUnsupported2() {
+        testedObject.post(new RequestClientParamater.Builder().build());
+    }
+
+    private void checkUri(HttpRequestBase httpRequestBase) {
+        assertThat(httpRequestBase.getURI().getScheme()).isEqualTo(URL_SCHEMA);
+        assertThat(httpRequestBase.getURI().getHost()).isEqualTo(HOST);
+        assertThat(httpRequestBase.getURI().getPort()).isEqualTo(PORT);
+        assertThat(httpRequestBase.getURI().getPath()).isEqualTo(URL_PATH);
+    }
+
+    private MsoJavaProperties createMsoJavaProperties() {
+        MsoJavaProperties msoJavaProperties = new MsoJavaProperties();
+        msoJavaProperties.setProperty(CommonConstants.CAMUNDA_AUTH, "");
+        return msoJavaProperties;
+    }
+
+    private String getJsonFromEntity(HttpEntity httpEntity) throws IOException {
+        BufferedReader rd = new BufferedReader(
+                new InputStreamReader(httpEntity.getContent()));
+        StringBuilder result = new StringBuilder();
+        String line;
+        while ((line = rd.readLine()) != null) {
+            result.append(line);
+        }
+        return result.toString();
+    }
+
+}
\ No newline at end of file
index dca2069..275351d 100644 (file)
@@ -215,10 +215,7 @@ public class E2EServiceInstances {
                        return response;
                }
 
-               Response returnResp = runCompareModelBPMWorkflow(e2eCompareModelReq, msoRequest, requestJSON, requestId,
-                               startTime, action);
-
-               return returnResp;
+               return runCompareModelBPMWorkflow(e2eCompareModelReq, msoRequest, requestJSON, requestId, startTime, action);
 
        }
 
@@ -279,8 +276,6 @@ public class E2EServiceInstances {
 
                ResponseHandler respHandler = new ResponseHandler(response, requestClient.getType());
                int bpelStatus = respHandler.getStatus();
-               // String responseBody = respHandler.getResponseBody();
-               // CompareModelsResult modelDiffResponse = new CompareModelsResult();
 
                return beplStatusUpdate(requestId, startTime, msoRequest, requestClient, respHandler, bpelStatus, action,
                                instanceIdMap);
@@ -453,8 +448,9 @@ public class E2EServiceInstances {
 
                        RequestClientParamater requestClientParamater = new RequestClientParamater.Builder().setRequestId(requestId).
                                        setBaseVfModule(false).setRecipeTimeout(recipeLookupResult.getRecipeTimeout()).
-                                       setRequestAction(action.name()).setServiceType(e2eDelReq.getServiceType()).
-                                       setRequestDetails(jjo.toString()).setRecipeParamXsd(recipeLookupResult.getRecipeParamXsd()).build();
+                                       setRequestAction(action.name()).setServiceInstanceId(instanceIdMap.get("serviceId")).
+                                       setServiceType(e2eDelReq.getServiceType()).setRequestDetails(jjo.toString()).
+                                       setRecipeParamXsd(recipeLookupResult.getRecipeParamXsd()).build();
                        response = requestClient.post(requestClientParamater);
 
                        msoLogger.recordMetricEvent(subStartTime,
index 91c19dd..af0ea10 100644 (file)
@@ -95,7 +95,9 @@ public class CatalogDatabase implements Closeable {
     private static final String MODEL_CUSTOMIZATION_UUID = "modelCustomizationUuid";
     private static final String VF_MODULE_MODEL_UUID = "vfModuleModelUUId";
     private static final String NETWORK_SERVICE = "network service";
-
+    private static final String TEMPLATE_NAME = "template_name";
+    private static final String GET_VNF_RECIPE = "getVnfRecipe";
+    
     protected static final MsoLogger LOGGER = MsoLogger.getMsoLogger (MsoLogger.Catalog.GENERAL);
 
     protected Session session = null;
@@ -123,6 +125,7 @@ public class CatalogDatabase implements Closeable {
         return session;
     }
 
+    
     /**
      * Close an open Catalog Database session.
      * This method should always be called when a client is finished using a
@@ -198,7 +201,7 @@ public class CatalogDatabase implements Closeable {
 
         String hql = "FROM HeatTemplate WHERE templateName = :template_name";
         Query query = getSession().createQuery (hql);
-        query.setParameter("template_name", templateName);
+        query.setParameter(TEMPLATE_NAME, templateName);
 
         @SuppressWarnings("unchecked")
         List <HeatTemplate> resultList = query.list();
@@ -231,8 +234,8 @@ public class CatalogDatabase implements Closeable {
 
         String hql = "FROM HeatTemplate WHERE templateName = :template_name AND version = :version";
         Query query = getSession().createQuery(hql);
-        query.setParameter("template_name", templateName);
-        query.setParameter("version", version);
+        query.setParameter(TEMPLATE_NAME, templateName);
+        query.setParameter(MODEL_VERSION, version);
 
         @SuppressWarnings("unchecked")
         List <HeatTemplate> resultList = query.list();
@@ -1121,14 +1124,14 @@ public class CatalogDatabase implements Closeable {
         List <VnfRecipe> resultList = query.list();
 
         if (resultList.isEmpty()) {
-            LOGGER.recordMetricEvent(startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully. VNF recipe not found", "CatalogDB", "getVnfRecipe", null);
+            LOGGER.recordMetricEvent(startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully. VNF recipe not found", "CatalogDB", GET_VNF_RECIPE, null);
             return null;
         }
 
         resultList.sort(new MavenLikeVersioningComparator());
         Collections.reverse(resultList);
 
-        LOGGER.recordMetricEvent(startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully", "CatalogDB", "getVnfRecipe", null);
+        LOGGER.recordMetricEvent(startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully", "CatalogDB", GET_VNF_RECIPE, null);
         return resultList.get(0);
     }
 
@@ -1156,14 +1159,14 @@ public class CatalogDatabase implements Closeable {
         List <VnfRecipe> resultList = query.list();
 
         if (resultList.isEmpty()) {
-            LOGGER.recordMetricEvent(startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully. VNF recipe not found", "CatalogDB", "getVnfRecipe", null);
+            LOGGER.recordMetricEvent(startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully. VNF recipe not found", "CatalogDB", GET_VNF_RECIPE, null);
             return null;
         }
 
         resultList.sort(new MavenLikeVersioningComparator());
         Collections.reverse(resultList);
 
-        LOGGER.recordMetricEvent(startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully", "CatalogDB", "getVnfRecipe", null);
+        LOGGER.recordMetricEvent(startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully", "CatalogDB", GET_VNF_RECIPE, null);
         return resultList.get(0);
     }
     
@@ -1189,14 +1192,14 @@ public class CatalogDatabase implements Closeable {
         List <VnfRecipe> resultList = query.list();
 
         if (resultList.isEmpty()) {
-            LOGGER.recordMetricEvent(startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully. VNF recipe not found", "CatalogDB", "getVnfRecipe", null);
+            LOGGER.recordMetricEvent(startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully. VNF recipe not found", "CatalogDB", GET_VNF_RECIPE, null);
             return null;
         }
 
         resultList.sort(new MavenLikeVersioningComparator());
         Collections.reverse(resultList);
 
-        LOGGER.recordMetricEvent(startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully", "CatalogDB", "getVnfRecipe", null);
+        LOGGER.recordMetricEvent(startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully", "CatalogDB", GET_VNF_RECIPE, null);
         return resultList.get(0);
     }
     
@@ -1237,11 +1240,11 @@ public class CatalogDatabase implements Closeable {
         List <VnfRecipe> resultList = query.list();
 
         if (resultList.isEmpty()) {
-            LOGGER.recordMetricEvent(startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully. VNF recipe not found", "CatalogDB", "getVnfRecipe", null);
+            LOGGER.recordMetricEvent(startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully. VNF recipe not found", "CatalogDB", GET_VNF_RECIPE, null);
             return null;
         }
 
-        LOGGER.recordMetricEvent(startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully", "CatalogDB", "getVnfRecipe", null);
+        LOGGER.recordMetricEvent(startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully", "CatalogDB", GET_VNF_RECIPE, null);
         return resultList.get(0);
     }
 
@@ -1342,7 +1345,7 @@ public class CatalogDatabase implements Closeable {
         String hql = "FROM VfModule WHERE type = :type and version = :version";
         Query query = getSession().createQuery(hql);
         query.setParameter ("type", type);
-        query.setParameter ("version", version);
+        query.setParameter (MODEL_VERSION, version);
         VfModule module = null;
         try {
                module = (VfModule) query.uniqueResult ();
@@ -2867,7 +2870,7 @@ public class CatalogDatabase implements Closeable {
 
             query = getSession ().createQuery (hql.toString ());
             query.setParameter ("modelCustomizationUuid", modelCustomizationUuid);
-            query.setParameter ("version", asdcServiceModelVersion);
+            query.setParameter (MODEL_VERSION, asdcServiceModelVersion);
         }else{
             hql = new StringBuilder ("FROM VfModule WHERE type = :type AND version = :version AND modelVersion = :modelVersion");
 
@@ -2875,7 +2878,7 @@ public class CatalogDatabase implements Closeable {
 
             query = getSession ().createQuery (hql.toString ());
             query.setParameter (TYPE, vfModuleType);
-            query.setParameter ("version", asdcServiceModelVersion);
+            query.setParameter (MODEL_VERSION, asdcServiceModelVersion);
             query.setParameter ("modelVersion", modelVersion);
         }
 
@@ -3490,8 +3493,8 @@ public class CatalogDatabase implements Closeable {
 
         String hql = "FROM HeatTemplate WHERE templateName = :template_name AND version = :version AND asdcResourceName = :asdcResourceName";
         Query query = getSession ().createQuery (hql);
-        query.setParameter ("template_name", templateName);
-        query.setParameter ("version", version);
+        query.setParameter (TEMPLATE_NAME, templateName);
+        query.setParameter (MODEL_VERSION, version);
         query.setParameter ("asdcResourceName", asdcResourceName);
 
         @SuppressWarnings("unchecked")
@@ -3603,7 +3606,7 @@ public class CatalogDatabase implements Closeable {
         String hql = "FROM HeatEnvironment WHERE name=:name AND version=:version AND asdcResourceName=:asdcResourceName";
         Query query = getSession ().createQuery (hql);
         query.setParameter ("name", name);
-        query.setParameter ("version", version);
+        query.setParameter (MODEL_VERSION, version);
         query.setParameter ("asdcResourceName", asdcResourceName);
         HeatEnvironment env = null;
         try {
@@ -3645,7 +3648,7 @@ public class CatalogDatabase implements Closeable {
         String hql = "FROM HeatEnvironment WHERE artifactUuid=:artifactUuid AND version=:version";
         Query query = getSession ().createQuery (hql);
         query.setParameter ("artifactUuid", artifactUuid);
-        query.setParameter ("version", version);
+        query.setParameter (MODEL_VERSION, version);
         HeatEnvironment env = null;
         try {
                env = (HeatEnvironment) query.uniqueResult ();
@@ -4283,7 +4286,7 @@ public class CatalogDatabase implements Closeable {
           query.setParameter ("fileName", fileName);
           query.setParameter ("vnfResourceId", vnfResourceId);
           query.setParameter ("asdcResourceName", asdcResourceName);
-          query.setParameter ("version", version);
+          query.setParameter (MODEL_VERSION, version);
 
           @SuppressWarnings("unchecked")
 
index 899127c..8baf620 100644 (file)
@@ -38,8 +38,6 @@ public class HeatEnvironment extends MavenLikeVersioning implements Serializable
 
        private Timestamp created = null;
 
-       public HeatEnvironment() {}
-
        public String getArtifactUuid() {
                return this.artifactUuid;
        }
index 8d7da22..542cd45 100644 (file)
@@ -38,7 +38,6 @@ public class HeatFiles extends MavenLikeVersioning implements Serializable {
        private String version = null;
        private String artifactChecksum = null;
 
-       public HeatFiles() {}
 
        public String getArtifactUuid() {
                return this.artifactUuid;
index 7b5f06a..bbb3d1e 100644 (file)
@@ -54,22 +54,40 @@ RUN echo "deb http://archive.ubuntu.com/ubuntu/ artful main restricted" >> /etc/
 #   For CVE-2016-6303 CVE-2016-2182 CVE-2016-2177
 # libpcre3 2:8.39-5ubuntu3
 #   For CVE-2016-3191 CVE-2016-1283
+# berkeleydb
+#   For CVE-2016-3418 CVE-2016-0694 CVE-2016-0689 CVE-2016-0682
+# jetty
+#   For CVE-2017-9735
+# libxi
+#   For CVE-2016-7946 CVE-2016-7945
+# xalan
+#   For CVE-2014-0107
+# git
+#   For CVE-2017-14867
+#
+
 USER root
-RUN apt-get -y install \
-    libkrb5-3=1.16-2build1 krb5-locales=1.16-2build1 \
-    libvorbis0a=1.3.5-4ubuntu0.2 \
-    libx11-6=2:1.6.4-3 libx11-data=2:1.6.4-3 libx11-doc=2:1.6.4-3 libx11-xcb1=2:1.6.4-3 \
-    libxtst6=2:1.2.3-1 \
-    ncurses-base=6.1-1ubuntu1 ncurses-bin=6.1-1ubuntu1 libncurses5=6.1-1ubuntu1 libncursesw5=6.1-1ubuntu1 \
-    libsqlite3-0=3.22.0-1 \
-    libtiff5=4.0.8-5ubuntu0.1 \
-    passwd=1:4.5-1ubuntu1 \
-    perl-base=5.26.0-8ubuntu1.1 \
-    zlib1g=1:1.2.11.dfsg-0ubuntu2 \
-    libexpat1=2.2.5-3 \
-    libc-bin=2.26-0ubuntu2.1 libc6=2.26-0ubuntu2.1 \
-    openssl=1.1.0g-2ubuntu4 \
-    libpcre3=2:8.39-5ubuntu3
+RUN apt-get -y --only-upgrade install \
+    libkrb5-3 krb5-locales \
+    libvorbis0a \
+    libx11-6 libx11-data libx11-doc libx11-xcb1 \
+    libxtst6 \
+    ncurses-base ncurses-bin libncurses5 libncursesw5 \
+    libsqlite3-0 \
+    libtiff5 \
+    passwd \
+    perl-base \
+    openssl \
+    zlib1g \
+    libdb5.3 \
+    libc-bin libc6 multiarch-support \
+    libxi6 \
+    libpcre3 \
+    expat \
+    jetty9 \
+    xalan \
+    git
+
 
 RUN apt-get install -y netcat curl && curl -LO  https://packages.chef.io/files/stable/chefdk/2.5.3/ubuntu/16.04/chefdk_2.5.3-1_amd64.deb && curl -LO http://central.maven.org/maven2/org/mariadb/jdbc/mariadb-java-client/1.5.4/mariadb-java-client-1.5.4.jar && apt-get remove --purge -y curl && apt-get autoremove -y
 
diff --git a/pom.xml b/pom.xml
index c4c29e2..e51ad70 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -30,7 +30,7 @@
     <module>status-control</module>
     <module>bpmn</module>
     <module>packages</module>
-    <module>aria</module>
+    <!-- module>aria</module -->
   </modules>
   <properties>
     <project.mso.base.folder>.</project.mso.base.folder>
index d3e09bb..e1e6b0b 100644 (file)
@@ -4,7 +4,7 @@
 
 major=1
 minor=2
-patch=1
+patch=2
 
 base_version=${major}.${minor}.${patch}