Display CCVPN network topology and tunnel installation. 94/127894/2
authordecheng zhang <decheng.zhang@huawei.com>
Thu, 7 Oct 2021 01:07:43 +0000 (21:07 -0400)
committerdecheng zhang <decheng.zhang@huawei.com>
Mon, 21 Mar 2022 02:56:55 +0000 (22:56 -0400)
Issue-ID: REQ-1103
Signed-off-by: decheng zhang <decheng.zhang@huawei.com>
Change-Id: Ia8ad763ef8cdd48238c1398bd6680cc8ea2d14d6
Signed-off-by: decheng zhang <decheng.zhang@huawei.com>
24 files changed:
usecaseui-portal/.angular-cli.json
usecaseui-portal/package-lock.json
usecaseui-portal/package.json
usecaseui-portal/src/app/app.module.ts
usecaseui-portal/src/app/core/services/appEvent.ts [deleted file]
usecaseui-portal/src/app/core/services/appEventType.ts [deleted file]
usecaseui-portal/src/app/core/services/eventQueue.service.ts [deleted file]
usecaseui-portal/src/app/core/services/networkHttpservice.service.ts
usecaseui-portal/src/app/mock/json/uui-sotn_getConnectivities.json [new file with mode: 0644]
usecaseui-portal/src/app/mock/json/uui-sotn_getConnectivityInfo.json
usecaseui-portal/src/app/mock/json/uui-sotn_getLogicalLinks.json
usecaseui-portal/src/app/mock/json/uui-sotn_getNetworkPolicy.json [new file with mode: 0644]
usecaseui-portal/src/app/mock/json/uui-sotn_getNetworkRoutes.json [new file with mode: 0644]
usecaseui-portal/src/app/mock/json/uui-sotn_getPnfs.json [new file with mode: 0644]
usecaseui-portal/src/app/mock/json/uui-sotn_getServiceInstances.json [new file with mode: 0644]
usecaseui-portal/src/app/mock/json/uui-sotn_getUuis.json [new file with mode: 0644]
usecaseui-portal/src/app/mock/json/uui-sotn_getVpnBindings.json [new file with mode: 0644]
usecaseui-portal/src/app/mock/routes.js
usecaseui-portal/src/app/views/network/ccvpn-network/ccvpn-network.component.css
usecaseui-portal/src/app/views/network/ccvpn-network/ccvpn-network.component.html
usecaseui-portal/src/app/views/network/ccvpn-network/ccvpn-network.component.ts
usecaseui-portal/src/assets/i18n/cn.json
usecaseui-portal/src/assets/i18n/en.json
usecaseui-portal/tsconfig.json

index 5535fc3..0e26a48 100644 (file)
@@ -23,7 +23,8 @@
         "my-theme.less"
       ],
       "scripts": [
-        "../node_modules/echarts/dist/echarts.min.js"
+        "../node_modules/echarts/dist/echarts.min.js",
+        "../node_modules/mxgraph/javascript/mxClient.js"
       ],
       "environmentSource": "environments/environment.ts",
       "environments": {
index c8f7e01..f1fedf8 100644 (file)
       "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=",
       "dev": true
     },
+    "@types/resize-observer-browser": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/@types/resize-observer-browser/-/resize-observer-browser-0.1.6.tgz",
+      "integrity": "sha512-61IfTac0s9jvNtBCpyo86QeaN8qqpMGHdK0uGKCCIy2dt5/Yk84VduHIdWAcmkC5QvdkPL0p5eWYgUZtHKKUVg=="
+    },
     "@types/selenium-webdriver": {
       "version": "2.53.45",
       "resolved": "https://registry.npm.taobao.org/@types/selenium-webdriver/download/@types/selenium-webdriver-2.53.45.tgz",
       "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=",
       "dev": true
     },
+    "mxgraph": {
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/mxgraph/-/mxgraph-4.2.2.tgz",
+      "integrity": "sha512-FrJc5AxzXSqiQNF+8CyJk6VxuKO4UVPgw32FZuFZ3X9W+JqOAQBTokZhh0ZkEqGpEOyp3z778ssmBTvdrTAdqw=="
+    },
     "nan": {
       "version": "2.14.2",
       "resolved": "https://registry.npm.taobao.org/nan/download/nan-2.14.2.tgz?cache=0&sync_timestamp=1602591700047&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnan%2Fdownload%2Fnan-2.14.2.tgz",
index 34a384c..27dda82 100644 (file)
@@ -28,6 +28,7 @@
     "@angular/router": "^5.2.0",
     "@ngx-translate/core": "^9.1.1",
     "@ngx-translate/http-loader": "^2.0.1",
+    "@types/resize-observer-browser": "^0.1.6",
     "axios": "^0.19.0",
     "core-js": "^2.4.1",
     "d3": "^3.5.17",
@@ -36,6 +37,7 @@
     "jquery": "^3.4.1",
     "lodash": "^4.17.15",
     "moment": "^2.24.0",
+    "mxgraph": "^4.2.2",
     "ng-zorro-antd": "^0.7.1",
     "ngx-echarts": "^2.2.0",
     "rxjs": "^5.5.12",
index 1bf1b65..bc2daea 100644 (file)
@@ -23,7 +23,6 @@ import { BrowserModule } from "@angular/platform-browser";
 import { BrowserAnimationsModule } from "@angular/platform-browser/animations";
 import { TranslateLoader, TranslateModule } from "@ngx-translate/core";
 import { TranslateHttpLoader } from "@ngx-translate/http-loader";
-import { EventQueueService } from "@src/app/core/services/eventQueue.service";
 import { en_US, NgZorroAntdModule, NZ_I18N } from "ng-zorro-antd";
 import { NgxEchartsModule } from "ngx-echarts";
 import { AppRoutingModule } from "./app-routing.module";
@@ -135,7 +134,6 @@ registerLocaleData(en);
                ManagemencsService,
                TextService,
                SlicingTaskServices,
-               EventQueueService,
                // fakeBackendProvider
        ],
        declarations: [
diff --git a/usecaseui-portal/src/app/core/services/appEvent.ts b/usecaseui-portal/src/app/core/services/appEvent.ts
deleted file mode 100644 (file)
index 775eced..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
-    Copyright (C) 2021 Huawei Canada, Inc. and others. All rights reserved.
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-            http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-*/
-import {AppEventType} from "@src/app/core/services/appEventType";
-
-export class AppEvent<T> {
-    constructor(
-        public type: AppEventType,
-        public payload: T,
-    ) {}
-}
\ No newline at end of file
diff --git a/usecaseui-portal/src/app/core/services/appEventType.ts b/usecaseui-portal/src/app/core/services/appEventType.ts
deleted file mode 100644 (file)
index e5369a8..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-export enum AppEventType {
-    GenericEvent = 'GENERIC_EVENT',
-    UserNodeDrag = 'USER_NODE_DRAG'
-}
\ No newline at end of file
diff --git a/usecaseui-portal/src/app/core/services/eventQueue.service.ts b/usecaseui-portal/src/app/core/services/eventQueue.service.ts
deleted file mode 100644 (file)
index e4c32c3..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
-    Copyright (C) 2021 Huawei Canada, Inc. and others. All rights reserved.
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-            http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-*/
-
-import { Injectable } from '@angular/core';
-import {Observable, Subject} from "rxjs/Rx";
-import {AppEvent} from "@src/app/core/services/appEvent";
-import {AppEventType} from "@src/app/core/services/appEventType";
-import {filter} from "rxjs/operators";
-
-@Injectable()
-export class EventQueueService {
-
-    private eventBroker = new Subject<AppEvent<any>>();
-
-    on(eventType: AppEventType): Observable<AppEvent<any>> {
-        return this.eventBroker.pipe(filter(event => event.type === eventType));
-    }
-
-    dispatch<T>(event: AppEvent<T>): void {
-        this.eventBroker.next(event);
-    }
-
-}
\ No newline at end of file
index 0959f56..0e16966 100644 (file)
@@ -1,5 +1,6 @@
 /*
     Copyright (C) 2019 CMCC, Inc. and others. All rights reserved.
+    Copyright (C) 2022 Huawei Canada Limited. All rights reserved.
 
     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
@@ -40,7 +41,9 @@ export class networkHttpservice {
         "createCloudLink": this.baseUrl+"/uui-sotn/createLink/",
         "createCloudUrl": this.baseUrl+"/uui-sotn/createHostUrl/",
         "deleteLink": this.baseUrl+"/uui-sotn/deleteLink/",
-        "getConnectivities": this.baseUrl+"/uui-sotn/getConnectivityInfo",
+        "getConnectivities": this.baseUrl+"/uui-sotn/getConnectivities",
+        "getNetworkRoutes": this.baseUrl + "/uui-sotn/getNetworkRoutes",
+
 
     };
 
@@ -86,6 +89,9 @@ export class networkHttpservice {
     getConnectivities(){
         return this.http.get<any>(this.url["getConnectivities"]);
     }
+    getNetworkRoutes(){
+        return this.http.get<any>(this.url["getNetworkRoutes"]);
+    }
 
     //Create an external cloud newwork interface
     createNetwrok(paramsObj) {
diff --git a/usecaseui-portal/src/app/mock/json/uui-sotn_getConnectivities.json b/usecaseui-portal/src/app/mock/json/uui-sotn_getConnectivities.json
new file mode 100644 (file)
index 0000000..b01c6fe
--- /dev/null
@@ -0,0 +1,141 @@
+{
+  "connectivity": [
+    {
+      "connectivity-id": "edffb684-fad8-4b61-bc50-e7b80edbfcca",
+      "bandwidth-profile-name": "3",
+      "vpn-type": "leaf",
+      "cir": "3000000",
+      "eir": "3000000",
+      "coupling-flag": "-,OA==",
+      "etht-svc-name": "cll-link-3",
+      "access-provider-id": "10",
+      "access-client-id": "0",
+      "access-topology-id": "2",
+      "access-node-id": "10.1.1.1",
+      "access-ltp-id": "2000001",
+      "connectivity-selflink": "restconf/config/GENERIC-RESOURCE-API:services/service//service-data/networks/network//network-data/",
+      "cvlan": "47",
+      "operational-status": "Activated",
+      "resource-version": "1642347909934",
+      "relationship-list": {
+        "relationship": [
+          {
+            "related-to": "service-instance",
+            "relationship-label": "org.onap.relationships.inventory.PartOf",
+            "related-link": "/aai/v21/business/customers/customer/IBNCustomer/service-subscriptions/service-subscription/IBN/service-instances/service-instance/cll-101",
+            "relationship-data": [
+              {
+                "relationship-key": "customer.global-customer-id",
+                "relationship-value": "IBNCustomer"
+              },
+              {
+                "relationship-key": "service-subscription.service-type",
+                "relationship-value": "IBN"
+              },
+              {
+                "relationship-key": "service-instance.service-instance-id",
+                "relationship-value": "cll-101"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "service-instance.service-instance-name",
+                "property-value": "cloud-leased-line-101"
+              }
+            ]
+          }
+        ]
+      }
+    },
+    {
+      "connectivity-id": "0af5ed1f-f224-46a9-8ef6-5d085bd44959",
+      "bandwidth-profile-name": "3",
+      "vpn-type": "mdsc",
+      "cir": "3000000",
+      "eir": "3000000",
+      "color-aware": "networkId-providerId-20-clientId-0-topologyId-2-nodeId-10.2.1.2-ltpId-512-47",
+      "etht-svc-name": "cll-link-3",
+      "connectivity-selflink": "restconf/config/GENERIC-RESOURCE-API:services/service//service-data/networks/network//network-data/",
+      "cvlan": "47",
+      "operational-status": "Created",
+      "resource-version": "1642347906116",
+      "relationship-list": {
+        "relationship": [
+          {
+            "related-to": "service-instance",
+            "relationship-label": "org.onap.relationships.inventory.PartOf",
+            "related-link": "/aai/v21/business/customers/customer/IBNCustomer/service-subscriptions/service-subscription/IBN/service-instances/service-instance/cll-101",
+            "relationship-data": [
+              {
+                "relationship-key": "customer.global-customer-id",
+                "relationship-value": "IBNCustomer"
+              },
+              {
+                "relationship-key": "service-subscription.service-type",
+                "relationship-value": "IBN"
+              },
+              {
+                "relationship-key": "service-instance.service-instance-id",
+                "relationship-value": "cll-101"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "service-instance.service-instance-name",
+                "property-value": "cloud-leased-line-101"
+              }
+            ]
+          }
+        ]
+      }
+    },
+    {
+      "connectivity-id": "74279c52-3c66-4769-b90c-5b3f7599ec97",
+      "bandwidth-profile-name": "3",
+      "vpn-type": "root",
+      "cir": "3000000",
+      "eir": "3000000",
+      "color-aware": "networkId-providerId-20-clientId-0-topologyId-2-nodeId-10.2.1.2-ltpId-512-47",
+      "coupling-flag": "-MTI=,",
+      "etht-svc-name": "cll-link-3",
+      "access-provider-id": "20",
+      "access-client-id": "0",
+      "access-topology-id": "2",
+      "access-node-id": "10.2.1.2",
+      "access-ltp-id": "512",
+      "connectivity-selflink": "restconf/config/GENERIC-RESOURCE-API:services/service//service-data/networks/network//network-data/",
+      "cvlan": "47",
+      "operational-status": "Activated",
+      "resource-version": "1642347910927",
+      "relationship-list": {
+        "relationship": [
+          {
+            "related-to": "service-instance",
+            "relationship-label": "org.onap.relationships.inventory.PartOf",
+            "related-link": "/aai/v21/business/customers/customer/IBNCustomer/service-subscriptions/service-subscription/IBN/service-instances/service-instance/cll-101",
+            "relationship-data": [
+              {
+                "relationship-key": "customer.global-customer-id",
+                "relationship-value": "IBNCustomer"
+              },
+              {
+                "relationship-key": "service-subscription.service-type",
+                "relationship-value": "IBN"
+              },
+              {
+                "relationship-key": "service-instance.service-instance-id",
+                "relationship-value": "cll-101"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "service-instance.service-instance-name",
+                "property-value": "cloud-leased-line-101"
+              }
+            ]
+          }
+        ]
+      }
+    }
+  ]
+}
\ No newline at end of file
index a43c8c4..4936417 100644 (file)
@@ -1,12 +1,12 @@
 {
   "connectivity": [
     {
-      "connectivity-id": "0cdb3c80-e319-4690-bed9-ae081e69542c",
+      "connectivity-id": "4b92586f-d180-4512-a50e-a7501d4f2a60",
       "bandwidth-profile-name": "3",
       "vpn-type": "leaf",
       "cir": "3000000",
       "eir": "3000000",
-      "coupling-flag": "-,OA==",
+      "coupling-flag": "-,OA==-,OA==",
       "etht-svc-name": "cll-link-1",
       "access-provider-id": "10",
       "access-client-id": "0",
       "connectivity-selflink": "restconf/config/GENERIC-RESOURCE-API:services/service//service-data/networks/network//network-data/",
       "cvlan": "47",
       "operational-status": "Activated",
-      "resource-version": "1632433788978",
+      "resource-version": "1633101426107",
       "relationship-list": {
         "relationship": [
           {
             "related-to": "vpn-binding",
             "relationship-label": "tosca.relationships.network.BindsTo",
-            "related-link": "/aai/v24/network/vpn-bindings/vpn-binding/7bdc2f8c-2d3f-4a9f-91c9-e13e105b3f85",
+            "related-link": "/aai/v24/network/vpn-bindings/vpn-binding/7f2713ed-c3dc-4595-bac0-9ab9bc2ae902",
             "relationship-data": [
               {
                 "relationship-key": "vpn-binding.vpn-id",
-                "relationship-value": "7bdc2f8c-2d3f-4a9f-91c9-e13e105b3f85"
+                "relationship-value": "7f2713ed-c3dc-4595-bac0-9ab9bc2ae902"
               }
             ],
             "related-to-property": [
               {
                 "property-key": "vpn-binding.vpn-name",
-                "property-value": "32edeb0d-1036-4f16-9c11-c5257d81ae0e"
+                "property-value": "0cf7325b-020d-4382-beff-d23f050a1679"
+              },
+              {
+                "property-key": "vpn-binding.vpn-type"
+              }
+            ]
+          },
+          {
+            "related-to": "vpn-binding",
+            "relationship-label": "tosca.relationships.network.BindsTo",
+            "related-link": "/aai/v24/network/vpn-bindings/vpn-binding/3742233f-bda7-45a5-b651-98efb930285d",
+            "relationship-data": [
+              {
+                "relationship-key": "vpn-binding.vpn-id",
+                "relationship-value": "3742233f-bda7-45a5-b651-98efb930285d"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "vpn-binding.vpn-name",
+                "property-value": "ff99411f-2ca2-4b59-b199-f3d828a2d407"
               },
               {
                 "property-key": "vpn-binding.vpn-type"
               }
             ]
           },
+          {
+            "related-to": "uni",
+            "relationship-label": "org.onap.relationships.inventory.PartOf",
+            "related-link": "/aai/v24/network/unis/uni/networkId-providerId-10-clientId-0-topologyId-2-nodeId-10.1.1.1-ltpId-1000001",
+            "relationship-data": [
+              {
+                "relationship-key": "uni.id",
+                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-2-nodeId-10.1.1.1-ltpId-1000001"
+              }
+            ]
+          },
           {
             "related-to": "uni",
             "relationship-label": "org.onap.relationships.inventory.PartOf",
               }
             ]
           },
+          {
+            "related-to": "service-instance",
+            "relationship-label": "org.onap.relationships.inventory.PartOf",
+            "related-link": "/aai/v24/business/customers/customer/IBNCustomer/service-subscriptions/service-subscription/IBN/service-instances/service-instance/cll-202",
+            "relationship-data": [
+              {
+                "relationship-key": "customer.global-customer-id",
+                "relationship-value": "IBNCustomer"
+              },
+              {
+                "relationship-key": "service-subscription.service-type",
+                "relationship-value": "IBN"
+              },
+              {
+                "relationship-key": "service-instance.service-instance-id",
+                "relationship-value": "cll-202"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "service-instance.service-instance-name",
+                "property-value": "cloud-leased-line-202"
+              }
+            ]
+          },
           {
             "related-to": "connectivity",
             "relationship-label": "tosca.relationships.network.LinksTo",
-            "related-link": "/aai/v24/network/connectivities/connectivity/c648ddff-7abe-44ba-946f-8d7a4fa2691b",
+            "related-link": "/aai/v24/network/connectivities/connectivity/e97f233f-02ce-4e5f-a2ab-382f994719ce",
             "relationship-data": [
               {
                 "relationship-key": "connectivity.connectivity-id",
-                "relationship-value": "c648ddff-7abe-44ba-946f-8d7a4fa2691b"
+                "relationship-value": "e97f233f-02ce-4e5f-a2ab-382f994719ce"
               }
             ],
             "related-to-property": [
       }
     },
     {
-      "connectivity-id": "c648ddff-7abe-44ba-946f-8d7a4fa2691b",
+      "connectivity-id": "e97f233f-02ce-4e5f-a2ab-382f994719ce",
       "bandwidth-profile-name": "3",
       "vpn-type": "mdsc",
       "cir": "3000000",
       "connectivity-selflink": "restconf/config/GENERIC-RESOURCE-API:services/service//service-data/networks/network//network-data/",
       "cvlan": "47",
       "operational-status": "Created",
-      "resource-version": "1632433782443",
+      "resource-version": "1633101420677",
       "relationship-list": {
         "relationship": [
           {
               }
             ]
           },
+          {
+            "related-to": "uni",
+            "relationship-label": "org.onap.relationships.inventory.PartOf",
+            "related-link": "/aai/v24/network/unis/uni/networkId-providerId-10-clientId-0-topologyId-2-nodeId-10.1.1.1-ltpId-1000001",
+            "relationship-data": [
+              {
+                "relationship-key": "uni.id",
+                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-2-nodeId-10.1.1.1-ltpId-1000001"
+              }
+            ]
+          },
           {
             "related-to": "uni",
             "relationship-label": "org.onap.relationships.inventory.PartOf",
               }
             ]
           },
+          {
+            "related-to": "service-instance",
+            "relationship-label": "org.onap.relationships.inventory.PartOf",
+            "related-link": "/aai/v24/business/customers/customer/IBNCustomer/service-subscriptions/service-subscription/IBN/service-instances/service-instance/cll-202",
+            "relationship-data": [
+              {
+                "relationship-key": "customer.global-customer-id",
+                "relationship-value": "IBNCustomer"
+              },
+              {
+                "relationship-key": "service-subscription.service-type",
+                "relationship-value": "IBN"
+              },
+              {
+                "relationship-key": "service-instance.service-instance-id",
+                "relationship-value": "cll-202"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "service-instance.service-instance-name",
+                "property-value": "cloud-leased-line-202"
+              }
+            ]
+          },
           {
             "related-to": "connectivity",
             "relationship-label": "tosca.relationships.network.LinksTo",
-            "related-link": "/aai/v24/network/connectivities/connectivity/0cdb3c80-e319-4690-bed9-ae081e69542c",
+            "related-link": "/aai/v24/network/connectivities/connectivity/4b92586f-d180-4512-a50e-a7501d4f2a60",
             "relationship-data": [
               {
                 "relationship-key": "connectivity.connectivity-id",
-                "relationship-value": "0cdb3c80-e319-4690-bed9-ae081e69542c"
+                "relationship-value": "4b92586f-d180-4512-a50e-a7501d4f2a60"
               }
             ],
             "related-to-property": [
           {
             "related-to": "connectivity",
             "relationship-label": "tosca.relationships.network.LinksTo",
-            "related-link": "/aai/v24/network/connectivities/connectivity/8dfd5f6a-e795-47ff-8d66-ff26e78a7175",
+            "related-link": "/aai/v24/network/connectivities/connectivity/a3bc4be2-f2e5-408a-9517-43b94578a398",
             "relationship-data": [
               {
                 "relationship-key": "connectivity.connectivity-id",
-                "relationship-value": "8dfd5f6a-e795-47ff-8d66-ff26e78a7175"
+                "relationship-value": "a3bc4be2-f2e5-408a-9517-43b94578a398"
               }
             ],
             "related-to-property": [
       }
     },
     {
-      "connectivity-id": "8dfd5f6a-e795-47ff-8d66-ff26e78a7175",
+      "connectivity-id": "a3bc4be2-f2e5-408a-9517-43b94578a398",
       "bandwidth-profile-name": "3",
       "vpn-type": "root",
       "cir": "3000000",
       "eir": "3000000",
       "color-aware": "networkId-providerId-20-clientId-0-topologyId-2-nodeId-10.2.1.2-ltpId-512",
-      "coupling-flag": "-MTI=,",
+      "coupling-flag": "-MTI=,-MTI=,",
       "etht-svc-name": "cll-link-1",
       "access-provider-id": "20",
       "access-client-id": "0",
       "connectivity-selflink": "restconf/config/GENERIC-RESOURCE-API:services/service//service-data/networks/network//network-data/",
       "cvlan": "47",
       "operational-status": "Activated",
-      "resource-version": "1632433789733",
+      "resource-version": "1633101427096",
       "relationship-list": {
         "relationship": [
           {
             "related-to": "vpn-binding",
             "relationship-label": "tosca.relationships.network.BindsTo",
-            "related-link": "/aai/v24/network/vpn-bindings/vpn-binding/c4b924e2-8a39-4f67-b9c1-d04b6c7a6053",
+            "related-link": "/aai/v24/network/vpn-bindings/vpn-binding/44addcac-8052-4ed8-b3c2-536e13f4d5ca",
             "relationship-data": [
               {
                 "relationship-key": "vpn-binding.vpn-id",
-                "relationship-value": "c4b924e2-8a39-4f67-b9c1-d04b6c7a6053"
+                "relationship-value": "44addcac-8052-4ed8-b3c2-536e13f4d5ca"
               }
             ],
             "related-to-property": [
               {
                 "property-key": "vpn-binding.vpn-name",
-                "property-value": "32edeb0d-1036-4f16-9c11-c5257d81ae0e"
+                "property-value": "0cf7325b-020d-4382-beff-d23f050a1679"
+              },
+              {
+                "property-key": "vpn-binding.vpn-type"
+              }
+            ]
+          },
+          {
+            "related-to": "vpn-binding",
+            "relationship-label": "tosca.relationships.network.BindsTo",
+            "related-link": "/aai/v24/network/vpn-bindings/vpn-binding/1ed58980-24b7-42e4-890b-399cbf5660cd",
+            "relationship-data": [
+              {
+                "relationship-key": "vpn-binding.vpn-id",
+                "relationship-value": "1ed58980-24b7-42e4-890b-399cbf5660cd"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "vpn-binding.vpn-name",
+                "property-value": "ff99411f-2ca2-4b59-b199-f3d828a2d407"
               },
               {
                 "property-key": "vpn-binding.vpn-type"
               }
             ]
           },
+          {
+            "related-to": "service-instance",
+            "relationship-label": "org.onap.relationships.inventory.PartOf",
+            "related-link": "/aai/v24/business/customers/customer/IBNCustomer/service-subscriptions/service-subscription/IBN/service-instances/service-instance/cll-202",
+            "relationship-data": [
+              {
+                "relationship-key": "customer.global-customer-id",
+                "relationship-value": "IBNCustomer"
+              },
+              {
+                "relationship-key": "service-subscription.service-type",
+                "relationship-value": "IBN"
+              },
+              {
+                "relationship-key": "service-instance.service-instance-id",
+                "relationship-value": "cll-202"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "service-instance.service-instance-name",
+                "property-value": "cloud-leased-line-202"
+              }
+            ]
+          },
           {
             "related-to": "connectivity",
             "relationship-label": "tosca.relationships.network.LinksTo",
-            "related-link": "/aai/v24/network/connectivities/connectivity/c648ddff-7abe-44ba-946f-8d7a4fa2691b",
+            "related-link": "/aai/v24/network/connectivities/connectivity/e97f233f-02ce-4e5f-a2ab-382f994719ce",
             "relationship-data": [
               {
                 "relationship-key": "connectivity.connectivity-id",
-                "relationship-value": "c648ddff-7abe-44ba-946f-8d7a4fa2691b"
+                "relationship-value": "e97f233f-02ce-4e5f-a2ab-382f994719ce"
               }
             ],
             "related-to-property": [
index 4ee81b6..c8150b5 100644 (file)
@@ -1,25 +1,25 @@
 {
   "logical-link": [
     {
-      "link-name": "networkId-providerId-10-clientId-0-topologyId-1-linkId-10.1.1.2-22",
+      "link-name": "networkId-providerId-10-clientId-0-topologyId-1-linkId-10.1.1.1-6",
       "in-maint": false,
       "link-type": "point-to-point",
-      "resource-version": "1632418647894",
-      "link-id": "10.1.1.2-22",
+      "resource-version": "1639671508778",
+      "link-id": "10.1.1.1-6",
       "relationship-list": {
         "relationship": [
           {
             "related-to": "p-interface",
             "relationship-label": "tosca.relationships.network.LinksTo",
-            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2/p-interfaces/p-interface/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2-ltpId-22",
+            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3/p-interfaces/p-interface/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3-ltpId-22",
             "relationship-data": [
               {
                 "relationship-key": "pnf.pnf-name",
-                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2"
+                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3"
               },
               {
                 "relationship-key": "p-interface.interface-name",
-                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2-ltpId-22"
+                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3-ltpId-22"
               }
             ],
             "related-to-property": [
           {
             "related-to": "p-interface",
             "relationship-label": "tosca.relationships.network.LinksTo",
-            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3/p-interfaces/p-interface/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3-ltpId-12",
+            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1/p-interfaces/p-interface/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1-ltpId-6",
             "relationship-data": [
               {
                 "relationship-key": "pnf.pnf-name",
-                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3"
+                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1"
               },
               {
                 "relationship-key": "p-interface.interface-name",
-                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3-ltpId-12"
+                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1-ltpId-6"
               }
             ],
             "related-to-property": [
       }
     },
     {
-      "link-name": "networkId-providerId-10-clientId-0-topologyId-2-linkId-10.1.1.1-1000001",
-      "in-maint": false,
-      "link-type": "point-to-point",
-      "resource-version": "1632418637582",
-      "link-id": "10.1.1.1-1000001"
-    },
-    {
-      "link-name": "networkId-providerId-10-clientId-0-topologyId-2-linkId-10.1.1.1-2000001",
-      "in-maint": false,
-      "link-type": "point-to-point",
-      "resource-version": "1632418638991",
-      "link-id": "10.1.1.1-2000001"
-    },
-    {
-      "link-name": "51000",
+      "link-name": "networkId-providerId-20-clientId-0-topologyId-1-linkId-10.2.1.2-5",
       "in-maint": false,
       "link-type": "point-to-point",
-      "resource-version": "1632418711940",
-      "link-role": "cross-domain",
-      "link-id": "10.1.1.2-12",
+      "resource-version": "1639671575317",
+      "link-id": "10.2.1.2-5",
       "relationship-list": {
         "relationship": [
           {
-            "related-to": "te-link-attribute",
+            "related-to": "p-interface",
             "relationship-label": "tosca.relationships.network.LinksTo",
-            "related-link": "/aai/v24/network/te-link-attributes/te-link-attribute/10.1.1.2-12",
+            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3/p-interfaces/p-interface/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3-ltpId-3",
             "relationship-data": [
               {
-                "relationship-key": "te-link-attribute.id",
-                "relationship-value": "10.1.1.2-12"
+                "relationship-key": "pnf.pnf-name",
+                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3"
+              },
+              {
+                "relationship-key": "p-interface.interface-name",
+                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3-ltpId-3"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "p-interface.prov-status"
               }
             ]
           },
           {
-            "related-to": "te-link-attribute",
+            "related-to": "p-interface",
             "relationship-label": "tosca.relationships.network.LinksTo",
-            "related-link": "/aai/v24/network/te-link-attributes/te-link-attribute/10.2.1.1-22",
+            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.2/p-interfaces/p-interface/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.2-ltpId-5",
             "relationship-data": [
               {
-                "relationship-key": "te-link-attribute.id",
-                "relationship-value": "10.2.1.1-22"
+                "relationship-key": "pnf.pnf-name",
+                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.2"
+              },
+              {
+                "relationship-key": "p-interface.interface-name",
+                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.2-ltpId-5"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "p-interface.prov-status"
               }
             ]
-          },
+          }
+        ]
+      }
+    },
+    {
+      "link-name": "networkId-providerId-10-clientId-0-topologyId-1-linkId-10.1.1.2-2",
+      "in-maint": false,
+      "link-type": "point-to-point",
+      "resource-version": "1639671507090",
+      "link-id": "10.1.1.2-2",
+      "relationship-list": {
+        "relationship": [
           {
             "related-to": "p-interface",
             "relationship-label": "tosca.relationships.network.LinksTo",
-            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2/p-interfaces/p-interface/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2-ltpId-12",
+            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1/p-interfaces/p-interface/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1-ltpId-12",
             "relationship-data": [
               {
                 "relationship-key": "pnf.pnf-name",
-                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2"
+                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1"
               },
               {
                 "relationship-key": "p-interface.interface-name",
-                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2-ltpId-12"
+                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1-ltpId-12"
               }
             ],
             "related-to-property": [
           {
             "related-to": "p-interface",
             "relationship-label": "tosca.relationships.network.LinksTo",
-            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1/p-interfaces/p-interface/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1-ltpId-22",
+            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2/p-interfaces/p-interface/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2-ltpId-2",
             "relationship-data": [
               {
                 "relationship-key": "pnf.pnf-name",
-                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1"
+                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2"
               },
               {
                 "relationship-key": "p-interface.interface-name",
-                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1-ltpId-22"
+                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2-ltpId-2"
               }
             ],
             "related-to-property": [
       }
     },
     {
-      "link-name": "networkId-providerId-10-clientId-0-topologyId-1-linkId-10.1.1.3-12",
+      "link-name": "networkId-providerId-20-clientId-0-topologyId-2-linkId-10.2.1.2-512",
       "in-maint": false,
       "link-type": "point-to-point",
-      "resource-version": "1632418648333",
-      "link-id": "10.1.1.3-12",
+      "resource-version": "1639671565616",
+      "link-id": "10.2.1.2-512"
+    },
+    {
+      "link-name": "networkId-providerId-20-clientId-0-topologyId-1-linkId-10.2.1.3-22",
+      "in-maint": false,
+      "link-type": "point-to-point",
+      "resource-version": "1639671576216",
+      "link-id": "10.2.1.3-22",
       "relationship-list": {
         "relationship": [
           {
             "related-to": "p-interface",
             "relationship-label": "tosca.relationships.network.LinksTo",
-            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2/p-interfaces/p-interface/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2-ltpId-22",
+            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3/p-interfaces/p-interface/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3-ltpId-22",
             "relationship-data": [
               {
                 "relationship-key": "pnf.pnf-name",
-                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2"
+                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3"
               },
               {
                 "relationship-key": "p-interface.interface-name",
-                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2-ltpId-22"
+                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3-ltpId-22"
               }
             ],
             "related-to-property": [
           {
             "related-to": "p-interface",
             "relationship-label": "tosca.relationships.network.LinksTo",
-            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3/p-interfaces/p-interface/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3-ltpId-12",
+            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1/p-interfaces/p-interface/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1-ltpId-9",
             "relationship-data": [
               {
                 "relationship-key": "pnf.pnf-name",
-                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3"
+                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1"
               },
               {
                 "relationship-key": "p-interface.interface-name",
-                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3-ltpId-12"
+                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1-ltpId-9"
               }
             ],
             "related-to-property": [
       }
     },
     {
-      "link-name": "52000",
+      "link-name": "1020",
       "in-maint": false,
       "link-type": "point-to-point",
-      "resource-version": "1632418711437",
+      "resource-version": "1639671577231",
       "link-role": "cross-domain",
-      "link-id": "10.1.1.3-8",
+      "link-id": "10.1.1.2-12",
       "relationship-list": {
         "relationship": [
           {
             "related-to": "te-link-attribute",
             "relationship-label": "tosca.relationships.network.LinksTo",
-            "related-link": "/aai/v24/network/te-link-attributes/te-link-attribute/10.1.1.3-8",
+            "related-link": "/aai/v24/network/te-link-attributes/te-link-attribute/10.1.1.2-12",
             "relationship-data": [
               {
                 "relationship-key": "te-link-attribute.id",
-                "relationship-value": "10.1.1.3-8"
+                "relationship-value": "10.1.1.2-12"
               }
             ]
           },
           {
             "related-to": "te-link-attribute",
             "relationship-label": "tosca.relationships.network.LinksTo",
-            "related-link": "/aai/v24/network/te-link-attributes/te-link-attribute/10.2.1.3-12",
+            "related-link": "/aai/v24/network/te-link-attributes/te-link-attribute/10.2.1.1-22",
             "relationship-data": [
               {
                 "relationship-key": "te-link-attribute.id",
-                "relationship-value": "10.2.1.3-12"
+                "relationship-value": "10.2.1.1-22"
               }
             ]
           },
           {
             "related-to": "p-interface",
             "relationship-label": "tosca.relationships.network.LinksTo",
-            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3/p-interfaces/p-interface/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3-ltpId-8",
+            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1/p-interfaces/p-interface/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1-ltpId-22",
             "relationship-data": [
               {
                 "relationship-key": "pnf.pnf-name",
-                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3"
+                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1"
               },
               {
                 "relationship-key": "p-interface.interface-name",
-                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3-ltpId-8"
+                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1-ltpId-22"
               }
             ],
             "related-to-property": [
           {
             "related-to": "p-interface",
             "relationship-label": "tosca.relationships.network.LinksTo",
-            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3/p-interfaces/p-interface/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3-ltpId-12",
+            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2/p-interfaces/p-interface/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2-ltpId-12",
             "relationship-data": [
               {
                 "relationship-key": "pnf.pnf-name",
-                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3"
+                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2"
               },
               {
                 "relationship-key": "p-interface.interface-name",
-                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3-ltpId-12"
+                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2-ltpId-12"
               }
             ],
             "related-to-property": [
       }
     },
     {
-      "link-name": "networkId-providerId-10-clientId-0-topologyId-1-linkId-10.1.1.3-22",
+      "link-name": "networkId-providerId-10-clientId-0-topologyId-1-linkId-10.1.1.3-12",
       "in-maint": false,
       "link-type": "point-to-point",
-      "resource-version": "1632418649331",
-      "link-id": "10.1.1.3-22",
+      "resource-version": "1639671507517",
+      "link-id": "10.1.1.3-12",
       "relationship-list": {
         "relationship": [
           {
             "related-to": "p-interface",
             "relationship-label": "tosca.relationships.network.LinksTo",
-            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1/p-interfaces/p-interface/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1-ltpId-6",
+            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2/p-interfaces/p-interface/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2-ltpId-22",
             "relationship-data": [
               {
                 "relationship-key": "pnf.pnf-name",
-                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1"
+                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2"
               },
               {
                 "relationship-key": "p-interface.interface-name",
-                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1-ltpId-6"
+                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2-ltpId-22"
               }
             ],
             "related-to-property": [
           {
             "related-to": "p-interface",
             "relationship-label": "tosca.relationships.network.LinksTo",
-            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3/p-interfaces/p-interface/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3-ltpId-22",
+            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3/p-interfaces/p-interface/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3-ltpId-12",
             "relationship-data": [
               {
                 "relationship-key": "pnf.pnf-name",
               },
               {
                 "relationship-key": "p-interface.interface-name",
-                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3-ltpId-22"
+                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3-ltpId-12"
               }
             ],
             "related-to-property": [
       }
     },
     {
-      "link-name": "networkId-providerId-10-clientId-0-topologyId-1-linkId-10.1.1.2-2",
+      "link-name": "networkId-providerId-10-clientId-0-topologyId-1-linkId-10.1.1.3-22",
       "in-maint": false,
       "link-type": "point-to-point",
-      "resource-version": "1632418647397",
-      "link-id": "10.1.1.2-2",
+      "resource-version": "1639671507950",
+      "link-id": "10.1.1.3-22",
       "relationship-list": {
         "relationship": [
           {
             "related-to": "p-interface",
             "relationship-label": "tosca.relationships.network.LinksTo",
-            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1/p-interfaces/p-interface/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1-ltpId-12",
+            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3/p-interfaces/p-interface/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3-ltpId-22",
             "relationship-data": [
               {
                 "relationship-key": "pnf.pnf-name",
-                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1"
+                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3"
               },
               {
                 "relationship-key": "p-interface.interface-name",
-                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1-ltpId-12"
+                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3-ltpId-22"
               }
             ],
             "related-to-property": [
           {
             "related-to": "p-interface",
             "relationship-label": "tosca.relationships.network.LinksTo",
-            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2/p-interfaces/p-interface/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2-ltpId-2",
+            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1/p-interfaces/p-interface/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1-ltpId-6",
             "relationship-data": [
               {
                 "relationship-key": "pnf.pnf-name",
-                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2"
+                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1"
               },
               {
                 "relationship-key": "p-interface.interface-name",
-                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2-ltpId-2"
+                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1-ltpId-6"
               }
             ],
             "related-to-property": [
       }
     },
     {
-      "link-name": "tranportEp_src_ID_111_2",
+      "link-name": "networkId-providerId-10-clientId-0-topologyId-2-linkId-10.1.1.1-1000001",
       "in-maint": false,
       "link-type": "point-to-point",
-      "resource-version": "1632418767038",
-      "link-name2": "tranportEp_dst_ID_212_1",
-      "link-id": "111-2-212-1"
+      "resource-version": "1639671497197",
+      "link-id": "10.1.1.1-1000001"
     },
     {
-      "link-name": "networkId-providerId-20-clientId-0-topologyId-1-linkId-10.2.1.2-22",
+      "link-name": "networkId-providerId-20-clientId-0-topologyId-1-linkId-10.2.1.3-3",
       "in-maint": false,
       "link-type": "point-to-point",
-      "resource-version": "1632418710116",
-      "link-id": "10.2.1.2-22",
+      "resource-version": "1639671575819",
+      "link-id": "10.2.1.3-3",
       "relationship-list": {
         "relationship": [
           {
             "related-to": "p-interface",
             "relationship-label": "tosca.relationships.network.LinksTo",
-            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1/p-interfaces/p-interface/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1-ltpId-12",
+            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3/p-interfaces/p-interface/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3-ltpId-3",
             "relationship-data": [
               {
                 "relationship-key": "pnf.pnf-name",
-                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1"
+                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3"
               },
               {
                 "relationship-key": "p-interface.interface-name",
-                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1-ltpId-12"
+                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3-ltpId-3"
               }
             ],
             "related-to-property": [
           {
             "related-to": "p-interface",
             "relationship-label": "tosca.relationships.network.LinksTo",
-            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.2/p-interfaces/p-interface/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.2-ltpId-22",
+            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.2/p-interfaces/p-interface/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.2-ltpId-5",
             "relationship-data": [
               {
                 "relationship-key": "pnf.pnf-name",
               },
               {
                 "relationship-key": "p-interface.interface-name",
-                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.2-ltpId-22"
+                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.2-ltpId-5"
               }
             ],
             "related-to-property": [
       }
     },
     {
-      "link-name": "networkId-providerId-10-clientId-0-topologyId-1-linkId-10.1.1.1-12",
+      "link-name": "networkId-providerId-20-clientId-0-topologyId-1-linkId-10.2.1.1-9",
       "in-maint": false,
       "link-type": "point-to-point",
-      "resource-version": "1632418648797",
-      "link-id": "10.1.1.1-12",
+      "resource-version": "1639671573811",
+      "link-id": "10.2.1.1-9",
       "relationship-list": {
         "relationship": [
           {
             "related-to": "p-interface",
             "relationship-label": "tosca.relationships.network.LinksTo",
-            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1/p-interfaces/p-interface/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1-ltpId-12",
+            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3/p-interfaces/p-interface/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3-ltpId-22",
             "relationship-data": [
               {
                 "relationship-key": "pnf.pnf-name",
-                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1"
+                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3"
               },
               {
                 "relationship-key": "p-interface.interface-name",
-                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1-ltpId-12"
+                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3-ltpId-22"
               }
             ],
             "related-to-property": [
           {
             "related-to": "p-interface",
             "relationship-label": "tosca.relationships.network.LinksTo",
-            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2/p-interfaces/p-interface/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2-ltpId-2",
+            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1/p-interfaces/p-interface/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1-ltpId-9",
             "relationship-data": [
               {
                 "relationship-key": "pnf.pnf-name",
-                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2"
+                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1"
               },
               {
                 "relationship-key": "p-interface.interface-name",
-                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2-ltpId-2"
+                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1-ltpId-9"
               }
             ],
             "related-to-property": [
       }
     },
     {
-      "link-name": "networkId-providerId-10-clientId-0-topologyId-1-linkId-10.1.1.1-6",
+      "link-name": "networkId-providerId-20-clientId-0-topologyId-1-linkId-10.2.1.1-12",
       "in-maint": false,
       "link-type": "point-to-point",
-      "resource-version": "1632418650687",
-      "link-id": "10.1.1.1-6",
+      "resource-version": "1639671576019",
+      "link-id": "10.2.1.1-12",
       "relationship-list": {
         "relationship": [
           {
             "related-to": "p-interface",
             "relationship-label": "tosca.relationships.network.LinksTo",
-            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1/p-interfaces/p-interface/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1-ltpId-6",
+            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.2/p-interfaces/p-interface/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.2-ltpId-22",
             "relationship-data": [
               {
                 "relationship-key": "pnf.pnf-name",
-                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1"
+                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.2"
               },
               {
                 "relationship-key": "p-interface.interface-name",
-                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1-ltpId-6"
+                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.2-ltpId-22"
               }
             ],
             "related-to-property": [
           {
             "related-to": "p-interface",
             "relationship-label": "tosca.relationships.network.LinksTo",
-            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3/p-interfaces/p-interface/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3-ltpId-22",
+            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1/p-interfaces/p-interface/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1-ltpId-12",
             "relationship-data": [
               {
                 "relationship-key": "pnf.pnf-name",
-                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3"
+                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1"
               },
               {
                 "relationship-key": "p-interface.interface-name",
-                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3-ltpId-22"
+                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1-ltpId-12"
               }
             ],
             "related-to-property": [
       }
     },
     {
-      "link-name": "networkId-providerId-20-clientId-0-topologyId-2-linkId-10.2.1.2-512",
-      "in-maint": false,
-      "link-type": "point-to-point",
-      "resource-version": "1632418701065",
-      "link-id": "10.2.1.2-512"
-    },
-    {
-      "link-name": "networkId-providerId-20-clientId-0-topologyId-1-linkId-10.2.1.1-12",
+      "link-name": "networkId-providerId-10-clientId-0-topologyId-1-linkId-10.1.1.1-12",
       "in-maint": false,
       "link-type": "point-to-point",
-      "resource-version": "1632418710752",
-      "link-id": "10.2.1.1-12",
+      "resource-version": "1639671507733",
+      "link-id": "10.1.1.1-12",
       "relationship-list": {
         "relationship": [
           {
             "related-to": "p-interface",
             "relationship-label": "tosca.relationships.network.LinksTo",
-            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1/p-interfaces/p-interface/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1-ltpId-12",
+            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1/p-interfaces/p-interface/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1-ltpId-12",
             "relationship-data": [
               {
                 "relationship-key": "pnf.pnf-name",
-                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1"
+                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1"
               },
               {
                 "relationship-key": "p-interface.interface-name",
-                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1-ltpId-12"
+                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1-ltpId-12"
               }
             ],
             "related-to-property": [
           {
             "related-to": "p-interface",
             "relationship-label": "tosca.relationships.network.LinksTo",
-            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.2/p-interfaces/p-interface/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.2-ltpId-22",
+            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2/p-interfaces/p-interface/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2-ltpId-2",
             "relationship-data": [
               {
                 "relationship-key": "pnf.pnf-name",
-                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.2"
+                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2"
               },
               {
                 "relationship-key": "p-interface.interface-name",
-                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.2-ltpId-22"
+                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2-ltpId-2"
               }
             ],
             "related-to-property": [
       }
     },
     {
-      "link-name": "networkId-providerId-20-clientId-0-topologyId-1-linkId-10.2.1.2-5",
+      "link-name": "tranportEp_src_ID_111_2",
       "in-maint": false,
-      "link-type": "point-to-point",
-      "resource-version": "1632418710349",
-      "link-id": "10.2.1.2-5",
+      "link-type": "TsciConnectionLink",
+      "resource-version": "1642347890612",
+      "link-name2": "tranportEp_dst_ID_212_1",
+      "link-id": "cll-link-3",
       "relationship-list": {
         "relationship": [
           {
-            "related-to": "p-interface",
-            "relationship-label": "tosca.relationships.network.LinksTo",
-            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3/p-interfaces/p-interface/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3-ltpId-3",
+            "related-to": "allotted-resource",
+            "relationship-label": "org.onap.relationships.inventory.ComposedOf",
+            "related-link": "/aai/v24/business/customers/customer/IBNCustomer/service-subscriptions/service-subscription/IBN/service-instances/service-instance/cll-101/allotted-resources/allotted-resource/cll-101-network-001",
             "relationship-data": [
               {
-                "relationship-key": "pnf.pnf-name",
-                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3"
+                "relationship-key": "customer.global-customer-id",
+                "relationship-value": "IBNCustomer"
               },
               {
-                "relationship-key": "p-interface.interface-name",
-                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3-ltpId-3"
+                "relationship-key": "service-subscription.service-type",
+                "relationship-value": "IBN"
+              },
+              {
+                "relationship-key": "service-instance.service-instance-id",
+                "relationship-value": "cll-101"
+              },
+              {
+                "relationship-key": "allotted-resource.id",
+                "relationship-value": "cll-101-network-001"
               }
             ],
             "related-to-property": [
               {
-                "property-key": "p-interface.prov-status"
+                "property-key": "allotted-resource.description"
+              },
+              {
+                "property-key": "allotted-resource.allotted-resource-name",
+                "property-value": "network_cll-101-network-001"
               }
             ]
-          },
+          }
+        ]
+      }
+    },
+    {
+      "link-name": "tranportEp_src_ID_111_1",
+      "in-maint": false,
+      "link-type": "TsciConnectionLink",
+      "resource-version": "1642347890211",
+      "link-name2": "tranportEp_dst_ID_212_1",
+      "link-id": "cll-link-2",
+      "relationship-list": {
+        "relationship": [
           {
-            "related-to": "p-interface",
-            "relationship-label": "tosca.relationships.network.LinksTo",
-            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.2/p-interfaces/p-interface/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.2-ltpId-5",
+            "related-to": "allotted-resource",
+            "relationship-label": "org.onap.relationships.inventory.ComposedOf",
+            "related-link": "/aai/v24/business/customers/customer/IBNCustomer/service-subscriptions/service-subscription/IBN/service-instances/service-instance/cll-101/allotted-resources/allotted-resource/cll-101-network-001",
             "relationship-data": [
               {
-                "relationship-key": "pnf.pnf-name",
-                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.2"
+                "relationship-key": "customer.global-customer-id",
+                "relationship-value": "IBNCustomer"
               },
               {
-                "relationship-key": "p-interface.interface-name",
-                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.2-ltpId-5"
+                "relationship-key": "service-subscription.service-type",
+                "relationship-value": "IBN"
+              },
+              {
+                "relationship-key": "service-instance.service-instance-id",
+                "relationship-value": "cll-101"
+              },
+              {
+                "relationship-key": "allotted-resource.id",
+                "relationship-value": "cll-101-network-001"
               }
             ],
             "related-to-property": [
               {
-                "property-key": "p-interface.prov-status"
+                "property-key": "allotted-resource.description"
+              },
+              {
+                "property-key": "allotted-resource.allotted-resource-name",
+                "property-value": "network_cll-101-network-001"
               }
             ]
           }
       }
     },
     {
-      "link-name": "networkId-providerId-20-clientId-0-topologyId-1-linkId-10.2.1.3-3",
+      "link-name": "networkId-providerId-10-clientId-0-topologyId-2-linkId-10.1.1.3-1000001",
       "in-maint": false,
       "link-type": "point-to-point",
-      "resource-version": "1632418710549",
-      "link-id": "10.2.1.3-3",
+      "resource-version": "1639671496767",
+      "link-id": "10.1.1.3-1000001"
+    },
+    {
+      "link-name": "networkId-providerId-10-clientId-0-topologyId-2-linkId-10.1.1.1-2000001",
+      "in-maint": false,
+      "link-type": "point-to-point",
+      "resource-version": "1639671497411",
+      "link-id": "10.1.1.1-2000001"
+    },
+    {
+      "link-name": "networkId-providerId-10-clientId-0-topologyId-1-linkId-10.1.1.2-22",
+      "in-maint": false,
+      "link-type": "point-to-point",
+      "resource-version": "1639671507300",
+      "link-id": "10.1.1.2-22",
       "relationship-list": {
         "relationship": [
           {
             "related-to": "p-interface",
             "relationship-label": "tosca.relationships.network.LinksTo",
-            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3/p-interfaces/p-interface/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3-ltpId-3",
+            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2/p-interfaces/p-interface/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2-ltpId-22",
             "relationship-data": [
               {
                 "relationship-key": "pnf.pnf-name",
-                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3"
+                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2"
               },
               {
                 "relationship-key": "p-interface.interface-name",
-                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3-ltpId-3"
+                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2-ltpId-22"
               }
             ],
             "related-to-property": [
           {
             "related-to": "p-interface",
             "relationship-label": "tosca.relationships.network.LinksTo",
-            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.2/p-interfaces/p-interface/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.2-ltpId-5",
+            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3/p-interfaces/p-interface/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3-ltpId-12",
             "relationship-data": [
               {
                 "relationship-key": "pnf.pnf-name",
-                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.2"
+                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3"
               },
               {
                 "relationship-key": "p-interface.interface-name",
-                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.2-ltpId-5"
+                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3-ltpId-12"
               }
             ],
             "related-to-property": [
       }
     },
     {
-      "link-name": "networkId-providerId-20-clientId-0-topologyId-1-linkId-10.2.1.3-22",
+      "link-name": "2010",
       "in-maint": false,
       "link-type": "point-to-point",
-      "resource-version": "1632418710961",
-      "link-id": "10.2.1.3-22",
+      "resource-version": "1639671576693",
+      "link-role": "cross-domain",
+      "link-id": "10.1.1.3-8",
       "relationship-list": {
         "relationship": [
+          {
+            "related-to": "te-link-attribute",
+            "relationship-label": "tosca.relationships.network.LinksTo",
+            "related-link": "/aai/v24/network/te-link-attributes/te-link-attribute/10.1.1.3-8",
+            "relationship-data": [
+              {
+                "relationship-key": "te-link-attribute.id",
+                "relationship-value": "10.1.1.3-8"
+              }
+            ]
+          },
+          {
+            "related-to": "te-link-attribute",
+            "relationship-label": "tosca.relationships.network.LinksTo",
+            "related-link": "/aai/v24/network/te-link-attributes/te-link-attribute/10.2.1.3-12",
+            "relationship-data": [
+              {
+                "relationship-key": "te-link-attribute.id",
+                "relationship-value": "10.2.1.3-12"
+              }
+            ]
+          },
           {
             "related-to": "p-interface",
             "relationship-label": "tosca.relationships.network.LinksTo",
-            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3/p-interfaces/p-interface/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3-ltpId-22",
+            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3/p-interfaces/p-interface/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3-ltpId-8",
             "relationship-data": [
               {
                 "relationship-key": "pnf.pnf-name",
-                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3"
+                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3"
               },
               {
                 "relationship-key": "p-interface.interface-name",
-                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3-ltpId-22"
+                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3-ltpId-8"
               }
             ],
             "related-to-property": [
           {
             "related-to": "p-interface",
             "relationship-label": "tosca.relationships.network.LinksTo",
-            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1/p-interfaces/p-interface/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1-ltpId-9",
+            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3/p-interfaces/p-interface/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3-ltpId-12",
             "relationship-data": [
               {
                 "relationship-key": "pnf.pnf-name",
-                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1"
+                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3"
               },
               {
                 "relationship-key": "p-interface.interface-name",
-                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1-ltpId-9"
+                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3-ltpId-12"
               }
             ],
             "related-to-property": [
       }
     },
     {
-      "link-name": "networkId-providerId-10-clientId-0-topologyId-2-linkId-10.1.1.3-1000001",
+      "link-name": "networkId-providerId-20-clientId-0-topologyId-2-linkId-10.2.1.3-512",
       "in-maint": false,
       "link-type": "point-to-point",
-      "resource-version": "1632418639304",
-      "link-id": "10.1.1.3-1000001"
+      "resource-version": "1639671565814",
+      "link-id": "10.2.1.3-512"
     },
     {
-      "link-name": "networkId-providerId-20-clientId-0-topologyId-1-linkId-10.2.1.1-9",
+      "link-name": "networkId-providerId-20-clientId-0-topologyId-1-linkId-10.2.1.2-22",
       "in-maint": false,
       "link-type": "point-to-point",
-      "resource-version": "1632418709796",
-      "link-id": "10.2.1.1-9",
+      "resource-version": "1639671574613",
+      "link-id": "10.2.1.2-22",
       "relationship-list": {
         "relationship": [
           {
             "related-to": "p-interface",
             "relationship-label": "tosca.relationships.network.LinksTo",
-            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3/p-interfaces/p-interface/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3-ltpId-22",
+            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.2/p-interfaces/p-interface/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.2-ltpId-22",
             "relationship-data": [
               {
                 "relationship-key": "pnf.pnf-name",
-                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3"
+                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.2"
               },
               {
                 "relationship-key": "p-interface.interface-name",
-                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3-ltpId-22"
+                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.2-ltpId-22"
               }
             ],
             "related-to-property": [
           {
             "related-to": "p-interface",
             "relationship-label": "tosca.relationships.network.LinksTo",
-            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1/p-interfaces/p-interface/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1-ltpId-9",
+            "related-link": "/aai/v24/network/pnfs/pnf/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1/p-interfaces/p-interface/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1-ltpId-12",
             "relationship-data": [
               {
                 "relationship-key": "pnf.pnf-name",
               },
               {
                 "relationship-key": "p-interface.interface-name",
-                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1-ltpId-9"
+                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1-ltpId-12"
               }
             ],
             "related-to-property": [
           }
         ]
       }
-    },
-    {
-      "link-name": "tranportEp_src_ID_113_1",
-      "in-maint": false,
-      "link-type": "point-to-point",
-      "resource-version": "1632418777509",
-      "link-name2": "tranportEp_dst_ID_212_1",
-      "link-id": "113-1-212-1"
     }
   ]
 }
\ No newline at end of file
diff --git a/usecaseui-portal/src/app/mock/json/uui-sotn_getNetworkPolicy.json b/usecaseui-portal/src/app/mock/json/uui-sotn_getNetworkPolicy.json
new file mode 100644 (file)
index 0000000..3073ba3
--- /dev/null
@@ -0,0 +1,45 @@
+{
+  "network-policy-id": "933dacc1-56e0-4b94-8808-4d099ebc4de5",
+  "network-policy-fqdn": "cll-101",
+  "resource-version": "1642347889712",
+  "name": "TSCi policy",
+  "type": "SLA",
+  "latency": 2,
+  "max-bandwidth": 3000,
+  "relationship-list": {
+    "relationship": [
+      {
+        "related-to": "allotted-resource",
+        "relationship-label": "org.onap.relationships.inventory.Uses",
+        "related-link": "/aai/v24/business/customers/customer/IBNCustomer/service-subscriptions/service-subscription/IBN/service-instances/service-instance/cll-101/allotted-resources/allotted-resource/cll-101-network-001",
+        "relationship-data": [
+          {
+            "relationship-key": "customer.global-customer-id",
+            "relationship-value": "IBNCustomer"
+          },
+          {
+            "relationship-key": "service-subscription.service-type",
+            "relationship-value": "IBN"
+          },
+          {
+            "relationship-key": "service-instance.service-instance-id",
+            "relationship-value": "cll-101"
+          },
+          {
+            "relationship-key": "allotted-resource.id",
+            "relationship-value": "cll-101-network-001"
+          }
+        ],
+        "related-to-property": [
+          {
+            "property-key": "allotted-resource.description"
+          },
+          {
+            "property-key": "allotted-resource.allotted-resource-name",
+            "property-value": "network_cll-101-network-001"
+          }
+        ]
+      }
+    ]
+  }
+}
\ No newline at end of file
diff --git a/usecaseui-portal/src/app/mock/json/uui-sotn_getNetworkRoutes.json b/usecaseui-portal/src/app/mock/json/uui-sotn_getNetworkRoutes.json
new file mode 100644 (file)
index 0000000..713a3ad
--- /dev/null
@@ -0,0 +1,100 @@
+{
+  "network-route": [
+    {
+      "route-id": "tranportEp_src_ID_111_2_b",
+      "type": "LEAF",
+      "role": "3gppTransportEP",
+      "function": "3gppTransportEP",
+      "ip-address": "10.2.3.4",
+      "prefix-length": 24,
+      "logical-interface-id": "47",
+      "next-hop": "networkId-providerId-10-clientId-0-topologyId-2-nodeId-10.1.1.1-ltpId-2000001",
+      "address-family": "ipv4",
+      "resource-version": "1639531193721"
+    },
+    {
+      "route-id": "tranportEp_dst_ID_213_1",
+      "type": "ROOT",
+      "role": "3gppTransportEP",
+      "function": "3gppTransportEP",
+      "ip-address": "10.2.3.4",
+      "prefix-length": 24,
+      "logical-interface-id": "58",
+      "next-hop": "networkId-providerId-20-clientId-0-topologyId-2-nodeId-10.2.1.3-ltpId-512",
+      "address-family": "ipv4",
+      "resource-version": "1639671964193"
+    },
+    {
+      "route-id": "tranportEp_src_ID_111_1",
+      "type": "LEAF",
+      "role": "3gppTransportEP",
+      "function": "3gppTransportEP",
+      "ip-address": "10.2.3.4",
+      "prefix-length": 24,
+      "logical-interface-id": "47",
+      "next-hop": "networkId-providerId-10-clientId-0-topologyId-2-nodeId-10.1.1.1-ltpId-1000001",
+      "address-family": "ipv4",
+      "resource-version": "1638832222138"
+    },
+    {
+      "route-id": "tranportEp_src_ID_113_1",
+      "type": "LEAF",
+      "role": "3gppTransportEP",
+      "function": "3gppTransportEP",
+      "ip-address": "10.2.3.4",
+      "prefix-length": 24,
+      "logical-interface-id": "47",
+      "next-hop": "networkId-providerId-10-clientId-0-topologyId-2-nodeId-10.1.1.3-ltpId-1000001",
+      "address-family": "ipv4",
+      "resource-version": "1638832227889"
+    },
+    {
+      "route-id": "tranportEp_src_ID_113_1_b",
+      "type": "LEAF",
+      "role": "3gppTransportEP",
+      "function": "3gppTransportEP",
+      "ip-address": "10.2.3.4",
+      "prefix-length": 24,
+      "logical-interface-id": "58",
+      "next-hop": "networkId-providerId-10-clientId-0-topologyId-2-nodeId-10.1.1.3-ltpId-1000001",
+      "address-family": "ipv4",
+      "resource-version": "1639531171688"
+    },
+    {
+      "route-id": "tranportEp_src_ID_111_1_b",
+      "type": "LEAF",
+      "role": "3gppTransportEP",
+      "function": "3gppTransportEP",
+      "ip-address": "10.2.3.4",
+      "prefix-length": 24,
+      "logical-interface-id": "58",
+      "next-hop": "networkId-providerId-10-clientId-0-topologyId-2-nodeId-10.1.1.1-ltpId-1000001",
+      "address-family": "ipv4",
+      "resource-version": "1639531188572"
+    },
+    {
+      "route-id": "tranportEp_dst_ID_212_1",
+      "type": "ROOT",
+      "role": "3gppTransportEP",
+      "function": "3gppTransportEP",
+      "ip-address": "10.2.3.4",
+      "prefix-length": 24,
+      "logical-interface-id": "47",
+      "next-hop": "networkId-providerId-20-clientId-0-topologyId-2-nodeId-10.2.1.2-ltpId-512",
+      "address-family": "ipv4",
+      "resource-version": "1638832188801"
+    },
+    {
+      "route-id": "tranportEp_src_ID_111_2",
+      "type": "LEAF",
+      "role": "3gppTransportEP",
+      "function": "3gppTransportEP",
+      "ip-address": "10.2.3.4",
+      "prefix-length": 24,
+      "logical-interface-id": "47",
+      "next-hop": "networkId-providerId-10-clientId-0-topologyId-2-nodeId-10.1.1.1-ltpId-2000001",
+      "address-family": "ipv4",
+      "resource-version": "1639764290900"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/usecaseui-portal/src/app/mock/json/uui-sotn_getPnfs.json b/usecaseui-portal/src/app/mock/json/uui-sotn_getPnfs.json
new file mode 100644 (file)
index 0000000..1b8ad99
--- /dev/null
@@ -0,0 +1,683 @@
+{
+  "pnf": [
+    {
+      "pnf-name": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3",
+      "pnf-id": "10.1.1.3",
+      "in-maint": true,
+      "spare-equipment-indicator": false,
+      "resource-version": "1639671501049",
+      "admin-status": "up",
+      "operational-status": "up",
+      "relationship-list": {
+        "relationship": [
+          {
+            "related-to": "tunnel-termination-point",
+            "relationship-label": "tosca.relationships.network.BindsTo",
+            "related-link": "/aai/v24/network/tunnel-termination-points/tunnel-termination-point/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3-ttpId-MTI%3D",
+            "relationship-data": [
+              {
+                "relationship-key": "tunnel-termination-point.ttp-id",
+                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3-ttpId-MTI="
+              }
+            ]
+          },
+          {
+            "related-to": "tunnel-termination-point",
+            "relationship-label": "tosca.relationships.network.BindsTo",
+            "related-link": "/aai/v24/network/tunnel-termination-points/tunnel-termination-point/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3-ttpId-MjI%3D",
+            "relationship-data": [
+              {
+                "relationship-key": "tunnel-termination-point.ttp-id",
+                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3-ttpId-MjI="
+              }
+            ]
+          },
+          {
+            "related-to": "tunnel-termination-point",
+            "relationship-label": "tosca.relationships.network.BindsTo",
+            "related-link": "/aai/v24/network/tunnel-termination-points/tunnel-termination-point/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3-ttpId-OA%3D%3D",
+            "relationship-data": [
+              {
+                "relationship-key": "tunnel-termination-point.ttp-id",
+                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.3-ttpId-OA=="
+              }
+            ]
+          },
+          {
+            "related-to": "esr-thirdparty-sdnc",
+            "relationship-label": "org.onap.relationships.inventory.AppliesTo",
+            "related-link": "/aai/v24/external-system/esr-thirdparty-sdnc-list/esr-thirdparty-sdnc/sdnc1",
+            "relationship-data": [
+              {
+                "relationship-key": "esr-thirdparty-sdnc.thirdparty-sdnc-id",
+                "relationship-value": "sdnc1"
+              }
+            ]
+          },
+          {
+            "related-to": "network-resource",
+            "relationship-label": "tosca.relationships.network.LinksTo",
+            "related-link": "/aai/v24/network/network-resources/network-resource/providerId-10-clientId-0-topologyId-1",
+            "relationship-data": [
+              {
+                "relationship-key": "network-resource.network-id",
+                "relationship-value": "providerId-10-clientId-0-topologyId-1"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "network-resource.network-id",
+                "property-value": "providerId-10-clientId-0-topologyId-1"
+              }
+            ]
+          }
+        ]
+      }
+    },
+    {
+      "pnf-name": "networkId-providerId-20-clientId-0-topologyId-2-nodeId-10.2.1.3",
+      "pnf-id": "10.2.1.3",
+      "in-maint": true,
+      "spare-equipment-indicator": false,
+      "resource-version": "1639671564529",
+      "admin-status": "up",
+      "operational-status": "up",
+      "relationship-list": {
+        "relationship": [
+          {
+            "related-to": "esr-thirdparty-sdnc",
+            "relationship-label": "org.onap.relationships.inventory.AppliesTo",
+            "related-link": "/aai/v24/external-system/esr-thirdparty-sdnc-list/esr-thirdparty-sdnc/sdnc2",
+            "relationship-data": [
+              {
+                "relationship-key": "esr-thirdparty-sdnc.thirdparty-sdnc-id",
+                "relationship-value": "sdnc2"
+              }
+            ]
+          },
+          {
+            "related-to": "network-resource",
+            "relationship-label": "tosca.relationships.network.LinksTo",
+            "related-link": "/aai/v24/network/network-resources/network-resource/providerId-20-clientId-0-topologyId-2",
+            "relationship-data": [
+              {
+                "relationship-key": "network-resource.network-id",
+                "relationship-value": "providerId-20-clientId-0-topologyId-2"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "network-resource.network-id",
+                "property-value": "providerId-20-clientId-0-topologyId-2"
+              }
+            ]
+          }
+        ]
+      }
+    },
+    {
+      "pnf-name": "networkId-providerId-20-clientId-0-topologyId-2-nodeId-10.2.1.1",
+      "pnf-id": "10.2.1.1",
+      "in-maint": true,
+      "spare-equipment-indicator": false,
+      "resource-version": "1639671565455",
+      "admin-status": "up",
+      "operational-status": "up",
+      "relationship-list": {
+        "relationship": [
+          {
+            "related-to": "esr-thirdparty-sdnc",
+            "relationship-label": "org.onap.relationships.inventory.AppliesTo",
+            "related-link": "/aai/v24/external-system/esr-thirdparty-sdnc-list/esr-thirdparty-sdnc/sdnc2",
+            "relationship-data": [
+              {
+                "relationship-key": "esr-thirdparty-sdnc.thirdparty-sdnc-id",
+                "relationship-value": "sdnc2"
+              }
+            ]
+          },
+          {
+            "related-to": "network-resource",
+            "relationship-label": "tosca.relationships.network.LinksTo",
+            "related-link": "/aai/v24/network/network-resources/network-resource/providerId-20-clientId-0-topologyId-2",
+            "relationship-data": [
+              {
+                "relationship-key": "network-resource.network-id",
+                "relationship-value": "providerId-20-clientId-0-topologyId-2"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "network-resource.network-id",
+                "property-value": "providerId-20-clientId-0-topologyId-2"
+              }
+            ]
+          }
+        ]
+      }
+    },
+    {
+      "pnf-name": "networkId-providerId-10-clientId-0-topologyId-2-nodeId-10.1.1.2",
+      "pnf-id": "10.1.1.2",
+      "in-maint": true,
+      "spare-equipment-indicator": false,
+      "resource-version": "1639671496572",
+      "admin-status": "up",
+      "operational-status": "up",
+      "relationship-list": {
+        "relationship": [
+          {
+            "related-to": "esr-thirdparty-sdnc",
+            "relationship-label": "org.onap.relationships.inventory.AppliesTo",
+            "related-link": "/aai/v24/external-system/esr-thirdparty-sdnc-list/esr-thirdparty-sdnc/sdnc1",
+            "relationship-data": [
+              {
+                "relationship-key": "esr-thirdparty-sdnc.thirdparty-sdnc-id",
+                "relationship-value": "sdnc1"
+              }
+            ]
+          },
+          {
+            "related-to": "network-resource",
+            "relationship-label": "tosca.relationships.network.LinksTo",
+            "related-link": "/aai/v24/network/network-resources/network-resource/providerId-10-clientId-0-topologyId-2",
+            "relationship-data": [
+              {
+                "relationship-key": "network-resource.network-id",
+                "relationship-value": "providerId-10-clientId-0-topologyId-2"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "network-resource.network-id",
+                "property-value": "providerId-10-clientId-0-topologyId-2"
+              }
+            ]
+          }
+        ]
+      }
+    },
+    {
+      "pnf-name": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1",
+      "pnf-id": "10.2.1.1",
+      "in-maint": true,
+      "spare-equipment-indicator": false,
+      "resource-version": "1639671573039",
+      "admin-status": "up",
+      "operational-status": "up",
+      "relationship-list": {
+        "relationship": [
+          {
+            "related-to": "tunnel-termination-point",
+            "relationship-label": "tosca.relationships.network.BindsTo",
+            "related-link": "/aai/v24/network/tunnel-termination-points/tunnel-termination-point/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1-ttpId-MTI%3D",
+            "relationship-data": [
+              {
+                "relationship-key": "tunnel-termination-point.ttp-id",
+                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1-ttpId-MTI="
+              }
+            ]
+          },
+          {
+            "related-to": "tunnel-termination-point",
+            "relationship-label": "tosca.relationships.network.BindsTo",
+            "related-link": "/aai/v24/network/tunnel-termination-points/tunnel-termination-point/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1-ttpId-MjI%3D",
+            "relationship-data": [
+              {
+                "relationship-key": "tunnel-termination-point.ttp-id",
+                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1-ttpId-MjI="
+              }
+            ]
+          },
+          {
+            "related-to": "tunnel-termination-point",
+            "relationship-label": "tosca.relationships.network.BindsTo",
+            "related-link": "/aai/v24/network/tunnel-termination-points/tunnel-termination-point/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1-ttpId-OQ%3D%3D",
+            "relationship-data": [
+              {
+                "relationship-key": "tunnel-termination-point.ttp-id",
+                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.1-ttpId-OQ=="
+              }
+            ]
+          },
+          {
+            "related-to": "esr-thirdparty-sdnc",
+            "relationship-label": "org.onap.relationships.inventory.AppliesTo",
+            "related-link": "/aai/v24/external-system/esr-thirdparty-sdnc-list/esr-thirdparty-sdnc/sdnc2",
+            "relationship-data": [
+              {
+                "relationship-key": "esr-thirdparty-sdnc.thirdparty-sdnc-id",
+                "relationship-value": "sdnc2"
+              }
+            ]
+          },
+          {
+            "related-to": "network-resource",
+            "relationship-label": "tosca.relationships.network.LinksTo",
+            "related-link": "/aai/v24/network/network-resources/network-resource/providerId-20-clientId-0-topologyId-1",
+            "relationship-data": [
+              {
+                "relationship-key": "network-resource.network-id",
+                "relationship-value": "providerId-20-clientId-0-topologyId-1"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "network-resource.network-id",
+                "property-value": "providerId-20-clientId-0-topologyId-1"
+              }
+            ]
+          }
+        ]
+      }
+    },
+    {
+      "pnf-name": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2",
+      "pnf-id": "10.1.1.2",
+      "in-maint": true,
+      "spare-equipment-indicator": false,
+      "resource-version": "1639671506823",
+      "admin-status": "up",
+      "operational-status": "up",
+      "relationship-list": {
+        "relationship": [
+          {
+            "related-to": "tunnel-termination-point",
+            "relationship-label": "tosca.relationships.network.BindsTo",
+            "related-link": "/aai/v24/network/tunnel-termination-points/tunnel-termination-point/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2-ttpId-Mg%3D%3D",
+            "relationship-data": [
+              {
+                "relationship-key": "tunnel-termination-point.ttp-id",
+                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2-ttpId-Mg=="
+              }
+            ]
+          },
+          {
+            "related-to": "tunnel-termination-point",
+            "relationship-label": "tosca.relationships.network.BindsTo",
+            "related-link": "/aai/v24/network/tunnel-termination-points/tunnel-termination-point/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2-ttpId-MTI%3D",
+            "relationship-data": [
+              {
+                "relationship-key": "tunnel-termination-point.ttp-id",
+                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2-ttpId-MTI="
+              }
+            ]
+          },
+          {
+            "related-to": "tunnel-termination-point",
+            "relationship-label": "tosca.relationships.network.BindsTo",
+            "related-link": "/aai/v24/network/tunnel-termination-points/tunnel-termination-point/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2-ttpId-MjI%3D",
+            "relationship-data": [
+              {
+                "relationship-key": "tunnel-termination-point.ttp-id",
+                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.2-ttpId-MjI="
+              }
+            ]
+          },
+          {
+            "related-to": "esr-thirdparty-sdnc",
+            "relationship-label": "org.onap.relationships.inventory.AppliesTo",
+            "related-link": "/aai/v24/external-system/esr-thirdparty-sdnc-list/esr-thirdparty-sdnc/sdnc1",
+            "relationship-data": [
+              {
+                "relationship-key": "esr-thirdparty-sdnc.thirdparty-sdnc-id",
+                "relationship-value": "sdnc1"
+              }
+            ]
+          },
+          {
+            "related-to": "network-resource",
+            "relationship-label": "tosca.relationships.network.LinksTo",
+            "related-link": "/aai/v24/network/network-resources/network-resource/providerId-10-clientId-0-topologyId-1",
+            "relationship-data": [
+              {
+                "relationship-key": "network-resource.network-id",
+                "relationship-value": "providerId-10-clientId-0-topologyId-1"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "network-resource.network-id",
+                "property-value": "providerId-10-clientId-0-topologyId-1"
+              }
+            ]
+          }
+        ]
+      }
+    },
+    {
+      "pnf-name": "networkId-providerId-10-clientId-0-topologyId-2-nodeId-10.1.1.1",
+      "pnf-id": "10.1.1.1",
+      "in-maint": true,
+      "spare-equipment-indicator": false,
+      "resource-version": "1639671496111",
+      "admin-status": "up",
+      "operational-status": "up",
+      "relationship-list": {
+        "relationship": [
+          {
+            "related-to": "esr-thirdparty-sdnc",
+            "relationship-label": "org.onap.relationships.inventory.AppliesTo",
+            "related-link": "/aai/v24/external-system/esr-thirdparty-sdnc-list/esr-thirdparty-sdnc/sdnc1",
+            "relationship-data": [
+              {
+                "relationship-key": "esr-thirdparty-sdnc.thirdparty-sdnc-id",
+                "relationship-value": "sdnc1"
+              }
+            ]
+          },
+          {
+            "related-to": "network-resource",
+            "relationship-label": "tosca.relationships.network.LinksTo",
+            "related-link": "/aai/v24/network/network-resources/network-resource/providerId-10-clientId-0-topologyId-2",
+            "relationship-data": [
+              {
+                "relationship-key": "network-resource.network-id",
+                "relationship-value": "providerId-10-clientId-0-topologyId-2"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "network-resource.network-id",
+                "property-value": "providerId-10-clientId-0-topologyId-2"
+              }
+            ]
+          }
+        ]
+      }
+    },
+    {
+      "pnf-name": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1",
+      "pnf-id": "10.1.1.1",
+      "in-maint": true,
+      "spare-equipment-indicator": false,
+      "resource-version": "1639671504733",
+      "admin-status": "up",
+      "operational-status": "up",
+      "relationship-list": {
+        "relationship": [
+          {
+            "related-to": "tunnel-termination-point",
+            "relationship-label": "tosca.relationships.network.BindsTo",
+            "related-link": "/aai/v24/network/tunnel-termination-points/tunnel-termination-point/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1-ttpId-Ng%3D%3D",
+            "relationship-data": [
+              {
+                "relationship-key": "tunnel-termination-point.ttp-id",
+                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1-ttpId-Ng=="
+              }
+            ]
+          },
+          {
+            "related-to": "tunnel-termination-point",
+            "relationship-label": "tosca.relationships.network.BindsTo",
+            "related-link": "/aai/v24/network/tunnel-termination-points/tunnel-termination-point/networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1-ttpId-MTI%3D",
+            "relationship-data": [
+              {
+                "relationship-key": "tunnel-termination-point.ttp-id",
+                "relationship-value": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1-ttpId-MTI="
+              }
+            ]
+          },
+          {
+            "related-to": "esr-thirdparty-sdnc",
+            "relationship-label": "org.onap.relationships.inventory.AppliesTo",
+            "related-link": "/aai/v24/external-system/esr-thirdparty-sdnc-list/esr-thirdparty-sdnc/sdnc1",
+            "relationship-data": [
+              {
+                "relationship-key": "esr-thirdparty-sdnc.thirdparty-sdnc-id",
+                "relationship-value": "sdnc1"
+              }
+            ]
+          },
+          {
+            "related-to": "network-resource",
+            "relationship-label": "tosca.relationships.network.LinksTo",
+            "related-link": "/aai/v24/network/network-resources/network-resource/providerId-10-clientId-0-topologyId-1",
+            "relationship-data": [
+              {
+                "relationship-key": "network-resource.network-id",
+                "relationship-value": "providerId-10-clientId-0-topologyId-1"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "network-resource.network-id",
+                "property-value": "providerId-10-clientId-0-topologyId-1"
+              }
+            ]
+          }
+        ]
+      }
+    },
+    {
+      "pnf-name": "networkId-providerId-10-clientId-0-topologyId-2-nodeId-10.1.1.3",
+      "pnf-id": "10.1.1.3",
+      "in-maint": true,
+      "spare-equipment-indicator": false,
+      "resource-version": "1639671495441",
+      "admin-status": "up",
+      "operational-status": "up",
+      "relationship-list": {
+        "relationship": [
+          {
+            "related-to": "esr-thirdparty-sdnc",
+            "relationship-label": "org.onap.relationships.inventory.AppliesTo",
+            "related-link": "/aai/v24/external-system/esr-thirdparty-sdnc-list/esr-thirdparty-sdnc/sdnc1",
+            "relationship-data": [
+              {
+                "relationship-key": "esr-thirdparty-sdnc.thirdparty-sdnc-id",
+                "relationship-value": "sdnc1"
+              }
+            ]
+          },
+          {
+            "related-to": "network-resource",
+            "relationship-label": "tosca.relationships.network.LinksTo",
+            "related-link": "/aai/v24/network/network-resources/network-resource/providerId-10-clientId-0-topologyId-2",
+            "relationship-data": [
+              {
+                "relationship-key": "network-resource.network-id",
+                "relationship-value": "providerId-10-clientId-0-topologyId-2"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "network-resource.network-id",
+                "property-value": "providerId-10-clientId-0-topologyId-2"
+              }
+            ]
+          }
+        ]
+      }
+    },
+    {
+      "pnf-name": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3",
+      "pnf-id": "10.2.1.3",
+      "in-maint": true,
+      "spare-equipment-indicator": false,
+      "resource-version": "1639671568982",
+      "admin-status": "up",
+      "operational-status": "up",
+      "relationship-list": {
+        "relationship": [
+          {
+            "related-to": "tunnel-termination-point",
+            "relationship-label": "tosca.relationships.network.BindsTo",
+            "related-link": "/aai/v24/network/tunnel-termination-points/tunnel-termination-point/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3-ttpId-MjI%3D",
+            "relationship-data": [
+              {
+                "relationship-key": "tunnel-termination-point.ttp-id",
+                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3-ttpId-MjI="
+              }
+            ]
+          },
+          {
+            "related-to": "tunnel-termination-point",
+            "relationship-label": "tosca.relationships.network.BindsTo",
+            "related-link": "/aai/v24/network/tunnel-termination-points/tunnel-termination-point/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3-ttpId-Mw%3D%3D",
+            "relationship-data": [
+              {
+                "relationship-key": "tunnel-termination-point.ttp-id",
+                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3-ttpId-Mw=="
+              }
+            ]
+          },
+          {
+            "related-to": "tunnel-termination-point",
+            "relationship-label": "tosca.relationships.network.BindsTo",
+            "related-link": "/aai/v24/network/tunnel-termination-points/tunnel-termination-point/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3-ttpId-MTI%3D",
+            "relationship-data": [
+              {
+                "relationship-key": "tunnel-termination-point.ttp-id",
+                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.3-ttpId-MTI="
+              }
+            ]
+          },
+          {
+            "related-to": "esr-thirdparty-sdnc",
+            "relationship-label": "org.onap.relationships.inventory.AppliesTo",
+            "related-link": "/aai/v24/external-system/esr-thirdparty-sdnc-list/esr-thirdparty-sdnc/sdnc2",
+            "relationship-data": [
+              {
+                "relationship-key": "esr-thirdparty-sdnc.thirdparty-sdnc-id",
+                "relationship-value": "sdnc2"
+              }
+            ]
+          },
+          {
+            "related-to": "network-resource",
+            "relationship-label": "tosca.relationships.network.LinksTo",
+            "related-link": "/aai/v24/network/network-resources/network-resource/providerId-20-clientId-0-topologyId-1",
+            "relationship-data": [
+              {
+                "relationship-key": "network-resource.network-id",
+                "relationship-value": "providerId-20-clientId-0-topologyId-1"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "network-resource.network-id",
+                "property-value": "providerId-20-clientId-0-topologyId-1"
+              }
+            ]
+          }
+        ]
+      }
+    },
+    {
+      "pnf-name": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.2",
+      "pnf-id": "10.2.1.2",
+      "in-maint": true,
+      "spare-equipment-indicator": false,
+      "resource-version": "1639671567564",
+      "admin-status": "up",
+      "operational-status": "up",
+      "relationship-list": {
+        "relationship": [
+          {
+            "related-to": "tunnel-termination-point",
+            "relationship-label": "tosca.relationships.network.BindsTo",
+            "related-link": "/aai/v24/network/tunnel-termination-points/tunnel-termination-point/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.2-ttpId-NQ%3D%3D",
+            "relationship-data": [
+              {
+                "relationship-key": "tunnel-termination-point.ttp-id",
+                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.2-ttpId-NQ=="
+              }
+            ]
+          },
+          {
+            "related-to": "tunnel-termination-point",
+            "relationship-label": "tosca.relationships.network.BindsTo",
+            "related-link": "/aai/v24/network/tunnel-termination-points/tunnel-termination-point/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.2-ttpId-MjI%3D",
+            "relationship-data": [
+              {
+                "relationship-key": "tunnel-termination-point.ttp-id",
+                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.2-ttpId-MjI="
+              }
+            ]
+          },
+          {
+            "related-to": "tunnel-termination-point",
+            "relationship-label": "tosca.relationships.network.BindsTo",
+            "related-link": "/aai/v24/network/tunnel-termination-points/tunnel-termination-point/networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.2-ttpId-MTI%3D",
+            "relationship-data": [
+              {
+                "relationship-key": "tunnel-termination-point.ttp-id",
+                "relationship-value": "networkId-providerId-20-clientId-0-topologyId-1-nodeId-10.2.1.2-ttpId-MTI="
+              }
+            ]
+          },
+          {
+            "related-to": "esr-thirdparty-sdnc",
+            "relationship-label": "org.onap.relationships.inventory.AppliesTo",
+            "related-link": "/aai/v24/external-system/esr-thirdparty-sdnc-list/esr-thirdparty-sdnc/sdnc2",
+            "relationship-data": [
+              {
+                "relationship-key": "esr-thirdparty-sdnc.thirdparty-sdnc-id",
+                "relationship-value": "sdnc2"
+              }
+            ]
+          },
+          {
+            "related-to": "network-resource",
+            "relationship-label": "tosca.relationships.network.LinksTo",
+            "related-link": "/aai/v24/network/network-resources/network-resource/providerId-20-clientId-0-topologyId-1",
+            "relationship-data": [
+              {
+                "relationship-key": "network-resource.network-id",
+                "relationship-value": "providerId-20-clientId-0-topologyId-1"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "network-resource.network-id",
+                "property-value": "providerId-20-clientId-0-topologyId-1"
+              }
+            ]
+          }
+        ]
+      }
+    },
+    {
+      "pnf-name": "networkId-providerId-20-clientId-0-topologyId-2-nodeId-10.2.1.2",
+      "pnf-id": "10.2.1.2",
+      "in-maint": true,
+      "spare-equipment-indicator": false,
+      "resource-version": "1639671563430",
+      "admin-status": "up",
+      "operational-status": "up",
+      "relationship-list": {
+        "relationship": [
+          {
+            "related-to": "esr-thirdparty-sdnc",
+            "relationship-label": "org.onap.relationships.inventory.AppliesTo",
+            "related-link": "/aai/v24/external-system/esr-thirdparty-sdnc-list/esr-thirdparty-sdnc/sdnc2",
+            "relationship-data": [
+              {
+                "relationship-key": "esr-thirdparty-sdnc.thirdparty-sdnc-id",
+                "relationship-value": "sdnc2"
+              }
+            ]
+          },
+          {
+            "related-to": "network-resource",
+            "relationship-label": "tosca.relationships.network.LinksTo",
+            "related-link": "/aai/v24/network/network-resources/network-resource/providerId-20-clientId-0-topologyId-2",
+            "relationship-data": [
+              {
+                "relationship-key": "network-resource.network-id",
+                "relationship-value": "providerId-20-clientId-0-topologyId-2"
+              }
+            ],
+            "related-to-property": [
+              {
+                "property-key": "network-resource.network-id",
+                "property-value": "providerId-20-clientId-0-topologyId-2"
+              }
+            ]
+          }
+        ]
+      }
+    }
+  ]
+}
\ No newline at end of file
diff --git a/usecaseui-portal/src/app/mock/json/uui-sotn_getServiceInstances.json b/usecaseui-portal/src/app/mock/json/uui-sotn_getServiceInstances.json
new file mode 100644 (file)
index 0000000..9ff3424
--- /dev/null
@@ -0,0 +1,129 @@
+{
+  "service-instance-id": "cll-101",
+  "service-instance-name": "cloud-leased-line-101",
+  "service-type": "CLL",
+  "service-role": "cll",
+  "environment-context": "cll",
+  "model-invariant-id": "6790ab0e-034f-11eb-adc1-0242ac120002",
+  "model-version-id": "6790ab0e-034f-11eb-adc1-0242ac120002",
+  "resource-version": "1642347911420",
+  "orchestration-status": "created",
+  "relationship-list": {
+    "relationship": [
+      {
+        "related-to": "connectivity",
+        "relationship-label": "org.onap.relationships.inventory.PartOf",
+        "related-link": "/aai/v24/network/connectivities/connectivity/edffb684-fad8-4b61-bc50-e7b80edbfcca",
+        "relationship-data": [
+          {
+            "relationship-key": "connectivity.connectivity-id",
+            "relationship-value": "edffb684-fad8-4b61-bc50-e7b80edbfcca"
+          }
+        ],
+        "related-to-property": [
+          {
+            "property-key": "connectivity.etht-svc-name",
+            "property-value": "cll-link-3"
+          }
+        ]
+      },
+      {
+        "related-to": "connectivity",
+        "relationship-label": "org.onap.relationships.inventory.PartOf",
+        "related-link": "/aai/v24/network/connectivities/connectivity/0af5ed1f-f224-46a9-8ef6-5d085bd44959",
+        "relationship-data": [
+          {
+            "relationship-key": "connectivity.connectivity-id",
+            "relationship-value": "0af5ed1f-f224-46a9-8ef6-5d085bd44959"
+          }
+        ],
+        "related-to-property": [
+          {
+            "property-key": "connectivity.etht-svc-name",
+            "property-value": "cll-link-3"
+          }
+        ]
+      },
+      {
+        "related-to": "connectivity",
+        "relationship-label": "org.onap.relationships.inventory.PartOf",
+        "related-link": "/aai/v24/network/connectivities/connectivity/74279c52-3c66-4769-b90c-5b3f7599ec97",
+        "relationship-data": [
+          {
+            "relationship-key": "connectivity.connectivity-id",
+            "relationship-value": "74279c52-3c66-4769-b90c-5b3f7599ec97"
+          }
+        ],
+        "related-to-property": [
+          {
+            "property-key": "connectivity.etht-svc-name",
+            "property-value": "cll-link-3"
+          }
+        ]
+      }
+    ]
+  },
+  "allotted-resources": {
+    "allotted-resource": [
+      {
+        "id": "cll-101-network-001",
+        "resource-version": "1642347907298",
+        "type": "TsciNetwork",
+        "allotted-resource-name": "network_cll-101-network-001",
+        "relationship-list": {
+          "relationship": [
+            {
+              "related-to": "logical-link",
+              "relationship-label": "org.onap.relationships.inventory.ComposedOf",
+              "related-link": "/aai/v24/network/logical-links/logical-link/tranportEp_src_ID_111_2",
+              "relationship-data": [
+                {
+                  "relationship-key": "logical-link.link-name",
+                  "relationship-value": "tranportEp_src_ID_111_2"
+                }
+              ],
+              "related-to-property": [
+                {
+                  "property-key": "logical-link.link-description"
+                }
+              ]
+            },
+            {
+              "related-to": "logical-link",
+              "relationship-label": "org.onap.relationships.inventory.ComposedOf",
+              "related-link": "/aai/v24/network/logical-links/logical-link/tranportEp_src_ID_111_1",
+              "relationship-data": [
+                {
+                  "relationship-key": "logical-link.link-name",
+                  "relationship-value": "tranportEp_src_ID_111_1"
+                }
+              ],
+              "related-to-property": [
+                {
+                  "property-key": "logical-link.link-description"
+                }
+              ]
+            },
+            {
+              "related-to": "network-policy",
+              "relationship-label": "org.onap.relationships.inventory.Uses",
+              "related-link": "/aai/v24/network/network-policies/network-policy/933dacc1-56e0-4b94-8808-4d099ebc4de5",
+              "relationship-data": [
+                {
+                  "relationship-key": "network-policy.network-policy-id",
+                  "relationship-value": "933dacc1-56e0-4b94-8808-4d099ebc4de5"
+                }
+              ],
+              "related-to-property": [
+                {
+                  "property-key": "network-policy.network-policy-fqdn",
+                  "property-value": "cll-101"
+                }
+              ]
+            }
+          ]
+        }
+      }
+    ]
+  }
+}
\ No newline at end of file
diff --git a/usecaseui-portal/src/app/mock/json/uui-sotn_getUuis.json b/usecaseui-portal/src/app/mock/json/uui-sotn_getUuis.json
new file mode 100644 (file)
index 0000000..2339b3d
--- /dev/null
@@ -0,0 +1,25 @@
+{
+  "uni": [
+    {
+      "id": "networkId-providerId-20-clientId-0-topologyId-2-nodeId-10.2.1.2-ltpId-512-47",
+      "tp-id": "512",
+      "cvlan": "47",
+      "data-source": "6",
+      "resource-version": "1642347905015"
+    },
+    {
+      "id": "networkId-providerId-10-clientId-0-topologyId-2-nodeId-10.1.1.1-ltpId-1000001-47",
+      "tp-id": "1000001",
+      "cvlan": "47",
+      "data-source": "3",
+      "resource-version": "1642347907104"
+    },
+    {
+      "id": "networkId-providerId-10-clientId-0-topologyId-2-nodeId-10.1.1.1-ltpId-2000001-47",
+      "tp-id": "2000001",
+      "cvlan": "47",
+      "data-source": "3",
+      "resource-version": "1642347898407"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/usecaseui-portal/src/app/mock/json/uui-sotn_getVpnBindings.json b/usecaseui-portal/src/app/mock/json/uui-sotn_getVpnBindings.json
new file mode 100644 (file)
index 0000000..c150d59
--- /dev/null
@@ -0,0 +1,40 @@
+{
+  "vpn-binding": [
+    {
+      "vpn-id": "f9097e3d-3578-44cf-a0cd-e41c36d6d2ad",
+      "vpn-name": "eb884038-da90-4c69-b35b-77af51e7ba72",
+      "vpn-platform": "rocks",
+      "vpn-region": "http://192.168.198.6:28181",
+      "customer-vpn-id": "4",
+      "route-distinguisher": "6",
+      "access-provider-id": "20",
+      "access-client-id": "0",
+      "access-topology-id": "1",
+      "src-access-node-id": "10.2.1.3",
+      "src-access-ltp-id": "MTI=",
+      "dst-access-node-id": "10.2.1.2",
+      "operational-status": "Activated",
+      "resource-version": "1642347908632",
+      "vpn-description": "onos",
+      "ops-note": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1"
+    },
+    {
+      "vpn-id": "56de3da0-bed1-4ecc-af22-39bc03c19dc0",
+      "vpn-name": "eb884038-da90-4c69-b35b-77af51e7ba72",
+      "vpn-platform": "rocks",
+      "vpn-region": "http://192.168.198.6:18181",
+      "customer-vpn-id": "4",
+      "route-distinguisher": "6",
+      "access-provider-id": "10",
+      "access-client-id": "0",
+      "access-topology-id": "1",
+      "src-access-node-id": "10.1.1.1",
+      "dst-access-node-id": "10.1.1.3",
+      "dst-access-ltp-id": "OA==",
+      "operational-status": "Activated",
+      "resource-version": "1642347908997",
+      "vpn-description": "onos",
+      "ops-note": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1"
+    }
+  ]
+}
\ No newline at end of file
index 8c59104..4908616 100644 (file)
@@ -63,6 +63,8 @@ module.exports = {
                "/uui-lcm_services_updateService",
        "/uui-sotn/getPnfInfo/:name": "/uui-sotn_getPnfInfo",
        "/uui-sotn/getConnectivityInfo/:id": "/uui-sotn_getConnectivityInfo",
+       "/uui-sotn/getConnectivities": "/uui-sotn_getConnectivities",
+       "/uui-sotn/getNetworkRouteByRouteId/:id" : "/:id",
        "/uui-sotn/getPinterfaceByVpnId/:id": "/uui-sotn_getPinterfaceByVpnId",
        "/POST/uui-lcm/healNetworkServiceInstance?ns_instance_id=:ns_instance_id":
                "/uui-lcm_healNetworkServiceInstance",
index e1a1d6e..e2abdfc 100644 (file)
@@ -1,5 +1,6 @@
 /*
     Copyright (C) 2019 CMCC, Inc. and others. All rights reserved.
+    Copyright (C) 2022 Huawei Canada Limited. All rights reserved.
 
     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
 #tpContainer{
   position: relative;
   width:100%;
-  height: 95%;
+  height: 65%;
   margin-top: 15px;
   float: left;
   background: #EEF9FF;
 }
+
+.slicing-resource-table{
+  position: relative;
+  width: 100%;
+  margin-top: 500px;
+
+}
+
 #tpContainer .no-network{
   width: 300px;
   margin: 0 auto;
index 48d01d3..c9e150f 100644 (file)
@@ -1,5 +1,6 @@
 <!--
     Copyright (C) 2019 CMCC, Inc. and others. All rights reserved.
+    Copyright (C) 2022 Huawei Canada Limited. All rights reserved.
 
     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
         <i class="icon">
             <img src="assets/images/service-type.png"alt="">
         </i>
-        {{"i18nTextDefine_Connectivity" | translate}} :
+        {{"i18nTextDefine_CCVPNLayer" | translate}} :
     </span>
     <nz-dropdown [nzTrigger]="'click'" [nzPlacement]="'bottomLeft'">
-      <button nz-button nz-dropdown><span>{{connectivitySelected.name}}</span> <i class="anticon anticon-down"></i>
+      <button nz-button nz-dropdown><span>{{layerSelected.name}}</span> <i class="anticon anticon-down"></i>
       </button>
       <ul nz-menu>
-        <li nz-menu-item (click)="choseConnectivity(item)" *ngFor="let item of connectivityList">
+        <li nz-menu-item (click)="changeLayer(item)" *ngFor="let item of layerList">
           <a title="{{item.name}}">{{item.name}}</a>
         </li>
       </ul>
     </nz-dropdown>
 
+    <span>
+        <i class="icon">
+            <img src="assets/images/service-type.png"alt="">
+        </i>
+        {{"i18nTextDefine_CCVPNService" | translate}} :
+    </span>
+    <nz-dropdown [nzTrigger]="'click'" [nzPlacement]="'bottomLeft'">
+      <button nz-button nz-dropdown><span>{{serviceSelected}}</span> <i class="anticon anticon-down"></i>
+      </button>
+      <ul nz-menu>
+        <li nz-menu-item (click)="chooseService(svcInstId)" *ngFor="let svcInstId of getKeys(servicesMap)">
+          <a title="{{svcInstId}}">{{svcInstId}}</a>
+        </li>
+      </ul>
+    </nz-dropdown>
 <!--    <button class="create" nz-button [nzType]="'primary'" (click)="createModal()">
       <i *ngIf="width>1200" class="anticon anticon-plus"></i>
       <span> {{"i18nTextDefine_Create" | translate}} </span>
     </button>-->
   </div>
 
-  <h2 *ngIf="!nonetwork" [ngClass]="{'title-modelshow':isVisible == true}">
+  <!-- <h2 *ngIf="!nonetwork" [ngClass]="{'title-modelshow':isVisible == true}">
     Please configure network links for registered devices and partner system.
-  </h2>
-  <h3  [ngClass]="{'title-modelshow':isVisible == true}">
-    Service Instances:
-  </h3>
-  <div id="svcContainer" style="overflow: hidden;">
-  </div>
+  </h2> -->
   <h3  [ngClass]="{'title-modelshow':isVisible == true}">
     Network Topology:
   </h3>
-  <div id="tpContainer" style="overflow: hidden;">
+  <div #tpContainer id="tpContainer" style="overflow: hidden;">
     <div *ngIf="nonetwork" style="padding: 20px">
       <h2>
         There is not any terminal device can be used for configuration
       <p>No network available</p>
     </div>
   </div>
+  <div class="slicing-resource-table">
+    <div class="slicing-resource-table-list">
+      <nz-table
+              #basicTable
+              [nzData]="getValues(servicesMap)"
+              [nzFrontPagination]="false"
+              nzShowSizeChanger
+              [nzPageSizeOptions]="[6,8,10]"
+      >
+        <thead>
+        <tr>
+          <th>Service Instance Id</th>
+          <th>Service Type</th>
+          <th>VLAN</th>
+          <th>Bandwidth</th>
+          <th>Status</th>
+        </tr>
+        </thead>
+        <tbody>
+        <ng-template ngFor let-data [ngForOf]="basicTable.data" let-i="index">
+          <tr>
+            <td>{{ data.id }}</td>
+            <td>Cloud Lease Line</td>
+            <td>{{ data.vlan }}</td>
+            <td>{{ data.bw }}</td>
+            <td>
+              Activated
+            </td>
+          </tr>
+        </ng-template>
+        </tbody>
+      </nz-table>
+    </div>
+  </div>
+  <!--<div #tableContainer id="tableContainer" style="overflow: hidden;">
+    <div *ngIf="nonetwork" style="padding: 20px">
+      <h2>
+        There is not any terminal device can be used for configuration
+      </h2>
+      <br>
+      <h2>
+        please register external network into ONAP.
+      </h2>
+    </div>
+    <div class="no-network" *ngIf="nonetwork">
+      <img src="assets/images/no-network-available.png" alt="No network available">
+      <p>No network available</p>
+    </div>
+  </div> -->
   <!--Popup-->
   <div class="creation" id="d3_form" *ngIf="isVisible==true">
     <span class="v_color"></span>
index d1e4067..6acdfa6 100644 (file)
@@ -1,5 +1,6 @@
 /*
     Copyright (C) 2019 CMCC, Inc. and others. All rights reserved.
+    Copyright (C) 2022 Huawei Canada Limited. All rights reserved.
 
     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     See the License for the specific language governing permissions and
     limitations under the License.
 */
-import {Component, OnInit} from '@angular/core';
+import {Component, ElementRef, OnInit, ViewChild} from '@angular/core';
 import * as d3 from 'd3'
 import * as $ from 'jquery';
 import {networkHttpservice} from '../../../core/services/networkHttpservice.service';
-import {EventQueueService} from "../../../core/services/eventQueue.service";
-import {AppEvent} from "@src/app/core/services/appEvent";
-import {AppEventType} from "@src/app/core/services/appEventType";
+
+// Customizable colors for edge, domain, node and font
+const DOMAIN_COLOR = 'lightcyan'
+const NODE_COLOR = 'DeepSkyBlue'
+const CE_COLOR = 'Gray'
+const FONT_COLOR = 'Navy'
+const TITLE_COLOR = '#0da9e2' //'linear-gradient(90deg, #07a9e1 0%, #30d9c4 100%)'
+
+// Customizable colors for endpoint CRUD status
+const EP_COLOR_MAP = new Map([
+    ['create', 'RoyalBlue'],
+    ['retrieve', 'ForestGreen'],
+    ['update', 'orange'],
+    ['delete', 'red'],
+])
+
+enum NodePosition {
+  L2_NODE_POS = 'l2_node_pos',
+}
+
+declare var mxGraph: any;
+declare var mxCell: any;
+declare var mxHierarchicalLayout: any;
+declare var mxRubberband: any;
+declare var mxKeyHandler: any;
+declare var mxConstants: any;
+declare var mxCellRenderer: any;
+declare var mxVertexHandler: any;
+declare var mxGraphHandler: any;
+declare var mxGraphSelectionModel: any;
+declare var mxFastOrganicLayout: any;
+declare var mxStackLayout: any;
+declare var mxParallelEdgeLayout: any;
+declare var mxPerimeter: any;
+declare var mxEdgeStyle: any;
+declare var mxAbstractCanvas2D: any;
 
 @Component({
     selector: 'app-ccvpn-network',
@@ -28,63 +62,305 @@ import {AppEventType} from "@src/app/core/services/appEventType";
 })
 export class CcvpnNetworkComponent implements OnInit {
 
-   constructor(private myhttp: networkHttpservice,
-                private eventDispatcher: EventQueueService) {
-    }
+    @ViewChild('tpContainer') graphContainer: ElementRef;
+    @ViewChild('tableContainer') tableContainer: ElementRef;
+
+    constructor(private myhttp: networkHttpservice) {}
 
     ngOnInit() {
+    }
+
+    reqNumber = 0
+    controllers = []
+    onap = {}
+    domainMap = new Map<any, any>()
+    enniMap = new Map()
+    sliceMap = new Map()
+    tunnelsMap = new Map()
+    e2eTunnels = []
+    e2eTunnelMap = new Map()
+    servicesMap = new Map()
+    e2eServices = []
+    e2eServiceMap = new Map()
+    defBandwidth = 1
+    currentLayer = 1
+    currentCloud = ''
+    currentSlice = 'Physical'
+    isNodeName = true
+    isMoreLabels = true
+    storage = window.localStorage
+
+    graph = null;
+    gLayers = [];
+    graphScale = 1;
+    tunnelTable = null;
+    serviceTable = null;
+    edgeLayout = null;
+    organicLayout = null;
+    stackLayout = null;
+
+    // Constants
+    readonly DOMAIN_STYLE = 'fillColor=' + DOMAIN_COLOR + ';shape=rectangle;strokeColor=none;gradientColor=none;' +
+            'verticalLabelPosition=top;verticalAlign=bottom;autosize=1;resizable=1;rounded=1;opacity=50;fontStyle=1';
+    readonly CPE_STYLE = 'fillColor=' + CE_COLOR + ';shape=rectangle;rounded=1';
+    readonly CLOUD_STYLE = 'fillColor=' + CE_COLOR + ';shape=cloud';
+    readonly LINK_STYLE = 'strokeWidth=3;edgeStyle=null'
+    readonly UNI_LINK_STYLE = 'strokeWidth=2;edgeStyle=null;strokeColor=' + CE_COLOR
+    readonly TUNNEL_STYLE = 'strokeWidth=2;curved=1'
+    readonly SERVICE_STYLE = 'strokeWidth=1;curved=1'
+
+    ngAfterViewInit() {
         let thisNg = this;
-        this.isSpinning = true;
-        this.myhttp.getConnectivities()
-            .subscribe((data) => {
-                if(data){
-                    for (let conn of data["connectivity"]) {
-                        if (conn["vpn-type"] === "mdsc"){
-                            this.connectivityList.push({ "name": conn["connectivity-id"],
-                                                        "id": conn["connectivity-id"],
-                                                        "relationship-list" : conn["relationship-list"]
-                            });
-                        }
+        this.graph = new mxGraph(this.graphContainer.nativeElement);
+        this.graph.setPanning(true)
+        this.graph.setTooltips(true)
+        this.graph.setHtmlLabels(true)
+        this.graph.cellsDisconnectable = false
+        this.graph.cellsEditable = false
+        this.graph.cellsCloneable = false
+        this.graph.foldingEnabled = false
+        this.graph.edgeLabelsMovable = false
+        this.graph.autoExtend = false
+        this.graph.gridEnabled = false
+        this.graph.model.maintainEdgeParent = false;
+        this.graphScale = 1;
+
+        new mxRubberband(this.graph);
+        new mxKeyHandler(this.graph);
+        //mxLog.show = () => { }
+        mxConstants.VERTEX_SELECTION_STROKEWIDTH = 1
+        mxConstants.EDGE_SELECTION_STROKEWIDTH = 5
+        // mxConstants.EDGE_SELECTION_DASHED = false
+        mxConstants.LOCKED_HANDLE_FILLCOLOR = 'none'
+        mxConstants.HANDLE_STROKECOLOR = 'none'
+        mxConstants.INVALID_COLOR = '#000000'
+        // Keeps the font sizes independent of the scale
+        mxCellRenderer.prototype.getTextScale = function (state) {
+            return 1
+        }
+        mxVertexHandler.prototype.constrainGroupByChildren = true
+        mxGraphHandler.prototype.maxLivePreview = 16
+        mxGraphHandler.prototype.removeCellsFromParent = false
+        mxGraphHandler.prototype.isPropagateSelectionCell =
+            function (cell, immediate, me) {
+                return false
+            }
+        const CELL_ADDED = mxGraphSelectionModel.prototype.cellAdded
+        mxGraphSelectionModel.prototype.cellAdded = function (cell) {
+            CELL_ADDED.call(this, cell)
+            if (cell.isEdge()) this.addCells([cell.source, cell.target])
+        }
+        const CELL_REMOVED = mxGraphSelectionModel.prototype.cellRemoved
+        mxGraphSelectionModel.prototype.cellRemoved = function (cell) {
+            CELL_REMOVED.call(this, cell)
+            if (cell.isVertex()) {
+                this.removeCells(cell.edges)
+            }
+        }
+
+        // Creates a layout algorithm to be used with the graph
+        this.organicLayout = new mxFastOrganicLayout(this.graph);
+        // Moves stuff wider apart than usual 50
+        this.organicLayout.forceConstant = 80;
+        this.stackLayout = new mxStackLayout(this.graph)
+        this.edgeLayout = new mxParallelEdgeLayout(this.graph)
+        this.edgeLayout.spacing = 15
+
+        // Sets default vertex style
+        this.setObjValues(this.graph.stylesheet.getDefaultVertexStyle(), {
+            STYLE_SHAPE: mxConstants.SHAPE_ELLIPSE,
+            STYLE_PERIMETER: mxPerimeter.EllipsePerimeter,
+            STYLE_FILLCOLOR: NODE_COLOR,
+            STYLE_GRADIENTCOLOR: 'white',
+            STYLE_STROKECOLOR: '#1B78C8',
+            STYLE_FONTCOLOR: FONT_COLOR,
+            STYLE_FONTSIZE: '14',
+            STYLE_VERTICAL_LABEL_POSITION: 'bottom',
+            STYLE_VERTICAL_ALIGN: 'top',
+            STYLE_RESIZABLE: '0',
+        }, mxConstants)
+
+        // Sets default edge style
+        this.setObjValues(this.graph.stylesheet.getDefaultEdgeStyle(), {
+            STYLE_FONTCOLOR: 'black',
+            STYLE_FONTSIZE: '14',
+            STYLE_STROKECOLOR: 'black',
+            STYLE_EDGE: mxEdgeStyle.TopToBottom,
+            STYLE_ENDARROW: 'none',
+            STYLE_LABEL_BACKGROUNDCOLOR: 'white',
+            STYLE_TEXT_OPACITY: '70',
+        }, mxConstants)
+
+        // Gets label from custom user object
+        // TODO:
+        this.graph.convertValueToString = function (cell) {
+            if (cell.isEdge() && !cell.value.uni && !this.isMoreLabels) return ''
+            return (cell.value && cell.value.label) ? cell.value.label : '';
+        }
+
+        // Installs a custom tooltip for cells
+        this.graph.getTooltipForCell = function (cell) {
+            let tooltip = ''
+            for (let key of Object.keys(cell.value).sort()) {
+                if (key === 'label' || cell.value[key] === '' || key[0] == '$' ||
+                    !thisNg.isBasicType(cell.value[key])) continue
+                tooltip += '<b>' + key + ': </b>' + cell.value[key] + '\n'
+            }
+            return tooltip
+        }
+
+        // Installs a popupmenu handler.
+        this.graph.popupMenuHandler.factoryMethod = this.createPopupMenu
+        document.body.onmousedown = function () {
+            let popupMenu = document.body.getElementsByClassName('mxPopupMenu')
+            if (popupMenu.length) document.body.removeChild(popupMenu[0])
+        }
+
+        var dragStatus = 0
+        // Listen to the Mouseup event to update table and json data view
+        this.graph.addMouseListener({
+            mouseDown: function (sender, evt) {
+                dragStatus = 1
+            },
+            mouseMove: function (sender, evt) {
+                if (dragStatus == 1) dragStatus = 2
+            },
+            mouseUp: function (sender, evt) {
+                if (dragStatus == 2) {
+                    if (sender.getSelectionCount() >= 1) {
+                        this.clientNodeLabelLayout()
                     }
-                    if (this.connectivityList.length !== 0) {
-                        this.connectivitySelected = this.connectivityList[0];
-                        this.choseConnectivity(this.connectivitySelected);
+                }
+                dragStatus = 0
 
-                    };
+                this.deselectTableRow()
+                let cell = null
+                if (!evt.evt.defaultPrevented) {
+                    if (!evt.state) return
+                    else cell = evt.state.cell
+                } else {
+                    if (sender.getSelectionCount() == 1) {
+                        cell = sender.getSelectionCell()
+                    } else if (sender.getSelectionCount() == 3) {
+                        for (let item of sender.getSelectionCells()) {
+                            if (item.isEdge()) {
+                                if (!cell) cell = item
+                                else {
+                                    cell = null;
+                                    break
+                                }
+                            }
+                        }
+                    }
                 }
-            },
-                 (err) => {
-                     console.log(err);
-                 });
+                if (!cell || !cell.value) {
+                    return
+                }
+                let obj = null
+                if (obj = cell.value.controller) {
+                    this.showJsonData([obj], false)
+                } else if (obj = cell.value.node) {
+                    this.showJsonData(obj.uniSliceMap.get(this.currentSlice), false)
+                } else if (obj = cell.value.enni) {
+                    this.showJsonData([obj.data[0].link.data, obj.data[1].link.data], false)
+                } else if (obj = cell.value.inni) {
+                    this.showJsonData([obj.data[0].data, obj.data[1].data], false)
+                } else if (obj = cell.value.uni) {
+                    this.showJsonData(obj.data, false)
+                } else if (obj = cell.value.tunnel) {
+                    this.selectTableRow(cell.value.index)
+                    this.showJsonData(this.tunnelsMap.get(obj.name), false)
+                } else if (obj = cell.value.service) {
+                    this.selectTableRow(cell.value.index)
+                    this.showJsonData(this.servicesMap.get(obj.name), false)
+                }
+            }
+        })
+
+        this.isSpinning = true;
+        let reqCount = 0;
+
+        reqCount++;
         this.myhttp.getLogicalLinksData()
             .subscribe((data) => {
                     if (data) {
-                        for (let ll of data["logical-link"]){
-                            // Filter layer1 logical link
-                            //if (ll["relationship-list"] !== undefined &&
-                            //    ll["relationship-list"]["relationship"].length) {
+                        for (let ll of data["logical-link"]) {
                             thisNg.logicalLinks.push(ll);
-                            //}
                         }
-                        let tpMapping = thisNg.getPnfTpMapping(thisNg.logicalLinks);
+                    }
+                    if (--reqCount == 0) {
+                        thisNg.finishNetworkView();
+                        this.isSpinning = false;
+                    }
+                },
+                (err) => {
+                    console.log(err);
+            })
 
-                        let links = thisNg.getLinks( thisNg.logicalLinks, tpMapping);
-                        let tps = thisNg.getNodes(tpMapping);
-                        console.log(links);
-                        console.log(tps);
+        reqCount++;
+        this.myhttp.getPnfsData()
+            .subscribe((data) => {
+                    if (data) {
+                        for (let ll of data["pnf"]) {
+                            thisNg.pnfs.push(ll);
+                        }
+                    }
+                    if (--reqCount == 0) {
+                        thisNg.finishNetworkView();
+                        this.isSpinning = false;
+                    }
+                },
+                (err) => {
+                    console.log(err);
+            })
 
-                        thisNg.drawTopo(tps, links);
+        reqCount++;
+        this.myhttp.getConnectivities()
+            .subscribe((data) => {
+                    if (data) {
+                        for (let ll of data["connectivity"]) {
+                            thisNg.connectivities.push(ll);
+                        }
+                    }
+                    if (--reqCount == 0) {
+                        thisNg.finishNetworkView();
+                        this.isSpinning = false;
+                    }
+                },
+                (err) => {
+                    console.log(err);
+            })
 
+        reqCount++;
+        this.myhttp.getNetworkRoutes()
+            .subscribe((data) => {
+                    if (data) {
+                        for (let ll of data["network-route"]) {
+                            thisNg.networkroutes.push(ll);
+                        }
+                    }
+                    if (--reqCount == 0) {
+                        thisNg.finishNetworkView();
+                        this.isSpinning = false;
                     }
-                    this.isSpinning = false;
                 },
                 (err) => {
                     console.log(err);
-                })
+            })
     }
 
     connectivityList = [];
-    connectivitySelected = { name: null, id: null };
+    connectivitySelected = {name: null, id: null};
+    serviceGraphModel: { [k: string]: any } = {};
+
+    layerList = [
+                { value: 3, name: 'Service layer' },
+                { value: 2, name: 'Tunnel layer' },
+                { value: 1, name: 'Link layer' }]
+    layerSelected = { value: 1, name: 'Link layer' }
+    serviceList = [];
+    serviceSelected = '';
+
 
     addLinkDisabled = true;
     nonetwork = false;
@@ -95,10 +371,14 @@ export class CcvpnNetworkComponent implements OnInit {
     isSpinning = true;
 
     pnfs = [];
+    logicalLinks = [];//logicalLinks Existing connection data returned by the interface
+    connectivities = [];
+    networkroutes = [];
+
     layer1Tps = [];
 
     d3Data = [];//D3Render the required data
-    logicalLinks = [];//logicalLinks Existing connection data returned by the interface
+
     linkName = null;//Linked name link-name
     networkOption = [];//Form network drop-down box filled data
     nodeOption1 = {};//Node drop-down box filled data
@@ -139,19 +419,8 @@ export class CcvpnNetworkComponent implements OnInit {
     charge = -300;
     SEPERATOR = '-';
 
-
-    imgMap = {
-        'pnf': 'assets/images/site.png',
-        'tp': 'assets/images/tp.png'
-    };
-
-    //### SELECTION - store the selected node ###
-    //### EDITING - store the drag mode (either 'drag' or 'add_link') ###
-    svcEditorGlobal = {
-        selection: null
-    }
     svcContainerOpt = {
-        containerId : "svcContainer",
+        containerId: "svcContainer",
         width: 1000,
         height: this.winHeight
     };
@@ -163,907 +432,990 @@ export class CcvpnNetworkComponent implements OnInit {
         height: this.winHeight
     };
 
-    /**
-     * Redraw the selected L2 ethernet service.
-     * @param {Array<object>} treeData parsed from AAI connectivity.
-     */
-    drawService(treeData) {
-        //Model of service graph
-        let graph = {
-            nodes: [
-            ],
-            links: [
-            ],
-            objectify: (function() {
-                /* resolve node IDs (not optimized at all!)
-                */
-                var l, n, _i, _len, _ref, _results;
-                _ref = graph.links;
-                _results = [];
-                for (_i = 0, _len = _ref.length; _i < _len; _i++) {
-                    l = _ref[_i];
-                    _results.push((function() {
-                        var _j, _len2, _ref2, _results2;
-                        _ref2 = graph.nodes;
-                        _results2 = [];
-                        for (_j = 0, _len2 = _ref2.length; _j < _len2; _j++) {
-                            n = _ref2[_j];
-                            if (l.source === n.id) {
-                                l.source = n;
-                                continue;
-                            }
-                            if (l.target === n.id) {
-                                l.target = n;
-                                continue;
-                            } else {
-                                _results2.push(void 0);
+    finishNetworkView() {
+        this.updateTopoData();
+        console.log(this.domainMap);
+        this.finishSotnView();
+    }
+
+    updateTopoData(){
+        let thisNg = this;
+        // Update the network topo data
+        // Update node data
+        for (let pnf of thisNg.pnfs){
+            let pnfId = pnf["pnf-id"];
+            let arr = pnfId.split('.');
+            let domainId = arr[1];
+            let domain = thisNg.domainMap.get(domainId);
+            if (!domain){
+              let sotnDomain = {
+                  domainId : domainId,
+                  nodeMap: new Map<any, any>(),
+                  localLinkMap: new Map<any, any>(),
+                  inniMap: new Map<any, any>(),
+                  uniMap: new Map<any, any>(),
+                  clientNodeMap: new Map<any, any>()
+              }
+              thisNg.domainMap.set(domainId, sotnDomain);
+              domain = sotnDomain;
+            }
+            let node = {
+                id: pnfId,
+                name: pnfId
+            }
+            domain.nodeMap.set(pnfId, node);
+        }
+
+        // Update serive data
+        for (let cn of this.connectivities){
+            if (cn['vpn-type'] === "mdsc"){
+                let svcInstId = this.getValueFromRelationList(cn, "service-instance", "service-instance.service-instance-id");
+                let bw = cn["bandwidth-profile-name"];
+                let cvlan = cn["cvlan"];
+                let svc = this.servicesMap.get(svcInstId);
+                if (!svc){
+                     svc = {
+                         name: svcInstId,
+                         id: svcInstId,
+                         connections: [],
+                         bw : bw,
+                         vlan : cvlan
+                     }
+                     this.servicesMap.set(svcInstId, svc);
+                }
+                if (!this.serviceSelected){
+                    this.serviceSelected = svcInstId;
+                }
+            }
+        }
+        // Update link data
+        for (let ll of thisNg.logicalLinks) {
+            let linkName = ll["link-name"];
+            let linkType = ll["link-type"];
+            let linkRole = ll["link-role"];
+            let linkId = ll["link-id"];
+
+            if (linkName.search("topologyId-2") >= 0) {
+            // uni links
+                let arr = linkId.split('-');
+                let arr1 = arr[0].split('.');
+                let domainId = arr1[1];
+                let domain = thisNg.domainMap.get(domainId);
+                let remoteNode = domain.nodeMap.get(arr[0]);
+                if (!remoteNode) continue;
+                let cpeNode = {
+                    networkNode: remoteNode,
+                    isCloud: arr[1].length <= 3 ? true: false
+                }
+
+                if (!domain) continue;
+                domain.clientNodeMap.set(linkId, cpeNode);
+                let uni = {
+                    srcNodeId: arr[0],
+                    srcUniTp: arr[1],
+                    dstNode: cpeNode
+                }
+                domain.uniMap.set(linkId, uni)
+            } else if (linkRole && linkRole.search("cross-domain") >= 0){
+            // enni link
+                let localLink: Array<any> = new Array();
+                let domainLocal:any = null;
+                let linkId = this.getJsonValue(ll, 'link-id');
+                let rlArr: Array<any> = this.getJsonValue(ll, 'relationship-list.relationship');
+                for (let rl of rlArr){
+
+                    if (rl['related-to'] === "p-interface"){
+                        let pnfNameS: String;
+                        let tpNameS: String;
+                        for (let rld of rl['relationship-data']){
+                            if (rld['relationship-key'] === 'p-interface.interface-name'){
+                                 let tpNameL = rld['relationship-value'];
+                                 let tpNameArr = tpNameL.split('-')
+                                 tpNameS = tpNameArr[tpNameArr.length - 1];
+                                 pnfNameS = tpNameArr[tpNameArr.length - 3];
+                                 if (!domainLocal){
+                                     let arr = pnfNameS.split('.');
+                                     let domainId = arr[1];
+                                     domainLocal = thisNg.domainMap.get(domainId);
+                                 }
                             }
                         }
-                        return _results2;
-                    })());
+                        let end = {
+                             pnfId : pnfNameS,
+                             tpId: tpNameS
+                        }
+                        localLink.push(end);
+                    }
                 }
-                return _results;
-            }),
-            remove: (function(condemned) {
-                /* remove the given node or link from the graph, also deleting dangling links if a node is removed
-                */      if (Array.prototype.indexOf.call(this.nodes, condemned) >= 0) {
-                    this.nodes = this.nodes.filter(function(n) {
-                        return n !== condemned;
-                    });
-                    return this.links = this.links.filter(function(l) {
-                        return l.source.id !== condemned.id && l.target.id !== condemned.id;
-                    });
-                } else if (Array.prototype.indexOf.call(this.links, condemned) >= 0) {
-                    return this.links = this.links.filter(function(l) {
-                        return l !== condemned;
-                    });
+                this.enniMap.set(linkId, {data: localLink});
+            } else if (linkType.search("Tsci") >= 0) {
+            // tunnel connection link
+                let srcEpId = this.getJsonValue(ll, "link-name");
+                let dstEpId = this.getJsonValue(ll, "link-name2");
+                let svcInstId = this.getValueFromRelationList(ll, "allotted-resource", "service-instance.service-instance-id");
+                let conn = {
+                    srcEpId: srcEpId,
+                    dstEpId: dstEpId,
+                    dstEpLtpId: '',
+                    srcEpLtpId: ''
                 }
-            }),
-            last_index: 0,
-            add_node: (function(type) {
-                var n;
-                n = {
-                    id: this.last_index++,
-                    x: 960 / 2,
-                    y: 500 / 2,
-                    type: type
-                };
-                this.nodes.push(n);
-                return n;
-            }),
-            add_link: (function(source, target) {
-                /* avoid links to self
-                */
-                var l, link, _i, _len, _ref;
-                if (source === target) return null;
-                /* avoid link duplicates
-                */
-                _ref = this.links;
-                for (_i = 0, _len = _ref.length; _i < _len; _i++) {
-                    link = _ref[_i];
-                    if (link.source === source && link.target === target) return null;
+                for (let nr of this.networkroutes){
+                    if (nr['route-id'] === srcEpId){
+                        conn.srcEpLtpId = nr['next-hop'];
+                    }
+                    if (nr['route-id'] === dstEpId){
+                        conn.dstEpLtpId = nr['next-hop'];
+                    }
                 }
-                l = {
-                    source: source,
-                    target: target
-                };
-                this.links.push(l);
-                return l;
-            })
-        };
-
-        var nodeList = treeData.map(obj => {
-            let rObj = {};
-            rObj["id"] = obj["id"];
-            rObj["x"] = 500;
-            rObj["y"] = 500;
-            rObj["type"] = obj["type"];
-            return rObj;
-            })
-
-         var linkList = [] ;
-         for (var i = 0, e = treeData.length; i < e; i++){
-             for (var j = i+1, k = e; j < k; j++){
-                linkList.push({
-                                 source: treeData[i].id,
-                                 target: treeData[j].id
-                             });
+                let svc = this.servicesMap.get(svcInstId);
+                if (svc){
+                    svc.connections.push(conn);
                 }
-         }
-        graph.nodes = nodeList;
-        graph.links = linkList;
-        graph.objectify();
-        var _this = this;
-        var margin = {top: 20, right: 120, bottom: 20, left: 120},
-            width = 1000 - margin.right - margin.left,
-            height = 350 - margin.top - margin.bottom;
-        //clean existing element
-        d3.select("div#" + this.svcContainerOpt.containerId).selectAll("*").remove();
-
-        let svg = d3.select("div#" + this.svcContainerOpt.containerId).append("svg")
-            .attr("width", width + margin.right + margin.left)
-            .attr("height", height + margin.top + margin.bottom);
-        let container = svg.append("g").style("fill", "transparent");
-
-        let vis = container.append('g');
-        container.call(d3.behavior.zoom().scaleExtent([0.5, 8])
-            .on('zoom', function(){
-                vis.attr('transform', "translate(" + d3.event.translate  + ")scale(" + d3.event.scale + ")");
-            }));
-
-        vis.append('rect')
-            .attr('class', 'overlay')
-            .attr('x', -500000)
-            .attr('y', -500000)
-            .attr('width', 1000000)
-            .attr('height', 1000000)
-            .on('click', function(d) {
-                _this.svcEditorGlobal.selection = null;
-                d3.selectAll('.node').classed('selected', false);
-                return d3.selectAll('.link').classed('selected', false);
-            });
-        let colorify = d3.scale.category10();
-        /* initialize the force layout
-        */
-        let force = d3.layout.force().size([width, height]).charge(-400).linkDistance(160)
-            .on('tick', (function(e) {
-            /* update nodes and links
-            */
-                let k = 16 * e.alpha;
-                graph.nodes.forEach(function(o, i) {
-                    if (o["type"] === "root"){
-                        o["x"] +=  k
-            //o["x"] += i & 2 ? k : -k;
-
-                    } else if (o["type"] === "leaf") {
-                        o["x"] +=  -k;
-            //o["x"] += i & 2 ? k : -k;
+            } else {
+            // local link
+                let localLink: Array<any> = new Array();
+                let domainLocal:any = null;
+                let linkId = this.getJsonValue(ll, 'link-id');
+                let rlArr: Array<any> = this.getJsonValue(ll, 'relationship-list.relationship');
+                for (let rl of rlArr){
+
+                    if (rl['related-to'] === "p-interface"){
+                        let pnfNameS: String;
+                        let tpNameS: String;
+                        for (let rld of rl['relationship-data']){
+                           if (rld['relationship-key'] === 'p-interface.interface-name'){
+                               let tpNameL = rld['relationship-value'];
+                               let tpNameArr = tpNameL.split('-')
+                               tpNameS = tpNameArr[tpNameArr.length - 1];
+                               pnfNameS = tpNameArr[tpNameArr.length - 3];
+                               if (!domainLocal){
+                                    let arr = pnfNameS.split('.');
+                                    let domainId = arr[1];
+                                    domainLocal = thisNg.domainMap.get(domainId);
+                               }
+                           }
+                        }
+                        let end = {
+                             pnfId : pnfNameS,
+                             tpId: tpNameS
+                        }
+                        localLink.push(end);
                     }
-                });
-                vis.selectAll('.node').attr('transform', function(d) {
-                        return "translate(" + d.x + "," + d.y + ")";
-                    });
-
-
-                //#svcContainer > svg > g > g > g:nth-child(3) > text
-                //_this.svcEditorGlobal.selection
-                return vis.selectAll('.link').attr('x1', function(d) {
-                    return d.source.x;
-                }).attr('y1', function(d) {
-                        return d.source.y;
-                }).attr('x2', function(d) {
-                        return d.target.x;
-                }).attr('y2', function(d) {
-                        return d.target.y;
-                });
-            }));
-        let nodeDragging = force.drag().on('dragstart', function (d){
-            d3.event.sourceEvent.stopPropagation();
-            d.fixed = true;
-        })
-
-        let topoNodeSync = _this.eventDispatcher.on(AppEventType.UserNodeDrag)
-            .subscribe(event => {
-                //console.log(event);
-                let pnfId: string  = event.payload.id;
-                let pnfId_short: string = pnfId.substr(pnfId.lastIndexOf('-')+1);
-                vis.selectAll('.node > circle').attr('stroke-width', function(d) {
-                    if (d.id.startsWith(pnfId_short)){
-                        return "4px";
+                }
+                localLink.sort(function(a, b){
+                return (a.pnfId + '-' + a.tpId).localeCompare(b.pnfId + '-' + b.tpId)});
+                if (!domainLocal) continue;
+                let srcNodeId = localLink[0].pnfId;
+                let srcTpId = localLink[0].tpId;
+                let srcNode = domainLocal.nodeMap.get(srcNodeId);
+                let dstNodeId = localLink[1].pnfId;
+                let dstTpId = localLink[1].tpId;
+                let dstNode = domainLocal.nodeMap.get(dstNodeId);
+                let inni = domainLocal.inniMap.get(srcNodeId + '-' + srcTpId);
+                if (!inni){
+                    let inni = {
+                        data: [linkId, null],
+                        srcNode: srcNode,
+                        srcTpId: srcTpId,
+                        dstNode: dstNode,
+                        dstTpId: dstTpId
                     }
-                    return "1px";
-                });
-            });
-
-        // DELETION - pressing DEL deletes the selection
-        // CREATION - pressing N creates a new node
-        // d3.select(window).on('keydown', function() {
-        //     if (d3.event.keyCode === 46) {
-        //         if (global.selection != null) {
-        //             graph.remove(global.selection);
-        //             global.selection = null;
-        //             return update();
-        //         }
-        //     } else if (d3.event.keyCode === 78) {
-        //         graph.add_node();
-        //         return update();
-        //     }
-        // });
-
-        //Parameter for Editing tools
-        let toolbar = $("<div class='toolbar'></div>");
-        $("div#" + this.svcContainerOpt.containerId).append(toolbar);
-        toolbar.append($("<svg\n" +
-            "    class='active tool'\n    " +
-            "data-tool='pointer'\n" +
-            "    xmlns='http://www.w3.org/2000/svg'\n" +
-            "    version='1.1'\n" +
-            "    width='32'\n" +
-            "    height='32'\n" +
-            "    fill='#b52d0c'" +
-            "    viewBox='0 0 128 128'>\n" +
-            "    <g transform='translate(881.10358,-356.22543)'>\n" +
-            "      <g transform='matrix(0.8660254,-0.5,0.5,0.8660254,-266.51112,-215.31898)'>\n" +
-            "        <path\n" +
-            "           d='m -797.14902,212.29589 a 5.6610848,8.6573169 0 0 0 -4.61823,4.3125 l -28.3428,75.0625 a 5.6610848,8.6573169 0 0 0 4.90431,13 l 56.68561,0 a 5.6610848,8.6573169 0 0 0 4.9043,-13 l -28.3428,-75.0625 a 5.6610848,8.6573169 0 0 0 -5.19039,-4.3125 z m 0.28608,25.96875 18.53419,49.09375 -37.06838,0 18.53419,-49.09375 z'\n        />\n" +
-            "        <path\n" +
-            "           d='m -801.84375,290.40625 c -2.09434,2.1e-4 -3.99979,1.90566 -4,4 l 0,35.25 c 2.1e-4,2.09434 1.90566,3.99979 4,4 l 10,0 c 2.09434,-2.1e-4 3.99979,-1.90566 4,-4 l 0,-35.25 c -2.1e-4,-2.09434 -1.90566,-3.99979 -4,-4 z'\n        />\n" +
-            "      </g>\n" +
-            "    </g>\n" +
-            "</svg>"));
-        toolbar.append($("<svg\n" +
-            "    class='tool'\n" +
-            "    data-tool='add_node'\n" +
-            "    xmlns='http://www.w3.org/2000/svg'\n" +
-            "    version='1.1'\n" +
-            "    width='32'\n" +
-            "    height='32'\n" +
-            "    viewBox='0 0 128 128'>\n" +
-            "    <g transform='translate(720.71649,-356.22543)'>\n" +
-            "      <g transform='translate(-3.8571429,146.42857)'>\n" +
-            "        <path\n           d='m -658.27638,248.37149 c -1.95543,0.19978 -3.60373,2.03442 -3.59375,4 l 0,12.40625 -12.40625,0 c -2.09434,2.1e-4 -3.99979,1.90566 -4,4 l 0,10 c -0.007,0.1353 -0.007,0.27095 0,0.40625 0.19978,1.95543 2.03442,3.60373 4,3.59375 l 12.40625,0 0,12.4375 c 2.1e-4,2.09434 1.90566,3.99979 4,4 l 10,0 c 2.09434,-2.1e-4 3.99979,-1.90566 4,-4 l 0,-12.4375 12.4375,0 c 2.09434,-2.1e-4 3.99979,-1.90566 4,-4 l 0,-10 c -2.1e-4,-2.09434 -1.90566,-3.99979 -4,-4 l -12.4375,0 0,-12.40625 c -2.1e-4,-2.09434 -1.90566,-3.99979 -4,-4 l -10,0 c -0.1353,-0.007 -0.27095,-0.007 -0.40625,0 z'\n" +
-            "        />\n" +
-            "        <path\n" +
-            "           d='m -652.84375,213.9375 c -32.97528,0 -59.875,26.86847 -59.875,59.84375 0,32.97528 26.89972,59.875 59.875,59.875 32.97528,0 59.84375,-26.89972 59.84375,-59.875 0,-32.97528 -26.86847,-59.84375 -59.84375,-59.84375 z m 0,14 c 25.40911,0 45.84375,20.43464 45.84375,45.84375 0,25.40911 -20.43464,45.875 -45.84375,45.875 -25.40911,0 -45.875,-20.46589 -45.875,-45.875 0,-25.40911 20.46589,-45.84375 45.875,-45.84375 z'\n" +
-            "        />\n" +
-            "      </g>\n" +
-            "    </g>\n" +
-            "</svg>"));
-        toolbar.append($("<svg\n" +
-            "    class='tool'\n" +
-            "    data-tool='add_link'\n" +
-            "    xmlns='http://www.w3.org/2000/svg'\n" +
-            "    version='1.1'\n" +
-            "    width='32'\n" +
-            "    height='32'\n" +
-            "    viewBox='0 0 128 128'>\n" +
-            "<g transform='translate(557.53125,-356.22543)'>\n" +
-            "    <g transform='translate(20,0)'>\n" +
-            "      <path\n" +
-            "         d='m -480.84375,360 c -15.02602,0 -27.375,12.31773 -27.375,27.34375 0,4.24084 1.00221,8.28018 2.75,11.875 l -28.875,28.875 c -3.59505,-1.74807 -7.6338,-2.75 -11.875,-2.75 -15.02602,0 -27.34375,12.34898 -27.34375,27.375 0,15.02602 12.31773,27.34375 27.34375,27.34375 15.02602,0 27.375,-12.31773 27.375,-27.34375 0,-4.26067 -0.98685,-8.29868 -2.75,-11.90625 L -492.75,411.96875 c 3.60156,1.75589 7.65494,2.75 11.90625,2.75 15.02602,0 27.34375,-12.34898 27.34375,-27.375 C -453.5,372.31773 -465.81773,360 -480.84375,360 z m 0,14 c 7.45986,0 13.34375,5.88389 13.34375,13.34375 0,7.45986 -5.88389,13.375 -13.34375,13.375 -7.45986,0 -13.375,-5.91514 -13.375,-13.375 0,-7.45986 5.91514,-13.34375 13.375,-13.34375 z m -65.375,65.34375 c 7.45986,0 13.34375,5.91514 13.34375,13.375 0,7.45986 -5.88389,13.34375 -13.34375,13.34375 -7.45986,0 -13.34375,-5.88389 -13.34375,-13.34375 0,-7.45986 5.88389,-13.375 13.34375,-13.375 z'\n" +
-            "      />\n      <path\n" +
-            "         d='m -484.34375,429.25 c -1.95543,0.19978 -3.60373,2.03442 -3.59375,4 l 0,12.40625 -12.40625,0 c -2.09434,2.1e-4 -3.99979,1.90566 -4,4 l 0,10 c -0.007,0.1353 -0.007,0.27095 0,0.40625 0.19978,1.95543 2.03442,3.60373 4,3.59375 l 12.40625,0 0,12.4375 c 2.1e-4,2.09434 1.90566,3.99979 4,4 l 10,0 c 2.09434,-2.1e-4 3.99979,-1.90566 4,-4 l 0,-12.4375 12.4375,0 c 2.09434,-2.1e-4 3.99979,-1.90566 4,-4 l 0,-10 c -2.1e-4,-2.09434 -1.90566,-3.99979 -4,-4 l -12.4375,0 0,-12.40625 c -2.1e-4,-2.09434 -1.90566,-3.99979 -4,-4 l -10,0 c -0.1353,-0.007 -0.27095,-0.007 -0.40625,0 z'\n" +
-            "      />\n" +
-            "    </g>\n" +
-            "  </g>\n" +
-            "</svg>"));
-        let library = $("<div class='library'></div></div>");
-        toolbar.append(library);
-
-        ['PON', 'ETH'].forEach(function(type) {
-            var new_btn;
-            new_btn = $("<svg width='42' height='42'>\n" +
-                "    <g class='node'>\n" +
-                "        <circle\n" +
-                "            cx='21'\n" +
-                "            cy='21'\n" +
-                "            r='18'\n" +
-                "            stroke='" + (colorify(type)) + "'\n" +
-                "            fill='" + (d3.hcl(colorify(type)).brighter(3)) + "'\n" +
-                "        >\n" +
-                "        <title>" + (type) + " UNI</title>   \n" +
-                "       </circle>" +
-                "    </g>\n" +
-                "</svg>");
-            new_btn.bind('click', function() {
-                graph.add_node(type);
-                return update();
-            });
-            library.append(new_btn);
-            return library.hide();
-        });
-
-        let tool = 'pointer';
-        let new_link_source = null;
-        let drag_link;
-        vis.on('mousemove.add_link', (function(d) {
-            /* check if there is a new link in creation
-            */
-            var p;
-            if (new_link_source != null) {
-                /* update the draggable link representation
-                */
-                p = d3.mouse(vis.node());
-                return drag_link.attr('x1', new_link_source.x).attr('y1', new_link_source.y).attr('x2', p[0]).attr('y2', p[1]);
+                    domainLocal.inniMap.set(srcNodeId + '-' + srcTpId, inni);
+                } else {
+                    inni.data[1] = linkId;
+                }
             }
-        })).on('mouseup.add_link', (function(d) {
-            new_link_source = null;
-            /* remove the draggable link representation, if exists
-            */
-            if (drag_link != null) return drag_link.remove();
-        }));
-        d3.selectAll('.tool').on('click', function() {
-            var new_tool, nodes;
-            d3.selectAll('.tool').classed('active', false).style("fill", "#a3a4c3");
-            d3.select(this).classed('active', true).style("fill", "#b52d0c");
-            new_tool = $(this).data('tool');
-            nodes = vis.selectAll('.node');
-
-            //mode change to add_link
-            if (new_tool === 'add_link' && tool !== 'add_link') {
-                /* remove drag handlers from nodes
-                */
-                nodes.on('mousedown.drag', null).on('touchstart.drag', null);
-                /* add drag handlers for the add_link tool
-                */
-                nodes.call(drag_add_link);
-            } else if (new_tool !== 'add_link' && tool === 'add_link') {
-                /* remove drag handlers for the add_link tool
-                */
-                nodes.on('mousedown.add_link', null).on('mouseup.add_link', null);
-                /* add drag behavior to nodes
-                */
-                nodes.call(nodeDragging);
+        }
+    }
+
+    // main function that draws the topology view
+    finishSotnView() {
+        this.graph.model.clear()
+        this.graph.model.beginUpdate()
+        this.gLayers = [this.graph.getDefaultParent()]
+        for (let i = 0; i < 3; i++) {
+            this.gLayers.push(this.graph.model.root.insert(new mxCell()))
+        }
+
+        // Insert domains
+        for (let [networkId, domain] of this.domainMap) {
+            domain.vertex = this.graph.insertVertex(this.gLayers[0], null, null, 0, 0, 0, 0, this.DOMAIN_STYLE)
+            domain.vertex.connectable = false
+            domain.vertex.value = {
+                label: '(DOMAIN: ' + domain.domainId + ')',
+                networkId: networkId
             }
-            if (new_tool === 'add_node') {
-                library.show();
-            } else {
-                library.hide();
+            // Insert nodes
+            for (let [nodeId, node] of domain.nodeMap) {
+                node.vertex = this.graph.insertVertex(domain.vertex, null, null, 0, 0, 26, 26)
+                node.vertex.value = {
+                    nodeId: nodeId, name: node.name, label: node.name, node: node
+                }
             }
-            return tool = new_tool;
-        });
-        update();
-        function update() {
-            /* update the layout
-      */
-            var links, new_nodes, nodes;
-            force.nodes(graph.nodes).links(graph.links).start();
-            /* create nodes and links
-            */
-            /* (links are drawn with insert to make them appear under the nodes)
-            */
-            /* also define a drag behavior to drag nodes
-            */
-            /* dragged nodes become fixed
-            */
-            nodes = vis.selectAll('.node').data(graph.nodes, function(d) {
-                return d.id;
-            });
-            new_nodes = nodes.enter().append('g').attr('class', 'node');
-/*            .on('click', (function(d) {
-                /!* SELECTION
-                *!/
-                _this.svcEditorGlobal.selection = d;
-                d3.selectAll('.node').classed('selected', function(d2) {
-                    return d2 === d;
-                });
-                return d3.selectAll('.link').classed('selected', false);
-            }));*/
-            links = vis.selectAll('.link').data(graph.links, function(d) {
-                return "" + d.source.id + "->" + d.target.id;
-            });
-
-            links.enter().insert('line', '.node').attr('class', 'link').on('click', (function(d) {
-                /* SELECTION
-                */
-                _this.svcEditorGlobal.selection = d;
-                d3.selectAll('.link').classed('selected', function(d2) {
-                    return d2 === d;
-                });
-                return d3.selectAll('.node').classed('selected', false);
-            }));
-            links
-                .style("stroke-width", "6px")
-                .style("stroke", "gray")
-                .style("opacity", "0.5");
-
-            links.exit().remove();
-            /* TOOLBAR - add link tool initialization for new nodes
-            */
-            if (tool === 'add_link') {
-                new_nodes.call(drag_add_link);
-            } else {
-                new_nodes.call(nodeDragging);
+            // Insert INNI links
+            for (let [key, inni] of domain.inniMap) {
+                inni.edge = this.graph.insertEdge(this.gLayers[1], null, null,
+                    inni.srcNode.vertex, inni.dstNode.vertex, this.LINK_STYLE)
+                inni.edge.value = {
+                    linkId: key,
+                    inni: inni,
+                    domain: domain
+                }
+                //inni.srcNniTp.edge = inni.edge
+                //inni.dstNniTp.edge = inni.edge
             }
-            new_nodes.append('circle').attr('r', 18).attr('stroke', function(d) {
-                return colorify(d.type);
-            }).attr('fill', function(d) {
-                return d3.hcl(colorify(d.type)).brighter(3);
-            });
-            /* draw the label
-            */
-            new_nodes.append('text').text(function(d) {
-                return d.id;
-            }).attr('dy', '0.35em').attr('fill', function(d) {
-                return colorify(d.type);
-            });
-            return nodes.exit().remove();
-        };
-        function drag_add_link (selection) {
-            return selection.on('mousedown.add_link', (function(d) {
-                var p;
-                new_link_source = d;
-                /* create the draggable link representation
-                */
-                p = d3.mouse(vis.node());
-                drag_link = vis.insert('line', '.node').attr('class', 'drag_link').attr('x1', d.x).attr('y1', d.y).attr('x2', p[0]).attr('y2', p[1]);
-                drag_link
-                    .style("stroke-width", "6px")
-                    .style("stroke", "gray")
-                    .style("opacity", "0.5");
-                /* prevent pan activation
-                */
-                d3.event.stopPropagation();
-                /* prevent text selection
-                */
-                return d3.event.preventDefault();
-            })).on('mouseup.add_link', (function(d) {
-                /* add link and update, but only if a link is actually added
-                */      if (graph.add_link(new_link_source, d) != null) return update();
-            }));
-        };
 
+            // Insert client nodes
+            for (let [nodeName, clientNode] of domain.clientNodeMap) {
+                if (clientNode.isCloud) {
+                    clientNode.vertex = this.graph.insertVertex(domain.vertex, null, null, 0, 0, 52, 26, this.CLOUD_STYLE)
+                } else {
+                    clientNode.vertex = this.graph.insertVertex(domain.vertex, null, null, 0, 0, 26, 13, this.CPE_STYLE)
+                }
+                let labelName = nodeName.split('-')[1];
+                clientNode.vertex.value = {
+                    name: nodeName, label: labelName, clientNode: clientNode
+                }
+            }
+            // Insert UNI links
+            for (let [key, uni] of domain.uniMap) {
+                let srcNode = domain.nodeMap.get(uni.srcNodeId);
+                uni.edge = this.graph.insertEdge(domain.vertex, null, null,
+                    srcNode.vertex, uni.dstNode.vertex, this.UNI_LINK_STYLE)
+                uni.edge.value = {
+                    linkId: key, uni: uni, domain: domain,
+                    maximum: 1000000 / 1000000 + 'G',
+                    unused: 1000000 / 1000000 + 'G'
+                }
+                //uni.srcUniTp.edge = uni.edge
+            }
+            // Insert ENNI links
+            for (let [key, enni] of this.enniMap) {
+                let srcNode = null;
+                let dstNode = null;
+
+                for (let [, tmpDomain] of this.domainMap){
+                    srcNode = tmpDomain.nodeMap.get(enni.data[0].pnfId);
+                    if (srcNode) break;
+                }
+                for (let [, tmpDomain] of this.domainMap){
+                    dstNode = tmpDomain.nodeMap.get(enni.data[1].pnfId);
+                    if (dstNode) break;
+                }
+
+                enni.edge = this.graph.insertEdge(this.gLayers[1], null, {
+                plugId: key, enni: enni }, srcNode.vertex, dstNode.vertex, this.LINK_STYLE)
+            //enni.data[0].nniTp.edge = enni.edge
+            //enni.data[1].nniTp.edge = enni.edge
+            }
+        }
+
+            // Insert tunnel edges
+        for (let [id, svc] of this.servicesMap){
+            let localTunnelMap = new Map();
+            for (let conn of svc.connections){
+                let srcArr = conn.srcEpLtpId.split('-');
+                let srcNodeId = srcArr[srcArr.length-3];
+                let dstArr = conn.dstEpLtpId.split('-');
+                let dstNodeId = dstArr[dstArr.length-3];
+                if (!localTunnelMap.get(srcNodeId + '-' + dstNodeId)) {
+                    let srcNode = getNode(srcNodeId, this.domainMap);
+                    let dstNode = getNode(dstNodeId, this.domainMap);
+                    if(!srcNode.vertex || !dstNode.vertex) {
+                        continue;
+                    };
+                    let e2eTunnel = {
+                        name: id + '/' + srcNodeId + '-' + dstNodeId,
+                        srcNode: srcNode,
+                        dstNode: dstNode,
+                        e2eEdge: null,
+                        serviceId: id,
+                        srcVertex: srcNode.vertex,
+                        dstVertex: dstNode.vertex
+                    }
+                    e2eTunnel.e2eEdge =
+                    this.graph.insertEdge(this.gLayers[2], null, {
+                    tunnel: e2eTunnel, tunnelName: e2eTunnel.name
+                    }, e2eTunnel.srcNode.vertex, e2eTunnel.dstNode.vertex, this.TUNNEL_STYLE)
+                    localTunnelMap.set(srcNodeId + '-' + dstNodeId, e2eTunnel)
+                    this.e2eTunnels.push(e2eTunnel);
+                }
+            }
+        }
+
+
+
+        this.graph.model.endUpdate();
+        this.graph.zoomTo(this.graphScale);
+        this.autoLayout(1);
+        this.changeLayer({ value:1, name: 'Link Layer'});
+
+        if (this.serviceSelected){
+            this.chooseService(this.serviceSelected);
+        }
+        function getNode(nodeId, domainMap){
+            let arr = nodeId.split('.');
+            return domainMap.get(arr[1]).nodeMap.get(nodeId);
+        }
 
     }
 
-    /**
-     * Redraw the underlay network topology.
-     * @param {Array<object>} nodes parsed from AAI logicalLinks.
-     * @param {Array<object>} lines parsed from AAI logicalLinks.
-     */
-    drawTopo(nodes: Array<object>, lines: Array<object>){
-        let margin = {top: 20, right: 120, bottom: 20, left: 120},
-            width = 1000 - margin.right - margin.left,
-            height = 350 - margin.top - margin.bottom;
+    changeLayer(layer){
+       this.layerSelected = layer;
+       for (let i = 1; i < this.gLayers.length; i++) {
+           this.gLayers[i].setVisible(i == this.layerSelected.value)
+       }
+       this.graph.refresh()
+    }
 
-        let thisNg = this;
+    chooseService(svcInstId) {
+        this.serviceSelected = svcInstId;
+        //clear the label and color of all UNI links
+        for (let [, domain] of this.domainMap) {
+            for (let [, uni] of domain.uniMap) {
+                this.graph.setCellStyles(mxConstants.STYLE_STROKECOLOR, CE_COLOR, [uni.edge])
+                this.graph.setCellStyles(mxConstants.STYLE_FILLCOLOR, CE_COLOR, [uni.dstNode.vertex])
+                this.graph.setCellStyles(mxConstants.STYLE_DASHED, '1', [uni.edge])
+                uni.edge.value.label = ''
+                uni.edge.value.endPoint = null
+            }
+        }
 
-        let nodeById = d3.map();
-
-        nodes.forEach(function(node) {
-            nodeById.set(node["id"], node);
-        });
-
-        lines.forEach(function(link) {
-            link["source"] = nodeById.get(link["source"]);
-            link["target"] = nodeById.get(link["target"]);
-        });
-
-        let svg = d3.select("div#tpContainer").append("svg")
-            .attr("width", width + margin.right + margin.left)
-            .attr("height", height + margin.top + margin.bottom)
-            .style("pointer-events", "all");
-
-        let graph = svg.append("g").attr("class", "graph");
-
-        let force = d3.layout.force()
-            .nodes(nodes)
-            .links(lines)
-            .size([width, height])
-            /*            .linkStrength(function(d){
-                            switch(d.type){
-                                case 1:
-                                    return 0.15;
-                                case 2:
-                                default:
-                                    return 0.1;
-                            }
-                        })*/
-            //.gravity(0)
-            //.gravity(0)
-            .linkDistance(function (d) {
-                        return 150;
-            })
-            .charge(function(d) {
-                return -600;
-            })
-            .start();
-
-        let drag = force.drag()
-            .on("dragstart", dragstart)
-            .on("dragend", dragend);
-
-        let _g_lines = graph.selectAll("line.line")
-                .data(lines)
-                .enter()
-                .append("g")
-                .attr("class", "line");
-
-        let  _g_nodes = graph.selectAll("g.node")
-                .data(nodes)
-                .enter()
-                .append("g")
-                .attr("class", "node")
-                .call(drag);
-        _g_lines.append("line")
-            .style('stroke', function (d) {
-                if(d.type === 2){
-                    return "#000000";
-                } else {
-                    return '#93c62d';
-                }
+        // Update the label and color of UNI links of current service
+        let service = this.servicesMap.get(this.serviceSelected);
+        if (service){
+           let bw = service.bw;
+           for (let conn of service.connections){
+               let srcUniLinkId = getShortName(conn.srcEpLtpId);
+               let dstUniLinkId = getShortName(conn.dstEpLtpId);
+               // left side uni link
+               let arr = srcUniLinkId.split('.');
+               let uni = this.domainMap.get(arr[1]).uniMap.get(srcUniLinkId);
+               colorUni(uni, this.graph, bw);
+               // right side uni
+               arr = dstUniLinkId.split('.');
+               uni = this.domainMap.get(arr[1]).uniMap.get(dstUniLinkId);
+               colorUni(uni, this.graph, bw);
+
+           }
+        }
 
-            })
-            .style("stroke-width", 4);
+        // Update tunnel edges
+        for (let e2eTunnel of this.e2eTunnels) {
+            e2eTunnel.e2eEdge.setVisible(e2eTunnel.serviceId === svcInstId)
+        }
+        this.graph.refresh();
+
+        // Utility func
+        function getShortName(ltpId){
+            let arr = ltpId.split('-');
+            let nodeId = arr[arr.length-3];
+            let ltp = arr[arr.length-1];
+            return nodeId + '-' + ltp;
+        }
+        function colorUni(uni, graph, bw){
+            let bandwidth = parseInt(bw);
+            let newColor = EP_COLOR_MAP.get("update")
+            graph.setCellStyles(mxConstants.STYLE_STROKECOLOR, newColor, [uni.edge])
+            graph.setCellStyles(mxConstants.STYLE_FONTCOLOR, newColor, [uni.edge])
+            graph.setCellStyles(mxConstants.STYLE_DASHED, '0', [uni.edge])
+            graph.setCellStyles(mxConstants.STYLE_FILLCOLOR, newColor, [uni.dstNode.vertex])
+            if (!uni.edge.value.endpoints) {
+                uni.edge.value.endpoints = [];
+            }
+            uni.edge.value.endpoints.push(bandwidth);
+            let sum = uni.edge.value.endpoints.reduce((a, b) => a + b, 0);
+            uni.edge.value.label = sum +  'G' ;
+        }
 
+    }
 
-        _g_nodes.append("image")
-            .attr("width", function (d) {
-                switch (d.group) {
-                    case 'pnf':
-                        return 70;
-                    case 'tp':
-                    default:
-                        return 10;
+    getValueFromRelationList(rl, relatedTo, relatedKey){
+        let rlArr: Array<any> = this.getJsonValue(rl, 'relationship-list.relationship');
+        for (let rl of rlArr){
+            if (rl['related-to'] === relatedTo){
+                let pnfNameS: String;
+                let tpNameS: String;
+                for (let rld of rl['relationship-data']){
+                   if (rld['relationship-key'] === relatedKey){
+                       let val = rld['relationship-value'];
+                       if (val) return val;
+                   }
                 }
-            })
-            .attr("height", function (d) {
-                switch (d.group) {
-                    case 'pnf':
-                        return 70;
-                    case 'tp':
-                    default:
-                        return 10;
-                }
-            })
-            .attr("xlink:href", function (d) {
-                return thisNg.imgMap[d.group];
-            });
+            }
+        }
+        return null;
+    }
+    // get the key of an Endpoint
+    getEndPointKey(endPoint) {
+        return endPoint.networkId + '-' + endPoint.nodeId + '-' + endPoint.portId
+    }
 
-        _g_nodes.append("text")
-            .text(function (d) {
-                return d.id.substr( d.id.lastIndexOf('-')+1);
-            })
-            .style('font-size', '12')
-            .style('fill', '#333');
-
-        //_g_nodes.each(function (d, i) {
-            var selection = d3.select(this);
-/*            if (d.status == '0') {
-                selection.append("g").attr("class", "error-tip")
-                    .append("image").attr("xlink:href", function (d) {
-                    return imgMap['error-tip'];
-                });
-            }*/
-       // });
-
-        _g_lines.each(function (d, i) {
-            var _this = d3.select(this);
-            if (d.type === 1) {
-                _this.append("text")
-                    .text("100GB")
-                    .style('fill', 'rgb(255,198,22)')
-                    .style('font-size', '11');
-
-                _this.append("rect")
-                    .attr("fill", function (d) {
-                        return '#555';
-                    })
-                    .attr("width", function (d) {
-                        return 4;
-                    })
-                    .attr("height", function (d) {
-                        return 4;
-                    })
-                    .append("animate");
-
-                _this.select("rect").append("animate");
-            } else {
-                _this.append("image")
-                    .attr("xlink:href", function () {
-                        return thisNg.imgMap['link-cut'];
-                    });
+    // Get color from slice Id
+    getSliceColor(sliceId) {
+        // let colorId = sliceMap.get(sliceId)
+        // if (!sliceId || colorId >= SLICE_COLORS.length) colorId = 1
+        return 'black'
+    }
+
+    // Function to create a table from js array data
+    createJsonTable(data) {
+        let table = document.createElement('table')
+        table.className = 'display compact'
+        this.tableContainer.nativeElement.appendChild(table)
+
+        if (!data.length) return
+        let columns = []
+        for (let key of Object.keys(data[0])) {
+            if (this.isBasicType(data[0][key]) && key[0] != '$') {
+                columns.push({
+                    data: key, name: key,
+                    title: key.charAt(0).toUpperCase() + key.slice(1),
+                    defaultContent: ''
+                })
             }
-        });
+        }
+        let dataTable = $(table).DataTable({
+            autoWidth: false,
+            dom: 'ti',
+            order: [],
+            select: {toggleable: false},
+            columnDefs: [{className: 'dt-center', targets: '_all'}],
+            columns: columns,
+            data: data
+        })
+        dataTable.on('user-select', function (e, dt, type, cell, originalEvent) {
+            if (dt.row('.selected').index() != cell.index().row)
+                this.selectTableRow(cell.index().row, true)
+            return false
+        })
 
+        return dataTable
+    }
 
-        force.on("tick", function (e) {
+    // disable mouse for application
+    disableAppMouse(disabled) {
+        //header.style.pointerEvents = disabled ? 'none' : 'auto'
+        //container.style.pointerEvents = disabled ? 'none' : 'auto'
+        this.graph.setEnabled(!disabled)
+        document.body.style.cursor = disabled ? 'wait' : 'default'
+    }
 
-            _g_lines.select("line").attr("x1", function (d) {
-                return d.source.x;
-            })
-                .attr("y1", function (d) {
-                    return d.source.y;
-                })
-                .attr("x2", function (d) {
-                    return d.target.x;
-                })
-                .attr("y2", function (d) {
-                    return d.target.y;
-                });
-            _g_lines.select("image").attr("x", function (d) {
-                var x1 = d.source.x,
-                    x2 = d.target.x,
-                    x = x1 - (x1 - x2) / 2;
-                return x - 8;
-            })
-                .attr("y", function (d) {
-                    var y1 = d.source.y,
-                        y2 = d.target.y,
-                        y = y1 - (y1 - y2) / 2;
-                    return y - 15;
-                });
-
-            _g_lines.select("text")
-                .attr('x', function (d) {
-                    var x1 = d.source.x,
-                        x2 = d.target.x,
-                        halfX = x1 - (x1 - x2) / 2,
-                        x3 = x1 - (x1 - halfX) / 2;
-                    return x3;
-                })
-                .attr('y', function (d) {
-                    var y1 = d.source.y,
-                        y2 = d.target.y,
-                        halfY = y1 - (y1 - y2) / 2,
-                        y3 = y1 - (y1 - halfY) / 2;
-                    y3 = y3 - 5;
-                    return y3;
-                })
-                .attr("transform", function (d) {
-                    var x1 = d.source.x,
-                        x2 = d.target.x,
-                        y1 = d.source.y,
-                        y2 = d.target.y,
-                        x = x1 - (x1 - x2) / 2,
-                        y = y1 - (y1 - y2) / 2,
-                        rightAngleSide1 = Math.abs(y2 - y1),
-                        rightAngleSide2 = Math.abs(x2 - x1),
-                        _asin = 0,
-                        _rotateAngle = 0,
-                        x3 = x1 - (x1 - x) / 2,
-                        y3 = y1 - (y1 - y) / 2;
-
-                    if (x1 < x2) {
-                        _asin = (y2 - y1) / Math.sqrt(Math.pow(rightAngleSide1, 2) + Math.pow(
-                            rightAngleSide2, 2));
-                        _rotateAngle = Math.asin(_asin) * 180 / Math.PI;
-                    } else {
-                        _asin = (y1 - y2) / Math.sqrt(Math.pow(rightAngleSide1, 2) + Math.pow(
-                            rightAngleSide2, 2));
-                        _rotateAngle = Math.asin(_asin) * 180 / Math.PI;
-                        _rotateAngle = _rotateAngle < 0 ? (180 + _rotateAngle) : -(180 -
-                            _rotateAngle);
-                    }
-                    return 'rotate(' + (_rotateAngle) + ',' + x3 + ' ' + y3 + ')';
-                });
+    choseConnectivity(item) {
+        if (this.connectivitySelected !== item) this.connectivitySelected = item;
+        //this.drawService(this.getSvcTree());
+    }
 
-            _g_lines.select("rect")
-                .attr('x', function (d) {
-                    return d.source.x - 1;
-                })
-                .attr('y', function (d) {
-                    return d.source.y - 1;
-                })
-                .selectAll('animate').each(function (d, i) {
-                if (i == 0) {
-                    d3.select(this)
-                        .attr("attributeName", function (d) {
-                            return 'x';
-                        })
-                        .attr("from", function (d) {
-                            return d.source.x - 1;
-                        })
-                        .attr("to", function (d) {
-                            return d.target.x;
-                        });
-                } else {
-                    d3.select(this)
-                        .attr("attributeName", function (d) {
-                            return 'y';
-                        })
-                        .attr("from", function (d) {
-                            return d.source.y - 1;
-                        })
-                        .attr("to", function (d) {
-                            return d.target.y;
-                        });
-                }
+    _debounce(func: Function, delay: number) {
+        let inDebounce;
+        return function () {
+            const context = this;
+            const args = arguments;
+            clearTimeout(inDebounce)
+            inDebounce = setTimeout(() => func.apply(context, args), delay);
+        }
+    }
 
-                d3.select(this).attr("attributeType", "XML")
-                    .attr("dur", function (d) {
-                        return '1.5s';
-                    })
-                    .attr("repeatCount", "indefinite");
+    // Layout the label of client nodes
+    clientNodeLabelLayout() {
+        for (let [,sotnDomain] of this.domainMap) {
+            for (let [, clientNode] of sotnDomain.clientNodeMap) {
+                let vertex = clientNode.vertex
+                let remote = clientNode.networkNode.vertex
+                let isAbove = (vertex.geometry.y + vertex.geometry.height / 2) < (remote.geometry.y + remote.geometry.height / 2)
+                this.graph.setCellStyles(mxConstants.STYLE_VERTICAL_LABEL_POSITION, isAbove ? 'top' : 'bottom', [vertex])
+                this.graph.setCellStyles(mxConstants.STYLE_VERTICAL_ALIGN, isAbove ? 'bottom' : 'top', [vertex])
+            }
+        }
+    }
 
-            })
-/*            let k = 6 * e.alpha;
-            nodes.forEach(function(o, i) {
-                if (o["layer"] === "Otn"){
-                    o["y"] +=  k
-                    //o["x"] += i & 2 ? k : -k;
-
-                } else if (o["layer"] === "Eth") {
-                    o["y"] +=  -k;
-                    //o["x"] += i & 2 ? k : -k;
-                }
-            });*/
+    // Center the graph in the container
+    centerGraph() {
+
+        let domains = this.graph.model.getChildVertices(this.gLayers[0])
+        if (!domains) return
+        let bounds = this.graph.getBoundingBoxFromGeometry(domains, false)
+        if (!bounds) return
+        this.graphScale = this.graph.view.scale
+        let dx = (this.graph.container.clientWidth / this.graphScale - bounds.width) / 2
+        let dy = (this.graph.container.clientHeight / this.graphScale - bounds.height) / 2
+        this.graph.view.setTranslate(dx < 0 ? 0 : dx, dy < 0 ? 0 : dy)
+        this.graph.refresh()
+    }
 
-            _g_nodes.attr("transform", function (d) {
-                if(d.group === 'pnf') {
-                    var image = d3.select(this).select("image")[0][0],
-                        halfWidth = parseFloat("70") / 2,
-                        halfHeight = parseFloat("70") / 2;
+    // Functions ..0.
+    // Create popup menu for graph
+    createPopupMenu(menu, cell, evt) {
+    }
 
-                    return 'translate(' + (d.x - halfWidth) + ',' + (d.y - halfHeight) + ')';
-                } else {
-                    return 'translate(' + (d.x) + ',' + (d.y) + ')';
+    // A utility function for setting the values of part of an Object's properties
+    setObjValues(obj, newValues, keyObj = null): void {
+        for (let key of Object.keys(newValues)) {
+            if (!keyObj) obj[key] = newValues[key]
+            else obj[keyObj[key]] = newValues[key]
+        }
+    }
+
+    // Save changed services to local storage
+    saveServices() {
+        let storedServices = []
+        for (let e2eService of this.e2eServices) {
+            let storedService = this.cloneWithSimpleProperties(e2eService)
+            storedService["endPoints"] = []
+            for (let endPointMap of [e2eService.rootEndPointMap, e2eService.leafEndPointMap]) {
+                for (let [, endPoint] of endPointMap) {
+                    if (endPoint.status == 'retrieve') continue
+                    storedService["endPoints"].push(this.cloneWithSimpleProperties(endPoint))
                 }
+            }
+            storedServices.push(storedService)
+        }
+        (this.storage)['actn-viewer-service'] = JSON.stringify(storedServices)
+    }
 
-            });
+    // Hold for next release
+    // Read stored services from local storage.
+    readServices() {
+        /* let storedServices = JSON.parse((this.storage)['actn-viewer-service'] || '[]')
+        for (let storedService of storedServices) {
+            let e2eService = this.e2eServiceMap.get(storedService.name)
+            if (!e2eService) { //not exist then add new one
+                e2eService = storedService
+                e2eService.leafEndPointMap = new Map()
+                e2eService.rootEndPointMap = new Map()
+                e2eService.active = false
+                for (let endPoint of e2eService.endPoints) {
+                    if (!endPoint.newBand) endPoint.newBand = endPoint.bandwidth
+                    this.addNewEndPointToService(e2eService, endPoint, 'create')
+                }
+                this.updateOneE2eService(e2eService)
+            } else { //otherwise update the status of endpoint
+                for (let storedEndPoint of storedService.endPoints) {
+                    let endPoint = e2eService.leafEndPointMap.get(storedEndPoint.id) || e2eService.rootEndPointMap.get(storedEndPoint.id)
+                    if (endPoint) {
+                        switch (storedEndPoint.status) {
+                            case 'create':
+                                break
+                            case 'delete':
+                                endPoint.status = 'delete';
+                                endPoint.newBand = 0;
+                                break
+                            case 'update':
+                                if (endPoint.bandwidth != storedEndPoint.newBand) {
+                                    endPoint.newBand = storedEndPoint.newBand
+                                    endPoint.status = 'update'
+                                }
+                        }
+                    } else {
+                        this.addNewEndPointToService(e2eService, storedEndPoint, 'create')
+                    }
+                }
+                this.updateRootBandwidth(e2eService)
+            }
+        } */
+    }
 
-            _g_nodes.select("text").attr('dy', function (d) {
-                var image = this.previousSibling,
-                    height = parseFloat("10"),
-                    fontSize = parseFloat(this.style.fontSize);
+    // add a new endpoint to e2e service
+    addNewEndPointToService(e2eService, endPoint, status) {
+        endPoint.edge = this.getUniEdgeFromEp(endPoint)
+        if (!endPoint.edge) return
+        endPoint.status = status
+        let endPointMap = endPoint.role == 'leaf-access' ? e2eService.leafEndPointMap : e2eService.rootEndPointMap
+        endPoint.id = endPoint.id || this.getEndPointKey(endPoint)
+        endPointMap.set(endPoint.id, endPoint)
+    }
 
-                return height + 1.5 * fontSize;
-            });
+    // add a new uni to e2e service
+    addNewUni(e2eService, uni, isLeaf) {
+        let newEndPoint = {
+            networkId: uni.networkId,
+            nodeId: uni.srcNode.nodeId,
+            portId: uni.srcUniTp.tpId,
+            role: isLeaf ? 'leaf-access' : 'root-primary',
+            newBand: this.defBandwidth,
+        }
+        this.addNewEndPointToService(e2eService, newEndPoint, 'create')
+        this.updateCurrentCloud(e2eService)
+    }
 
-            _g_nodes.select(".error-tip").attr("transform", function (d) {
+    deleteNewUni(e2eService, endPoint, isLeaf, doUpdate = true) {
+        let endPointMap = isLeaf ? e2eService.leafEndPointMap : e2eService.rootEndPointMap
+        endPointMap.delete(endPoint.id)
+        if (doUpdate) this.updateCurrentCloud(e2eService)
+    }
 
-                var image = this.parentNode.firstChild,
-                    width = parseFloat("70");
+    deleteOldUni(e2eService, endPoint) {
+        endPoint.status = 'delete'
+        endPoint.newBand = 0
+        this.updateCurrentCloud(e2eService)
+    }
 
-                return 'translate(' + 0.8 * width + ',0)';
+    cancelUniDeletion(e2eService, endPoint, doUpdate = true) {
+        endPoint.status = 'retrieve'
+        endPoint.newBand = endPoint.bandwidth
+        if (doUpdate) this.updateCurrentCloud(e2eService)
+    }
 
-            });
+    cancelUniModification(e2eService, endPoint, doUpdate = true) {
+        endPoint.status = 'retrieve'
+        endPoint.newBand = endPoint.bandwidth
+        if (doUpdate) this.updateCurrentCloud(e2eService)
+    }
 
-        });
+    updateCurrentCloud(e2eService) {
+        this.updateRootBandwidth(e2eService)
+        this.saveServices()
+        //this.showSotnCloud(this.currentCloud)
+    }
 
+    // Calculate and update the bandwidth of roots
+    updateRootBandwidth(e2eService) {
+        let newRootBand = 0
+        for (let [, endPoint] of e2eService.leafEndPointMap) {
+            newRootBand += endPoint.newBand
+        }
+        for (let [, endPoint] of e2eService.rootEndPointMap) {
+            if (endPoint.status == 'delete') continue
+            endPoint.newBand = newRootBand
+            if (endPoint.status == 'create') continue
+            endPoint.status = (endPoint.newBand != endPoint.bandwidth) ? 'update' : 'retrieve'
+        }
+        e2eService.changed = false
+        for (let endPointMap of [e2eService.leafEndPointMap, e2eService.rootEndPointMap]) {
+            for (let [, endPoint] of endPointMap) {
+                if (endPoint.status != 'retrieve') {
+                    e2eService.changed = true;
+                    break
+                }
+            }
+            if (e2eService.changed) break
+        }
+        this.serviceTable.row(e2eService.$index).data(e2eService)
+    }
 
-        function dblclick(d) {
-            d3.select(this).classed("fixed", d.fixed = false);
+    // cancel all service changes
+    cancelAllCloudChanges(currentService) {
+        for (let endPointMap of [currentService.leafEndPointMap, currentService.rootEndPointMap]) {
+            for (let [, endPoint] of endPointMap) {
+                switch (endPoint.status) {
+                    case 'create':
+                        this.deleteNewUni(currentService, endPoint, endPoint.role == 'leaf-access', false)
+                        break
+                    case 'delete':
+                        this.cancelUniDeletion(currentService, endPoint, false)
+                        break
+                    case 'update':
+                        if (endPoint.role == 'leaf-access') {
+                            this.cancelUniModification(currentService, endPoint, false)
+                        }
+                        break
+                }
+            }
         }
+        currentService.changed = false
+        this.updateCurrentCloud(currentService)
+    }
 
-        function dragstart(d) {
-            d3.select(this).classed("fixed", d.fixed = true);
-            thisNg.eventDispatcher.dispatch(new AppEvent(AppEventType.UserNodeDrag, d));
+    // function for interact with ONAP SO
+    onapApplyCloudChanges(currentService) {
+        alert('Future feature.')
+        // let newSliceServices = e2eServices.filter(service =>
+        //     service.sliceId == currentSlice && !service.active)
+        // if (newSliceServices.length == 0) return
+        // let connections = []
+        // newSliceServices.forEach((s, i) => {
+        //     connections.push({
+        //         epa: s.srcVertex.value.node.uniTpMap.get(s.srcPort).name.split(':')[0],
+        //         epb: s.dstVertex.value.node.uniTpMap.get(s.dstPort).name.split(':')[0],
+        //         bandwidth: s.bandwidth,
+        //         name: s.name,
+        //     })
+        // })
+        // let jsonData = jsonRender('ONAP_TS_ALLOCATE_TMPL',
+        //     { sliceId: currentSlice, connections: connections })
+        // setRestJsonData('POST', onap, 'allocate', jsonData, null, false)
+
+        // let jsonData = jsonRender('ONAP_TS_OTHERS_TMPL',
+        //     { sliceId: currentSlice })
+        // setRestJsonData(method, onap, action, jsonData, null, false)
+    }
+
+    // Reset the database of controllers
+/*    resetControllerData() {
+        let result = confirm('The data of all controllers will be reset to initial state.')
+        if (!result) return
+        let reqNumber = 0
+        for (let controller of controllers) {
+            setRestJsonData('POST', {controller: controller}, RPC_RESET_DATA_URL, null)
         }
-        function dragend(d) {
+    }*/
 
+    // Filter table by cloud Id
+    filterTable(table, cloudId) {
+        if (table) table.column('cloudId:name').search(cloudId, true).draw()
+    }
+
+    // Hide or show table
+    hideTable(table, hide) {
+        let index;
+        if (table && !hide) {
+            $(table.table().container()).show()
+            index = table.row({selected: true, search: 'applied'}).index()
+            if (index == null) {
+                this.tableContainer.nativeElement.scrollTo(0, 0)
+            } else {
+                table.row(index).node().scrollIntoView(false)
+            }
+        } else if (table && hide) {
+            $(table.table().container()).hide()
         }
+    }
 
-        function color (d){
-            const scale = d3.scaleOrdinal(d3.schemeCategory10);
-            switch(d.group){
-                case "pnf":
-                    return  scale(1);
-                case "tp":
-                    return  scale(2);
-                default:
-                    return  scale(9);
+    // Select table row
+    selectTableRow(index = null, click = false) {
+        this.graph.clearSelection()
+        if ((this.currentLayer == 1 || this.currentLayer == 2) && this.tunnelTable) {
+            let indexes
+            if (index == null) {
+                indexes = this.tunnelTable.rows({selected: true, search: 'applied'}).indexes()
+                if (indexes.length == 0) return this.tunnelTable.rows('.selected').deselect()
+                indexes = indexes.toArray()
+            } else {
+                this.tunnelTable.rows('.selected').deselect()
+                let node = this.tunnelTable.row(index).select().node()
+                if (!click) node.scrollIntoView(false)
+                this.serviceTable.rows('.selected').deselect()
+                indexes = [index]
             }
+            for (let i in indexes) {
+                mxConstants.EDGE_SELECTION_COLOR = parseInt(i) % 2 ? '#0000FF' : '#00FF00'
+                this.graph.addSelectionCells((this.currentLayer == 1) ?
+                    this.e2eTunnels[indexes[i]].edges : [this.e2eTunnels[indexes[i]].e2eEdge])
+                this.showJsonData(this.tunnelsMap.get(this.e2eTunnels[indexes[i]].name), false)
+            }
+            mxConstants.EDGE_SELECTION_COLOR = '#00FF00'
+        } else if (this.currentLayer == 3 && this.serviceTable) {
+            if (index == null) {
+                index = this.serviceTable.row({selected: true, search: 'applied'}).index()
+                if (index == null) return this.serviceTable.rows('.selected').deselect()
+            } else {
+                this.serviceTable.rows('.selected').deselect()
+                let node = this.serviceTable.row(index).select().node()
+                if (!click) node.scrollIntoView(false)
+            }
+            this.graph.addSelectionCell(this.e2eServices[index].e2eEdge)
+            let currentService = this.e2eServices[index].name
+            this.showJsonData(this.servicesMap.get(this.e2eServices[index].name), false)
+            if (this.tunnelTable) this.tunnelTable.rows('.selected').deselect()
         }
     }
 
-    choseConnectivity(item) {
-        if (this.connectivitySelected !== item) this.connectivitySelected = item;
-           this.drawService(this.getSvcTree());
+    // Function to show the data of js object in JSON format
+    showJsonData(data, show = true) {
+        /*        $(jsonViewer).jsonViewer(data, { withLinks: false })
+                if (show) { popupWnd.show(); popupWnd.fit() }*/
     }
 
-    getSvcTree(): Array<object> {
-            let tree = []
-            let rel = this.connectivitySelected["relationship-list"]["relationship"] || null;
-            if (rel){
-                   tree = rel.filter(rl => rl["related-to"] === "uni")
-                        .map(obj => {
-                               let rObj ={};
-                               rObj["id"] = obj["relationship-data"][0]["relationship-value"],
-                               rObj["type"] = "leaf";
-                               return rObj;
-                        })
+// A utility function for getting value from nested JSON data
+    getJsonValue(obj, path) {
+        if (!obj) return
+        let arr = path.split('.');
+        let tempObj = obj;
+        for (let e of arr) {
+            if (!e) continue
+            if (!(tempObj = tempObj[e]))
+                return;
+        }
+        return tempObj;
+    }
+
+// A utility function for getting the last part of a string split by :
+    getLastColonPart(longStr) {
+        if (!longStr) return ''
+        let strArray = longStr.split(':')
+        if (strArray.length > 1) return strArray[strArray.length - 1]
+        else return ''
+    }
+
+// A utility function for cloning a new object with simple properties of the source ojbect
+    cloneWithSimpleProperties(source) {
+        let target = {}
+        for (let key of Object.keys(source)) {
+            if (this.isBasicType(source[key])) {
+                target[key] = source[key]
             }
-            return tree;
+        }
+        return target
+    }
+
+// A utility function for copying same properties from the source to the target
+    copySameProperties(source, target) {
+        for (let key of Object.keys(source)) {
+            if (key in target) target[key] = source[key]
+        }
+    }
+
+// A utility function for getting a JSON Array
+    getJsonArray(obj, path) {
+        let tmpObj = this.getJsonValue(obj, path)
+        if (Array.isArray(tmpObj)) return tmpObj
+        else return
+    }
+
+// basic type of js object
+    isBasicType(obj) {
+        return /^(string|number|boolean)$/.test(typeof obj)
+    }
+
+
+    // Get uni edge from endpoint
+    getUniEdgeFromEp(ep) {
+        let node = this.getNodeFromId(ep.networkId, ep.nodeId)
+        if (!node || !ep.portId) return null
+        let uniTp = node.uniTpMap.get(ep.portId.toString())
+        if (uniTp) return uniTp.edge
+    }
+
+
+    // Get node from Ids
+    getNodeFromId(networkId, nodeId) {
+        if (!networkId || !nodeId) return
+        let domain = this.domainMap.get(networkId)
+        if (!domain) return
+        return domain.nodeMap.get(nodeId)
     }
 
-    getNodes(ptMapping: Array<object>) : Array<object>{
-        let nodes = [];
-        for (let pnf of ptMapping){
-            if (pnf["layer"] === 2){
-                continue;
+    // Lay out the multi-domain topology automatically
+    autoLayout(layer = null) {
+        switch (layer || this.currentLayer) {
+            case 1: this.vertexLayout();
+            case 2: this.edgeLayout.execute((this.gLayers)[2]); break
+            case 3: this.edgeLayout.execute((this.gLayers)[3]); break
+        }
+    }
+    // Lay out domains and nodes automatically
+    vertexLayout() {
+        // Move nodes out of domain for layout
+        for (let [, sotnDomain] of this.domainMap) {
+            for (let [, node] of sotnDomain.nodeMap) {
+                this.graph.model.add((this.gLayers)[1], node.vertex)
             }
-            let name = pnf["pnfName"];
-            let newNode = {
-                "id" : name,
-                "group": "pnf",
-                "radius" : 2,
-                "layer" : pnf["layer"] === 2? "Eth" : "Otn"
+            for (let [, clientNode] of sotnDomain.clientNodeMap) {
+                this.graph.model.add((this.gLayers)[1], clientNode.vertex)
             }
-            nodes.push(newNode);
         }
-        return nodes;
-    }
+        // Disconnect tunnel edge from source and target
+        for (let item of this.e2eTunnels) {
+            item.srcVertex.removeEdge(item.e2eEdge, true)
+            item.dstVertex.removeEdge(item.e2eEdge, false)
+        }
 
-    getLinks(logicalLinks: Array<object>, ptMapping: Array<object>) : Array<object> {
-        let links = [];
-        for (let ll of logicalLinks){
-            let lkName:string = ll["link-name"];
-            let topoIdIdx:number = lkName.lastIndexOf("topologyId-");
-            if (topoIdIdx !== -1 && lkName.charAt(topoIdIdx + 11) === '2'){
-                //Ignore
-                continue;
-            } else if (typeof ll["relationship-list"] === 'undefined' ||
-                           typeof ll["relationship-list"]["relationship"] === 'undefined'){
-                continue;
+        // Lay out the muti-domain topology including all nodes
+        this.graph.zoomTo(1);
+        this.organicLayout.execute(this.gLayers[1])
+        // get the center point of each domain
+        let centerPoints = []
+        for (let [, sotnDomain] of this.domainMap) {
+            let x = 0, y = 0
+            if (sotnDomain.nodeMap.size == 0) continue
+            for (let [, node] of sotnDomain.nodeMap) {
+                x += node.vertex.geometry.x
+                y += node.vertex.geometry.y
             }
-            //pnf to pnf
-            let endpoints = [];
-            for (let pi of ll["relationship-list"]["relationship"]) {
-                if (pi["related-to"] === "p-interface"){
-                    for (let rd of pi["relationship-data"]){
-                        if (rd["relationship-key"] === "pnf.pnf-name"){
-                            endpoints.push(rd["relationship-value"]);
-                        }
-                    }
+            centerPoints.push({ x: x / sotnDomain.nodeMap.size, y: y / sotnDomain.nodeMap.size })
+        }
+        // calculate the rotation angel of topology in order to rotote it to horizontal direction
+        if (centerPoints.length >= 2) {
+            let theta = Math.atan2(centerPoints[centerPoints.length - 1].y - centerPoints[0].y,
+                centerPoints[centerPoints.length - 1].x - centerPoints[0].x) * 180 / Math.PI
+            let i = 0
+            for (let [, sotnDomain] of this.domainMap) {
+                for (let [, node] of sotnDomain.nodeMap) {
+                    rotateVertex(node.vertex, centerPoints[i], -theta)
                 }
-            }
-            if (endpoints.length === 2){
-                let newlk = {
-                    "source": endpoints[0],
-                    "target": endpoints[1],
-                    "type" : 1
+                for (let [, clientNode] of sotnDomain.clientNodeMap) {
+                    let vertex = clientNode.vertex
+                    rotateVertex(vertex, centerPoints[i], -theta)
+                    // shorten the length of uni link by 1/3
+                    let remote = clientNode.networkNode.vertex
+                    vertex.geometry.x = (vertex.geometry.x * 2 + remote.geometry.x) / 3
+                    vertex.geometry.y = (vertex.geometry.y * 2 + remote.geometry.y) / 3
                 }
-                links.push(newlk);
+                i++
             }
         }
-        return links;
-    }
-
-    getPnfTpMapping(logicalLinks: Array<object>) {
-        let pnfs = [];
-        let pnfVisited = {};
-        let pnfIndex: number = 0;
-        for (let ll of logicalLinks){
-            let lkName:string = ll["link-name"];
-            let topoIdIdx:number = lkName.lastIndexOf("topologyId-");
-            if (topoIdIdx !== -1 && lkName.charAt(topoIdIdx + 11) === '2'){
-                //Ethernet layer logical-link
-                let lastDashIdx:number = lkName.lastIndexOf("-");
-                let pnfName: string = lkName.replace("linkId", "nodeId").substr(0, lastDashIdx);
-                let uniName: string = lkName.substr( lastDashIdx+1);
-
-                if (pnfVisited[pnfName]){
-                    let idx: number = parseInt(pnfVisited[pnfName].substr(1));
-                    pnfs[idx].tps[uniName] = true;
-                } else {
-                    pnfVisited[pnfName] = '#' + pnfIndex;
-                    let newPnf = {
-                        "pnfName" : pnfName,
-                        "tps" : {
-                        },
-                        "layer" :2
-                    }
-                    newPnf.tps[uniName] = true;
-                    pnfs.push(newPnf);
-                    pnfIndex++;
-
-                }
-                continue;
-            } else if (ll["relationship-list"] === undefined ||
-                    ll["relationship-list"]["relationship"].length === 0 ){
-                continue;
+        // resize the domains to just contain the nodes in each domain
+        for (let [, sotnDomain] of this.domainMap) {
+            let vertexes = []
+            for (let [, node] of sotnDomain.nodeMap) {
+                vertexes.push(node.vertex)
             }
-            for (let pi of ll["relationship-list"]["relationship"]) {
-                if (pi["related-to"] === "p-interface"){
-                    let pnfName:string;
-                    let tpName:string;
-                    for (let rd of pi["relationship-data"]){
-                        if (rd["relationship-key"] === "pnf.pnf-name"){
-                            pnfName = rd["relationship-value"];
-                        } else if (rd["relationship-key"] === "p-interface.interface-name"){
-                            tpName = rd["relationship-value"];
-                        }
-                    }
-                    if (pnfVisited[pnfName]){
-                        let idx: number = parseInt(pnfVisited[pnfName].substr(1));
-                        pnfs[idx].tps[tpName] = true;
-                    } else {
-                        pnfVisited[pnfName] = '#' + pnfIndex;
-                        let newPnf = {
-                            "pnfName" : pnfName,
-                            "tps" : {
-                            },
-                            "layer" : 1
-                        }
-                        newPnf.tps[tpName] = true;
-                        pnfs.push(newPnf);
-                        pnfIndex++;
+            for (let [, clientNode] of sotnDomain.clientNodeMap) {
+                vertexes.push(clientNode.vertex)
+            }
+            let bounds = this.graph.getBoundingBoxFromGeometry(vertexes, false)
+            sotnDomain.vertex.geometry.setRect(bounds.x, bounds.y, bounds.width, bounds.height)
+        }
+        // Move nodes back to their orginal domain
+        for (let [, sotnDomain] of this.domainMap) {
+            for (let [, node] of sotnDomain.nodeMap) {
+                this.graph.model.add(sotnDomain.vertex, node.vertex)
+            }
+            for (let [, clientNode] of sotnDomain.clientNodeMap) {
+                this.graph.model.add(sotnDomain.vertex, clientNode.vertex)
+            }
+        }
+        // Reconnect tunnel edge to source and target
+        for (let item of this.e2eTunnels) {
+            item.srcVertex.insertEdge(item.e2eEdge, true)
+            item.dstVertex.insertEdge(item.e2eEdge, false)
+        }
 
-                    }
-                }
+        this.clientNodeLabelLayout()
+        this.domainLayout(50, 50, 50)
+        this.centerGraph()
+
+        function rotateVertex(vertex, centerPoint, theta) {
+            let newPoint = mxAbstractCanvas2D.prototype.rotatePoint(
+                vertex.geometry.x, vertex.geometry.y, theta, centerPoint.x, centerPoint.y)
+            vertex.geometry.x = newPoint.x
+            vertex.geometry.y = newPoint.y
+        }
+    }
+    // Layout domains automatically with the same domain size
+    domainLayout(marginWidth, marginHeight, marginBetween) {
+        let domains = this.graph.model.getChildVertices(this.gLayers[0])
+        this.graph.cellsFolded(domains, false, false)
+        let maxWidth = 0, maxHeight = 0
+        for (let domain of domains) {
+            if (maxWidth < domain.geometry.width) maxWidth = domain.geometry.width
+            if (maxHeight < domain.geometry.height) maxHeight = domain.geometry.height
+        }
+        maxWidth += marginWidth;
+        maxHeight += marginHeight
+        // Center the nodes in the domain
+        for (let domain of domains) {
+            domain.geometry.width = maxWidth + marginBetween
+            domain.geometry.height = maxHeight
+            let nodes = this.graph.model.getChildVertices(domain)
+            let bounds = this.graph.getBoundingBoxFromGeometry(nodes, false)
+            let xOffset = (maxWidth / 2 - bounds.x - bounds.width / 2)
+            let yOffset = (maxHeight / 2 - bounds.y - bounds.height / 2)
+            for (let node of nodes) {
+                node.geometry.x += xOffset
+                node.geometry.y += yOffset
             }
         }
-        return pnfs;
+        this.stackLayout.execute(this.gLayers[0])
+        for (let domain of domains) {
+            domain.geometry.width -= marginBetween
+        }
     }
-}
+    getKeys(map){
+        return Array.from(map.keys());
+    }
+    getValues(map){
+        return Array.from(map.values());
+    }
+
+}
\ No newline at end of file
index ad9d855..f6f9197 100644 (file)
   "i18nTextDefine_HostUrl": "主机网址",
   "i18nTextDefine_deleteLink": "删除链接",
   "i18nTextDefine_Connectivty": "L3业务实例",
+  "i18nTextDefine_CCVPNLayer": "网络层",
+  "i18nTextDefine_CCVPNService": "业务名",
 
   "sotn-component": "--:",
   "i18nTextDefine_subscriptionType": "订购类型",
index 034262b..6885783 100644 (file)
   "i18nTextDefine_HostUrl": "Host Url",
   "i18nTextDefine_DeleteLink": "Delete Link",
   "i18nTextDefine_Connectivity": "Connectivity",
+  "i18nTextDefine_CCVPNLayer": "Layer",
+  "i18nTextDefine_CCVPNService": "Service",
 
   "sotn-component": "--:",
   "i18nTextDefine_subscriptionType": "Service Type",
index 94f4fc0..0b44223 100644 (file)
@@ -9,11 +9,13 @@
     "emitDecoratorMetadata": true,
     "experimentalDecorators": true,
     "target": "es5",
+    "downlevelIteration": true,
     "skipLibCheck": true,
     "allowSyntheticDefaultImports": true,
     "typeRoots": [
       "node_modules/@types"
     ],
+    "types": ["@types/resize-observer-browser"],
     "lib": [
       "es2017",
       "dom"