import static com.github.tomakehurst.wiremock.client.WireMock.containing;\r
import static com.github.tomakehurst.wiremock.client.WireMock.delete;\r
import static com.github.tomakehurst.wiremock.client.WireMock.post;\r
+import static com.github.tomakehurst.wiremock.client.WireMock.put;\r
import static com.github.tomakehurst.wiremock.client.WireMock.stubFor;\r
import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;\r
import static com.github.tomakehurst.wiremock.client.WireMock.urlMatching;\r
import static org.junit.Assert.assertEquals;\r
+import static org.junit.Assert.assertNotEquals;\r
+import static org.openecomp.mso.bpmn.common.DeleteAAIVfModuleTest.MockAAIDeleteGenericVnf;\r
import static org.openecomp.mso.bpmn.common.DeleteAAIVfModuleTest.MockAAIDeleteVfModule;\r
import static org.openecomp.mso.bpmn.common.DeleteAAIVfModuleTest.MockAAIGenericVnfSearch;\r
import static org.openecomp.mso.bpmn.mock.StubResponseAAI.MockDeleteGenericVnf;\r
import static org.openecomp.mso.bpmn.mock.StubResponseAAI.MockGetGenericVnfById;\r
+import static org.openecomp.mso.bpmn.mock.StubResponseAAI.MockPatchVfModuleId;\r
import static org.openecomp.mso.bpmn.mock.StubResponseDatabase.mockUpdateRequestDB;\r
import static org.openecomp.mso.bpmn.mock.StubResponseSDNCAdapter.mockSDNCAdapter;\r
\r
import org.openecomp.mso.bpmn.common.BPMNUtil;\r
import org.openecomp.mso.bpmn.common.WorkflowTest;\r
import org.openecomp.mso.bpmn.mock.FileUtil;\r
+import org.openecomp.mso.bpmn.core.domain.ModelInfo;\r
+import org.openecomp.mso.bpmn.core.domain.ModuleResource;\r
+import org.openecomp.mso.bpmn.core.domain.ServiceDecomposition;\r
+import org.openecomp.mso.bpmn.core.domain.VnfResource;\r
\r
public class DoDeleteVnfAndModulesTest extends WorkflowTest {\r
private final CallbackSet callbacks = new CallbackSet();\r
" <vfModuleDeleted>true</vfModuleDeleted>" + EOL +\r
" <messageId>{{MESSAGE-ID}}</messageId>" + EOL +\r
"</deleteVfModuleResponse>" + EOL;\r
+ private final String sdncAdapterDeleteCallback =\r
+ "<output xmlns=\"org:openecomp:sdnctl:l3api\">" + EOL +\r
+ " <svc-request-id>{{REQUEST-ID}}</svc-request-id>" + EOL +\r
+ " <ack-final-indicator>Y</ack-final-indicator>" + EOL +\r
+ "</output>" + EOL;\r
\r
public DoDeleteVnfAndModulesTest () throws IOException {\r
callbacks.put("deactivate", FileUtil.readResourceFile(\r
callbacks.put("unassign", FileUtil.readResourceFile(\r
"__files/VfModularity/SDNCTopologyActivateCallback.xml"));\r
callbacks.put("vnfDelete", vnfAdapterDeleteCallback);\r
+ callbacks.put("sdncDelete", sdncAdapterDeleteCallback);\r
\r
}\r
\r
\r
variables.put("sdncVersion", "1707");\r
\r
+ \r
+ ServiceDecomposition sd = new ServiceDecomposition(); \r
+ ModelInfo serviceModel = new ModelInfo();\r
+ serviceModel.setModelName("servicewithVNFs");\r
+ sd.setModelInfo(serviceModel); \r
+ VnfResource vr = new VnfResource();\r
+ ModelInfo mvr = new ModelInfo();\r
+ mvr.setModelName("vSAMP12");\r
+ mvr.setModelInstanceName("v123");\r
+ mvr.setModelInvariantUuid("");\r
+ mvr.setModelVersion("1.0");\r
+ mvr.setModelCustomizationUuid("MODEL-ID-1234");\r
+ vr.setModelInfo(mvr);\r
+ vr.constructVnfType("vnf1"); \r
+ vr.setNfType("somenftype");\r
+ vr.setNfRole("somenfrole");\r
+ vr.setNfFunction("somenffunction");\r
+ vr.setNfNamingCode("somenamingcode"); \r
+ ModuleResource mr = new ModuleResource();\r
+ ModelInfo mvmr = new ModelInfo();\r
+ mvmr.setModelInvariantUuid("ff5256d2-5a33-55df-13ab-12abad84e7ff");\r
+ mvmr.setModelName("STMTN5MMSC21-MMSC::model-1-0");\r
+ mvmr.setModelUuid("1.0");\r
+ mvmr.setModelCustomizationUuid("MODEL-123");\r
+ mr.setModelInfo(mvmr);\r
+ mr.setIsBase(true);\r
+ mr.setVfModuleLabel("MODULELABEL");\r
+ vr.addVfModule(mr);\r
+ sd.addVnfResource(vr); \r
+ variables.put("serviceDecomposition", sd);\r
+ \r
+ }\r
+ \r
+ @Test \r
+ @Deployment(resources = {"subprocess/DoDeleteVnfAndModules.bpmn", "subprocess/SDNCAdapterV1.bpmn", "subprocess/GenericGetVnf.bpmn", "subprocess/GenericDeleteVnf.bpmn", "subprocess/DoDeleteVnf.bpmn", "subprocess/DoDeleteVfModule.bpmn", "subprocess/UpdateAAIVfModule.bpmn", "subprocess/PrepareUpdateAAIVfModule.bpmn", "subprocess/DoDeleteVfModuleFromVnf.bpmn", "subprocess/VnfAdapterRestV1.bpmn", "subprocess/DeleteAAIVfModule.bpmn"})\r
+ public void testDoDeleteVnfAndModulesDirectDelete_successVnfAndModules() throws Exception{\r
+ MockDoDeleteVfModule_SDNCSuccess();\r
+ MockDoDeleteVfModule_DeleteVNFSuccess();\r
+ mockSDNCAdapter(200);\r
+ MockAAIGenericVnfSearch();\r
+ MockAAIVfModulePUT(false);\r
+ MockAAIDeleteGenericVnf();\r
+ MockAAIDeleteVfModule();\r
+ MockPatchVfModuleId("a27ce5a9-29c4-4c22-a017-6615ac73c721", "973ed047-d251-4fb9-bf1a-65b8949e0a73");\r
+\r
+ String businessKey = UUID.randomUUID().toString();\r
+ Map<String, Object> variables = new HashMap<>();\r
+ setVariablesVnfAndModulesDirectDelete(variables);\r
+ invokeSubProcess("DoDeleteVnfAndModules", businessKey, variables);\r
+ \r
+ injectVNFRestCallbacks(callbacks, "vnfDelete"); \r
+ injectSDNCCallbacks(callbacks, "sdncDelete");\r
+ MockGetGenericVnfById("a27ce5a9-29c4-4c22-a017-6615ac73c721", "GenericFlows/getGenericVnfByNameResponse.xml"); \r
+\r
+ waitForProcessEnd(businessKey, 10000);\r
+\r
+ Assert.assertTrue(isProcessEnded(businessKey)); \r
+\r
+ String workflowException = BPMNUtil.getVariable(processEngineRule, "DoDeleteVnfAndModules", "WorkflowException");\r
+ \r
+ // WorkflowException is expected here, since empty VNF cannot be simulated here\r
+ assertNotEquals(null, workflowException);\r
+ }\r
+\r
+ \r
+ private void setVariablesVnfAndModulesDirectDelete(Map<String, Object> variables) {\r
+ variables.put("mso-request-id", "a27ce5a9-29c4-4c22-a017-6615ac73c721"); \r
+ variables.put("isDebugLogEnabled", "true");\r
+ variables.put("vnfId","a27ce5a9-29c4-4c22-a017-6615ac73c721");\r
+ variables.put("serviceInstanceId", "a27ce5a9-29c4-4c22-a017-6615ac73c721");\r
+ \r
+ variables.put("msoRequestId", "a27ce5a9-29c4-4c22-a017-6615ac73c721");\r
+ //variables.put("testVnfId","testVnfId123");\r
+ \r
+ variables.put("lcpCloudRegionId", "RDM2WAGPLCP");\r
+ variables.put("tenantId", "fba1bd1e195a404cacb9ce17a9b2b421");\r
+ \r
+ variables.put("sdncVersion", "1702");\r
+ \r
+ \r
+ ServiceDecomposition sd = new ServiceDecomposition(); \r
+ ModelInfo serviceModel = new ModelInfo();\r
+ serviceModel.setModelName("servicewithVNFs");\r
+ sd.setModelInfo(serviceModel); \r
+ VnfResource vr = new VnfResource();\r
+ ModelInfo mvr = new ModelInfo();\r
+ mvr.setModelName("vSAMP12");\r
+ mvr.setModelInstanceName("v123");\r
+ mvr.setModelInvariantUuid("");\r
+ mvr.setModelVersion("1.0");\r
+ mvr.setModelCustomizationUuid("MODEL-ID-1234");\r
+ vr.setModelInfo(mvr);\r
+ vr.constructVnfType("vnf1"); \r
+ vr.setNfType("somenftype");\r
+ vr.setNfRole("somenfrole");\r
+ vr.setNfFunction("somenffunction");\r
+ vr.setNfNamingCode("somenamingcode"); \r
+ ModuleResource mr = new ModuleResource();\r
+ ModelInfo mvmr = new ModelInfo();\r
+ mvmr.setModelInvariantUuid("ff5256d2-5a33-55df-13ab-12abad84e7ff");\r
+ mvmr.setModelName("STMTN5MMSC21-MMSC::model-1-0");\r
+ mvmr.setModelUuid("1.0");\r
+ mvmr.setModelCustomizationUuid("MODEL-123");\r
+ mr.setModelInfo(mvmr);\r
+ mr.setIsBase(true);\r
+ mr.setVfModuleLabel("MODULELABEL");\r
+ vr.addVfModule(mr);\r
+ sd.addVnfResource(vr); \r
+ variables.put("serviceDecomposition", sd);\r
+ \r
}\r
\r
+ public static void MockAAIVfModulePUT(boolean isCreate){\r
+ stubFor(put(urlMatching("/aai/v[0-9]+/network/generic-vnfs/generic-vnf/.*/vf-modules/vf-module/.*"))\r
+ .withRequestBody(containing("MMSC"))\r
+ .willReturn(aResponse()\r
+ .withStatus(isCreate ? 201 : 200)));\r
+ stubFor(put(urlMatching("/aai/v[0-9]+/network/generic-vnfs/generic-vnf/.*/vf-modules/vf-module/.*"))\r
+ .withRequestBody(containing("PCRF"))\r
+ .willReturn(aResponse()\r
+ .withStatus(500)\r
+ .withHeader("Content-Type", "text/xml")\r
+ .withBodyFile("aaiFault.xml")));\r
+ stubFor(put(urlMatching("/aai/v[0-9]+/network/generic-vnfs/generic-vnf/a27ce5a9-29c4-4c22-a017-6615ac73c721")) \r
+ .willReturn(aResponse()\r
+ .withStatus(200)));\r
+ }\r
+ \r
+\r
+ \r
\r
public static void MockDoDeleteVfModule_SDNCSuccess() {\r
stubFor(post(urlEqualTo("/SDNCAdapter"))\r
.withStatus(202)\r
.withHeader("Content-Type", "application/xml")));\r
}\r
-}
\ No newline at end of file
+}\r