From cf90f6988c717eb609f5da7d1aee04c668b21fe9 Mon Sep 17 00:00:00 2001 From: "Benjamin, Max (mb388a)" Date: Fri, 10 Aug 2018 17:19:31 -0400 Subject: [PATCH] Casablana bugfixes updated mock in unassignnetworkbbtest instead of base added mock to extract pojos method in unassignnetwork Return gBuildingBlockExecution from calls to VnfAdapter subprocess Correct JUnit data to expect modelInfoVfModule Enable Spring Security for logging of unauthorized/bad credentials errors Fix handling of a case of no VF Modules in a VNF resource. fix populating lookupKeyMap with resource ids removed unnecessary test resources Issue-ID: SO-848 Change-Id: Id89f075dcac4042bf8fb1e207e66d289d079171f Signed-off-by: Benjamin, Max (mb388a) --- .../org/onap/so/asdc/client/ASDCController.java | 48 ++- .../installer/heat/ToscaResourceInstaller.java | 44 +- .../onap/so/asdc/util/ASDCNotificationLogging.java | 4 + .../installer/heat/ToscaResourceInstallerTest.java | 135 ------ .../Notification_MultipleModules.txt | 302 -------------- .../multipleModules/ServiceResponse.json | 458 --------------------- .../multipleModules/notif-structure.json | 96 ----- .../multipleModules/pxmc_base.env | 2 - .../multipleModules/pxmc_base.yaml | 45 -- .../resource-examples/multipleModules/pxmc_mmn.env | 18 - .../multipleModules/pxmc_mmn.yaml | 152 ------- .../multipleModules/pxmc_mmn_volume.env | 9 - .../multipleModules/pxmc_mmn_volume.yaml | 86 ---- .../resource-examples/multipleModules/pxmc_vmt.env | 17 - .../multipleModules/pxmc_vmt.yaml | 128 ------ .../service-VfZrdm5bpxmc02092017Service-csar.csar | Bin 97867 -> 0 bytes .../multipleModules/testStructure.json | 217 ---------- .../user_data_zrdm5bpxmc02mmn001.txt | 412 ------------------ .../user_data_zrdm5bpxmc02vmt001.txt | 289 ------------- .../vfzrdm5bpxmc02092017vf0_modules.json | 75 ---- .../servicedecomposition/tasks/BBInputSetup.java | 145 ++++--- .../tasks/BBInputSetupMapperLayer.java | 8 +- .../tasks/BBInputSetupUtils.java | 2 +- .../tasks/BBInputSetupTest.java | 76 ++-- .../tasks/BBInputSetupUtilsTest.java | 2 +- .../ExecuteBuildingBlock/GenericVnfExpected.json | 4 +- .../subprocess/BuildingBlock/CreateVfModuleBB.bpmn | 36 +- .../BuildingBlock/CreateVolumeGroupBB.bpmn | 38 +- .../subprocess/BuildingBlock/DeleteVfModuleBB.bpmn | 1 + .../BuildingBlock/UnassignNetwork1802BB.bpmn | 29 +- .../bpmn/subprocess/CreateVfModuleBBTest.java | 23 +- .../bpmn/subprocess/CreateVolumeGroupBBTest.java | 17 +- .../bpmn/subprocess/UnassignNetwork1802BBTest.java | 6 +- .../scripts/DoUpdateVnfAndModules.groovy | 27 +- .../infrastructure/aai/tasks/AAIUpdateTasks.java | 23 ++ .../flowspecific/tasks/UnassignNetworkBB.java | 18 +- .../vnf/mapper/VnfAdapterVfModuleObjectMapper.java | 2 + .../client/orchestration/AAIVfModuleResources.java | 9 + .../orchestration/AAIVolumeGroupResources.java | 8 + .../mapper/ServiceTopologyOperationMapper.java | 4 +- .../aai/tasks/AAIUpdateTasksTest.java | 36 +- .../flowspecific/tasks/UnassignNetworkBBTest.java | 35 +- .../VnfAdapterVfModuleObjectMapperPayloadTest.java | 70 ++++ .../orchestration/AAIVfModuleResourcesTest.java | 13 + .../orchestration/AAIVolumeGroupResourcesTest.java | 13 + ...WithNoEnvironmentAndWorkloadContextRequest.json | 67 +++ 46 files changed, 584 insertions(+), 2665 deletions(-) delete mode 100644 asdc-controller/src/test/resources/resource-examples/multipleModules/Notification_MultipleModules.txt delete mode 100644 asdc-controller/src/test/resources/resource-examples/multipleModules/ServiceResponse.json delete mode 100644 asdc-controller/src/test/resources/resource-examples/multipleModules/notif-structure.json delete mode 100644 asdc-controller/src/test/resources/resource-examples/multipleModules/pxmc_base.env delete mode 100644 asdc-controller/src/test/resources/resource-examples/multipleModules/pxmc_base.yaml delete mode 100644 asdc-controller/src/test/resources/resource-examples/multipleModules/pxmc_mmn.env delete mode 100644 asdc-controller/src/test/resources/resource-examples/multipleModules/pxmc_mmn.yaml delete mode 100644 asdc-controller/src/test/resources/resource-examples/multipleModules/pxmc_mmn_volume.env delete mode 100644 asdc-controller/src/test/resources/resource-examples/multipleModules/pxmc_mmn_volume.yaml delete mode 100644 asdc-controller/src/test/resources/resource-examples/multipleModules/pxmc_vmt.env delete mode 100644 asdc-controller/src/test/resources/resource-examples/multipleModules/pxmc_vmt.yaml delete mode 100644 asdc-controller/src/test/resources/resource-examples/multipleModules/service-VfZrdm5bpxmc02092017Service-csar.csar delete mode 100644 asdc-controller/src/test/resources/resource-examples/multipleModules/testStructure.json delete mode 100644 asdc-controller/src/test/resources/resource-examples/multipleModules/user_data_zrdm5bpxmc02mmn001.txt delete mode 100644 asdc-controller/src/test/resources/resource-examples/multipleModules/user_data_zrdm5bpxmc02vmt001.txt delete mode 100644 asdc-controller/src/test/resources/resource-examples/multipleModules/vfzrdm5bpxmc02092017vf0_modules.json create mode 100644 bpmn/so-bpmn-tasks/src/test/resources/__files/BuildingBlocks/VnfAndVfModuleMapper/vnfAdapterCreateVfModuleWithNoEnvironmentAndWorkloadContextRequest.json diff --git a/asdc-controller/src/main/java/org/onap/so/asdc/client/ASDCController.java b/asdc-controller/src/main/java/org/onap/so/asdc/client/ASDCController.java index 7423a7a197..55a437f2c0 100644 --- a/asdc-controller/src/main/java/org/onap/so/asdc/client/ASDCController.java +++ b/asdc-controller/src/main/java/org/onap/so/asdc/client/ASDCController.java @@ -25,6 +25,7 @@ package org.onap.so.asdc.client; import java.io.FileOutputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; +import java.util.ArrayList; import java.util.List; import org.onap.sdc.api.IDistributionClient; @@ -44,6 +45,7 @@ import org.onap.so.asdc.client.exceptions.ASDCParametersException; import org.onap.so.asdc.client.exceptions.ArtifactInstallerException; import org.onap.so.asdc.installer.IVfResourceInstaller; import org.onap.so.asdc.installer.ToscaResourceStructure; +import org.onap.so.asdc.installer.VfModuleStructure; import org.onap.so.asdc.installer.VfResourceStructure; import org.onap.so.asdc.installer.heat.ToscaResourceInstaller; import org.onap.so.asdc.tenantIsolation.DistributionStatus; @@ -671,7 +673,23 @@ public class ASDCController { try { - this.processCsarServiceArtifacts(iNotif, toscaResourceStructure); + this.processCsarServiceArtifacts(iNotif, toscaResourceStructure); + + // Install a service with no resources, only the service itself + if (iNotif.getResources() == null || iNotif.getResources().size() < 1) { + + LOGGER.debug("No resources found for Service: " + iNotif.getServiceUUID()); + + try{ + resourceStructure = new VfResourceStructure(iNotif,new ResourceInstance()); + + this.deployResourceStructure(resourceStructure, toscaResourceStructure); + + } catch(ArtifactInstallerException e){ + deploySuccessful = false; + errorMessage = e.getMessage(); + } + } else { // Services with resources for (IResourceInstance resource : iNotif.getResources()){ @@ -695,23 +713,21 @@ public class ASDCController { resourceStructure.addArtifactToStructure(distributionClient,artifact, resultArtifact); } } - } - } - try{ - + } + //Deploy All resources and artifacts LOGGER.debug("Preparing to deploy Service: " + iNotif.getServiceUUID()); - if(resourceStructure == null){ - resourceStructure = new VfResourceStructure(iNotif,new ResourceInstance()); - } - this.deployResourceStructure(resourceStructure, toscaResourceStructure); - - - } catch(ArtifactInstallerException e){ - deploySuccessful = false; - errorMessage = e.getMessage(); - } - + try{ + + this.deployResourceStructure(resourceStructure, toscaResourceStructure); + + } catch(ArtifactInstallerException e){ + deploySuccessful = false; + errorMessage = e.getMessage(); + } + + } + } this.sendCsarDeployNotification(iNotif, resourceStructure, toscaResourceStructure, deploySuccessful, errorMessage); } catch (ASDCDownloadException | UnsupportedEncodingException e) { diff --git a/asdc-controller/src/main/java/org/onap/so/asdc/installer/heat/ToscaResourceInstaller.java b/asdc-controller/src/main/java/org/onap/so/asdc/installer/heat/ToscaResourceInstaller.java index 87df2648d1..7dfb1bae3e 100644 --- a/asdc-controller/src/main/java/org/onap/so/asdc/installer/heat/ToscaResourceInstaller.java +++ b/asdc-controller/src/main/java/org/onap/so/asdc/installer/heat/ToscaResourceInstaller.java @@ -33,6 +33,7 @@ import java.util.Set; import org.hibernate.exception.ConstraintViolationException; import org.hibernate.exception.LockAcquisitionException; import org.onap.sdc.api.notification.IArtifactInfo; +import org.onap.sdc.api.notification.IResourceInstance; import org.onap.sdc.api.notification.IStatusData; import org.onap.sdc.tosca.parser.impl.SdcPropertyNames; import org.onap.sdc.tosca.parser.impl.SdcTypes; @@ -424,26 +425,35 @@ public class ToscaResourceInstaller { String vfCustomizationUUID = toscaResourceStruct.getSdcCsarHelper() .getMetadataPropertyValue(metadata, SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID); - logger.debug("vfCustomizationUUID=" + vfCustomizationUUID); + logger.debug("vfCustomizationUUID=" + vfCustomizationUUID); - VnfResourceCustomization vnfResource = createVnfResource(nodeTemplate, toscaResourceStruct, service); + IResourceInstance vfMetaDataResource = vfResourceStructure.getResourceInstance(); - for (VfModuleStructure vfModuleStructure : vfResourceStructure.getVfModuleStructure()) { - logger.debug("vfModuleStructure:" + vfModuleStructure.toString()); - List vfGroups = toscaResourceStruct - .getSdcCsarHelper().getVfModulesByVf(vfCustomizationUUID); - IVfModuleData vfMetadata = vfModuleStructure.getVfModuleMetadata(); - Optional matchingObject = vfGroups.stream(). - filter(group -> group.getMetadata().getValue("vfModuleModelCustomizationUUID").equals(vfMetadata.getVfModuleModelCustomizationUUID())). - findFirst(); - if(matchingObject.isPresent()){ - VfModuleCustomization vfModuleCustomization = createVFModuleResource(matchingObject.get(), nodeTemplate, toscaResourceStruct, vfResourceStructure,vfMetadata, vnfResource); - vfModuleCustomization.getVfModule().setVnfResources(vnfResource.getVnfResources()); - }else - throw new Exception("Cannot find matching VFModule Customization for VF Module Metadata: " + vfMetadata.getVfModuleModelCustomizationUUID()); + // Make sure the vfMetadata and tosca customizations match before comparing their VF Modules UUID's + if(vfCustomizationUUID.equals(vfMetaDataResource.getResourceCustomizationUUID())){ - } - service.getVnfCustomizations().add(vnfResource); + logger.debug("vfCustomizationUUID: " + vfCustomizationUUID + " matches vfMetaData CustomizationUUID"); + + VnfResourceCustomization vnfResource = createVnfResource(nodeTemplate, toscaResourceStruct, service); + + for (VfModuleStructure vfModuleStructure : vfResourceStructure.getVfModuleStructure()) { + logger.debug("vfModuleStructure ModelUUID: " + vfModuleStructure.toString()); + List vfGroups = toscaResourceStruct + .getSdcCsarHelper().getVfModulesByVf(vfCustomizationUUID); + IVfModuleData vfMetadata = vfModuleStructure.getVfModuleMetadata(); + + Optional matchingObject = vfGroups.stream(). + filter(group -> group.getMetadata().getValue("vfModuleModelCustomizationUUID").equals(vfMetadata.getVfModuleModelCustomizationUUID())). + findFirst(); + if(matchingObject.isPresent()){ + VfModuleCustomization vfModuleCustomization = createVFModuleResource(matchingObject.get(), nodeTemplate, toscaResourceStruct, vfResourceStructure,vfMetadata, vnfResource); + vfModuleCustomization.getVfModule().setVnfResources(vnfResource.getVnfResources()); + }else + throw new Exception("Cannot find matching VFModule Customization for VF Module Metadata: " + vfMetadata.getVfModuleModelCustomizationUUID()); + + } + service.getVnfCustomizations().add(vnfResource); + } } } diff --git a/asdc-controller/src/main/java/org/onap/so/asdc/util/ASDCNotificationLogging.java b/asdc-controller/src/main/java/org/onap/so/asdc/util/ASDCNotificationLogging.java index 13af95a8fc..54977104ff 100644 --- a/asdc-controller/src/main/java/org/onap/so/asdc/util/ASDCNotificationLogging.java +++ b/asdc-controller/src/main/java/org/onap/so/asdc/util/ASDCNotificationLogging.java @@ -209,6 +209,10 @@ public class ASDCNotificationLogging { List vfNodeTemplatesList = toscaResourceStructure.getSdcCsarHelper().getServiceVfList(); for (NodeTemplate vfNodeTemplate : vfNodeTemplatesList) { + buffer.append(System.lineSeparator()); + buffer.append("VNF Properties:"); + buffer.append(System.lineSeparator()); + buffer.append("Model Name:"); buffer.append(testNull(vfNodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NAME))); buffer.append(System.lineSeparator()); diff --git a/asdc-controller/src/test/java/org/onap/so/asdc/installer/heat/ToscaResourceInstallerTest.java b/asdc-controller/src/test/java/org/onap/so/asdc/installer/heat/ToscaResourceInstallerTest.java index af0987f6d0..89bfe07374 100644 --- a/asdc-controller/src/test/java/org/onap/so/asdc/installer/heat/ToscaResourceInstallerTest.java +++ b/asdc-controller/src/test/java/org/onap/so/asdc/installer/heat/ToscaResourceInstallerTest.java @@ -102,8 +102,6 @@ public class ToscaResourceInstallerTest extends BaseTest { private AllottedResourceCustomizationRepository allottedCustomizationRepo; @Autowired private ServiceRepository serviceRepo; - @Autowired - private ExternalServiceToInternalServiceRepository externalServiceToInternalServiceRepository; @Mock private SdcCsarHelperImpl sdcCsarHelper; @Mock @@ -121,10 +119,6 @@ public class ToscaResourceInstallerTest extends BaseTest { private JsonStatusData statusData; private static final String MSO = "SO"; - private AllottedResource allottedResource; - private AllottedResourceCustomization allottedResourceCustomization; - private Service catalogService; - @Before public void before() { MockitoAnnotations.initMocks(this); @@ -380,7 +374,6 @@ public class ToscaResourceInstallerTest extends BaseTest { .ignoring("createTime") .ignoring("modifyTime")); } - @Test public void installTheResourceExceptionTest() throws Exception { @@ -472,132 +465,4 @@ public class ToscaResourceInstallerTest extends BaseTest { } return actualWatchdogComponentDistributionStatus; } - - private void populatevfResourceStructure() throws Exception { - vfResourceStructure = spy(new VfResourceStructure(notificationData, resourceInstance)); - - HashMap vfModuleArtifacts = mock(HashMap.class); - CapabilityAssignments capabilityAssignments = mock(CapabilityAssignments.class); - CapabilityAssignment capabilityAssignment = mock(CapabilityAssignment.class); - - Iterator artifactIterator = mock(Iterator.class); - Iterator nodeTemplateIterator = mock(Iterator.class); - IDistributionClientDownloadResult clientResult = mock(IDistributionClientDownloadResult.class); - doReturn(IOUtils.toByteArray( - new FileInputStream( - new File( - getClass().getClassLoader().getResource("resource-examples/simpleTest.yaml").getFile()) - ))).when(clientResult).getArtifactPayload(); - VfModuleArtifact vfModuleArtifact = new VfModuleArtifact(artifactInfo, clientResult); - Collection vfModuleArtifactsValues = mock(Collection.class); - - NodeTemplate nodeTemplate = mock(NodeTemplate.class); - List nodeTemplateList = new ArrayList<>(); - nodeTemplateList.add(nodeTemplate); - - doReturn(sdcCsarHelper).when(toscaResourceStruct).getSdcCsarHelper(); - doReturn("metadataPropertyValue").when(sdcCsarHelper).getMetadataPropertyValue(any(Metadata.class), any(String.class)); - doReturn("ntPropertyLeafValue").when(sdcCsarHelper).getNodeTemplatePropertyLeafValue(any(NodeTemplate.class), any(String.class)); - doReturn("true").when(sdcCsarHelper).getNodeTemplatePropertyLeafValue(nodeTemplate, SdcPropertyNames.PROPERTY_NAME_PROVIDERNETWORK_ISPROVIDERNETWORK); - doReturn("1").when(sdcCsarHelper).getCapabilityPropertyLeafValue(any(CapabilityAssignment.class), any(String.class)); - doReturn(vfGroups).when(sdcCsarHelper).getVfModulesByVf(any(String.class)); - doReturn(capabilityAssignments).when(sdcCsarHelper).getCapabilitiesOf(any(NodeTemplate.class)); - doReturn(capabilityAssignment).when(capabilityAssignments).getCapabilityByName(any(String.class)); - doReturn(vfModuleArtifacts).when(vfResourceStructure).getArtifactsMapByUUID(); - when(vfModuleArtifacts.values()).thenReturn(vfModuleArtifactsValues); - when(vfModuleArtifactsValues.iterator()).thenReturn(artifactIterator); - when(artifactIterator.hasNext()).thenReturn(true, false); - when(artifactIterator.next()).thenReturn(vfModuleArtifact); - when(artifactInfo.getArtifactType()).thenReturn(ASDCConfiguration.OTHER); - when(nodeTemplateIterator.hasNext()).thenReturn(true, false); - doReturn(nodeTemplateList).when(sdcCsarHelper).getServiceVfList(); - doReturn(nodeTemplateList).when(sdcCsarHelper).getServiceVlList(); - doReturn(nodeTemplateList).when(sdcCsarHelper).getAllottedResources(); - doReturn(metadata).when(nodeTemplate).getMetaData(); - doReturn("model_instance_name").when(nodeTemplate).getName(); - } - - private void populateToscaResourceStruct() { - - VnfResource vnfResource = new VnfResource(); - vnfResource.setModelName("modelName"); - vnfResource.setModelVersion("1.1"); - vnfResource.setModelUUID("modelUUID"); - vnfResource.setOrchestrationMode("orchestrationMode"); - - VnfResourceCustomization vnfResourceCustomization = new VnfResourceCustomization(); - vnfResourceCustomization.setVnfResources(vnfResource); - vnfResourceCustomization.setModelCustomizationUUID("vnfResCustModelCustomizationUUID"); - vnfResourceCustomization.setModelInstanceName("modelInstanceName"); - - allottedResource = new AllottedResource(); - allottedResource.setModelUUID("serviceMetadataValue"); - allottedResource.setModelInvariantUUID("modelInvariantUUID"); - allottedResource.setModelName("modelName"); - allottedResource.setModelVersion("1.1"); - - allottedResourceCustomization = new AllottedResourceCustomization(); - allottedResourceCustomization.setAllottedResource(allottedResource); - allottedResourceCustomization.setModelCustomizationUUID("modelCustomizationUUID"); - allottedResourceCustomization.setModelInstanceName("modelInstanceName"); - - catalogService = new Service(); - catalogService.setServiceType("Bonding"); - catalogService.setModelUUID("5df8b6de-2083-11e7-93ae-92361f002672"); - catalogService.setModelInvariantUUID("modelInvariantUUID"); - catalogService.setModelName("modelName"); - catalogService.setModelVersion("modelVersion"); - catalogService.getVnfCustomizations().add(vnfResourceCustomization); - - catalogService.setServiceRole("COLLABORATE"); - - HeatTemplate heatTemplate = new HeatTemplate(); - heatTemplate.setArtifactUuid("ff874603-4222-11e7-9252-005056850d2e"); - heatTemplate.setArtifactChecksum("MANUAL RECORD"); - heatTemplate.setTemplateBody("templateBody"); - heatTemplate.setTemplateName("module_mns_zrdm3frwl01exn_01_rgvm_1.yml"); - heatTemplate.setVersion("1"); - - NetworkResource networkResource = new NetworkResource(); - networkResource.setAicVersionMin("aicVersionMin"); - networkResource.setModelUUID("modelUUID"); - networkResource.setOrchestrationMode("orchestrationMode"); - networkResource.setModelVersion("modelVersion"); - networkResource.setNeutronNetworkType("neutronNetworkType"); - networkResource.setAicVersionMax("aicVersionMax"); - networkResource.setModelName("CONTRAIL30_GNDIRECT"); - networkResource.setModelInvariantUUID("modelInvariantUUID"); - networkResource.setHeatTemplate(heatTemplate); - - NetworkResourceCustomization networkResourceCustomization = new NetworkResourceCustomization(); - networkResourceCustomization.setModelCustomizationUUID("modelCustomizationUUID"); - networkResourceCustomization.setModelInstanceName("modelInstanceName"); - networkResourceCustomization.setNetworkResource(networkResource); - - doReturn(networkResource).when(toscaResourceStruct).getCatalogNetworkResource(); - doReturn(networkResourceCustomization).when(toscaResourceStruct).getCatalogNetworkResourceCustomization(); - doNothing().when(toscaResourceStruct).setSuccessfulDeployment(); - doReturn("serviceVersion").when(toscaResourceStruct).getServiceVersion(); - doReturn(catalogService).when(toscaResourceStruct).getCatalogService(); - doReturn(artifactInfo).when(toscaResourceStruct).getToscaArtifact(); - doReturn("artifactChecksum").when(artifactInfo).getArtifactChecksum(); - doReturn("artifactUUID").when(artifactInfo).getArtifactUUID(); - doReturn("artifactName").when(artifactInfo).getArtifactName(); - doReturn("1.0").when(artifactInfo).getArtifactVersion(); - doReturn("artifactDescription").when(artifactInfo).getArtifactDescription(); - doReturn("artifactURL").when(artifactInfo).getArtifactURL(); - doReturn(metadata).when(toscaResourceStruct).getServiceMetadata(); - doReturn("serviceMetadataValue").when(metadata).getValue(any(String.class)); - doReturn("CONTRAIL30_GNDIRECT").when(metadata).getValue(SdcPropertyNames.PROPERTY_NAME_NAME); - doReturn(vnfResourceCustomization).when(toscaResourceStruct).getCatalogVnfResourceCustomization(); - doReturn(allottedResource).when(toscaResourceStruct).getAllottedResource(); - doReturn(allottedResourceCustomization).when(toscaResourceStruct).getCatalogAllottedResourceCustomization(); - } - - private void populateNotificationData() { - notificationData.setDistributionID("testStatusSuccessTosca"); - notificationData.setServiceVersion("123456"); - notificationData.setServiceUUID("5df8b6de-2083-11e7-93ae-92361f002671"); - notificationData.setWorkloadContext("workloadContext"); - } } diff --git a/asdc-controller/src/test/resources/resource-examples/multipleModules/Notification_MultipleModules.txt b/asdc-controller/src/test/resources/resource-examples/multipleModules/Notification_MultipleModules.txt deleted file mode 100644 index 5b6d9e4eaf..0000000000 --- a/asdc-controller/src/test/resources/resource-examples/multipleModules/Notification_MultipleModules.txt +++ /dev/null @@ -1,302 +0,0 @@ -DistributionID:a2872f55-8628-4486-8548-7b132c9a47db -ServiceName:Vf zrdm5bpxmc02092017-Service -ServiceVersion:1.0 -ServiceUUID:bad955c3-29b2-4a27-932e-28e942cc6480 -ServiceInvariantUUID:b16a9398-ffa3-4041-b78c-2956b8ad9c7b -ServiceDescription:Demo - - - -Service Artifacts List: -{ -Service Artifacts Info: -ArtifactName:service-VfZrdm5bpxmc02092017Service-csar.csar -ArtifactVersion:1 -ArtifactType:TOSCA_CSAR -ArtifactDescription:TOSCA definition package of the asset -ArtifactTimeout:0 -ArtifactURL:service-VfZrdm5bpxmc02092017Service-csar.csar -ArtifactUUID:396cfd49-0f4b-4fec-9f33-0fd7e90d5a22 -ArtifactChecksum:MWQ3Y2FmMWExNDQyYWI2N2YwNjEwZGUzN2IzMzI3NjE= -GeneratedArtifact:{NULL -} -RelatedArtifacts:{ -} - - - -} - -Resource Instances List: -{ -Resource Instance Info: -ResourceInstanceName:Vf zrdm5bpxmc02092017-VF 0 -ResourceCustomizationUUID:96c23a4a-6887-4b2c-9cce-1e4ea35eaade -ResourceInvariantUUID:23122c9b-dd7f-483f-bf0a-e069303db2f7 -ResourceName:Vf zrdm5bpxmc02092017-VF -ResourceType:VF -ResourceUUID:14ba5d1e-3862-407c-a236-1cbaebccce77 -ResourceVersion:1.0 -Category:Generic -SubCategory:Network Elements -Resource Artifacts List: -{ -Service Artifacts Info: -ArtifactName:pxmc_mmn_volume.env -ArtifactVersion:2 -ArtifactType:HEAT_ENV -ArtifactDescription:Auto-generated HEAT Environment deployment artifact -ArtifactTimeout:0 -ArtifactURL:/sdc/v1/catalog/services/VfZrdm5bpxmc02092017Service/1.0/resourceInstances/vfzrdm5bpxmc02092017vf0/artifacts/pxmc_mmn_volume.env -ArtifactUUID:c1ae6284-48d9-4437-a195-b2cf2ba23070 -ArtifactChecksum:NmEyZjc1Y2UwZDMwYjFhNGRlMTMzN2JhNzdiMThjMGU= -GeneratedArtifact:{NULL -} -RelatedArtifacts:{ -} -, -Service Artifacts Info: -ArtifactName:pxmc_base.env -ArtifactVersion:2 -ArtifactType:HEAT_ENV -ArtifactDescription:Auto-generated HEAT Environment deployment artifact -ArtifactTimeout:0 -ArtifactURL:/sdc/v1/catalog/services/VfZrdm5bpxmc02092017Service/1.0/resourceInstances/vfzrdm5bpxmc02092017vf0/artifacts/pxmc_base.env -ArtifactUUID:6dd99c31-c52e-4c45-b99b-d223c877a296 -ArtifactChecksum:OGM2MWIzZTA2OTc5YjQwNTM1NGVhODA0YTFkNzM4ZTg= -GeneratedArtifact:{NULL -} -RelatedArtifacts:{ -} - - -, -Service Artifacts Info: -ArtifactName:vfzrdm5bpxmc02092017vf0_modules.json -ArtifactVersion:1 -ArtifactType:VF_MODULES_METADATA -ArtifactDescription:Auto-generated VF Modules information artifact -ArtifactTimeout:0 -ArtifactURL:/sdc/v1/catalog/services/VfZrdm5bpxmc02092017Service/1.0/resourceInstances/vfzrdm5bpxmc02092017vf0/artifacts/vfzrdm5bpxmc02092017vf0_modules.json -ArtifactUUID:e3b82cd6-485e-4d56-8d2c-17ccf6a59533 -ArtifactChecksum:MjY0NzcxMjJkZGI4YzQ1MDU2NjhkNWYyM2IwNmYzYmU= -GeneratedArtifact:{NULL -} -RelatedArtifacts:{ -} - - -, -Service Artifacts Info: -ArtifactName:pxmc_vmt.yaml -ArtifactVersion:1 -ArtifactType:HEAT -ArtifactDescription:created from csar -ArtifactTimeout:120 -ArtifactURL:/sdc/v1/catalog/services/VfZrdm5bpxmc02092017Service/1.0/resourceInstances/vfzrdm5bpxmc02092017vf0/artifacts/pxmc_vmt.yaml -ArtifactUUID:ad12ab80-5419-4346-a5d7-dac2fc15575f -ArtifactChecksum:ODE0YTRiYzc2YzkxOTliZjJhNjc0M2RhMWU4M2VlZmE= -GeneratedArtifact:{Service Artifacts Info: -ArtifactName:pxmc_vmt.env -ArtifactVersion:2 -ArtifactType:HEAT_ENV -ArtifactDescription:Auto-generated HEAT Environment deployment artifact -ArtifactTimeout:0 -ArtifactURL:/sdc/v1/catalog/services/VfZrdm5bpxmc02092017Service/1.0/resourceInstances/vfzrdm5bpxmc02092017vf0/artifacts/pxmc_vmt.env -ArtifactUUID:bc1640f1-69f0-4760-8fc3-3318ec2ff129 -ArtifactChecksum:MjdkYzY5ZGU0ZTlkZDlhNzI2ZGVhMjk1ODVhZTg1NTY= -GeneratedArtifact:{NULL -} -RelatedArtifacts:{ -} -} -RelatedArtifacts:{ -Service Artifacts Info: -ArtifactName:user_data_zrdm5bpxmc02vmt001.txt -ArtifactVersion:1 -ArtifactType:HEAT_ARTIFACT -ArtifactDescription:created from csar -ArtifactTimeout:0 -ArtifactURL:/sdc/v1/catalog/services/VfZrdm5bpxmc02092017Service/1.0/resourceInstances/vfzrdm5bpxmc02092017vf0/artifacts/user_data_zrdm5bpxmc02vmt001.txt -ArtifactUUID:53acdabe-689f-45e5-8578-f1514d3529da -ArtifactChecksum:MzJmZjgyZWYwOTBjMTg5M2ExNWZhMmMwNzc1NWY1YjQ= -GeneratedArtifact:{NULL -} -RelatedArtifacts:{ -} - - - -} - - -, -Service Artifacts Info: -ArtifactName:pxmc_mmn.yaml -ArtifactVersion:1 -ArtifactType:HEAT -ArtifactDescription:created from csar -ArtifactTimeout:120 -ArtifactURL:/sdc/v1/catalog/services/VfZrdm5bpxmc02092017Service/1.0/resourceInstances/vfzrdm5bpxmc02092017vf0/artifacts/pxmc_mmn.yaml -ArtifactUUID:b8bca13b-811f-44ab-9d27-45b842c664d8 -ArtifactChecksum:YmNiYTU5YTM4ODVhYTlhODc5NGMwNWZkZjI5MTRmNTE= -GeneratedArtifact:{Service Artifacts Info: -ArtifactName:pxmc_mmn.env -ArtifactVersion:2 -ArtifactType:HEAT_ENV -ArtifactDescription:Auto-generated HEAT Environment deployment artifact -ArtifactTimeout:0 -ArtifactURL:/sdc/v1/catalog/services/VfZrdm5bpxmc02092017Service/1.0/resourceInstances/vfzrdm5bpxmc02092017vf0/artifacts/pxmc_mmn.env -ArtifactUUID:e88ce0b9-1496-4d03-ab1d-6d8d79bfc737 -ArtifactChecksum:ZGI1NzI2Y2FmYjFhOTM2ZDYwNzg1YWRhZjBmMTk2OTQ= -GeneratedArtifact:{NULL -} -RelatedArtifacts:{ -} -} -RelatedArtifacts:{ -Service Artifacts Info: -ArtifactName:user_data_zrdm5bpxmc02mmn001.txt -ArtifactVersion:1 -ArtifactType:HEAT_ARTIFACT -ArtifactDescription:created from csar -ArtifactTimeout:0 -ArtifactURL:/sdc/v1/catalog/services/VfZrdm5bpxmc02092017Service/1.0/resourceInstances/vfzrdm5bpxmc02092017vf0/artifacts/user_data_zrdm5bpxmc02mmn001.txt -ArtifactUUID:5bc62c72-5f7a-40bc-a167-1a4fed9afdef -ArtifactChecksum:OTMxMjk5Mzc1YmIxMzRlYmRlZWJhMjg0MWQ4YTI1NWU= -GeneratedArtifact:{NULL -} -RelatedArtifacts:{ -} - - - -} - - -, -Service Artifacts Info: -ArtifactName:pxmc_mmn.env -ArtifactVersion:2 -ArtifactType:HEAT_ENV -ArtifactDescription:Auto-generated HEAT Environment deployment artifact -ArtifactTimeout:0 -ArtifactURL:/sdc/v1/catalog/services/VfZrdm5bpxmc02092017Service/1.0/resourceInstances/vfzrdm5bpxmc02092017vf0/artifacts/pxmc_mmn.env -ArtifactUUID:e88ce0b9-1496-4d03-ab1d-6d8d79bfc737 -ArtifactChecksum:ZGI1NzI2Y2FmYjFhOTM2ZDYwNzg1YWRhZjBmMTk2OTQ= -GeneratedArtifact:{NULL -} -RelatedArtifacts:{ -} - - -, -Service Artifacts Info: -ArtifactName:pxmc_vmt.env -ArtifactVersion:2 -ArtifactType:HEAT_ENV -ArtifactDescription:Auto-generated HEAT Environment deployment artifact -ArtifactTimeout:0 -ArtifactURL:/sdc/v1/catalog/services/VfZrdm5bpxmc02092017Service/1.0/resourceInstances/vfzrdm5bpxmc02092017vf0/artifacts/pxmc_vmt.env -ArtifactUUID:bc1640f1-69f0-4760-8fc3-3318ec2ff129 -ArtifactChecksum:MjdkYzY5ZGU0ZTlkZDlhNzI2ZGVhMjk1ODVhZTg1NTY= -GeneratedArtifact:{NULL -} -RelatedArtifacts:{ -} -, -Service Artifacts Info: -ArtifactName:user_data_zrdm5bpxmc02mmn001.txt -ArtifactVersion:1 -ArtifactType:HEAT_ARTIFACT -ArtifactDescription:created from csar -ArtifactTimeout:0 -ArtifactURL:/sdc/v1/catalog/services/VfZrdm5bpxmc02092017Service/1.0/resourceInstances/vfzrdm5bpxmc02092017vf0/artifacts/user_data_zrdm5bpxmc02mmn001.txt -ArtifactUUID:5bc62c72-5f7a-40bc-a167-1a4fed9afdef -ArtifactChecksum:OTMxMjk5Mzc1YmIxMzRlYmRlZWJhMjg0MWQ4YTI1NWU= -GeneratedArtifact:{NULL -} -RelatedArtifacts:{ -} - - -, -Service Artifacts Info: -ArtifactName:pxmc_base.yaml -ArtifactVersion:1 -ArtifactType:HEAT -ArtifactDescription:created from csar -ArtifactTimeout:120 -ArtifactURL:/sdc/v1/catalog/services/VfZrdm5bpxmc02092017Service/1.0/resourceInstances/vfzrdm5bpxmc02092017vf0/artifacts/pxmc_base.yaml -ArtifactUUID:7e7f7356-11bd-4f2f-bbbc-5c10954e3189 -ArtifactChecksum:YThkNGFhZjAwNmM4NzMzODc0YzNhYTUxOTljNGQwNmM= -GeneratedArtifact:{Service Artifacts Info: -ArtifactName:pxmc_base.env -ArtifactVersion:2 -ArtifactType:HEAT_ENV -ArtifactDescription:Auto-generated HEAT Environment deployment artifact -ArtifactTimeout:0 -ArtifactURL:/sdc/v1/catalog/services/VfZrdm5bpxmc02092017Service/1.0/resourceInstances/vfzrdm5bpxmc02092017vf0/artifacts/pxmc_base.env -ArtifactUUID:6dd99c31-c52e-4c45-b99b-d223c877a296 -ArtifactChecksum:OGM2MWIzZTA2OTc5YjQwNTM1NGVhODA0YTFkNzM4ZTg= -GeneratedArtifact:{NULL -} -RelatedArtifacts:{ -} - - -} -RelatedArtifacts:{ -} -, -Service Artifacts Info: -ArtifactName:user_data_zrdm5bpxmc02vmt001.txt -ArtifactVersion:1 -ArtifactType:HEAT_ARTIFACT -ArtifactDescription:created from csar -ArtifactTimeout:0 -ArtifactURL:/sdc/v1/catalog/services/VfZrdm5bpxmc02092017Service/1.0/resourceInstances/vfzrdm5bpxmc02092017vf0/artifacts/user_data_zrdm5bpxmc02vmt001.txt -ArtifactUUID:53acdabe-689f-45e5-8578-f1514d3529da -ArtifactChecksum:MzJmZjgyZWYwOTBjMTg5M2ExNWZhMmMwNzc1NWY1YjQ= -GeneratedArtifact:{NULL -} -RelatedArtifacts:{ -} - - -, -Service Artifacts Info: -ArtifactName:pxmc_mmn_volume.yaml -ArtifactVersion:2 -ArtifactType:HEAT_VOL -ArtifactDescription:created from csar -ArtifactTimeout:120 -ArtifactURL:/sdc/v1/catalog/services/VfZrdm5bpxmc02092017Service/1.0/resourceInstances/vfzrdm5bpxmc02092017vf0/artifacts/pxmc_mmn_volume.yaml -ArtifactUUID:2f372a02-df1b-46ca-b81e-822e3f406965 -ArtifactChecksum:MzA5MGY5ODQ0NDY5MDhiMDM3YjFlNGIwNzJkNjFhOTI= -GeneratedArtifact:{Service Artifacts Info: -ArtifactName:pxmc_mmn_volume.env -ArtifactVersion:2 -ArtifactType:HEAT_ENV -ArtifactDescription:Auto-generated HEAT Environment deployment artifact -ArtifactTimeout:0 -ArtifactURL:/sdc/v1/catalog/services/VfZrdm5bpxmc02092017Service/1.0/resourceInstances/vfzrdm5bpxmc02092017vf0/artifacts/pxmc_mmn_volume.env -ArtifactUUID:c1ae6284-48d9-4437-a195-b2cf2ba23070 -ArtifactChecksum:NmEyZjc1Y2UwZDMwYjFhNGRlMTMzN2JhNzdiMThjMGU= -GeneratedArtifact:{NULL -} -RelatedArtifacts:{ -} - - -} -RelatedArtifacts:{ -} - - - -} - - - -} diff --git a/asdc-controller/src/test/resources/resource-examples/multipleModules/ServiceResponse.json b/asdc-controller/src/test/resources/resource-examples/multipleModules/ServiceResponse.json deleted file mode 100644 index 37b7987f46..0000000000 --- a/asdc-controller/src/test/resources/resource-examples/multipleModules/ServiceResponse.json +++ /dev/null @@ -1,458 +0,0 @@ -{ - "modelName": "Vf zrdm5bpxmc02092017-Service", - "description": "Demo", - "modelUUID": "bad955c3-29b2-4a27-932e-28e942cc6480", - "modelInvariantUUID": "b16a9398-ffa3-4041-b78c-2956b8ad9c7b", - "serviceType": "", - "serviceRole": "", - "environmentContext": "General_Revenue-Bearing", - "networkCustomizations": [], - "vnfCustomizations": [ - { - "modelCustomizationUuid": "96c23a4a-6887-4b2c-9cce-1e4ea35eaade", - "modelInstanceName": "Vf zrdm5bpxmc02092017-VF 0", - "multiStageDesign": "false", - "vnfResources": { - "modelUuid": "d326f424-2312-4dd6-b7fe-364fadbd1ef5", - "modelInvariantUuid": "23122c9b-dd7f-483f-bf0a-e069303db2f7", - "modelName": "Vf zrdm5bpxmc02092017-VF", - "toscaNodeType": "org.openecomp.resource.vf.VfZrdm5bpxmc02092017Vf", - "description": "Demo", - "orchestrationMode": "HEAT", - "modelVersion": "1.0", - "modelInvariantId": "23122c9b-dd7f-483f-bf0a-e069303db2f7" - }, - "vfModuleCustomizations": [ - { - "modelCustomizationUuid": "074c64d0-7e13-4bcc-8bdb-ea922331102d", - "label": "pxmc_base", - "minInstances": 1, - "maxInstances": 1, - "initialCount": 1, - "heatEnvironment": { - "artifactUuid": "6dd99c31-c52e-4c45-b99b-d223c877a296", - "name": "pxmc_base.env", - "description": "Auto-generated HEAT Environment deployment artifact", - "environment": "parameters:\n vnf_name: \n", - "artifactChecksum": "OGM2MWIzZTA2OTc5YjQwNTM1NGVhODA0YTFkNzM4ZTg=", - "version": "2" - }, - "vfModule": { - "modelUUID": "eb5de6fb-9ecf-4009-b922-fae3a9ae7d46", - "modelInvariantUUID": "f7a867f2-596b-4f4a-a128-421e825a6190", - "modelName": "VfZrdm5bpxmc02092017Vf..pxmc_base..module-0", - "modelVersion": "1", - "isBase": 1, - "moduleHeatTemplate": { - "artifactUuid": "7e7f7356-11bd-4f2f-bbbc-5c10954e3189", - "templateName": "pxmc_base.yaml", - "templateBody": "heat_template_version: 2015-04-30\n\nparameters:\n\n## GLOBAL//Basic Parameters\n vnf_name:\n type: string\n description: Unique name for this VF instance\n# For manual spinups, value must be in the ENV file. Must be removed from ENV before uploading to ASDC\n\nresources:\n\n## MSP RSG//Resource:SecurityGroup\n sec_grp_msp_0:\n type: OS::Neutron::SecurityGroup\n properties:\n description: Security Group for PXMC\n name:\n str_replace:\n template: VF_NAME_sec_grp_msp\n params:\n VF_NAME: { get_param: vnf_name }\n rules:\n - {\"direction\": \"egress\", \"remote_ip_prefix\": \"0.0.0.0/0\", \"protocol\": \"tcp\", \"ethertype\": \"IPv4\", \"port_range_max\": 65535, \"port_range_min\": 0}\n - {\"direction\": \"egress\", \"remote_ip_prefix\": \"0.0.0.0/0\", \"protocol\": \"udp\", \"ethertype\": \"IPv4\", \"port_range_max\": 65535, \"port_range_min\": 0}\n - {\"direction\": \"egress\", \"remote_ip_prefix\": \"0.0.0.0/0\", \"protocol\": \"132\", \"ethertype\": \"IPv4\", \"port_range_max\": 65535, \"port_range_min\": 0}\n - {\"direction\": \"egress\", \"remote_ip_prefix\": \"0.0.0.0/0\", \"protocol\": \"icmp\", \"ethertype\": \"IPv4\"}\n - {\"direction\": \"egress\", \"remote_ip_prefix\": \"::/0\", \"protocol\": \"tcp\", \"ethertype\": \"IPv6\", \"port_range_max\": 65535, \"port_range_min\": 0}\n - {\"direction\": \"egress\", \"remote_ip_prefix\": \"::/0\", \"protocol\": \"udp\", \"ethertype\": \"IPv6\", \"port_range_max\": 65535, \"port_range_min\": 0}\n - {\"direction\": \"egress\", \"remote_ip_prefix\": \"::/0\", \"protocol\": \"132\", \"ethertype\": \"IPv6\", \"port_range_max\": 65535, \"port_range_min\": 0}\n - {\"direction\": \"egress\", \"remote_ip_prefix\": \"::/0\", \"protocol\": \"58\", \"ethertype\": \"IPv6\"}\n - {\"direction\": \"ingress\", \"remote_ip_prefix\": \"0.0.0.0/0\", \"protocol\": \"tcp\", \"ethertype\": \"IPv4\", \"port_range_max\": 65535, \"port_range_min\": 0}\n - {\"direction\": \"ingress\", \"remote_ip_prefix\": \"0.0.0.0/0\", \"protocol\": \"udp\", \"ethertype\": \"IPv4\", \"port_range_max\": 65535, \"port_range_min\": 0}\n - {\"direction\": \"ingress\", \"remote_ip_prefix\": \"0.0.0.0/0\", \"protocol\": \"132\", \"ethertype\": \"IPv4\", \"port_range_max\": 65535, \"port_range_min\": 0}\n - {\"direction\": \"ingress\", \"remote_ip_prefix\": \"0.0.0.0/0\", \"protocol\": \"icmp\", \"ethertype\": \"IPv4\"}\n - {\"direction\": \"ingress\", \"remote_ip_prefix\": \"::/0\", \"protocol\": \"tcp\", \"ethertype\": \"IPv6\", \"port_range_max\": 65535, \"port_range_min\": 0}\n - {\"direction\": \"ingress\", \"remote_ip_prefix\": \"::/0\", \"protocol\": \"udp\", \"ethertype\": \"IPv6\", \"port_range_max\": 65535, \"port_range_min\": 0}\n - {\"direction\": \"ingress\", \"remote_ip_prefix\": \"::/0\", \"protocol\": \"132\", \"ethertype\": \"IPv6\", \"port_range_max\": 65535, \"port_range_min\": 0}\n - {\"direction\": \"ingress\", \"remote_ip_prefix\": \"::/0\", \"protocol\": \"58\", \"ethertype\": \"IPv6\"}\n\noutputs:\n\n sec_grp_msp_id:\n description: uuid of the security group\n value: {get_resource: sec_grp_msp_0 }\n", - "timeoutMinutes": 120, - "version": "1", - "description": "created from csar", - "artifactChecksum": "YThkNGFhZjAwNmM4NzMzODc0YzNhYTUxOTljNGQwNmM=", - "parameters": [ - { - "heatTemplateArtifactUuid": "7e7f7356-11bd-4f2f-bbbc-5c10954e3189", - "paramName": "vnf_name", - "required": true, - "paramType": "string" - } - ], - "childTemplates": [], - "heatTemplate": "heat_template_version: 2015-04-30\n\nparameters:\n\n## GLOBAL//Basic Parameters\n vnf_name:\n type: string\n description: Unique name for this VF instance\n# For manual spinups, value must be in the ENV file. Must be removed from ENV before uploading to ASDC\n\nresources:\n\n## MSP RSG//Resource:SecurityGroup\n sec_grp_msp_0:\n type: OS::Neutron::SecurityGroup\n properties:\n description: Security Group for PXMC\n name:\n str_replace:\n template: VF_NAME_sec_grp_msp\n params:\n VF_NAME: { get_param: vnf_name }\n rules:\n - {\"direction\": \"egress\", \"remote_ip_prefix\": \"0.0.0.0/0\", \"protocol\": \"tcp\", \"ethertype\": \"IPv4\", \"port_range_max\": 65535, \"port_range_min\": 0}\n - {\"direction\": \"egress\", \"remote_ip_prefix\": \"0.0.0.0/0\", \"protocol\": \"udp\", \"ethertype\": \"IPv4\", \"port_range_max\": 65535, \"port_range_min\": 0}\n - {\"direction\": \"egress\", \"remote_ip_prefix\": \"0.0.0.0/0\", \"protocol\": \"132\", \"ethertype\": \"IPv4\", \"port_range_max\": 65535, \"port_range_min\": 0}\n - {\"direction\": \"egress\", \"remote_ip_prefix\": \"0.0.0.0/0\", \"protocol\": \"icmp\", \"ethertype\": \"IPv4\"}\n - {\"direction\": \"egress\", \"remote_ip_prefix\": \"::/0\", \"protocol\": \"tcp\", \"ethertype\": \"IPv6\", \"port_range_max\": 65535, \"port_range_min\": 0}\n - {\"direction\": \"egress\", \"remote_ip_prefix\": \"::/0\", \"protocol\": \"udp\", \"ethertype\": \"IPv6\", \"port_range_max\": 65535, \"port_range_min\": 0}\n - {\"direction\": \"egress\", \"remote_ip_prefix\": \"::/0\", \"protocol\": \"132\", \"ethertype\": \"IPv6\", \"port_range_max\": 65535, \"port_range_min\": 0}\n - {\"direction\": \"egress\", \"remote_ip_prefix\": \"::/0\", \"protocol\": \"58\", \"ethertype\": \"IPv6\"}\n - {\"direction\": \"ingress\", \"remote_ip_prefix\": \"0.0.0.0/0\", \"protocol\": \"tcp\", \"ethertype\": \"IPv4\", \"port_range_max\": 65535, \"port_range_min\": 0}\n - {\"direction\": \"ingress\", \"remote_ip_prefix\": \"0.0.0.0/0\", \"protocol\": \"udp\", \"ethertype\": \"IPv4\", \"port_range_max\": 65535, \"port_range_min\": 0}\n - {\"direction\": \"ingress\", \"remote_ip_prefix\": \"0.0.0.0/0\", \"protocol\": \"132\", \"ethertype\": \"IPv4\", \"port_range_max\": 65535, \"port_range_min\": 0}\n - {\"direction\": \"ingress\", \"remote_ip_prefix\": \"0.0.0.0/0\", \"protocol\": \"icmp\", \"ethertype\": \"IPv4\"}\n - {\"direction\": \"ingress\", \"remote_ip_prefix\": \"::/0\", \"protocol\": \"tcp\", \"ethertype\": \"IPv6\", \"port_range_max\": 65535, \"port_range_min\": 0}\n - {\"direction\": \"ingress\", \"remote_ip_prefix\": \"::/0\", \"protocol\": \"udp\", \"ethertype\": \"IPv6\", \"port_range_max\": 65535, \"port_range_min\": 0}\n - {\"direction\": \"ingress\", \"remote_ip_prefix\": \"::/0\", \"protocol\": \"132\", \"ethertype\": \"IPv6\", \"port_range_max\": 65535, \"port_range_min\": 0}\n - {\"direction\": \"ingress\", \"remote_ip_prefix\": \"::/0\", \"protocol\": \"58\", \"ethertype\": \"IPv6\"}\n\noutputs:\n\n sec_grp_msp_id:\n description: uuid of the security group\n value: {get_resource: sec_grp_msp_0 }\n" - }, - "heatFiles": [], - "vnfResources": { - "modelUuid": "d326f424-2312-4dd6-b7fe-364fadbd1ef5", - "modelInvariantUuid": "23122c9b-dd7f-483f-bf0a-e069303db2f7", - "modelName": "Vf zrdm5bpxmc02092017-VF", - "toscaNodeType": "org.openecomp.resource.vf.VfZrdm5bpxmc02092017Vf", - "description": "Demo", - "orchestrationMode": "HEAT", - "modelVersion": "1.0", - "modelInvariantId": "23122c9b-dd7f-483f-bf0a-e069303db2f7" - }, - "modelInvariantUuid": "f7a867f2-596b-4f4a-a128-421e825a6190", - "base": true - } - }, - { - "modelCustomizationUuid": "5336a98e-0966-4e59-b6e6-c8162804a024", - "label": "pxmc_vmt", - "minInstances": 0, - "initialCount": 0, - "heatEnvironment": { - "artifactUuid": "bc1640f1-69f0-4760-8fc3-3318ec2ff129", - "name": "pxmc_vmt.env", - "description": "Auto-generated HEAT Environment deployment artifact", - "environment": "parameters:\n cinder_delete_on_termination_false: \n cinder_delete_on_termination_true: \n oam_protected_net_name: \n sec_grp_msp_id: \n vf_module_id: \n vmt_block_device_names: \n vmt_flavor_name: \n vmt_name_0: \n vmt_oam_protected_ip_0: \n vmt_volume_image_name_0: \n vmt_volume_image_name_1: \n vmt_volume_name_0: \n vmt_volume_name_1: \n vmt_volume_size_0: \n vmt_volume_size_1: \n vnf_id: \n", - "artifactChecksum": "MjdkYzY5ZGU0ZTlkZDlhNzI2ZGVhMjk1ODVhZTg1NTY=", - "version": "2" - }, - "vfModule": { - "modelUUID": "4d4423e2-17e8-455a-b9ae-7e4ab71b9cdc", - "modelInvariantUUID": "1e099992-6222-41a9-acde-5a8abb690775", - "modelName": "VfZrdm5bpxmc02092017Vf..pxmc_vmt..module-1", - "modelVersion": "1", - "isBase": 0, - "moduleHeatTemplate": { - "artifactUuid": "ad12ab80-5419-4346-a5d7-dac2fc15575f", - "templateName": "pxmc_vmt.yaml", - "templateBody": "heat_template_version: 2015-04-30\n\ndescription: HOT creates Nimbus MSP VMT stack under MobiSupport Tenant\n\nparameters:\n vmt_name_0:\n type: string\n label: MSP VMT server names\n description: name of the MSP VMT instances\n# vmt_image_name:\n# type: string\n# label: MSP VMT image name\n# description: MSP VMT image name\n vmt_flavor_name:\n type: string\n label: MSP VMT flavor name\n description: MSP VMT flavor name\n# availability_zone_0:\n# type: string\n# label: MSP VMT availability zones\n# description: MSP VMT availability zones\n sec_grp_msp_id:\n type: string\n label: security group id\n description: the id of security group\n vmt_oam_protected_ip_0:\n type: string\n label: MSP VMT OAM IP Addresses\n description: MSP VMT OAM IP Addresses\n oam_protected_net_name:\n type: string\n label: MSP VMT OAM net name\n description: MSP VMT OAM net name\n vmt_block_device_names:\n type: comma_delimited_list\n label: MSP VMT Block Device Names\n description: MSP VMT Block Device Names\n vmt_volume_name_0:\n type: string\n label: Mobisupport MSP VMT Cinder Volume names\n description: Mobisupport MSP VMT Cinder Volume names\n vmt_volume_name_1:\n type: string\n label: Mobisupport MSP VMT Cinder Volume names\n description: Mobisupport MSP VMT Cinder Volume names\n vmt_volume_size_0:\n type: number\n label: Mobisupport MSP VMT Cinder Volume sizes\n description: Mobisupport MSP VMT Cinder Volume sizes\n vmt_volume_size_1:\n type: number\n label: Mobisupport MSP VMT Cinder Volume sizes\n description: Mobisupport MSP VMT Cinder Volume sizes\n vmt_volume_image_name_0:\n type: string\n label: Mobisupport MSP VMT VDA Cinder Volume image name\n description: Mobisupport MSP VMT VDA Cinder Volume image name\n vmt_volume_image_name_1:\n type: string\n label: Mobisupport MSP VMT VDB Cinder Volume image name\n description: Mobisupport MSP VMT VDB Cinder Volume image name\n cinder_delete_on_termination_true:\n type: boolean\n description: delete cinder volume upon instances termination\n cinder_delete_on_termination_false:\n type: boolean\n description: keep cinder volume upon instances termination\n vnf_id:\n type: string\n label: MSP VMT VNF ID\n description: MSP VMT VNF ID\n vf_module_id:\n type: string\n description: Unique ID for this VF Module instance\n\nresources:\n################ Cinder Volumes ##############################\n vmt_volume_0:\n type: OS::Cinder::Volume\n properties:\n name: {get_param: vmt_volume_name_0}\n size: {get_param: vmt_volume_size_0}\n image: {get_param: vmt_volume_image_name_0}\n\n vmt_volume_1:\n type: OS::Cinder::Volume\n properties:\n name: {get_param: vmt_volume_name_1}\n size: {get_param: vmt_volume_size_1}\n image: {get_param: vmt_volume_image_name_1}\n\n################ Ports ##############################\n vmt_oam_protected_0_port:\n type: OS::Neutron::Port\n properties:\n network: {get_param: oam_protected_net_name}\n fixed_ips: [{\"ip_address\": {get_param: vmt_oam_protected_ip_0}}]\n security_groups: [{get_param: sec_grp_msp_id}]\n replacement_policy: AUTO\n\n################### Servers #########################\n vmt_zrdm5bpxmc02vmt_0:\n type: OS::Nova::Server\n properties:\n name: {get_param: vmt_name_0}\n# image: {get_param: vmt_image_name}\n flavor: {get_param: vmt_flavor_name}\n# availability_zone: {get_param: availability_zone_0}\n block_device_mapping_v2: \n - device_name: {get_param: [vmt_block_device_names, 0]}\n volume_id: {get_resource: vmt_volume_0}\n delete_on_termination: {get_param: cinder_delete_on_termination_true}\n boot_index: 0\n - device_name: {get_param: [vmt_block_device_names, 1]}\n volume_id: {get_resource: vmt_volume_1}\n delete_on_termination: {get_param: cinder_delete_on_termination_true}\n boot_index: -1\n networks:\n - port: {get_resource: vmt_oam_protected_0_port}\n config_drive: \"True\"\n user_data_format: RAW\n user_data:\n get_file: user_data_zrdm5bpxmc02vmt001.txt\n\n metadata:\n vnf_id: {get_param: vnf_id}\n vf_module_id {get_param: vf_module_id}\n \"evacuation_policy\": \"Evacuation\"\n", - "timeoutMinutes": 120, - "version": "1", - "description": "created from csar", - "artifactChecksum": "ODE0YTRiYzc2YzkxOTliZjJhNjc0M2RhMWU4M2VlZmE=", - "parameters": [ - { - "heatTemplateArtifactUuid": "ad12ab80-5419-4346-a5d7-dac2fc15575f", - "paramName": "vmt_name_0", - "required": true, - "paramType": "string" - }, - { - "heatTemplateArtifactUuid": "ad12ab80-5419-4346-a5d7-dac2fc15575f", - "paramName": "vf_module_id", - "required": true, - "paramType": "string" - }, - { - "heatTemplateArtifactUuid": "ad12ab80-5419-4346-a5d7-dac2fc15575f", - "paramName": "sec_grp_msp_id", - "required": true, - "paramType": "string" - }, - { - "heatTemplateArtifactUuid": "ad12ab80-5419-4346-a5d7-dac2fc15575f", - "paramName": "vmt_volume_name_1", - "required": true, - "paramType": "string" - }, - { - "heatTemplateArtifactUuid": "ad12ab80-5419-4346-a5d7-dac2fc15575f", - "paramName": "vmt_volume_name_0", - "required": true, - "paramType": "string" - }, - { - "heatTemplateArtifactUuid": "ad12ab80-5419-4346-a5d7-dac2fc15575f", - "paramName": "vmt_block_device_names", - "required": true, - "paramType": "comma_delimited_list" - }, - { - "heatTemplateArtifactUuid": "ad12ab80-5419-4346-a5d7-dac2fc15575f", - "paramName": "vmt_flavor_name", - "required": true, - "paramType": "string" - }, - { - "heatTemplateArtifactUuid": "ad12ab80-5419-4346-a5d7-dac2fc15575f", - "paramName": "vnf_id", - "required": true, - "paramType": "string" - }, - { - "heatTemplateArtifactUuid": "ad12ab80-5419-4346-a5d7-dac2fc15575f", - "paramName": "oam_protected_net_name", - "required": true, - "paramType": "string" - }, - { - "heatTemplateArtifactUuid": "ad12ab80-5419-4346-a5d7-dac2fc15575f", - "paramName": "vmt_volume_image_name_1", - "required": true, - "paramType": "string" - }, - { - "heatTemplateArtifactUuid": "ad12ab80-5419-4346-a5d7-dac2fc15575f", - "paramName": "vmt_volume_image_name_0", - "required": true, - "paramType": "string" - }, - { - "heatTemplateArtifactUuid": "ad12ab80-5419-4346-a5d7-dac2fc15575f", - "paramName": "vmt_oam_protected_ip_0", - "required": true, - "paramType": "string" - }, - { - "heatTemplateArtifactUuid": "ad12ab80-5419-4346-a5d7-dac2fc15575f", - "paramName": "vmt_volume_size_0", - "required": true, - "paramType": "number" - }, - { - "heatTemplateArtifactUuid": "ad12ab80-5419-4346-a5d7-dac2fc15575f", - "paramName": "cinder_delete_on_termination_false", - "required": true, - "paramType": "boolean" - }, - { - "heatTemplateArtifactUuid": "ad12ab80-5419-4346-a5d7-dac2fc15575f", - "paramName": "vmt_volume_size_1", - "required": true, - "paramType": "number" - }, - { - "heatTemplateArtifactUuid": "ad12ab80-5419-4346-a5d7-dac2fc15575f", - "paramName": "cinder_delete_on_termination_true", - "required": true, - "paramType": "boolean" - } - ], - "childTemplates": [], - "heatTemplate": "heat_template_version: 2015-04-30\n\ndescription: HOT creates Nimbus MSP VMT stack under MobiSupport Tenant\n\nparameters:\n vmt_name_0:\n type: string\n label: MSP VMT server names\n description: name of the MSP VMT instances\n# vmt_image_name:\n# type: string\n# label: MSP VMT image name\n# description: MSP VMT image name\n vmt_flavor_name:\n type: string\n label: MSP VMT flavor name\n description: MSP VMT flavor name\n# availability_zone_0:\n# type: string\n# label: MSP VMT availability zones\n# description: MSP VMT availability zones\n sec_grp_msp_id:\n type: string\n label: security group id\n description: the id of security group\n vmt_oam_protected_ip_0:\n type: string\n label: MSP VMT OAM IP Addresses\n description: MSP VMT OAM IP Addresses\n oam_protected_net_name:\n type: string\n label: MSP VMT OAM net name\n description: MSP VMT OAM net name\n vmt_block_device_names:\n type: comma_delimited_list\n label: MSP VMT Block Device Names\n description: MSP VMT Block Device Names\n vmt_volume_name_0:\n type: string\n label: Mobisupport MSP VMT Cinder Volume names\n description: Mobisupport MSP VMT Cinder Volume names\n vmt_volume_name_1:\n type: string\n label: Mobisupport MSP VMT Cinder Volume names\n description: Mobisupport MSP VMT Cinder Volume names\n vmt_volume_size_0:\n type: number\n label: Mobisupport MSP VMT Cinder Volume sizes\n description: Mobisupport MSP VMT Cinder Volume sizes\n vmt_volume_size_1:\n type: number\n label: Mobisupport MSP VMT Cinder Volume sizes\n description: Mobisupport MSP VMT Cinder Volume sizes\n vmt_volume_image_name_0:\n type: string\n label: Mobisupport MSP VMT VDA Cinder Volume image name\n description: Mobisupport MSP VMT VDA Cinder Volume image name\n vmt_volume_image_name_1:\n type: string\n label: Mobisupport MSP VMT VDB Cinder Volume image name\n description: Mobisupport MSP VMT VDB Cinder Volume image name\n cinder_delete_on_termination_true:\n type: boolean\n description: delete cinder volume upon instances termination\n cinder_delete_on_termination_false:\n type: boolean\n description: keep cinder volume upon instances termination\n vnf_id:\n type: string\n label: MSP VMT VNF ID\n description: MSP VMT VNF ID\n vf_module_id:\n type: string\n description: Unique ID for this VF Module instance\n\nresources:\n################ Cinder Volumes ##############################\n vmt_volume_0:\n type: OS::Cinder::Volume\n properties:\n name: {get_param: vmt_volume_name_0}\n size: {get_param: vmt_volume_size_0}\n image: {get_param: vmt_volume_image_name_0}\n\n vmt_volume_1:\n type: OS::Cinder::Volume\n properties:\n name: {get_param: vmt_volume_name_1}\n size: {get_param: vmt_volume_size_1}\n image: {get_param: vmt_volume_image_name_1}\n\n################ Ports ##############################\n vmt_oam_protected_0_port:\n type: OS::Neutron::Port\n properties:\n network: {get_param: oam_protected_net_name}\n fixed_ips: [{\"ip_address\": {get_param: vmt_oam_protected_ip_0}}]\n security_groups: [{get_param: sec_grp_msp_id}]\n replacement_policy: AUTO\n\n################### Servers #########################\n vmt_zrdm5bpxmc02vmt_0:\n type: OS::Nova::Server\n properties:\n name: {get_param: vmt_name_0}\n# image: {get_param: vmt_image_name}\n flavor: {get_param: vmt_flavor_name}\n# availability_zone: {get_param: availability_zone_0}\n block_device_mapping_v2: \n - device_name: {get_param: [vmt_block_device_names, 0]}\n volume_id: {get_resource: vmt_volume_0}\n delete_on_termination: {get_param: cinder_delete_on_termination_true}\n boot_index: 0\n - device_name: {get_param: [vmt_block_device_names, 1]}\n volume_id: {get_resource: vmt_volume_1}\n delete_on_termination: {get_param: cinder_delete_on_termination_true}\n boot_index: -1\n networks:\n - port: {get_resource: vmt_oam_protected_0_port}\n config_drive: \"True\"\n user_data_format: RAW\n user_data:\n get_file: user_data_zrdm5bpxmc02vmt001.txt\n\n metadata:\n vnf_id: {get_param: vnf_id}\n vf_module_id {get_param: vf_module_id}\n \"evacuation_policy\": \"Evacuation\"\n" - }, - "heatFiles": [], - "vnfResources": { - "modelUuid": "d326f424-2312-4dd6-b7fe-364fadbd1ef5", - "modelInvariantUuid": "23122c9b-dd7f-483f-bf0a-e069303db2f7", - "modelName": "Vf zrdm5bpxmc02092017-VF", - "toscaNodeType": "org.openecomp.resource.vf.VfZrdm5bpxmc02092017Vf", - "description": "Demo", - "orchestrationMode": "HEAT", - "modelVersion": "1.0", - "modelInvariantId": "23122c9b-dd7f-483f-bf0a-e069303db2f7" - }, - "modelInvariantUuid": "1e099992-6222-41a9-acde-5a8abb690775", - "base": false - } - }, - { - "modelCustomizationUuid": "e38906fa-717c-49b0-b391-e6ec12b50c4a", - "label": "pxmc_mmn", - "minInstances": 0, - "initialCount": 0, - "heatEnvironment": { - "artifactUuid": "e88ce0b9-1496-4d03-ab1d-6d8d79bfc737", - "name": "pxmc_mmn.env", - "description": "Auto-generated HEAT Environment deployment artifact", - "environment": "parameters:\n cinder_delete_on_termination_false: \n cinder_delete_on_termination_true: \n mmn_arch_volume_id_2: \n mmn_backup_volume_id_3: \n mmn_block_device_names: \n mmn_data_volume_id_1: \n mmn_flavor_name: \n mmn_misc_volume_id_4: \n mmn_name_0: \n mmn_oam_protected_ip_0: \n mmn_volume_image_name_0: \n mmn_volume_name_0: \n mmn_volume_size_0: \n oam_protected_net_name: \n sec_grp_msp_id: \n vf_module_id: \n vnf_id: \n", - "artifactChecksum": "ZGI1NzI2Y2FmYjFhOTM2ZDYwNzg1YWRhZjBmMTk2OTQ=", - "version": "2" - }, - "vfModule": { - "modelUUID": "a8cb1182-9b6d-46f8-b06b-ded4fe69e10d", - "modelInvariantUUID": "8e53c069-b2f0-437a-9c00-21cbc5c8f081", - "modelName": "VfZrdm5bpxmc02092017Vf..pxmc_mmn..module-2", - "modelVersion": "1", - "isBase": 0, - "volumeHeatTemplate": { - "artifactUuid": "2f372a02-df1b-46ca-b81e-822e3f406965", - "templateName": "pxmc_mmn_volume.yaml", - "templateBody": "heat_template_version: 2015-04-30\n\ndescription: HOT creates MSP MMN Cinder Volumes under MobiSupport Tenant\n\nparameters:\n mmn_volume_name_1:\n type: string\n label: Mobisupport MSP MMN Cinder Volume names\n description: Mobisupport MSP MMN Cinder Volume names\n\n mmn_volume_name_2:\n type: string\n label: Mobisupport MSP MMN Cinder Volume names\n description: Mobisupport MSP MMN Cinder Volume names\n\n mmn_volume_name_3:\n type: string\n label: Mobisupport MSP MMN Cinder Volume names\n description: Mobisupport MSP MMN Cinder Volume names\n\n mmn_volume_name_4:\n type: string\n label: Mobisupport MSP MMN Cinder Volume names\n description: Mobisupport MSP MMN Cinder Volume names\n\n mmn_volume_size_1:\n type: number\n label: Mobisupport MSP MMN Cinder Volume sizes\n description: Mobisupport MSP MMN Cinder Volume sizes\n\n mmn_volume_size_2:\n type: number\n label: Mobisupport MSP MMN Cinder Volume sizes\n description: Mobisupport MSP MMN Cinder Volume sizes\n\n mmn_volume_size_3:\n type: number\n label: Mobisupport MSP MMN Cinder Volume sizes\n description: Mobisupport MSP MMN Cinder Volume sizes\n\n mmn_volume_size_4:\n type: number\n label: Mobisupport MSP MMN Cinder Volume sizes\n description: Mobisupport MSP MMN Cinder Volume sizes\n\nresources:\n mmn_data_volume_1:\n type: OS::Cinder::Volume\n properties:\n name: {get_param: mmn_volume_name_1}\n size: {get_param: mmn_volume_size_1}\n \n mmn_arch_volume_2:\n type: OS::Cinder::Volume\n properties:\n name: {get_param: mmn_volume_name_2}\n size: {get_param: mmn_volume_size_2}\n \n mmn_backup_volume_3:\n type: OS::Cinder::Volume\n properties:\n name: {get_param: mmn_volume_name_3}\n size: {get_param: mmn_volume_size_3}\n \n mmn_misc_volume_4:\n type: OS::Cinder::Volume\n properties:\n name: {get_param: mmn_volume_name_4}\n size: {get_param: mmn_volume_size_4}\n\noutputs:\n mmn_data_volume_id_1:\n description: msp mmn data volume 1\n value: {get_resource: mmn_data_volume_1}\n \n mmn_arch_volume_id_2:\n description: msp mn arch volume 2\n value: {get_resource: mmn_arch_volume_2}\n \n mmn_backup_volume_id_3:\n description: msp mn backup volume 3\n value: {get_resource: mmn_backup_volume_3}\n \n mmn_misc_volume_id_4:\n description: msp mn volume 4\n value: {get_resource: mmn_misc_volume_4}\n", - "timeoutMinutes": 120, - "version": "2", - "description": "created from csar", - "artifactChecksum": "MzA5MGY5ODQ0NDY5MDhiMDM3YjFlNGIwNzJkNjFhOTI=", - "parameters": [ - { - "heatTemplateArtifactUuid": "2f372a02-df1b-46ca-b81e-822e3f406965", - "paramName": "mmn_volume_name_2", - "required": true, - "paramType": "string" - }, - { - "heatTemplateArtifactUuid": "2f372a02-df1b-46ca-b81e-822e3f406965", - "paramName": "mmn_volume_size_2", - "required": true, - "paramType": "number" - }, - { - "heatTemplateArtifactUuid": "2f372a02-df1b-46ca-b81e-822e3f406965", - "paramName": "mmn_volume_name_1", - "required": true, - "paramType": "string" - }, - { - "heatTemplateArtifactUuid": "2f372a02-df1b-46ca-b81e-822e3f406965", - "paramName": "mmn_volume_size_1", - "required": true, - "paramType": "number" - }, - { - "heatTemplateArtifactUuid": "2f372a02-df1b-46ca-b81e-822e3f406965", - "paramName": "mmn_volume_name_4", - "required": true, - "paramType": "string" - }, - { - "heatTemplateArtifactUuid": "2f372a02-df1b-46ca-b81e-822e3f406965", - "paramName": "mmn_volume_name_3", - "required": true, - "paramType": "string" - }, - { - "heatTemplateArtifactUuid": "2f372a02-df1b-46ca-b81e-822e3f406965", - "paramName": "mmn_volume_size_4", - "required": true, - "paramType": "number" - }, - { - "heatTemplateArtifactUuid": "2f372a02-df1b-46ca-b81e-822e3f406965", - "paramName": "mmn_volume_size_3", - "required": true, - "paramType": "number" - } - ], - "childTemplates": [], - "heatTemplate": "heat_template_version: 2015-04-30\n\ndescription: HOT creates MSP MMN Cinder Volumes under MobiSupport Tenant\n\nparameters:\n mmn_volume_name_1:\n type: string\n label: Mobisupport MSP MMN Cinder Volume names\n description: Mobisupport MSP MMN Cinder Volume names\n\n mmn_volume_name_2:\n type: string\n label: Mobisupport MSP MMN Cinder Volume names\n description: Mobisupport MSP MMN Cinder Volume names\n\n mmn_volume_name_3:\n type: string\n label: Mobisupport MSP MMN Cinder Volume names\n description: Mobisupport MSP MMN Cinder Volume names\n\n mmn_volume_name_4:\n type: string\n label: Mobisupport MSP MMN Cinder Volume names\n description: Mobisupport MSP MMN Cinder Volume names\n\n mmn_volume_size_1:\n type: number\n label: Mobisupport MSP MMN Cinder Volume sizes\n description: Mobisupport MSP MMN Cinder Volume sizes\n\n mmn_volume_size_2:\n type: number\n label: Mobisupport MSP MMN Cinder Volume sizes\n description: Mobisupport MSP MMN Cinder Volume sizes\n\n mmn_volume_size_3:\n type: number\n label: Mobisupport MSP MMN Cinder Volume sizes\n description: Mobisupport MSP MMN Cinder Volume sizes\n\n mmn_volume_size_4:\n type: number\n label: Mobisupport MSP MMN Cinder Volume sizes\n description: Mobisupport MSP MMN Cinder Volume sizes\n\nresources:\n mmn_data_volume_1:\n type: OS::Cinder::Volume\n properties:\n name: {get_param: mmn_volume_name_1}\n size: {get_param: mmn_volume_size_1}\n \n mmn_arch_volume_2:\n type: OS::Cinder::Volume\n properties:\n name: {get_param: mmn_volume_name_2}\n size: {get_param: mmn_volume_size_2}\n \n mmn_backup_volume_3:\n type: OS::Cinder::Volume\n properties:\n name: {get_param: mmn_volume_name_3}\n size: {get_param: mmn_volume_size_3}\n \n mmn_misc_volume_4:\n type: OS::Cinder::Volume\n properties:\n name: {get_param: mmn_volume_name_4}\n size: {get_param: mmn_volume_size_4}\n\noutputs:\n mmn_data_volume_id_1:\n description: msp mmn data volume 1\n value: {get_resource: mmn_data_volume_1}\n \n mmn_arch_volume_id_2:\n description: msp mn arch volume 2\n value: {get_resource: mmn_arch_volume_2}\n \n mmn_backup_volume_id_3:\n description: msp mn backup volume 3\n value: {get_resource: mmn_backup_volume_3}\n \n mmn_misc_volume_id_4:\n description: msp mn volume 4\n value: {get_resource: mmn_misc_volume_4}\n" - }, - "moduleHeatTemplate": { - "artifactUuid": "b8bca13b-811f-44ab-9d27-45b842c664d8", - "templateName": "pxmc_mmn.yaml", - "templateBody": "heat_template_version: 2015-04-30\n\ndescription: HOT creates Nimbus vMSP MMN stack.\n\nparameters:\n mmn_name_0:\n type: string\n label: MSP MMN server names\n description: name of the MSP MMN instances\n mmn_flavor_name:\n type: string\n label: MSP MMN flavor name\n description: MSP MMN flavor name\n# mmn_image_name:\n# type: string\n# label: MSP MMN image name\n# description: MSP MMN image name\n# availability_zone_0:\n# type: string\n# label: MSP MMN availability zones\n# description: MSP MMN availability zones\n sec_grp_msp_id:\n type: string\n label: security group id\n description: the id of security group\n mmn_oam_protected_ip_0:\n type: string\n label: MSP MMN OAM IP Addresses\n description: MSP MMN OAM IP Addresses\n oam_protected_net_name:\n type: string\n label: MSP MMN OAM net name\n description: MSP MMN OAM net name\n mmn_volume_name_0:\n type: string\n label: Mobisupport MSP MMN Cinder Volume names\n description: Mobisupport MSP MMN Cinder Volume names\n mmn_volume_size_0:\n type: number\n label: Mobisupport MSP MMN Cinder Volume sizes\n description: Mobisupport MSP MMN Cinder Volume sizes\n mmn_volume_image_name_0:\n type: string\n label: Mobisupport MSP MMN Cinder Volume image name\n description: Mobisupport MSP MMN Cinder Volume image name\n mmn_data_volume_id_1:\n type: string\n label: MSP MMN Volume id 1\n description: MSP MMN Volume id 1\n mmn_arch_volume_id_2:\n type: string\n label: MSP MMN Volume id 2\n description: MSP MMN Volume id 2\n mmn_backup_volume_id_3:\n type: string\n label: MSP MMN Volume id 3\n description: MSP MMN Volume id 3\n mmn_misc_volume_id_4:\n type: string\n label: MSP MMN Volume id 4\n description: MSP MMN Volume id 4\n mmn_block_device_names:\n type: comma_delimited_list\n label: MSP MMN Block Device Names\n description: MSP MMN Block Device Names\n cinder_delete_on_termination_true:\n type: boolean\n description: delete cinder volume upon instances termination\n cinder_delete_on_termination_false:\n type: boolean\n description: keep cinder volume upon instances termination\n vnf_id:\n type: string\n label: MSP MMN VNF ID\n description: MSP MMN VNF ID\n vf_module_id:\n type: string\n description: Unique ID for this VF module instance\n\nresources:\n################ Cinder Volume ########################\n mmn_volume_0:\n type: OS::Cinder::Volume\n properties:\n name: {get_param: mmn_volume_name_0}\n size: {get_param: mmn_volume_size_0}\n image: {get_param: mmn_volume_image_name_0}\n\n################ Server ##############################\n mmn_zrdm5bpxmc02mmn_0:\n type: OS::Nova::Server\n properties:\n name: {get_param: mmn_name_0}\n# image: {get_param: mmn_image_name}\n flavor: {get_param: mmn_flavor_name}\n# availability_zone: {get_param: availability_zone_0}\n block_device_mapping_v2:\n - device_name: { get_param: [mmn_block_device_names, 0] }\n volume_id: { get_resource: mmn_volume_0 }\n delete_on_termination: {get_param: cinder_delete_on_termination_true}\n networks:\n - port: { get_resource: mmn_oam_protected_0_port }\n config_drive: \"True\"\n user_data_format: RAW\n user_data:\n get_file: user_data_zrdm5bpxmc02mmn001.txt\n metadata:\n vnf_id: {get_param: vnf_id}\n vf_module_id {get_param: vf_module_id}\n \"evacuation_policy\": \"Evacuation\"\n\n################ Ports ##############################\n mmn_oam_protected_0_port:\n type: OS::Neutron::Port\n properties:\n network: {get_param: oam_protected_net_name}\n fixed_ips: [{\"ip_address\": {get_param: mmn_oam_protected_ip_0}}]\n security_groups: [{ get_param: sec_grp_msp_id }]\n replacement_policy: AUTO\n\n################ Volume Attachment ##############################\n volume_attachment_vdb:\n type: OS::Cinder::VolumeAttachment\n depends_on: mmn_zrdm5bpxmc02mmn_0\n properties:\n volume_id: { get_param: mmn_data_volume_id_1 }\n instance_uuid: { get_resource: mmn_zrdm5bpxmc02mmn_0}\n mountpoint: /dev/vdb\n\n volume_attachment_vdc:\n type: OS::Cinder::VolumeAttachment\n depends_on: volume_attachment_vdb\n properties:\n volume_id: { get_param: mmn_arch_volume_id_2 }\n instance_uuid: { get_resource: mmn_zrdm5bpxmc02mmn_0}\n mountpoint: /dev/vdc\n\n volume_attachment_vdd:\n type: OS::Cinder::VolumeAttachment\n depends_on: volume_attachment_vdc\n properties:\n volume_id: { get_param: mmn_backup_volume_id_3 }\n instance_uuid: { get_resource: mmn_zrdm5bpxmc02mmn_0}\n mountpoint: /dev/vdd\n\n volume_attachment_vde:\n type: OS::Cinder::VolumeAttachment\n depends_on: volume_attachment_vdd\n properties:\n volume_id: { get_param: mmn_misc_volume_id_4 }\n instance_uuid: { get_resource: mmn_zrdm5bpxmc02mmn_0}\n mountpoint: /dev/vde\n", - "timeoutMinutes": 120, - "version": "1", - "description": "created from csar", - "artifactChecksum": "YmNiYTU5YTM4ODVhYTlhODc5NGMwNWZkZjI5MTRmNTE=", - "parameters": [ - { - "heatTemplateArtifactUuid": "b8bca13b-811f-44ab-9d27-45b842c664d8", - "paramName": "vnf_id", - "required": true, - "paramType": "string" - }, - { - "heatTemplateArtifactUuid": "b8bca13b-811f-44ab-9d27-45b842c664d8", - "paramName": "mmn_block_device_names", - "required": true, - "paramType": "comma_delimited_list" - }, - { - "heatTemplateArtifactUuid": "b8bca13b-811f-44ab-9d27-45b842c664d8", - "paramName": "mmn_name_0", - "required": true, - "paramType": "string" - }, - { - "heatTemplateArtifactUuid": "b8bca13b-811f-44ab-9d27-45b842c664d8", - "paramName": "mmn_arch_volume_id_2", - "required": true, - "paramType": "string" - }, - { - "heatTemplateArtifactUuid": "b8bca13b-811f-44ab-9d27-45b842c664d8", - "paramName": "mmn_volume_image_name_0", - "required": true, - "paramType": "string" - }, - { - "heatTemplateArtifactUuid": "b8bca13b-811f-44ab-9d27-45b842c664d8", - "paramName": "cinder_delete_on_termination_false", - "required": true, - "paramType": "boolean" - }, - { - "heatTemplateArtifactUuid": "b8bca13b-811f-44ab-9d27-45b842c664d8", - "paramName": "mmn_oam_protected_ip_0", - "required": true, - "paramType": "string" - }, - { - "heatTemplateArtifactUuid": "b8bca13b-811f-44ab-9d27-45b842c664d8", - "paramName": "mmn_data_volume_id_1", - "required": true, - "paramType": "string" - }, - { - "heatTemplateArtifactUuid": "b8bca13b-811f-44ab-9d27-45b842c664d8", - "paramName": "mmn_backup_volume_id_3", - "required": true, - "paramType": "string" - }, - { - "heatTemplateArtifactUuid": "b8bca13b-811f-44ab-9d27-45b842c664d8", - "paramName": "vf_module_id", - "required": true, - "paramType": "string" - }, - { - "heatTemplateArtifactUuid": "b8bca13b-811f-44ab-9d27-45b842c664d8", - "paramName": "sec_grp_msp_id", - "required": true, - "paramType": "string" - }, - { - "heatTemplateArtifactUuid": "b8bca13b-811f-44ab-9d27-45b842c664d8", - "paramName": "mmn_volume_size_0", - "required": true, - "paramType": "number" - }, - { - "heatTemplateArtifactUuid": "b8bca13b-811f-44ab-9d27-45b842c664d8", - "paramName": "cinder_delete_on_termination_true", - "required": true, - "paramType": "boolean" - }, - { - "heatTemplateArtifactUuid": "b8bca13b-811f-44ab-9d27-45b842c664d8", - "paramName": "mmn_volume_name_0", - "required": true, - "paramType": "string" - }, - { - "heatTemplateArtifactUuid": "b8bca13b-811f-44ab-9d27-45b842c664d8", - "paramName": "oam_protected_net_name", - "required": true, - "paramType": "string" - }, - { - "heatTemplateArtifactUuid": "b8bca13b-811f-44ab-9d27-45b842c664d8", - "paramName": "mmn_misc_volume_id_4", - "required": true, - "paramType": "string" - }, - { - "heatTemplateArtifactUuid": "b8bca13b-811f-44ab-9d27-45b842c664d8", - "paramName": "mmn_flavor_name", - "required": true, - "paramType": "string" - } - ], - "childTemplates": [], - "heatTemplate": "heat_template_version: 2015-04-30\n\ndescription: HOT creates Nimbus vMSP MMN stack.\n\nparameters:\n mmn_name_0:\n type: string\n label: MSP MMN server names\n description: name of the MSP MMN instances\n mmn_flavor_name:\n type: string\n label: MSP MMN flavor name\n description: MSP MMN flavor name\n# mmn_image_name:\n# type: string\n# label: MSP MMN image name\n# description: MSP MMN image name\n# availability_zone_0:\n# type: string\n# label: MSP MMN availability zones\n# description: MSP MMN availability zones\n sec_grp_msp_id:\n type: string\n label: security group id\n description: the id of security group\n mmn_oam_protected_ip_0:\n type: string\n label: MSP MMN OAM IP Addresses\n description: MSP MMN OAM IP Addresses\n oam_protected_net_name:\n type: string\n label: MSP MMN OAM net name\n description: MSP MMN OAM net name\n mmn_volume_name_0:\n type: string\n label: Mobisupport MSP MMN Cinder Volume names\n description: Mobisupport MSP MMN Cinder Volume names\n mmn_volume_size_0:\n type: number\n label: Mobisupport MSP MMN Cinder Volume sizes\n description: Mobisupport MSP MMN Cinder Volume sizes\n mmn_volume_image_name_0:\n type: string\n label: Mobisupport MSP MMN Cinder Volume image name\n description: Mobisupport MSP MMN Cinder Volume image name\n mmn_data_volume_id_1:\n type: string\n label: MSP MMN Volume id 1\n description: MSP MMN Volume id 1\n mmn_arch_volume_id_2:\n type: string\n label: MSP MMN Volume id 2\n description: MSP MMN Volume id 2\n mmn_backup_volume_id_3:\n type: string\n label: MSP MMN Volume id 3\n description: MSP MMN Volume id 3\n mmn_misc_volume_id_4:\n type: string\n label: MSP MMN Volume id 4\n description: MSP MMN Volume id 4\n mmn_block_device_names:\n type: comma_delimited_list\n label: MSP MMN Block Device Names\n description: MSP MMN Block Device Names\n cinder_delete_on_termination_true:\n type: boolean\n description: delete cinder volume upon instances termination\n cinder_delete_on_termination_false:\n type: boolean\n description: keep cinder volume upon instances termination\n vnf_id:\n type: string\n label: MSP MMN VNF ID\n description: MSP MMN VNF ID\n vf_module_id:\n type: string\n description: Unique ID for this VF module instance\n\nresources:\n################ Cinder Volume ########################\n mmn_volume_0:\n type: OS::Cinder::Volume\n properties:\n name: {get_param: mmn_volume_name_0}\n size: {get_param: mmn_volume_size_0}\n image: {get_param: mmn_volume_image_name_0}\n\n################ Server ##############################\n mmn_zrdm5bpxmc02mmn_0:\n type: OS::Nova::Server\n properties:\n name: {get_param: mmn_name_0}\n# image: {get_param: mmn_image_name}\n flavor: {get_param: mmn_flavor_name}\n# availability_zone: {get_param: availability_zone_0}\n block_device_mapping_v2:\n - device_name: { get_param: [mmn_block_device_names, 0] }\n volume_id: { get_resource: mmn_volume_0 }\n delete_on_termination: {get_param: cinder_delete_on_termination_true}\n networks:\n - port: { get_resource: mmn_oam_protected_0_port }\n config_drive: \"True\"\n user_data_format: RAW\n user_data:\n get_file: user_data_zrdm5bpxmc02mmn001.txt\n metadata:\n vnf_id: {get_param: vnf_id}\n vf_module_id {get_param: vf_module_id}\n \"evacuation_policy\": \"Evacuation\"\n\n################ Ports ##############################\n mmn_oam_protected_0_port:\n type: OS::Neutron::Port\n properties:\n network: {get_param: oam_protected_net_name}\n fixed_ips: [{\"ip_address\": {get_param: mmn_oam_protected_ip_0}}]\n security_groups: [{ get_param: sec_grp_msp_id }]\n replacement_policy: AUTO\n\n################ Volume Attachment ##############################\n volume_attachment_vdb:\n type: OS::Cinder::VolumeAttachment\n depends_on: mmn_zrdm5bpxmc02mmn_0\n properties:\n volume_id: { get_param: mmn_data_volume_id_1 }\n instance_uuid: { get_resource: mmn_zrdm5bpxmc02mmn_0}\n mountpoint: /dev/vdb\n\n volume_attachment_vdc:\n type: OS::Cinder::VolumeAttachment\n depends_on: volume_attachment_vdb\n properties:\n volume_id: { get_param: mmn_arch_volume_id_2 }\n instance_uuid: { get_resource: mmn_zrdm5bpxmc02mmn_0}\n mountpoint: /dev/vdc\n\n volume_attachment_vdd:\n type: OS::Cinder::VolumeAttachment\n depends_on: volume_attachment_vdc\n properties:\n volume_id: { get_param: mmn_backup_volume_id_3 }\n instance_uuid: { get_resource: mmn_zrdm5bpxmc02mmn_0}\n mountpoint: /dev/vdd\n\n volume_attachment_vde:\n type: OS::Cinder::VolumeAttachment\n depends_on: volume_attachment_vdd\n properties:\n volume_id: { get_param: mmn_misc_volume_id_4 }\n instance_uuid: { get_resource: mmn_zrdm5bpxmc02mmn_0}\n mountpoint: /dev/vde\n" - }, - "heatFiles": [], - "vnfResources": { - "modelUuid": "d326f424-2312-4dd6-b7fe-364fadbd1ef5", - "modelInvariantUuid": "23122c9b-dd7f-483f-bf0a-e069303db2f7", - "modelName": "Vf zrdm5bpxmc02092017-VF", - "toscaNodeType": "org.openecomp.resource.vf.VfZrdm5bpxmc02092017Vf", - "description": "Demo", - "orchestrationMode": "HEAT", - "modelVersion": "1.0", - "modelInvariantId": "23122c9b-dd7f-483f-bf0a-e069303db2f7" - }, - "modelInvariantUuid": "8e53c069-b2f0-437a-9c00-21cbc5c8f081", - "base": false - } - } - ], - "vnfResource": { - "modelUuid": "d326f424-2312-4dd6-b7fe-364fadbd1ef5", - "modelInvariantUuid": "23122c9b-dd7f-483f-bf0a-e069303db2f7", - "modelName": "Vf zrdm5bpxmc02092017-VF", - "toscaNodeType": "org.openecomp.resource.vf.VfZrdm5bpxmc02092017Vf", - "description": "Demo", - "orchestrationMode": "HEAT", - "modelVersion": "1.0", - "modelInvariantId": "23122c9b-dd7f-483f-bf0a-e069303db2f7" - } - } - ], - "allotedCustomizations": [], - "recipes": { - - }, - "csar": { - "artifactUUID": "396cfd49-0f4b-4fec-9f33-0fd7e90d5a22", - "name": "service-VfZrdm5bpxmc02092017Service-csar.csar", - "artifactChecksum": "MWQ3Y2FmMWExNDQyYWI2N2YwNjEwZGUzN2IzMzI3NjE=", - "url": "service-VfZrdm5bpxmc02092017Service-csar.csar", - "description": "TOSCA definition package of the asset", - "version": "1" - } -} diff --git a/asdc-controller/src/test/resources/resource-examples/multipleModules/notif-structure.json b/asdc-controller/src/test/resources/resource-examples/multipleModules/notif-structure.json deleted file mode 100644 index 3a7b361f89..0000000000 --- a/asdc-controller/src/test/resources/resource-examples/multipleModules/notif-structure.json +++ /dev/null @@ -1,96 +0,0 @@ -{ - "serviceName": "Vf zrdm5bpxmc02092017-Service", - "serviceInvariantUUID": "b16a9398-ffa3-4041-b78c-2956b8ad9c7b", - "serviceUUID": "bad955c3-29b2-4a27-932e-28e942cc6480", - "serviceVersion": "1.0", - "serviceArtifacts": - [{ - "artifactName": "service-VfZrdm5bpxmc02092017Service-csar.csar", - "artifactType": "TOSCA_CSAR", - "artifactURL": "service-VfZrdm5bpxmc02092017Service-csar.csar", - "artifactChecksum": "MWQ3Y2FmMWExNDQyYWI2N2YwNjEwZGUzN2IzMzI3NjE=", - "artifactDescription": "TOSCA definition package of the asset", - "artifactTimeout": 0, - "artifactUUID": "396cfd49-0f4b-4fec-9f33-0fd7e90d5a22", - "artifactVersion": "1" - }], - "resources": - [ - { - "resourceInstanceName": "Vf zrdm5bpxmc02092017-VF 0", - "resourceInvariantUUID": "23122c9b-dd7f-483f-bf0a-e069303db2f7", - "resourceCustomizationUUID": "96c23a4a-6887-4b2c-9cce-1e4ea35eaade", - "resourceName": "Vf zrdm5bpxmc02092017-VF", - "resourceType": "VF", - "resourceUUID": "14ba5d1e-3862-407c-a236-1cbaebccce77", - "resourceVersion": "1.0", - "category": "Generic", - "subcategory": "Network Elements", - "artifacts": - [ - { - "artifactChecksum": "NmEyZjc1Y2UwZDMwYjFhNGRlMTMzN2JhNzdiMThjMGU=", - "artifactDescription": "Auto-generated HEAT Environment deployment artifact", - "artifactName": "pxmc_mmn_volume.env", - "artifactType": "HEAT_ENV", - "artifactURL": "pxmc_mmn_volume.env", - "artifactUUID": "c1ae6284-48d9-4437-a195-b2cf2ba23070", - "artifactTimeout": 0, - "artifactVersion": "2" - }, - { - "artifactChecksum": "OGM2MWIzZTA2OTc5YjQwNTM1NGVhODA0YTFkNzM4ZTg==", - "artifactDescription": "Auto-generated HEAT Environment deployment artifact", - "artifactName": "pxmc_base.env", - "artifactTimeout": 0, - "artifactType": "HEAT_ENV", - "artifactURL": "pxmc_base.env", - "artifactUUID": "6dd99c31-c52e-4c45-b99b-d223c877a296", - "artifactVersion": "2.0" - }, - { - "artifactChecksum": "MzJmZjgyZWYwOTBjMTg5M2ExNWZhMmMwNzc1NWY1YjQ=", - "artifactDescription": "created from csar", - "artifactName": "user_data_zrdm5bpxmc02vmt001.txt", - "artifactTimeout": 0, - "artifactType": "HEAT_ARTIFACT", - "artifactURL": "user_data_zrdm5bpxmc02vmt001.txt", - "artifactUUID": "53acdabe-689f-45e5-8578-f1514d3529da", - "artifactVersion": "1" - }, - { - "artifactChecksum": "MjY0NzcxMjJkZGI4YzQ1MDU2NjhkNWYyM2IwNmYzYmU=", - "artifactDescription": "Auto-generated VF Modules information artifact", - "artifactName": "vfzrdm5bpxmc02092017vf0_modules.json", - "artifactTimeout": 0, - "artifactType": "VF_MODULES_METADATA", - "artifactURL": "vfzrdm5bpxmc02092017vf0_modules.json", - "artifactUUID": "e3b82cd6-485e-4d56-8d2c-17ccf6a59533", - "artifactVersion": "1" - }, - { - "artifactChecksum": "YWQ2MmE0Y2NjNGE4YmJlOTk0YmZhYmIxYTc1YWZkY2M=", - "artifactDescription": "Auto-generated HEAT Environment deployment artifact", - "artifactName": "base_TEST.env", - "artifactTimeout": 0, - "artifactType": "HEAT_ENV", - "artifactURL": "base_TEST.env", - "artifactUUID": "57f6520b-fa65-4544-90de-95c8190c2e6c", - "artifactVersion": "1.0" - }, - { - "artifactChecksum": "YWQ2MmE0Y2NjNGE4YmJlOTk0YmZhYmIxYTc1YWZkY2M=", - "artifactDescription": "Auto-generated HEAT Environment deployment artifact", - "artifactName": "base_TEST.env", - "artifactTimeout": 0, - "artifactType": "HEAT_ENV", - "artifactURL": "base_TEST.env", - "artifactUUID": "57f6520b-fa65-4544-90de-95c8190c2e6c", - "artifactVersion": "1.0" - } - ] - } - ], - "serviceDescription": "Demo", - "distributionID": "a2872f55-8628-4486-8548-7b132c9a47db" -} \ No newline at end of file diff --git a/asdc-controller/src/test/resources/resource-examples/multipleModules/pxmc_base.env b/asdc-controller/src/test/resources/resource-examples/multipleModules/pxmc_base.env deleted file mode 100644 index 42d736ef59..0000000000 --- a/asdc-controller/src/test/resources/resource-examples/multipleModules/pxmc_base.env +++ /dev/null @@ -1,2 +0,0 @@ -parameters: - vnf_name: diff --git a/asdc-controller/src/test/resources/resource-examples/multipleModules/pxmc_base.yaml b/asdc-controller/src/test/resources/resource-examples/multipleModules/pxmc_base.yaml deleted file mode 100644 index 3e98047ffd..0000000000 --- a/asdc-controller/src/test/resources/resource-examples/multipleModules/pxmc_base.yaml +++ /dev/null @@ -1,45 +0,0 @@ -heat_template_version: 2015-04-30 - -parameters: - -## GLOBAL//Basic Parameters - vnf_name: - type: string - description: Unique name for this VF instance -# For manual spinups, value must be in the ENV file. Must be removed from ENV before uploading to ASDC - -resources: - -## MSP RSG//Resource:SecurityGroup - sec_grp_msp_0: - type: OS::Neutron::SecurityGroup - properties: - description: Security Group for PXMC - name: - str_replace: - template: VF_NAME_sec_grp_msp - params: - VF_NAME: { get_param: vnf_name } - rules: - - {"direction": "egress", "remote_ip_prefix": "0.0.0.0/0", "protocol": "tcp", "ethertype": "IPv4", "port_range_max": 65535, "port_range_min": 0} - - {"direction": "egress", "remote_ip_prefix": "0.0.0.0/0", "protocol": "udp", "ethertype": "IPv4", "port_range_max": 65535, "port_range_min": 0} - - {"direction": "egress", "remote_ip_prefix": "0.0.0.0/0", "protocol": "132", "ethertype": "IPv4", "port_range_max": 65535, "port_range_min": 0} - - {"direction": "egress", "remote_ip_prefix": "0.0.0.0/0", "protocol": "icmp", "ethertype": "IPv4"} - - {"direction": "egress", "remote_ip_prefix": "::/0", "protocol": "tcp", "ethertype": "IPv6", "port_range_max": 65535, "port_range_min": 0} - - {"direction": "egress", "remote_ip_prefix": "::/0", "protocol": "udp", "ethertype": "IPv6", "port_range_max": 65535, "port_range_min": 0} - - {"direction": "egress", "remote_ip_prefix": "::/0", "protocol": "132", "ethertype": "IPv6", "port_range_max": 65535, "port_range_min": 0} - - {"direction": "egress", "remote_ip_prefix": "::/0", "protocol": "58", "ethertype": "IPv6"} - - {"direction": "ingress", "remote_ip_prefix": "0.0.0.0/0", "protocol": "tcp", "ethertype": "IPv4", "port_range_max": 65535, "port_range_min": 0} - - {"direction": "ingress", "remote_ip_prefix": "0.0.0.0/0", "protocol": "udp", "ethertype": "IPv4", "port_range_max": 65535, "port_range_min": 0} - - {"direction": "ingress", "remote_ip_prefix": "0.0.0.0/0", "protocol": "132", "ethertype": "IPv4", "port_range_max": 65535, "port_range_min": 0} - - {"direction": "ingress", "remote_ip_prefix": "0.0.0.0/0", "protocol": "icmp", "ethertype": "IPv4"} - - {"direction": "ingress", "remote_ip_prefix": "::/0", "protocol": "tcp", "ethertype": "IPv6", "port_range_max": 65535, "port_range_min": 0} - - {"direction": "ingress", "remote_ip_prefix": "::/0", "protocol": "udp", "ethertype": "IPv6", "port_range_max": 65535, "port_range_min": 0} - - {"direction": "ingress", "remote_ip_prefix": "::/0", "protocol": "132", "ethertype": "IPv6", "port_range_max": 65535, "port_range_min": 0} - - {"direction": "ingress", "remote_ip_prefix": "::/0", "protocol": "58", "ethertype": "IPv6"} - -outputs: - - sec_grp_msp_id: - description: uuid of the security group - value: {get_resource: sec_grp_msp_0 } diff --git a/asdc-controller/src/test/resources/resource-examples/multipleModules/pxmc_mmn.env b/asdc-controller/src/test/resources/resource-examples/multipleModules/pxmc_mmn.env deleted file mode 100644 index 42599e6034..0000000000 --- a/asdc-controller/src/test/resources/resource-examples/multipleModules/pxmc_mmn.env +++ /dev/null @@ -1,18 +0,0 @@ -parameters: - cinder_delete_on_termination_false: - cinder_delete_on_termination_true: - mmn_arch_volume_id_2: - mmn_backup_volume_id_3: - mmn_block_device_names: - mmn_data_volume_id_1: - mmn_flavor_name: - mmn_misc_volume_id_4: - mmn_name_0: - mmn_oam_protected_ip_0: - mmn_volume_image_name_0: - mmn_volume_name_0: - mmn_volume_size_0: - oam_protected_net_name: - sec_grp_msp_id: - vf_module_id: - vnf_id: diff --git a/asdc-controller/src/test/resources/resource-examples/multipleModules/pxmc_mmn.yaml b/asdc-controller/src/test/resources/resource-examples/multipleModules/pxmc_mmn.yaml deleted file mode 100644 index d1b0ce883b..0000000000 --- a/asdc-controller/src/test/resources/resource-examples/multipleModules/pxmc_mmn.yaml +++ /dev/null @@ -1,152 +0,0 @@ -heat_template_version: 2015-04-30 - -description: HOT creates Nimbus vMSP MMN stack. - -parameters: - mmn_name_0: - type: string - label: MSP MMN server names - description: name of the MSP MMN instances - mmn_flavor_name: - type: string - label: MSP MMN flavor name - description: MSP MMN flavor name -# mmn_image_name: -# type: string -# label: MSP MMN image name -# description: MSP MMN image name -# availability_zone_0: -# type: string -# label: MSP MMN availability zones -# description: MSP MMN availability zones - sec_grp_msp_id: - type: string - label: security group id - description: the id of security group - mmn_oam_protected_ip_0: - type: string - label: MSP MMN OAM IP Addresses - description: MSP MMN OAM IP Addresses - oam_protected_net_name: - type: string - label: MSP MMN OAM net name - description: MSP MMN OAM net name - mmn_volume_name_0: - type: string - label: Mobisupport MSP MMN Cinder Volume names - description: Mobisupport MSP MMN Cinder Volume names - mmn_volume_size_0: - type: number - label: Mobisupport MSP MMN Cinder Volume sizes - description: Mobisupport MSP MMN Cinder Volume sizes - mmn_volume_image_name_0: - type: string - label: Mobisupport MSP MMN Cinder Volume image name - description: Mobisupport MSP MMN Cinder Volume image name - mmn_data_volume_id_1: - type: string - label: MSP MMN Volume id 1 - description: MSP MMN Volume id 1 - mmn_arch_volume_id_2: - type: string - label: MSP MMN Volume id 2 - description: MSP MMN Volume id 2 - mmn_backup_volume_id_3: - type: string - label: MSP MMN Volume id 3 - description: MSP MMN Volume id 3 - mmn_misc_volume_id_4: - type: string - label: MSP MMN Volume id 4 - description: MSP MMN Volume id 4 - mmn_block_device_names: - type: comma_delimited_list - label: MSP MMN Block Device Names - description: MSP MMN Block Device Names - cinder_delete_on_termination_true: - type: boolean - description: delete cinder volume upon instances termination - cinder_delete_on_termination_false: - type: boolean - description: keep cinder volume upon instances termination - vnf_id: - type: string - label: MSP MMN VNF ID - description: MSP MMN VNF ID - vf_module_id: - type: string - description: Unique ID for this VF module instance - -resources: -################ Cinder Volume ######################## - mmn_volume_0: - type: OS::Cinder::Volume - properties: - name: {get_param: mmn_volume_name_0} - size: {get_param: mmn_volume_size_0} - image: {get_param: mmn_volume_image_name_0} - -################ Server ############################## - mmn_zrdm5bpxmc02mmn_0: - type: OS::Nova::Server - properties: - name: {get_param: mmn_name_0} -# image: {get_param: mmn_image_name} - flavor: {get_param: mmn_flavor_name} -# availability_zone: {get_param: availability_zone_0} - block_device_mapping_v2: - - device_name: { get_param: [mmn_block_device_names, 0] } - volume_id: { get_resource: mmn_volume_0 } - delete_on_termination: {get_param: cinder_delete_on_termination_true} - networks: - - port: { get_resource: mmn_oam_protected_0_port } - config_drive: "True" - user_data_format: RAW - user_data: - get_file: user_data_zrdm5bpxmc02mmn001.txt - metadata: - vnf_id: {get_param: vnf_id} - vf_module_id {get_param: vf_module_id} - "evacuation_policy": "Evacuation" - -################ Ports ############################## - mmn_oam_protected_0_port: - type: OS::Neutron::Port - properties: - network: {get_param: oam_protected_net_name} - fixed_ips: [{"ip_address": {get_param: mmn_oam_protected_ip_0}}] - security_groups: [{ get_param: sec_grp_msp_id }] - replacement_policy: AUTO - -################ Volume Attachment ############################## - volume_attachment_vdb: - type: OS::Cinder::VolumeAttachment - depends_on: mmn_zrdm5bpxmc02mmn_0 - properties: - volume_id: { get_param: mmn_data_volume_id_1 } - instance_uuid: { get_resource: mmn_zrdm5bpxmc02mmn_0} - mountpoint: /dev/vdb - - volume_attachment_vdc: - type: OS::Cinder::VolumeAttachment - depends_on: volume_attachment_vdb - properties: - volume_id: { get_param: mmn_arch_volume_id_2 } - instance_uuid: { get_resource: mmn_zrdm5bpxmc02mmn_0} - mountpoint: /dev/vdc - - volume_attachment_vdd: - type: OS::Cinder::VolumeAttachment - depends_on: volume_attachment_vdc - properties: - volume_id: { get_param: mmn_backup_volume_id_3 } - instance_uuid: { get_resource: mmn_zrdm5bpxmc02mmn_0} - mountpoint: /dev/vdd - - volume_attachment_vde: - type: OS::Cinder::VolumeAttachment - depends_on: volume_attachment_vdd - properties: - volume_id: { get_param: mmn_misc_volume_id_4 } - instance_uuid: { get_resource: mmn_zrdm5bpxmc02mmn_0} - mountpoint: /dev/vde diff --git a/asdc-controller/src/test/resources/resource-examples/multipleModules/pxmc_mmn_volume.env b/asdc-controller/src/test/resources/resource-examples/multipleModules/pxmc_mmn_volume.env deleted file mode 100644 index d5f16289b1..0000000000 --- a/asdc-controller/src/test/resources/resource-examples/multipleModules/pxmc_mmn_volume.env +++ /dev/null @@ -1,9 +0,0 @@ -parameters: - mmn_volume_name_1: "data-mn-v-vdb" - mmn_volume_name_2: "arch-mn-v-vdc" - mmn_volume_name_3: "backup-mn-v-vdd" - mmn_volume_name_4: "misc-mn-v-vde" - mmn_volume_size_1: 20 - mmn_volume_size_2: 20 - mmn_volume_size_3: 50 - mmn_volume_size_4: 20 diff --git a/asdc-controller/src/test/resources/resource-examples/multipleModules/pxmc_mmn_volume.yaml b/asdc-controller/src/test/resources/resource-examples/multipleModules/pxmc_mmn_volume.yaml deleted file mode 100644 index debb8a96db..0000000000 --- a/asdc-controller/src/test/resources/resource-examples/multipleModules/pxmc_mmn_volume.yaml +++ /dev/null @@ -1,86 +0,0 @@ -heat_template_version: 2015-04-30 - -description: HOT creates MSP MMN Cinder Volumes under MobiSupport Tenant - -parameters: - mmn_volume_name_1: - type: string - label: Mobisupport MSP MMN Cinder Volume names - description: Mobisupport MSP MMN Cinder Volume names - - mmn_volume_name_2: - type: string - label: Mobisupport MSP MMN Cinder Volume names - description: Mobisupport MSP MMN Cinder Volume names - - mmn_volume_name_3: - type: string - label: Mobisupport MSP MMN Cinder Volume names - description: Mobisupport MSP MMN Cinder Volume names - - mmn_volume_name_4: - type: string - label: Mobisupport MSP MMN Cinder Volume names - description: Mobisupport MSP MMN Cinder Volume names - - mmn_volume_size_1: - type: number - label: Mobisupport MSP MMN Cinder Volume sizes - description: Mobisupport MSP MMN Cinder Volume sizes - - mmn_volume_size_2: - type: number - label: Mobisupport MSP MMN Cinder Volume sizes - description: Mobisupport MSP MMN Cinder Volume sizes - - mmn_volume_size_3: - type: number - label: Mobisupport MSP MMN Cinder Volume sizes - description: Mobisupport MSP MMN Cinder Volume sizes - - mmn_volume_size_4: - type: number - label: Mobisupport MSP MMN Cinder Volume sizes - description: Mobisupport MSP MMN Cinder Volume sizes - -resources: - mmn_data_volume_1: - type: OS::Cinder::Volume - properties: - name: {get_param: mmn_volume_name_1} - size: {get_param: mmn_volume_size_1} - - mmn_arch_volume_2: - type: OS::Cinder::Volume - properties: - name: {get_param: mmn_volume_name_2} - size: {get_param: mmn_volume_size_2} - - mmn_backup_volume_3: - type: OS::Cinder::Volume - properties: - name: {get_param: mmn_volume_name_3} - size: {get_param: mmn_volume_size_3} - - mmn_misc_volume_4: - type: OS::Cinder::Volume - properties: - name: {get_param: mmn_volume_name_4} - size: {get_param: mmn_volume_size_4} - -outputs: - mmn_data_volume_id_1: - description: msp mmn data volume 1 - value: {get_resource: mmn_data_volume_1} - - mmn_arch_volume_id_2: - description: msp mn arch volume 2 - value: {get_resource: mmn_arch_volume_2} - - mmn_backup_volume_id_3: - description: msp mn backup volume 3 - value: {get_resource: mmn_backup_volume_3} - - mmn_misc_volume_id_4: - description: msp mn volume 4 - value: {get_resource: mmn_misc_volume_4} diff --git a/asdc-controller/src/test/resources/resource-examples/multipleModules/pxmc_vmt.env b/asdc-controller/src/test/resources/resource-examples/multipleModules/pxmc_vmt.env deleted file mode 100644 index 0f0e6daac0..0000000000 --- a/asdc-controller/src/test/resources/resource-examples/multipleModules/pxmc_vmt.env +++ /dev/null @@ -1,17 +0,0 @@ -parameters: - cinder_delete_on_termination_false: - cinder_delete_on_termination_true: - oam_protected_net_name: - sec_grp_msp_id: - vf_module_id: - vmt_block_device_names: - vmt_flavor_name: - vmt_name_0: - vmt_oam_protected_ip_0: - vmt_volume_image_name_0: - vmt_volume_image_name_1: - vmt_volume_name_0: - vmt_volume_name_1: - vmt_volume_size_0: - vmt_volume_size_1: - vnf_id: diff --git a/asdc-controller/src/test/resources/resource-examples/multipleModules/pxmc_vmt.yaml b/asdc-controller/src/test/resources/resource-examples/multipleModules/pxmc_vmt.yaml deleted file mode 100644 index 2e04c6130e..0000000000 --- a/asdc-controller/src/test/resources/resource-examples/multipleModules/pxmc_vmt.yaml +++ /dev/null @@ -1,128 +0,0 @@ -heat_template_version: 2015-04-30 - -description: HOT creates Nimbus MSP VMT stack under MobiSupport Tenant - -parameters: - vmt_name_0: - type: string - label: MSP VMT server names - description: name of the MSP VMT instances -# vmt_image_name: -# type: string -# label: MSP VMT image name -# description: MSP VMT image name - vmt_flavor_name: - type: string - label: MSP VMT flavor name - description: MSP VMT flavor name -# availability_zone_0: -# type: string -# label: MSP VMT availability zones -# description: MSP VMT availability zones - sec_grp_msp_id: - type: string - label: security group id - description: the id of security group - vmt_oam_protected_ip_0: - type: string - label: MSP VMT OAM IP Addresses - description: MSP VMT OAM IP Addresses - oam_protected_net_name: - type: string - label: MSP VMT OAM net name - description: MSP VMT OAM net name - vmt_block_device_names: - type: comma_delimited_list - label: MSP VMT Block Device Names - description: MSP VMT Block Device Names - vmt_volume_name_0: - type: string - label: Mobisupport MSP VMT Cinder Volume names - description: Mobisupport MSP VMT Cinder Volume names - vmt_volume_name_1: - type: string - label: Mobisupport MSP VMT Cinder Volume names - description: Mobisupport MSP VMT Cinder Volume names - vmt_volume_size_0: - type: number - label: Mobisupport MSP VMT Cinder Volume sizes - description: Mobisupport MSP VMT Cinder Volume sizes - vmt_volume_size_1: - type: number - label: Mobisupport MSP VMT Cinder Volume sizes - description: Mobisupport MSP VMT Cinder Volume sizes - vmt_volume_image_name_0: - type: string - label: Mobisupport MSP VMT VDA Cinder Volume image name - description: Mobisupport MSP VMT VDA Cinder Volume image name - vmt_volume_image_name_1: - type: string - label: Mobisupport MSP VMT VDB Cinder Volume image name - description: Mobisupport MSP VMT VDB Cinder Volume image name - cinder_delete_on_termination_true: - type: boolean - description: delete cinder volume upon instances termination - cinder_delete_on_termination_false: - type: boolean - description: keep cinder volume upon instances termination - vnf_id: - type: string - label: MSP VMT VNF ID - description: MSP VMT VNF ID - vf_module_id: - type: string - description: Unique ID for this VF Module instance - -resources: -################ Cinder Volumes ############################## - vmt_volume_0: - type: OS::Cinder::Volume - properties: - name: {get_param: vmt_volume_name_0} - size: {get_param: vmt_volume_size_0} - image: {get_param: vmt_volume_image_name_0} - - vmt_volume_1: - type: OS::Cinder::Volume - properties: - name: {get_param: vmt_volume_name_1} - size: {get_param: vmt_volume_size_1} - image: {get_param: vmt_volume_image_name_1} - -################ Ports ############################## - vmt_oam_protected_0_port: - type: OS::Neutron::Port - properties: - network: {get_param: oam_protected_net_name} - fixed_ips: [{"ip_address": {get_param: vmt_oam_protected_ip_0}}] - security_groups: [{get_param: sec_grp_msp_id}] - replacement_policy: AUTO - -################### Servers ######################### - vmt_zrdm5bpxmc02vmt_0: - type: OS::Nova::Server - properties: - name: {get_param: vmt_name_0} -# image: {get_param: vmt_image_name} - flavor: {get_param: vmt_flavor_name} -# availability_zone: {get_param: availability_zone_0} - block_device_mapping_v2: - - device_name: {get_param: [vmt_block_device_names, 0]} - volume_id: {get_resource: vmt_volume_0} - delete_on_termination: {get_param: cinder_delete_on_termination_true} - boot_index: 0 - - device_name: {get_param: [vmt_block_device_names, 1]} - volume_id: {get_resource: vmt_volume_1} - delete_on_termination: {get_param: cinder_delete_on_termination_true} - boot_index: -1 - networks: - - port: {get_resource: vmt_oam_protected_0_port} - config_drive: "True" - user_data_format: RAW - user_data: - get_file: user_data_zrdm5bpxmc02vmt001.txt - - metadata: - vnf_id: {get_param: vnf_id} - vf_module_id {get_param: vf_module_id} - "evacuation_policy": "Evacuation" diff --git a/asdc-controller/src/test/resources/resource-examples/multipleModules/service-VfZrdm5bpxmc02092017Service-csar.csar b/asdc-controller/src/test/resources/resource-examples/multipleModules/service-VfZrdm5bpxmc02092017Service-csar.csar deleted file mode 100644 index 69b1c2340457f3701aaebaca5974a280a52003fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 97867 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 z z`@$yx+jlp3m?y6v7P-1l3utuDj`71oaHFsyrQ}bOf~6?Q;SKF|QNrT~rb0MA!_(_M z>_>li60Y=CZH-?-IEl)v1aq71*Fh46M zq*Ifscj_Db4YLAifb+vc&}s;2cTXRKV`b?fC5=>h;C=;&16r7TWtyb)7%&1X6Miv9 zM+<=S+Mx1FBo;!z@umHcVXW$9!T>kO3Fq=cQP&Zg{C2@c>#9-I`?h!5ZdqbEBz%Ly zCN;v>s*wHFK6H#+;aE^0IRVvQidHf2RrjJlh!>oE(n5b`sNaJ7-;9uen8?|?+V1D0Ail>E z@#TIKMB6u?qd-a+$TL>3ECL>a8C|rMb{qzn$#EWLXrzy^AC4U3ECh&_C5Y?g@Io== zGuC7>P7u*;+?gzaFfsy&z(vGkBgij6Pe3Vx@Ej%-Nb9TgRtGlVDUsB%!+*<@g0q$q zt|bg=ZKSWMgY2?2oCPfBf?|G%_wex%Iti*9f^nU?D1r2ftP6@-Vwr1zxT8mu!wb=q zL7xgXgTt21M|IC`Mg={EgVopXWWE*J#agwKfCrgfM?r^b0&M|_18`+Hq8JoNhQ@=Agp{?%r87TC66kBstH?N1*ZsfzuS%`^WedBg)L^2&kYza5-Mg@og~V; z!l5sCe=eb=d%+2e#0;u<)Lj$q{6;;i*w(h<{JaMz!#8TAou z7o9->1Wn-SPAl&2g#XajV%O$_Qre9aiPbkDPo!pysExqc>ylX|=g7S{MrLhFE6N1h zplU0dptkFHIBw-fM}2T^XwdazYg;)Vf|^28-rMC$q71cGTNs)b#`fB^GktOlS!UCE zrS=lusNp8Ha^uTc8Iw^?4lP8i3n!WSC?e7P>7tjlKMgc+Fr~mbf9iBmp z17Jd4JtM%F!;bs(2c3j53Bt-BUv{{<>}=*EGTD%ko!^8l+7O_yoZm z4N42{<%aXd$5BN`=IM~~HB&gBzr+_(0FlWekwJ}a=knGnxrx8%*FL+N2@V}UI}%C` zjK~p2aj9V>`#pfj%HQmk+yE+voE_Ya<_>L*B*oq6L*;IQo=}w|Kc{ORt zUml`5URG7Gx2#+lHtE@!{n1}^v0^ml*0)=pxLnqI!w9uT|09OydU`YRH*&Jsz||a@h;J>1k_NQhexWD$Z+|Ps)@`%`*fK`RVJK;6U)i1FxZU?_d)g2ZrAV+Tz6(dLbOr zb|mOk%ZnV?haCPmPH4PD(LDpF6kC9QuoDs1#1-Mlq!Kih>zje*z!c2l=5ZvH zUC_i=Ji&I)z#WQ=!{V!*>yw9y%y4DODSmo2;gQ8M;0Tm&<6}79PN-!*=UZ79xLYRP zq{=Me_N45BM`Uvd)$HKMhEKGoyArs;hMLePik!jY=_0y6j^y7-rh|nJmxy%M|xl$MUhb)iTZMzZ-UVj$OY_l)zChG<5PtAfp2;-QV%6 z`tEa+q8)LiYWK9L(BO|_k#N6eEl|z?glgzA<9_3?-NcphhyPkiQ{*I!G{U+pK8SSd z>AohUxD^|F6D&WIO+g36zBGgE%p<8!DMPyi%jSAH(X|66+E0hJaoPT~ulKp>;Xs`Q zWI`(SS<=droZB9Hq>Q`iNi+GJ>)KBf?NTocRZnoyk7M~YAJFA~#v{!2JBv*&5c3-K z)SU_;C6BmF6HE?<80-9N>$pu`#}hc?X>xKMB4>fA=&ZeRu15w)$+f#a*$p142TUqd zs3$8OB-N)zSl{Q@md~O|PJY7X+3dMMU0J0x!~$h%Y(a25?6rGrZyDNIx)rrGZc}qK zL)h$xr5EtPfi5(~>L{Ec$6&#NrN^lihtv#^SLa(x=`~f zwiLlzFv2lJU$D|=SfQd(itOE^p78waHpcROrg+|ljte5xwkgV{PIfw}YcvzVRgEvL zJ8&Z(oCxUU^o_jK75vfTvHaV%;I0ESHeTm4$@|A(Oc|5eAH$HvzJ0U63k(YS9Q?TB2`-`?db*5!43lv12Ump+JR zzMl#bc2wWum^O#XnEef1gqsuK@?s$3y?PitPCCn}oT#^OuKu#5aV=K2gaj%%5#z#d#)%CbA=5>2`INaBXk22goZx28jmvubC$msmwPkU$ zBO$P^-g-?cF&|hL!uEoMk<)xf>@Wh<3~GWf!-U6U{Hwm=%_O^z!uRp%tgTIbrH{{q z=O-4pPj$#s@t;ht`&;sB2u3MWvq)_HNDuSl;kFegOS`y5x)}m;5DFfptSpn#d<_zE zFD@Kqnm$v&i@PjVUa*1GKsXX7BzJLYp!cvilrqwq*FH{2f39&5kiPoHX$|a+pwy4E z=v*x4HXmrbo=YFSI7FEgp7b#g12-LYzAYn}_yiwdip;#T0^j84nokWVWfG~YeEsmn0ZX@?L&1NOi5B>dgI;0r->N|XlJj2zaURu zpOJ;nlLfZMoavL%G&gw??}w>|(Ob#b4_nUU`pFE+xaFE~QF&!u%jUY;qAM}qij%KG+K82mh_X&*E z%=PXzMgPVYqH-1R%An!(J`AYUyEJz}DIw3p@svvupJDpR-!VVkdotcTMeFV+jDLYWJ}GBPI=&_EzC zebnhuVQ15oZ_us1Jd_SF6Kq?cx$F|nk}P#NeCtAJ)#;cv$XR<&B0qR+8L|vI+c=St zF~=HjCMLl&0s~$q@HgQ4^U_sxh}+O}WXJ`W$Vy z)8ViQTRo0cWRTwK#aPs70zQ`Rtg5BGO%}3b*ChpcpL=Ve33^qiz0|yML7FqQGG$l_ zTC=P1p?$)2hwZre_Hntpd29!N&EKuxY+#8_S>ww7I34-1I{*2uR6~M##VJX6;I)C+ zz=Ao$8;K-^+WA+^rb%AhbJ9@l<^V02<;6qWw}+CwMpbjCY|==;QIi1D7uZo>u94+8 z4~=(V5le09)8C3QjBuv*05)@8rFI478_@j&!yB9D$YBFTZshS$R2{D_Nf7U#KA~7h z=n0Dqj$8SMg#d%E9}`L87dv?p2IrcJDR1H!&RXG~m$zFUIc;hA;e93Ph?++bIXCCjL+@21={s8oH|jIs1eUian)4k;!>r%iAS?&UF1!c)&zYkGJ8SJV z>2S?lF63t8T}83goVs^am@U5Skskwe+ljjvy{XMGzf5kqj?7oRPQp z!DYMn)?T6)fbZ?iS%>c{9l_cT_3>hu!N!X>WWkC_}LI=9hVwH=%` zAcsCT+tDiY&ES?{INe*fUmu`j*IAPE=&?1OhcJg@@;o=;y?&iWlj#LvHf4KBy1))m z@|JJ`lh!b!u%~ZMc)m#>hu+!T@MlO!wS6C-rA*BEfD4bp3qemU($bgo=0UsSIbA1p z!!-K+w%>cI!poni)z2jdS511BO+Kt=m8(XduX(5RA-;Ta_vbNr&*mE_fO+vgWpt}` zdS2!4o6S0G#Uzrrq3>(0_c&_nH|GH7tzKb5y!>iJunLWt*nz&^K>uW_nysJKJ-`3} z@_+o=e?AvQ_n(}esJpYRiHozNovo4m|H?_#s7c4Ivmx}ptKTd(gH!rmb}mh6+Cc$F z?Ef^wpo9n{5NAP%Qjr|$7M=KA$0u5kZT;FOx*7OAX^*!($zHsWI+rX=muxRYopm*! z@gWfoO+_84B;=VNA|rlkuHavk&6NoQfoLfolRwVOLxT>9Dd)GpV8IuA=fD?LIygo% zemBR_*^{#|J7)}$4STC%!_$Q+SDHOtD9MK{x`6G8J(u-CmMQpT#TLA7&4W|aPzXu_ zlDi2-W!BuOT@)W=B9=^7+_4InVduLR&s~GUKu=;tn@o(^BCt^aB2+@McG(}_#hS}z z2v5S^DWI>H7r&FL2(E1d2l|)i5Y5VZl($SrCbI zp>7$VD%LIx6={m(US)kuyMSdTh+EQAyd~W!`jqf?p-or)4Ie9cp8l&a9a-^F0#1wF zYk&Y1{kED}$VMNo4I*sRQP4S-F9bFLYrSr*w7?+DO2<=!*QtR#W}E-vxbqfVAJZka zG3OiV_Dz&v>kYC?igSd_(48upH;yjEg?=R036Bjke5jbOPqwma`SzMRJ3A! zx8K$ca7u0$WY_H|UaK`IF!y&GYY=wpiX2)Z$hU*8l^-3AyZSwRzHmJh_tZ-t6JeCT5fY=D!AE zZ6Pxv6lBzJFZf7|H!VQ#JsMAzwx$~VyHLGg*{bPn-4jrOaQ zZ(KG5Lg@P^>Q(FSJ*$9{C?wLzJuU{wVr}(s7M2#YWOmM-@ud&yaX*?oiQ=6V+8xT!Rj%h9XMLiFzcadL*Eqo@OKR z_zz^Ve!7uQRbcyJAeP;7#w0bKcGR0@1KkZsJ$zsi-mHS$70T}}Vl4CF+5CbdhtCnC z@(>uwjJuA2T5*Wz=>-Mp)^Mv?B_|PrY<#VFH}YM1-4URf!}a9m41k53?=0bZy07gn zf4#FG@fD5Pp*&^Wy}gz5&F6dAH|8oXAK4EOv(vqKBs8>&nwZ2qPbr0H%dHbjYQHeD zFa@U>mPKa}Dr2E_kLzx=D;I`6$K|PV7`Y0D?d9OUtjID+60b^mp+1bV5lzKg+YZro z+jT8IrMEhyPug{&f5Cnavmv*``Au6_Y%@)t3gJIOBV8O?h{CP>zKykKgGjK+&)4Q znZyydaM0bCcp>wBn}0Y|pPf(eaxmRPyWny3WsI zR%U`h79|+Kh#sibPLv?p86x}&EY)^*HkwCDm2EinRIJqkSPaxUS{K0+5ir$C93kv4 zL4q(g`Hci#^N7Sd^Po66j}ITw<|42%JI~FF+ZsR;^Z1^!9?UDcqs*z@YZ@}KVI1P* zm~y6%$LyCNQsPkfmuqkE<&2%=mw2Ynyf1G&vE&`IPi}&f=NN(q38Wme#r5~2>Fg6P zCxUyaPalKpThzclJ0)3ITbhvs#R@vTZ~knlrmyb{pgE+EvuV1e779K^*k0IX+I|3^ zv3nDz3syaT)iFfwFAV$>AlIy$K6P1UNBUb+w3@bI00Z&+e0m zq*ibG%jboh(C=w8->TWa5_wC*CKNZMS9i2nG`RBi88rj1_sYDE^!#tIF~Q;3Rmol~A5q zso?BNBk0dwoEW^mC~VKOANewv;XofMYplwx}ZmIc3`^k z9uRvIfnt2-iiK{SN6Hqhs}8gbMbxx(9oo8oH~Wptz3;!W z7y)7)spL|=9gm-+UP;sxI-evrPS8%}x}HXO`cm-by2jwQcxgA=ct-3T#;+u2sx@!% zGln5HMyO}AnzBk;o8P<3r{zF#;u?J6H z#wxJ6kRSV!QgB3zSnsxLl#c8B;OPx;a-#Lbe*UT)V~Rt>LAD1~mr0%Kv?3Z5j^tBh z_Ki{GjLnV2-)s6Sqt@+b`mjb1+Vj+EAlsHeGSmBWY>}Arx2qFoQw&tPIz@d=wHToe zaER(hgk(A4n=_|_Z%xZaUCY@gd68Gm_^`5!P4^(whGRNw_seodl=qjOXJP{erbl-d#6qnUI==o_=mQM1tI8C-K9 zCk>74JPGcZjxco)@4$KIsEeVITg+_jWSch$!*xwjlk?;sa7+yWm z2uN#*Ho#dfJPfdxtpL$PQF>EDy4k?;*;iRug?p$CGBWnc}z) z`rYK@k?0dxR`Fn@n1|ryEd4=h5U9HCEJj+IQ0OibziJiJcCq%wB>rwk!0u-&^TCSd zTFRq4PPbTPAEJ-nK+KJB6jT-ToJ7p;Z|k@CLo{w4>XRRTaz!vnl$-_LNiWOQ<~{qq z?gl;WgS$fABo)ghU9-6^g06lBxJb`8=DpRL<|>X&tTnq33QxxK{xrBN(zi%t@s841 za7&*}D?IVDk*p0e+}|cWu}{s)cD3y!@jCiEGOIu7YnJfDfh6G1ZCQ_ix0?Vbl*gVcgX6WsV;p0h!C2L^z>~UKC`H&sPSSl4!{s2$U2mM@=eN4zC$hx)LE>62l1>m1U{JdR{%mt zjqUGImswO$9;*~Zg(#1#N&KmmGEl!I>#vl>z>`p5f<=fKQe~RDYyVj>1bdrhLBN0n zi(VO;ZntK7JH@EG4iIPxAoxSCH+2o7LABTwl|r2o6rJvG?W3lsD`}L7dCe0U`Y^dHl(!t8 zYPZy~fKHAx%4j}wd^PcLs z4G&cGe}fF%Poi>lAg5&`e=6QI{!NJddja9pUHVM-orPp1&3j#YW1sJY)`&UId$M_o z0o~+1$wQ(RPJ37`>hPFMyIVUYr_J?Mlk;RZd<(+l?tQ}j!Y7iRbT@79aMv`mJ1_LC zt&`}m~!ecS3EP?L+hZb8-5j`Sa{94O!e8- zrlf%Mgi6ob3fDn2Hx6v$>Sqia_e3b8S0bM&d^?Y8cAIiTbp7DT6M1FvAYAR1Wt3}v zqvOOqv`iO_bQ%l&Ahr}&Q0CV+U3;d4XZZ`3gN1Zsp)7;z*kStRS*ua&W-_@U){iRB z$K1A|e?LIaqF%GHzLAS%VZ3YSz32*7ODnPW24DSyNV*J=9Qqm>a0&tkld`B$)f2WX zt;g@Bl#u9*O+q*a28Jd@j8fMcn36`Qb5SlP)Z6#bwp`S0hO0fqqFUHPAPOta{D_}Q zd%@?>^6pBme)JIv)VWVTSE)5g!3ieuXGr6A^lXDG;p1%MylVX{nk!-HY@@T4%F@j1 z#S!9t;P!RC2AZb~3F?;iBQeRT$0-54|BF^4n-3XCc-rImSJD}BF*s%3$$|>{Qy_wp zYeykUjoh(CS8=NEe&=&7o}TYZ^Ll~%&o&uchfRY4+GZYCH7Bj{sX{%L184|oQJMG9 z#BIN>f4gg#%Eeq!?G8y*^Mty_C2bREiHjdr6;-dMj0qaq!>?wu;=!wQ1?nz|2%Sy; z9t8J3c(#D$ zIqpQFPoE%18m|dL_(4P+tb$5UqxGd`)G}(hAx7m2{inY)qR$4$HVjw0y}OmHqc(O2 zUsq>$_0gt*tU^t!H96K|``0$`+Yt4W`qsFQY!Jw7x7~6D%rf^n4t7RC53b_1%!nJ> z{hh{4Ezb99O^`ReutSknI9c@DPHgKtI?Jlre`)I8GX=XuoUM*|R&$on8#`IBO00Cj zPTt_K>Z|~?Y%H=`?d38y>2;u#9N)xaiG#vucDnWtlc$Ea&Z{hhTxpCavU(j-i>sPu zrW}AIlY)Pr(S);)b;@ZSyeMj1;<+_ze|ClW!XZ#v9k|kRFOTSFO;%mp4xU=9r!9lI zbe7g#r4+%8bROonPX6U#KKl-{gc@W*r9CLdUFW-)-!feQD$pj14yR#N3bi>;Fg7^yI&axl;j}M z%%b7kJH2v`Q^x^PE5FtVDV@O8-^L4sfBhc7(HcBN);PVcT3$JUedU3h4g!%7rbBeB zl^``3#n5mEDSs|}Ml{=)XS&QQon=f>Y*HLE6uc6}WST9n+>cw8!?nu=$#K>j%iza@DmCw$ zX~tKt6p4zNQU)aqi%B87VjI7%Aa7tJqwii~XC7%u)Q5bvTPI16zmV^WR85n<`xm>= zml4?&+Zuf=I+oX8UWH#ZHIMtc;>e6ipgCno%#c}PNDJCulM664tQ2I^V5Sylu|4*k zfjwyAN2so1K#SIasyYA)GMlhI+`@V&7g{lrJIC%#<-0?KTWj_03VigGy2c*V96=}6 zm9yBl*A?x6K3$Bku2^1W+SEYXo*OZjN3(&n71w)F!eP2eFQ|JCV95&30~_ugLaY<9BJ%`?5vV4IMo5p>9ZD;_PfT zz&|rXt+Tq)Mb&|h>g^xc2|Z7T`L26xt0kV77=Mz^J#&g}{?>t6J95IuDtfk`U^S|v z{8Ke7E6&xPea6;Ea~Q~>eX2MJNod?T5-1|Vr&F;o%g~<>UNy=PU~`J<-*F5)(3^`D zKiW|6^!S}P_*8H8?g~<8g|8nL3My#s)f)|cumbO;FpJs_zcBoZdXLlgBydz8#X)=C z?9d%(hkz#<`(!u872$eFSuTen=~MP;yN^cAG^ z{J2M?#`~hu>58?o&W?S3b0Fk8%I;hlescqy-uRbv{dwWhQ;WhdA~b_dzyLf&!~vJn z9>R*=cwu5^?6|WE{;cS3+FuB?YvERom#&~9;wDzDR8|N6a~%_lk=&wok;4tmCkqa# zd#=@O$&6YkVzqBE(jfDVUEGw<&@w-p?mm!FwB|RZ|No|n> z{eMHObm02a)62jM81?}m!mZb&e>t>C64Dr}nYXv>|c(&QPFJ9T?-azgPscad4n`OpF{$YW&R;0=T zWl^{&r-u|0Y-L7@?=76L)k4sD!UqYxG?*AtcJ2RN+K>JkY9N2vOb8tSg9D9^LZ`2u zV9ODUfRRvB)lUOU!%EGsi-swHf`MP7K}62a9zoy$9ktdB(Y8{EE68u7i7qb=vrIJV z59@$%VQ>P%+CZ+nKp}v7ZzK(Wf(kSnD~L=e#rDCEF#uL;@h+Cd>N=#}_fZXfq0P0L z5u2F79F9B7htx*OV%q`;41hrD&*?}Hy~+Q~EjC$pM_O-_g_<9Aj$o;c1OB%;6vTZn zG~X;3uwPu-uQKDHx^-0A)zVF(>Hr$+_52t~dfI!l-6J#+>q;gx@$&Y(Qw}%-X8~Ac z)=Qiytar|WJ}`U$(nXO378q!w*Z7b^F{dZ^bAT$3?FjyUT9{Ym2 zyrejUcA^8!cC*M^d?5xgS8l*ZCUPMfkg}KD%j(q7B)??0P_^f-XXy^8D`VC&C&+u@O zQ?cz}Dl-c9YQ!f(uI$gwi;TYs@e`5Gx)+iv3jFpg{QI2?#K?H~?kn;P-O}pt zj6ENvU+=#xDa3>9L}CEvnNef-qLH+9cC*o`mK_7<6g3nL2m*^JCs<&_*5x~r|0>HBGX*cg)JTAT9z z+KAig6vQcWs3|zK@5e9#kU=5zY?k zm1+epHbQgkN+{?`<)0NmcUsZSkWdQC1!ycJIyW+8run=p2m+SlQJ^%*I27xUsgn;Z;2bm`ahN*`sr!ff}vG3?nfJ18~vzZ|B*enA>h3K&3y z()^NJ07A;RHHW;DcG}I7RiFB)@b(LK@I%d?JKdcPRBZ*C3!X`~+MeFTv?v@m+3?!= zsdtCLvO}9_*C{|S*(;G+Dm<`av@ldDp`0hjl3myVIAf0)ef#U4-AlyYmLg?U2rk)h zx0prBzAjBNOim=h5FlS=8-9pxq|K?xp*XTBl9Nyzo2;6e2)RbFz%!)-*&L~I7Af8~ zqqVIzE~nbcI6>)-_=q2QZTYV;c2lCfk z+jMpa@U=~g^{&187Qnw0o$08GFcg&3w!ej?>iD{MUW?9c zC*PO3fbkVn&HU)l>?pSdV$}Fbt!HCD98Q%jr_^bJ4!CT4C~1RSCvyTb=6yJ>Zuwyk z4eJFgEdzXth-?yOf&;A^l&$N1u8@8!DJ1p}528ws(gKQ)Us`udoNH$3zyq zCOk~5oblrb;`HiC;iGyR_0I*KW5inoJQo;r7qYSVc7a*4Q;`V3xt);qfWDQuATJI^ z-90Z3M|wzx^QxUDL+CZAYK!^e$lVL(T+>$PRpj<)@=j>CjBcp32CS-4^~j)<+u{RK z_n=Mr1Hy$_TCaLr$3dJl+kQ!EV1p&?c9ApFa+4@xS!JjF_kZU`EEVo8V$cBqc%T6P zhgz86|7OYKzqOs^XxXicH~4QqtKB%j#lyRjMg>h}8O>mWq_g+2-wx2iLPQoA6B1`l zM3Lp{^=!&0?x_%(j3FMz@xyBnc2;&|>gcI$D<-hFu(+Y=o)qUoAf3;}ApPvDC7k6U z(uI33do}=XcQny{lYS#RWO~1>YY`zksrk|$G~akX3w?#WBEQ^?wCAjyDk=8}_-K4w ztt9Z=duLdDrk*_yRo9=dYqo&XRcva#=eK!aL{<5!eaYN95qr;A7;E^J+9`0VQ}v1b zVHP_J`}THocSRu znN17jk@~yhs>npw{J#BAs6cHOvm9cG9tTAQe=oh(o0YbW5t?`tM4)uje|RR95sT!d zP%-t)^YE3_K3s}rL|{ndbA!15#YQAIe$!9fEHpxc>+(l_oVqgLx}=6gkjiDh7s_Q< z(;~ZlD%wo&r3T0KIGap~*peHP4@#RTO1N#Dm4OliIU*R!Dj_6R)-Wkk0A4d7ja@aj zjvD3sGu`pk`+4!@<8`TR=J4)l_`RX17$P61DH%t8{H$J+gAG!>q-uUG`OYX_6KdNR z`PQ5wS@t=v2jg{LGgH!HwfMBw87%YutLq&Ld^jQ*)~%kj9eB9#Czq4N{c5v$(V8wGD=ZGV`3f z_1-eSV{fBX;N|J|a(`p989FoOdJ=6K?vxsrhb*mhQT#>s?=k=yhqtl?IvXdNdB>4+7R!yn1*vt;>_^Gdsd}Q?ZGf^Eoq^G&K6z`R?OuMD@=Wto+`TF z+ zq$c*cs&b~??&y}##nQyvCFJ(P@pbDD>Zhmc_0jZkv+z>t@NQNCA(!z>ha&r%PM{&2 zQsb|D$=fqN;^zneMXgBsny$LRginNKJKqdjoX2K_$Xh8+=W;_9Q3jj#a)v9qw2lF) zx@_`d_xXUK%g~h{Bc1Eolh2&UO$eTv$@_dW4 z8XK%Mw|$V$_<99t1;4c36JxQs&SLRaM72s*Z;D;Ik#1)$-NCWua?xFl&go5^tgK*n zj${;vFRPkNp`dTh=-ZH2BHs*;7-TZCTj|}%Y)1 zfM#GCxI4cWf0dj$$!M#@F+Rt@f=~SPh&L@ljAuz&+7;FKTJ|t}%}f)guIz5uD~(*t zH6mWF)|fJ|&o43674{vj90x3y`=qRHh}bSNbCNG<49YlGq&RRr`;H|$8lCz0Nmf*2 zYhm3%Zs;L(PcU~{_Ulekavk;~e5q$BnUyW7thyH0Q2XrDhO)|XF-wXBnWoZ&v^N*4 zcV;&HZdRKkC{j*_?Pvb_y3BuZy(EIB8~Ysoz8Ih#7oZW@xV&mT|06I&xa%2W$woPj zV^;q08~Y`Tag&YF31NMGJ=MX+9Q9q*xD;;2^HcMLU`~|M(lp`>AQ1O=7@(&=?r-pu zf83A@`opXO99v>c4Ay!#Y%V`Oy!gB~ym;IKyf_642v7h&exbAPA_yW#e)*RRLih*n z&reT+_XJ^tI2k{>ctigan(2^Etq2!jk`S^R;3<90MK54Vow-3{ZgLN=|+i#MM z0DwQ-)x%T3;)3gWK!e8xjr8sBINTt)+%yM(tUre&&ET8C1H#!|j14e__u}_^+yDka ztScG78zfJYji8BP36CDjA!-6}LkmI$qfSHPK+v2-&Gw%|(;P%q7k^&7j)#L_+&s$M zUtXO5VuUwlhf~BKt>Zxngf4XE<@n1k8lSITg3%elmPP}Y0CrMn(VcS|Bo3Sq+TkdS ziD@VUh!D;!&G)yL6`K8d+$b1TcIFjH6TgXG{fNRII6s6IMNiIL;4(X-I9E;@@WMRP z&g=regkL(p2Ad%yR9#6Q*bq`FmO}kfNraYKC1W!2RXCMaB;-}vWg(&YQ~?4|5TD*5 z5=1~huy;^DqZ9xSgtSAM`@45g)w6zn!4(&X1qtL zvZW@16H3cWS#94lWmYXk7F67oK74gfzorbU4Xh@>Y6tTlcRtqt__CvA^Mty~_H!xx z;m4tV41TZ^F-VtllrNv|W^d*G;_aEc%bzz4_eaB8wwC0PE;ZbNuKg{C>o&KIci~Mh z4l`1>YwNpEBfFoAKQgUpxulo}j#`)M=|x#pj9Yv^W-ugC{j-{+Jf{WE>d#YXhXn-> zzc@*UY<=@ig-ZhS2EFYsAF+Rljk+#9eZ0FJeO{}zx~*O)kz1YgyK0)KWEpDkU4)TC z*O|hH5I{PawuvB%>IoZ6^FS8fioR&n3 zVnB(KFyj4XuW;&^iq6M|1z`4-bR>HKYyj|HKzn)@_Oh#Y`E5%WzPP-Rnf>G2`xlRo z5095u!nNy&@N)3Bm(*AL+ctM?Zy{1`Z#Ra$J-OAPbBj>tliMfv_f&0nuRlCnxORLp zc6zkW&I9dRe4aa~r#+~xS!(yaT0Ku{|9k}=DwvQ<^K-$m zBm7pBJJ7>7svGg`Y*=lTsY`0;OvKLRL4N}e`31y&&+3YQPnXM5P-aW=DlA$ zy?MI336Q$GJJD|+OOMW@nDFf{*j<4~VvR=X_g5S)kX$bgt-r;{#u2Ao`)k>zS{wC_ zt;wccIpHXGtV=J;?OW!_bL3(vb?>Z8pFBjYi2(xPHO4qNP~bi;Z(y^@?YUI|SOcU$%@pq(3$=>&KP1!7|mi5;Z~oh^EZF06veR z5Pq>TJj9QRM*n?PK@#WSWLL`N)rQ5!rnZ_8dtI1-LA2#;$-b2CB_*ZB!HNRN6QE#l zC{N@>N=t83mJ#nBTVjl@!jGtea@v(dtmt0pl6Iuxd4O^fU)EQ&abg)xY==mraW_!x~d?vOjXQOha;@B@2)~`&KAjvGxRO1FG?-+JXF!lhgyx zC~L&g!X&%!r_qO60c!E5$wCCw>P4*+(Hj{~EieS2^`98d20-ftwFlJxaUyzQ8t5ul zDFfJ;b%hqZb%kPkLn)5aV`1Uvg|6F^Lepr!S(Pq&+Y?_;##2MH~ zHT@k)TJ0(|R)Db=hS-_h!CXudu0doT7^(5dbWmx90-W%L$-NC>)q}&y{zB95I3c_+ zURWROH}==&YlYJYYX^+BfTrMoqKuk19BzOZm^;Xi-9h+qD9Z*%`{(d6m+yk8C6S?w zGpXi-=6vXdY6v{7Ij{ncIiBZf1@)rZrKmv{&C~~0*K!hJb z9t0UsE)?k0C?4P zMvj6Ev(bLyPRlU}0Y3yhP%r?2bSiwu5}OyHVGx_P_k=fBr~45W)AkEDK)~zp&#Ldf z{ShHp`q-8($PGX@=M1>3lLX8w^5Q_Q9oROb;urxWd;5>vg3pNxX5#V_=dGspeKJG z=oR1}s}J|%$ZLQb!1w8Pz+V)Wfj$8Edf{$>KSpbVcEaBL&IKwI9`RMI=9T=Rc7WP` zWamHbjdRk~C{8xHUIct{j&XZ>vadsZX=o|MNXJ^Jiozf8+_1EXR#gmXe3K(`b1)P4 zlbIFzJhMKNq+tWS9#HU~$4n5y8~%kIE|}n^o(Ba8@1JxKgi~~9Ux3&`ZKE(KvF6`5 zCV^-lj<@kok8Vg+#CuulzkHV~U8zIV{b$1#n-K7(0mXalIwS`ne~VD&*t7&!=M}}a zTv1z$-d#Ubn+@O8H~#acbR`rl>y}bo)Y;*nzZZaYp|o`i>^1c?5Pirsc!C?>$v}pW zHVWz(p#9?(mjU6BDrlkTgxWcZ=`X;e(Y*o@LO;=;Dyc^5^nU&wJn(?866O<@Z~v@x z`>Orx22!Zx?+@~%MzgP_zJaLv*fvK$91%mdo*Cx?LdmC{wR8GtB4a6Yudh$8`>*H9 z^-k+2isWW%1FkN6We(@lrZCCnV>EhU$T|$+I9a5Va9ji)%%6av9)F^c7I}=vbCy|P z@{`z@P(}g#+{DZyU_s9!FhR-kpHvM5;zuOl8SPCz6>F=O-@oWT!CY5!kuHEbdui*S ze%#6V&AgrJJ0a647zo2tFurt$!Cx624${qkl!A=@)O0+_){%`4i>%rD*K@3wT_)U* z9qD2-?(cF#Bf9!j-gsX^2zLZJO`i*$&(v5`U{V7nmxo3kU>~DUgxx2OPJ&MLfb<_^ zmq?4Ob;>Ss3`L4c7DyO30#Sx2%SMofm!CreL;<4g@~U7cZhV2pvz~~MAELMe&W994 z2{OqA@`SHAQM|PlLb0q&&S0R6`m)bikq-|FCJr59v)t^<yOK)kG zTl2_+ltMc#OoAf7!;}(w-J#zREnxCZAmyeHo1h8V#9nBL(4GDaR#Y-K=Y;+CWVG(Y^-C7~Y?~0l%y-CbS-0B? zZ2)(>qpPsq48q2p_DsQYd6PIXwV)PM5>fMPvMX6ug8crst2|fM_vjuO0ALXAe?s&8 zF9)84ENqQ`jzzMwcCj(}FTLc=s(N-m15bW4rERTM{6(wHSf!p)S+?|{UC0(sH5V+lzBINIPI;ofe4-Z#JRhaFO(sEbo|F)#06s|(|xy^T3E*dXt7 z7b*3QqM|T)kR}^1fcVd1HO890pKQF+0@P_i(1u7gQt-CO&KC_+>V}R;HE4&9-iT5w zRoY9`f^ObKwQKE`ObBbzxHZrwR21tTNj>yvU&C0CvhE7;4W=w7cN!OfE`tk>L%&3 zk9q=kqUMCjYHlZ1WZp_zI#XyT{=UW%e7spVdpnxkpI+e&+Eyq`$u_T{$sN_w(LDNN z({5+uFJ~@e#liaL9cQq<9<%ki&t~Qk@{>_=vTG^aIN858<@n{JMO!%G3yW1Myg`1j#QuI}7a3{K zD7dF#zw z85Ikr;70++v5iMx%iMYEj&>}UvV$++F8nUjEfFwDtD&AUoI)o64Cp?&)xlws{nn3T z)zoMF|6rExnpAzW#hA%s5ORn{Z6(8LT{K@&wcJxLb z$sd@;$?UARlbA6U>lpcCzKIc|?Q6MtFux-ThC zh)^%P*zxa@oTr7&!UA{coJNCv>Dc<;)bQwX6`H5I7y$+k5vuu97GtkyIWA}P-OV8n zsjIlS^>Rl>ukzIL4+yYoi6!;`n)#N57VK1cbub|~4P(BB{+&ElC)QtIj0?_8^jS^L z7Nr4xcLlIN<*QasZ)TA8l_3WX>nh^#7k{vHOf*UQ zedv4P1;pXR_fJ6*Rgc2Y?RgfAGoMOJkxsJtzcFtaiYLETC-H-W1OnBuu&!CxI5WXU z|1I4(%M1p7{7kAK!~9RvD*qqHm}G2h|BL8^C{5UA(<5)rsJXLIX@v@sUsR}86Ow2& zK}Ole<1Hge`QoqtmhR~eC9oMKznso?y1Lg+j0=Q8Om^k8xZa}|3V)r;Z&FlPpX;?Z zU4kBx$EGGG)iB%yB)Bw1Wp+Bfy?v4j<5iVWp^|h^7zI-MO}U{c!chA=m825K>KrilNjbBILL7R+9@+7M#XKdI;>}nOS_x(S9RJQ<05CREe6fJD2RQ z@Owl;51`cWW?HdBIfRGwB@SF~LBNvHwt$U>Apf`8yhh5L5t8RORO-I5FsHC?0o9Y@ zIriJ08!}uaeL@p%{s$%a*`Op|>dkyTwaeYFt1roS9O%0AC|oGPIJF0#+yQRsRH124 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 diff --git a/asdc-controller/src/test/resources/resource-examples/multipleModules/testStructure.json b/asdc-controller/src/test/resources/resource-examples/multipleModules/testStructure.json deleted file mode 100644 index 0dd1193e67..0000000000 --- a/asdc-controller/src/test/resources/resource-examples/multipleModules/testStructure.json +++ /dev/null @@ -1,217 +0,0 @@ -{ - "distributionID": "a2872f55-8628-4486-8548-7b132c9a47db", - "serviceName": "Vf zrdm5bpxmc02092017-Service", - "serviceVersion": "1.0", - "serviceUUID": "bad955c3-29b2-4a27-932e-28e942cc6480", - "serviceInvariantUUID": "b16a9398-ffa3-4041-b78c-2956b8ad9c7b", - "serviceDescription": "Demo", - "serviceArtifacts": [ - { - "artifactName": "service-VfZrdm5bpxmc02092017Service-csar.csar", - "artifactVersion": "1", - "artifactType": "TOSCA_CSAR", - "artifactDescription": "TOSCA definition package of the asset", - "artifactTimeout": "0", - "artifactURL": "service-VfZrdm5bpxmc02092017Service-csar.csar", - "artifactUUID": "396cfd49-0f4b-4fec-9f33-0fd7e90d5a22", - "artifactChecksum": "MWQ3Y2FmMWExNDQyYWI2N2YwNjEwZGUzN2IzMzI3NjE=" - } - ], - "resources": [ - { - "resourceInstanceName": "Vf zrdm5bpxmc02092017-VF 0", - "resourceCustomizationUUID": "96c23a4a-6887-4b2c-9cce-1e4ea35eaade", - "resourceInvariantUUID": "23122c9b-dd7f-483f-bf0a-e069303db2f7", - "resourceName": "Vf zrdm5bpxmc02092017-VF", - "resourceType": "VF", - "resourceUUID": "14ba5d1e-3862-407c-a236-1cbaebccce77", - "resourceVersion": "1.0", - "category": "Generic", - "subCategory": "Network Elements", - "artifacts": [ - { - "artifactName": "pxmc_mmn_volume.env", - "artifactVersion": "2", - "artifactType": "HEAT_ENV", - "artifactDescription": "Auto-generated HEAT Environment deployment artifact", - "artifactTimeout": "0", - "artifactURL": "pxmc_mmn_volume.env", - "artifactUUID": "c1ae6284-48d9-4437-a195-b2cf2ba23070", - "artifactChecksum": "NmEyZjc1Y2UwZDMwYjFhNGRlMTMzN2JhNzdiMThjMGU=" - }, - { - "artifactName": "pxmc_base.env", - "artifactVersion": "2", - "artifactType": "HEAT_ENV", - "artifactDescription": "Auto-generated HEAT Environment deployment artifact", - "artifactTimeout": "0", - "artifactURL": "pxmc_base.env", - "artifactUUID": "6dd99c31-c52e-4c45-b99b-d223c877a296", - "artifactChecksum": "OGM2MWIzZTA2OTc5YjQwNTM1NGVhODA0YTFkNzM4ZTg=" - }, - { - "artifactName": "vfzrdm5bpxmc02092017vf0_modules.json", - "artifactVersion": "1", - "artifactType": "VF_MODULES_METADATA", - "artifactDescription": "Auto-generated VF Modules information artifact", - "artifactTimeout": "0", - "artifactURL": "vfzrdm5bpxmc02092017vf0_modules.json", - "artifactUUID": "e3b82cd6-485e-4d56-8d2c-17ccf6a59533", - "artifactChecksum": "MjY0NzcxMjJkZGI4YzQ1MDU2NjhkNWYyM2IwNmYzYmU=" - }, - { - "artifactName": "pxmc_vmt.yaml", - "artifactVersion": "1", - "artifactType": "HEAT", - "artifactDescription": "created from csar", - "artifactTimeout": "120", - "artifactURL": "pxmc_vmt.yaml", - "artifactUUID": "ad12ab80-5419-4346-a5d7-dac2fc15575f", - "artifactChecksum": "ODE0YTRiYzc2YzkxOTliZjJhNjc0M2RhMWU4M2VlZmE=", - "generatedArtifact": { - "artifactInfo": { - "artifactName": "pxmc_vmt.env", - "artifactVersion": "2", - "artifactType": "HEAT_ENV", - "artifactDescription": "Auto-generated HEAT Environment deployment artifact", - "artifactTimeout": "0", - "artifactURL": "pxmc_vmt.env", - "artifactUUID": "bc1640f1-69f0-4760-8fc3-3318ec2ff129", - "artifactChecksum": "MjdkYzY5ZGU0ZTlkZDlhNzI2ZGVhMjk1ODVhZTg1NTY=" - } - }, - "relatedArtifacts": [{ - "artifactInfo": { - "artifactName": "user_data_zrdm5bpxmc02vmt001.txt", - "artifactVersion": "1", - "artifactType": "HEAT_ARTIFACT", - "artifactDescription": "created from csar", - "artifactTimeout": "0", - "artifactURL": "user_data_zrdm5bpxmc02vmt001.txt", - "artifactUUID": "53acdabe-689f-45e5-8578-f1514d3529da", - "artifactChecksum": "MzJmZjgyZWYwOTBjMTg5M2ExNWZhMmMwNzc1NWY1YjQ=" - } - }] - }, - { - "artifactName": "pxmc_mmn.yaml", - "artifactVersion": "1", - "artifactType": "HEAT", - "artifactDescription": "created from csar", - "artifactTimeout": "120", - "artifactURL": "pxmc_mmn.yaml", - "artifactUUID": "b8bca13b-811f-44ab-9d27-45b842c664d8", - "artifactChecksum": "YmNiYTU5YTM4ODVhYTlhODc5NGMwNWZkZjI5MTRmNTE=", - "generatedArtifact": { - "artifactInfo": { - "artifactName": "pxmc_mmn.env", - "artifactVersion": "2", - "artifactType": "HEAT_ENV", - "artifactDescription": "Auto-generated HEAT Environment deployment artifact", - "artifactTimeout": "0", - "artifactURL": "pxmc_mmn.env", - "artifactUUID": "e88ce0b9-1496-4d03-ab1d-6d8d79bfc737", - "artifactChecksum": "ZGI1NzI2Y2FmYjFhOTM2ZDYwNzg1YWRhZjBmMTk2OTQ=" - } - }, - "relatedArtifacts": [{ - "artifactInfo": { - "artifactName": "user_data_zrdm5bpxmc02mmn001.txt", - "artifactVersion": "1", - "artifactType": "HEAT_ARTIFACT", - "artifactDescription": "created from csar", - "artifactTimeout": "0", - "artifactURL": "user_data_zrdm5bpxmc02mmn001.txt", - "artifactUUID": "5bc62c72-5f7a-40bc-a167-1a4fed9afdef", - "artifactChecksum": "OTMxMjk5Mzc1YmIxMzRlYmRlZWJhMjg0MWQ4YTI1NWU=" - } - }] - }, - { - "artifactName": "pxmc_mmn.env", - "artifactVersion": "2", - "artifactType": "HEAT_ENV", - "artifactDescription": "Auto-generated HEAT Environment deployment artifact", - "artifactTimeout": "0", - "artifactURL": "pxmc_mmn.env", - "artifactUUID": "e88ce0b9-1496-4d03-ab1d-6d8d79bfc737", - "artifactChecksum": "ZGI1NzI2Y2FmYjFhOTM2ZDYwNzg1YWRhZjBmMTk2OTQ=" - }, - { - "artifactName": "pxmc_vmt.env", - "artifactVersion": "2", - "artifactType": "HEAT_ENV", - "artifactDescription": "Auto-generated HEAT Environment deployment artifact", - "artifactTimeout": "0", - "artifactURL": "pxmc_vmt.env", - "artifactUUID": "bc1640f1-69f0-4760-8fc3-3318ec2ff129", - "artifactChecksum": "MjdkYzY5ZGU0ZTlkZDlhNzI2ZGVhMjk1ODVhZTg1NTY=" - }, - { - "artifactName": "user_data_zrdm5bpxmc02mmn001.txt", - "artifactVersion": "1", - "artifactType": "HEAT_ARTIFACT", - "artifactDescription": "created from csar", - "artifactTimeout": "0", - "artifactURL": "user_data_zrdm5bpxmc02mmn001.txt", - "artifactUUID": "5bc62c72-5f7a-40bc-a167-1a4fed9afdef", - "artifactChecksum": "OTMxMjk5Mzc1YmIxMzRlYmRlZWJhMjg0MWQ4YTI1NWU=" - }, - { - "artifactName": "pxmc_base.yaml", - "artifactVersion": "1", - "artifactType": "HEAT", - "artifactDescription": "created from csar", - "artifactTimeout": "120", - "artifactURL": "pxmc_base.yaml", - "artifactUUID": "7e7f7356-11bd-4f2f-bbbc-5c10954e3189", - "artifactChecksum": "YThkNGFhZjAwNmM4NzMzODc0YzNhYTUxOTljNGQwNmM=", - "generatedArtifact": { - "artifactInfo": { - "artifactName": "pxmc_base.env", - "artifactVersion": "2", - "artifactType": "HEAT_ENV", - "artifactDescription": "Auto-generated HEAT Environment deployment artifact", - "artifactTimeout": "0", - "artifactURL": "pxmc_base.env", - "artifactUUID": "6dd99c31-c52e-4c45-b99b-d223c877a296", - "artifactChecksum": "OGM2MWIzZTA2OTc5YjQwNTM1NGVhODA0YTFkNzM4ZTg=" - } - } - }, - { - "artifactName": "user_data_zrdm5bpxmc02vmt001.txt", - "artifactVersion": "1", - "artifactType": "HEAT_ARTIFACT", - "artifactDescription": "created from csar", - "artifactTimeout": "0", - "artifactURL": "user_data_zrdm5bpxmc02vmt001.txt", - "artifactUUID": "53acdabe-689f-45e5-8578-f1514d3529da", - "artifactChecksum": "MzJmZjgyZWYwOTBjMTg5M2ExNWZhMmMwNzc1NWY1YjQ=" - }, - { - "artifactName": "pxmc_mmn_volume.yaml", - "artifactVersion": "2", - "artifactType": "HEAT_VOL", - "artifactDescription": "created from csar", - "artifactTimeout": "120", - "artifactURL": "pxmc_mmn_volume.yaml", - "artifactUUID": "2f372a02-df1b-46ca-b81e-822e3f406965", - "artifactChecksum": "MzA5MGY5ODQ0NDY5MDhiMDM3YjFlNGIwNzJkNjFhOTI=", - "generatedArtifact": { - "artifactInfo": { - "artifactName": "pxmc_mmn_volume.env", - "artifactVersion": "2", - "artifactType": "HEAT_ENV", - "artifactDescription": "Auto-generated HEAT Environment deployment artifact", - "artifactTimeout": "0", - "artifactURL": "pxmc_mmn_volume.env", - "artifactUUID": "c1ae6284-48d9-4437-a195-b2cf2ba23070", - "artifactChecksum": "NmEyZjc1Y2UwZDMwYjFhNGRlMTMzN2JhNzdiMThjMGU=" - } - } - } - ] - } - ] -} diff --git a/asdc-controller/src/test/resources/resource-examples/multipleModules/user_data_zrdm5bpxmc02mmn001.txt b/asdc-controller/src/test/resources/resource-examples/multipleModules/user_data_zrdm5bpxmc02mmn001.txt deleted file mode 100644 index 93a8ab9ae3..0000000000 --- a/asdc-controller/src/test/resources/resource-examples/multipleModules/user_data_zrdm5bpxmc02mmn001.txt +++ /dev/null @@ -1,412 +0,0 @@ -#cloud-config -# \hbrief cloud-init main template for MSP config -# \hversion 0.0.11 -# \hdate 2016-05-09 -# \brief cloud-init template for MSP config -# \version 0.2.57 -# \date 2016-09-19 -# Configuration created for MSP SLES_12 MMN - -chpasswd: - list: | - root:Ericsson - miepadm:miep1234 - - expire: False - -users: - -bootcmd: - - - [ sh, -xc, "echo \"#################################################################\" > /etc/issue.ci" ] - - [ sh, -xc, "echo \"# #\" >> /etc/issue.ci" ] - - [ sh, -xc, "echo \"# * * * Cloud-init configuration is in progress * * * #\" >> /etc/issue.ci" ] - - [ sh, -xc, "echo \"# #\" >> /etc/issue.ci" ] - - [ sh, -xc, "echo \"# The system will reboot shortly and then be accessible #\" >> /etc/issue.ci" ] - - [ sh, -xc, "echo \"# #\" >> /etc/issue.ci" ] - - [ sh, -xc, "echo \"#################################################################\" >> /etc/issue.ci" ] - - [ sh, -xc, "if [ -f /etc/issue.orig ]; then cp /etc/issue.orig /etc/issue; fi" ] - - [ sh, -xc, "if [ ! -f /etc/issue.orig ]; then cp /etc/issue /etc/issue.orig; cp /etc/issue.ci /etc/issue; fi" ] - - [ sh, -xc, "/bin/sed -i 's/^DHCLIENT_SET_DEFAULT_ROUTE=\"yes\".*/DHCLIENT_SET_DEFAULT_ROUTE=\"no\"/' /etc/sysconfig/network/dhcp" ] - - [ sh, -xc, "/bin/sed -i 's/^NETCONFIG_DNS_POLICY=.*/NETCONFIG_DNS_POLICY=\"STATIC\"/' /etc/sysconfig/network/config" ] - -runcmd: - - [ sh, -xc, "chage -M 99999 root;rm -f /etc/shadow-" ] - - [ sh, -xc, "chage -M 99999 miepadm;rm -f /etc/shadow-" ] - - [ sh, -xc, "sed -i 's/^GRUB_TIMEOUT.*/GRUB_TIMEOUT=0/' /etc/default/grub" ] - - [ sh, -xc, "echo GRUB_FORCE_HIDDEN_MENU=true >> /etc/default/grub" ] - - [ sh, -xc, "/usr/sbin/grub2-mkconfig -o /boot/grub2/grub.cfg" ] - - [ sh, -xc, "sed -i 's/^.*:.*/admin:6041A28W2rLq6/' /opt/miep/tools/lighttpd/lighttpd_auth.properties" ] - - [ sh, -xc, "sed -i 's/^.*=.*/admin=709e17d2a62751a051fa2072f0976334/' /opt/miep/register/conf/auth.properties" ] - - [ sh, -xc, "sed -i 's/kernel\\.unknown_nmi_panic.*//' /etc/sysctl.conf" ] - - [ sh, -xc, "sed -i 's/kernel\\.panic_on_unrecovered_nmi.*//' /etc/sysctl.conf" ] - - [ sh, -xc, "echo \" kernel.unknown_nmi_panic=1\n kernel.panic_on_unrecovered_nmi=1\n\n\" >> /etc/sysctl.conf" ] - - [ sh, -xc, "sed -i 's/^\\(IRQBALANCE_ARGS=\\).*$/\\1\"--hintpolicy ignore\"/' /etc/sysconfig/irqbalance" ] - - [ sh, -xc, "sed -i 's/^ListenAddress.*/ListenAddress 107.112.138.70/' /etc/ssh/sshd_config" ] - - [ sh, -xc, "sed -i 's/^ClientAliveCountMax.*/ClientAliveCountMax '0'/g' /etc/ssh/sshd_config" ] - - [ sh, -xc, "sed -i 's/^PermitRootLogin.*/PermitRootLogin 'no'/g' /etc/ssh/sshd_config" ] - - [ sh, -xc, "sed -i 's/^#UseDNS.*/UseDNS 'no'/g' /etc/ssh/sshd_config" ] - - [ sh, -xc, "echo auth optional pam_faildelay.so delay=5000000 >> /etc/pam.d/sshd" ] - - [ sh, -xc, "echo trap2sink 127.0.0.1 >> /etc/snmp/snmpd.conf" ] - - [ sh, -xc, "sed -i 's/^agentaddress.*/agentaddress 107.112.138.70/' /etc/snmp/snmpd.conf" ] - - [ sh, -xc, "sed -i 's/^ IP=.*/ IP=\"107.112.138.70\"/' /opt/miep/snmp/tools/agentmonitor.sh" ] - - [ sh, -xc, "sed -i 's/^ SNMPCOMMUNITY=.*/ SNMPCOMMUNITY=\"SNOS-PE\"/' /opt/miep/snmp/tools/agentmonitor.sh" ] - - [ sh, -xc, "sed -i 's/^ IP=.*/ IP=\"107.112.138.70\"/' /opt/miep/snmp/tools/agentmonitor_sle12.sh" ] - - [ sh, -xc, "sed -i 's/^ SNMPCOMMUNITY=.*/ SNMPCOMMUNITY=\"SNOS-PE\"/' /opt/miep/snmp/tools/agentmonitor_sle12.sh" ] - - [ sh, -xc, "/sbin/yast2 dns edit nameserver1=155.165.194.100" ] - - [ sh, -xc, "/usr/sbin/wicked ifdown all; /usr/sbin/wicked ifup --timeout 60 eth0; /usr/sbin/wicked ifup --timeout 60 all" ] - - [ sh, -xc, "mkdir -p /opt/miep/tools" ] - - [ sh, -xc, "wget --directory-prefix=/opt/miep/tools http://107.112.138.71/miit/zrdm5bpxtc02/custom-files/zrdm5bpxtc02/AttMspCust.tgz" ] - - [ sh, -xc, "export TERM=vt220 ; yast keyboard set layout=english-us" ] - - [ sh, -xc, "sed -i 's/YPSAddress.*/YPSAddress\"\tvalue=\"https:\\/\\/yps.ericsson.net\\/YPServer\" \\/>/' /opt/miep/etc/license/SentinelCloudRuntime.properties" ] - - - [ sh, -xc, "umask 027 ; /opt/miep/tools/mnsetup/initmn.sh firstinstall 2>&1 | tee /opt/miep/tools/mnsetup/firstinstall.log" ] - - [ sh, -xc, "chown root:root /opt/miep/tools/AttMspCust.tgz" ] - - [ sh, -xc, "chmod 440 /opt/miep/tools/AttMspCust.tgz" ] - - [ sh, -xc, "mkdir -p /opt/miep/tools/AttMspCust" ] - - [ sh, -xc, "chown root:root /opt/miep/tools/AttMspCust" ] - - [ sh, -xc, "tar xfz /opt/miep/tools/AttMspCust.tgz -C /opt/miep/tools/AttMspCust" ] - - [ sh, -xc, "/opt/miep/tools/AttMspCust/CloudInit/cloudCron.sh 107.112.138.71" ] - - [ sh, -xc, "mkdir -p /opt/miep/etc/certs/manifest/ca/" ] - - [ sh, -xc, "chown -R miepadm:miepgrp /opt/miep/etc/certs/manifest/" ] - - [ sh, -xc, "mkdir -p /opt/miep/etc/certs/origin_server_ssl/server_cert" ] - - [ sh, -xc, "chown -R miepadm:miepgrp /opt/miep/etc/certs/origin_server_ssl/server_cert" ] - - [ sh, -xc, "sed -i 's/KexAlgorithms/#KexAlgorithms/g' /etc/ssh/sshd_config" ] - - [ sh, -xc, "wget --directory-prefix=/opt/miep/tools/AttMspCust/CloudInit/msacerts -e robots=off -r -l1 --no-parent -R '*html*' http://107.112.138.71/miit/zrdm5bpxtc02/custom-files/zrdm5bpxtc02/msacerts" ] - - [ sh, -xc, "mv /opt/miep/tools/AttMspCust/CloudInit/msacerts/107.112.138.71/miit/zrdm5bpxtc02/custom-files/zrdm5bpxtc02/msacerts/* /opt/miep/tools/AttMspCust/CloudInit/msacerts/" ] - - [ sh, -xc, "mv /opt/miep/tools/AttMspCust/CloudInit/msacerts/keystore* /opt/miep/tools/AttMspCust/CloudInit/msacerts/.keystore_`hostname`_gno" ] - - [ sh, -xc, "rm -rf /opt/miep/tools/AttMspCust/CloudInit/msacerts/107.112.138.71" ] - - [ sh, -xc, "sed -i 's/PASS_MAX_DAYS 60/PASS_MAX_DAYS 99999/' /etc/login.defs" ] - - [ sh, -xc, "sleep 61s" ] - - [ sh, -xc, "mkdir -p /usr/java/default/bin/ && ln -s /usr/bin/java /usr/java/default/bin/" ] - -timezone: 'PST8PDT' - -write_files: - - content: | - H4sIANk1vFkAA41Sy27bMBC88ysW8TViKaWNC92MAkV9KOIi+QFKWllE+RBIyo9+fZeW7DqxDHR10c4OZ3aXXEDnQgxwjrdOBWiVRmgw1F5VGECCHUyFHlx7YltpMIsuk03jMQS2gPdhZN8ruyUd5yF2CG/fNp/WGwhDFY4houEA6whkZEhNH28EhoANyAiVcxGiMvgI+w4tWAfJGwL6HXpqzCP4wVoy4zciLxaCkVrD6BkeqZXzbLW0UOHooyyVZZOGkzciD8mvebi2TU6vRxvloWQL+l9vstW4CIDvg9bZr0Fq1Spssh/TsgBeO+fjJadzLC+WXNCXT07a1VKn7V7ybcoYOYQeayU1Oe2eYVo6BlaW+exJ1e+esytwyl1fyfo3Yy0KUZbiimaRbNr2Cja1DLH32KpDKhTJ6lSgfVpHL2NCiwvq3RDpSib86YKfXhdLU2QzAS+rn2msz7A6jzXLo3WJJc/zgudPX/lSAPzxjflS9QdTi8IYK0TO97Lf7rlxFd1w3zmLnAabY85hmZPmHn5PeWS8b+2D+M7E/2xtZM5ht639w+8pjwzG/gJrL8X/3wMAAA== - path: /etc/hosts - owner: root:root - permissions: '0644' - encoding: 'gzip+base64' - - content: | - ################################################################################ - ## /etc/ntp.conf - ## - ## Sample NTP configuration file. - ## See package 'ntp-doc' for documentation, Mini-HOWTO and FAQ. - ## Copyright (c) 1998 S.u.S.E. GmbH Fuerth, Germany. - ## - ## Author: Michael Andres, - ## Michael Skibbe, - ## - ################################################################################ - - ## - ## Radio and modem clocks by convention have addresses in the - ## form 127.127.t.u, where t is the clock type and u is a unit - ## number in the range 0-3. - ## - ## Most of these clocks require support in the form of a - ## serial port or special bus peripheral. The particular - ## device is normally specified by adding a soft link - ## /dev/device-u to the particular hardware device involved, - ## where u correspond to the unit number above. - ## - ## Generic DCF77 clock on serial port (Conrad DCF77) - ## Address: 127.127.8.u - ## Serial Port: /dev/refclock-u - ## - ## (create soft link /dev/refclock-0 to the particular ttyS?) - ## - # server 127.127.8.0 mode 5 prefer - server 135.144.38.211 prefer - server 155.165.201.253 prefer - - ## - ## Undisciplined Local Clock. This is a fake driver intended for backup - ## and when no outside source of synchronized time is available. - ## - server 127.127.1.0 # local clock (LCL) - fudge 127.127.1.0 stratum 10 # LCL is unsynchronized - - ## - ## Add external Servers using - ## # rcntp addserver - ## - - ## - ## Miscellaneous stuff - ## - - driftfile /var/lib/ntp/drift/ntp.drift # path for drift file - - logfile /var/log/ntp # alternate log file - # logconfig =syncstatus + sysevents - # logconfig =all - - # statsdir /tmp/ # directory for statistics files - # filegen peerstats file peerstats type day enable - # filegen loopstats file loopstats type day enable - # filegen clockstats file clockstats type day enable - - # - # Authentication stuff - # - keys /etc/ntp.keys # path for keys file - trustedkey 1 # define trusted keys - requestkey 1 # key (7) for accessing server variables - controlkey 1 - - # by default act only as a basic NTP client - restrict default kod nomodify notrap nopeer noquery - restrict -6 default kod nomodify notrap nopeer noquery - # - # allow NTP messages only from the loopback - restrict 127.0.0.1 - restrict ::1 - path: /etc/ntp.conf - owner: root:root - permissions: '0644' - - content: | - # default - - - default 107.112.136.1 - - - path: /etc/sysconfig/network/routes - owner: root:root - permissions: '0644' - - content: | - - - - 107.239.72.10 - 162 - v1v2ReadWriteSecName - noAuthNoPriv - - - 135.207.171.152 - 162 - v1v2ReadWriteSecName - noAuthNoPriv - - - path: /opt/miep/tools/AttMspCust/CloudInit/trapDestCfg.xml - owner: root:root - permissions: '0755' - - content: | - [ - { - "networkname": "OAM" - }, - { - "networkname": "Internal" - }, - { - "networkname": "Access" - }, - { - "networkname": "dmz_untrust" - }, - { - "networkname": "dmz_trust" - }, - { - "networkname": "dmz_trust1" - }, - { - "networkname": "dmz_untrust1" - }, - { - "networkname": "Internet" - }, - { - "networkname": "ControlPlaneSig" - }, - { - "networkname": "AccessIngress" - }, - { - "networkname": "InternetIngress" - } - ] - path: /opt/miep/init/networknames.json - owner: miepadm:miepgrp - permissions: '0644' - - content: | - BOOTPROTO='static' - IPADDR='107.112.138.70' - BROADCAST='107.112.143.255' - NETMASK='255.255.248.0' - NETWORK='107.112.136.0' - STARTMODE='onboot' - DEVICE='eth0' - USERCONTROL='no' - NAME='OAM' - DEFROUTE='yes' - CHECK_DUPLICATE_IP='yes' - SEND_GRATUITOUS_ARP='yes' - path: /etc/sysconfig/network/ifcfg-eth0 - owner: root:root - permissions: '0644' - - content: | - path: /etc/udev/rules.d/10-local.rules - encoding: b64 - owner: root:root - permissions: '0640' - - content: | - # - # VERSION: - # - # This file contains the variable definitions to pull RMS Input Files from the PCRF. - - # The PCRF_PRIMARY variable specifies the Primary IP the MSP should use to connect to the PCRF. - - PCRF_PRIMARY=107.122.136.120 - - # The PCRF_SECONDARY variable specifies the Secondary IP the MSP should use to connect to the PCRF. - - PCRF_SECONDARY=107.122.136.121 - - # The PCRF_USER variable specifies the user value to use when performing the secure ftp transfer. - - PCRF_USER=msp - - # The PCRF_PASS variable specifies the password value to use when performing the secure ftp transfer. - - PCRF_PASS=@TTmsp123 - - # The PCRF_DIR variable specifies the directory on the PCRF server where the RMS Input Files are located. - # This is the directory the secure ftp transfer will change to before pulling the RPM Input File. - - PCRF_DIR=/home/msp/downloads - - # The PCRF_PROMPT variable specifies the sftp prompt string that MSP can expect the PCRF server to - # display as a prompt when remotely connecting to the PCRF server using sftp. - - PCRF_PROMPT=sftp> - MSA_GROUP_NAME= - path: /appl/rms/cfg/pcrf.cfg - owner: root:root - permissions: '0755' - - content: | - # - # reserved values - # - 255 local - 254 main - 253 default - 0 unspec - # - # local - # - #1 inr.ruhep - path: /etc/iproute2/rt_tables - owner: root:root - permissions: '0644' - - content: | - ### /etc/resolv.conf file autogenerated by netconfig! - # - # Before you change this file manually, consider to define the - # static DNS configuration using the following variables in the - # /etc/sysconfig/network/config file: - # NETCONFIG_DNS_STATIC_SEARCHLIST - # NETCONFIG_DNS_STATIC_SERVERS - # NETCONFIG_DNS_FORWARDER - # or disable DNS configuration updates via netconfig by setting: - # NETCONFIG_DNS_POLICY='' - # - # See also the netconfig(8) manual page and other documentation. - # - # Note: Manual change of this file disables netconfig too, but - # may get lost when this file contains comments or empty lines - # only, the netconfig settings are same with settings in this - # file and in case of a "netconfig update -f" call. - # - ### Please remove (at least) this line when you modify the file! - nameserver 155.165.194.100 - nameserver 155.165.201.100 - search wapgw.mobilephone.net - options attempts:1 - options timeout:6 - path: /etc/resolv.conf - owner: root:root - permissions: '0644' - - content: | - MN_OAM_IPADDR=107.112.138.70 - SNMP_IPADDR=107.239.72.10 - SNMP_PORT=162 - MN_SERVER_GROUPNAME=rdm5b - STORAGE_TYPE=CINDER - SUPPORT_LANG_LIST={"en":"English"} - AUTOSTART=Y - AUTODBPATCH=Y - PRODUCT=MSP - MN_TO_OTHER_NODE_NETWORK=OAM - path: /opt/miep/tools/mnsetup/init.properties - owner: root:root - permissions: '0640' - - content: | - CAE_PASSWORD=wapwap12 - MSA_PASSWORD=wapwap12 - CAPLOG_PASSWORD=wapwap12 - TRACELOG_PASSWORD=wapwap12 - path: /opt/miep/tools/mnsetup/init.properties.sec - owner: root:root - permissions: '0640' - - content: | - 107.112.138.59 zrdm5bpxtc02adm001 zrdm5bpxtc02adm001-oam - path: /var/tmp/adm_hosts - owner: root:root - permissions: '0644' - - content: WwogewogICJwYXJlbnQiIDogInJkbTViIiwKICAiZ3JvdXBzIiA6IFsKICAgewogICAgImdyb3VwbmFtZSIgOiAienJkbTVicHh0YzAyIiwKICAgICJkaXNwbGF5bmFtZSIgOiAienJkbTVicHh0YzAyIiwKICAgICJkZXNjcmlwdGlvbiIgOiAienJkbTVicHh0YzAyIgogICB9CiAgXQogfSwKIHsKICAicGFyZW50IiA6ICJ6cmRtNWJweHRjMDIiLAogICJncm91cHMiIDogWwogICB7CiAgICAiZ3JvdXBuYW1lIiA6ICJ6cmRtNWJweHRjMDItVFMiLAogICAgImRpc3BsYXluYW1lIiA6ICJ6cmRtNWJweHRjMDItVFMiLAogICAgImRlc2NyaXB0aW9uIiA6ICJ6cmRtNWJweHRjMDItVFMiCiAgIH0KICBdCiB9Cl0K - path: /opt/miep/msaapp/apps/clusteradmin/clusters.json - encoding: b64 - owner: msausr:msagrp - permissions: '0640' - - content: | - . /opt/miep/tools/AttMspCust/CloudInit/helpers.sh - cd /opt/miep/tools/msa - ./msaconfigctrl.sh -g zrdm5bpxtc02 -m cast set apsLicenseCustomerId '946935' - ./msaconfigctrl.sh -g zrdm5bpxtc02 -m cast set apsLicenseUserId 'AT&T_Customer_Test_Lab2_vMSP_Nimbus' - ./msaconfigctrl.sh -g zrdm5bpxtc02 -m cast set prsPrefixLookupTable '2606:ae00:af00::/41=64' - ./msaconfigctrl.sh -g zrdm5bpxtc02 -m cast set prsDiamRealm 'zrdm5bpxtc02.msp.sd' - ./msaconfigctrl.sh -g zrdm5bpxtc02 -m cast set htsHttpClientIpRangesBlacklist '172.26.14.0/25,172.26.17.0/24,107.103.114.0/25,107.103.113.0/25,107.103.112.160/29,107.103.121.0/24,107.103.122.0/24,fd00:2600:2600:100::/64,2606:ae00:b800:3441::/64,2606:ae00:b800:3442::/64' - ./msaconfigctrl.sh -g zrdm5bpxtc02 -m cast set attLdapPool_host '172.21.196.7' - ./msaconfigctrl.sh -g zrdm5bpxtc02 -m cast set attLdapPool_user 'cn=virNimbusV2L,ou=Users,ou=Administration,o=Cingular' - ./msaconfigctrl.sh -g zrdm5bpxtc02 -m cast set attLdapPool_pwd 'MSPLab' - ./msaconfigctrl.sh -g zrdm5bpxtc02 -m cast set attLdapPool_secondhost '155.165.172.23' - ./msaconfigctrl.sh -g zrdm5bpxtc02 -m cast set attLdapPool_seconduser 'cn=virNimbusV2L,ou=Users,ou=Administration,o=Cingular' - ./msaconfigctrl.sh -g zrdm5bpxtc02 -m cast set attLdapPool_secondpwd 'MSPLab' - ./msaconfigctrl.sh -g zrdm5bpxtc02 -m cast set idfMspIpAddr '' - ./msaconfigctrl.sh -g zrdm5bpxtc02-TS -m cast set prsDiamMessageTimeout 16000 - ./msaconfigctrl.sh -g zrdm5bpxtc02-TS -m cast set prsDiamSlowPeerAlarmLimit 16000 - ./msaconfigctrl.sh -g zrdm5bpxtc02-TS -m cast set prsDiameterServerListenerAddressList '0.0.0.0:3868' - ./msaconfigctrl.sh -g zrdm5bpxtc02-TS -m cast set ltmi.keyServerUpdateHostList 'zrdm5bpxtc02mts001,zrdm5bpxtc02mts002' - ./msaconfigctrl.sh -g zrdm5bpxtc02-TS -m cast set omsNsIntrusionDetection 1 - ./msaconfigctrl.sh -g zrdm5bpxtc02-TS -m cast set telGroup1FTPTargetServerName zrdm5bpxtc02adm001.wapgw.mobilephone.net - $SU -s $BASH - postgres -c "psql -d msa -c \"set search_path = msa,msp; update msp.virtualgateway set externalnodeip='172.26.39.6' where servergrpid= '0' and vgindex= 'VG011'\"" - $SU -s $BASH - postgres -c "psql -d msa -c \"set search_path = msa,msp; update msp.virtualgateway set servingdestaddrranges='172.26.39.6/32' where servergrpid= '0' and vgindex= 'VG011'\"" - $SU -s $BASH - postgres -c "psql -d msa -c \"set search_path = msa,msp; update msp.virtualgateway set externalnodeip='fc00:a:a::700' where servergrpid= '0' and vgindex= 'VG013'\"" - $SU -s $BASH - postgres -c "psql -d msa -c \"set search_path = msa,msp; update msp.virtualgateway set servingdestaddrranges='fc00:a:a::700/128' where servergrpid= '0' and vgindex= 'VG013'\"" - path: /opt/miep/tools/AttMspCust/CloudInit/install_msa_zone.sh - owner: root:root - permissions: '0755' - - content: | - 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 - path: /opt/miep/etc/license/Cloud_Entitlement.combine - owner: msausr:msagrp - permissions: '0755' - encoding: 'gzip+base64' - - content: | - *.* @135.207.171.57:1538 - *.* @155.165.162.48:1532 - path: /etc/rsyslog.d/remote.conf - owner: root:root - permissions: '0600' - -scripts_per_once: - -power_state: - mode: reboot - message: Server will reboot now - timeout: 5 diff --git a/asdc-controller/src/test/resources/resource-examples/multipleModules/user_data_zrdm5bpxmc02vmt001.txt b/asdc-controller/src/test/resources/resource-examples/multipleModules/user_data_zrdm5bpxmc02vmt001.txt deleted file mode 100644 index 4c8f7c06ea..0000000000 --- a/asdc-controller/src/test/resources/resource-examples/multipleModules/user_data_zrdm5bpxmc02vmt001.txt +++ /dev/null @@ -1,289 +0,0 @@ -#cloud-config -# \hbrief cloud-init main template for MSP config -# \hversion 0.0.11 -# \hdate 2016-05-09 -# \brief cloud-init template for MSP config -# \version 0.2.57 -# \date 2016-09-19 -# Configuration created for MSP SLES_12 VMT - -chpasswd: - list: | - root:Ericsson - miepadm:miep1234 - - expire: False - -users: - -bootcmd: - - - [ sh, -xc, "echo \"#################################################################\" > /etc/issue.ci" ] - - [ sh, -xc, "echo \"# #\" >> /etc/issue.ci" ] - - [ sh, -xc, "echo \"# * * * Cloud-init configuration is in progress * * * #\" >> /etc/issue.ci" ] - - [ sh, -xc, "echo \"# #\" >> /etc/issue.ci" ] - - [ sh, -xc, "echo \"# The system will reboot shortly and then be accessible #\" >> /etc/issue.ci" ] - - [ sh, -xc, "echo \"# #\" >> /etc/issue.ci" ] - - [ sh, -xc, "echo \"#################################################################\" >> /etc/issue.ci" ] - - [ sh, -xc, "if [ -f /etc/issue.orig ]; then cp /etc/issue.orig /etc/issue; fi" ] - - [ sh, -xc, "if [ ! -f /etc/issue.orig ]; then cp /etc/issue /etc/issue.orig; cp /etc/issue.ci /etc/issue; fi" ] - - [ sh, -xc, "/bin/sed -i 's/^DHCLIENT_SET_DEFAULT_ROUTE=\"yes\".*/DHCLIENT_SET_DEFAULT_ROUTE=\"no\"/' /etc/sysconfig/network/dhcp" ] - - [ sh, -xc, "/bin/sed -i 's/^NETCONFIG_DNS_POLICY=.*/NETCONFIG_DNS_POLICY=\"STATIC\"/' /etc/sysconfig/network/config" ] - -runcmd: - - [ sh, -xc, "chage -M 99999 root;rm -f /etc/shadow-" ] - - [ sh, -xc, "chage -M 99999 miepadm;rm -f /etc/shadow-" ] - - [ sh, -xc, "sed -i 's/^ListenAddress.*/ListenAddress 107.112.138.71/' /etc/ssh/sshd_config" ] - - [ sh, -xc, "sed -i 's/^ClientAliveCountMax.*/ClientAliveCountMax 300/g' /etc/ssh/sshd_config" ] - - [ sh, -xc, "sed -i 's/^ClientAliveInterval.*/ClientAliveInterval 10/g' /etc/ssh/sshd_config" ] - - [ sh, -xc, "sed -i '/PermitRootLogin/d' /etc/ssh/sshd_config" ] - - [ sh, -xc, "echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config" ] - - [ sh, -xc, "sed -i '/KexAlgorithms/s/^/# /' /etc/ssh/sshd_config" ] - - [ sh, -xc, "mkdir /opt/miep/tools/miit/www/sles" ] - - [ sh, -xc, "rm -f /etc/sysconfig/network/ifcfg-eth1" ] - - [ sh, -xc, "mkdir /shared_nfs_datastore" ] - - [ sh, -xc, "mount -t ext4 /dev/vdb /shared_nfs_datastore" ] - - [ sh, -xc, "mkdir -p /shared_nfs_datastore/miit" ] - - [ sh, -xc, "cp -pr /opt/miep/tools/miit/* /shared_nfs_datastore/miit" ] - - [ sh, -xc, "rm -rf /opt/miep/tools/miit" ] - - [ sh, -xc, "rm -f /etc/udev/rules.d/70-persistent-net.rules" ] - - [ sh, -xc, "ln -s /shared_nfs_datastore/miit /opt/miep/tools/miit" ] - - [ sh, -xc, "chown -R miepadm:miepgrp /shared_nfs_datastore/miit" ] - - [ sh, -xc, "chown -R miepadm:miepgrp /opt/miep/tools/miit" ] - - [ sh, -xc, "mkdir -p /opt/miep/tools/miit/www/sles" ] - - [ sh, -xc, "mount -o loop /shared_nfs_datastore/SLE-12-SP1-Server-DVD-x86_64-GM-DVD1.iso /opt/miep/tools/miit/www/sles" ] - - [ sh, -xc, "/usr/bin/zypper ar /opt/miep/tools/miit/www/sles nfsrpms" ] - - [ sh, -xc, "/usr/bin/zypper lr" ] - - [ sh, -xc, "/usr/bin/zypper --non-interactive install -y nfs-kernel-server" ] - - [ sh, -xc, "/usr/bin/zypper --non-interactive install -y expect" ] - - [ sh, -xc, "/usr/bin/zypper --non-interactive install -y dos2unix" ] - - [ sh, -xc, "echo '//shared_nfs_datastore 107.112.136.0/21(rw,no_root_squash,sync,subtree_check)' >> /etc/exports" ] - - [ sh, -xc, "echo '/dev/vdb /shared_nfs_datastore ext4 acl 1 1' >> /etc/fstab" ] - - [ sh, -xc, "echo '@reboot /var/tmp/hostnamefix.sh > /var/tmp/hostnamefix.log' | /usr/bin/crontab -u root -" ] - - [ sh, -xc, "systemctl enable nfsserver.service" ] - - [ sh, -xc, "systemctl enable rpcbind.service" ] - - [ sh, -xc, "systemctl enable apache2.service" ] - - [ sh, -xc, "chkconfig mount_sles on" ] - - [ sh, -xc, "resize2fs /dev/vdb 200G" ] - - [ sh, -xc, "sed -i 's/PASS_MAX_DAYS 60/PASS_MAX_DAYS 99999/' /etc/login.defs" ] - - [ sh, -xc, "sleep 61s" ] - - [ sh, -xc, "su - miepadm -c \"ssh-keygen -t rsa -q -N '' -f ~/.ssh/id_rsa\"" ] - -timezone: 'PST8PDT' - -write_files: - - content: | - H4sIANk1vFkAA41Sy27bMBC88ysW8TViKaWNC92MAkV9KOIi+QFKWllE+RBIyo9+fZeW7DqxDHR10c4OZ3aXXEDnQgxwjrdOBWiVRmgw1F5VGECCHUyFHlx7YltpMIsuk03jMQS2gPdhZN8ruyUd5yF2CG/fNp/WGwhDFY4houEA6whkZEhNH28EhoANyAiVcxGiMvgI+w4tWAfJGwL6HXpqzCP4wVoy4zciLxaCkVrD6BkeqZXzbLW0UOHooyyVZZOGkzciD8mvebi2TU6vRxvloWQL+l9vstW4CIDvg9bZr0Fq1Spssh/TsgBeO+fjJadzLC+WXNCXT07a1VKn7V7ybcoYOYQeayU1Oe2eYVo6BlaW+exJ1e+esytwyl1fyfo3Yy0KUZbiimaRbNr2Cja1DLH32KpDKhTJ6lSgfVpHL2NCiwvq3RDpSib86YKfXhdLU2QzAS+rn2msz7A6jzXLo3WJJc/zgudPX/lSAPzxjflS9QdTi8IYK0TO97Lf7rlxFd1w3zmLnAabY85hmZPmHn5PeWS8b+2D+M7E/2xtZM5ht639w+8pjwzG/gJrL8X/3wMAAA== - path: /etc/hosts - owner: root:root - permissions: '0644' - encoding: 'gzip+base64' - - content: | - ################################################################################ - ## /etc/ntp.conf - ## - ## Sample NTP configuration file. - ## See package 'ntp-doc' for documentation, Mini-HOWTO and FAQ. - ## Copyright (c) 1998 S.u.S.E. GmbH Fuerth, Germany. - ## - ## Author: Michael Andres, - ## Michael Skibbe, - ## - ################################################################################ - - ## - ## Radio and modem clocks by convention have addresses in the - ## form 127.127.t.u, where t is the clock type and u is a unit - ## number in the range 0-3. - ## - ## Most of these clocks require support in the form of a - ## serial port or special bus peripheral. The particular - ## device is normally specified by adding a soft link - ## /dev/device-u to the particular hardware device involved, - ## where u correspond to the unit number above. - ## - ## Generic DCF77 clock on serial port (Conrad DCF77) - ## Address: 127.127.8.u - ## Serial Port: /dev/refclock-u - ## - ## (create soft link /dev/refclock-0 to the particular ttyS?) - ## - # server 127.127.8.0 mode 5 prefer - server 135.144.38.211 prefer - server 155.165.201.253 prefer - - ## - ## Undisciplined Local Clock. This is a fake driver intended for backup - ## and when no outside source of synchronized time is available. - ## - server 127.127.1.0 # local clock (LCL) - fudge 127.127.1.0 stratum 10 # LCL is unsynchronized - - ## - ## Add external Servers using - ## # rcntp addserver - ## - - ## - ## Miscellaneous stuff - ## - - driftfile /var/lib/ntp/drift/ntp.drift # path for drift file - - logfile /var/log/ntp # alternate log file - # logconfig =syncstatus + sysevents - # logconfig =all - - # statsdir /tmp/ # directory for statistics files - # filegen peerstats file peerstats type day enable - # filegen loopstats file loopstats type day enable - # filegen clockstats file clockstats type day enable - - # - # Authentication stuff - # - keys /etc/ntp.keys # path for keys file - trustedkey 1 # define trusted keys - requestkey 1 # key (7) for accessing server variables - controlkey 1 - - # by default act only as a basic NTP client - restrict default kod nomodify notrap nopeer noquery - restrict -6 default kod nomodify notrap nopeer noquery - # - # allow NTP messages only from the loopback - restrict 127.0.0.1 - restrict ::1 - path: /etc/ntp.conf - owner: root:root - permissions: '0640' - - content: | - default 107.112.136.1 - - - path: /etc/sysconfig/network/routes - owner: root:root - permissions: '0644' - - content: | - - - - 107.239.72.10 - 162 - v1v2ReadWriteSecName - noAuthNoPriv - - - 135.207.171.152 - 162 - v1v2ReadWriteSecName - noAuthNoPriv - - - path: /opt/miep/tools/AttMspCust/CloudInit/trapDestCfg.xml - owner: root:root - permissions: '0755' - - content: | - BOOTPROTO='static' - IPADDR='107.112.138.71' - BROADCAST='107.112.143.255' - NETMASK='255.255.248.0' - NETWORK='107.112.136.0' - STARTMODE='onboot' - DEVICE='eth0' - USERCONTROL='no' - NAME='OAM' - DEFROUTE='yes' - CHECK_DUPLICATE_IP='yes' - SEND_GRATUITOUS_ARP='yes' - path: /etc/sysconfig/network/ifcfg-eth0 - owner: root:root - permissions: '0644' - - content: | - path: /etc/udev/rules.d/10-local.rules - encoding: b64 - owner: root:root - permissions: '0640' - - content: | - #!/bin/bash - ### BEGIN INIT INFO - # Provides: mount_sles - # Required-Start: network - # Required-Stop: network - # Should-Start: - # Should-Stop: - # Default-Start: 3 5 - # Default-Stop: 0 1 2 6 - # Short-Description: Mount SLES iso file - ### END INIT INFO - echo Mount SLES ISO image - mount -o loop /shared_nfs_datastore/SLE-12-SP1-Server-DVD-x86_64-GM-DVD1.iso /opt/miep/tools/miit/www/sles - path: /etc/init.d/mount_sles - owner: root:root - permissions: '0755' - - content: | - grep -qs preserve_hostname /etc/cloud/cloud.cfg - if [ $? -eq 0 ] ; then - sed -i 's/preserve_hostname: .*/preserve_hostname: true/' /etc/cloud/cloud.cfg - fi - - /bin/hostname | grep -qs novalocal - if [ $? -eq 0 ] ; then - newHostname=$(/bin/hostname | sed -e 's/.novalocal//') - hostnamectl set-hostname $newHostname - fi - /usr/bin/crontab -u root -l | grep -v hostnamefix.sh | /usr/bin/crontab -u root - - path: /var/tmp/hostnamefix.sh - owner: root:root - permissions: '0755' - - content: | - ### /etc/resolv.conf file autogenerated by netconfig! - # - # Before you change this file manually, consider to define the - # static DNS configuration using the following variables in the - # /etc/sysconfig/network/config file: - # NETCONFIG_DNS_STATIC_SEARCHLIST - # NETCONFIG_DNS_STATIC_SERVERS - # NETCONFIG_DNS_FORWARDER - # or disable DNS configuration updates via netconfig by setting: - # NETCONFIG_DNS_POLICY='' - # - # See also the netconfig(8) manual page and other documentation. - # - # Note: Manual change of this file disables netconfig too, but - # may get lost when this file contains comments or empty lines - # only, the netconfig settings are same with settings in this - # file and in case of a "netconfig update -f" call. - # - ### Please remove (at least) this line when you modify the file! - nameserver 155.165.194.100 - nameserver 155.165.201.100 - search wapgw.mobilephone.net - options attempts:1 - options timeout:6 - path: /etc/resolv.conf - owner: root:root - permissions: '0644' - - content: | - *.* @135.207.171.57:1538 - *.* @155.165.162.48:1532 - path: /etc/rsyslog.d/remote.conf - owner: root:root - permissions: '0600' - - content: | - H4sIANjbQlkAA5WUUW/aMBSF3/0rjqKgtEyUlodNYmonSulaCQqCqnsYE0kTByyCHcWGjAH/fU5CWqJB1PEC5J6c+/n42qTb/37/2O1cG1I5aindGXXnE9tzFIX1qbKoeJV1rfJQ6VVGln0RiKlBCHVnwmMyDJz12TnZpP9R0/qxsswr0xpzC8ieGqmT3YR5ZeDmBuZm329HdoRkLdtJyzejvTGMavJJa4xP4YsIK+8VujxPK5ojZX25u722PR+12XYa0TARbZ14DmsTRowrmJ93VlaRMyei3oT7cqKhHKlERG1CmI+fML+hxiku8QtfoWaUEwAFnLw54AkquaVAfzOppEFoIGki14qJZH9oOU5jZ9mnzTNPONxLKOAEgXB1gB4SYwj/LQMwCTPvaID4jByJr+oe5vd0P4LPAirXUtFFdR9jKtGlAnYgRHh5IkfjWJDj+oIxNa7HcTyuS93DsHE62gJpEetUvGWv5NITIVTDSLhUSozSeSsu3JeSRivm6m3b/wDPntEI2YDul91yFVvRJpz0G2e6q96Z848vtDMc9ofNA3u9h56I+fE1FmTLMFtdyjwctG8fn+7egaPQfWV6ZEpxoyXnehI0b8nMH+PN3UtpD0QF1tag1X7oNN5ZndDRhcbHWf8PNrcvhT0Q5bBlZ+el9wy9D5IJns9OQQ8jUYx+5KLE19bHFnURKn0uaFjvjQZfLq4mz/1+d1TFFtmFFO9f2OKfK8IgO5DCDUnIX5FnXVGsBQAA - path: /opt/miep/tools/miit/vmtTools/statusCheck.sh - owner: miepadm:miepgrp - permissions: '0755' - encoding: 'gzip+base64' - - content: | - H4sIAKm9hFkAA9VWbW/aMBD+3PyKUxSUrVPiUama1CmdEOsLEqxodPvSVmAlBqwmcRQfUKj632c7EKCMDrVVtX6AxM69PM/d2XfNi7N27fI8sInIkCScZQSFiKV65UjGCV7qlW31eczaFIdKcExzgklGHMmRpTRhtpUzOYoxsFNxkuciV/JMUp5KpHFMkYs0sPs0lkrSAt6HK/BmYDtVG27gK+CQpRYAsHAowNZGOwxHGfySdMCOfFLu+HIIVwunN3BVQ2x12uFIYkbDWyV8Y4MxdMcRqhYw5VGvFyqBU11ddodCogxKGm6x4RobzYuz00bzJLDLz57UGLxeRJGB+6mSVKLK1KucV1qVjtvzYzEovJ90aqXy79alp9ZPKlnQ52thOXijsFAjV1/KBc4BFGgsS3uNuMxiOv3w0bo3a/AUh2t0narjXqcuQLFrG3a9I9AJPT4G575ZFNUDMa86FA/Ww6pJVR3brO5gcxlhbdaaibQIhDEJyW3Ec/Ay+GtFTyaTZeESHSSReLq45XL7+ZokkTRkOUpLBTJUEDbOCnE2wv4CdzrVMtO2fBzM5kXkfAMvZfB5pYpWQq8KbBNBJJhMXdQlok5AUZIQRi9ApvgjzeFu3J+9Gj/wSVud0EbK8flUuYRUIFAY05hHBqT2qjgvLjGmr7B5DKxtadz3dZ5fpVJ2YQJ2q1MD49IY2szYOnqYp3ALdp4iy0Na/W/xPw0/FwJD+i7B37KpQpSz/XeJ3lnvnc/nsCv0xw53KnuFfigmKXg/QWOjUXKkn4N8l56glRMRaeUvh4c7KRgqtlNAsSGABZott1JHaULRzEORZDFDFsGE4xDYfHoyPXpPPR5PUZiP9FX1b3NyFIZMyv4ojqdFWED3SmWwsWLQdEyrZPDInaFiPK4NJOr3otawuMOJMqQcl/1aDUvd+sWP08YZHByTiI1JqtAXfmFvOQrNCfB0oGctEKnWBMWbSgYTytH3i4En3Mz3sqGQeixGkcGBOc2+M4n1/sC/S+LXoLbkolkWrVB1QjVPd8OyW4NqaPN4d/UXFX49yz0x7kAZhR5SHoNX3Sra07I668XfW54I1TXX5rLHVWf9AdB7+rd1DAAA - path: /opt/miep/tools/miit/vmtTools/siteSetup.sh - owner: miepadm:miepgrp - permissions: '0755' - encoding: 'gzip+base64' - -scripts_per_once: - -power_state: - mode: reboot - message: Server will reboot now - timeout: 5 diff --git a/asdc-controller/src/test/resources/resource-examples/multipleModules/vfzrdm5bpxmc02092017vf0_modules.json b/asdc-controller/src/test/resources/resource-examples/multipleModules/vfzrdm5bpxmc02092017vf0_modules.json deleted file mode 100644 index c8a8508190..0000000000 --- a/asdc-controller/src/test/resources/resource-examples/multipleModules/vfzrdm5bpxmc02092017vf0_modules.json +++ /dev/null @@ -1,75 +0,0 @@ -[ - { - "vfModuleModelName": "VfZrdm5bpxmc02092017Vf..pxmc_base..module-0", - "vfModuleModelInvariantUUID": "f7a867f2-596b-4f4a-a128-421e825a6190", - "vfModuleModelVersion": "1", - "vfModuleModelUUID": "eb5de6fb-9ecf-4009-b922-fae3a9ae7d46", - "vfModuleModelCustomizationUUID": "074c64d0-7e13-4bcc-8bdb-ea922331102d", - "isBase": true, - "artifacts": [ - "7e7f7356-11bd-4f2f-bbbc-5c10954e3189", - "6dd99c31-c52e-4c45-b99b-d223c877a296" - ], - "properties": { - "min_vf_module_instances": "1", - "vf_module_label": "pxmc_base", - "max_vf_module_instances": "1", - "vfc_list": "", - "vf_module_description": "", - "vf_module_type": "Base", - "availability_zone_count": "", - "volume_group": "false", - "initial_count": "1" - } - }, - { - "vfModuleModelName": "VfZrdm5bpxmc02092017Vf..pxmc_vmt..module-1", - "vfModuleModelInvariantUUID": "1e099992-6222-41a9-acde-5a8abb690775", - "vfModuleModelVersion": "1", - "vfModuleModelUUID": "4d4423e2-17e8-455a-b9ae-7e4ab71b9cdc", - "vfModuleModelCustomizationUUID": "5336a98e-0966-4e59-b6e6-c8162804a024", - "isBase": false, - "artifacts": [ - "ad12ab80-5419-4346-a5d7-dac2fc15575f", - "53acdabe-689f-45e5-8578-f1514d3529da", - "bc1640f1-69f0-4760-8fc3-3318ec2ff129" - ], - "properties": { - "min_vf_module_instances": "0", - "vf_module_label": "pxmc_vmt", - "max_vf_module_instances": "", - "vfc_list": "", - "vf_module_description": "", - "vf_module_type": "Expansion", - "availability_zone_count": "", - "volume_group": "false", - "initial_count": "0" - } - }, - { - "vfModuleModelName": "VfZrdm5bpxmc02092017Vf..pxmc_mmn..module-2", - "vfModuleModelInvariantUUID": "8e53c069-b2f0-437a-9c00-21cbc5c8f081", - "vfModuleModelVersion": "1", - "vfModuleModelUUID": "a8cb1182-9b6d-46f8-b06b-ded4fe69e10d", - "vfModuleModelCustomizationUUID": "e38906fa-717c-49b0-b391-e6ec12b50c4a", - "isBase": false, - "artifacts": [ - "2f372a02-df1b-46ca-b81e-822e3f406965", - "5bc62c72-5f7a-40bc-a167-1a4fed9afdef", - "b8bca13b-811f-44ab-9d27-45b842c664d8", - "c1ae6284-48d9-4437-a195-b2cf2ba23070", - "e88ce0b9-1496-4d03-ab1d-6d8d79bfc737" - ], - "properties": { - "min_vf_module_instances": "0", - "vf_module_label": "pxmc_mmn", - "max_vf_module_instances": "", - "vfc_list": "", - "vf_module_description": "", - "vf_module_type": "Expansion", - "availability_zone_count": "", - "volume_group": "true", - "initial_count": "0" - } - } -] \ No newline at end of file diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetup.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetup.java index ab6ae35ace..b5203c676a 100644 --- a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetup.java +++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetup.java @@ -247,14 +247,18 @@ public class BBInputSetup implements JavaDelegate { org.onap.so.serviceinstancebeans.LineOfBusiness lineOfBusiness = requestDetails.getLineOfBusiness(); if (modelType.equals(ModelType.network)) { + lookupKeyMap.put(ResourceKey.NETWORK_ID, resourceId); this.populateL3Network(instanceName, modelInfo, service, bbName, serviceInstance, lookupKeyMap, resourceId, null); } else if (modelType.equals(ModelType.vnf)) { + lookupKeyMap.put(ResourceKey.GENERIC_VNF_ID, resourceId); this.populateGenericVnf(modelInfo, instanceName, platform, lineOfBusiness, service, bbName, serviceInstance, lookupKeyMap, relatedInstanceList, resourceId, vnfType, null); } else if (modelType.equals(ModelType.volumeGroup)) { + lookupKeyMap.put(ResourceKey.VOLUME_GROUP_ID, resourceId); this.populateVolumeGroup(modelInfo, service, bbName, serviceInstance, lookupKeyMap, resourceId, relatedInstanceList, instanceName, vnfType, null); } else if (modelType.equals(ModelType.vfModule)) { + lookupKeyMap.put(ResourceKey.VF_MODULE_ID, resourceId); this.populateVfModule(modelInfo, service, bbName, serviceInstance, lookupKeyMap, resourceId, relatedInstanceList, instanceName, null, requestDetails.getCloudConfiguration()); } else { @@ -321,8 +325,6 @@ public class BBInputSetup implements JavaDelegate { protected void populateVfModule(ModelInfo modelInfo, Service service, String bbName, ServiceInstance serviceInstance, Map lookupKeyMap, String resourceId, RelatedInstanceList[] relatedInstanceList, String instanceName, List> instanceParams, CloudConfiguration cloudConfiguration) throws Exception { - boolean foundByName = false; - boolean foundById = false; String vnfModelCustomizationUUID = null; if (relatedInstanceList != null) { for (RelatedInstanceList relatedInstList : relatedInstanceList) { @@ -350,29 +352,31 @@ public class BBInputSetup implements JavaDelegate { cloudConfiguration.getLcpCloudRegionId(), volumeGroup.getVolumeGroupId()).getModelCustomizationId(); if(modelInfo.getModelCustomizationId().equalsIgnoreCase(volumeGroupCustId)) { lookupKeyMap.put(ResourceKey.VOLUME_GROUP_ID, volumeGroup.getVolumeGroupId()); + break; } } break; } } if (vnf != null) { - for (VfModule vfModule : vnf.getVfModules()) { + VfModule vfModule = null; + for (VfModule vfModuleTemp : vnf.getVfModules()) { if (lookupKeyMap.get(ResourceKey.VF_MODULE_ID) != null - && vfModule.getVfModuleId().equalsIgnoreCase(lookupKeyMap.get(ResourceKey.VF_MODULE_ID))) { - foundById = true; - this.mapCatalogVfModule(vfModule, modelInfo, service, vnfModelCustomizationUUID); - } else if (instanceName != null && vfModule.getVfModuleName().equalsIgnoreCase(instanceName)) { - foundByName = true; - lookupKeyMap.put(ResourceKey.VF_MODULE_ID, vfModule.getVfModuleId()); - this.mapCatalogVfModule(vfModule, modelInfo, service, vnfModelCustomizationUUID); + && vfModuleTemp.getVfModuleId().equalsIgnoreCase(lookupKeyMap.get(ResourceKey.VF_MODULE_ID))) { + vfModule = vfModuleTemp; + String vfModuleCustId = bbInputSetupUtils.getAAIVfModule(vnf.getVnfId(), vfModule.getVfModuleId()).getModelCustomizationId(); + modelInfo.setModelCustomizationId(vfModuleCustId); + break; } } - if (!foundByName && !foundById && bbName.equalsIgnoreCase(AssignFlows.VF_MODULE.toString())) { - VfModule vfModule = this.createVfModule(lookupKeyMap, + if (vfModule == null && bbName.equalsIgnoreCase(AssignFlows.VF_MODULE.toString())) { + vfModule = createVfModule(lookupKeyMap, resourceId, instanceName, instanceParams); - this.mapCatalogVfModule(vfModule, modelInfo, service, vnfModelCustomizationUUID); vnf.getVfModules().add(vfModule); } + if(vfModule != null) { + mapCatalogVfModule(vfModule, modelInfo, service, vnfModelCustomizationUUID); + } } else { msoLogger.debug("Related VNF instance Id not found: " + lookupKeyMap.get(ResourceKey.GENERIC_VNF_ID)); throw new Exception("Could not find relevant information for related VNF"); @@ -423,48 +427,47 @@ public class BBInputSetup implements JavaDelegate { protected void populateVolumeGroup(ModelInfo modelInfo, Service service, String bbName, ServiceInstance serviceInstance, Map lookupKeyMap, String resourceId, RelatedInstanceList[] relatedInstanceList, String instanceName, String vnfType, List> instanceParams) throws Exception { - boolean foundByName = false; - boolean foundById = false; + VolumeGroup volumeGroup = null; + GenericVnf vnf = null; String vnfModelCustomizationUUID = null; + String generatedVnfType = vnfType; + if (generatedVnfType == null || generatedVnfType.isEmpty()) { + generatedVnfType = service.getModelName() + "/" + modelInfo.getModelCustomizationName(); + } if (relatedInstanceList != null) { for (RelatedInstanceList relatedInstList : relatedInstanceList) { RelatedInstance relatedInstance = relatedInstList.getRelatedInstance(); if (relatedInstance.getModelInfo().getModelType().equals(ModelType.vnf)) { vnfModelCustomizationUUID = relatedInstance.getModelInfo().getModelCustomizationUuid(); + break; } } } - GenericVnf vnf = null; for (GenericVnf tempVnf : serviceInstance.getVnfs()) { if (tempVnf.getVnfId().equalsIgnoreCase(lookupKeyMap.get(ResourceKey.GENERIC_VNF_ID))) { vnf = tempVnf; - vnfModelCustomizationUUID = this.bbInputSetupUtils.getAAIGenericVnf(vnf.getVnfId()) + vnfModelCustomizationUUID = bbInputSetupUtils.getAAIGenericVnf(vnf.getVnfId()) .getModelCustomizationId(); ModelInfo vnfModelInfo = new ModelInfo(); vnfModelInfo.setModelCustomizationUuid(vnfModelCustomizationUUID); - this.mapCatalogVnf(tempVnf, vnfModelInfo, service); + mapCatalogVnf(tempVnf, vnfModelInfo, service); break; } } if (vnf != null && vnfModelCustomizationUUID != null) { - for (VolumeGroup volumeGroup : vnf.getVolumeGroups()) { - if (lookupKeyMap.get(ResourceKey.VOLUME_GROUP_ID) != null && volumeGroup.getVolumeGroupId() + for (VolumeGroup volumeGroupTemp : vnf.getVolumeGroups()) { + if (lookupKeyMap.get(ResourceKey.VOLUME_GROUP_ID) != null && volumeGroupTemp.getVolumeGroupId() .equalsIgnoreCase(lookupKeyMap.get(ResourceKey.VOLUME_GROUP_ID))) { - foundById = true; - this.mapCatalogVolumeGroup(volumeGroup, modelInfo, service, vnfModelCustomizationUUID); - } else if (instanceName != null && volumeGroup.getVolumeGroupName().equalsIgnoreCase(instanceName)) { - foundByName = true; - lookupKeyMap.put(ResourceKey.VOLUME_GROUP_ID, volumeGroup.getVolumeGroupId()); - this.mapCatalogVolumeGroup(volumeGroup, modelInfo, service, vnfModelCustomizationUUID); + volumeGroup = volumeGroupTemp; + break; } } - if (!foundByName && !foundById && bbName.equalsIgnoreCase(AssignFlows.VOLUME_GROUP.toString())) { - if (vnfType == null || vnfType.isEmpty()) { - vnfType = service.getModelName() + "/" + modelInfo.getModelCustomizationName(); - } - VolumeGroup volumeGroup = this.createVolumeGroup(lookupKeyMap, resourceId, instanceName, vnfType, instanceParams); + if (volumeGroup == null && bbName.equalsIgnoreCase(AssignFlows.VOLUME_GROUP.toString())) { + volumeGroup = createVolumeGroup(lookupKeyMap, resourceId, instanceName, generatedVnfType, instanceParams); vnf.getVolumeGroups().add(volumeGroup); - this.mapCatalogVolumeGroup(volumeGroup, modelInfo, service, vnfModelCustomizationUUID); + } + if(volumeGroup != null) { + mapCatalogVolumeGroup(volumeGroup, modelInfo, service, vnfModelCustomizationUUID); } } else { msoLogger.debug("Related VNF instance Id not found: " + lookupKeyMap.get(ResourceKey.GENERIC_VNF_ID)); @@ -522,10 +525,13 @@ public class BBInputSetup implements JavaDelegate { org.onap.so.serviceinstancebeans.LineOfBusiness lineOfBusiness, Service service, String bbName, ServiceInstance serviceInstance, Map lookupKeyMap, RelatedInstanceList[] relatedInstanceList, String resourceId, String vnfType, List> instanceParams) { - boolean foundByName = false; - boolean foundById = false; + GenericVnf vnf = null; ModelInfo instanceGroupModelInfo = null; String instanceGroupId = null; + String generatedVnfType = vnfType; + if (generatedVnfType == null || generatedVnfType.isEmpty()) { + generatedVnfType = service.getModelName() + "/" + modelInfo.getModelCustomizationName(); + } if (relatedInstanceList != null) { for (RelatedInstanceList relatedInstList : relatedInstanceList) { RelatedInstance relatedInstance = relatedInstList.getRelatedInstance(); @@ -535,36 +541,26 @@ public class BBInputSetup implements JavaDelegate { } } } - for (GenericVnf genericVnf : serviceInstance.getVnfs()) { + for (GenericVnf vnfTemp : serviceInstance.getVnfs()) { if (lookupKeyMap.get(ResourceKey.GENERIC_VNF_ID) != null - && genericVnf.getVnfId().equalsIgnoreCase(lookupKeyMap.get(ResourceKey.GENERIC_VNF_ID))) { - foundById = true; - org.onap.aai.domain.yang.GenericVnf vnf = bbInputSetupUtils.getAAIGenericVnf(genericVnf.getVnfId()); - if(vnf!=null){ - modelInfo.setModelCustomizationUuid(vnf.getModelCustomizationId()); - } - this.mapCatalogVnf(genericVnf, modelInfo, service); - } else if (instanceName != null && genericVnf.getVnfName().equalsIgnoreCase(instanceName)) { - foundByName = true; - lookupKeyMap.put(ResourceKey.GENERIC_VNF_ID, genericVnf.getVnfId()); - org.onap.aai.domain.yang.GenericVnf vnf = bbInputSetupUtils.getAAIGenericVnf(genericVnf.getVnfId()); - if(vnf!=null){ - modelInfo.setModelCustomizationUuid(vnf.getModelCustomizationId()); - } - this.mapCatalogVnf(genericVnf, modelInfo, service); + && vnfTemp.getVnfId().equalsIgnoreCase(lookupKeyMap.get(ResourceKey.GENERIC_VNF_ID))) { + String vnfModelCustId = bbInputSetupUtils.getAAIGenericVnf(vnfTemp.getVnfId()).getModelCustomizationId(); + modelInfo.setModelCustomizationUuid(vnfModelCustId); + vnf = vnfTemp; + break; } } - if (!foundByName && !foundById && bbName.equalsIgnoreCase(AssignFlows.VNF.toString())) { - if(vnfType == null || vnfType.isEmpty()) { - vnfType = service.getModelName() + "/" + modelInfo.getModelCustomizationName(); + if (vnf == null && bbName.equalsIgnoreCase(AssignFlows.VNF.toString())) { + vnf = createGenericVnf(lookupKeyMap, instanceName, platform, lineOfBusiness, + resourceId, generatedVnfType, instanceParams); + serviceInstance.getVnfs().add(vnf); + } + if(vnf != null) { + mapCatalogVnf(vnf, modelInfo, service); + mapVnfcCollectionInstanceGroup(vnf, modelInfo, service); + if (instanceGroupId != null && instanceGroupModelInfo != null) { + mapNetworkCollectionInstanceGroup(vnf, instanceGroupId); } - GenericVnf genericVnf = this.createGenericVnf(lookupKeyMap, instanceName, platform, lineOfBusiness, - resourceId, vnfType, instanceParams); - serviceInstance.getVnfs().add(genericVnf); - this.mapCatalogVnf(genericVnf, modelInfo, service); - this.mapVnfcCollectionInstanceGroup(genericVnf, modelInfo, service); - if (instanceGroupId != null && instanceGroupModelInfo != null) - this.mapNetworkCollectionInstanceGroup(genericVnf, instanceGroupId); } } @@ -585,7 +581,7 @@ public class BBInputSetup implements JavaDelegate { } protected void mapNetworkCollectionInstanceGroup(GenericVnf genericVnf, String instanceGroupId) { - org.onap.aai.domain.yang.InstanceGroup aaiInstanceGroup = this.bbInputSetupUtils + org.onap.aai.domain.yang.InstanceGroup aaiInstanceGroup = bbInputSetupUtils .getAAIInstanceGroup(instanceGroupId); InstanceGroup instanceGroup = this.mapperLayer.mapAAIInstanceGroupIntoInstanceGroup(aaiInstanceGroup); instanceGroup.setModelInfoInstanceGroup(this.mapperLayer.mapCatalogInstanceGroupToInstanceGroup( @@ -636,25 +632,22 @@ public class BBInputSetup implements JavaDelegate { protected void populateL3Network(String instanceName, ModelInfo modelInfo, Service service, String bbName, ServiceInstance serviceInstance, Map lookupKeyMap, String resourceId, List> instanceParams) { - boolean foundByName = false; - boolean foundById = false; - for (L3Network network : serviceInstance.getNetworks()) { + L3Network network = null; + for (L3Network networkTemp : serviceInstance.getNetworks()) { if (lookupKeyMap.get(ResourceKey.NETWORK_ID) != null - && network.getNetworkId().equalsIgnoreCase(lookupKeyMap.get(ResourceKey.NETWORK_ID))) { - foundById = true; - this.mapCatalogNetwork(network, modelInfo, service); - } else if (instanceName != null && network.getNetworkName().equalsIgnoreCase(instanceName)) { - foundByName = true; - lookupKeyMap.put(ResourceKey.NETWORK_ID, network.getNetworkId()); - this.mapCatalogNetwork(network, modelInfo, service); + && networkTemp.getNetworkId().equalsIgnoreCase(lookupKeyMap.get(ResourceKey.NETWORK_ID))) { + network = networkTemp; + break; } } - if (!foundByName && !foundById + if (network == null && (bbName.equalsIgnoreCase(AssignFlows.NETWORK_A_LA_CARTE.toString()) || bbName.equalsIgnoreCase(AssignFlows.NETWORK_MACRO.toString()))) { - L3Network l3Network = this.createNetwork(lookupKeyMap, instanceName, resourceId, instanceParams); - serviceInstance.getNetworks().add(l3Network); - this.mapCatalogNetwork(l3Network, modelInfo, service); + network = createNetwork(lookupKeyMap, instanceName, resourceId, instanceParams); + serviceInstance.getNetworks().add(network); + } + if(network != null) { + mapCatalogNetwork(network, modelInfo, service); } } @@ -1496,7 +1489,7 @@ public class BBInputSetup implements JavaDelegate { Relationships relationships = relationshipsOp.get(); this.mapNetworkPolicies(relationships.getByType(AAIObjectType.NETWORK_POLICY), network.getNetworkPolicies()); - this.mapRouteTableReferences(relationships.getByType(AAIObjectType.ROUTE_TABLE_REFERENCE), + mapRouteTableReferences(relationships.getByType(AAIObjectType.ROUTE_TABLE_REFERENCE), network.getContrailNetworkRouteTableReferences()); } diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupMapperLayer.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupMapperLayer.java index abd7ed5a8e..c2161a4fee 100644 --- a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupMapperLayer.java +++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupMapperLayer.java @@ -142,6 +142,10 @@ public class BBInputSetupMapperLayer { protected VfModule mapAAIVfModule(org.onap.aai.domain.yang.VfModule aaiVfModule) { VfModule vfModule = modelMapper.map(aaiVfModule, VfModule.class); vfModule.setOrchestrationStatus(this.mapOrchestrationStatusFromAAI(aaiVfModule.getOrchestrationStatus())); + + ModelInfoVfModule modelInfoVfModule = new ModelInfoVfModule(); + modelInfoVfModule.setIsBaseBoolean(aaiVfModule.isIsBaseVfModule()); + vfModule.setModelInfoVfModule(modelInfoVfModule); return vfModule; } @@ -175,7 +179,7 @@ public class BBInputSetupMapperLayer { protected ModelInfoInstanceGroup mapCatalogInstanceGroupToInstanceGroup(CollectionResourceCustomization collectionCust, InstanceGroup instanceGroup) { ModelInfoInstanceGroup modelInfoInstanceGroup = modelMapper.map(instanceGroup, ModelInfoInstanceGroup.class); - if(instanceGroup.getType().equals(InstanceGroupType.L3_NETWORK)) + if(instanceGroup.getType() != null && instanceGroup.getType().equals(InstanceGroupType.L3_NETWORK)) modelInfoInstanceGroup.setType(ModelInfoInstanceGroup.TYPE_L3_NETWORK); else modelInfoInstanceGroup.setType(ModelInfoInstanceGroup.TYPE_VNFC); @@ -462,4 +466,4 @@ public class BBInputSetupMapperLayer { CollectionNetworkResourceCustomization collectionNetworkResourceCust) { return modelMapper.map(collectionNetworkResourceCust, NetworkResourceCustomization.class); } -} +} \ No newline at end of file diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupUtils.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupUtils.java index 3a88377a51..4b85538428 100644 --- a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupUtils.java +++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupUtils.java @@ -412,4 +412,4 @@ public class BBInputSetupUtils { return Optional.of(volumeGroup); } } -} +} \ No newline at end of file diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupTest.java index daa63044e4..a821d69754 100644 --- a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupTest.java +++ b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupTest.java @@ -658,8 +658,8 @@ public class BBInputSetupTest { public void testPopulateObjectsOnAssignAndCreateFlows() throws Exception { String bbName = AssignFlows.SERVICE_INSTANCE.toString(); String instanceName = "instanceName"; - String resourceId = "123"; String vnfType = "vnfType"; + String resourceId = "networkId"; Service service = Mockito.mock(Service.class); ServiceInstance serviceInstance = Mockito.mock(ServiceInstance.class); RequestDetails requestDetails = Mockito.mock(RequestDetails.class); @@ -675,12 +675,6 @@ public class BBInputSetupTest { doNothing().when(SPY_bbInputSetup).populateL3Network(instanceName, modelInfo, service, bbName, serviceInstance, lookupKeyMap, resourceId, null); - doNothing().when(SPY_bbInputSetup).populateGenericVnf(modelInfo, instanceName, platform, lineOfBusiness, - service, bbName, serviceInstance, lookupKeyMap, relatedInstanceList, resourceId, vnfType, null); - doNothing().when(SPY_bbInputSetup).populateVolumeGroup(modelInfo, service, bbName, serviceInstance, - lookupKeyMap, resourceId, relatedInstanceList, instanceName, vnfType, null); - doNothing().when(SPY_bbInputSetup).populateVfModule(modelInfo, service, bbName, serviceInstance, lookupKeyMap, - resourceId, relatedInstanceList, instanceName, null, cloudConfiguration); doReturn(modelInfo).when(requestDetails).getModelInfo(); doReturn(requestInfo).when(requestDetails).getRequestInfo(); doReturn(instanceName).when(requestInfo).getInstanceName(); @@ -690,36 +684,41 @@ public class BBInputSetupTest { doReturn(cloudConfiguration).when(requestDetails).getCloudConfiguration(); doReturn(ModelType.network).when(modelInfo).getModelType(); - SPY_bbInputSetup.populateObjectsOnAssignAndCreateFlows(requestDetails, service, bbName, serviceInstance, lookupKeyMap, resourceId, vnfType); - verify(SPY_bbInputSetup, times(1)).populateL3Network(instanceName, modelInfo, service, bbName, serviceInstance, lookupKeyMap, resourceId, null); + assertEquals("NetworkId populated", true, lookupKeyMap.get(ResourceKey.NETWORK_ID).equalsIgnoreCase(resourceId)); doReturn(ModelType.vnf).when(modelInfo).getModelType(); - + resourceId = "vnfId"; + doNothing().when(SPY_bbInputSetup).populateGenericVnf(modelInfo, instanceName, platform, lineOfBusiness, + service, bbName, serviceInstance, lookupKeyMap, relatedInstanceList, resourceId, vnfType, null); SPY_bbInputSetup.populateObjectsOnAssignAndCreateFlows(requestDetails, service, bbName, serviceInstance, lookupKeyMap, resourceId, vnfType); - verify(SPY_bbInputSetup, times(1)).populateGenericVnf(modelInfo, instanceName, platform, lineOfBusiness, service, bbName, serviceInstance, lookupKeyMap, relatedInstanceList, resourceId, vnfType, null); + assertEquals("VnfId populated", true, lookupKeyMap.get(ResourceKey.GENERIC_VNF_ID).equalsIgnoreCase(resourceId)); doReturn(ModelType.volumeGroup).when(modelInfo).getModelType(); - + resourceId = "volumeGroupId"; + doNothing().when(SPY_bbInputSetup).populateVolumeGroup(modelInfo, service, bbName, serviceInstance, + lookupKeyMap, resourceId, relatedInstanceList, instanceName, vnfType, null); SPY_bbInputSetup.populateObjectsOnAssignAndCreateFlows(requestDetails, service, bbName, serviceInstance, lookupKeyMap, resourceId, vnfType); - verify(SPY_bbInputSetup, times(1)).populateVolumeGroup(modelInfo, service, bbName, serviceInstance, lookupKeyMap, resourceId, relatedInstanceList, instanceName, vnfType, null); + assertEquals("VolumeGroupId populated", true, lookupKeyMap.get(ResourceKey.VOLUME_GROUP_ID).equalsIgnoreCase(resourceId)); doReturn(ModelType.vfModule).when(modelInfo).getModelType(); - + resourceId = "vfModuleId"; + doNothing().when(SPY_bbInputSetup).populateVfModule(modelInfo, service, bbName, serviceInstance, lookupKeyMap, + resourceId, relatedInstanceList, instanceName, null, cloudConfiguration); SPY_bbInputSetup.populateObjectsOnAssignAndCreateFlows(requestDetails, service, bbName, serviceInstance, lookupKeyMap, resourceId, vnfType); - verify(SPY_bbInputSetup, times(1)).populateVfModule(modelInfo, service, bbName, serviceInstance, lookupKeyMap, resourceId, relatedInstanceList, instanceName, null, cloudConfiguration); + assertEquals("VfModuleId populated", true, lookupKeyMap.get(ResourceKey.VF_MODULE_ID).equalsIgnoreCase(resourceId)); } @Test @@ -946,7 +945,6 @@ public class BBInputSetupTest { vg.setVolumeGroupName("volumeGroupName"); vg.setVolumeGroupId("volumeGroupId"); vnf.getVolumeGroups().add(vg); - vnf.getVolumeGroups().add(vg); serviceInstance.getVnfs().add(vnf); Service service = mapper.readValue( @@ -962,9 +960,10 @@ public class BBInputSetupTest { aaiGenericVnf.setModelCustomizationId("vnfModelCustomizationUUID"); doReturn(aaiGenericVnf).when(SPY_bbInputSetupUtils).getAAIGenericVnf(vnf.getVnfId()); + lookupKeyMap.put(ResourceKey.VOLUME_GROUP_ID, "volumeGroupId"); SPY_bbInputSetup.populateVolumeGroup(modelInfo, service, bbName, serviceInstance, lookupKeyMap, resourceId, requestDetails.getRelatedInstanceList(), reqInfo.getInstanceName(), null, null); - verify(SPY_bbInputSetup, times(2)).mapCatalogVolumeGroup(vg, modelInfo, service, "vnfModelCustomizationUUID"); + verify(SPY_bbInputSetup, times(1)).mapCatalogVolumeGroup(vg, modelInfo, service, "vnfModelCustomizationUUID"); vnf.getVolumeGroups().clear(); SPY_bbInputSetup.populateVolumeGroup(modelInfo, service, bbName, serviceInstance, lookupKeyMap, resourceId, requestDetails.getRelatedInstanceList(), reqInfo.getInstanceName(), null, null); @@ -1023,14 +1022,14 @@ public class BBInputSetupTest { SPY_bbInputSetup.populateL3Network(instanceName, modelInfo, service, bbName, serviceInstance, lookupKeyMap, resourceId, null); - verify(SPY_bbInputSetup, times(2)).mapCatalogNetwork(network, modelInfo, service); + verify(SPY_bbInputSetup, times(1)).mapCatalogNetwork(network, modelInfo, service); instanceName = "networkName2"; L3Network network2 = SPY_bbInputSetup.createNetwork(lookupKeyMap, instanceName, resourceId, null); doReturn(network2).when(SPY_bbInputSetup).createNetwork(lookupKeyMap, instanceName, resourceId, null); SPY_bbInputSetup.populateL3Network(instanceName, modelInfo, service, bbName, serviceInstance, lookupKeyMap, resourceId, null); - verify(SPY_bbInputSetup, times(1)).mapCatalogNetwork(network2, modelInfo, service); + verify(SPY_bbInputSetup, times(2)).mapCatalogNetwork(network2, modelInfo, service); } @Test @@ -1148,8 +1147,15 @@ public class BBInputSetupTest { String resourceId = "123"; doReturn(expectedPlatform).when(bbInputSetupMapperLayer).mapRequestPlatform(platform); doReturn(expectedLineOfBusiness).when(bbInputSetupMapperLayer).mapRequestLineOfBusiness(lineOfBusiness); + org.onap.aai.domain.yang.GenericVnf vnfAAI = new org.onap.aai.domain.yang.GenericVnf(); + vnfAAI.setModelCustomizationId("modelCustId"); + doReturn(vnfAAI).when(SPY_bbInputSetupUtils).getAAIGenericVnf(vnf.getVnfId()); doNothing().when(SPY_bbInputSetup).mapCatalogVnf(vnf, modelInfo, service); - doReturn(null).when(SPY_bbInputSetupUtils).getAAIGenericVnf(any(String.class)); + org.onap.aai.domain.yang.InstanceGroup instanceGroupAAI = new org.onap.aai.domain.yang.InstanceGroup(); + doReturn(instanceGroupAAI).when(SPY_bbInputSetupUtils).getAAIInstanceGroup(any()); + org.onap.so.db.catalog.beans.InstanceGroup catalogInstanceGroup = new org.onap.so.db.catalog.beans.InstanceGroup(); + doReturn(catalogInstanceGroup).when(SPY_bbInputSetupUtils).getCatalogInstanceGroup(any()); + SPY_bbInputSetup.populateGenericVnf(modelInfo, instanceName, platform, lineOfBusiness, service, bbName, serviceInstance, lookupKeyMap, requestDetails.getRelatedInstanceList(), resourceId, vnfType, null); @@ -1157,7 +1163,7 @@ public class BBInputSetupTest { SPY_bbInputSetup.populateGenericVnf(modelInfo, instanceName, platform, lineOfBusiness, service, bbName, serviceInstance, lookupKeyMap, requestDetails.getRelatedInstanceList(), resourceId, vnfType, null); - verify(SPY_bbInputSetup, times(2)).mapCatalogVnf(vnf, modelInfo, service); + verify(SPY_bbInputSetup, times(1)).mapCatalogVnf(vnf, modelInfo, service); instanceName = "vnfName2"; GenericVnf vnf2 = SPY_bbInputSetup.createGenericVnf(lookupKeyMap, instanceName, platform, lineOfBusiness, @@ -1166,11 +1172,14 @@ public class BBInputSetupTest { resourceId, vnfType, null); doNothing().when(SPY_bbInputSetup).mapNetworkCollectionInstanceGroup(vnf2, "{instanceGroupId}"); doNothing().when(SPY_bbInputSetup).mapVnfcCollectionInstanceGroup(vnf2, modelInfo, service); + + lookupKeyMap.put(ResourceKey.GENERIC_VNF_ID, "genericVnfId2"); + SPY_bbInputSetup.populateGenericVnf(modelInfo, instanceName, platform, lineOfBusiness, service, bbName, serviceInstance, lookupKeyMap, requestDetails.getRelatedInstanceList(), resourceId, vnfType, null); - verify(SPY_bbInputSetup, times(1)).mapCatalogVnf(vnf2, modelInfo, service); - verify(SPY_bbInputSetup, times(1)).mapNetworkCollectionInstanceGroup(vnf2, "{instanceGroupId}"); - verify(SPY_bbInputSetup, times(1)).mapVnfcCollectionInstanceGroup(vnf2, modelInfo, service); + verify(SPY_bbInputSetup, times(2)).mapCatalogVnf(vnf2, modelInfo, service); + verify(SPY_bbInputSetup, times(2)).mapNetworkCollectionInstanceGroup(vnf2, "{instanceGroupId}"); + verify(SPY_bbInputSetup, times(2)).mapVnfcCollectionInstanceGroup(vnf2, modelInfo, service); } @Test @@ -1202,7 +1211,14 @@ public class BBInputSetupTest { String resourceId = "123"; doReturn(expectedPlatform).when(bbInputSetupMapperLayer).mapRequestPlatform(platform); doReturn(expectedLineOfBusiness).when(bbInputSetupMapperLayer).mapRequestLineOfBusiness(lineOfBusiness); + org.onap.aai.domain.yang.GenericVnf vnfAAI = new org.onap.aai.domain.yang.GenericVnf(); + vnfAAI.setModelCustomizationId("modelCustId"); + doReturn(vnfAAI).when(SPY_bbInputSetupUtils).getAAIGenericVnf(vnf.getVnfId()); doNothing().when(SPY_bbInputSetup).mapCatalogVnf(vnf, modelInfo, service); + org.onap.aai.domain.yang.InstanceGroup instanceGroupAAI = new org.onap.aai.domain.yang.InstanceGroup(); + doReturn(instanceGroupAAI).when(SPY_bbInputSetupUtils).getAAIInstanceGroup(any()); + org.onap.so.db.catalog.beans.InstanceGroup catalogInstanceGroup = new org.onap.so.db.catalog.beans.InstanceGroup(); + doReturn(catalogInstanceGroup).when(SPY_bbInputSetupUtils).getCatalogInstanceGroup(any()); SPY_bbInputSetup.populateGenericVnf(modelInfo, instanceName, platform, lineOfBusiness, service, bbName, serviceInstance, lookupKeyMap, requestDetails.getRelatedInstanceList(), resourceId, vnfType, null); @@ -1211,20 +1227,24 @@ public class BBInputSetupTest { SPY_bbInputSetup.populateGenericVnf(modelInfo, instanceName, platform, lineOfBusiness, service, bbName, serviceInstance, lookupKeyMap, requestDetails.getRelatedInstanceList(), resourceId, vnfType, null); - verify(SPY_bbInputSetup, times(2)).mapCatalogVnf(vnf, modelInfo, service); + verify(SPY_bbInputSetup, times(1)).mapCatalogVnf(vnf, modelInfo, service); instanceName = "vnfName2"; GenericVnf vnf2 = SPY_bbInputSetup.createGenericVnf(lookupKeyMap, instanceName, platform, lineOfBusiness, resourceId, vnfType, null); doReturn(vnf2).when(SPY_bbInputSetup).createGenericVnf(lookupKeyMap, instanceName, platform, lineOfBusiness, resourceId, vnfType, null); + org.onap.aai.domain.yang.GenericVnf vnf2AAI = new org.onap.aai.domain.yang.GenericVnf(); + vnfAAI.setModelCustomizationId("modelCustId2"); + doReturn(vnf2AAI).when(SPY_bbInputSetupUtils).getAAIGenericVnf(vnf2.getVnfId()); + doNothing().when(SPY_bbInputSetup).mapCatalogVnf(vnf2, modelInfo, service); doNothing().when(SPY_bbInputSetup).mapNetworkCollectionInstanceGroup(vnf2, "{instanceGroupId}"); doNothing().when(SPY_bbInputSetup).mapVnfcCollectionInstanceGroup(vnf2, modelInfo, service); SPY_bbInputSetup.populateGenericVnf(modelInfo, instanceName, platform, lineOfBusiness, service, bbName, serviceInstance, lookupKeyMap, requestDetails.getRelatedInstanceList(), resourceId, vnfType, null); - verify(SPY_bbInputSetup, times(1)).mapCatalogVnf(vnf2, modelInfo, service); - verify(SPY_bbInputSetup, times(1)).mapNetworkCollectionInstanceGroup(vnf2, "{instanceGroupId}"); - verify(SPY_bbInputSetup, times(1)).mapVnfcCollectionInstanceGroup(vnf2, modelInfo, service); + verify(SPY_bbInputSetup, times(2)).mapCatalogVnf(vnf2, modelInfo, service); + verify(SPY_bbInputSetup, times(2)).mapNetworkCollectionInstanceGroup(vnf2, "{instanceGroupId}"); + verify(SPY_bbInputSetup, times(2)).mapVnfcCollectionInstanceGroup(vnf2, modelInfo, service); } @Test diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupUtilsTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupUtilsTest.java index db0f408010..aa883b67a2 100644 --- a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupUtilsTest.java +++ b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetupUtilsTest.java @@ -773,4 +773,4 @@ public class BBInputSetupUtilsTest { assertEquals(actualVolumeGroup, Optional.empty()); } -} +} \ No newline at end of file diff --git a/bpmn/MSOCommonBPMN/src/test/resources/__files/ExecuteBuildingBlock/GenericVnfExpected.json b/bpmn/MSOCommonBPMN/src/test/resources/__files/ExecuteBuildingBlock/GenericVnfExpected.json index 0d00e4d007..e4c8a8f59b 100644 --- a/bpmn/MSOCommonBPMN/src/test/resources/__files/ExecuteBuildingBlock/GenericVnfExpected.json +++ b/bpmn/MSOCommonBPMN/src/test/resources/__files/ExecuteBuildingBlock/GenericVnfExpected.json @@ -12,7 +12,9 @@ "heat-stack-id":"heatStackId", "contrail-service-instance-fqdn":"contrailServiceInstanceFqdn", "module-index":1,"selflink":"selflink", - "model-info-vf-module":null + "model-info-vf-module": { + "is-base-boolean":false + } }], "volume-groups":[], "line-of-business":null, diff --git a/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/CreateVfModuleBB.bpmn b/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/CreateVfModuleBB.bpmn index 3d18810e48..abc017c957 100644 --- a/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/CreateVfModuleBB.bpmn +++ b/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/CreateVfModuleBB.bpmn @@ -23,21 +23,27 @@ SequenceFlow_1s4rpyp - + + SequenceFlow_16g4dz0 SequenceFlow_0ecr393 - SequenceFlow_0ecr393 + SequenceFlow_0qqsilv SequenceFlow_1stomxq + + + SequenceFlow_0ecr393 + SequenceFlow_0qqsilv + @@ -58,9 +64,9 @@ - + - + @@ -92,23 +98,33 @@ - + - + - - + + - + - + + + + + + + + + + + diff --git a/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/CreateVolumeGroupBB.bpmn b/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/CreateVolumeGroupBB.bpmn index 58a429dcc5..a95dc9ce73 100644 --- a/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/CreateVolumeGroupBB.bpmn +++ b/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/CreateVolumeGroupBB.bpmn @@ -1,5 +1,5 @@ - + SequenceFlow_1wz1rfg @@ -14,7 +14,7 @@ - SequenceFlow_06flg6h + SequenceFlow_1d5nux2 SequenceFlow_0mh0v9h @@ -28,11 +28,17 @@ + SequenceFlow_0kfkpbh SequenceFlow_06flg6h - + + + + SequenceFlow_06flg6h + SequenceFlow_1d5nux2 + @@ -52,9 +58,9 @@ - + - + @@ -68,13 +74,13 @@ - + - - + + - + @@ -92,11 +98,21 @@ - + - + + + + + + + + + + + diff --git a/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/DeleteVfModuleBB.bpmn b/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/DeleteVfModuleBB.bpmn index 755bfe8126..07d0b18938 100644 --- a/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/DeleteVfModuleBB.bpmn +++ b/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/DeleteVfModuleBB.bpmn @@ -24,6 +24,7 @@ + SequenceFlow_08tvhtf SequenceFlow_02lpx87 diff --git a/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/UnassignNetwork1802BB.bpmn b/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/UnassignNetwork1802BB.bpmn index bd6b124175..212e735dd1 100644 --- a/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/UnassignNetwork1802BB.bpmn +++ b/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/UnassignNetwork1802BB.bpmn @@ -11,18 +11,13 @@ SequenceFlow_1ks8kmt - + - SequenceFlow_1gd5h4c + SequenceFlow_0zaz9o2 SequenceFlow_0mxe1a7 - - - SequenceFlow_0zaz9o2 - SequenceFlow_1gd5h4c - SequenceFlow_0mxe1a7 @@ -32,9 +27,9 @@ - + - + @@ -47,10 +42,10 @@ - - + + - + @@ -70,16 +65,6 @@ - - - - - - - - - - diff --git a/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/CreateVfModuleBBTest.java b/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/CreateVfModuleBBTest.java index a3c6a820bd..a94a4bb89a 100644 --- a/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/CreateVfModuleBBTest.java +++ b/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/CreateVfModuleBBTest.java @@ -42,6 +42,7 @@ public class CreateVfModuleBBTest extends BaseBPMNTest{ "QueryVfModule", "CreateVfModule", "VnfAdapter", + "UpdateVfModuleHeatStackId", "UpdateVfModuleStatus", "CreateVfModuleBB_End"); assertThat(pi).isEnded(); @@ -54,7 +55,7 @@ public class CreateVfModuleBBTest extends BaseBPMNTest{ assertThat(pi).isNotNull(); assertThat(pi).isStarted() .hasPassedInOrder("CreateVfModuleBB_Start", "QueryVnf") - .hasNotPassed("QueryVfModule", "CreateVfModule", "VnfAdapter", "UpdateVfModuleStatus", "CreateVfModuleBB_End"); + .hasNotPassed("QueryVfModule", "CreateVfModule", "VnfAdapter", "UpdateVfModuleHeatStackId", "UpdateVfModuleStatus", "CreateVfModuleBB_End"); assertThat(pi).isEnded(); } @@ -65,7 +66,7 @@ public class CreateVfModuleBBTest extends BaseBPMNTest{ assertThat(pi).isNotNull(); assertThat(pi).isStarted() .hasPassedInOrder("CreateVfModuleBB_Start", "QueryVnf", "QueryVfModule") - .hasNotPassed("CreateVfModule", "VnfAdapter", "UpdateVfModuleStatus", "CreateVfModuleBB_End"); + .hasNotPassed("CreateVfModule", "VnfAdapter", "UpdateVfModuleHeatStackId", "UpdateVfModuleStatus", "CreateVfModuleBB_End"); assertThat(pi).isEnded(); } @@ -76,10 +77,24 @@ public class CreateVfModuleBBTest extends BaseBPMNTest{ assertThat(pi).isNotNull(); assertThat(pi).isStarted() .hasPassedInOrder("CreateVfModuleBB_Start", "QueryVnf", "QueryVfModule", "CreateVfModule") - .hasNotPassed("VnfAdapter", "UpdateVfModuleStatus", "CreateVfModuleBB_End"); + .hasNotPassed("VnfAdapter", "UpdateVfModuleHeatStackId", "UpdateVfModuleStatus", "CreateVfModuleBB_End"); assertThat(pi).isEnded(); } + @Test + public void rainyDayCreateVfModuleUpdateVfModuleHeatStackIdError_Test() throws Exception { + mockSubprocess("VnfAdapter", "Mocked VnfAdapter", "GenericStub"); + + doThrow(new BpmnError("7000", "TESTING ERRORS")).when(aaiUpdateTasks).updateHeatStackIdVfModule(any(BuildingBlockExecution.class)); + ProcessInstance pi = runtimeService.startProcessInstanceByKey("CreateVfModuleBB", variables); + assertThat(pi).isNotNull(); + assertThat(pi).isStarted() + .hasPassedInOrder("CreateVfModuleBB_Start", "QueryVnf", "QueryVfModule", "CreateVfModule", "VnfAdapter", "UpdateVfModuleHeatStackId") + .hasNotPassed("UpdateVfModuleStatus", "CreateVfModuleBB_End"); + assertThat(pi).isEnded(); + + } + @Test public void rainyDayCreateVfModuleUpdateVfModuleStatusError_Test() throws Exception { mockSubprocess("VnfAdapter", "Mocked VnfAdapter", "GenericStub"); @@ -87,7 +102,7 @@ public class CreateVfModuleBBTest extends BaseBPMNTest{ ProcessInstance pi = runtimeService.startProcessInstanceByKey("CreateVfModuleBB", variables); assertThat(pi).isNotNull(); assertThat(pi).isStarted() - .hasPassedInOrder("CreateVfModuleBB_Start", "QueryVnf", "QueryVfModule", "CreateVfModule", "VnfAdapter", "UpdateVfModuleStatus") + .hasPassedInOrder("CreateVfModuleBB_Start", "QueryVnf", "QueryVfModule", "CreateVfModule", "VnfAdapter", "UpdateVfModuleHeatStackId", "UpdateVfModuleStatus") .hasNotPassed("CreateVfModuleBB_End"); assertThat(pi).isEnded(); } diff --git a/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/CreateVolumeGroupBBTest.java b/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/CreateVolumeGroupBBTest.java index 980e609e97..eb372fb6a7 100644 --- a/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/CreateVolumeGroupBBTest.java +++ b/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/CreateVolumeGroupBBTest.java @@ -36,7 +36,7 @@ public class CreateVolumeGroupBBTest extends BaseBPMNTest{ mockSubprocess("VnfAdapter", "Mocked VnfAdapter", "GenericStub"); ProcessInstance pi = runtimeService.startProcessInstanceByKey("CreateVolumeGroupBB", variables); assertThat(pi).isNotNull(); - assertThat(pi).isStarted(); + assertThat(pi).isStarted().hasPassedInOrder("CreateVolumeGroupBB_Start", "QueryVfModuleSDNC", "CreateVolumeGroupVnfAdapter", "Vnf_Adapter", "UpdateVolumeGroupHeatStackId", "UpdateVolumeGroupAAI", "CreateVolumeGroupBB_End"); assertThat(pi).isEnded(); assertThat(pi).hasPassedInOrder("CreateVolumeGroupBB_Start", "QueryVfModuleSDNC", "CreateVolumeGroupVnfAdapter", "Vnf_Adapter","UpdateVolumeGroupAAI", "CreateVolumeGroupBB_End"); } @@ -46,7 +46,20 @@ public class CreateVolumeGroupBBTest extends BaseBPMNTest{ doThrow(new BpmnError("7000", "TESTING ERRORS")).when(vnfAdapterCreateTasks).createVolumeGroupRequest(any(BuildingBlockExecution.class)); ProcessInstance pi = runtimeService.startProcessInstanceByKey("CreateVolumeGroupBB", variables); assertThat(pi).isNotNull(); - assertThat(pi).isStarted(); + assertThat(pi).isStarted() + .hasPassedInOrder("CreateVolumeGroupBB_Start", "QueryVfModuleSDNC", "CreateVolumeGroupVnfAdapter") + .hasNotPassed("UpdateVolumeGroupHeatStackId", "UpdateVolumeGroupAAI", "CreateVolumeGroupBB_End"); + assertThat(pi).isEnded(); + } + + @Test + public void rainyDayCreateVolumeGroupUpdateHeatStackIdError_Test() throws Exception { + doThrow(new BpmnError("7000", "TESTING ERRORS")).when(aaiUpdateTasks).updateHeatStackIdVolumeGroup(any(BuildingBlockExecution.class)); + ProcessInstance pi = runtimeService.startProcessInstanceByKey("CreateVolumeGroupBB", variables); + assertThat(pi).isNotNull(); + assertThat(pi).isStarted() + .hasPassedInOrder("CreateVolumeGroupBB_Start", "QueryVfModuleSDNC", "CreateVolumeGroupVnfAdapter", "Vnf_Adapter") + .hasNotPassed("UpdateVolumeGroupAAI", "CreateVolumeGroupBB_End"); assertThat(pi).isEnded(); assertThat(pi).hasPassedInOrder("CreateVolumeGroupBB_Start", "QueryVfModuleSDNC", "CreateVolumeGroupVnfAdapter") .hasNotPassed("Vnf_Adapter", "UpdateVolumeGroupAAI", "CreateVolumeGroupBB_End"); diff --git a/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/UnassignNetwork1802BBTest.java b/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/UnassignNetwork1802BBTest.java index ad374e3304..2c5381de09 100644 --- a/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/UnassignNetwork1802BBTest.java +++ b/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/UnassignNetwork1802BBTest.java @@ -36,7 +36,7 @@ public class UnassignNetwork1802BBTest extends BaseBPMNTest { public void sunnyDayAssignNetwork_Test() throws InterruptedException { ProcessInstance pi = runtimeService.startProcessInstanceByKey("UnassignNetwork1802BB",variables); assertThat(pi).isNotNull(); - assertThat(pi).isStarted().hasPassedInOrder("Start_UnassignNetworkBB","Task_GetL3NetworkById","Task_VfModuleRelatioship","Task_GetCloudRegionVersion","Task_SNDCUnAssign","End_UnassignNetworkBB"); + assertThat(pi).isStarted().hasPassedInOrder("Start_UnassignNetworkBB","Task_VfModuleRelatioship","Task_GetCloudRegionVersion","Task_SNDCUnAssign","End_UnassignNetworkBB"); assertThat(pi).isEnded(); } @@ -46,8 +46,8 @@ public class UnassignNetwork1802BBTest extends BaseBPMNTest { ProcessInstance pi = runtimeService.startProcessInstanceByKey("UnassignNetwork1802BB", variables); assertThat(pi).isNotNull(); assertThat(pi).isStarted() - .hasPassedInOrder("Start_UnassignNetworkBB", "Task_GetL3NetworkById", "Task_VfModuleRelatioship") + .hasPassedInOrder("Start_UnassignNetworkBB", "Task_VfModuleRelatioship") .hasNotPassed("End_UnassignNetworkBB"); assertThat(pi).isEnded(); } -} +} \ No newline at end of file diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoUpdateVnfAndModules.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoUpdateVnfAndModules.groovy index 34a73bd35c..6b42406883 100644 --- a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoUpdateVnfAndModules.groovy +++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoUpdateVnfAndModules.groovy @@ -304,19 +304,22 @@ class DoUpdateVnfAndModules extends AbstractServiceTaskProcessor { VnfResource vnfResource = (VnfResource) execution.getVariable("vnfResourceDecomposition") List moduleResources = vnfResource.getVfModules() - for (j in 0..moduleResources.size()-1) { - ModelInfo modelInfo = moduleResources[j].getModelInfo() - String modelInvariantUuidFromDecomposition = modelInfo.getModelInvariantUuid() - msoLogger.debug("modelInvariantUuidFromDecomposition: " + modelInvariantUuidFromDecomposition) - - if (modelInvariantUuid.equals(modelInvariantUuidFromDecomposition)) { - String vfModuleModelInfo = modelInfo.toJsonString() - String vfModuleModelInfoValue = jsonUtil.getJsonValue(vfModuleModelInfo, "modelInfo") - execution.setVariable("DUVAM_vfModuleModelInfo", vfModuleModelInfoValue) - msoLogger.debug("vfModuleModelInfo: " + vfModuleModelInfoValue) - break + if (moduleResources != null && !moduleResources.isEmpty()) { + + for (j in 0..moduleResources.size()-1) { + ModelInfo modelInfo = moduleResources[j].getModelInfo() + String modelInvariantUuidFromDecomposition = modelInfo.getModelInvariantUuid() + msoLogger.debug("modelInvariantUuidFromDecomposition: " + modelInvariantUuidFromDecomposition) + + if (modelInvariantUuid.equals(modelInvariantUuidFromDecomposition)) { + String vfModuleModelInfo = modelInfo.toJsonString() + String vfModuleModelInfoValue = jsonUtil.getJsonValue(vfModuleModelInfo, "modelInfo") + execution.setVariable("DUVAM_vfModuleModelInfo", vfModuleModelInfoValue) + msoLogger.debug("vfModuleModelInfo: " + vfModuleModelInfoValue) + break + } + } - } }catch(Exception e){ diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIUpdateTasks.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIUpdateTasks.java index 074652e221..9c1fba62e9 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIUpdateTasks.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIUpdateTasks.java @@ -141,6 +141,19 @@ public class AAIUpdateTasks { } } + public void updateHeatStackIdVolumeGroup(BuildingBlockExecution execution) { + try { + GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock(); + + VolumeGroup volumeGroup = extractPojosForBB.extractByKey(execution, ResourceKey.VOLUME_GROUP_ID, execution.getLookupMap().get(ResourceKey.VOLUME_GROUP_ID)); + CloudRegion cloudRegion = gBBInput.getCloudRegion(); + + aaiVolumeGroupResources.updateHeatStackIdVolumeGroup(volumeGroup, cloudRegion); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + public void updateOrchestrationStatusAssignedVfModule(BuildingBlockExecution execution) { try { VfModule vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID, execution.getLookupMap().get(ResourceKey.VF_MODULE_ID)); @@ -281,6 +294,16 @@ public class AAIUpdateTasks { } } + public void updateHeatStackIdVfModule(BuildingBlockExecution execution) { + try { + VfModule vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID, execution.getLookupMap().get(ResourceKey.VF_MODULE_ID)); + GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID)); + aaiVfModuleResources.updateHeatStackIdVfModule(vfModule, vnf); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + /** * BPMN access method to update L3Network after it was created in AIC * @param execution diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/UnassignNetworkBB.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/UnassignNetworkBB.java index f94b967643..c45a47bc12 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/UnassignNetworkBB.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/UnassignNetworkBB.java @@ -23,8 +23,12 @@ package org.onap.so.bpmn.infrastructure.flowspecific.tasks; import java.util.Optional; import org.onap.so.bpmn.common.BuildingBlockExecution; +import org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network; +import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey; +import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB; import org.onap.so.client.aai.entities.AAIResultWrapper; import org.onap.so.client.exception.ExceptionBuilder; +import org.onap.so.client.orchestration.AAINetworkResources; import org.onap.so.logger.MsoLogger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -42,6 +46,12 @@ public class UnassignNetworkBB { @Autowired private NetworkBBUtils networkBBUtils; + + @Autowired + private ExtractPojosForBB extractPojosForBB; + + @Autowired + private AAINetworkResources aaiNetworkResources; /** * BPMN access method to prepare overall error messages. @@ -54,9 +64,11 @@ public class UnassignNetworkBB { public void checkRelationshipRelatedTo(BuildingBlockExecution execution, String relatedToValue) throws Exception { try { - AAIResultWrapper aaiResultWrapper = execution.getVariable("l3NetworkAAIResultWrapper"); - Optional l3network = aaiResultWrapper.asBean(org.onap.aai.domain.yang.L3Network.class); - if (networkBBUtils.isRelationshipRelatedToExists(l3network, relatedToValue)) { + L3Network l3network = extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID, + execution.getLookupMap().get(ResourceKey.NETWORK_ID)); + AAIResultWrapper aaiResultWrapper = aaiNetworkResources.queryNetworkWrapperById(l3network); + Optional network = aaiResultWrapper.asBean(org.onap.aai.domain.yang.L3Network.class); + if (networkBBUtils.isRelationshipRelatedToExists(network, relatedToValue)) { String msg = MESSAGE_CANNOT_PERFORM_UNASSIGN + relatedToValue; execution.setVariable("ErrorUnassignNetworkBB", msg); exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg); diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/vnf/mapper/VnfAdapterVfModuleObjectMapper.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/vnf/mapper/VnfAdapterVfModuleObjectMapper.java index 5f922e0c99..1d87b70754 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/vnf/mapper/VnfAdapterVfModuleObjectMapper.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/vnf/mapper/VnfAdapterVfModuleObjectMapper.java @@ -187,7 +187,9 @@ public class VnfAdapterVfModuleObjectMapper { paramsMap.put("vf_module_id", vfModule.getVfModuleId()); paramsMap.put("vf_module_name", vfModule.getVfModuleName()); paramsMap.put("environment_context",serviceInstance.getModelInfoServiceInstance().getEnvironmentContext()); + paramsMap.putIfAbsent("environment_context", ""); paramsMap.put("workload_context", serviceInstance.getModelInfoServiceInstance().getWorkloadContext()); + paramsMap.putIfAbsent("workload_context", ""); Integer vfModuleIndex = vfModule.getModuleIndex(); if (vfModuleIndex != null) { paramsMap.put("vf_module_index", vfModuleIndex.toString()); diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIVfModuleResources.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIVfModuleResources.java index 7fef56d965..a641d43ba3 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIVfModuleResources.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIVfModuleResources.java @@ -67,6 +67,15 @@ public class AAIVfModuleResources { injectionHelper.getAaiClient().update(vfModuleURI, aaiVfModule); } + public void updateHeatStackIdVfModule(VfModule vfModule, GenericVnf vnf) { + AAIResourceUri vfModuleURI = AAIUriFactory.createResourceUri(AAIObjectType.VF_MODULE, vnf.getVnfId(), vfModule.getVfModuleId()); + VfModule copiedVfModule = vfModule.shallowCopyId(); + + copiedVfModule.setHeatStackId(vfModule.getHeatStackId()); + org.onap.aai.domain.yang.VfModule aaiVfModule = aaiObjectMapper.mapVfModule(copiedVfModule); + injectionHelper.getAaiClient().update(vfModuleURI, aaiVfModule); + } + public void changeAssignVfModule(VfModule vfModule, GenericVnf vnf) { AAIResourceUri vfModuleURI = AAIUriFactory.createResourceUri(AAIObjectType.VF_MODULE, vnf.getVnfId(), vfModule.getVfModuleId()); org.onap.aai.domain.yang.VfModule AAIVfModule = aaiObjectMapper.mapVfModule(vfModule); diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIVolumeGroupResources.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIVolumeGroupResources.java index 70c6724921..af97e55c14 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIVolumeGroupResources.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIVolumeGroupResources.java @@ -74,4 +74,12 @@ public class AAIVolumeGroupResources { AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.VOLUME_GROUP, cloudRegion.getCloudOwner(), cloudRegion.getLcpCloudRegionId(), volumeGroup.getVolumeGroupId()); injectionHelper.getAaiClient().delete(uri); } + + public void updateHeatStackIdVolumeGroup(VolumeGroup volumeGroup, CloudRegion cloudRegion) { + AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.VOLUME_GROUP, cloudRegion.getCloudOwner(), cloudRegion.getLcpCloudRegionId(), volumeGroup.getVolumeGroupId()); + VolumeGroup copiedVolumeGroup = volumeGroup.shallowCopyId(); + + copiedVolumeGroup.setHeatStackId(volumeGroup.getHeatStackId()); + injectionHelper.getAaiClient().update(uri, aaiObjectMapper.mapVolumeGroup(copiedVolumeGroup)); + } } diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/mapper/ServiceTopologyOperationMapper.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/mapper/ServiceTopologyOperationMapper.java index 20c95dd55e..5b23707cb9 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/mapper/ServiceTopologyOperationMapper.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/mapper/ServiceTopologyOperationMapper.java @@ -54,7 +54,7 @@ public class ServiceTopologyOperationMapper{ GenericResourceApiServiceinformationServiceInformation servInfo = generalTopologyObjectMapper.buildServiceInformation(serviceInstance, requestContext, customer, true); GenericResourceApiServicerequestinputServiceRequestInput servReqInfo = new GenericResourceApiServicerequestinputServiceRequestInput(); - servReqInfo.setServiceInstanceName(serviceInstance.getServiceInstanceId()); + servReqInfo.setServiceInstanceName(serviceInstance.getServiceInstanceName()); servOpInput.setSdncRequestHeader(sdncRequestHeader); servOpInput.setRequestInformation(reqInfo); @@ -64,7 +64,7 @@ public class ServiceTopologyOperationMapper{ if(requestContext.getUserParams()!=null){ for (Map.Entry entry : requestContext.getUserParams().entrySet()) { GenericResourceApiServicerequestinputServiceRequestInput serviceRequestInput = new GenericResourceApiServicerequestinputServiceRequestInput(); - serviceRequestInput.setServiceInstanceName(serviceInstance.getServiceInstanceId()); + serviceRequestInput.setServiceInstanceName(serviceInstance.getServiceInstanceName()); GenericResourceApiParam serviceInputParameters = new GenericResourceApiParam(); GenericResourceApiParamParam paramItem = new GenericResourceApiParamParam(); paramItem.setName(entry.getKey()); diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIUpdateTasksTest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIUpdateTasksTest.java index 6ad263a935..c9433a6212 100644 --- a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIUpdateTasksTest.java +++ b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIUpdateTasksTest.java @@ -202,6 +202,24 @@ public class AAIUpdateTasksTest extends BaseTaskTest{ aaiUpdateTasks.updateOrchestrationStatusDeactivateVfModule(execution); } + @Test + public void updateHeatStackIdVfModuleTest() throws Exception { + doNothing().when(aaiVfModuleResources).updateHeatStackIdVfModule(vfModule, genericVnf); + + aaiUpdateTasks.updateHeatStackIdVfModule(execution); + + verify(aaiVfModuleResources, times(1)).updateHeatStackIdVfModule(vfModule, genericVnf); + } + + @Test + public void updateHeatStackIdVfModuleExceptionTest() throws Exception { + doThrow(Exception.class).when(aaiVfModuleResources).updateHeatStackIdVfModule(vfModule, genericVnf); + + expectedException.expect(BpmnError.class); + + aaiUpdateTasks.updateHeatStackIdVfModule(execution); + } + @Test public void updateOrchestrationStatusActiveVolumeGroupTest() throws Exception { doNothing().when(aaiVolumeGroupResources).updateOrchestrationStatusVolumeGroup(volumeGroup, cloudRegion, OrchestrationStatus.ACTIVE); @@ -249,7 +267,23 @@ public class AAIUpdateTasksTest extends BaseTaskTest{ expectedException.expect(BpmnError.class); doThrow(Exception.class).when(aaiVolumeGroupResources).updateOrchestrationStatusVolumeGroup(volumeGroup, cloudRegion, OrchestrationStatus.ASSIGNED); aaiUpdateTasks.updateOrchestrationStatusAssignedVolumeGroup(execution); - } + } + @Test + public void updateHeatStackIdVolumeGroupTest() throws Exception { + doNothing().when(aaiVolumeGroupResources).updateHeatStackIdVolumeGroup(volumeGroup, cloudRegion); + + aaiUpdateTasks.updateHeatStackIdVolumeGroup(execution); + + verify(aaiVolumeGroupResources, times(1)).updateHeatStackIdVolumeGroup(volumeGroup, cloudRegion); + } + + @Test + public void updateHeatStackIdVolumeGroupExceptionTest() throws Exception { + expectedException.expect(BpmnError.class); + doThrow(Exception.class).when(aaiVolumeGroupResources).updateHeatStackIdVolumeGroup(volumeGroup, cloudRegion); + aaiUpdateTasks.updateHeatStackIdVolumeGroup(execution); + } + @Test public void updateOstatusAssignedNetworkTest() throws Exception { doNothing().when(aaiNetworkResources).updateNetwork(network); diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/UnassignNetworkBBTest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/UnassignNetworkBBTest.java index 6a117902ea..32c285b0fe 100644 --- a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/UnassignNetworkBBTest.java +++ b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/UnassignNetworkBBTest.java @@ -20,48 +20,58 @@ package org.onap.so.bpmn.infrastructure.flowspecific.tasks; +import static org.hamcrest.CoreMatchers.notNullValue; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; +import static org.mockito.Mockito.doReturn; import java.nio.file.Files; import java.nio.file.Paths; +import java.util.Optional; import org.camunda.bpm.engine.delegate.BpmnError; import org.junit.Test; +import org.mockito.Mock; import org.onap.so.bpmn.BaseTaskTest; import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion; +import org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network; +import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey; +import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB; import org.onap.so.client.aai.entities.AAIResultWrapper; import org.springframework.beans.factory.annotation.Autowired; public class UnassignNetworkBBTest extends BaseTaskTest { + + @Mock + private NetworkBBUtils networkBBUtils; + @Mock + private ExtractPojosForBB extractPojosForBB; @Autowired private UnassignNetworkBB unassignNetworkBB; private final static String JSON_FILE_LOCATION = "src/test/resources/__files/BuildingBlocks/Network/"; + private L3Network network; @Test public void checkRelationshipRelatedToTrueTest() throws Exception { expectedException.expect(BpmnError.class); + network = setL3Network(); + network.setNetworkId("testNetworkId1"); final String aaiResponse = new String(Files.readAllBytes(Paths.get(JSON_FILE_LOCATION + "unassignNetworkBB_queryAAIResponse_.json"))); AAIResultWrapper aaiResultWrapper = new AAIResultWrapper(aaiResponse); - execution.setVariable("l3NetworkAAIResultWrapper", aaiResultWrapper); - + Optional l3network = aaiResultWrapper.asBean(org.onap.aai.domain.yang.L3Network.class); + doReturn(network).when(extractPojosForBB).extractByKey(execution, ResourceKey.NETWORK_ID, "testNetworkId1"); + doReturn(aaiResultWrapper).when(aaiNetworkResources).queryNetworkWrapperById(network); + doReturn(true).when(networkBBUtils).isRelationshipRelatedToExists(l3network, "vf-module"); unassignNetworkBB.checkRelationshipRelatedTo(execution, "vf-module"); - } - - @Test - public void checkRelationshipRelatedToFalseTest() throws Exception { - final String aaiResponse = new String(Files.readAllBytes(Paths.get(JSON_FILE_LOCATION + "unassignNetworkBB_queryAAIResponse_.json"))); - AAIResultWrapper aaiResultWrapper = new AAIResultWrapper(aaiResponse); - execution.setVariable("l3NetworkAAIResultWrapper", aaiResultWrapper); - - unassignNetworkBB.checkRelationshipRelatedTo(execution, "kfc-module"); - //expected result is no exception + assertThat(execution.getVariable("ErrorUnassignNetworkBB"), notNullValue()); } @Test public void getCloudSdncRegion25Test() throws Exception { CloudRegion cloudRegion = setCloudRegion(); cloudRegion.setCloudRegionVersion("2.5"); + doReturn("AAIAIC25").when(networkBBUtils).getCloudRegion(execution, SourceSystem.SDNC); unassignNetworkBB.getCloudSdncRegion(execution); assertEquals("AAIAIC25", execution.getVariable("cloudRegionSdnc")); } @@ -71,6 +81,7 @@ public class UnassignNetworkBBTest extends BaseTaskTest { CloudRegion cloudRegion = setCloudRegion(); cloudRegion.setCloudRegionVersion("3.0"); gBBInput.setCloudRegion(cloudRegion); + doReturn(cloudRegion.getLcpCloudRegionId()).when(networkBBUtils).getCloudRegion(execution, SourceSystem.SDNC); unassignNetworkBB.getCloudSdncRegion(execution); assertEquals(cloudRegion.getLcpCloudRegionId(), execution.getVariable("cloudRegionSdnc")); } diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/adapter/vnf/mapper/VnfAdapterVfModuleObjectMapperPayloadTest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/adapter/vnf/mapper/VnfAdapterVfModuleObjectMapperPayloadTest.java index 9c51ee8006..1bb59e7b8d 100644 --- a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/adapter/vnf/mapper/VnfAdapterVfModuleObjectMapperPayloadTest.java +++ b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/adapter/vnf/mapper/VnfAdapterVfModuleObjectMapperPayloadTest.java @@ -128,6 +128,76 @@ public class VnfAdapterVfModuleObjectMapperPayloadTest { assertThat(vfModuleVNFAdapterRequest, sameBeanAs(reqMapper1).ignoring("messageId").ignoring("notificationUrl")); } + @Test + public void createVfModuleRequestWithNoEnvironmentAndWorkloadContextMapperTest() throws Exception { + + // prepare and set service instance + ServiceInstance serviceInstance = new ServiceInstance(); + serviceInstance.setServiceInstanceId("serviceInstanceId"); + ModelInfoServiceInstance modelInfoServiceInstance = new ModelInfoServiceInstance(); + modelInfoServiceInstance.setModelInvariantUuid("serviceModelInvariantUuid"); + modelInfoServiceInstance.setModelName("serviceModelName"); + modelInfoServiceInstance.setModelUuid("serviceModelUuid"); + modelInfoServiceInstance.setModelVersion("serviceModelVersion"); + modelInfoServiceInstance.setEnvironmentContext(null); + serviceInstance.setModelInfoServiceInstance(modelInfoServiceInstance); + + RequestContext requestContext = new RequestContext(); + HashMap userParams = new HashMap(); + userParams.put("key1", "value2"); + requestContext.setMsoRequestId("requestId"); + requestContext.setUserParams(userParams); + requestContext.setProductFamilyId("productFamilyId"); + + GenericVnf vnf = new GenericVnf(); + vnf.setVnfId("vnfId"); + vnf.setVnfType("vnfType"); + vnf.setVnfName("vnfName"); + ModelInfoGenericVnf modelInfoGenericVnf = new ModelInfoGenericVnf(); + modelInfoGenericVnf.setModelInvariantUuid("vnfModelInvariantUuid"); + modelInfoGenericVnf.setModelName("vnfModelName"); + modelInfoGenericVnf.setModelVersion("vnfModelVersion"); + modelInfoGenericVnf.setModelUuid("vnfModelUuid"); + modelInfoGenericVnf.setModelCustomizationUuid("vnfModelCustomizationUuid"); + vnf.setModelInfoGenericVnf(modelInfoGenericVnf); + + Integer vfModuleIndex = 1; + VfModule vfModule = new VfModule(); + vfModule.setVfModuleId("vfModuleId"); + vfModule.setVfModuleName("vfModuleName"); + vfModule.setModuleIndex(vfModuleIndex); + ModelInfoVfModule modelInfoVfModule = new ModelInfoVfModule(); + modelInfoVfModule.setModelInvariantUUID("vfModuleModelInvariantUuid"); + modelInfoVfModule.setModelName("vfModuleModelName"); + modelInfoVfModule.setModelVersion("vfModuleModelVersion"); + modelInfoVfModule.setModelUUID("vfModuleModelUuid"); + modelInfoVfModule.setModelCustomizationUUID("vfModuleModelCustomizationUuid"); + vfModule.setModelInfoVfModule(modelInfoVfModule); + + CloudRegion cloudRegion = new CloudRegion(); + cloudRegion.setLcpCloudRegionId("cloudRegionId"); + cloudRegion.setTenantId("tenantId"); + + OrchestrationContext orchestrationContext = new OrchestrationContext(); + orchestrationContext.setIsRollbackEnabled(false); + + String sdncVnfQueryResponse = new String(Files.readAllBytes(Paths.get(JSON_FILE_LOCATION + "genericResourceApiVfModuleSdncVnfTopology.json"))); + String sdncVfModuleQueryResponse = new String(Files.readAllBytes(Paths.get(JSON_FILE_LOCATION + "genericResourceApiVfModuleSdncVfModuleTopology.json"))); + + CreateVfModuleRequest vfModuleVNFAdapterRequest = vfModuleObjectMapper.createVfModuleRequestMapper( + requestContext, cloudRegion, orchestrationContext, serviceInstance, + vnf, vfModule, null, sdncVnfQueryResponse, sdncVfModuleQueryResponse); + + + String jsonToCompare = new String(Files.readAllBytes(Paths.get(JSON_FILE_LOCATION + "vnfAdapterCreateVfModuleWithNoEnvironmentAndWorkloadContextRequest.json"))); + + CreateVfModuleRequest reqMapper1 = omapper.readValue( + jsonToCompare, + CreateVfModuleRequest.class); + + assertThat(vfModuleVNFAdapterRequest, sameBeanAs(reqMapper1).ignoring("messageId").ignoring("notificationUrl")); + } + @Test public void createVfModuleAddonRequestMapperTest() throws Exception { diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/orchestration/AAIVfModuleResourcesTest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/orchestration/AAIVfModuleResourcesTest.java index 0c4c8fc443..477be816aa 100644 --- a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/orchestration/AAIVfModuleResourcesTest.java +++ b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/orchestration/AAIVfModuleResourcesTest.java @@ -124,4 +124,17 @@ public class AAIVfModuleResourcesTest extends TestDataSetup{ aaiVfModuleResources.connectVfModuleToVolumeGroup(vnf, vfModule, volumeGroup, cloudRegion); verify(MOCK_aaiResourcesClient, times(1)).connect(any(AAIResourceUri.class), any(AAIResourceUri.class)); } + + @Test + public void updateHeatStackIdVfModuleTest() throws Exception { + vfModule.setHeatStackId("testHeatStackId"); + + doNothing().when(MOCK_aaiResourcesClient).update(isA(AAIResourceUri.class), isA(org.onap.aai.domain.yang.VfModule.class)); + + aaiVfModuleResources.updateHeatStackIdVfModule(vfModule, vnf); + + verify(MOCK_aaiResourcesClient, times(1)).update(any(AAIResourceUri.class), any(org.onap.aai.domain.yang.VfModule.class)); + + assertEquals("testHeatStackId", vfModule.getHeatStackId()); + } } diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/orchestration/AAIVolumeGroupResourcesTest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/orchestration/AAIVolumeGroupResourcesTest.java index de15e0a550..f60f29fa34 100644 --- a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/orchestration/AAIVolumeGroupResourcesTest.java +++ b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/orchestration/AAIVolumeGroupResourcesTest.java @@ -129,4 +129,17 @@ public class AAIVolumeGroupResourcesTest extends TestDataSetup{ verify(MOCK_aaiResourcesClient, times(1)).delete(any(AAIResourceUri.class)); } + + @Test + public void updateHeatStackIdVolumeGroupTest() throws Exception { + volumeGroup.setHeatStackId("testVolumeHeatStackId"); + + doNothing().when(MOCK_aaiResourcesClient).update(isA(AAIResourceUri.class), isA(org.onap.aai.domain.yang.VolumeGroup.class)); + + aaiVolumeGroupResources.updateHeatStackIdVolumeGroup(volumeGroup, cloudRegion); + + verify(MOCK_aaiResourcesClient, times(1)).update(any(AAIResourceUri.class), any(org.onap.aai.domain.yang.VolumeGroup.class)); + + assertEquals("testVolumeHeatStackId", volumeGroup.getHeatStackId()); + } } diff --git a/bpmn/so-bpmn-tasks/src/test/resources/__files/BuildingBlocks/VnfAndVfModuleMapper/vnfAdapterCreateVfModuleWithNoEnvironmentAndWorkloadContextRequest.json b/bpmn/so-bpmn-tasks/src/test/resources/__files/BuildingBlocks/VnfAndVfModuleMapper/vnfAdapterCreateVfModuleWithNoEnvironmentAndWorkloadContextRequest.json new file mode 100644 index 0000000000..fd3b0a3d58 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/test/resources/__files/BuildingBlocks/VnfAndVfModuleMapper/vnfAdapterCreateVfModuleWithNoEnvironmentAndWorkloadContextRequest.json @@ -0,0 +1,67 @@ +{ + "cloudSiteId": "cloudRegionId", + "tenantId": "tenantId", + "vnfId": "vnfId", + "vnfType": "vnfType", + "vfModuleId": "vfModuleId", + "vfModuleName": "vfModuleName", + "vfModuleType": "vfModuleModelName", + "vnfVersion": "serviceModelVersion", + "modelCustomizationUuid": "vfModuleModelCustomizationUuid", + "skipAAI": true, + "backout": false, + "failIfExists": true, + "msoRequest": + { + "requestId": "requestId", + "serviceInstanceId": "serviceInstanceId" + }, + + "vfModuleParams": + { + "vnf_id": "vnfId", + "vnf_name": "vnfName", + "vf_module_id": "vfModuleId", + "vf_module_index": "1", + "vf_module_name": "vfModuleName", + "environment_context": "", + "fw_0_subint_ctrl_port_0_ip": "ip0,ip1", + "fw_0_subint_ctrl_port_0_ip_0": "ip0", + "fw_0_subint_ctrl_port_0_ip_1": "ip1", + "fw_0_subint_ctrl_port_0_net_ids": "networkId0", + "fw_0_subint_ctrl_port_0_net_names": "1", + "fw_subint_ctrl_port_0_subintcount": "1", + "fw_0_subint_ctrl_port_0_v6_ip": "ip0,ip1", + "fw_0_subint_ctrl_port_0_v6_ip_0": "ip0", + "fw_0_subint_ctrl_port_0_v6_ip_1": "ip1", + "fw_0_subint_ctrl_port_0_vlan_ids": "1", + "fw_subint_ctrl_port_0_floating_ip": "floatingIpV40", + "fw_subint_ctrl_port_0_floating_v6_ip": "floatingIpV60", + "workload_context": "", + "key1": "value2", + "availability_zone_0": "zone0", + "availability_zone_1": "zone1", + "availability_zone_2": "zone2", + "vnfNetworkRole0_net_fqdn": "netFqdnValue0", + "vnfNetworkRole0_net_id": "neutronId0", + "vnfNetworkRole0_net_name": "netName0", + "vnfNetworkRole0_subnet_id": "subnetId0", + "vnfNetworkRole0_v6_subnet_id": "subnetId1", + "vmType0_name_0": "vmName0", + "vmType0_name_1": "vmName1", + "vmType0_names": "vmName0,vmName1", + "vmType0_vmNetworkRole0_floating_ip": "floatingIpV40", + "vmType0_vmNetworkRole0_floating_v6_ip": "floatingIpV60", + "vmType0_vmNetworkRole0_route_prefixes": "[{\"interface_route_table_routes_route_prefix\": \"interfaceRoutePrefix0\"},{\"interface_route_table_routes_route_prefix\": \"interfaceRoutePrefix1\"}]", + "vmNetworkRole0_ATT_VF_VLAN_FILTER": "heatVlanFilter0,heatVlanFilter1", + "vmType0_vmNetworkRole0_ip_0": "ip0", + "vmType0_vmNetworkRole0_ip_1": "ip1", + "vmType0_vmNetworkRole0_ips": "ip0,ip1", + "vmType0_vmNetworkRole0_v6_ip_0": "ip2", + "vmType0_vmNetworkRole0_v6_ip_1": "ip3", + "vmType0_vmNetworkRole0_v6_ips": "ip2,ip3", + "paramOne": "paramOneValue", + "paramTwo": "paramTwoValue", + "paramThree": "paramThreeValue" + } +} \ No newline at end of file -- 2.16.6