2 * ============LICENSE_START=======================================================
\r
4 * ================================================================================
\r
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
\r
6 * ================================================================================
\r
7 * Licensed under the Apache License, Version 2.0 (the "License");
\r
8 * you may not use this file except in compliance with the License.
\r
9 * You may obtain a copy of the License at
\r
11 * http://www.apache.org/licenses/LICENSE-2.0
\r
13 * Unless required by applicable law or agreed to in writing, software
\r
14 * distributed under the License is distributed on an "AS IS" BASIS,
\r
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
16 * See the License for the specific language governing permissions and
\r
17 * limitations under the License.
\r
18 * ============LICENSE_END=========================================================
\r
21 package org.openecomp.mso.bpmn.infrastructure;
\r
23 import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
\r
24 import static com.github.tomakehurst.wiremock.client.WireMock.containing;
\r
25 import static com.github.tomakehurst.wiremock.client.WireMock.delete;
\r
26 import static com.github.tomakehurst.wiremock.client.WireMock.post;
\r
27 import static com.github.tomakehurst.wiremock.client.WireMock.put;
\r
28 import static com.github.tomakehurst.wiremock.client.WireMock.stubFor;
\r
29 import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
\r
30 import static com.github.tomakehurst.wiremock.client.WireMock.urlMatching;
\r
31 import static org.junit.Assert.assertEquals;
\r
32 import static org.junit.Assert.assertNotEquals;
\r
33 import static org.openecomp.mso.bpmn.common.DeleteAAIVfModuleTest.MockAAIDeleteGenericVnf;
\r
34 import static org.openecomp.mso.bpmn.common.DeleteAAIVfModuleTest.MockAAIDeleteVfModule;
\r
35 import static org.openecomp.mso.bpmn.common.DeleteAAIVfModuleTest.MockAAIGenericVnfSearch;
\r
36 import static org.openecomp.mso.bpmn.mock.StubResponseAAI.MockDeleteGenericVnf;
\r
37 import static org.openecomp.mso.bpmn.mock.StubResponseAAI.MockGetGenericVnfById;
\r
38 import static org.openecomp.mso.bpmn.mock.StubResponseAAI.MockPatchVfModuleId;
\r
39 import static org.openecomp.mso.bpmn.mock.StubResponseDatabase.mockUpdateRequestDB;
\r
40 import static org.openecomp.mso.bpmn.mock.StubResponseSDNCAdapter.mockSDNCAdapter;
\r
42 import java.io.IOException;
\r
43 import java.util.HashMap;
\r
44 import java.util.Map;
\r
45 import java.util.UUID;
\r
47 import org.camunda.bpm.engine.test.Deployment;
\r
48 import org.junit.Assert;
\r
49 import org.junit.Ignore;
\r
50 import org.junit.Test;
\r
51 import org.openecomp.mso.bpmn.common.BPMNUtil;
\r
52 import org.openecomp.mso.bpmn.common.WorkflowTest;
\r
53 import org.openecomp.mso.bpmn.mock.FileUtil;
\r
54 import org.openecomp.mso.bpmn.core.domain.ModelInfo;
\r
55 import org.openecomp.mso.bpmn.core.domain.ModuleResource;
\r
56 import org.openecomp.mso.bpmn.core.domain.ServiceDecomposition;
\r
57 import org.openecomp.mso.bpmn.core.domain.VnfResource;
\r
59 public class DoDeleteVnfAndModulesTest extends WorkflowTest {
\r
60 private final CallbackSet callbacks = new CallbackSet();
\r
61 private static final String EOL = "\n";
\r
62 private final String vnfAdapterDeleteCallback =
\r
63 "<deleteVfModuleResponse>" + EOL +
\r
64 " <vnfId>a27ce5a9-29c4-4c22-a017-6615ac73c721</vnfId>" + EOL +
\r
65 " <vfModuleId>973ed047-d251-4fb9-bf1a-65b8949e0a73</vfModuleId>" + EOL +
\r
66 " <vfModuleDeleted>true</vfModuleDeleted>" + EOL +
\r
67 " <messageId>{{MESSAGE-ID}}</messageId>" + EOL +
\r
68 "</deleteVfModuleResponse>" + EOL;
\r
69 private final String sdncAdapterDeleteCallback =
\r
70 "<output xmlns=\"org:openecomp:sdnctl:l3api\">" + EOL +
\r
71 " <svc-request-id>{{REQUEST-ID}}</svc-request-id>" + EOL +
\r
72 " <ack-final-indicator>Y</ack-final-indicator>" + EOL +
\r
75 public DoDeleteVnfAndModulesTest () throws IOException {
\r
76 callbacks.put("deactivate", FileUtil.readResourceFile(
\r
77 "__files/VfModularity/SDNCTopologyActivateCallback.xml"));
\r
78 callbacks.put("unassign", FileUtil.readResourceFile(
\r
79 "__files/VfModularity/SDNCTopologyActivateCallback.xml"));
\r
80 callbacks.put("vnfDelete", vnfAdapterDeleteCallback);
\r
81 callbacks.put("sdncDelete", sdncAdapterDeleteCallback);
\r
86 @Deployment(resources = {"subprocess/DoDeleteVnfAndModules.bpmn", "subprocess/SDNCAdapterV1.bpmn", "subprocess/GenericGetVnf.bpmn", "subprocess/GenericDeleteVnf.bpmn", "subprocess/DoDeleteVnf.bpmn", "subprocess/DoDeleteVfModule.bpmn"})
\r
87 public void testDoDeleteVnfAndModules_successVnfOnly() throws Exception{
\r
88 MockGetGenericVnfById("testVnfId123.*", "GenericFlows/getGenericVnfByNameResponse.xml");
\r
89 MockDeleteGenericVnf("testVnfId123", "testReVer123");
\r
90 mockUpdateRequestDB(200, "Database/DBUpdateResponse.xml");
\r
91 mockSDNCAdapter(200);
\r
93 String businessKey = UUID.randomUUID().toString();
\r
94 Map<String, Object> variables = new HashMap<>();
\r
95 setVariablesVnfOnly(variables);
\r
96 invokeSubProcess("DoDeleteVnfAndModules", businessKey, variables);
\r
98 injectSDNCCallbacks(callbacks, "deactivate");
\r
99 injectSDNCCallbacks(callbacks, "unassign");
\r
101 waitForProcessEnd(businessKey, 10000);
\r
103 Assert.assertTrue(isProcessEnded(businessKey));
\r
105 String workflowException = BPMNUtil.getVariable(processEngineRule, "DoDeleteVnfAndModules", "WorkflowException");
\r
107 assertEquals(null, workflowException);
\r
111 private void setVariablesVnfOnly(Map<String, Object> variables) {
\r
112 variables.put("mso-request-id", "testRequestId123");
\r
113 variables.put("isDebugLogEnabled", "true");
\r
114 variables.put("vnfId","testVnfId123");
\r
115 variables.put("serviceInstanceId", "MIS%2F1604%2F0026%2FSW_INTERNET");
\r
116 //variables.put("vnfName", "testVnfName123");
\r
117 variables.put("disableRollback", "true");
\r
118 variables.put("msoRequestId", "testVnfId123");
\r
119 variables.put("testVnfId","testVnfId123");
\r
120 //variables.put("vnfType", "STMTN");
\r
121 variables.put("productFamilyId", "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb");
\r
122 String vnfModelInfo = "{ "+ "\"modelType\": \"vnf\"," +
\r
123 "\"modelInvariantUuid\": \"ff5256d2-5a33-55df-13ab-12abad84e7ff\"," +
\r
124 "\"modelUuid\": \"fe6478e5-ea33-3346-ac12-ab121484a3fe\"," +
\r
125 "\"modelName\": \"vSAMP12\"," +
\r
126 "\"modelVersion\": \"1.0\"," +
\r
127 "\"modelCustomizationUuid\": \"MODEL-ID-1234\"," +
\r
129 //variables.put("vnfModelInfo", vnfModelInfo);
\r
131 variables.put("lcpCloudRegionId", "mdt1");
\r
132 variables.put("tenantId", "88a6ca3ee0394ade9403f075db23167e");
\r
134 String serviceModelInfo = "{ "+ "\"modelType\": \"service\"," +
\r
135 "\"modelInvariantUuid\": \"995256d2-5a33-55df-13ab-12abad84e7ff\"," +
\r
136 "\"modelUuid\": \"ab6478e5-ea33-3346-ac12-ab121484a3fe\"," +
\r
137 "\"modelName\": \"ServicevSAMP12\"," +
\r
138 "\"modelVersion\": \"1.0\"," +
\r
140 //variables.put("serviceModelInfo", serviceModelInfo);
\r
141 variables.put("globalSubscriberId", "MSO-1610");
\r
142 variables.put("sdncVersion", "1707");
\r
147 @Deployment(resources = {"subprocess/DoDeleteVnfAndModules.bpmn", "subprocess/SDNCAdapterV1.bpmn", "subprocess/GenericGetVnf.bpmn", "subprocess/GenericDeleteVnf.bpmn", "subprocess/DoDeleteVnf.bpmn", "subprocess/DoDeleteVfModuleFromVnf.bpmn", "subprocess/VnfAdapterRestV1.bpmn", "subprocess/DeleteAAIVfModule.bpmn"})
\r
148 public void testDoDeleteVnfAndModules_successVnfAndModules() throws Exception{
\r
149 MockAAIGenericVnfSearch();
\r
150 MockGetGenericVnfById("testVnfId123.*", "GenericFlows/getGenericVnfByNameResponse.xml");
\r
151 MockDeleteGenericVnf("testVnfId123", "testReVer123");
\r
152 mockUpdateRequestDB(200, "Database/DBUpdateResponse.xml");
\r
153 mockSDNCAdapter(200);
\r
154 MockDoDeleteVfModule_SDNCSuccess();
\r
155 MockDoDeleteVfModule_DeleteVNFSuccess();
\r
156 MockAAIDeleteVfModule();
\r
158 String businessKey = UUID.randomUUID().toString();
\r
159 Map<String, Object> variables = new HashMap<>();
\r
160 setVariablesVnfAndModules(variables);
\r
161 invokeSubProcess("DoDeleteVnfAndModules", businessKey, variables);
\r
163 injectSDNCCallbacks(callbacks, "deactivate");
\r
164 injectSDNCCallbacks(callbacks, "deactivate");
\r
165 injectVNFRestCallbacks(callbacks, "vnfDelete");
\r
166 injectSDNCCallbacks(callbacks, "unassign");
\r
167 MockGetGenericVnfById("a27ce5a9-29c4-4c22-a017-6615ac73c721", "GenericFlows/getGenericVnfByNameResponse.xml");
\r
168 injectSDNCCallbacks(callbacks, "unassign");
\r
169 //MockGetGenericVnfById("a27ce5a9-29c4-4c22-a017-6615ac73c721", "GenericFlows/getGenericVnfByNameResponse.xml");
\r
171 waitForProcessEnd(businessKey, 10000);
\r
173 Assert.assertTrue(isProcessEnded(businessKey));
\r
175 String workflowException = BPMNUtil.getVariable(processEngineRule, "DoDeleteVnfAndModules", "WorkflowException");
\r
177 assertEquals(null, workflowException);
\r
181 private void setVariablesVnfAndModules(Map<String, Object> variables) {
\r
182 variables.put("mso-request-id", "a27ce5a9-29c4-4c22-a017-6615ac73c721");
\r
183 variables.put("isDebugLogEnabled", "true");
\r
184 variables.put("vnfId","a27ce5a9-29c4-4c22-a017-6615ac73c721");
\r
185 variables.put("serviceInstanceId", "a27ce5a9-29c4-4c22-a017-6615ac73c721");
\r
187 variables.put("msoRequestId", "a27ce5a9-29c4-4c22-a017-6615ac73c721");
\r
188 //variables.put("testVnfId","testVnfId123");
\r
190 variables.put("lcpCloudRegionId", "RDM2WAGPLCP");
\r
191 variables.put("tenantId", "fba1bd1e195a404cacb9ce17a9b2b421");
\r
193 variables.put("sdncVersion", "1707");
\r
196 ServiceDecomposition sd = new ServiceDecomposition();
\r
197 ModelInfo serviceModel = new ModelInfo();
\r
198 serviceModel.setModelName("servicewithVNFs");
\r
199 sd.setModelInfo(serviceModel);
\r
200 VnfResource vr = new VnfResource();
\r
201 ModelInfo mvr = new ModelInfo();
\r
202 mvr.setModelName("vSAMP12");
\r
203 mvr.setModelInstanceName("v123");
\r
204 mvr.setModelInvariantUuid("");
\r
205 mvr.setModelVersion("1.0");
\r
206 mvr.setModelCustomizationUuid("MODEL-ID-1234");
\r
207 vr.setModelInfo(mvr);
\r
208 vr.constructVnfType("vnf1");
\r
209 vr.setNfType("somenftype");
\r
210 vr.setNfRole("somenfrole");
\r
211 vr.setNfFunction("somenffunction");
\r
212 vr.setNfNamingCode("somenamingcode");
\r
213 ModuleResource mr = new ModuleResource();
\r
214 ModelInfo mvmr = new ModelInfo();
\r
215 mvmr.setModelInvariantUuid("ff5256d2-5a33-55df-13ab-12abad84e7ff");
\r
216 mvmr.setModelName("STMTN5MMSC21-MMSC::model-1-0");
\r
217 mvmr.setModelUuid("1.0");
\r
218 mvmr.setModelCustomizationUuid("MODEL-123");
\r
219 mr.setModelInfo(mvmr);
\r
220 mr.setIsBase(true);
\r
221 mr.setVfModuleLabel("MODULELABEL");
\r
222 vr.addVfModule(mr);
\r
223 sd.addVnfResource(vr);
\r
224 variables.put("serviceDecomposition", sd);
\r
229 @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
230 public void testDoDeleteVnfAndModulesDirectDelete_successVnfAndModules() throws Exception{
\r
231 MockDoDeleteVfModule_SDNCSuccess();
\r
232 MockDoDeleteVfModule_DeleteVNFSuccess();
\r
233 mockSDNCAdapter(200);
\r
234 MockAAIGenericVnfSearch();
\r
235 MockAAIVfModulePUT(false);
\r
236 MockAAIDeleteGenericVnf();
\r
237 MockAAIDeleteVfModule();
\r
238 MockPatchVfModuleId("a27ce5a9-29c4-4c22-a017-6615ac73c721", "973ed047-d251-4fb9-bf1a-65b8949e0a73");
\r
240 String businessKey = UUID.randomUUID().toString();
\r
241 Map<String, Object> variables = new HashMap<>();
\r
242 setVariablesVnfAndModulesDirectDelete(variables);
\r
243 invokeSubProcess("DoDeleteVnfAndModules", businessKey, variables);
\r
245 injectVNFRestCallbacks(callbacks, "vnfDelete");
\r
246 injectSDNCCallbacks(callbacks, "sdncDelete");
\r
247 MockGetGenericVnfById("a27ce5a9-29c4-4c22-a017-6615ac73c721", "GenericFlows/getGenericVnfByNameResponse.xml");
\r
249 waitForProcessEnd(businessKey, 10000);
\r
251 Assert.assertTrue(isProcessEnded(businessKey));
\r
253 String workflowException = BPMNUtil.getVariable(processEngineRule, "DoDeleteVnfAndModules", "WorkflowException");
\r
255 // WorkflowException is expected here, since empty VNF cannot be simulated here
\r
256 assertNotEquals(null, workflowException);
\r
260 private void setVariablesVnfAndModulesDirectDelete(Map<String, Object> variables) {
\r
261 variables.put("mso-request-id", "a27ce5a9-29c4-4c22-a017-6615ac73c721");
\r
262 variables.put("isDebugLogEnabled", "true");
\r
263 variables.put("vnfId","a27ce5a9-29c4-4c22-a017-6615ac73c721");
\r
264 variables.put("serviceInstanceId", "a27ce5a9-29c4-4c22-a017-6615ac73c721");
\r
266 variables.put("msoRequestId", "a27ce5a9-29c4-4c22-a017-6615ac73c721");
\r
267 //variables.put("testVnfId","testVnfId123");
\r
269 variables.put("lcpCloudRegionId", "RDM2WAGPLCP");
\r
270 variables.put("tenantId", "fba1bd1e195a404cacb9ce17a9b2b421");
\r
272 variables.put("sdncVersion", "1702");
\r
275 ServiceDecomposition sd = new ServiceDecomposition();
\r
276 ModelInfo serviceModel = new ModelInfo();
\r
277 serviceModel.setModelName("servicewithVNFs");
\r
278 sd.setModelInfo(serviceModel);
\r
279 VnfResource vr = new VnfResource();
\r
280 ModelInfo mvr = new ModelInfo();
\r
281 mvr.setModelName("vSAMP12");
\r
282 mvr.setModelInstanceName("v123");
\r
283 mvr.setModelInvariantUuid("");
\r
284 mvr.setModelVersion("1.0");
\r
285 mvr.setModelCustomizationUuid("MODEL-ID-1234");
\r
286 vr.setModelInfo(mvr);
\r
287 vr.constructVnfType("vnf1");
\r
288 vr.setNfType("somenftype");
\r
289 vr.setNfRole("somenfrole");
\r
290 vr.setNfFunction("somenffunction");
\r
291 vr.setNfNamingCode("somenamingcode");
\r
292 ModuleResource mr = new ModuleResource();
\r
293 ModelInfo mvmr = new ModelInfo();
\r
294 mvmr.setModelInvariantUuid("ff5256d2-5a33-55df-13ab-12abad84e7ff");
\r
295 mvmr.setModelName("STMTN5MMSC21-MMSC::model-1-0");
\r
296 mvmr.setModelUuid("1.0");
\r
297 mvmr.setModelCustomizationUuid("MODEL-123");
\r
298 mr.setModelInfo(mvmr);
\r
299 mr.setIsBase(true);
\r
300 mr.setVfModuleLabel("MODULELABEL");
\r
301 vr.addVfModule(mr);
\r
302 sd.addVnfResource(vr);
\r
303 variables.put("serviceDecomposition", sd);
\r
307 public static void MockAAIVfModulePUT(boolean isCreate){
\r
308 stubFor(put(urlMatching("/aai/v[0-9]+/network/generic-vnfs/generic-vnf/.*/vf-modules/vf-module/.*"))
\r
309 .withRequestBody(containing("MMSC"))
\r
310 .willReturn(aResponse()
\r
311 .withStatus(isCreate ? 201 : 200)));
\r
312 stubFor(put(urlMatching("/aai/v[0-9]+/network/generic-vnfs/generic-vnf/.*/vf-modules/vf-module/.*"))
\r
313 .withRequestBody(containing("PCRF"))
\r
314 .willReturn(aResponse()
\r
316 .withHeader("Content-Type", "text/xml")
\r
317 .withBodyFile("aaiFault.xml")));
\r
318 stubFor(put(urlMatching("/aai/v[0-9]+/network/generic-vnfs/generic-vnf/a27ce5a9-29c4-4c22-a017-6615ac73c721"))
\r
319 .willReturn(aResponse()
\r
320 .withStatus(200)));
\r
326 public static void MockDoDeleteVfModule_SDNCSuccess() {
\r
327 stubFor(post(urlEqualTo("/SDNCAdapter"))
\r
328 .withRequestBody(containing("SvcAction>deactivate"))
\r
329 .willReturn(aResponse()
\r
331 .withHeader("Content-Type", "text/xml")
\r
332 .withBodyFile("DeleteGenericVNFV1/sdncAdapterResponse.xml")));
\r
333 stubFor(post(urlEqualTo("/SDNCAdapter"))
\r
334 .withRequestBody(containing("SvcAction>unassign"))
\r
335 .willReturn(aResponse()
\r
337 .withHeader("Content-Type", "text/xml")
\r
338 .withBodyFile("DeleteGenericVNFV1/sdncAdapterResponse.xml")));
\r
342 public static void MockDoDeleteVfModule_DeleteVNFSuccess() {
\r
343 stubFor(delete(urlMatching("/vnfs/v1/vnfs/.*/vf-modules/.*"))
\r
344 .willReturn(aResponse()
\r
346 .withHeader("Content-Type", "application/xml")));
\r
347 stubFor(delete(urlMatching("/vnfs/v1/volume-groups/78987"))
\r
348 .willReturn(aResponse()
\r
350 .withHeader("Content-Type", "application/xml")));
\r