aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/adapters/vdu/VduArtifact.java20
-rw-r--r--adapters/mso-catalog-db-adapter/src/main/java/org/openecomp/mso/adapters/catalogdb/catalogrest/QueryAllottedResourceCustomization.java4
-rw-r--r--adapters/mso-vnf-adapter/src/main/java/org/openecomp/mso/adapters/vdu/mapper/VfModuleCustomizationToVduMapper.java47
-rw-r--r--adapters/mso-vnf-adapter/src/test/java/org/openecomp/mso/adapters/vdu/mapper/VfModuleCustomizationToVduMapperTest.java158
-rw-r--r--aria/multivim-plugin/src/main/python/multivim-plugin/cinder_plugin/__init__.py14
-rw-r--r--aria/multivim-plugin/src/main/python/multivim-plugin/cinder_plugin/tests/__init__.py14
-rw-r--r--aria/multivim-plugin/src/main/python/multivim-plugin/cinder_plugin/tests/test_volume.py342
-rw-r--r--aria/multivim-plugin/src/main/python/multivim-plugin/cinder_plugin/volume.py125
-rw-r--r--aria/multivim-plugin/src/main/python/multivim-plugin/glance_plugin/__init__.py14
-rw-r--r--aria/multivim-plugin/src/main/python/multivim-plugin/glance_plugin/image.py177
-rw-r--r--aria/multivim-plugin/src/main/python/multivim-plugin/glance_plugin/tests/resources/test-image-start.yaml30
-rw-r--r--aria/multivim-plugin/src/main/python/multivim-plugin/glance_plugin/tests/test.py148
-rw-r--r--aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/__init__.py1
-rw-r--r--aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/floatingip.py104
-rw-r--r--aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/network.py109
-rw-r--r--aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/port.py222
-rw-r--r--aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/router.py215
-rw-r--r--aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/security_group.py130
-rw-r--r--aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/subnet.py101
-rw-r--r--aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/tests/__init__.py1
-rw-r--r--aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/tests/test.py220
-rw-r--r--aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/tests/test_port.py156
-rw-r--r--aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/tests/test_security_group.py115
-rw-r--r--aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/__init__.py16
-rw-r--r--aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/floatingip.py60
-rw-r--r--aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/keypair.py202
-rw-r--r--aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/security_group.py81
-rw-r--r--aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/server.py944
-rw-r--r--aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/__init__.py0
-rw-r--r--aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/resources/test-keypair-validation-blueprint.yaml23
-rw-r--r--aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/resources/test-server-create-secgroup.yaml31
-rw-r--r--aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/resources/test-start-operation-retry-blueprint.yaml31
-rw-r--r--aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/test_relationships.py228
-rw-r--r--aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/test_server.py551
-rw-r--r--aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/test_server_image_and_flavor.py228
-rw-r--r--aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/test_userdata.py63
-rw-r--r--aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/test_validation.py194
-rw-r--r--aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/userdata.py50
-rw-r--r--asdc-controller/src/main/java/org/openecomp/mso/asdc/client/ASDCController.java22
-rw-r--r--bpmn/MSOCommonBPMN/pom.xml4
-rw-r--r--bpmn/MSOCommonBPMN/src/main/groovy/org/openecomp/mso/bpmn/common/scripts/OofHoming.groovy42
-rw-r--r--bpmn/MSOCommonBPMN/src/main/groovy/org/openecomp/mso/bpmn/common/scripts/OofUtils.groovy140
-rw-r--r--bpmn/MSOCommonBPMN/src/main/java/org/openecomp/mso/client/appc/ApplicationControllerAction.java1
-rw-r--r--bpmn/MSOCommonBPMN/src/main/java/org/openecomp/mso/client/appc/ApplicationControllerClient.java29
-rw-r--r--bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/bpmn/common/OofHomingTest.java53
-rw-r--r--bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/client/appc/ApplicationControllerClientTest.java11
-rw-r--r--bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCallback2AR1Vnf6
-rw-r--r--bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCallback2AR1Vnf2Net10
-rw-r--r--bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCallbackInfraVnf4
-rw-r--r--bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCallbackNoSolutionFound24
-rw-r--r--bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCatalogResp.json2
-rw-r--r--bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/CreateVFCNSResource.groovy6
-rw-r--r--bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/CreateVfModuleInfra.groovy62
-rw-r--r--bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/DoCreateResources.groovy22
-rw-r--r--bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/DoDeleteVFCNetworkServiceInstance.groovy6
-rw-r--r--bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/DoScaleVFCNetworkServiceInstance.groovy16
-rw-r--r--bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/DoUpdateE2EServiceInstance.groovy34
-rw-r--r--bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/DoUpdateE2EServiceInstanceRollback.groovy32
-rw-r--r--bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/ScaleCustomE2EServiceInstance.groovy7
-rw-r--r--bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/UpdateCustomE2EServiceInstance.groovy1
-rw-r--r--bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/vcpe/scripts/CreateVcpeResCustService.groovy69
-rw-r--r--bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/vcpe/scripts/DeleteVcpeResCustService.groovy4
-rw-r--r--bpmn/MSOInfrastructureBPMN/src/main/java/org/openecomp/mso/bpmn/infrastructure/properties/BPMNProperties.java4
-rw-r--r--bpmn/MSOInfrastructureBPMN/src/main/resources/process/CreateCustom3rdONAPServiceInstance.bpmn391
-rw-r--r--bpmn/MSOInfrastructureBPMN/src/main/resources/process/CreateVcpeResCustService.bpmn3
-rw-r--r--bpmn/MSOInfrastructureBPMN/src/main/resources/process/CreateVcpeResCustServiceV2.bpmn1
-rw-r--r--bpmn/MSOInfrastructureBPMN/src/main/resources/process/CreateVfModuleInfra.bpmn62
-rw-r--r--bpmn/MSOInfrastructureBPMN/src/main/resources/process/DeleteCustom3rdONAPServiceInstance.bpmn381
-rw-r--r--bpmn/MSOInfrastructureBPMN/src/main/resources/subprocess/DoCreateVnfAndModules.bpmn2
-rw-r--r--bpmn/MSOInfrastructureBPMN/src/main/resources/subprocess/DoUpdateE2EServiceInstance.bpmn12
-rw-r--r--bpmn/MSOInfrastructureBPMN/src/test/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/DoCustomDeleteE2EServiceInstanceTest.groovy39
-rw-r--r--bpmn/MSOInfrastructureBPMN/src/test/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/ScaleCustomE2EServiceInstanceTest.groovy3
-rw-r--r--bpmn/MSOInfrastructureBPMN/src/test/groovy/org/openecomp/mso/bpmn/vcpe/scripts/CreateVcpeResCustServiceTest.groovy10
-rw-r--r--bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/CreateVcpeResCustService/arGetById.xml6
-rw-r--r--bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/CreateVcpeResCustService/getCatalogServiceResourcesData.json4
-rw-r--r--bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/DeleteVcpeResCustService/arGetTXCById.xml6
-rw-r--r--bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/DoCreateAllottedResourceTXCRollback/arGetById.xml6
-rw-r--r--bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/DoDeleteAllottedResourceTXC/arGetById.xml6
-rw-r--r--bpmn/MSOInfrastructureBPMN/src/test/resources/mso.bpmn.urn.properties8
-rw-r--r--common/pom.xml4
-rw-r--r--docs/Install_Docker.rst2
-rw-r--r--docs/SO_Interface.rst (renamed from docs/SO_R1_Interface.rst)251
-rw-r--r--docs/images/SO_1.pngbin0 -> 83586 bytes
-rw-r--r--docs/images/SO_Architecture_1.pngbin108239 -> 123253 bytes
-rw-r--r--docs/images/SO_R1_1.pngbin64882 -> 0 bytes
-rw-r--r--docs/index.rst2
-rw-r--r--docs/installation.rst4
-rw-r--r--docs/offered_consumed_apis.rst4
-rw-r--r--docs/release-notes.rst32
-rw-r--r--mso-api-handlers/mso-api-handler-common/pom.xml6
-rw-r--r--mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/CamundaClient.java1
-rw-r--r--mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/CamundaTaskClient.java9
-rw-r--r--mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/RequestClient.java3
-rw-r--r--mso-api-handlers/mso-api-handler-common/src/test/java/org/openecomp/mso/apihandler/common/CamundaTaskClientTest.java132
-rw-r--r--mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/E2EServiceInstances.java12
-rw-r--r--mso-catalog-db/src/main/java/org/openecomp/mso/db/catalog/CatalogDatabase.java43
-rw-r--r--mso-catalog-db/src/main/java/org/openecomp/mso/db/catalog/beans/HeatEnvironment.java2
-rw-r--r--mso-catalog-db/src/main/java/org/openecomp/mso/db/catalog/beans/HeatFiles.java1
-rw-r--r--packages/docker/src/main/docker/docker-files/Dockerfile.mso-chef-final48
-rw-r--r--pom.xml2
-rw-r--r--version.properties2
101 files changed, 1958 insertions, 5322 deletions
diff --git a/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/adapters/vdu/VduArtifact.java b/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/adapters/vdu/VduArtifact.java
index 394d13d8d2..7696f3bc24 100644
--- a/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/adapters/vdu/VduArtifact.java
+++ b/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/adapters/vdu/VduArtifact.java
@@ -20,6 +20,9 @@
package org.openecomp.mso.adapters.vdu;
+import java.util.Arrays;
+import java.util.Objects;
+
public class VduArtifact {
// Enumerate the types of artifacts permitted. This may need to be a variable string
@@ -59,6 +62,19 @@ public class VduArtifact {
}
public void setType(ArtifactType type) {
this.type = type;
- }
-
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ VduArtifact that = (VduArtifact) o;
+ return Objects.equals(name, that.name) &&
+ Arrays.equals(content, that.content) &&
+ type == that.type;
+ }
} \ No newline at end of file
diff --git a/adapters/mso-catalog-db-adapter/src/main/java/org/openecomp/mso/adapters/catalogdb/catalogrest/QueryAllottedResourceCustomization.java b/adapters/mso-catalog-db-adapter/src/main/java/org/openecomp/mso/adapters/catalogdb/catalogrest/QueryAllottedResourceCustomization.java
index 450ffd6d93..b249b58d48 100644
--- a/adapters/mso-catalog-db-adapter/src/main/java/org/openecomp/mso/adapters/catalogdb/catalogrest/QueryAllottedResourceCustomization.java
+++ b/adapters/mso-catalog-db-adapter/src/main/java/org/openecomp/mso/adapters/catalogdb/catalogrest/QueryAllottedResourceCustomization.java
@@ -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());
diff --git a/adapters/mso-vnf-adapter/src/main/java/org/openecomp/mso/adapters/vdu/mapper/VfModuleCustomizationToVduMapper.java b/adapters/mso-vnf-adapter/src/main/java/org/openecomp/mso/adapters/vdu/mapper/VfModuleCustomizationToVduMapper.java
index b04f3c30db..d26d3f62f8 100644
--- a/adapters/mso-vnf-adapter/src/main/java/org/openecomp/mso/adapters/vdu/mapper/VfModuleCustomizationToVduMapper.java
+++ b/adapters/mso-vnf-adapter/src/main/java/org/openecomp/mso/adapters/vdu/mapper/VfModuleCustomizationToVduMapper.java
@@ -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
index 0000000000..ffa6bcd961
--- /dev/null
+++ b/adapters/mso-vnf-adapter/src/test/java/org/openecomp/mso/adapters/vdu/mapper/VfModuleCustomizationToVduMapperTest.java
@@ -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
index a9dfcc4473..0000000000
--- a/aria/multivim-plugin/src/main/python/multivim-plugin/cinder_plugin/__init__.py
+++ /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
index a9dfcc4473..0000000000
--- a/aria/multivim-plugin/src/main/python/multivim-plugin/cinder_plugin/tests/__init__.py
+++ /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
index 0ee85bc334..0000000000
--- a/aria/multivim-plugin/src/main/python/multivim-plugin/cinder_plugin/tests/test_volume.py
+++ /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
index 168681b943..0000000000
--- a/aria/multivim-plugin/src/main/python/multivim-plugin/cinder_plugin/volume.py
+++ /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
index 809f033a55..0000000000
--- a/aria/multivim-plugin/src/main/python/multivim-plugin/glance_plugin/__init__.py
+++ /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
index a8d5b203f4..0000000000
--- a/aria/multivim-plugin/src/main/python/multivim-plugin/glance_plugin/image.py
+++ /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
index 12c9aa79b7..0000000000
--- a/aria/multivim-plugin/src/main/python/multivim-plugin/glance_plugin/tests/resources/test-image-start.yaml
+++ /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
index 4a88cba4e7..0000000000
--- a/aria/multivim-plugin/src/main/python/multivim-plugin/glance_plugin/tests/test.py
+++ /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
index 04cb21f745..0000000000
--- a/aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/__init__.py
+++ /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
index 1a9d0449ca..0000000000
--- a/aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/floatingip.py
+++ /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
index eadcc3b4e8..0000000000
--- a/aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/network.py
+++ /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
index 4db4c442c5..0000000000
--- a/aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/port.py
+++ /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
index 1a2851e4bc..0000000000
--- a/aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/router.py
+++ /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
index 5f335f482b..0000000000
--- a/aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/security_group.py
+++ /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
index 6e97c96755..0000000000
--- a/aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/subnet.py
+++ /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
index 04cb21f745..0000000000
--- a/aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/tests/__init__.py
+++ /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
index 459c23a6cd..0000000000
--- a/aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/tests/test.py
+++ /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
index 1acee3d05d..0000000000
--- a/aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/tests/test_port.py
+++ /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
index e958cddb33..0000000000
--- a/aria/multivim-plugin/src/main/python/multivim-plugin/neutron_plugin/tests/test_security_group.py
+++ /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
index bb533273be..0000000000
--- a/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/__init__.py
+++ /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
index e770c540a8..0000000000
--- a/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/floatingip.py
+++ /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
index 92281ab9e5..0000000000
--- a/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/keypair.py
+++ /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
index 283eae85cf..0000000000
--- a/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/security_group.py
+++ /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
index 6726f24804..0000000000
--- a/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/server.py
+++ /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
index e69de29bb2..0000000000
--- a/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/__init__.py
+++ /dev/null
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
index 22b7fb5362..0000000000
--- a/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/resources/test-keypair-validation-blueprint.yaml
+++ /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
index 70b75f6bf5..0000000000
--- a/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/resources/test-server-create-secgroup.yaml
+++ /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
index 275806cf5a..0000000000
--- a/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/resources/test-start-operation-retry-blueprint.yaml
+++ /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
index 2814057fb7..0000000000
--- a/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/test_relationships.py
+++ /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
index a50930555c..0000000000
--- a/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/test_server.py
+++ /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
index 2ae475843c..0000000000
--- a/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/test_server_image_and_flavor.py
+++ /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
index d7f056d72c..0000000000
--- a/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/test_userdata.py
+++ /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
index aa1dfdd814..0000000000
--- a/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/tests/test_validation.py
+++ /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
index ba63bb5328..0000000000
--- a/aria/multivim-plugin/src/main/python/multivim-plugin/nova_plugin/userdata.py
+++ /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
-}
diff --git a/asdc-controller/src/main/java/org/openecomp/mso/asdc/client/ASDCController.java b/asdc-controller/src/main/java/org/openecomp/mso/asdc/client/ASDCController.java
index c452089425..867efd5840 100644
--- a/asdc-controller/src/main/java/org/openecomp/mso/asdc/client/ASDCController.java
+++ b/asdc-controller/src/main/java/org/openecomp/mso/asdc/client/ASDCController.java
@@ -492,17 +492,17 @@ public class ASDCController {
try {
LOGGER.info(MessageEnum.ASDC_RECEIVE_SERVICE_NOTIF, "***WRITE FILE ARTIFACT NAME", "ASDC", artifact.getArtifactName());
- FileOutputStream outFile = new FileOutputStream(System.getProperty("mso.config.path") + "/ASDC" + "/" + artifact.getArtifactName());
- outFile.write(payloadBytes, 0, payloadBytes.length);
- outFile.close();
- } catch (Exception e) {
- LOGGER.debug("Exception :",e);
- LOGGER.error(MessageEnum.ASDC_ARTIFACT_DOWNLOAD_FAIL,
- artifact.getArtifactName (),
- artifact.getArtifactURL (),
- artifact.getArtifactUUID (),
- resultArtifact.getDistributionMessageResult (), "", "", MsoLogger.ErrorCode.DataError, "ASDC write to file failed");
- }
+ try (FileOutputStream outFile = new FileOutputStream(System.getProperty("mso.config.path") + "/ASDC" + "/" + artifact.getArtifactName())) {
+ outFile.write(payloadBytes, 0, payloadBytes.length);
+ }
+ } catch (Exception e) {
+ LOGGER.debug("Exception :",e);
+ LOGGER.error(MessageEnum.ASDC_ARTIFACT_DOWNLOAD_FAIL,
+ artifact.getArtifactName (),
+ artifact.getArtifactURL (),
+ artifact.getArtifactUUID (),
+ resultArtifact.getDistributionMessageResult (), "", "", MsoLogger.ErrorCode.DataError, "ASDC write to file failed");
+ }
}
diff --git a/bpmn/MSOCommonBPMN/pom.xml b/bpmn/MSOCommonBPMN/pom.xml
index 317413556c..1d255c4eb4 100644
--- a/bpmn/MSOCommonBPMN/pom.xml
+++ b/bpmn/MSOCommonBPMN/pom.xml
@@ -416,12 +416,12 @@
<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>
diff --git a/bpmn/MSOCommonBPMN/src/main/groovy/org/openecomp/mso/bpmn/common/scripts/OofHoming.groovy b/bpmn/MSOCommonBPMN/src/main/groovy/org/openecomp/mso/bpmn/common/scripts/OofHoming.groovy
index f0f239b50f..1b5a2ecdcb 100644
--- a/bpmn/MSOCommonBPMN/src/main/groovy/org/openecomp/mso/bpmn/common/scripts/OofHoming.groovy
+++ b/bpmn/MSOCommonBPMN/src/main/groovy/org/openecomp/mso/bpmn/common/scripts/OofHoming.groovy
@@ -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")) {
diff --git a/bpmn/MSOCommonBPMN/src/main/groovy/org/openecomp/mso/bpmn/common/scripts/OofUtils.groovy b/bpmn/MSOCommonBPMN/src/main/groovy/org/openecomp/mso/bpmn/common/scripts/OofUtils.groovy
index 79134fe757..b61739f32c 100644
--- a/bpmn/MSOCommonBPMN/src/main/groovy/org/openecomp/mso/bpmn/common/scripts/OofUtils.groovy
+++ b/bpmn/MSOCommonBPMN/src/main/groovy/org/openecomp/mso/bpmn/common/scripts/OofUtils.groovy
@@ -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
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/openecomp/mso/client/appc/ApplicationControllerAction.java b/bpmn/MSOCommonBPMN/src/main/java/org/openecomp/mso/client/appc/ApplicationControllerAction.java
index 713e25abf0..3c00627bff 100644
--- a/bpmn/MSOCommonBPMN/src/main/java/org/openecomp/mso/client/appc/ApplicationControllerAction.java
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/openecomp/mso/client/appc/ApplicationControllerAction.java
@@ -84,6 +84,7 @@ public class ApplicationControllerAction {
}
break;
case ConfigModify:
+ case ConfigScaleOut:
appCStatus = payloadAction(action, msoRequestId, vnfId, payload, controllerType);
break;
case UpgradePreCheck:
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/openecomp/mso/client/appc/ApplicationControllerClient.java b/bpmn/MSOCommonBPMN/src/main/java/org/openecomp/mso/client/appc/ApplicationControllerClient.java
index 4255df3e87..c9e2e880e7 100644
--- a/bpmn/MSOCommonBPMN/src/main/java/org/openecomp/mso/client/appc/ApplicationControllerClient.java
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/openecomp/mso/client/appc/ApplicationControllerClient.java
@@ -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);
diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/bpmn/common/OofHomingTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/bpmn/common/OofHomingTest.java
index 9020701ed3..1f64fb55f8 100644
--- a/bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/bpmn/common/OofHomingTest.java
+++ b/bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/bpmn/common/OofHomingTest.java
@@ -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\":\"" +
"\"}}}";
diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/client/appc/ApplicationControllerClientTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/client/appc/ApplicationControllerClientTest.java
index ec093bebbd..59be8235fe 100644
--- a/bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/client/appc/ApplicationControllerClientTest.java
+++ b/bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/client/appc/ApplicationControllerClientTest.java
@@ -44,13 +44,13 @@ public class ApplicationControllerClientTest {
@Test
public void testClientCreation() {
ApplicationControllerClient client = new ApplicationControllerClient("appc");
- assertEquals(client.getControllerType(), "appc");
+ assertEquals(client.getControllerType(), "APPC");
assertNotNull(client.getAppCClient());
}
@Test
public void createRequest_CheckLock_RequestBuilt() {
- ApplicationControllerClient client = new ApplicationControllerClient("appc");
+ ApplicationControllerClient client = new ApplicationControllerClient("APPC");
ActionIdentifiers actionIdentifiers = new ActionIdentifiers();
actionIdentifiers.setVnfId("vnfId");
CheckLockInput checkLockInput = (CheckLockInput) client.createRequest(Action.CheckLock, actionIdentifiers, null,
@@ -95,18 +95,19 @@ public class ApplicationControllerClientTest {
@Test
public void test_getLCMPropertiesHelper() {
- ApplicationControllerClient client = new ApplicationControllerClient("appc");
+ ApplicationControllerClient client = new ApplicationControllerClient();
Properties properties = client.getLCMProperties();
assertEquals(properties.get("topic.read"), "APPC-TEST-AMDOCS2");
assertEquals(properties.get("topic.write"), "APPC-TEST-AMDOCS1-DEV3");
- assertEquals(properties.get("topic.sdnc.read"), "SDNC-LCM-READ");
- assertEquals(properties.get("topic.sdnc.write"), "SDNC-LCM-WRITE");
+ assertEquals(properties.get("SDNC-topic.read"), "SDNC-LCM-READ");
+ assertEquals(properties.get("SDNC-topic.write"), "SDNC-LCM-WRITE");
assertEquals(properties.get("topic.read.timeout"), "120000");
assertEquals(properties.get("client.response.timeout"), "120000");
assertEquals(properties.get("poolMembers"),
"uebsb93kcdc.it.att.com:3904,uebsb92kcdc.it.att.com:3904,uebsb91kcdc.it.att.com:3904");
assertEquals(properties.get("client.key"), "iaEMAfjsVsZnraBP");
assertEquals(properties.get("client.secret"), "wcivUjsjXzmGFBfxMmyJu9dz");
+ assertEquals(properties.get("controllerType"), "appc");
}
} \ No newline at end of file
diff --git a/bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCallback2AR1Vnf b/bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCallback2AR1Vnf
index 808723828a..53cd70c514 100644
--- a/bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCallback2AR1Vnf
+++ b/bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCallback2AR1Vnf
@@ -54,7 +54,7 @@
"value": "False"
},
{
- "key": "cloudRegionId",
+ "key": "locationId",
"value": "dfwtx"
}
]
@@ -79,7 +79,7 @@
"value": "False"
},
{
- "key": "cloudRegionId",
+ "key": "locationId",
"value": "testCloudRegionId2"
}
]
@@ -100,7 +100,7 @@
"value": "aic"
},
{
- "key": "cloudRegionId",
+ "key": "locationId",
"value": "testCloudRegionId3"
},
{ "key":"flavors",
diff --git a/bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCallback2AR1Vnf2Net b/bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCallback2AR1Vnf2Net
index 8766df8dba..d95587746b 100644
--- a/bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCallback2AR1Vnf2Net
+++ b/bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCallback2AR1Vnf2Net
@@ -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" }
]
},
{
@@ -109,7 +109,7 @@
},
"assignmentInfo": [
{ "key": "cloudOwner", "value": "aic" },
- { "key": "cloudRegionId", "value": "testCloudRegionId3" },
+ { "key": "locationId", "value": "testCloudRegionId3" },
{ "key":"flavors", "value":{ "flavorLabel1xxx":"vimFlavorxxx", "flavorLabel2xxx":"vimFlavorxxx"}}
]
}
diff --git a/bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCallbackInfraVnf b/bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCallbackInfraVnf
index 8e6f2d46be..15e601bae8 100644
--- a/bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCallbackInfraVnf
+++ b/bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCallbackInfraVnf
@@ -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"}}
]
}
diff --git a/bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCallbackNoSolutionFound b/bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCallbackNoSolutionFound
index 8bb29f0c0a..2024df401b 100644
--- a/bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCallbackNoSolutionFound
+++ b/bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCallbackNoSolutionFound
@@ -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
diff --git a/bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCatalogResp.json b/bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCatalogResp.json
index 09026d1d8c..889431663d 100644
--- a/bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCatalogResp.json
+++ b/bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCatalogResp.json
@@ -37,7 +37,7 @@
},
"nfRole": "",
"nfType": "",
- "nfFunction": "",
+ "nfFunction": "ADIoDvCE",
"nfNamingCode": "",
"multiStageDesign": "N"
}
diff --git a/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/CreateVFCNSResource.groovy b/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/CreateVFCNSResource.groovy
index 1ec1df1f0e..fd819fd3d5 100644
--- a/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/CreateVFCNSResource.groovy
+++ b/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/CreateVFCNSResource.groovy
@@ -241,7 +241,7 @@ public class CreateVFCNSResource extends AbstractServiceTaskProcessor {
String serviceId = execution.getVariable("serviceInstanceId")
String addRelationPayload = """<relationship xmlns="http://org.openecomp.aai.inventory/v11">
<related-to>service-instance</related-to>
- <related-link>/aai/v11/business/customers/customer/${globalSubscriberId}/service-subscriptions/service-subscription/${serviceType}/service-instances/service-instance/${nsInstanceId}</related-link>
+ <related-link>/aai/v11/business/customers/customer/${globalSubscriberId}/service-subscriptions/service-subscription/${serviceType}/service-instances/service-instance/${serviceId}</related-link>
<relationship-data>
<relationship-key>customer.global-customer-id</relationship-key>
<relationship-value>${globalSubscriberId}</relationship-value>
@@ -252,12 +252,12 @@ public class CreateVFCNSResource extends AbstractServiceTaskProcessor {
</relationship-data>
<relationship-data>
<relationship-key>service-instance.service-instance-id</relationship-key>
- <relationship-value>${nsInstanceId}</relationship-value>
+ <relationship-value>${serviceId}</relationship-value>
</relationship-data>
</relationship>"""
String endpoint = execution.getVariable("URN_aai_endpoint")
utils.log("INFO","Add Relationship req:\n" + addRelationPayload, isDebugEnabled)
- String url = endpoint + "/aai/v11/business/customers/customer/" + globalSubscriberId + "/service-subscriptions/service-subscription/" + serviceType + "/service-instances/service-instance/" + serviceId + "/relationship-list/relationship"
+ String url = endpoint + "/aai/v11/business/customers/customer/" + globalSubscriberId + "/service-subscriptions/service-subscription/" + serviceType + "/service-instances/service-instance/" + nsInstanceId + "/relationship-list/relationship"
APIResponse aaiRsp = executeAAIPutCall(execution, url, addRelationPayload)
utils.log("INFO","aai response status code:" + aaiRsp.getStatusCode(), isDebugEnabled)
utils.log("INFO","aai response content:" + aaiRsp.getResponseBodyAsString(), isDebugEnabled)
diff --git a/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/CreateVfModuleInfra.groovy b/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/CreateVfModuleInfra.groovy
index 797086b125..0a53526263 100644
--- a/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/CreateVfModuleInfra.groovy
+++ b/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/CreateVfModuleInfra.groovy
@@ -23,6 +23,15 @@ package org.openecomp.mso.bpmn.infrastructure.scripts;
import groovy.json.JsonSlurper
import groovy.json.JsonOutput
+import javax.xml.parsers.DocumentBuilder
+import javax.xml.parsers.DocumentBuilderFactory
+
+import org.w3c.dom.Document
+import org.w3c.dom.Element
+import org.w3c.dom.Node
+import org.w3c.dom.NodeList
+import org.xml.sax.InputSource
+
import org.camunda.bpm.engine.delegate.BpmnError
import org.camunda.bpm.engine.delegate.DelegateExecution
import org.onap.appc.client.lcm.model.Action
@@ -42,6 +51,12 @@ public class CreateVfModuleInfra extends AbstractServiceTaskProcessor {
ExceptionUtil exceptionUtil = new ExceptionUtil()
JsonUtils jsonUtil = new JsonUtils()
+
+ private AbstractServiceTaskProcessor taskProcessor
+
+ public SDNCAdapterUtils(AbstractServiceTaskProcessor taskProcessor) {
+ this.taskProcessor = taskProcessor
+ }
/**
* Validates the request message and sets up the workflow.
@@ -217,6 +232,7 @@ public class CreateVfModuleInfra extends AbstractServiceTaskProcessor {
execution.setVariable(prefix + 'vfModuleId', newVfModuleId)
execution.setVariable('actionHealthCheck', Action.HealthCheck)
execution.setVariable('actionConfigScaleOut', Action.ConfigScaleOut)
+ execution.setVariable('controllerType', "APPC")
def controllerType = execution.getVariable('controllerType')
execution.setVariable(prefix + 'controllerType', controllerType)
execution.setVariable('healthCheckIndex0', 0)
@@ -303,11 +319,55 @@ public class CreateVfModuleInfra extends AbstractServiceTaskProcessor {
if(vnf.isPresent()){
def vnfOrchestrationStatus = vnf.get().getOrchestrationStatus();
if("active".equalsIgnoreCase(vnfOrchestrationStatus)){
- execution.setVariable("runHealthCheck", true);
+ execution.setVariable("runHealthCheck", false);
execution.setVariable("runConfigScaleOut", true);
}
}
}
+
+ /**
+ * Retrieve data for ConfigScaleOut from SDNC topology
+ */
+
+ public void retreiveConfigScaleOutData(DelegateExecution execution){
+ def isDebugEnabled = execution.getVariable("isDebugLogEnabled")
+ def vfModuleId = execution.getVariable("CVFMI_vfModuleId")
+ String ipAddress = "";
+ String oamIpAddress = "";
+ String vnfHostIpAddress = "";
+
+ String vnfGetSDNC = execution.getVariable("DCVFM_getSDNCAdapterResponse");
+
+ String data = utils.getNodeXml(vnfGetSDNC, "response-data")
+ data = data.replaceAll("&lt;", "<")
+ data = data.replaceAll("&gt;", ">")
+
+ InputSource source = new InputSource(new StringReader(data));
+ DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
+ docFactory.setNamespaceAware(true)
+ DocumentBuilder docBuilder = docFactory.newDocumentBuilder()
+ Document responseXml = docBuilder.parse(source)
+
+ NodeList paramsList = responseXml.getElementsByTagNameNS("*", "vnf-parameters")
+ for (int z = 0; z < paramsList.getLength(); z++) {
+ Node node = paramsList.item(z)
+ Element eElement = (Element) node
+ String vnfParameterName = utils.getElementText(eElement, "vnf-parameter-name")
+ String vnfParameterValue = utils.getElementText(eElement, "vnf-parameter-value")
+ if (vnfParameterName.equals("vlb_private_ip_1")) {
+ vnfHostIpAddress = vnfParameterValue
+ }
+ else if (vnfParameterName.equals("vdns_private_ip_0")) {
+ ipAddress = vnfParameterValue
+ }
+ else if (vnfParameterName.equals("vdns_private_ip_1")) {
+ oamIpAddress = vnfParameterValue
+ }
+ }
+
+ String payload = "{\"request-parameters\":{\"vnf-host-ip-address\":\"" + vnfHostIpAddress + "\",\"vf-module-id\":\"" + vfModuleId + "\"},\"configuration-parameters\":{\"ip-addr\":\"" + ipAddress +"\", \"oam-ip-addr\":\""+ oamIpAddress +"\",\"enabled\":\"true\"}}"
+ execution.setVariable("payload", payload);
+ }
/**
*
diff --git a/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/DoCreateResources.groovy b/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/DoCreateResources.groovy
index ae75d54afe..ab84168007 100644
--- a/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/DoCreateResources.groovy
+++ b/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/DoCreateResources.groovy
@@ -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)
}
diff --git a/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/DoDeleteVFCNetworkServiceInstance.groovy b/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/DoDeleteVFCNetworkServiceInstance.groovy
index f0ecbab82c..d3e89df7bf 100644
--- a/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/DoDeleteVFCNetworkServiceInstance.groovy
+++ b/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/DoDeleteVFCNetworkServiceInstance.groovy
@@ -107,7 +107,7 @@ public class DoDeleteVFCNetworkServiceInstance extends AbstractServiceTaskProces
*/
public void deleteNSRelationship(DelegateExecution execution) {
def isDebugEnabled=execution.getVariable("isDebugLogEnabled")
- utils.log("INFO"," ***** addNSRelationship *****", isDebugEnabled)
+ utils.log("INFO"," ***** deleteNSRelationship *****", isDebugEnabled)
String nsInstanceId = execution.getVariable("resourceInstanceId")
if(nsInstanceId == null || nsInstanceId == ""){
utils.log("INFO"," Delete NS failed", isDebugEnabled)
@@ -133,13 +133,13 @@ public class DoDeleteVFCNetworkServiceInstance extends AbstractServiceTaskProces
</relationship-data>
</relationship>"""
String endpoint = execution.getVariable("URN_aai_endpoint")
- utils.log("INFO","Add Relationship req:\n" + deleteRelationPayload, isDebugEnabled)
+ utils.log("INFO","Delete Relationship req:\n" + deleteRelationPayload, isDebugEnabled)
String url = endpoint + "/aai/v11/business/customers/customer/" + globalSubscriberId + "/service-subscriptions/service-subscription/" + serviceType + "/service-instances/service-instance/" + serviceId + "/relationship-list/relationship"
APIResponse aaiRsp = executeAAIDeleteCall(execution, url, deleteRelationPayload)
utils.log("INFO","aai response status code:" + aaiRsp.getStatusCode(), isDebugEnabled)
utils.log("INFO","aai response content:" + aaiRsp.getResponseBodyAsString(), isDebugEnabled)
- utils.log("INFO"," *****Exit addNSRelationship *****", isDebugEnabled)
+ utils.log("INFO"," *****Exit deleteNSRelationship *****", isDebugEnabled)
}
public APIResponse executeAAIDeleteCall(DelegateExecution execution, String url, String payload){
diff --git a/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/DoScaleVFCNetworkServiceInstance.groovy b/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/DoScaleVFCNetworkServiceInstance.groovy
index 0e4aea00ae..c1ffc5abef 100644
--- a/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/DoScaleVFCNetworkServiceInstance.groovy
+++ b/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/DoScaleVFCNetworkServiceInstance.groovy
@@ -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()
diff --git a/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/DoUpdateE2EServiceInstance.groovy b/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/DoUpdateE2EServiceInstance.groovy
index dff1ecf68e..74c991e637 100644
--- a/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/DoUpdateE2EServiceInstance.groovy
+++ b/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/DoUpdateE2EServiceInstance.groovy
@@ -126,11 +126,16 @@ public class DoUpdateE2EServiceInstance extends AbstractServiceTaskProcessor {
// user params
String uuiRequest = execution.getVariable("uuiRequest")
+
+ // target model Invariant uuid
+ String modelInvariantUuid = jsonUtil.getJsonValue(uuiRequest, "service.serviceInvariantUuid")
+ execution.setVariable("modelInvariantUuid", modelInvariantUuid)
+ utils.log("INFO", "modelInvariantUuid: " + modelInvariantUuid, isDebugEnabled)
+
// target model uuid
String modelUuid = jsonUtil.getJsonValue(uuiRequest, "service.serviceUuid")
- execution.setVariable("modelUuid", modelUuid)
-
- utils.log("INFO","modelUuid: " + modelUuid, isDebugEnabled)
+ execution.setVariable("modelUuid", modelUuid)
+ utils.log("INFO", "modelUuid: " + modelUuid, isDebugEnabled)
} catch (BpmnError e) {
throw e;
@@ -327,9 +332,20 @@ public class DoUpdateE2EServiceInstance extends AbstractServiceTaskProcessor {
String msg = ""
utils.log("INFO"," ***** preProcessAAIPUT *****", isDebugEnabled)
- String modelUuid = execution.getVariable("modelUuid")
+
String serviceInstanceVersion = execution.getVariable("serviceInstanceVersion")
- 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("modelUuid")
+
AaiUtil aaiUriUtil = new AaiUtil(this)
utils.log("INFO","start create aai uri: " + aaiUriUtil, isDebugEnabled)
@@ -341,7 +357,13 @@ public class DoUpdateE2EServiceInstance extends AbstractServiceTaskProcessor {
//update target model to aai
String serviceInstanceData =
"""<service-instance xmlns=\"${namespace}\">
- <model-version-id">${modelUuid}</model-version-id>
+ <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)
diff --git a/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/DoUpdateE2EServiceInstanceRollback.groovy b/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/DoUpdateE2EServiceInstanceRollback.groovy
index 1e70f95bd3..a55ca0225a 100644
--- a/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/DoUpdateE2EServiceInstanceRollback.groovy
+++ b/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/DoUpdateE2EServiceInstanceRollback.groovy
@@ -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)
diff --git a/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/ScaleCustomE2EServiceInstance.groovy b/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/ScaleCustomE2EServiceInstance.groovy
index 58f644d53f..4eca37b304 100644
--- a/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/ScaleCustomE2EServiceInstance.groovy
+++ b/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/ScaleCustomE2EServiceInstance.groovy
@@ -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>
diff --git a/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/UpdateCustomE2EServiceInstance.groovy b/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/UpdateCustomE2EServiceInstance.groovy
index a964a7e32a..f3f1a96258 100644
--- a/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/UpdateCustomE2EServiceInstance.groovy
+++ b/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/UpdateCustomE2EServiceInstance.groovy
@@ -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>
diff --git a/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/vcpe/scripts/CreateVcpeResCustService.groovy b/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/vcpe/scripts/CreateVcpeResCustService.groovy
index 694aafc887..68f50e033c 100644
--- a/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/vcpe/scripts/CreateVcpeResCustService.groovy
+++ b/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/vcpe/scripts/CreateVcpeResCustService.groovy
@@ -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()
diff --git a/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/vcpe/scripts/DeleteVcpeResCustService.groovy b/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/vcpe/scripts/DeleteVcpeResCustService.groovy
index aa16d3b280..08edb88c61 100644
--- a/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/vcpe/scripts/DeleteVcpeResCustService.groovy
+++ b/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/vcpe/scripts/DeleteVcpeResCustService.groovy
@@ -242,8 +242,8 @@ public class DeleteVcpeResCustService extends AbstractServiceTaskProcessor {
if(isBlank(type) || isBlank(id)) {
- } else if(type == "TunnelXConn") {
- utils.log("DEBUG","TunnelXConn AR found", isDebugEnabled)
+ } else if(type == "TunnelXConn" || type == "Tunnel XConn") {
+ utils.log("DEBUG","Tunnel XConn AR found", isDebugEnabled)
TXC_found = true
TXC_id = id
diff --git a/bpmn/MSOInfrastructureBPMN/src/main/java/org/openecomp/mso/bpmn/infrastructure/properties/BPMNProperties.java b/bpmn/MSOInfrastructureBPMN/src/main/java/org/openecomp/mso/bpmn/infrastructure/properties/BPMNProperties.java
index dbb552c818..64d8530df1 100644
--- a/bpmn/MSOInfrastructureBPMN/src/main/java/org/openecomp/mso/bpmn/infrastructure/properties/BPMNProperties.java
+++ b/bpmn/MSOInfrastructureBPMN/src/main/java/org/openecomp/mso/bpmn/infrastructure/properties/BPMNProperties.java
@@ -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
index 0000000000..71f4a28c88
--- /dev/null
+++ b/bpmn/MSOInfrastructureBPMN/src/main/resources/process/CreateCustom3rdONAPServiceInstance.bpmn
@@ -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>
diff --git a/bpmn/MSOInfrastructureBPMN/src/main/resources/process/CreateVcpeResCustService.bpmn b/bpmn/MSOInfrastructureBPMN/src/main/resources/process/CreateVcpeResCustService.bpmn
index ea48104ba7..876f91ff42 100644
--- a/bpmn/MSOInfrastructureBPMN/src/main/resources/process/CreateVcpeResCustService.bpmn
+++ b/bpmn/MSOInfrastructureBPMN/src/main/resources/process/CreateVcpeResCustService.bpmn
@@ -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>
diff --git a/bpmn/MSOInfrastructureBPMN/src/main/resources/process/CreateVcpeResCustServiceV2.bpmn b/bpmn/MSOInfrastructureBPMN/src/main/resources/process/CreateVcpeResCustServiceV2.bpmn
index 94b88f7c3c..99b1ff51e9 100644
--- a/bpmn/MSOInfrastructureBPMN/src/main/resources/process/CreateVcpeResCustServiceV2.bpmn
+++ b/bpmn/MSOInfrastructureBPMN/src/main/resources/process/CreateVcpeResCustServiceV2.bpmn
@@ -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>
diff --git a/bpmn/MSOInfrastructureBPMN/src/main/resources/process/CreateVfModuleInfra.bpmn b/bpmn/MSOInfrastructureBPMN/src/main/resources/process/CreateVfModuleInfra.bpmn
index f882094851..c0c2f26035 100644
--- a/bpmn/MSOInfrastructureBPMN/src/main/resources/process/CreateVfModuleInfra.bpmn
+++ b/bpmn/MSOInfrastructureBPMN/src/main/resources/process/CreateVfModuleInfra.bpmn
@@ -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
index 0000000000..e0747eb32e
--- /dev/null
+++ b/bpmn/MSOInfrastructureBPMN/src/main/resources/process/DeleteCustom3rdONAPServiceInstance.bpmn
@@ -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>
diff --git a/bpmn/MSOInfrastructureBPMN/src/main/resources/subprocess/DoCreateVnfAndModules.bpmn b/bpmn/MSOInfrastructureBPMN/src/main/resources/subprocess/DoCreateVnfAndModules.bpmn
index 675b8fadb5..8cbc7e97cd 100644
--- a/bpmn/MSOInfrastructureBPMN/src/main/resources/subprocess/DoCreateVnfAndModules.bpmn
+++ b/bpmn/MSOInfrastructureBPMN/src/main/resources/subprocess/DoCreateVnfAndModules.bpmn
@@ -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>
diff --git a/bpmn/MSOInfrastructureBPMN/src/main/resources/subprocess/DoUpdateE2EServiceInstance.bpmn b/bpmn/MSOInfrastructureBPMN/src/main/resources/subprocess/DoUpdateE2EServiceInstance.bpmn
index 35cd0399cf..41c9a674ed 100644
--- a/bpmn/MSOInfrastructureBPMN/src/main/resources/subprocess/DoUpdateE2EServiceInstance.bpmn
+++ b/bpmn/MSOInfrastructureBPMN/src/main/resources/subprocess/DoUpdateE2EServiceInstance.bpmn
@@ -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.*
-def dcsi = new DoCreateResources()
-dcsi.preProcessRollback(execution)
+ <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.*
-def dcsi = new DoCreateResources()
-dcsi.postProcessRollback(execution)
+ <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" />
diff --git a/bpmn/MSOInfrastructureBPMN/src/test/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/DoCustomDeleteE2EServiceInstanceTest.groovy b/bpmn/MSOInfrastructureBPMN/src/test/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/DoCustomDeleteE2EServiceInstanceTest.groovy
index 5b5a70006a..c301b65c41 100644
--- a/bpmn/MSOInfrastructureBPMN/src/test/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/DoCustomDeleteE2EServiceInstanceTest.groovy
+++ b/bpmn/MSOInfrastructureBPMN/src/test/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/DoCustomDeleteE2EServiceInstanceTest.groovy
@@ -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
diff --git a/bpmn/MSOInfrastructureBPMN/src/test/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/ScaleCustomE2EServiceInstanceTest.groovy b/bpmn/MSOInfrastructureBPMN/src/test/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/ScaleCustomE2EServiceInstanceTest.groovy
index e7ffe05424..063f4b571b 100644
--- a/bpmn/MSOInfrastructureBPMN/src/test/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/ScaleCustomE2EServiceInstanceTest.groovy
+++ b/bpmn/MSOInfrastructureBPMN/src/test/groovy/org/openecomp/mso/bpmn/infrastructure/scripts/ScaleCustomE2EServiceInstanceTest.groovy
@@ -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()
diff --git a/bpmn/MSOInfrastructureBPMN/src/test/groovy/org/openecomp/mso/bpmn/vcpe/scripts/CreateVcpeResCustServiceTest.groovy b/bpmn/MSOInfrastructureBPMN/src/test/groovy/org/openecomp/mso/bpmn/vcpe/scripts/CreateVcpeResCustServiceTest.groovy
index a735121002..a8401d7a02 100644
--- a/bpmn/MSOInfrastructureBPMN/src/test/groovy/org/openecomp/mso/bpmn/vcpe/scripts/CreateVcpeResCustServiceTest.groovy
+++ b/bpmn/MSOInfrastructureBPMN/src/test/groovy/org/openecomp/mso/bpmn/vcpe/scripts/CreateVcpeResCustServiceTest.groovy
@@ -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)
diff --git a/bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/CreateVcpeResCustService/arGetById.xml b/bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/CreateVcpeResCustService/arGetById.xml
index bb7f4c20fd..f2063442d6 100644
--- a/bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/CreateVcpeResCustService/arGetById.xml
+++ b/bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/CreateVcpeResCustService/arGetById.xml
@@ -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>
diff --git a/bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/CreateVcpeResCustService/getCatalogServiceResourcesData.json b/bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/CreateVcpeResCustService/getCatalogServiceResourcesData.json
index 81fdcc76d0..e99dd9ccda 100644
--- a/bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/CreateVcpeResCustService/getCatalogServiceResourcesData.json
+++ b/bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/CreateVcpeResCustService/getCatalogServiceResourcesData.json
@@ -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,
diff --git a/bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/DeleteVcpeResCustService/arGetTXCById.xml b/bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/DeleteVcpeResCustService/arGetTXCById.xml
index 65cee9f662..97992fc00b 100644
--- a/bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/DeleteVcpeResCustService/arGetTXCById.xml
+++ b/bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/DeleteVcpeResCustService/arGetTXCById.xml
@@ -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>
diff --git a/bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/DoCreateAllottedResourceTXCRollback/arGetById.xml b/bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/DoCreateAllottedResourceTXCRollback/arGetById.xml
index bb7f4c20fd..f2063442d6 100644
--- a/bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/DoCreateAllottedResourceTXCRollback/arGetById.xml
+++ b/bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/DoCreateAllottedResourceTXCRollback/arGetById.xml
@@ -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>
diff --git a/bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/DoDeleteAllottedResourceTXC/arGetById.xml b/bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/DoDeleteAllottedResourceTXC/arGetById.xml
index bb7f4c20fd..f2063442d6 100644
--- a/bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/DoDeleteAllottedResourceTXC/arGetById.xml
+++ b/bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/DoDeleteAllottedResourceTXC/arGetById.xml
@@ -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>
diff --git a/bpmn/MSOInfrastructureBPMN/src/test/resources/mso.bpmn.urn.properties b/bpmn/MSOInfrastructureBPMN/src/test/resources/mso.bpmn.urn.properties
index fc84d9ea85..6dac08dc56 100644
--- a/bpmn/MSOInfrastructureBPMN/src/test/resources/mso.bpmn.urn.properties
+++ b/bpmn/MSOInfrastructureBPMN/src/test/resources/mso.bpmn.urn.properties
@@ -114,10 +114,10 @@ policy.environment=TEST
policy.endpoint=http://localhost:28090/pdp/api/
policy.default.disposition=Skip
-appc.client.topic.read=APPC-CL-FUSION-LCM-RESPONSE
-appc.client.topic.write=APPC-CL-FUSION-LCM
-appc.client.topic.sdnc.read=SDNC-LCM-READ
-appc.client.topic.sdnc.write=SDNC-LCM-WRITE
+appc.client.topic.read=APPC-LCM-WRITE
+appc.client.topic.write=APPC-LCM-READ
+appc.client.topic.sdnc.read=SDNC-LCM-WRITE
+appc.client.topic.sdnc.write=SDNC-LCM-READ
appc.client.topic.read.timeout=100
appc.client.response.timeout=300
appc.client.poolMembers=localhost:28090
diff --git a/common/pom.xml b/common/pom.xml
index aa3b09597a..86b9f36e50 100644
--- a/common/pom.xml
+++ b/common/pom.xml
@@ -123,12 +123,12 @@
<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>
diff --git a/docs/Install_Docker.rst b/docs/Install_Docker.rst
index 5712691dbf..22a76a4fbf 100644
--- a/docs/Install_Docker.rst
+++ b/docs/Install_Docker.rst
@@ -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 Technologies Co., Ltd.
+.. Copyright 2018 Huawei Technologies Co., Ltd.
Install Docker
===============
diff --git a/docs/SO_R1_Interface.rst b/docs/SO_Interface.rst
index bd654083e3..15e75fa8c6 100644
--- a/docs/SO_R1_Interface.rst
+++ b/docs/SO_Interface.rst
@@ -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
index 0000000000..8e477acc46
--- /dev/null
+++ b/docs/images/SO_1.png
Binary files differ
diff --git a/docs/images/SO_Architecture_1.png b/docs/images/SO_Architecture_1.png
index a50c01bdd9..53836ffd8c 100644
--- a/docs/images/SO_Architecture_1.png
+++ b/docs/images/SO_Architecture_1.png
Binary files differ
diff --git a/docs/images/SO_R1_1.png b/docs/images/SO_R1_1.png
deleted file mode 100644
index 06d9eb3727..0000000000
--- a/docs/images/SO_R1_1.png
+++ /dev/null
Binary files differ
diff --git a/docs/index.rst b/docs/index.rst
index 9fd4cc3f97..86b6447017 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -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 Technologies Co., Ltd.
+.. Copyright 2018 Huawei Technologies Co., Ltd.
ONAP SO
========================================
diff --git a/docs/installation.rst b/docs/installation.rst
index 07f534e1b3..cde26e021a 100644
--- a/docs/installation.rst
+++ b/docs/installation.rst
@@ -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
==========================================
diff --git a/docs/offered_consumed_apis.rst b/docs/offered_consumed_apis.rst
index 8888c6437e..f18b5bdd60 100644
--- a/docs/offered_consumed_apis.rst
+++ b/docs/offered_consumed_apis.rst
@@ -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 Technologies Co., Ltd.
+.. Copyright 2018 Huawei Technologies Co., Ltd.
SO Offered and Consumed APIs
=====================================
@@ -12,4 +12,4 @@ All the Service Orchestrator APIs, both inward and outward are documented in the
.. toctree::
:maxdepth: 1
- SO_R1_Interface.rst
+ SO_Interface.rst
diff --git a/docs/release-notes.rst b/docs/release-notes.rst
index f05f9ce938..b27b2a3eca 100644
--- a/docs/release-notes.rst
+++ b/docs/release-notes.rst
@@ -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
===========
diff --git a/mso-api-handlers/mso-api-handler-common/pom.xml b/mso-api-handlers/mso-api-handler-common/pom.xml
index 5b15c5f0d4..6ca1f3de28 100644
--- a/mso-api-handlers/mso-api-handler-common/pom.xml
+++ b/mso-api-handlers/mso-api-handler-common/pom.xml
@@ -50,6 +50,12 @@
<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>
diff --git a/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/CamundaClient.java b/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/CamundaClient.java
index d03aaef258..c0cfdf9bec 100644
--- a/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/CamundaClient.java
+++ b/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/CamundaClient.java
@@ -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());
diff --git a/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/CamundaTaskClient.java b/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/CamundaTaskClient.java
index 845b140348..cbbbff3dff 100644
--- a/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/CamundaTaskClient.java
+++ b/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/CamundaTaskClient.java
@@ -64,19 +64,18 @@ public class CamundaTaskClient extends RequestClient{
@Override
public HttpResponse post(String camundaReqXML, String requestId,
String requestTimeout, String schemaVersion, String serviceInstanceId, String action) {
- msoLogger.debug("Method not supported");
- return null;
+ throw new UnsupportedOperationException("Method not supported.");
}
@Override
public HttpResponse post(RequestClientParamater params) {
- return null;
+ throw new UnsupportedOperationException("Method not supported.");
}
@Override
- public HttpResponse get() throws IOException{
+ public HttpResponse get() throws IOException {
HttpGet get = new HttpGet(url);
- msoLogger.debug("Camunda Task url is: "+ url);
+ msoLogger.debug("Camunda Task url is: "+ url);
String encryptedCredentials;
if(props!=null){
encryptedCredentials = props.getProperty(CommonConstants.CAMUNDA_AUTH,null);
diff --git a/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/RequestClient.java b/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/RequestClient.java
index ed5d076d8c..66369a8b69 100644
--- a/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/RequestClient.java
+++ b/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/RequestClient.java
@@ -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
index 0000000000..f892d13599
--- /dev/null
+++ b/mso-api-handlers/mso-api-handler-common/src/test/java/org/openecomp/mso/apihandler/common/CamundaTaskClientTest.java
@@ -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
diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/E2EServiceInstances.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/E2EServiceInstances.java
index dca2069cec..275351d55d 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/E2EServiceInstances.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/openecomp/mso/apihandlerinfra/E2EServiceInstances.java
@@ -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,
diff --git a/mso-catalog-db/src/main/java/org/openecomp/mso/db/catalog/CatalogDatabase.java b/mso-catalog-db/src/main/java/org/openecomp/mso/db/catalog/CatalogDatabase.java
index 91c19dd97f..af0ea101f4 100644
--- a/mso-catalog-db/src/main/java/org/openecomp/mso/db/catalog/CatalogDatabase.java
+++ b/mso-catalog-db/src/main/java/org/openecomp/mso/db/catalog/CatalogDatabase.java
@@ -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")
diff --git a/mso-catalog-db/src/main/java/org/openecomp/mso/db/catalog/beans/HeatEnvironment.java b/mso-catalog-db/src/main/java/org/openecomp/mso/db/catalog/beans/HeatEnvironment.java
index 899127c048..8baf62018c 100644
--- a/mso-catalog-db/src/main/java/org/openecomp/mso/db/catalog/beans/HeatEnvironment.java
+++ b/mso-catalog-db/src/main/java/org/openecomp/mso/db/catalog/beans/HeatEnvironment.java
@@ -38,8 +38,6 @@ public class HeatEnvironment extends MavenLikeVersioning implements Serializable
private Timestamp created = null;
- public HeatEnvironment() {}
-
public String getArtifactUuid() {
return this.artifactUuid;
}
diff --git a/mso-catalog-db/src/main/java/org/openecomp/mso/db/catalog/beans/HeatFiles.java b/mso-catalog-db/src/main/java/org/openecomp/mso/db/catalog/beans/HeatFiles.java
index 8d7da22673..542cd45081 100644
--- a/mso-catalog-db/src/main/java/org/openecomp/mso/db/catalog/beans/HeatFiles.java
+++ b/mso-catalog-db/src/main/java/org/openecomp/mso/db/catalog/beans/HeatFiles.java
@@ -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;
diff --git a/packages/docker/src/main/docker/docker-files/Dockerfile.mso-chef-final b/packages/docker/src/main/docker/docker-files/Dockerfile.mso-chef-final
index 7b5f06ae98..bbb3d1e4bf 100644
--- a/packages/docker/src/main/docker/docker-files/Dockerfile.mso-chef-final
+++ b/packages/docker/src/main/docker/docker-files/Dockerfile.mso-chef-final
@@ -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 c4c29e2a66..e51ad70302 100644
--- 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>
diff --git a/version.properties b/version.properties
index d3e09bb170..e1e6b0b337 100644
--- a/version.properties
+++ b/version.properties
@@ -4,7 +4,7 @@
major=1
minor=2
-patch=1
+patch=2
base_version=${major}.${minor}.${patch}