From 067fe18168fae8b5cf5ac211dcf1f52f476e8bb7 Mon Sep 17 00:00:00 2001 From: decheng zhang Date: Wed, 6 Oct 2021 21:07:43 -0400 Subject: Display CCVPN network topology and tunnel installation. Issue-ID: REQ-1103 Signed-off-by: decheng zhang Change-Id: Ia8ad763ef8cdd48238c1398bd6680cc8ea2d14d6 Signed-off-by: decheng zhang --- usecaseui-portal/.angular-cli.json | 3 +- usecaseui-portal/package-lock.json | 10 + usecaseui-portal/package.json | 2 + usecaseui-portal/src/app/app.module.ts | 2 - usecaseui-portal/src/app/core/services/appEvent.ts | 23 - .../src/app/core/services/appEventType.ts | 4 - .../src/app/core/services/eventQueue.service.ts | 36 - .../core/services/networkHttpservice.service.ts | 8 +- .../app/mock/json/uui-sotn_getConnectivities.json | 141 ++ .../mock/json/uui-sotn_getConnectivityInfo.json | 181 +- .../app/mock/json/uui-sotn_getLogicalLinks.json | 449 +++-- .../app/mock/json/uui-sotn_getNetworkPolicy.json | 45 + .../app/mock/json/uui-sotn_getNetworkRoutes.json | 100 + .../src/app/mock/json/uui-sotn_getPnfs.json | 683 +++++++ .../mock/json/uui-sotn_getServiceInstances.json | 129 ++ .../src/app/mock/json/uui-sotn_getUuis.json | 25 + .../src/app/mock/json/uui-sotn_getVpnBindings.json | 40 + usecaseui-portal/src/app/mock/routes.js | 2 + .../ccvpn-network/ccvpn-network.component.css | 11 +- .../ccvpn-network/ccvpn-network.component.html | 82 +- .../ccvpn-network/ccvpn-network.component.ts | 2122 ++++++++++++-------- usecaseui-portal/src/assets/i18n/cn.json | 2 + usecaseui-portal/src/assets/i18n/en.json | 2 + usecaseui-portal/tsconfig.json | 2 + 24 files changed, 2933 insertions(+), 1171 deletions(-) delete mode 100644 usecaseui-portal/src/app/core/services/appEvent.ts delete mode 100644 usecaseui-portal/src/app/core/services/appEventType.ts delete mode 100644 usecaseui-portal/src/app/core/services/eventQueue.service.ts create mode 100644 usecaseui-portal/src/app/mock/json/uui-sotn_getConnectivities.json create mode 100644 usecaseui-portal/src/app/mock/json/uui-sotn_getNetworkPolicy.json create mode 100644 usecaseui-portal/src/app/mock/json/uui-sotn_getNetworkRoutes.json create mode 100644 usecaseui-portal/src/app/mock/json/uui-sotn_getPnfs.json create mode 100644 usecaseui-portal/src/app/mock/json/uui-sotn_getServiceInstances.json create mode 100644 usecaseui-portal/src/app/mock/json/uui-sotn_getUuis.json create mode 100644 usecaseui-portal/src/app/mock/json/uui-sotn_getVpnBindings.json diff --git a/usecaseui-portal/.angular-cli.json b/usecaseui-portal/.angular-cli.json index 5535fc3a..0e26a485 100644 --- a/usecaseui-portal/.angular-cli.json +++ b/usecaseui-portal/.angular-cli.json @@ -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": { diff --git a/usecaseui-portal/package-lock.json b/usecaseui-portal/package-lock.json index c8f7e019..f1fedf8a 100644 --- a/usecaseui-portal/package-lock.json +++ b/usecaseui-portal/package-lock.json @@ -327,6 +327,11 @@ "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", @@ -7697,6 +7702,11 @@ "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", diff --git a/usecaseui-portal/package.json b/usecaseui-portal/package.json index 34a384c3..27dda82d 100644 --- a/usecaseui-portal/package.json +++ b/usecaseui-portal/package.json @@ -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", diff --git a/usecaseui-portal/src/app/app.module.ts b/usecaseui-portal/src/app/app.module.ts index 1bf1b652..bc2daea0 100644 --- a/usecaseui-portal/src/app/app.module.ts +++ b/usecaseui-portal/src/app/app.module.ts @@ -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 index 775eced9..00000000 --- a/usecaseui-portal/src/app/core/services/appEvent.ts +++ /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 { - 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 index e5369a8c..00000000 --- a/usecaseui-portal/src/app/core/services/appEventType.ts +++ /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 index e4c32c38..00000000 --- a/usecaseui-portal/src/app/core/services/eventQueue.service.ts +++ /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>(); - - on(eventType: AppEventType): Observable> { - return this.eventBroker.pipe(filter(event => event.type === eventType)); - } - - dispatch(event: AppEvent): void { - this.eventBroker.next(event); - } - -} \ No newline at end of file diff --git a/usecaseui-portal/src/app/core/services/networkHttpservice.service.ts b/usecaseui-portal/src/app/core/services/networkHttpservice.service.ts index 0959f564..0e16966a 100644 --- a/usecaseui-portal/src/app/core/services/networkHttpservice.service.ts +++ b/usecaseui-portal/src/app/core/services/networkHttpservice.service.ts @@ -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(this.url["getConnectivities"]); } + getNetworkRoutes(){ + return this.http.get(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 index 00000000..b01c6fee --- /dev/null +++ b/usecaseui-portal/src/app/mock/json/uui-sotn_getConnectivities.json @@ -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 diff --git a/usecaseui-portal/src/app/mock/json/uui-sotn_getConnectivityInfo.json b/usecaseui-portal/src/app/mock/json/uui-sotn_getConnectivityInfo.json index a43c8c45..49364170 100644 --- a/usecaseui-portal/src/app/mock/json/uui-sotn_getConnectivityInfo.json +++ b/usecaseui-portal/src/app/mock/json/uui-sotn_getConnectivityInfo.json @@ -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", @@ -16,23 +16,43 @@ "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" @@ -64,6 +84,17 @@ } ] }, + { + "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", @@ -75,14 +106,39 @@ } ] }, + { + "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": [ @@ -96,7 +152,7 @@ } }, { - "connectivity-id": "c648ddff-7abe-44ba-946f-8d7a4fa2691b", + "connectivity-id": "e97f233f-02ce-4e5f-a2ab-382f994719ce", "bandwidth-profile-name": "3", "vpn-type": "mdsc", "cir": "3000000", @@ -106,7 +162,7 @@ "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": [ { @@ -134,6 +190,17 @@ } ] }, + { + "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", @@ -156,14 +223,39 @@ } ] }, + { + "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": [ @@ -176,11 +268,11 @@ { "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": [ @@ -194,13 +286,13 @@ } }, { - "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", @@ -210,23 +302,43 @@ "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" @@ -269,14 +381,39 @@ } ] }, + { + "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": [ diff --git a/usecaseui-portal/src/app/mock/json/uui-sotn_getLogicalLinks.json b/usecaseui-portal/src/app/mock/json/uui-sotn_getLogicalLinks.json index 4ee81b6b..c8150b51 100644 --- a/usecaseui-portal/src/app/mock/json/uui-sotn_getLogicalLinks.json +++ b/usecaseui-portal/src/app/mock/json/uui-sotn_getLogicalLinks.json @@ -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": [ @@ -31,15 +31,15 @@ { "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": [ @@ -52,62 +52,76 @@ } }, { - "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": [ @@ -119,15 +133,15 @@ { "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": [ @@ -140,25 +154,32 @@ } }, { - "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": [ @@ -170,15 +191,15 @@ { "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": [ @@ -191,48 +212,48 @@ } }, { - "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": [ @@ -244,15 +265,15 @@ { "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": [ @@ -265,25 +286,25 @@ } }, { - "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": [ @@ -295,7 +316,7 @@ { "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", @@ -303,7 +324,7 @@ }, { "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": [ @@ -316,25 +337,25 @@ } }, { - "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": [ @@ -346,15 +367,15 @@ { "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": [ @@ -367,33 +388,32 @@ } }, { - "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": [ @@ -405,7 +425,7 @@ { "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", @@ -413,7 +433,7 @@ }, { "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": [ @@ -426,25 +446,25 @@ } }, { - "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": [ @@ -456,15 +476,15 @@ { "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": [ @@ -477,25 +497,25 @@ } }, { - "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": [ @@ -507,15 +527,15 @@ { "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": [ @@ -528,32 +548,25 @@ } }, { - "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": [ @@ -565,15 +578,15 @@ { "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": [ @@ -586,50 +599,87 @@ } }, { - "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" } ] } @@ -637,25 +687,39 @@ } }, { - "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": [ @@ -667,15 +731,15 @@ { "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": [ @@ -688,25 +752,48 @@ } }, { - "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": [ @@ -718,15 +805,15 @@ { "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": [ @@ -739,32 +826,32 @@ } }, { - "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": [ @@ -776,7 +863,7 @@ { "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", @@ -784,7 +871,7 @@ }, { "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": [ @@ -795,14 +882,6 @@ } ] } - }, - { - "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 index 00000000..3073ba3e --- /dev/null +++ b/usecaseui-portal/src/app/mock/json/uui-sotn_getNetworkPolicy.json @@ -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 index 00000000..713a3add --- /dev/null +++ b/usecaseui-portal/src/app/mock/json/uui-sotn_getNetworkRoutes.json @@ -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 index 00000000..1b8ad992 --- /dev/null +++ b/usecaseui-portal/src/app/mock/json/uui-sotn_getPnfs.json @@ -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 index 00000000..9ff3424b --- /dev/null +++ b/usecaseui-portal/src/app/mock/json/uui-sotn_getServiceInstances.json @@ -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 index 00000000..2339b3da --- /dev/null +++ b/usecaseui-portal/src/app/mock/json/uui-sotn_getUuis.json @@ -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 index 00000000..c150d591 --- /dev/null +++ b/usecaseui-portal/src/app/mock/json/uui-sotn_getVpnBindings.json @@ -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 diff --git a/usecaseui-portal/src/app/mock/routes.js b/usecaseui-portal/src/app/mock/routes.js index 8c59104a..49086165 100644 --- a/usecaseui-portal/src/app/mock/routes.js +++ b/usecaseui-portal/src/app/mock/routes.js @@ -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", diff --git a/usecaseui-portal/src/app/views/network/ccvpn-network/ccvpn-network.component.css b/usecaseui-portal/src/app/views/network/ccvpn-network/ccvpn-network.component.css index e1a1d6e4..e2abdfc5 100644 --- a/usecaseui-portal/src/app/views/network/ccvpn-network/ccvpn-network.component.css +++ b/usecaseui-portal/src/app/views/network/ccvpn-network/ccvpn-network.component.css @@ -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. @@ -36,11 +37,19 @@ #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; 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 48d01d36..c9e150fa 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 @@ -1,5 +1,6 @@ -

+

Network Topology:

-
+

There is not any terminal device can be used for configuration @@ -65,6 +76,55 @@

No network available

+
+
+ + + + Service Instance Id + Service Type + VLAN + Bandwidth + Status + + + + + + {{ data.id }} + Cloud Lease Line + {{ data.vlan }} + {{ data.bw }} + + Activated + + + + + +
+
+
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 d1e40672..6acdfa66 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 @@ -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. @@ -13,13 +14,46 @@ 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() + 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 += '' + key + ': ' + 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} 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(), + localLinkMap: new Map(), + inniMap: new Map(), + uniMap: new Map(), + clientNodeMap: new Map() + } + 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 = new Array(); + let domainLocal:any = null; + let linkId = this.getJsonValue(ll, 'link-id'); + let rlArr: Array = 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 = new Array(); + let domainLocal:any = null; + let linkId = this.getJsonValue(ll, 'link-id'); + let rlArr: Array = 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#" + this.svcContainerOpt.containerId).append(toolbar); - toolbar.append($("\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "")); - toolbar.append($("\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "")); - toolbar.append($("\n" + - "\n" + - " \n" + - " \n \n" + - " \n" + - " \n" + - "")); - let library = $("
"); - toolbar.append(library); - - ['PON', 'ETH'].forEach(function(type) { - var new_btn; - new_btn = $("\n" + - " \n" + - " \n" + - " " + (type) + " UNI \n" + - " " + - " \n" + - ""); - 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} nodes parsed from AAI logicalLinks. - * @param {Array} lines parsed from AAI logicalLinks. - */ - drawTopo(nodes: Array, lines: Array){ - 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 = 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 { - 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) : Array{ - 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, ptMapping: Array) : Array { - 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) { - 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 diff --git a/usecaseui-portal/src/assets/i18n/cn.json b/usecaseui-portal/src/assets/i18n/cn.json index ad9d855e..f6f91975 100644 --- a/usecaseui-portal/src/assets/i18n/cn.json +++ b/usecaseui-portal/src/assets/i18n/cn.json @@ -154,6 +154,8 @@ "i18nTextDefine_HostUrl": "主机网址", "i18nTextDefine_deleteLink": "删除链接", "i18nTextDefine_Connectivty": "L3业务实例", + "i18nTextDefine_CCVPNLayer": "网络层", + "i18nTextDefine_CCVPNService": "业务名", "sotn-component": "--:", "i18nTextDefine_subscriptionType": "订购类型", diff --git a/usecaseui-portal/src/assets/i18n/en.json b/usecaseui-portal/src/assets/i18n/en.json index 034262b2..6885783e 100644 --- a/usecaseui-portal/src/assets/i18n/en.json +++ b/usecaseui-portal/src/assets/i18n/en.json @@ -148,6 +148,8 @@ "i18nTextDefine_HostUrl": "Host Url", "i18nTextDefine_DeleteLink": "Delete Link", "i18nTextDefine_Connectivity": "Connectivity", + "i18nTextDefine_CCVPNLayer": "Layer", + "i18nTextDefine_CCVPNService": "Service", "sotn-component": "--:", "i18nTextDefine_subscriptionType": "Service Type", diff --git a/usecaseui-portal/tsconfig.json b/usecaseui-portal/tsconfig.json index 94f4fc06..0b442232 100644 --- a/usecaseui-portal/tsconfig.json +++ b/usecaseui-portal/tsconfig.json @@ -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" -- cgit 1.2.3-korg