diff options
author | decheng zhang <decheng.zhang@huawei.com> | 2022-05-10 10:55:51 -0400 |
---|---|---|
committer | decheng zhang <decheng.zhang@huawei.com> | 2022-05-11 21:31:48 -0400 |
commit | a780c26ba0b6f831a93f2f05ae1c8479e61a6e26 (patch) | |
tree | 499643bb9a68a999357add44bc7e57fabe51b759 /usecaseui-portal/src/app | |
parent | c08a485cc52dabbd7d05a086439ff740916246aa (diff) |
fix: ccvpn topology display issue
- topology display
- tunnel display
- uni and inni coloring
Issue-ID: REQ-1103
Signed-off-by: decheng zhang <decheng.zhang@huawei.com>
Change-Id: Ib76836edf2c7c063ad4b76cde96fe8efb7540fdb
Signed-off-by: decheng zhang <decheng.zhang@huawei.com>
Diffstat (limited to 'usecaseui-portal/src/app')
6 files changed, 573 insertions, 233 deletions
diff --git a/usecaseui-portal/src/app/core/services/networkHttpservice.service.ts b/usecaseui-portal/src/app/core/services/networkHttpservice.service.ts index 77dbaffa..d558d489 100644 --- a/usecaseui-portal/src/app/core/services/networkHttpservice.service.ts +++ b/usecaseui-portal/src/app/core/services/networkHttpservice.service.ts @@ -43,7 +43,8 @@ export class networkHttpservice { "deleteLink": this.baseUrl+"/uui-sotn/deleteLink/", "getConnectivities": this.baseUrl+"/uui-sotn/getConnectivityInfo", "getNetworkRoutes": this.baseUrl + "/uui-sotn/getNetworkRouteInfo", - "getVpnBindings": this.baseUrl + "/uui-sotn/getVpnBindingInfo" + "getVpnBindings": this.baseUrl + "/uui-sotn/getVpnBindingInfo", + "getUnis": this.baseUrl + "/uui-sotn/getUniInfo" }; //The following APIs function are optimizable------------------------ @@ -96,6 +97,10 @@ export class networkHttpservice { return this.http.get<any>(this.url["getVpnBindings"]); } + getUnisData(){ + return this.http.get<any>(this.url["getUnis"]); + } + //Create an external cloud newwork interface createNetwrok(paramsObj) { return this.http.put<any>(this.url["createNetwrok"] + paramsObj["network-id"], paramsObj); diff --git a/usecaseui-portal/src/app/mock/json/uui-sotn_getUniInfo.json b/usecaseui-portal/src/app/mock/json/uui-sotn_getUniInfo.json new file mode 100644 index 00000000..ba97ac26 --- /dev/null +++ b/usecaseui-portal/src/app/mock/json/uui-sotn_getUniInfo.json @@ -0,0 +1,142 @@ +{ + "uni": [ + { + "id": "networkId-providerId-20-clientId-0-topologyId-2-nodeId-10.2.1.2-ltpId-512-47", + "tp-id": "512", + "cvlan": "47", + "data-owner": "cll-101", + "data-source": "6", + "resource-version": "1652193719443", + "relationship-list": { + "relationship": [ + { + "related-to": "connectivity", + "relationship-label": "org.onap.relationships.inventory.PartOf", + "related-link": "/aai/v24/network/connectivities/connectivity/d9897f66-6912-420a-9ee6-8bfb25b7c799", + "relationship-data": [ + { + "relationship-key": "connectivity.connectivity-id", + "relationship-value": "d9897f66-6912-420a-9ee6-8bfb25b7c799" + } + ], + "related-to-property": [ + { + "property-key": "connectivity.etht-svc-name", + "property-value": "cll-link-2" + } + ] + }, + { + "related-to": "connectivity", + "relationship-label": "org.onap.relationships.inventory.PartOf", + "related-link": "/aai/v24/network/connectivities/connectivity/400ef32d-2a6b-427b-afdd-68418ffa4981", + "relationship-data": [ + { + "relationship-key": "connectivity.connectivity-id", + "relationship-value": "400ef32d-2a6b-427b-afdd-68418ffa4981" + } + ], + "related-to-property": [ + { + "property-key": "connectivity.etht-svc-name", + "property-value": "cll-link-2" + } + ] + } + ] + } + }, + { + "id": "networkId-providerId-10-clientId-0-topologyId-2-nodeId-10.1.1.1-ltpId-1000001-47", + "tp-id": "1000001", + "cvlan": "47", + "data-owner": "cll-101", + "data-source": "3", + "resource-version": "1652193712992", + "relationship-list": { + "relationship": [ + { + "related-to": "connectivity", + "relationship-label": "org.onap.relationships.inventory.PartOf", + "related-link": "/aai/v24/network/connectivities/connectivity/d9897f66-6912-420a-9ee6-8bfb25b7c799", + "relationship-data": [ + { + "relationship-key": "connectivity.connectivity-id", + "relationship-value": "d9897f66-6912-420a-9ee6-8bfb25b7c799" + } + ], + "related-to-property": [ + { + "property-key": "connectivity.etht-svc-name", + "property-value": "cll-link-2" + } + ] + }, + { + "related-to": "connectivity", + "relationship-label": "org.onap.relationships.inventory.PartOf", + "related-link": "/aai/v24/network/connectivities/connectivity/ba80397f-d2d5-4db7-82c7-d09903e3d7ac", + "relationship-data": [ + { + "relationship-key": "connectivity.connectivity-id", + "relationship-value": "ba80397f-d2d5-4db7-82c7-d09903e3d7ac" + } + ], + "related-to-property": [ + { + "property-key": "connectivity.etht-svc-name", + "property-value": "cll-link-2" + } + ] + } + ] + } + }, + { + "id": "networkId-providerId-10-clientId-0-topologyId-2-nodeId-10.1.1.1-ltpId-2000001-89", + "tp-id": "2000001", + "cvlan": "89", + "data-owner": "cll-101", + "data-source": "3", + "resource-version": "1652193720784", + "relationship-list": { + "relationship": [ + { + "related-to": "connectivity", + "relationship-label": "org.onap.relationships.inventory.PartOf", + "related-link": "/aai/v24/network/connectivities/connectivity/d9897f66-6912-420a-9ee6-8bfb25b7c799", + "relationship-data": [ + { + "relationship-key": "connectivity.connectivity-id", + "relationship-value": "d9897f66-6912-420a-9ee6-8bfb25b7c799" + } + ], + "related-to-property": [ + { + "property-key": "connectivity.etht-svc-name", + "property-value": "cll-link-2" + } + ] + }, + { + "related-to": "connectivity", + "relationship-label": "org.onap.relationships.inventory.PartOf", + "related-link": "/aai/v24/network/connectivities/connectivity/ca45be29-ba1c-4da5-b2b2-b3043057324a", + "relationship-data": [ + { + "relationship-key": "connectivity.connectivity-id", + "relationship-value": "ca45be29-ba1c-4da5-b2b2-b3043057324a" + } + ], + "related-to-property": [ + { + "property-key": "connectivity.etht-svc-name", + "property-value": "cll-link-2" + } + ] + } + ] + } + } + ] +}
\ 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 deleted file mode 100644 index 2339b3da..00000000 --- a/usecaseui-portal/src/app/mock/json/uui-sotn_getUuis.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "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_getVpnBindingInfo.json b/usecaseui-portal/src/app/mock/json/uui-sotn_getVpnBindingInfo.json index 0071a089..c6f47be7 100644 --- a/usecaseui-portal/src/app/mock/json/uui-sotn_getVpnBindingInfo.json +++ b/usecaseui-portal/src/app/mock/json/uui-sotn_getVpnBindingInfo.json @@ -1,12 +1,12 @@ { "vpn-binding": [ { - "vpn-id": "c93dcdc9-fe9f-412c-bcf3-7d9a4151912e", - "vpn-name": "2c993a22-722f-4a5d-87e1-5b373362bc2c", + "vpn-id": "977dc0aa-f210-424b-9843-cc7e5cd47458", + "vpn-name": "9c627989-9605-4bf5-b050-14333dcd36c4", "vpn-platform": "rocks", "vpn-region": "http://192.168.198.6:28181", - "customer-vpn-id": "20", - "route-distinguisher": "14", + "customer-vpn-id": "1", + "route-distinguisher": "3", "access-provider-id": "20", "access-client-id": "0", "access-topology-id": "1", @@ -16,7 +16,7 @@ "dst-access-ltp-id": "", "operational-status": "Activated", "slice-id": "cll-101", - "resource-version": "1651090153178", + "resource-version": "1652193726436", "vpn-description": "onos", "ops-note": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1", "relationship-list": { @@ -24,11 +24,11 @@ { "related-to": "connectivity", "relationship-label": "tosca.relationships.network.BindsTo", - "related-link": "/aai/v24/network/connectivities/connectivity/28ef47d8-3d98-46bb-96c4-a51588d3700b", + "related-link": "/aai/v24/network/connectivities/connectivity/400ef32d-2a6b-427b-afdd-68418ffa4981", "relationship-data": [ { "relationship-key": "connectivity.connectivity-id", - "relationship-value": "28ef47d8-3d98-46bb-96c4-a51588d3700b" + "relationship-value": "400ef32d-2a6b-427b-afdd-68418ffa4981" } ], "related-to-property": [ @@ -42,12 +42,12 @@ } }, { - "vpn-id": "f825613f-6c9b-425d-9033-96bdb9e7ac88", - "vpn-name": "2c993a22-722f-4a5d-87e1-5b373362bc2c", + "vpn-id": "59324805-5e15-4d33-9d4f-f17db2ea7808", + "vpn-name": "9c627989-9605-4bf5-b050-14333dcd36c4", "vpn-platform": "rocks", "vpn-region": "http://192.168.198.6:18181", - "customer-vpn-id": "20", - "route-distinguisher": "14", + "customer-vpn-id": "1", + "route-distinguisher": "3", "access-provider-id": "10", "access-client-id": "0", "access-topology-id": "1", @@ -57,7 +57,7 @@ "dst-access-ltp-id": "OA==", "operational-status": "Activated", "slice-id": "cll-101", - "resource-version": "1651090153697", + "resource-version": "1652193726951", "vpn-description": "onos", "ops-note": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1", "relationship-list": { @@ -65,11 +65,11 @@ { "related-to": "connectivity", "relationship-label": "tosca.relationships.network.BindsTo", - "related-link": "/aai/v24/network/connectivities/connectivity/88531ca5-154c-4731-9adb-7ccc18935c34", + "related-link": "/aai/v24/network/connectivities/connectivity/ba80397f-d2d5-4db7-82c7-d09903e3d7ac", "relationship-data": [ { "relationship-key": "connectivity.connectivity-id", - "relationship-value": "88531ca5-154c-4731-9adb-7ccc18935c34" + "relationship-value": "ba80397f-d2d5-4db7-82c7-d09903e3d7ac" } ], "related-to-property": [ @@ -81,6 +81,87 @@ } ] } + }, + { + "vpn-id": "1eba3e7a-82c8-45f7-921b-34d3b5334ee5", + "vpn-name": "03c3917f-5849-4048-9a77-db20a592799a", + "vpn-platform": "rocks", + "vpn-region": "http://192.168.198.6:18181", + "customer-vpn-id": "4", + "route-distinguisher": "3", + "access-provider-id": "10", + "access-client-id": "0", + "access-topology-id": "1", + "src-access-node-id": "10.1.1.1", + "src-access-ltp-id": "", + "dst-access-node-id": "10.1.1.3", + "dst-access-ltp-id": "OA==", + "operational-status": "Activated", + "slice-id": "cll-101", + "resource-version": "1652193727458", + "vpn-description": "onos", + "ops-note": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1", + "relationship-list": { + "relationship": [ + { + "related-to": "connectivity", + "relationship-label": "tosca.relationships.network.BindsTo", + "related-link": "/aai/v24/network/connectivities/connectivity/ca45be29-ba1c-4da5-b2b2-b3043057324a", + "relationship-data": [ + { + "relationship-key": "connectivity.connectivity-id", + "relationship-value": "ca45be29-ba1c-4da5-b2b2-b3043057324a" + } + ], + "related-to-property": [ + { + "property-key": "connectivity.etht-svc-name", + "property-value": "cll-link-2" + } + ] + } + ] + } + }, + { + "vpn-id": "ff3513c6-2582-4715-8aba-e9638e8de940", + "vpn-name": "03c3917f-5849-4048-9a77-db20a592799a", + "vpn-platform": "rocks", + "vpn-region": "http://192.168.198.6:28181", + "customer-vpn-id": "4", + "route-distinguisher": "3", + "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", + "dst-access-ltp-id": "", + "operational-status": "Activated", + "slice-id": "cll-101", + "resource-version": "1652193728020", + "vpn-description": "onos", + "ops-note": "networkId-providerId-10-clientId-0-topologyId-1-nodeId-10.1.1.1", + "relationship-list": { + "relationship": [ + { + "related-to": "connectivity", + "relationship-label": "tosca.relationships.network.BindsTo", + "related-link": "/aai/v24/network/connectivities/connectivity/e9572e3b-1a4f-4897-bacf-a7747f33f161", + "relationship-data": [ + { + "relationship-key": "connectivity.connectivity-id", + "relationship-value": "e9572e3b-1a4f-4897-bacf-a7747f33f161" + } + ], + "related-to-property": [ + { + "property-key": "connectivity.etht-svc-name" + } + ] + } + ] + } } ] }
\ No newline at end of file diff --git a/usecaseui-portal/src/app/views/network/ccvpn-network/ccvpn-network.component.html b/usecaseui-portal/src/app/views/network/ccvpn-network/ccvpn-network.component.html index edf36343..b3527987 100644 --- a/usecaseui-portal/src/app/views/network/ccvpn-network/ccvpn-network.component.html +++ b/usecaseui-portal/src/app/views/network/ccvpn-network/ccvpn-network.component.html @@ -18,6 +18,9 @@ <div class="model"> <!--chart--> <div class="action ant-tabs-bar"> + <button class="create" nz-button [nzType]="'primary'" (click)="updateNetworkView()"> + <span> Update </span> + </button> <span> <i class="icon"> <img src="assets/images/service-type.png"alt=""> @@ -41,7 +44,7 @@ {{"i18nTextDefine_CCVPNService" | translate}} : </span> <nz-dropdown [nzTrigger]="'click'" [nzPlacement]="'bottomLeft'"> - <button nz-button nz-dropdown><span>{{serviceSelected && servicesMap.get(serviceSelected).name}}</span> <i class="anticon anticon-down"></i> + <button nz-button nz-dropdown><span>{{serviceSelected && servicesMap.get(serviceSelected) && servicesMap.get(serviceSelected).name}}</span> <i class="anticon anticon-down"></i> </button> <ul nz-menu> <li nz-menu-item (click)="chooseService(svcInstId)" *ngFor="let svcInstId of getKeys(servicesMap)"> @@ -80,18 +83,20 @@ <div class="slicing-resource-table-list"> <nz-table #basicTable - [nzData]="getValues(servicesMap)" + [nzData]="getTunnels()" [nzFrontPagination]="false" nzShowSizeChanger [nzPageSizeOptions]="[6,8,10]" > <thead> <tr> - <th>Ethernet Svc Name</th> - <th>Service Instance Id</th> - <th>Service Type</th> - <th>VLAN</th> - <th>Bandwidth</th> + <th>Cloud-Id</th> + <th>Tunnel-Id</th> + <th>Odu-Type</th> + <th>Odu0</th> + <th>Protection</th> + <th>Src-Node</th> + <th>Dst-Node</th> <th>Status</th> </tr> </thead> @@ -100,9 +105,11 @@ <tr> <td>{{ data.name }}</td> <td>{{ data.id }}</td> - <td>Cloud Lease Line</td> - <td>{{ data.vlan }}</td> + <td>ODUflex</td> <td>{{ data.bw }}</td> + <td>Unprotected</td> + <td>{{ data.srcId }}</td> + <td>{{ data.dstId }}</td> <td> Activated </td> diff --git a/usecaseui-portal/src/app/views/network/ccvpn-network/ccvpn-network.component.ts b/usecaseui-portal/src/app/views/network/ccvpn-network/ccvpn-network.component.ts index 40b986bd..57357d57 100644 --- a/usecaseui-portal/src/app/views/network/ccvpn-network/ccvpn-network.component.ts +++ b/usecaseui-portal/src/app/views/network/ccvpn-network/ccvpn-network.component.ts @@ -25,7 +25,7 @@ const NODE_COLOR = 'DeepSkyBlue' const CE_COLOR = 'Gray' const FONT_COLOR = 'Navy' const TITLE_COLOR = '#0da9e2' //'linear-gradient(90deg, #07a9e1 0%, #30d9c4 100%)' -const DEFAULT_COLOR= '#0000FF' +const DEFAULT_COLOR= '#000000' // Customizable colors for endpoint CRUD status const EP_COLOR_MAP = new Map([ ['create', 'RoyalBlue'], @@ -34,10 +34,6 @@ const EP_COLOR_MAP = new Map([ ['delete', 'red'], ]) -enum NodePosition { - L2_NODE_POS = 'l2_node_pos', -} - declare var mxGraph: any; declare var mxCell: any; declare var mxHierarchicalLayout: any; @@ -54,6 +50,7 @@ declare var mxParallelEdgeLayout: any; declare var mxPerimeter: any; declare var mxEdgeStyle: any; declare var mxAbstractCanvas2D: any; +declare var mxRectangle: any; @Component({ selector: 'app-ccvpn-network', @@ -78,7 +75,7 @@ export class CcvpnNetworkComponent implements OnInit { sliceMap = new Map() tunnelsMap = new Map() e2eTunnels = [] - e2eTunnelMap = new Map() + servicesMap = new Map() e2eServices = [] e2eServiceMap = new Map() @@ -216,74 +213,78 @@ export class CcvpnNetworkComponent implements OnInit { if (popupMenu.length) document.body.removeChild(popupMenu[0]) } - var dragStatus = 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() - } - } - 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 - } - } - } - } - } - 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.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() +// } +// } +// 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 +// } +// } +// } +// } +// } +// 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.fetchDataFromAAI(); + } + fetchDataFromAAI(){ + let thisNg = this; this.isSpinning = true; let reqCount = 0; reqCount++; this.myhttp.getLogicalLinksData() .subscribe((data) => { - if (data) { + thisNg.logicalLinks = []; + if (data && !data["status"]) { for (let ll of data["logical-link"]) { thisNg.logicalLinks.push(ll); } @@ -300,7 +301,8 @@ export class CcvpnNetworkComponent implements OnInit { reqCount++; this.myhttp.getPnfsData() .subscribe((data) => { - if (data) { + thisNg.pnfs = []; + if (data && !data["status"]) { for (let ll of data["pnf"]) { thisNg.pnfs.push(ll); } @@ -317,7 +319,8 @@ export class CcvpnNetworkComponent implements OnInit { reqCount++; this.myhttp.getVpnBindingsData() .subscribe((data) => { - if (data) { + thisNg.vpnBindings = []; + if (data && !data["status"]) { for (let ll of data["vpn-binding"]) { thisNg.vpnBindings.push(ll); } @@ -334,7 +337,8 @@ export class CcvpnNetworkComponent implements OnInit { reqCount++; this.myhttp.getConnectivities() .subscribe((data) => { - if (data) { + thisNg.connectivities = []; + if (data && !data["status"]) { for (let ll of data["connectivity"]) { thisNg.connectivities.push(ll); } @@ -351,7 +355,8 @@ export class CcvpnNetworkComponent implements OnInit { reqCount++; this.myhttp.getNetworkRoutes() .subscribe((data) => { - if (data) { + thisNg.networkroutes = []; + if (data && !data["status"]) { for (let ll of data["network-route"]) { thisNg.networkroutes.push(ll); } @@ -364,20 +369,34 @@ export class CcvpnNetworkComponent implements OnInit { (err) => { console.log(err); }) + reqCount++; + this.myhttp.getUnisData() + .subscribe((data) => { + thisNg.unis = []; + if (data && !data["status"]) { + for (let ll of data["uni"]) { + thisNg.unis.push(ll); + } + } + if (--reqCount == 0) { + thisNg.finishNetworkView(); + this.isSpinning = false; + } + }, + (err) => { + console.log(err); + }) } - connectivityList = []; - 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 = ''; + layerSelected = { value: 2, name: 'Tunnel layer' } + serviceSelected = ''; addLinkDisabled = true; nonetwork = false; @@ -388,6 +407,7 @@ export class CcvpnNetworkComponent implements OnInit { isSpinning = true; pnfs = []; + unis = []; logicalLinks = [];//logicalLinks Existing connection data returned by the interface connectivities = []; vpnBindings = []; @@ -398,25 +418,8 @@ export class CcvpnNetworkComponent implements OnInit { d3Data = [];//D3Render the required data linkName = null;//Linked name link-name - networkOption = [];//Form network drop-down box filled data - nodeOption1 = {};//Node drop-down box filled data - tpOption1 = [];//Node drop-down box filled data - tpOption2 = [];//Node drop-down box filled data - networkVal1 = null;//network1 Drop-down box default data - networkVal2 = null;//network2 Drop-down box default data - selectedNode1 = null;//node1 Drop-down box default data - selectedNode2 = null;//node2 Drop-down box default data - selecteTpName1 = null;//TP1 Drop-down box default data - selecteTpName2 = null;//TP2 Drop-down box default data - cloudUrl = null;//External cloud URL address - cloudNetwork = null;//External cloud network name - cloudNode = null;//External cloud Node name - cloudTp = null;//External cloud Tp name - - dataCloud = [];//External cloud information - dataCloudLink = []; - aaiId = ''; + cloudUrl = null;//External cloud URL address //When the connection is deleted, the data displayed in the right frame delLinkname = null; @@ -451,13 +454,25 @@ export class CcvpnNetworkComponent implements OnInit { }; finishNetworkView() { + if (!this.logicalLinks.length) return; + if (!this.pnfs.length) return; this.updateTopoData(); - console.log(this.domainMap); + console.log("Domain Map: ", this.domainMap); this.finishSotnView(); } + updateNetworkView(){ + this.saveVertexLocation(); + this.fetchDataFromAAI(); + this.finishNetworkView(); + } updateTopoData(){ let thisNg = this; + this.servicesMap.clear(); + this.domainMap.clear(); + this.enniMap.clear(); + this.e2eTunnels = []; + //this.serviceSelected = '' // Update the network topo data // Update node data for (let pnf of thisNg.pnfs){ @@ -487,10 +502,10 @@ export class CcvpnNetworkComponent implements OnInit { // 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") - .pop(); + //let svcInstId = this.getValueFromRelationList(cn, "service-instance", "service-instance.service-instance-id") + // .pop(); let svcInstName = cn["etht-svc-name"]; - let uniList = this.getValueFromRelationList(cn, "uni", "uni.id"); + let svcInstId = svcInstName; let bw = cn["bandwidth-profile-name"]; let cvlan = cn["cvlan"]; let svc = this.servicesMap.get(svcInstId); @@ -501,7 +516,7 @@ export class CcvpnNetworkComponent implements OnInit { connections: [], bw : bw, vlan : cvlan, - unis : uniList, + unis : [], otnEdges: [] } this.servicesMap.set(svcInstId, svc); @@ -518,7 +533,7 @@ export class CcvpnNetworkComponent implements OnInit { let linkRole = ll["link-role"]; let linkId = ll["link-id"]; - if (linkName.search("topologyId-2") >= 0) { + if (linkName && linkName.search("topologyId-2") >= 0) { // uni links let arr = linkId.split('-'); let arr1 = arr[0].split('.'); @@ -533,10 +548,19 @@ export class CcvpnNetworkComponent implements OnInit { if (!domain) continue; domain.clientNodeMap.set(linkId, cpeNode); + let readableName = ''; + for (let ll of thisNg.networkroutes){ + let strArr = ll["next-hop"].split('-'); + if (linkId === strArr[strArr.length-3]+'-'+strArr[strArr.length-1]){ + readableName = ll["data-source"] || ''; + break; + } + } let uni = { srcNodeId: arr[0], srcUniTp: arr[1], - dstNode: cpeNode + dstNode: cpeNode, + readableName: readableName } domain.uniMap.set(linkId, uni) } else if (linkRole && linkRole.search("cross-domain") >= 0){ @@ -571,30 +595,7 @@ export class CcvpnNetworkComponent implements OnInit { } } 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") - .pop(); - let conn = { - srcEpId: srcEpId, - dstEpId: dstEpId, - dstEpLtpId: '', - srcEpLtpId: '' - } - 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']; - } - } - let svc = this.servicesMap.get(svcInstId); - if (svc){ - svc.connections.push(conn); - } + } else if (linkType && linkType.search("Tsci") >= 0) { } else { // local link let localLink: Array<any> = new Array(); @@ -642,7 +643,8 @@ export class CcvpnNetworkComponent implements OnInit { srcNode: srcNode, srcTpId: srcTpId, dstNode: dstNode, - dstTpId: dstTpId + dstTpId: dstTpId, + id: srcNodeId + '-' + srcTpId } domainLocal.inniMap.set(srcNodeId + '-' + srcTpId, inni); } else { @@ -650,26 +652,91 @@ export class CcvpnNetworkComponent implements OnInit { } } } - // Hack: deson't work for more then 2 domain system + let tunnels = []; for (let ll of thisNg.vpnBindings) { - let svcInstId = ll["slice-id"]; + let svcInstId = this.getValueFromRelationList(ll, "connectivity", "property", "connectivity.etht-svc-name") + .pop() let svc = this.servicesMap.get(svcInstId); let srcNodeId = ll["src-access-node-id"]; let dstNodeId = ll["dst-access-node-id"]; + if (!srcNodeId) continue; let domainId = srcNodeId.split(".")[1]; let domain = thisNg.domainMap.get(domainId); + let bw = ll["route-distinguisher"] || 0; if (!svc || !domain){ continue; } + let tunnelSeg = { + id: ll["vpn-id"], + tunnelId: ll["vpn-name"], + srcNodeId: srcNodeId, + dstNodeId: dstNodeId + } + let exist = false; + for (let tl of svc.connections){ + if (tl["id"] === ll["vpn-name"]){ + tl.segs.push(tunnelSeg) + exist = true; + } + } + if (!exist){ + let conn = { + srcId: "", + dstId: "", + id: ll["vpn-name"], + segs: [tunnelSeg], + bw: bw + } + svc.connections.push(conn); + } + } + for(let [id, svc] of thisNg.servicesMap){ + for (let con of svc.connections){ + con.segs.sort(function(a, b){ + return a.srcNodeId.split(".")[1] - b.dstNodeId.split(".")[1]; + }); + con.srcId = con.segs[0].srcNodeId; + con.dstId = con.segs[con.segs.length-1].dstNodeId; + } + } + for (let ll of thisNg.unis){ + let ltpIdArr = ll["id"].split('-'); + ltpIdArr.pop(); + let ltpId = ltpIdArr.join("-"); + let svcInstId = this.getValueFromRelationList(ll, "connectivity", "property", "connectivity.etht-svc-name") + .pop() + let svc = this.servicesMap.get(svcInstId); + if (!svc) continue; + let bw = ll["data-source"]; + let uni = { + id: ltpId, + bw: bw + } + svc.unis.push(uni); + } + // Hack: deson't work for more then 2 domain system + for (let ll of thisNg.vpnBindings) { + let svcInstId = this.getValueFromRelationList(ll, "connectivity", "property", "connectivity.etht-svc-name") + .pop(); + let svc = this.servicesMap.get(svcInstId); + let srcNodeId = ll["src-access-node-id"]; + let dstNodeId = ll["dst-access-node-id"]; + let domainId = srcNodeId.split(".")[1]; + let domain = thisNg.domainMap.get(domainId); + if (!svc || !domain){ + continue; + } for (let [, inni] of domain.inniMap){ if (srcNodeId === inni.srcNode.id){ if (dstNodeId === inni.dstNode.id){ svc.otnEdges.push(inni); + break; } } if (dstNodeId === inni.srcNode.id){ if (srcNodeId === inni.dstNode.id){ svc.otnEdges.push(inni); + break; } } } @@ -678,9 +745,19 @@ export class CcvpnNetworkComponent implements OnInit { for (let [key, enni] of this.enniMap) { if (dstNodeId === key.split("-")[0]){ svc.otnEdges.push(enni); + break; + }; + } + } + if (!ll["dst-access-ltp-id"]){ + for (let [key, enni] of this.enniMap) { + if (srcNodeId === key.split("-")[0]){ + svc.otnEdges.push(enni); + break; }; } } + svc.otnEdges = Array.from(new Set(svc.otnEdges)); } } @@ -729,9 +806,9 @@ export class CcvpnNetworkComponent implements OnInit { } else { clientNode.vertex = this.graph.insertVertex(domain.vertex, null, null, 0, 0, 26, 13, this.CPE_STYLE) } - let labelName = nodeName.split('-')[1]; + let ltpName = nodeName.split('-')[1]; clientNode.vertex.value = { - name: nodeName, label: labelName, clientNode: clientNode + name: nodeName, ltpName: ltpName, label: ltpName, clientNode: clientNode, clientName : '' } } // Insert UNI links @@ -744,6 +821,7 @@ export class CcvpnNetworkComponent implements OnInit { maximum: 1000000 / 1000000 + 'G', unused: 1000000 / 1000000 + 'G' } + uni.dstNode.vertex.value.label = uni.readableName; //uni.srcUniTp.edge = uni.edge } // Insert ENNI links @@ -769,47 +847,48 @@ export class CcvpnNetworkComponent implements OnInit { // 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, + let srcNodeId = conn.srcId; + let dstNodeId = conn.dstId; + + let srcNode = getNode(srcNodeId, this.domainMap); + let dstNode = getNode(dstNodeId, this.domainMap); + if(!srcNode.vertex || !dstNode.vertex) { + continue; + }; + let e2eTunnel = { + name: conn.id, 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); } + e2eTunnel.e2eEdge = + this.graph.insertEdge(this.gLayers[2], null, { + tunnel: e2eTunnel, tunnelName: e2eTunnel.name + }, e2eTunnel.srcNode.vertex, e2eTunnel.dstNode.vertex, this.TUNNEL_STYLE) + 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.readVertexLocation()) { + this.clientNodeLabelLayout(); this.centerGraph() + this.autoLayout(2); this.autoLayout(3) + } else { + this.autoLayout(1) + } + + this.changeLayer({ value: 2, name: 'Tunnel layer' }); if (this.serviceSelected){ this.chooseService(this.serviceSelected); } + //this.saveVertexLocation(); function getNode(nodeId, domainMap){ let arr = nodeId.split('.'); return domainMap.get(arr[1]).nodeMap.get(nodeId); @@ -817,6 +896,50 @@ export class CcvpnNetworkComponent implements OnInit { } + // Save the location data of all vertices to local storage + saveVertexLocation() { + if (!this.domainMap.size) return + let domainLocs = [] + for (let [netId, domain] of this.domainMap) { + let domainLoc = { id: netId, rect: mxRectangle.fromRectangle(domain.vertex.geometry), nodeLocs: [], clientNodeLocs: [] } + for (let [nodeId, node] of domain.nodeMap) { + let nodeLoc = { id: nodeId, rect: mxRectangle.fromRectangle(node.vertex.geometry) } + domainLoc.nodeLocs.push(nodeLoc) + } + for (let [nodeId, clientNode] of domain.clientNodeMap) { + let clientNodeLoc = { id: nodeId, rect: mxRectangle.fromRectangle(clientNode.vertex.geometry) } + domainLoc.clientNodeLocs.push(clientNodeLoc) + } + domainLocs.push(domainLoc) + } + this.storage['actn-viewer-vertex'] = JSON.stringify(domainLocs) + } + + // Read the location data of all vertices from local storage + readVertexLocation() { + let stored = this.storage['actn-viewer-vertex'] + if (!stored) return false + let domainLocs = JSON.parse(stored) + if (domainLocs.length != this.domainMap.size) return false + for (let domainLoc of domainLocs) { + let domain = this.domainMap.get(domainLoc.id) + if (!domain || domainLoc.nodeLocs.length != domain.nodeMap.size) return false + domain.vertex.geometry.setRect(domainLoc.rect.x, domainLoc.rect.y, domainLoc.rect.width, domainLoc.rect.height) + for (let nodeLoc of domainLoc.nodeLocs) { + let node = domain.nodeMap.get(nodeLoc.id) + if (!node) return false + node.vertex.geometry.setRect(nodeLoc.rect.x, nodeLoc.rect.y, node.vertex.geometry.width, node.vertex.geometry.height) + } + if (!domainLoc.clientNodeLocs || domainLoc.clientNodeLocs.length != domain.clientNodeMap.size) return false + for (let clientNodeLoc of domainLoc.clientNodeLocs) { + let clientNode = domain.clientNodeMap.get(clientNodeLoc.id) + if (!clientNode) return false + clientNode.vertex.geometry.setRect(clientNodeLoc.rect.x, clientNodeLoc.rect.y, clientNode.vertex.geometry.width, clientNode.vertex.geometry.height) + } + } + return true + } + changeLayer(layer){ this.layerSelected = layer; for (let i = 1; i < this.gLayers.length; i++) { @@ -826,6 +949,7 @@ export class CcvpnNetworkComponent implements OnInit { } chooseService(svcInstId) { + this.serviceSelected = svcInstId; //clear the label and color of all UNI links for (let [, domain] of this.domainMap) { @@ -833,6 +957,7 @@ export class CcvpnNetworkComponent implements OnInit { 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.dstNode.vertex.value.label = uni.readableName uni.edge.value.label = '' uni.edge.value.endpoints = null } @@ -840,19 +965,14 @@ export class CcvpnNetworkComponent implements OnInit { // Update the label and color of UNI links of current service let service = this.servicesMap.get(this.serviceSelected); + console.log("Choosing service: ", service); 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 + for (let uniRecord of service.unis){ + let srcUniLinkId = getShortName(uniRecord.id); + let bw = uniRecord.bw; 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); } } @@ -863,20 +983,17 @@ export class CcvpnNetworkComponent implements OnInit { // clear the label of all inni links for (let [, svc] of this.servicesMap) { - for (let ed of service.otnEdges){ + for (let ed of svc.otnEdges){ this.graph.setCellStyles(mxConstants.STYLE_STROKECOLOR, DEFAULT_COLOR, [ed.edge]) ed.edge.value.label = ''; ed.edge.value.endpoints = null } } // Update the label of inni links of current service - console.log(service); if (service){ let bw = service.bw; - for (let con of service.connections){ - for (let ed of service.otnEdges){ - colorOtnEdge(ed, this.graph, bw); - } + for (let ed of service.otnEdges){ + colorOtnEdge(ed, this.graph, bw); } } this.graph.refresh(); @@ -898,6 +1015,7 @@ export class CcvpnNetworkComponent implements OnInit { 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' ; @@ -908,23 +1026,26 @@ export class CcvpnNetworkComponent implements OnInit { if (!ed.edge.value.endpoints) { ed.edge.value.endpoints = []; } - ed.edge.value.endpoints.push(bandwidth); - let sum = ed.edge.value.endpoints.reduce((a, b) => a + b, 0); - ed.edge.value.label = sum + 'G'; + //ed.edge.value.endpoints.push(bandwidth); + //let sum = ed.edge.value.endpoints.reduce((a, b) => a + b, 0); + //ed.edge.value.label = sum + 'G'; } } - getValueFromRelationList(rl, relatedTo, relatedKey){ - let rlArr: Array<any> = this.getJsonValue(rl, 'relationship-list.relationship'); + getValueFromRelationList(relationshipList, relatedTo, dataOrProperty, relatedKey){ + let rlArr: Array<any> = this.getJsonValue(relationshipList, 'relationship-list.relationship'); let valList : Array<any> = []; + if (!rlArr) return valList; 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']; + let containerName = dataOrProperty === "data"? "relationship-data": "related-to-property"; + let keyString = dataOrProperty === "data"? "relationship-key": "property-key"; + let valString = dataOrProperty === "data"? 'relationship-value' : "property-value"; + + for (let rld of rl[containerName]){ + if (rld[keyString] === relatedKey){ + let val = rld[valString]; if (val) valList.push(val); } } @@ -987,11 +1108,6 @@ export class CcvpnNetworkComponent implements OnInit { document.body.style.cursor = disabled ? 'wait' : 'default' } - choseConnectivity(item) { - if (this.connectivitySelected !== item) this.connectivitySelected = item; - //this.drawService(this.getSvcTree()); - } - _debounce(func: Function, delay: number) { let inDebounce; return function () { @@ -1503,5 +1619,19 @@ export class CcvpnNetworkComponent implements OnInit { getValues(map){ return Array.from(map.values()); } + getTunnels(){ + let svc = this.servicesMap.get(this.serviceSelected); + if (svc){ + let name = svc.name; + return svc.connections.map(({id, srcId, dstId, bw}) => ({ + name: name, + id: id, + srcId: srcId, + dstId: dstId, + bw: bw + })); + } + return []; + } }
\ No newline at end of file |