From 713b2b8be4dd1dd57f5ef9b0927ceb9bd3b009c4 Mon Sep 17 00:00:00 2001 From: subhash kumar singh Date: Fri, 2 Aug 2019 21:17:09 +0530 Subject: [PATCH] Fix parsing issue for ccvpn Fix csar parsing issue for ccvpn. Change-Id: Ie99acbec8a52de7a08d1627c210c0e3fda986520 Issue-ID: SO-1393 Signed-off-by: sarada prasad sahoo Signed-off-by: subhash kumar singh --- .../org/onap/so/asdc/client/ASDCController.java | 7 +- .../installer/heat/ToscaResourceInstaller.java | 44 +++-- .../client/test/rest/ASDCRestInterfaceTest.java | 27 ++- .../installer/heat/ToscaResourceInstallerTest.java | 219 ++++++++++++++++++++- .../ccvpn/demo-ccvpn-notification.json | 57 ++++++ .../ccvpn/service-Sdwan-csar.csar | Bin 0 -> 45576 bytes 6 files changed, 335 insertions(+), 19 deletions(-) create mode 100644 asdc-controller/src/test/resources/resource-examples/ccvpn/demo-ccvpn-notification.json create mode 100644 asdc-controller/src/test/resources/resource-examples/ccvpn/service-Sdwan-csar.csar 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 073412133c..90116ad4f5 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 @@ -742,8 +742,7 @@ public class ASDCController { logger.info("Processing Resource Type: {}, Model UUID: {}", resourceType, resource.getResourceUUID()); - if ("VF".equals(resourceType) && resource.getArtifacts() != null - && !resource.getArtifacts().isEmpty()) { + if ("VF".equals(resourceType)) { resourceStructure = new VfResourceStructure(iNotif, resource); } else if ("PNF".equals(resourceType)) { resourceStructure = new PnfResourceStructure(iNotif, resource); @@ -761,8 +760,8 @@ public class ASDCController { logger.debug("Processing Resource Type: " + resourceType + " and Model UUID: " + resourceStructure.getResourceInstance().getResourceUUID()); - if ("VF".equals(resourceType) && resource.getArtifacts() != null - && !resource.getArtifacts().isEmpty()) { + + if ("VF".equals(resourceType)) { hasVFResource = true; for (IArtifactInfo artifact : resource.getArtifacts()) { IDistributionClientDownloadResult resultArtifact = 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 83827b425e..08aee1ab4e 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 @@ -437,20 +437,17 @@ public class ToscaResourceInstaller { List vfEntityList = getEntityDetails(toscaResourceStruct, EntityQuery.newBuilder(SdcTypes.VF), TopologyTemplateQuery.newBuilder(SdcTypes.SERVICE), false); - List arEntityDetails = new ArrayList(); - for (IEntityDetails vfEntityDetails : vfEntityList) { Metadata metadata = vfEntityDetails.getMetadata(); - String category = metadata.getValue("category"); + String category = metadata.getValue(SdcPropertyNames.PROPERTY_NAME_CATEGORY); - if ("Allotted Resource".equalsIgnoreCase(category)) { - arEntityDetails.add(vfEntityDetails); + if (ALLOTTED_RESOURCE.equalsIgnoreCase(category)) { + continue; } processVfModules(vfEntityDetails, vfNodeTemplatesList.get(0), toscaResourceStruct, vfResourceStructure, service, metadata); - } processResourceSequence(toscaResourceStruct, service); @@ -667,6 +664,8 @@ public class ToscaResourceInstaller { } else { NetworkResourceCustomization networkCustomization = createNetwork(vlEntity, toscaResourceStruct, null, null, null, service); + networkCustomization.setResourceInput( + getResourceInput(toscaResourceStruct, networkCustomization.getModelCustomizationUUID())); service.getNetworkCustomizations().add(networkCustomization); logger.debug("No NetworkResourceName found in TempNetworkHeatTemplateLookup for " + networkResourceModelName); @@ -677,11 +676,14 @@ public class ToscaResourceInstaller { } protected void processAllottedResources(ToscaResourceStructure toscaResourceStruct, Service service, - List allottedResourceList) { + List allottedResourceList) throws ArtifactInstallerException { if (allottedResourceList != null) { for (NodeTemplate allottedNode : allottedResourceList) { - service.getAllottedCustomizations() - .add(createAllottedResource(allottedNode, toscaResourceStruct, service)); + AllottedResourceCustomization allottedResource = + createAllottedResource(allottedNode, toscaResourceStruct, service); + allottedResource.setResourceInput( + getResourceInput(toscaResourceStruct, allottedResource.getModelCustomizationUUID())); + service.getAllottedCustomizations().add(allottedResource); } } } @@ -1370,7 +1372,14 @@ public class ToscaResourceInstaller { Metadata serviceMetadata = toscaResourceStructure.getServiceMetadata(); - Service service = new Service(); + List services = + serviceRepo.findByModelUUID(serviceMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_UUID)); + Service service; + if (!services.isEmpty() && services.size() > 0) { + service = services.get(0); + } else { + service = new Service(); + } if (serviceMetadata != null) { @@ -1482,7 +1491,14 @@ public class ToscaResourceInstaller { } protected void createToscaCsar(ToscaResourceStructure toscaResourceStructure) { - ToscaCsar toscaCsar = new ToscaCsar(); + Optional toscaCsarOpt = + toscaCsarRepo.findById(toscaResourceStructure.getToscaArtifact().getArtifactUUID()); + ToscaCsar toscaCsar; + if (toscaCsarOpt.isPresent()) { + toscaCsar = toscaCsarOpt.get(); + } else { + toscaCsar = new ToscaCsar(); + } if (toscaResourceStructure.getToscaArtifact().getArtifactChecksum() != null) { toscaCsar.setArtifactChecksum(toscaResourceStructure.getToscaArtifact().getArtifactChecksum()); } else { @@ -2789,8 +2805,10 @@ public class ToscaResourceInstaller { if (!services.isEmpty()) { // service exist in db Service existingService = services.get(0); - List vnfCustomizations = existingService.getVnfCustomizations(); - vnfCustomizations.forEach(e -> service.getVnfCustomizations().add(e)); + List existingVnfCustomizations = existingService.getVnfCustomizations(); + if (existingService != null) { + service.getVnfCustomizations().addAll(existingVnfCustomizations); + } } service.getVnfCustomizations().add(vnfResourceCustomization); } diff --git a/asdc-controller/src/test/java/org/onap/so/asdc/client/test/rest/ASDCRestInterfaceTest.java b/asdc-controller/src/test/java/org/onap/so/asdc/client/test/rest/ASDCRestInterfaceTest.java index 2c520a3bba..cfcf5ac599 100644 --- a/asdc-controller/src/test/java/org/onap/so/asdc/client/test/rest/ASDCRestInterfaceTest.java +++ b/asdc-controller/src/test/java/org/onap/so/asdc/client/test/rest/ASDCRestInterfaceTest.java @@ -144,6 +144,7 @@ public class ASDCRestInterfaceTest extends BaseTest { AllottedResourceCustomization arCustomization = new AllottedResourceCustomization(); arCustomization.setModelCustomizationUUID("f62bb612-c5d4-4406-865c-0abec30631ba"); arCustomization.setModelInstanceName("rege1802pnf 0"); + arCustomization.setResourceInput("{}"); arCustomizationSet.add(arCustomization); arCustomization.setAllottedResource(expectedService); @@ -164,7 +165,7 @@ public class ASDCRestInterfaceTest extends BaseTest { @Test @Transactional - public void test_VFW_Distrobution() throws Exception { + public void test_VFW_Distribution() throws Exception { wireMockServer.stubFor(post(urlPathMatching("/aai/.*")) .willReturn(aResponse().withStatus(200).withHeader("Content-Type", "application/json"))); @@ -290,6 +291,30 @@ public class ASDCRestInterfaceTest extends BaseTest { assertEquals("Generic NeutronNet", networkResource.get().getModelName()); } + @Test + public void test_CCVPN_Distribution() throws Exception { + wireMockServer.stubFor(post(urlPathMatching("/aai/.*")) + .willReturn(aResponse().withStatus(200).withHeader("Content-Type", "application/json"))); + + wireMockServer.stubFor(post(urlPathMatching("/v1.0/activity-spec")) + .willReturn(aResponse().withHeader("Content-Type", "application/json") + .withStatus(org.springframework.http.HttpStatus.ACCEPTED.value()))); + + String resourceLocation = "src/test/resources/resource-examples/ccvpn/"; + ObjectMapper mapper = new ObjectMapper(); + NotificationDataImpl request = mapper.readValue(new File(resourceLocation + "demo-ccvpn-notification.json"), + NotificationDataImpl.class); + headers.add("resource-location", resourceLocation); + HttpEntity entity = new HttpEntity(request, headers); + ResponseEntity response = restTemplate.exchange(createURLWithPort("test/treatNotification/v1"), + HttpMethod.POST, entity, String.class); + assertEquals(Response.Status.OK.getStatusCode(), response.getStatusCode().value()); + + Optional service = serviceRepo.findById("5c4d4793-67fb-4155-b7d8-60ec011138c9"); + assertTrue(service.isPresent()); + assertEquals("SDWAN", service.get().getModelName()); + } + protected String createURLWithPort(String uri) { return "http://localhost:" + port + uri; } 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 7534ea645a..ffad137ad7 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 @@ -25,16 +25,19 @@ import static com.shazam.shazamcrest.matcher.Matchers.sameBeanAs; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; import java.lang.reflect.Method; import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Optional; import org.hibernate.exception.LockAcquisitionException; import org.junit.Before; @@ -54,26 +57,38 @@ import org.onap.sdc.toscaparser.api.Group; import org.onap.sdc.toscaparser.api.NodeTemplate; import org.onap.sdc.toscaparser.api.RequirementAssignment; import org.onap.sdc.toscaparser.api.RequirementAssignments; +import org.onap.sdc.toscaparser.api.SubstitutionMappings; import org.onap.sdc.toscaparser.api.elements.Metadata; import org.onap.sdc.toscaparser.api.elements.StatefulEntityType; +import org.onap.sdc.toscaparser.api.parameters.Input; import org.onap.sdc.utils.DistributionStatusEnum; import org.onap.so.asdc.BaseTest; +import org.onap.so.asdc.client.ResourceInstance; import org.onap.so.asdc.client.exceptions.ArtifactInstallerException; import org.onap.so.asdc.client.test.emulators.ArtifactInfoImpl; import org.onap.so.asdc.client.test.emulators.JsonStatusData; import org.onap.so.asdc.client.test.emulators.NotificationDataImpl; +import org.onap.so.asdc.installer.IVfModuleData; import org.onap.so.asdc.installer.ResourceStructure; 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.bpmn.WorkflowResource; import org.onap.so.db.catalog.beans.ConfigurationResource; import org.onap.so.db.catalog.beans.ConfigurationResourceCustomization; import org.onap.so.db.catalog.beans.Service; import org.onap.so.db.catalog.beans.ServiceProxyResourceCustomization; import org.onap.so.db.catalog.beans.ToscaCsar; +import org.onap.so.db.catalog.beans.VnfcInstanceGroupCustomization; import org.onap.so.db.catalog.data.repository.AllottedResourceCustomizationRepository; import org.onap.so.db.catalog.data.repository.AllottedResourceRepository; import org.onap.so.db.catalog.data.repository.ConfigurationResourceCustomizationRepository; +import org.onap.so.db.catalog.data.repository.InstanceGroupRepository; import org.onap.so.db.catalog.data.repository.ServiceRepository; import org.onap.so.db.catalog.data.repository.ToscaCsarRepository; +import org.onap.so.db.catalog.data.repository.VFModuleRepository; +import org.onap.so.db.catalog.data.repository.VnfResourceRepository; +import org.onap.so.db.catalog.data.repository.VnfcInstanceGroupCustomizationRepository; import org.onap.so.db.request.beans.WatchdogComponentDistributionStatus; import org.onap.so.db.request.data.repository.WatchdogComponentDistributionStatusRepository; import org.springframework.beans.factory.annotation.Autowired; @@ -111,6 +126,8 @@ public class ToscaResourceInstallerTest extends BaseTest { @Mock private ToscaResourceStructure toscaResourceStructure; @Mock + private VfResourceStructure vfResourceStruct; + @Mock private ServiceProxyResourceCustomization spResourceCustomization; @Mock private ISdcCsarHelper csarHelper; @@ -257,6 +274,206 @@ public class ToscaResourceInstallerTest extends BaseTest { toscaInstaller.installTheComponentStatus(statusData); } + @Test + public void installTheResourceWithGroupAndVFModulesTest() throws Exception { + ToscaResourceInstaller toscaInstaller = new ToscaResourceInstaller(); + ToscaResourceStructure toscaResourceStructObj = prepareToscaResourceStructure(true, toscaInstaller); + + toscaInstaller.installTheResource(toscaResourceStructObj, vfResourceStruct); + assertEquals(true, toscaResourceStructObj.isDeployedSuccessfully()); + } + + @Test + public void installTheResourceGroupWithoutVFModulesTest() throws Exception { + ToscaResourceInstaller toscaInstaller = new ToscaResourceInstaller(); + ToscaResourceStructure toscaResourceStructObj = prepareToscaResourceStructure(false, toscaInstaller); + + toscaInstaller.installTheResource(toscaResourceStructObj, vfResourceStruct); + assertEquals(true, toscaResourceStructObj.isDeployedSuccessfully()); + } + + private ToscaResourceStructure prepareToscaResourceStructure(boolean prepareVFModuleStructures, + ToscaResourceInstaller toscaInstaller) throws ArtifactInstallerException { + + Metadata metadata = mock(Metadata.class); + IResourceInstance resourceInstance = mock(ResourceInstance.class); + NodeTemplate nodeTemplate = mock(NodeTemplate.class); + ISdcCsarHelper csarHelper = mock(SdcCsarHelperImpl.class); + + IArtifactInfo inputCsar = mock(IArtifactInfo.class); + String artifactUuid = "0122c05e-e13a-4c63-b5d2-475ccf23aa74"; + String checkSum = "MGUzNjJjMzk3OTBkYzExYzQ0MDg2ZDc2M2E3ZjZiZmY="; + + doReturn(checkSum).when(inputCsar).getArtifactChecksum(); + doReturn(artifactUuid).when(inputCsar).getArtifactUUID(); + doReturn("1.0").when(inputCsar).getArtifactVersion(); + doReturn("TestCsarWithGroupAndVFModule").when(inputCsar).getArtifactName(); + doReturn("Test Csar data with Group and VF module inputs").when(inputCsar).getArtifactDescription(); + doReturn("http://localhost/dummy/url/test.csar").when(inputCsar).getArtifactURL(); + + ToscaResourceStructure toscaResourceStructObj = new ToscaResourceStructure(); + toscaResourceStructObj.setToscaArtifact(inputCsar); + + ToscaCsarRepository toscaCsarRepo = spy(ToscaCsarRepository.class); + + + ToscaCsar toscaCsar = mock(ToscaCsar.class); + Optional returnValue = Optional.of(toscaCsar); + doReturn(artifactUuid).when(toscaCsar).getArtifactUUID(); + doReturn(checkSum).when(toscaCsar).getArtifactChecksum(); + doReturn(returnValue).when(toscaCsarRepo).findById(artifactUuid); + + ReflectionTestUtils.setField(toscaInstaller, "toscaCsarRepo", toscaCsarRepo); + + NotificationDataImpl notificationData = new NotificationDataImpl(); + notificationData.setDistributionID("testStatusSuccessfulTosca"); + notificationData.setServiceVersion("1234567"); + notificationData.setServiceUUID("serviceUUID1"); + notificationData.setWorkloadContext("workloadContext1"); + + + + String serviceType = "test-type1"; + String serviceRole = "test-role1"; + String category = "Network L3+"; + String description = "Customer Orderable service description"; + String name = "Customer_Orderable_Service"; + String uuid = "72db5868-4575-4804-b546-0b0d3c3b5ac6"; + String invariantUUID = "6f30bbe3-4590-4185-a7e0-4f9610926c6f"; + String namingPolicy = "naming Policy1"; + String ecompGeneratedNaming = "true"; + String environmentContext = "General_Revenue-Bearing1"; + String resourceCustomizationUUID = "0177ba22-5547-4e4e-bcf8-178f7f71de3a"; + + doReturn(serviceType).when(metadata).getValue("serviceType"); + doReturn(serviceRole).when(metadata).getValue("serviceRole"); + + doReturn(category).when(metadata).getValue(SdcPropertyNames.PROPERTY_NAME_CATEGORY); + doReturn(description).when(metadata).getValue(SdcPropertyNames.PROPERTY_NAME_DESCRIPTION); + doReturn("1.0").when(metadata).getValue(SdcPropertyNames.PROPERTY_NAME_VERSION); + doReturn(name).when(metadata).getValue(SdcPropertyNames.PROPERTY_NAME_NAME); + + doReturn(uuid).when(metadata).getValue(SdcPropertyNames.PROPERTY_NAME_UUID); + + doReturn(environmentContext).when(metadata).getValue(metadata.getValue("environmentContext")); + doReturn(invariantUUID).when(metadata).getValue(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID); + doReturn(namingPolicy).when(metadata).getValue("namingPolicy"); + doReturn(ecompGeneratedNaming).when(metadata).getValue("ecompGeneratedNaming"); + doReturn(resourceCustomizationUUID).when(metadata).getValue("vfModuleModelCustomizationUUID"); + + ServiceRepository serviceRepo = spy(ServiceRepository.class); + + VnfResourceRepository vnfRepo = spy(VnfResourceRepository.class); + doReturn(null).when(vnfRepo).findResourceByModelUUID(uuid); + + VFModuleRepository vfModuleRepo = spy(VFModuleRepository.class); + InstanceGroupRepository instanceGroupRepo = spy(InstanceGroupRepository.class); + + WorkflowResource workflowResource = spy(WorkflowResource.class); + + ReflectionTestUtils.setField(toscaInstaller, "serviceRepo", serviceRepo); + ReflectionTestUtils.setField(toscaInstaller, "vnfRepo", vnfRepo); + ReflectionTestUtils.setField(toscaInstaller, "vfModuleRepo", vfModuleRepo); + ReflectionTestUtils.setField(toscaInstaller, "instanceGroupRepo", instanceGroupRepo); + ReflectionTestUtils.setField(toscaInstaller, "workflowResource", workflowResource); + + // doReturn(csarHelper).when(toscaResourceStructure).getSdcCsarHelper(); + toscaResourceStructObj.setSdcCsarHelper(csarHelper); + doReturn(null).when(csarHelper).getNodeTemplatePropertyLeafValue(nodeTemplate, + SdcPropertyNames.PROPERTY_NAME_NFFUNCTION); + doReturn(null).when(csarHelper).getNodeTemplatePropertyLeafValue(nodeTemplate, + SdcPropertyNames.PROPERTY_NAME_NFROLE); + doReturn(null).when(csarHelper).getNodeTemplatePropertyLeafValue(nodeTemplate, + SdcPropertyNames.PROPERTY_NAME_NFTYPE); + doReturn(resourceCustomizationUUID).when(csarHelper).getMetadataPropertyValue(metadata, + SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID); + doReturn(uuid).when(csarHelper).getMetadataPropertyValue(metadata, + SdcPropertyNames.PROPERTY_NAME_VFMODULEMODELUUID); + + + // vnfc instance group list + List vnfcInstanceGroupList = new ArrayList<>(); + Group vnfcG1 = mock(Group.class); + Map metaProperties = new HashMap<>(); + metaProperties.put(SdcPropertyNames.PROPERTY_NAME_UUID, "vnfc_group1_uuid"); + metaProperties.put(SdcPropertyNames.PROPERTY_NAME_NAME, "vnfc_group1_uuid"); + metaProperties.put(SdcPropertyNames.PROPERTY_NAME_INVARIANTUUID, "vnfc_group1_invariantid"); + metaProperties.put(SdcPropertyNames.PROPERTY_NAME_VERSION, "1.0"); + Metadata vnfcmetadata = new Metadata(metaProperties); + + doReturn(vnfcmetadata).when(vnfcG1).getMetadata(); + ArrayList memberList = new ArrayList(); + doReturn(memberList).when(vnfcG1).getMemberNodes(); + vnfcInstanceGroupList.add(vnfcG1); + SubstitutionMappings submappings = mock(SubstitutionMappings.class); + doReturn(new ArrayList()).when(submappings).getInputs(); + doReturn(submappings).when(nodeTemplate).getSubMappingToscaTemplate(); + + doReturn(vnfcInstanceGroupList).when(csarHelper).getGroupsOfOriginOfNodeTemplateByToscaGroupType(nodeTemplate, + "org.openecomp.groups.VfcInstanceGroup"); + + + doReturn(notificationData).when(vfResourceStruct).getNotification(); + doReturn(resourceInstance).when(vfResourceStruct).getResourceInstance(); + + if (prepareVFModuleStructures) { + + // VfModule list + List vfModuleGroups = new ArrayList<>(); + Group g1 = mock(Group.class); + doReturn(metadata).when(g1).getMetadata(); + vfModuleGroups.add(g1); + + doReturn(vfModuleGroups).when(csarHelper).getVfModulesByVf(resourceCustomizationUUID); + doReturn("1").when(csarHelper).getGroupPropertyLeafValue(g1, SdcPropertyNames.PROPERTY_NAME_INITIALCOUNT); + + doReturn(metadata).when(nodeTemplate).getMetaData(); + List nodeList = new ArrayList<>(); + nodeList.add(nodeTemplate); + doReturn(nodeList).when(csarHelper).getServiceVfList(); + + IVfModuleData moduleMetadata = mock(IVfModuleData.class); + doReturn(name).when(moduleMetadata).getVfModuleModelName(); + doReturn(invariantUUID).when(moduleMetadata).getVfModuleModelInvariantUUID(); + doReturn(Collections.emptyList()).when(moduleMetadata).getArtifacts(); + doReturn(resourceCustomizationUUID).when(moduleMetadata).getVfModuleModelCustomizationUUID(); + doReturn(uuid).when(moduleMetadata).getVfModuleModelUUID(); + doReturn("1.0").when(moduleMetadata).getVfModuleModelVersion(); + + VfModuleStructure moduleStructure = new VfModuleStructure(vfResourceStruct, moduleMetadata); + + List moduleStructures = new ArrayList<>(); + moduleStructures.add(moduleStructure); + doReturn(moduleStructures).when(vfResourceStruct).getVfModuleStructure(); + } + + toscaResourceStructObj.setServiceMetadata(metadata); + doReturn("resourceInstanceName1").when(resourceInstance).getResourceInstanceName(); + doReturn(resourceCustomizationUUID).when(resourceInstance).getResourceCustomizationUUID(); + doReturn("resourceName1").when(resourceInstance).getResourceName(); + + Service service = toscaInstaller.createService(toscaResourceStructObj, vfResourceStruct); + + assertNotNull(service); + service.setModelVersion("1.0"); + + doReturn(service).when(serviceRepo).save(service); + + WatchdogComponentDistributionStatusRepository watchdogCDStatusRepository = + spy(WatchdogComponentDistributionStatusRepository.class); + ReflectionTestUtils.setField(toscaInstaller, "watchdogCDStatusRepository", watchdogCDStatusRepository); + doReturn(null).when(watchdogCDStatusRepository).save(any(WatchdogComponentDistributionStatus.class)); + + VnfcInstanceGroupCustomizationRepository vnfcInstanceGroupCustomizationRepo = + spy(VnfcInstanceGroupCustomizationRepository.class); + ReflectionTestUtils.setField(toscaInstaller, "vnfcInstanceGroupCustomizationRepo", + vnfcInstanceGroupCustomizationRepo); + doReturn(null).when(vnfcInstanceGroupCustomizationRepo).save(any(VnfcInstanceGroupCustomization.class)); + return toscaResourceStructObj; + } + + + @Test public void installTheResourceExceptionTest() throws Exception { expectedException.expect(ArtifactInstallerException.class); diff --git a/asdc-controller/src/test/resources/resource-examples/ccvpn/demo-ccvpn-notification.json b/asdc-controller/src/test/resources/resource-examples/ccvpn/demo-ccvpn-notification.json new file mode 100644 index 0000000000..bc7d7d7979 --- /dev/null +++ b/asdc-controller/src/test/resources/resource-examples/ccvpn/demo-ccvpn-notification.json @@ -0,0 +1,57 @@ +{ + "distributionID": "cbc7ab24-7d96-4cb5-949c-f23ada265513", + "serviceName": "SDWAN", + "serviceVersion": "2.0", + "serviceUUID": "5c4d4793-67fb-4155-b7d8-60ec011138c9", + "serviceDescription": "SDWAN Service", + "serviceInvariantUUID": "e830c260-ee21-4830-980c-c802cd9bbb1c", + "resources": [ + { + "resourceInstanceName": "siteVF 0", + "resourceName": "siteVF", + "resourceVersion": "1.0", + "resoucreType": "VF", + "resourceUUID": "2c10d85c-e492-4813-a2d6-d1fab757fe49", + "resourceInvariantUUID": "ed9b1fe5-1e94-4974-a48f-389571837fd6", + "resourceCustomizationUUID": "33de5105-edf3-48cb-bda0-37b2aa2f681f", + "category": "Configuration", + "subcategory": "Configuration", + "artifacts": [] + }, + { + "resourceInstanceName": "vpn 0", + "resourceName": "vpn", + "resourceVersion": "2.0", + "resoucreType": "VF", + "resourceUUID": "235861f1-ea93-4443-94fa-82f29903f54f", + "resourceInvariantUUID": "c4eff5e7-c4fe-4caf-989b-11efc8e42a73", + "resourceCustomizationUUID": "faa89d44-329b-4fcb-a5dc-6e6f84946537", + "category": "Configuration", + "subcategory": "Configuration", + "artifacts": [] + } + ], + "serviceArtifacts": [ + { + "artifactName": "service-Sdwan-template.yml", + "artifactType": "TOSCA_TEMPLATE", + "artifactURL": "/sdc/v1/catalog/services/Sdwan/2.0/artifacts/service-Sdwan-template.yml", + "artifactChecksum": "Zjg4MmJmNzI1MTliYzBiZjA2ZmJjN2EwNzZhZTcxYTQ=", + "artifactDescription": "TOSCA representation of the asset", + "artifactTimeout": 0, + "artifactUUID": "5e7beb91-61f9-4613-8cc5-1d288a624abb", + "artifactVersion": "2" + }, + { + "artifactName": "service-Sdwan-csar.csar", + "artifactType": "TOSCA_CSAR", + "artifactURL": "/service-Sdwan-csar.csar", + "artifactChecksum": "ODA1ZGViMzI0NzIxMmRmNTIzYzE0ZTg5NmExYWFjZTE=", + "artifactDescription": "TOSCA definition package of the asset", + "artifactTimeout": 0, + "artifactUUID": "771ec21a-1d14-4891-a56f-d4e47e2c8c91", + "artifactVersion": "2" + } + ], + "workloadContext": "Production" +} \ No newline at end of file diff --git a/asdc-controller/src/test/resources/resource-examples/ccvpn/service-Sdwan-csar.csar b/asdc-controller/src/test/resources/resource-examples/ccvpn/service-Sdwan-csar.csar new file mode 100644 index 0000000000000000000000000000000000000000..7a508429f86f97a1b69ae41c67da763b9521f638 GIT binary patch literal 45576 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 U%{4GEEYOV=q`=ct_UqCA0op