Query AAI for ARs on delete 31/23231/1
authorJim Hahn <jrh3@att.com>
Sat, 11 Nov 2017 19:21:10 +0000 (14:21 -0500)
committerJim Hahn <jrh3@att.com>
Sat, 11 Nov 2017 19:21:10 +0000 (14:21 -0500)
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 <jrh3@att.com>
bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/vcpe/scripts/DeleteVcpeResCustService.groovy
bpmn/MSOInfrastructureBPMN/src/test/groovy/org/openecomp/mso/bpmn/vcpe/scripts/DeleteVcpeResCustServiceTest.groovy
bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/DeleteVcpeResCustService/getSI.xml
bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/DeleteVcpeResCustService/serviceToDelete.xml

index 77ef3f6..16fb22a 100644 (file)
@@ -30,6 +30,7 @@ import org.openecomp.mso.bpmn.core.json.JsonUtils
 import org.openecomp.mso.bpmn.core.WorkflowException\r
 import org.openecomp.mso.rest.APIResponse\r
 import org.openecomp.mso.bpmn.common.scripts.AbstractServiceTaskProcessor\r
+import org.openecomp.mso.bpmn.common.scripts.AaiUtil\r
 \r
 import java.util.UUID;\r
 \r
@@ -40,6 +41,7 @@ import org.json.JSONArray;
 import org.apache.commons.lang3.*\r
 import org.apache.commons.codec.binary.Base64;\r
 import org.springframework.web.util.UriUtils;\r
+import static org.apache.commons.lang3.StringUtils.*\r
 \r
 /**\r
  * This groovy class supports the <class>DeleteVcpeResCustService.bpmn</class> process.\r
@@ -145,7 +147,7 @@ public class DeleteVcpeResCustService extends AbstractServiceTaskProcessor {
                        execution.setVariable("tenantId", tenantId)\r
                        utils.log("DEBUG","tenantId: "+ tenantId, isDebugEnabled)\r
 \r
-                       String sdncVersion = "1702"\r
+                       String sdncVersion = "1707"\r
                        execution.setVariable("sdncVersion", sdncVersion)\r
                        utils.log("DEBUG","sdncVersion: "+ sdncVersion, isDebugEnabled)\r
                        \r
@@ -194,7 +196,7 @@ public class DeleteVcpeResCustService extends AbstractServiceTaskProcessor {
 \r
        public void prepareServiceDelete(Execution execution) {\r
                def isDebugEnabled=execution.getVariable(DebugFlag)\r
-               utils.log("DEBUG", " ***** Inside prepareServiceInstanceDelete() of DeleteVcpeResCustService ***** ", isDebugEnabled)\r
+               utils.log("DEBUG", " ***** Inside prepareServiceDelete() of DeleteVcpeResCustService ***** ", isDebugEnabled)\r
                \r
                try {\r
                        \r
@@ -214,81 +216,95 @@ public class DeleteVcpeResCustService extends AbstractServiceTaskProcessor {
                        String serviceInstanceAaiRecord = execution.getVariable("GENGS_service");\r
                        \r
                        utils.log("DEBUG", "serviceInstanceAaiRecord: "+serviceInstanceAaiRecord, isDebugEnabled)\r
+                       serviceInstanceAaiRecord = utils.removeXmlNamespaces(serviceInstanceAaiRecord)\r
                        \r
-                       // determine if AR needs to be deleted\r
-                       boolean DVRCS_TunnelXConn = false\r
-                       boolean DVRCS_BRG = false\r
-                       String TXC_allottedResourceId\r
-                       String BRG_allottedResourceId\r
-                       XmlParser xmlParser = new XmlParser()\r
-                       def groovy.util.Node siNode = xmlParser.parseText(serviceInstanceAaiRecord)\r
-                       def groovy.util.Node arList = utils.getChildNode(siNode, 'allotted-resources')\r
-                       if (arList != null) {\r
-                               def groovy.util.NodeList ars = utils.getIdenticalChildren(arList, 'allotted-resource')\r
-                               for (groovy.util.Node ar in ars) {\r
-                                       def type = utils.getChildNodeText(ar, 'type')\r
-                                       if ("TunnelXConn".equals(type)) {\r
+                       def (TXC_found, TXC_id) = new Tuple(false, null)\r
+                       def (BRG_found, BRG_id) = new Tuple(false, null)\r
+                       List relatedVnfIdList = []\r
+                       \r
+                       for(Node rel: utils.getMultNodeObjects(serviceInstanceAaiRecord, "relationship")) {\r
+                               def relto = utils.getChildNodeText(rel, "related-to")\r
+                               def relink = utils.getChildNodeText(rel, "related-link")\r
+                               utils.log("DEBUG", "check: "+relto+" link: "+relink, isDebugEnabled)\r
+                               \r
+                               if(isBlank(relto) || isBlank(relink)) {\r
+                                       \r
+                               } else if(relto == "generic-vnf") {\r
+                                       def id = relink.substring(relink.indexOf("/generic-vnf/")+13)\r
+                                       if(id.endsWith("/")) {\r
+                                               id = id.substring(0, id.length()-1)\r
+                                       }\r
+                                       \r
+                                       relatedVnfIdList.add(id)\r
+                                       \r
+                               } else if(relto == "allotted-resource") {\r
+                                       def (type, id) = getAaiAr(execution, relink)\r
+                                       \r
+                                       if(isBlank(type) || isBlank(id)) {\r
+                                               \r
+                                       } else if(type == "TunnelXConn") {\r
                                                utils.log("DEBUG","TunnelXConn AR found", isDebugEnabled)\r
-                                               def id = utils.getChildNodeText(ar, 'id')\r
-                                               if (id != null){\r
-                                                       DVRCS_TunnelXConn = true\r
-                                                       TXC_allottedResourceId = id\r
-                                               }\r
-                                       } else if ("BRG".equals(type)) {\r
-                                               utils.log("DEBUG","FW AR found", isDebugEnabled)\r
-                                               def id = utils.getChildNodeText(ar, 'id')\r
-                                               if (id != null){\r
-                                                       DVRCS_BRG = true\r
-                                                       BRG_allottedResourceId = id\r
-                                               }\r
+                                               TXC_found = true\r
+                                               TXC_id = id\r
+                                               \r
+                                       } else if(type == "BRG") {\r
+                                               utils.log("DEBUG","BRG AR found", isDebugEnabled)\r
+                                               BRG_found = true\r
+                                               BRG_id = id\r
                                        }\r
                                }\r
                        }\r
-                       execution.setVariable(Prefix+"TunnelXConn", DVRCS_TunnelXConn)\r
-                       utils.log("DEBUG", Prefix+"TunnelXConn : " + DVRCS_TunnelXConn, isDebugEnabled)\r
-                       execution.setVariable("TXC_allottedResourceId", TXC_allottedResourceId)\r
-                       utils.log("DEBUG", "TXC_allottedResourceId : " + TXC_allottedResourceId, isDebugEnabled)\r
                        \r
-                       execution.setVariable(Prefix+"BRG", DVRCS_BRG)\r
-                       utils.log("DEBUG", Prefix+"BRG : " + DVRCS_BRG, isDebugEnabled)\r
-                       execution.setVariable("BRG_allottedResourceId", BRG_allottedResourceId)\r
-                       utils.log("DEBUG", "BRG_allottedResourceId : " + BRG_allottedResourceId, isDebugEnabled)\r
-               \r
-                       String relationship = ""\r
-                       try {\r
-                               relationship = networkUtils.getFirstNodeXml(serviceInstanceAaiRecord, "relationship-list")\r
-                       } catch (Exception ex) {\r
-                               //no relationships found\r
-                       }\r
-                       utils.log("DEBUG", " relationship string - " + relationship, isDebugEnabled)\r
+                       execution.setVariable(Prefix+"TunnelXConn", TXC_found)\r
+                       execution.setVariable("TXC_allottedResourceId", TXC_id)\r
+                       utils.log("DEBUG", "TXC_allottedResourceId: " + TXC_id, isDebugEnabled)\r
+                                               \r
+                       execution.setVariable(Prefix+"BRG", BRG_found)\r
+                       execution.setVariable("BRG_allottedResourceId", BRG_id)\r
+                       utils.log("DEBUG", "BRG_allottedResourceId: " + BRG_id, isDebugEnabled)\r
                        \r
-                       int vnfsCount = 0\r
-                       \r
-                       if (relationship != null && relationship.length() > 0){\r
-                               relationship = relationship.trim().replace("tag0:","").replace(":tag0","")\r
-                               \r
-                               // Check if Network TableREf is present, then build a List of network policy\r
-                               List relatedVnfIdList = networkUtils.getRelatedVnfIdList(relationship)\r
-                               vnfsCount = relatedVnfIdList.size()\r
-                               execution.setVariable(Prefix+"vnfsCount", vnfsCount)\r
-                               utils.log("DEBUG", " "+Prefix+"vnfsCount : " + vnfsCount, isDebugEnabled)\r
+                       int vnfsCount = relatedVnfIdList.size()\r
+                       execution.setVariable(Prefix+"vnfsCount", vnfsCount)\r
+                       utils.log("DEBUG", " "+Prefix+"vnfsCount : " + vnfsCount, isDebugEnabled)\r
+                       if(vnfsCount > 0) {\r
                                execution.setVariable(Prefix+"relatedVnfIdList", relatedVnfIdList)\r
-                       } else {\r
-                               execution.setVariable(Prefix+"vnfsCount", 0)\r
-                               utils.log("DEBUG", " "+Prefix+"vnfsCount : " + vnfsCount, isDebugEnabled)\r
                        }\r
                        \r
-                       utils.log("DEBUG", " ***** Completed prepareServiceInstanceDelete() of DeleteVcpeResCustService ***** ", isDebugEnabled)\r
+                       utils.log("DEBUG", " ***** Completed prepareServiceDelete() of DeleteVcpeResCustService ***** ", isDebugEnabled)\r
                } catch (BpmnError e){\r
                        throw e;\r
                } catch (Exception ex) {\r
                        sendSyncError(execution)\r
-                  String exceptionMessage = "Bpmn error encountered in DeleteVcpeResCustService flow. prepareServiceInstanceDelete() - " + ex.getMessage()\r
-                  utils.log("DEBUG", exceptionMessage, isDebugEnabled)\r
-                  exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)\r
+                   String exceptionMessage = "Bpmn error encountered in DeleteVcpeResCustService flow. prepareServiceDelete() - " + ex.getMessage()\r
+                   utils.log("DEBUG", exceptionMessage, isDebugEnabled)\r
+                   exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)\r
                }\r
        }\r
        \r
+       private getAaiAr(Execution execution, String relink) {\r
+               def isDebugEnabled = execution.getVariable(DebugFlag)\r
+               AaiUtil aaiUtil = new AaiUtil(this)\r
+               String aaiEndpoint = execution.getVariable("URN_aai_endpoint") + relink\r
+               \r
+               utils.log("DEBUG", "get AR info " + aaiEndpoint, isDebugEnabled)\r
+               APIResponse response = aaiUtil.executeAAIGetCall(execution, aaiEndpoint)\r
+               \r
+               int responseCode = response.getStatusCode()\r
+               utils.log("DEBUG", "get AR info responseCode:" + responseCode, isDebugEnabled)\r
+               \r
+               String aaiResponse = response.getResponseBodyAsString()\r
+               utils.log("DEBUG", "get AR info " + aaiResponse, isDebugEnabled)\r
+               \r
+               if(responseCode < 200 || responseCode >= 300 || isBlank(aaiResponse)) {\r
+                       return new Tuple2(null, null)\r
+               }\r
+               \r
+               def type = utils.getNodeText1(aaiResponse, "type")\r
+               def id = utils.getNodeText1(aaiResponse, "id")\r
+               \r
+               return new Tuple2(type, id)\r
+       }\r
+       \r
        \r
        // *******************************\r
        //     \r
index fc53744..65c9e45 100644 (file)
@@ -94,23 +94,24 @@ class DeleteVcpeResCustServiceTest extends GroovyTestBase {
                DeleteVcpeResCustService DeleteVcpeResCustService = new DeleteVcpeResCustService()\r
                DeleteVcpeResCustService.preProcessRequest(mex)\r
 \r
-               verify(mex).getVariable(DBGFLAG)\r
-               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)));
        }\r
 }
index 4f95ed2..e051187 100644 (file)
@@ -1,43 +1,35 @@
 <service-instance>
        
    <service-instance-id>MIS/1604/0026/SW_INTERNET</service-instance-id>
-   <resource-version>123456789</resource-version>
-   
-       <allotted-resources>
-               <allotted-resource>
-                       <type>TunnelXConn</type>
-                       <id>ar-txcA</id>
-               </allotted-resource>
-               <allotted-resource>
-                       <type>BRG</type>
-                       <id>ar-brgB</id>
-               </allotted-resource>
-               <allotted-resource>
-                       <type>other</type>
-                       <id>ar-otherC</id>
-               </allotted-resource>
-       </allotted-resources>
-       
+   <resource-version>123456789</resource-version>      
        <relationship-list>
       <relationship>
          <related-to>generic-vnf</related-to>
-         <related-link>https://aai-ext1.test.com:8443/aai/v7/generic-vnf/vnfX</related-link>
+         <related-link>/aai/v7/generic-vnf/vnfX</related-link>
       </relationship>
       <relationship>
          <related-to>l3-network</related-to>
-         <related-link>https://aai-ext1.test.com:8443/aai/v7/l3-network/netA</related-link>
+         <related-link>/aai/v7/l3-network/netA</related-link>
       </relationship>
       <relationship>
          <related-to>generic-vnf</related-to>
-         <related-link>https://aai-ext1.test.com:8443/aai/v7/generic-vnf/vnfY</related-link>
+         <related-link>/aai/v7/generic-vnf/vnfY</related-link>
       </relationship>
       <relationship>
          <related-to>l3-network</related-to>
-         <related-link>https://aai-ext1.test.com:8443/aai/v7/l3-network/netB</related-link>
+         <related-link>/aai/v7/l3-network/netB</related-link>
       </relationship>
       <relationship>
          <related-to>l3-network</related-to>
-         <related-link>https://aai-ext1.test.com:8443/aai/v7/l3-network/netC</related-link>
+         <related-link>/aai/v7/l3-network/netC</related-link>
+      </relationship>
+      <relationship>
+         <related-to>allotted-resource</related-to>
+         <related-link>/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</related-link>
+      </relationship>
+      <relationship>
+         <related-to>allotted-resource</related-to>
+         <related-link>/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</related-link>
       </relationship>
    </relationship-list>
 </service-instance>
index 6071c51..8b8863e 100644 (file)
@@ -1,38 +1,36 @@
 <service xmlns="http://org.openecomp.aai.inventory/v9">
-       <allotted-resources>
-               <allotted-resource>
-                       <type>TunnelXConn</type>
-                       <id>txcA</id>
-               </allotted-resource>
-               <allotted-resource>
-                       <type>BRG</type>
-                       <id>brgB</id>
-               </allotted-resource>
-               <allotted-resource>
-                       <type>other</type>
-                       <id>otherC</id>
-               </allotted-resource>
-       </allotted-resources>
        <relationship-list>
       <relationship>
          <related-to>generic-vnf</related-to>
-         <related-link>https://aai-ext1.test.com:8443/aai/v7/generic-vnf/vnfX</related-link>
+         <related-link>/aai/v7/generic-vnf/vnfX</related-link>
       </relationship>
       <relationship>
          <related-to>l3-network</related-to>
-         <related-link>https://aai-ext1.test.com:8443/aai/v7/l3-network/netA</related-link>
+         <related-link>/aai/v7/l3-network/netA</related-link>
       </relationship>
       <relationship>
          <related-to>generic-vnf</related-to>
-         <related-link>https://aai-ext1.test.com:8443/aai/v7/generic-vnf/vnfY</related-link>
+         <related-link>/aai/v7/generic-vnf/vnfY/</related-link>
       </relationship>
       <relationship>
          <related-to>l3-network</related-to>
-         <related-link>https://aai-ext1.test.com:8443/aai/v7/l3-network/netB</related-link>
+         <related-link>/aai/v7/l3-network/netB</related-link>
       </relationship>
       <relationship>
          <related-to>l3-network</related-to>
-         <related-link>https://aai-ext1.test.com:8443/aai/v7/l3-network/netC</related-link>
+         <related-link>/aai/v7/l3-network/netC</related-link>
+      </relationship>
+      <relationship>
+         <related-to>allotted-resource</related-to>
+         <related-link>/aai/v11/anytxc</related-link>
+      </relationship>
+      <relationship>
+         <related-to>allotted-resource</related-to>
+         <related-link>/aai/v11/anybrg</related-link>
+      </relationship>
+      <relationship>
+         <related-to>allotted-resource</related-to>
+         <related-link>/aai/v11/other</related-link>
       </relationship>
    </relationship-list>
 </service>