From 104aefb5d0fce75ee5c5ec4f4de1a6954925b5b6 Mon Sep 17 00:00:00 2001 From: Jim Hahn Date: Sat, 11 Nov 2017 14:21:10 -0500 Subject: Query AAI for ARs on delete Delete-vcpe code expected allotted-resources to be included within the SI response from AAI. That turns out not to be the case. As a result, the code for delete-vcpe was modified to query each AR found in the SI to get it's full info. Change-Id: I893fb2fcf50a32335bbd68d1aaa84c8d747b14f0 Issue-Id: SO-325 Signed-off-by: Jim Hahn --- .../vcpe/scripts/DeleteVcpeResCustService.groovy | 136 ++++++++++++--------- .../scripts/DeleteVcpeResCustServiceTest.groovy | 104 +++++++++++++--- .../VCPE/DeleteVcpeResCustService/getSI.xml | 36 +++--- .../DeleteVcpeResCustService/serviceToDelete.xml | 36 +++--- 4 files changed, 191 insertions(+), 121 deletions(-) diff --git a/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/vcpe/scripts/DeleteVcpeResCustService.groovy b/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/vcpe/scripts/DeleteVcpeResCustService.groovy index 77ef3f6fe0..16fb22a6d3 100644 --- a/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/vcpe/scripts/DeleteVcpeResCustService.groovy +++ b/bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/vcpe/scripts/DeleteVcpeResCustService.groovy @@ -30,6 +30,7 @@ import org.openecomp.mso.bpmn.core.json.JsonUtils import org.openecomp.mso.bpmn.core.WorkflowException import org.openecomp.mso.rest.APIResponse import org.openecomp.mso.bpmn.common.scripts.AbstractServiceTaskProcessor +import org.openecomp.mso.bpmn.common.scripts.AaiUtil import java.util.UUID; @@ -40,6 +41,7 @@ import org.json.JSONArray; import org.apache.commons.lang3.* import org.apache.commons.codec.binary.Base64; import org.springframework.web.util.UriUtils; +import static org.apache.commons.lang3.StringUtils.* /** * This groovy class supports the DeleteVcpeResCustService.bpmn process. @@ -145,7 +147,7 @@ public class DeleteVcpeResCustService extends AbstractServiceTaskProcessor { execution.setVariable("tenantId", tenantId) utils.log("DEBUG","tenantId: "+ tenantId, isDebugEnabled) - String sdncVersion = "1702" + String sdncVersion = "1707" execution.setVariable("sdncVersion", sdncVersion) utils.log("DEBUG","sdncVersion: "+ sdncVersion, isDebugEnabled) @@ -194,7 +196,7 @@ public class DeleteVcpeResCustService extends AbstractServiceTaskProcessor { public void prepareServiceDelete(Execution execution) { def isDebugEnabled=execution.getVariable(DebugFlag) - utils.log("DEBUG", " ***** Inside prepareServiceInstanceDelete() of DeleteVcpeResCustService ***** ", isDebugEnabled) + utils.log("DEBUG", " ***** Inside prepareServiceDelete() of DeleteVcpeResCustService ***** ", isDebugEnabled) try { @@ -214,81 +216,95 @@ public class DeleteVcpeResCustService extends AbstractServiceTaskProcessor { String serviceInstanceAaiRecord = execution.getVariable("GENGS_service"); utils.log("DEBUG", "serviceInstanceAaiRecord: "+serviceInstanceAaiRecord, isDebugEnabled) + serviceInstanceAaiRecord = utils.removeXmlNamespaces(serviceInstanceAaiRecord) - // determine if AR needs to be deleted - boolean DVRCS_TunnelXConn = false - boolean DVRCS_BRG = false - String TXC_allottedResourceId - String BRG_allottedResourceId - XmlParser xmlParser = new XmlParser() - def groovy.util.Node siNode = xmlParser.parseText(serviceInstanceAaiRecord) - def groovy.util.Node arList = utils.getChildNode(siNode, 'allotted-resources') - if (arList != null) { - def groovy.util.NodeList ars = utils.getIdenticalChildren(arList, 'allotted-resource') - for (groovy.util.Node ar in ars) { - def type = utils.getChildNodeText(ar, 'type') - if ("TunnelXConn".equals(type)) { + def (TXC_found, TXC_id) = new Tuple(false, null) + def (BRG_found, BRG_id) = new Tuple(false, null) + List relatedVnfIdList = [] + + for(Node rel: utils.getMultNodeObjects(serviceInstanceAaiRecord, "relationship")) { + def relto = utils.getChildNodeText(rel, "related-to") + def relink = utils.getChildNodeText(rel, "related-link") + utils.log("DEBUG", "check: "+relto+" link: "+relink, isDebugEnabled) + + if(isBlank(relto) || isBlank(relink)) { + + } else if(relto == "generic-vnf") { + def id = relink.substring(relink.indexOf("/generic-vnf/")+13) + if(id.endsWith("/")) { + id = id.substring(0, id.length()-1) + } + + relatedVnfIdList.add(id) + + } else if(relto == "allotted-resource") { + def (type, id) = getAaiAr(execution, relink) + + if(isBlank(type) || isBlank(id)) { + + } else if(type == "TunnelXConn") { utils.log("DEBUG","TunnelXConn AR found", isDebugEnabled) - def id = utils.getChildNodeText(ar, 'id') - if (id != null){ - DVRCS_TunnelXConn = true - TXC_allottedResourceId = id - } - } else if ("BRG".equals(type)) { - utils.log("DEBUG","FW AR found", isDebugEnabled) - def id = utils.getChildNodeText(ar, 'id') - if (id != null){ - DVRCS_BRG = true - BRG_allottedResourceId = id - } + TXC_found = true + TXC_id = id + + } else if(type == "BRG") { + utils.log("DEBUG","BRG AR found", isDebugEnabled) + BRG_found = true + BRG_id = id } } } - execution.setVariable(Prefix+"TunnelXConn", DVRCS_TunnelXConn) - utils.log("DEBUG", Prefix+"TunnelXConn : " + DVRCS_TunnelXConn, isDebugEnabled) - execution.setVariable("TXC_allottedResourceId", TXC_allottedResourceId) - utils.log("DEBUG", "TXC_allottedResourceId : " + TXC_allottedResourceId, isDebugEnabled) - execution.setVariable(Prefix+"BRG", DVRCS_BRG) - utils.log("DEBUG", Prefix+"BRG : " + DVRCS_BRG, isDebugEnabled) - execution.setVariable("BRG_allottedResourceId", BRG_allottedResourceId) - utils.log("DEBUG", "BRG_allottedResourceId : " + BRG_allottedResourceId, isDebugEnabled) - - String relationship = "" - try { - relationship = networkUtils.getFirstNodeXml(serviceInstanceAaiRecord, "relationship-list") - } catch (Exception ex) { - //no relationships found - } - utils.log("DEBUG", " relationship string - " + relationship, isDebugEnabled) + execution.setVariable(Prefix+"TunnelXConn", TXC_found) + execution.setVariable("TXC_allottedResourceId", TXC_id) + utils.log("DEBUG", "TXC_allottedResourceId: " + TXC_id, isDebugEnabled) + + execution.setVariable(Prefix+"BRG", BRG_found) + execution.setVariable("BRG_allottedResourceId", BRG_id) + utils.log("DEBUG", "BRG_allottedResourceId: " + BRG_id, isDebugEnabled) - int vnfsCount = 0 - - if (relationship != null && relationship.length() > 0){ - relationship = relationship.trim().replace("tag0:","").replace(":tag0","") - - // Check if Network TableREf is present, then build a List of network policy - List relatedVnfIdList = networkUtils.getRelatedVnfIdList(relationship) - vnfsCount = relatedVnfIdList.size() - execution.setVariable(Prefix+"vnfsCount", vnfsCount) - utils.log("DEBUG", " "+Prefix+"vnfsCount : " + vnfsCount, isDebugEnabled) + int vnfsCount = relatedVnfIdList.size() + execution.setVariable(Prefix+"vnfsCount", vnfsCount) + utils.log("DEBUG", " "+Prefix+"vnfsCount : " + vnfsCount, isDebugEnabled) + if(vnfsCount > 0) { execution.setVariable(Prefix+"relatedVnfIdList", relatedVnfIdList) - } else { - execution.setVariable(Prefix+"vnfsCount", 0) - utils.log("DEBUG", " "+Prefix+"vnfsCount : " + vnfsCount, isDebugEnabled) } - utils.log("DEBUG", " ***** Completed prepareServiceInstanceDelete() of DeleteVcpeResCustService ***** ", isDebugEnabled) + utils.log("DEBUG", " ***** Completed prepareServiceDelete() of DeleteVcpeResCustService ***** ", isDebugEnabled) } catch (BpmnError e){ throw e; } catch (Exception ex) { sendSyncError(execution) - String exceptionMessage = "Bpmn error encountered in DeleteVcpeResCustService flow. prepareServiceInstanceDelete() - " + ex.getMessage() - utils.log("DEBUG", exceptionMessage, isDebugEnabled) - exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage) + String exceptionMessage = "Bpmn error encountered in DeleteVcpeResCustService flow. prepareServiceDelete() - " + ex.getMessage() + utils.log("DEBUG", exceptionMessage, isDebugEnabled) + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage) } } + private getAaiAr(Execution execution, String relink) { + def isDebugEnabled = execution.getVariable(DebugFlag) + AaiUtil aaiUtil = new AaiUtil(this) + String aaiEndpoint = execution.getVariable("URN_aai_endpoint") + relink + + utils.log("DEBUG", "get AR info " + aaiEndpoint, isDebugEnabled) + APIResponse response = aaiUtil.executeAAIGetCall(execution, aaiEndpoint) + + int responseCode = response.getStatusCode() + utils.log("DEBUG", "get AR info responseCode:" + responseCode, isDebugEnabled) + + String aaiResponse = response.getResponseBodyAsString() + utils.log("DEBUG", "get AR info " + aaiResponse, isDebugEnabled) + + if(responseCode < 200 || responseCode >= 300 || isBlank(aaiResponse)) { + return new Tuple2(null, null) + } + + def type = utils.getNodeText1(aaiResponse, "type") + def id = utils.getNodeText1(aaiResponse, "id") + + return new Tuple2(type, id) + } + // ******************************* // diff --git a/bpmn/MSOInfrastructureBPMN/src/test/groovy/org/openecomp/mso/bpmn/vcpe/scripts/DeleteVcpeResCustServiceTest.groovy b/bpmn/MSOInfrastructureBPMN/src/test/groovy/org/openecomp/mso/bpmn/vcpe/scripts/DeleteVcpeResCustServiceTest.groovy index fc53744b8b..65c9e456e4 100644 --- a/bpmn/MSOInfrastructureBPMN/src/test/groovy/org/openecomp/mso/bpmn/vcpe/scripts/DeleteVcpeResCustServiceTest.groovy +++ b/bpmn/MSOInfrastructureBPMN/src/test/groovy/org/openecomp/mso/bpmn/vcpe/scripts/DeleteVcpeResCustServiceTest.groovy @@ -94,23 +94,24 @@ class DeleteVcpeResCustServiceTest extends GroovyTestBase { DeleteVcpeResCustService DeleteVcpeResCustService = new DeleteVcpeResCustService() DeleteVcpeResCustService.preProcessRequest(mex) - verify(mex).getVariable(DBGFLAG) - verify(mex).setVariable("prefix", Prefix) - verify(mex).setVariable("DeleteVcpeResCustServiceRequest", request) - verify(mex).setVariable("msoRequestId", "mri") - verify(mex).setVariable("requestAction", "ra") - verify(mex).setVariable("source", "VID") - verify(mex).setVariable("globalSubscriberId", CUST) - verify(mex).setVariable("globalCustomerId", CUST) - verify(mex).setVariable("disableRollback", "false") - verify(mex).setVariable("productFamilyId", "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb") - verify(mex).setVariable("subscriptionServiceType", SVC) + verify(mex).getVariable(DBGFLAG) - verify(mex).setVariable("lcpCloudRegionId", "mdt1") - verify(mex).setVariable("tenantId", "8b1df54faa3b49078e3416e21370a3ba") + assertEquals(Prefix, map.get("prefix")) + assertEquals(request, map.get("DeleteVcpeResCustServiceRequest")) + assertEquals("mri", map.get("msoRequestId")) + assertEquals("ra", map.get("requestAction")) + assertEquals("VID", map.get("source")) + assertEquals(CUST, map.get("globalSubscriberId")) + assertEquals(CUST, map.get("globalCustomerId")) + assertEquals("false", map.get("disableRollback")) + assertEquals("a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", map.get("productFamilyId")) + assertEquals(SVC, map.get("subscriptionServiceType")) + + assertEquals("mdt1", map.get("lcpCloudRegionId")) + assertEquals("8b1df54faa3b49078e3416e21370a3ba", map.get("tenantId")) + assertEquals("1707", map.get("sdncVersion")) + assertEquals("service-instance", map.get("GENGS_type")) assertEquals("""{"tenantId":"8b1df54faa3b49078e3416e21370a3ba","lcpCloudRegionId":"mdt1"}""", map.get("cloudConfiguration")) - verify(mex).setVariable("sdncVersion", "1702") - verify(mex).setVariable("GENGS_type", "service-instance") assertTrue(map.containsKey(Prefix+"requestInfo")) def reqinfo = map.get(Prefix+"requestInfo") @@ -148,7 +149,7 @@ class DeleteVcpeResCustServiceTest extends GroovyTestBase { verify(mex).setVariable("lcpCloudRegionId", "mdt1") verify(mex).setVariable("tenantId", "8b1df54faa3b49078e3416e21370a3ba") assertEquals("""{"tenantId":"8b1df54faa3b49078e3416e21370a3ba","lcpCloudRegionId":"mdt1"}""", map.get("cloudConfiguration")) - verify(mex).setVariable("sdncVersion", "1702") + verify(mex).setVariable("sdncVersion", "1707") verify(mex).setVariable("GENGS_type", "service-instance") assertTrue(map.containsKey(Prefix+"requestInfo")) @@ -258,16 +259,18 @@ class DeleteVcpeResCustServiceTest extends GroovyTestBase { def map = setupMap(mex) initPrepareServiceDelete(mex) + myMockGetAr("/aai/v11/anytxc", 200, "arGetTXCById.xml"); + myMockGetAr("/aai/v11/anybrg", 200, "arGetBRGById.xml"); + myMockGetAr("/aai/v11/other", 200, "arGetOtherById.xml"); + DeleteVcpeResCustService DeleteVcpeResCustService = new DeleteVcpeResCustService() DeleteVcpeResCustService.prepareServiceDelete(mex) - - verify(mex).getVariable(DBGFLAG) verify(mex).setVariable(Prefix+"TunnelXConn", true) - assertEquals("txcA", map.get("TXC_allottedResourceId")) + assertEquals("ar-txcA", map.get("TXC_allottedResourceId")) verify(mex).setVariable(Prefix+"BRG", true) - assertEquals("brgB", map.get("BRG_allottedResourceId")) + assertEquals("ar-brgB", map.get("BRG_allottedResourceId")) verify(mex).setVariable(Prefix+"vnfsCount", 2) assertNotNull(map.get(Prefix+"relatedVnfIdList")) @@ -353,9 +356,62 @@ class DeleteVcpeResCustServiceTest extends GroovyTestBase { when(mex.getVariable("GENGS_FoundIndicator")).thenReturn(true) when(mex.getVariable("mso-request-id")).thenReturn("mri") when(mex.getVariable("DeleteVcpeResCustServiceRequest")).thenReturn(request) + when(mex.getVariable("URN_aai_endpoint")).thenReturn(aaiUriPfx) when(mex.getVariable("GENGS_service")).thenReturn(FileUtil.readResourceFile("__files/VCPE/DeleteVcpeResCustService/serviceToDelete.xml")) } + // ***** getAaiAr ***** + + @Test +// @Ignore + public void getAaiAr() { + myMockGetAr("/myurl/ar1", 200, "arGetBRGById.xml"); + + ExecutionEntity mex = setupMock() + initGetAaiAr(mex) + + DeleteVcpeResCustService DeleteVcpeResCustService = new DeleteVcpeResCustService() + def (type, id) = DeleteVcpeResCustService.getAaiAr(mex, "/myurl/ar1") + + assertEquals("BRG", type) + assertEquals("ar-brgB", id) + } + + @Test +// @Ignore + public void getAaiAr_401() { + myMockGetAr("/myurl/ar1", 401, "arGetBRGById.xml"); + + ExecutionEntity mex = setupMock() + initGetAaiAr(mex) + + DeleteVcpeResCustService DeleteVcpeResCustService = new DeleteVcpeResCustService() + def (type, id) = DeleteVcpeResCustService.getAaiAr(mex, "/myurl/ar1") + + assertEquals(null, type) + assertEquals(null, id) + } + + @Test +// @Ignore + public void getAaiAr_EmptyResponse() { + myMockGetAr("/myurl/ar1", 200, "empty.txt"); + + ExecutionEntity mex = setupMock() + initGetAaiAr(mex) + + DeleteVcpeResCustService DeleteVcpeResCustService = new DeleteVcpeResCustService() + def (type, id) = DeleteVcpeResCustService.getAaiAr(mex, "/myurl/ar1") + + assertEquals(null, type) + assertEquals(null, id) + } + + private void initGetAaiAr(ExecutionEntity mex) { + when(mex.getVariable(DBGFLAG)).thenReturn("true") + when(mex.getVariable("URN_aai_endpoint")).thenReturn(aaiUriPfx) + } + // ***** prepareVnfAndModulesDelete ***** @Test @@ -707,5 +763,13 @@ class DeleteVcpeResCustServiceTest extends GroovyTestBase { private initProcessJavaException(ExecutionEntity mex) { when(mex.getVariable(DBGFLAG)).thenReturn("true") + } + + private void myMockGetAr(String url, int status, String fileResp) { + stubFor(get(urlMatching(url)) + .willReturn(aResponse() + .withStatus(status) + .withHeader("Content-Type", "text/xml") + .withBodyFile("VCPE/DeleteVcpeResCustService/" + fileResp))); } } diff --git a/bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/DeleteVcpeResCustService/getSI.xml b/bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/DeleteVcpeResCustService/getSI.xml index 4f95ed2f19..e0511873b6 100644 --- a/bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/DeleteVcpeResCustService/getSI.xml +++ b/bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/DeleteVcpeResCustService/getSI.xml @@ -1,43 +1,35 @@ MIS/1604/0026/SW_INTERNET - 123456789 - - - - TunnelXConn - ar-txcA - - - BRG - ar-brgB - - - other - ar-otherC - - - + 123456789 generic-vnf - https://aai-ext1.test.com:8443/aai/v7/generic-vnf/vnfX + /aai/v7/generic-vnf/vnfX l3-network - https://aai-ext1.test.com:8443/aai/v7/l3-network/netA + /aai/v7/l3-network/netA generic-vnf - https://aai-ext1.test.com:8443/aai/v7/generic-vnf/vnfY + /aai/v7/generic-vnf/vnfY l3-network - https://aai-ext1.test.com:8443/aai/v7/l3-network/netB + /aai/v7/l3-network/netB l3-network - https://aai-ext1.test.com:8443/aai/v7/l3-network/netC + /aai/v7/l3-network/netC + + + allotted-resource + /aai/v11/business/customers/customer/SDN-ETHERNET-INTERNET/service-subscriptions/service-subscription/123456789/service-instances/service-instance/MIS%252F1604%252F0026%252FSW_INTERNET/allotted-resources/allotted-resource/ar-txcA + + + allotted-resource + /aai/v11/business/customers/customer/SDN-ETHERNET-INTERNET/service-subscriptions/service-subscription/123456789/service-instances/service-instance/MIS%252F1604%252F0026%252FSW_INTERNET/allotted-resources/allotted-resource/ar-brgB diff --git a/bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/DeleteVcpeResCustService/serviceToDelete.xml b/bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/DeleteVcpeResCustService/serviceToDelete.xml index 6071c51b2d..8b8863e29c 100644 --- a/bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/DeleteVcpeResCustService/serviceToDelete.xml +++ b/bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/DeleteVcpeResCustService/serviceToDelete.xml @@ -1,38 +1,36 @@ - - - TunnelXConn - txcA - - - BRG - brgB - - - other - otherC - - generic-vnf - https://aai-ext1.test.com:8443/aai/v7/generic-vnf/vnfX + /aai/v7/generic-vnf/vnfX l3-network - https://aai-ext1.test.com:8443/aai/v7/l3-network/netA + /aai/v7/l3-network/netA generic-vnf - https://aai-ext1.test.com:8443/aai/v7/generic-vnf/vnfY + /aai/v7/generic-vnf/vnfY/ l3-network - https://aai-ext1.test.com:8443/aai/v7/l3-network/netB + /aai/v7/l3-network/netB l3-network - https://aai-ext1.test.com:8443/aai/v7/l3-network/netC + /aai/v7/l3-network/netC + + + allotted-resource + /aai/v11/anytxc + + + allotted-resource + /aai/v11/anybrg + + + allotted-resource + /aai/v11/other -- cgit 1.2.3-korg