summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--usecaseui-portal/.angular-cli.json3
-rw-r--r--usecaseui-portal/package-lock.json10
-rw-r--r--usecaseui-portal/package.json2
-rw-r--r--usecaseui-portal/src/app/app.module.ts2
-rw-r--r--usecaseui-portal/src/app/core/services/appEvent.ts23
-rw-r--r--usecaseui-portal/src/app/core/services/appEventType.ts4
-rw-r--r--usecaseui-portal/src/app/core/services/eventQueue.service.ts36
-rw-r--r--usecaseui-portal/src/app/core/services/networkHttpservice.service.ts8
-rw-r--r--usecaseui-portal/src/app/mock/json/uui-sotn_getConnectivities.json141
-rw-r--r--usecaseui-portal/src/app/mock/json/uui-sotn_getConnectivityInfo.json181
-rw-r--r--usecaseui-portal/src/app/mock/json/uui-sotn_getLogicalLinks.json449
-rw-r--r--usecaseui-portal/src/app/mock/json/uui-sotn_getNetworkPolicy.json45
-rw-r--r--usecaseui-portal/src/app/mock/json/uui-sotn_getNetworkRoutes.json100
-rw-r--r--usecaseui-portal/src/app/mock/json/uui-sotn_getPnfs.json683
-rw-r--r--usecaseui-portal/src/app/mock/json/uui-sotn_getServiceInstances.json129
-rw-r--r--usecaseui-portal/src/app/mock/json/uui-sotn_getUuis.json25
-rw-r--r--usecaseui-portal/src/app/mock/json/uui-sotn_getVpnBindings.json40
-rw-r--r--usecaseui-portal/src/app/mock/routes.js2
-rw-r--r--usecaseui-portal/src/app/views/network/ccvpn-network/ccvpn-network.component.css11
-rw-r--r--usecaseui-portal/src/app/views/network/ccvpn-network/ccvpn-network.component.html82
-rw-r--r--usecaseui-portal/src/app/views/network/ccvpn-network/ccvpn-network.component.ts2122
-rw-r--r--usecaseui-portal/src/assets/i18n/cn.json2
-rw-r--r--usecaseui-portal/src/assets/i18n/en.json2
-rw-r--r--usecaseui-portal/tsconfig.json2
24 files changed, 2933 insertions, 1171 deletions
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 f9c7a6f4..3e0c46e9 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";
@@ -136,7 +135,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<T> {
- constructor(
- public type: AppEventType,
- public payload: T,
- ) {}
-} \ No newline at end of file
diff --git a/usecaseui-portal/src/app/core/services/appEventType.ts b/usecaseui-portal/src/app/core/services/appEventType.ts
deleted file mode 100644
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<AppEvent<any>>();
-
- on(eventType: AppEventType): Observable<AppEvent<any>> {
- return this.eventBroker.pipe(filter(event => event.type === eventType));
- }
-
- dispatch<T>(event: AppEvent<T>): void {
- this.eventBroker.next(event);
- }
-
-} \ No newline at end of file
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<any>(this.url["getConnectivities"]);
}
+ getNetworkRoutes(){
+ return this.http.get<any>(this.url["getNetworkRoutes"]);
+ }
//Create an external cloud newwork interface
createNetwrok(paramsObj) {
diff --git a/usecaseui-portal/src/app/mock/json/uui-sotn_getConnectivities.json b/usecaseui-portal/src/app/mock/json/uui-sotn_getConnectivities.json
new file mode 100644
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"
@@ -67,6 +87,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",
"related-link": "/aai/v24/network/unis/uni/networkId-providerId-10-clientId-0-topologyId-2-nodeId-10.1.1.3-ltpId-1000001",
"relationship-data": [
{
@@ -76,13 +107,38 @@
]
},
{
+ "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": [
{
@@ -137,6 +193,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",
"related-link": "/aai/v24/network/unis/uni/networkId-providerId-10-clientId-0-topologyId-2-nodeId-10.1.1.3-ltpId-1000001",
"relationship-data": [
{
@@ -157,13 +224,38 @@
]
},
{
+ "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"
@@ -270,13 +382,38 @@
]
},
{
+ "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 @@
<!--
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.
@@ -21,36 +22,46 @@
<i class="icon">
<img src="assets/images/service-type.png"alt="">
</i>
- {{"i18nTextDefine_Connectivity" | translate}} :
+ {{"i18nTextDefine_CCVPNLayer" | translate}} :
</span>
<nz-dropdown [nzTrigger]="'click'" [nzPlacement]="'bottomLeft'">
- <button nz-button nz-dropdown><span>{{connectivitySelected.name}}</span> <i class="anticon anticon-down"></i>
+ <button nz-button nz-dropdown><span>{{layerSelected.name}}</span> <i class="anticon anticon-down"></i>
</button>
<ul nz-menu>
- <li nz-menu-item (click)="choseConnectivity(item)" *ngFor="let item of connectivityList">
+ <li nz-menu-item (click)="changeLayer(item)" *ngFor="let item of layerList">
<a title="{{item.name}}">{{item.name}}</a>
</li>
</ul>
</nz-dropdown>
+ <span>
+ <i class="icon">
+ <img src="assets/images/service-type.png"alt="">
+ </i>
+ {{"i18nTextDefine_CCVPNService" | translate}} :
+ </span>
+ <nz-dropdown [nzTrigger]="'click'" [nzPlacement]="'bottomLeft'">
+ <button nz-button nz-dropdown><span>{{serviceSelected}}</span> <i class="anticon anticon-down"></i>
+ </button>
+ <ul nz-menu>
+ <li nz-menu-item (click)="chooseService(svcInstId)" *ngFor="let svcInstId of getKeys(servicesMap)">
+ <a title="{{svcInstId}}">{{svcInstId}}</a>
+ </li>
+ </ul>
+ </nz-dropdown>
<!-- <button class="create" nz-button [nzType]="'primary'" (click)="createModal()">
<i *ngIf="width>1200" class="anticon anticon-plus"></i>
<span> {{"i18nTextDefine_Create" | translate}} </span>
</button>-->
</div>
- <h2 *ngIf="!nonetwork" [ngClass]="{'title-modelshow':isVisible == true}">
+ <!-- <h2 *ngIf="!nonetwork" [ngClass]="{'title-modelshow':isVisible == true}">
Please configure network links for registered devices and partner system.
- </h2>
- <h3 [ngClass]="{'title-modelshow':isVisible == true}">
- Service Instances:
- </h3>
- <div id="svcContainer" style="overflow: hidden;">
- </div>
+ </h2> -->
<h3 [ngClass]="{'title-modelshow':isVisible == true}">
Network Topology:
</h3>
- <div id="tpContainer" style="overflow: hidden;">
+ <div #tpContainer id="tpContainer" style="overflow: hidden;">
<div *ngIf="nonetwork" style="padding: 20px">
<h2>
There is not any terminal device can be used for configuration
@@ -65,6 +76,55 @@
<p>No network available</p>
</div>
</div>
+ <div class="slicing-resource-table">
+ <div class="slicing-resource-table-list">
+ <nz-table
+ #basicTable
+ [nzData]="getValues(servicesMap)"
+ [nzFrontPagination]="false"
+ nzShowSizeChanger
+ [nzPageSizeOptions]="[6,8,10]"
+ >
+ <thead>
+ <tr>
+ <th>Service Instance Id</th>
+ <th>Service Type</th>
+ <th>VLAN</th>
+ <th>Bandwidth</th>
+ <th>Status</th>
+ </tr>
+ </thead>
+ <tbody>
+ <ng-template ngFor let-data [ngForOf]="basicTable.data" let-i="index">
+ <tr>
+ <td>{{ data.id }}</td>
+ <td>Cloud Lease Line</td>
+ <td>{{ data.vlan }}</td>
+ <td>{{ data.bw }}</td>
+ <td>
+ Activated
+ </td>
+ </tr>
+ </ng-template>
+ </tbody>
+ </nz-table>
+ </div>
+ </div>
+ <!--<div #tableContainer id="tableContainer" style="overflow: hidden;">
+ <div *ngIf="nonetwork" style="padding: 20px">
+ <h2>
+ There is not any terminal device can be used for configuration
+ </h2>
+ <br>
+ <h2>
+ please register external network into ONAP.
+ </h2>
+ </div>
+ <div class="no-network" *ngIf="nonetwork">
+ <img src="assets/images/no-network-available.png" alt="No network available">
+ <p>No network available</p>
+ </div>
+ </div> -->
<!--Popup-->
<div class="creation" id="d3_form" *ngIf="isVisible==true">
<span class="v_color"></span>
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<any, any>()
+ enniMap = new Map()
+ sliceMap = new Map()
+ tunnelsMap = new Map()
+ e2eTunnels = []
+ e2eTunnelMap = new Map()
+ servicesMap = new Map()
+ e2eServices = []
+ e2eServiceMap = new Map()
+ defBandwidth = 1
+ currentLayer = 1
+ currentCloud = ''
+ currentSlice = 'Physical'
+ isNodeName = true
+ isMoreLabels = true
+ storage = window.localStorage
+
+ graph = null;
+ gLayers = [];
+ graphScale = 1;
+ tunnelTable = null;
+ serviceTable = null;
+ edgeLayout = null;
+ organicLayout = null;
+ stackLayout = null;
+
+ // Constants
+ readonly DOMAIN_STYLE = 'fillColor=' + DOMAIN_COLOR + ';shape=rectangle;strokeColor=none;gradientColor=none;' +
+ 'verticalLabelPosition=top;verticalAlign=bottom;autosize=1;resizable=1;rounded=1;opacity=50;fontStyle=1';
+ readonly CPE_STYLE = 'fillColor=' + CE_COLOR + ';shape=rectangle;rounded=1';
+ readonly CLOUD_STYLE = 'fillColor=' + CE_COLOR + ';shape=cloud';
+ readonly LINK_STYLE = 'strokeWidth=3;edgeStyle=null'
+ readonly UNI_LINK_STYLE = 'strokeWidth=2;edgeStyle=null;strokeColor=' + CE_COLOR
+ readonly TUNNEL_STYLE = 'strokeWidth=2;curved=1'
+ readonly SERVICE_STYLE = 'strokeWidth=1;curved=1'
+
+ ngAfterViewInit() {
let thisNg = this;
- this.isSpinning = true;
- this.myhttp.getConnectivities()
- .subscribe((data) => {
- if(data){
- for (let conn of data["connectivity"]) {
- if (conn["vpn-type"] === "mdsc"){
- this.connectivityList.push({ "name": conn["connectivity-id"],
- "id": conn["connectivity-id"],
- "relationship-list" : conn["relationship-list"]
- });
- }
+ this.graph = new mxGraph(this.graphContainer.nativeElement);
+ this.graph.setPanning(true)
+ this.graph.setTooltips(true)
+ this.graph.setHtmlLabels(true)
+ this.graph.cellsDisconnectable = false
+ this.graph.cellsEditable = false
+ this.graph.cellsCloneable = false
+ this.graph.foldingEnabled = false
+ this.graph.edgeLabelsMovable = false
+ this.graph.autoExtend = false
+ this.graph.gridEnabled = false
+ this.graph.model.maintainEdgeParent = false;
+ this.graphScale = 1;
+
+ new mxRubberband(this.graph);
+ new mxKeyHandler(this.graph);
+ //mxLog.show = () => { }
+ mxConstants.VERTEX_SELECTION_STROKEWIDTH = 1
+ mxConstants.EDGE_SELECTION_STROKEWIDTH = 5
+ // mxConstants.EDGE_SELECTION_DASHED = false
+ mxConstants.LOCKED_HANDLE_FILLCOLOR = 'none'
+ mxConstants.HANDLE_STROKECOLOR = 'none'
+ mxConstants.INVALID_COLOR = '#000000'
+ // Keeps the font sizes independent of the scale
+ mxCellRenderer.prototype.getTextScale = function (state) {
+ return 1
+ }
+ mxVertexHandler.prototype.constrainGroupByChildren = true
+ mxGraphHandler.prototype.maxLivePreview = 16
+ mxGraphHandler.prototype.removeCellsFromParent = false
+ mxGraphHandler.prototype.isPropagateSelectionCell =
+ function (cell, immediate, me) {
+ return false
+ }
+ const CELL_ADDED = mxGraphSelectionModel.prototype.cellAdded
+ mxGraphSelectionModel.prototype.cellAdded = function (cell) {
+ CELL_ADDED.call(this, cell)
+ if (cell.isEdge()) this.addCells([cell.source, cell.target])
+ }
+ const CELL_REMOVED = mxGraphSelectionModel.prototype.cellRemoved
+ mxGraphSelectionModel.prototype.cellRemoved = function (cell) {
+ CELL_REMOVED.call(this, cell)
+ if (cell.isVertex()) {
+ this.removeCells(cell.edges)
+ }
+ }
+
+ // Creates a layout algorithm to be used with the graph
+ this.organicLayout = new mxFastOrganicLayout(this.graph);
+ // Moves stuff wider apart than usual 50
+ this.organicLayout.forceConstant = 80;
+ this.stackLayout = new mxStackLayout(this.graph)
+ this.edgeLayout = new mxParallelEdgeLayout(this.graph)
+ this.edgeLayout.spacing = 15
+
+ // Sets default vertex style
+ this.setObjValues(this.graph.stylesheet.getDefaultVertexStyle(), {
+ STYLE_SHAPE: mxConstants.SHAPE_ELLIPSE,
+ STYLE_PERIMETER: mxPerimeter.EllipsePerimeter,
+ STYLE_FILLCOLOR: NODE_COLOR,
+ STYLE_GRADIENTCOLOR: 'white',
+ STYLE_STROKECOLOR: '#1B78C8',
+ STYLE_FONTCOLOR: FONT_COLOR,
+ STYLE_FONTSIZE: '14',
+ STYLE_VERTICAL_LABEL_POSITION: 'bottom',
+ STYLE_VERTICAL_ALIGN: 'top',
+ STYLE_RESIZABLE: '0',
+ }, mxConstants)
+
+ // Sets default edge style
+ this.setObjValues(this.graph.stylesheet.getDefaultEdgeStyle(), {
+ STYLE_FONTCOLOR: 'black',
+ STYLE_FONTSIZE: '14',
+ STYLE_STROKECOLOR: 'black',
+ STYLE_EDGE: mxEdgeStyle.TopToBottom,
+ STYLE_ENDARROW: 'none',
+ STYLE_LABEL_BACKGROUNDCOLOR: 'white',
+ STYLE_TEXT_OPACITY: '70',
+ }, mxConstants)
+
+ // Gets label from custom user object
+ // TODO:
+ this.graph.convertValueToString = function (cell) {
+ if (cell.isEdge() && !cell.value.uni && !this.isMoreLabels) return ''
+ return (cell.value && cell.value.label) ? cell.value.label : '';
+ }
+
+ // Installs a custom tooltip for cells
+ this.graph.getTooltipForCell = function (cell) {
+ let tooltip = ''
+ for (let key of Object.keys(cell.value).sort()) {
+ if (key === 'label' || cell.value[key] === '' || key[0] == '$' ||
+ !thisNg.isBasicType(cell.value[key])) continue
+ tooltip += '<b>' + key + ': </b>' + cell.value[key] + '\n'
+ }
+ return tooltip
+ }
+
+ // Installs a popupmenu handler.
+ this.graph.popupMenuHandler.factoryMethod = this.createPopupMenu
+ document.body.onmousedown = function () {
+ let popupMenu = document.body.getElementsByClassName('mxPopupMenu')
+ if (popupMenu.length) document.body.removeChild(popupMenu[0])
+ }
+
+ var dragStatus = 0
+ // Listen to the Mouseup event to update table and json data view
+ this.graph.addMouseListener({
+ mouseDown: function (sender, evt) {
+ dragStatus = 1
+ },
+ mouseMove: function (sender, evt) {
+ if (dragStatus == 1) dragStatus = 2
+ },
+ mouseUp: function (sender, evt) {
+ if (dragStatus == 2) {
+ if (sender.getSelectionCount() >= 1) {
+ this.clientNodeLabelLayout()
}
- if (this.connectivityList.length !== 0) {
- this.connectivitySelected = this.connectivityList[0];
- this.choseConnectivity(this.connectivitySelected);
+ }
+ dragStatus = 0
- };
+ this.deselectTableRow()
+ let cell = null
+ if (!evt.evt.defaultPrevented) {
+ if (!evt.state) return
+ else cell = evt.state.cell
+ } else {
+ if (sender.getSelectionCount() == 1) {
+ cell = sender.getSelectionCell()
+ } else if (sender.getSelectionCount() == 3) {
+ for (let item of sender.getSelectionCells()) {
+ if (item.isEdge()) {
+ if (!cell) cell = item
+ else {
+ cell = null;
+ break
+ }
+ }
+ }
+ }
}
- },
- (err) => {
- console.log(err);
- });
+ if (!cell || !cell.value) {
+ return
+ }
+ let obj = null
+ if (obj = cell.value.controller) {
+ this.showJsonData([obj], false)
+ } else if (obj = cell.value.node) {
+ this.showJsonData(obj.uniSliceMap.get(this.currentSlice), false)
+ } else if (obj = cell.value.enni) {
+ this.showJsonData([obj.data[0].link.data, obj.data[1].link.data], false)
+ } else if (obj = cell.value.inni) {
+ this.showJsonData([obj.data[0].data, obj.data[1].data], false)
+ } else if (obj = cell.value.uni) {
+ this.showJsonData(obj.data, false)
+ } else if (obj = cell.value.tunnel) {
+ this.selectTableRow(cell.value.index)
+ this.showJsonData(this.tunnelsMap.get(obj.name), false)
+ } else if (obj = cell.value.service) {
+ this.selectTableRow(cell.value.index)
+ this.showJsonData(this.servicesMap.get(obj.name), false)
+ }
+ }
+ })
+
+ this.isSpinning = true;
+ let reqCount = 0;
+
+ reqCount++;
this.myhttp.getLogicalLinksData()
.subscribe((data) => {
if (data) {
- for (let ll of data["logical-link"]){
- // Filter layer1 logical link
- //if (ll["relationship-list"] !== undefined &&
- // ll["relationship-list"]["relationship"].length) {
+ for (let ll of data["logical-link"]) {
thisNg.logicalLinks.push(ll);
- //}
}
- let tpMapping = thisNg.getPnfTpMapping(thisNg.logicalLinks);
+ }
+ if (--reqCount == 0) {
+ thisNg.finishNetworkView();
+ this.isSpinning = false;
+ }
+ },
+ (err) => {
+ console.log(err);
+ })
- let links = thisNg.getLinks( thisNg.logicalLinks, tpMapping);
- let tps = thisNg.getNodes(tpMapping);
- console.log(links);
- console.log(tps);
+ reqCount++;
+ this.myhttp.getPnfsData()
+ .subscribe((data) => {
+ if (data) {
+ for (let ll of data["pnf"]) {
+ thisNg.pnfs.push(ll);
+ }
+ }
+ if (--reqCount == 0) {
+ thisNg.finishNetworkView();
+ this.isSpinning = false;
+ }
+ },
+ (err) => {
+ console.log(err);
+ })
- thisNg.drawTopo(tps, links);
+ reqCount++;
+ this.myhttp.getConnectivities()
+ .subscribe((data) => {
+ if (data) {
+ for (let ll of data["connectivity"]) {
+ thisNg.connectivities.push(ll);
+ }
+ }
+ if (--reqCount == 0) {
+ thisNg.finishNetworkView();
+ this.isSpinning = false;
+ }
+ },
+ (err) => {
+ console.log(err);
+ })
+ reqCount++;
+ this.myhttp.getNetworkRoutes()
+ .subscribe((data) => {
+ if (data) {
+ for (let ll of data["network-route"]) {
+ thisNg.networkroutes.push(ll);
+ }
+ }
+ if (--reqCount == 0) {
+ thisNg.finishNetworkView();
+ this.isSpinning = false;
}
- this.isSpinning = false;
},
(err) => {
console.log(err);
- })
+ })
}
connectivityList = [];
- connectivitySelected = { name: null, id: null };
+ connectivitySelected = {name: null, id: null};
+ serviceGraphModel: { [k: string]: any } = {};
+
+ layerList = [
+ { value: 3, name: 'Service layer' },
+ { value: 2, name: 'Tunnel layer' },
+ { value: 1, name: 'Link layer' }]
+ layerSelected = { value: 1, name: 'Link layer' }
+ serviceList = [];
+ serviceSelected = '';
+
addLinkDisabled = true;
nonetwork = false;
@@ -95,10 +371,14 @@ export class CcvpnNetworkComponent implements OnInit {
isSpinning = true;
pnfs = [];
+ logicalLinks = [];//logicalLinks Existing connection data returned by the interface
+ connectivities = [];
+ networkroutes = [];
+
layer1Tps = [];
d3Data = [];//D3Render the required data
- logicalLinks = [];//logicalLinks Existing connection data returned by the interface
+
linkName = null;//Linked name link-name
networkOption = [];//Form network drop-down box filled data
nodeOption1 = {};//Node drop-down box filled data
@@ -139,19 +419,8 @@ export class CcvpnNetworkComponent implements OnInit {
charge = -300;
SEPERATOR = '-';
-
- imgMap = {
- 'pnf': 'assets/images/site.png',
- 'tp': 'assets/images/tp.png'
- };
-
- //### SELECTION - store the selected node ###
- //### EDITING - store the drag mode (either 'drag' or 'add_link') ###
- svcEditorGlobal = {
- selection: null
- }
svcContainerOpt = {
- containerId : "svcContainer",
+ containerId: "svcContainer",
width: 1000,
height: this.winHeight
};
@@ -163,907 +432,990 @@ export class CcvpnNetworkComponent implements OnInit {
height: this.winHeight
};
- /**
- * Redraw the selected L2 ethernet service.
- * @param {Array<object>} treeData parsed from AAI connectivity.
- */
- drawService(treeData) {
- //Model of service graph
- let graph = {
- nodes: [
- ],
- links: [
- ],
- objectify: (function() {
- /* resolve node IDs (not optimized at all!)
- */
- var l, n, _i, _len, _ref, _results;
- _ref = graph.links;
- _results = [];
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- l = _ref[_i];
- _results.push((function() {
- var _j, _len2, _ref2, _results2;
- _ref2 = graph.nodes;
- _results2 = [];
- for (_j = 0, _len2 = _ref2.length; _j < _len2; _j++) {
- n = _ref2[_j];
- if (l.source === n.id) {
- l.source = n;
- continue;
- }
- if (l.target === n.id) {
- l.target = n;
- continue;
- } else {
- _results2.push(void 0);
+ finishNetworkView() {
+ this.updateTopoData();
+ console.log(this.domainMap);
+ this.finishSotnView();
+ }
+
+ updateTopoData(){
+ let thisNg = this;
+ // Update the network topo data
+ // Update node data
+ for (let pnf of thisNg.pnfs){
+ let pnfId = pnf["pnf-id"];
+ let arr = pnfId.split('.');
+ let domainId = arr[1];
+ let domain = thisNg.domainMap.get(domainId);
+ if (!domain){
+ let sotnDomain = {
+ domainId : domainId,
+ nodeMap: new Map<any, any>(),
+ localLinkMap: new Map<any, any>(),
+ inniMap: new Map<any, any>(),
+ uniMap: new Map<any, any>(),
+ clientNodeMap: new Map<any, any>()
+ }
+ thisNg.domainMap.set(domainId, sotnDomain);
+ domain = sotnDomain;
+ }
+ let node = {
+ id: pnfId,
+ name: pnfId
+ }
+ domain.nodeMap.set(pnfId, node);
+ }
+
+ // Update serive data
+ for (let cn of this.connectivities){
+ if (cn['vpn-type'] === "mdsc"){
+ let svcInstId = this.getValueFromRelationList(cn, "service-instance", "service-instance.service-instance-id");
+ let bw = cn["bandwidth-profile-name"];
+ let cvlan = cn["cvlan"];
+ let svc = this.servicesMap.get(svcInstId);
+ if (!svc){
+ svc = {
+ name: svcInstId,
+ id: svcInstId,
+ connections: [],
+ bw : bw,
+ vlan : cvlan
+ }
+ this.servicesMap.set(svcInstId, svc);
+ }
+ if (!this.serviceSelected){
+ this.serviceSelected = svcInstId;
+ }
+ }
+ }
+ // Update link data
+ for (let ll of thisNg.logicalLinks) {
+ let linkName = ll["link-name"];
+ let linkType = ll["link-type"];
+ let linkRole = ll["link-role"];
+ let linkId = ll["link-id"];
+
+ if (linkName.search("topologyId-2") >= 0) {
+ // uni links
+ let arr = linkId.split('-');
+ let arr1 = arr[0].split('.');
+ let domainId = arr1[1];
+ let domain = thisNg.domainMap.get(domainId);
+ let remoteNode = domain.nodeMap.get(arr[0]);
+ if (!remoteNode) continue;
+ let cpeNode = {
+ networkNode: remoteNode,
+ isCloud: arr[1].length <= 3 ? true: false
+ }
+
+ if (!domain) continue;
+ domain.clientNodeMap.set(linkId, cpeNode);
+ let uni = {
+ srcNodeId: arr[0],
+ srcUniTp: arr[1],
+ dstNode: cpeNode
+ }
+ domain.uniMap.set(linkId, uni)
+ } else if (linkRole && linkRole.search("cross-domain") >= 0){
+ // enni link
+ let localLink: Array<any> = new Array();
+ let domainLocal:any = null;
+ let linkId = this.getJsonValue(ll, 'link-id');
+ let rlArr: Array<any> = this.getJsonValue(ll, 'relationship-list.relationship');
+ for (let rl of rlArr){
+
+ if (rl['related-to'] === "p-interface"){
+ let pnfNameS: String;
+ let tpNameS: String;
+ for (let rld of rl['relationship-data']){
+ if (rld['relationship-key'] === 'p-interface.interface-name'){
+ let tpNameL = rld['relationship-value'];
+ let tpNameArr = tpNameL.split('-')
+ tpNameS = tpNameArr[tpNameArr.length - 1];
+ pnfNameS = tpNameArr[tpNameArr.length - 3];
+ if (!domainLocal){
+ let arr = pnfNameS.split('.');
+ let domainId = arr[1];
+ domainLocal = thisNg.domainMap.get(domainId);
+ }
}
}
- return _results2;
- })());
+ let end = {
+ pnfId : pnfNameS,
+ tpId: tpNameS
+ }
+ localLink.push(end);
+ }
}
- return _results;
- }),
- remove: (function(condemned) {
- /* remove the given node or link from the graph, also deleting dangling links if a node is removed
- */ if (Array.prototype.indexOf.call(this.nodes, condemned) >= 0) {
- this.nodes = this.nodes.filter(function(n) {
- return n !== condemned;
- });
- return this.links = this.links.filter(function(l) {
- return l.source.id !== condemned.id && l.target.id !== condemned.id;
- });
- } else if (Array.prototype.indexOf.call(this.links, condemned) >= 0) {
- return this.links = this.links.filter(function(l) {
- return l !== condemned;
- });
+ this.enniMap.set(linkId, {data: localLink});
+ } else if (linkType.search("Tsci") >= 0) {
+ // tunnel connection link
+ let srcEpId = this.getJsonValue(ll, "link-name");
+ let dstEpId = this.getJsonValue(ll, "link-name2");
+ let svcInstId = this.getValueFromRelationList(ll, "allotted-resource", "service-instance.service-instance-id");
+ let conn = {
+ srcEpId: srcEpId,
+ dstEpId: dstEpId,
+ dstEpLtpId: '',
+ srcEpLtpId: ''
}
- }),
- last_index: 0,
- add_node: (function(type) {
- var n;
- n = {
- id: this.last_index++,
- x: 960 / 2,
- y: 500 / 2,
- type: type
- };
- this.nodes.push(n);
- return n;
- }),
- add_link: (function(source, target) {
- /* avoid links to self
- */
- var l, link, _i, _len, _ref;
- if (source === target) return null;
- /* avoid link duplicates
- */
- _ref = this.links;
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- link = _ref[_i];
- if (link.source === source && link.target === target) return null;
+ for (let nr of this.networkroutes){
+ if (nr['route-id'] === srcEpId){
+ conn.srcEpLtpId = nr['next-hop'];
+ }
+ if (nr['route-id'] === dstEpId){
+ conn.dstEpLtpId = nr['next-hop'];
+ }
}
- l = {
- source: source,
- target: target
- };
- this.links.push(l);
- return l;
- })
- };
-
- var nodeList = treeData.map(obj => {
- let rObj = {};
- rObj["id"] = obj["id"];
- rObj["x"] = 500;
- rObj["y"] = 500;
- rObj["type"] = obj["type"];
- return rObj;
- })
-
- var linkList = [] ;
- for (var i = 0, e = treeData.length; i < e; i++){
- for (var j = i+1, k = e; j < k; j++){
- linkList.push({
- source: treeData[i].id,
- target: treeData[j].id
- });
+ let svc = this.servicesMap.get(svcInstId);
+ if (svc){
+ svc.connections.push(conn);
}
- }
- graph.nodes = nodeList;
- graph.links = linkList;
- graph.objectify();
- var _this = this;
- var margin = {top: 20, right: 120, bottom: 20, left: 120},
- width = 1000 - margin.right - margin.left,
- height = 350 - margin.top - margin.bottom;
- //clean existing element
- d3.select("div#" + this.svcContainerOpt.containerId).selectAll("*").remove();
-
- let svg = d3.select("div#" + this.svcContainerOpt.containerId).append("svg")
- .attr("width", width + margin.right + margin.left)
- .attr("height", height + margin.top + margin.bottom);
- let container = svg.append("g").style("fill", "transparent");
-
- let vis = container.append('g');
- container.call(d3.behavior.zoom().scaleExtent([0.5, 8])
- .on('zoom', function(){
- vis.attr('transform', "translate(" + d3.event.translate + ")scale(" + d3.event.scale + ")");
- }));
-
- vis.append('rect')
- .attr('class', 'overlay')
- .attr('x', -500000)
- .attr('y', -500000)
- .attr('width', 1000000)
- .attr('height', 1000000)
- .on('click', function(d) {
- _this.svcEditorGlobal.selection = null;
- d3.selectAll('.node').classed('selected', false);
- return d3.selectAll('.link').classed('selected', false);
- });
- let colorify = d3.scale.category10();
- /* initialize the force layout
- */
- let force = d3.layout.force().size([width, height]).charge(-400).linkDistance(160)
- .on('tick', (function(e) {
- /* update nodes and links
- */
- let k = 16 * e.alpha;
- graph.nodes.forEach(function(o, i) {
- if (o["type"] === "root"){
- o["x"] += k
- //o["x"] += i & 2 ? k : -k;
-
- } else if (o["type"] === "leaf") {
- o["x"] += -k;
- //o["x"] += i & 2 ? k : -k;
+ } else {
+ // local link
+ let localLink: Array<any> = new Array();
+ let domainLocal:any = null;
+ let linkId = this.getJsonValue(ll, 'link-id');
+ let rlArr: Array<any> = this.getJsonValue(ll, 'relationship-list.relationship');
+ for (let rl of rlArr){
+
+ if (rl['related-to'] === "p-interface"){
+ let pnfNameS: String;
+ let tpNameS: String;
+ for (let rld of rl['relationship-data']){
+ if (rld['relationship-key'] === 'p-interface.interface-name'){
+ let tpNameL = rld['relationship-value'];
+ let tpNameArr = tpNameL.split('-')
+ tpNameS = tpNameArr[tpNameArr.length - 1];
+ pnfNameS = tpNameArr[tpNameArr.length - 3];
+ if (!domainLocal){
+ let arr = pnfNameS.split('.');
+ let domainId = arr[1];
+ domainLocal = thisNg.domainMap.get(domainId);
+ }
+ }
+ }
+ let end = {
+ pnfId : pnfNameS,
+ tpId: tpNameS
+ }
+ localLink.push(end);
}
- });
- vis.selectAll('.node').attr('transform', function(d) {
- return "translate(" + d.x + "," + d.y + ")";
- });
-
-
- //#svcContainer > svg > g > g > g:nth-child(3) > text
- //_this.svcEditorGlobal.selection
- return vis.selectAll('.link').attr('x1', function(d) {
- return d.source.x;
- }).attr('y1', function(d) {
- return d.source.y;
- }).attr('x2', function(d) {
- return d.target.x;
- }).attr('y2', function(d) {
- return d.target.y;
- });
- }));
- let nodeDragging = force.drag().on('dragstart', function (d){
- d3.event.sourceEvent.stopPropagation();
- d.fixed = true;
- })
-
- let topoNodeSync = _this.eventDispatcher.on(AppEventType.UserNodeDrag)
- .subscribe(event => {
- //console.log(event);
- let pnfId: string = event.payload.id;
- let pnfId_short: string = pnfId.substr(pnfId.lastIndexOf('-')+1);
- vis.selectAll('.node > circle').attr('stroke-width', function(d) {
- if (d.id.startsWith(pnfId_short)){
- return "4px";
+ }
+ localLink.sort(function(a, b){
+ return (a.pnfId + '-' + a.tpId).localeCompare(b.pnfId + '-' + b.tpId)});
+ if (!domainLocal) continue;
+ let srcNodeId = localLink[0].pnfId;
+ let srcTpId = localLink[0].tpId;
+ let srcNode = domainLocal.nodeMap.get(srcNodeId);
+ let dstNodeId = localLink[1].pnfId;
+ let dstTpId = localLink[1].tpId;
+ let dstNode = domainLocal.nodeMap.get(dstNodeId);
+ let inni = domainLocal.inniMap.get(srcNodeId + '-' + srcTpId);
+ if (!inni){
+ let inni = {
+ data: [linkId, null],
+ srcNode: srcNode,
+ srcTpId: srcTpId,
+ dstNode: dstNode,
+ dstTpId: dstTpId
}
- return "1px";
- });
- });
-
- // DELETION - pressing DEL deletes the selection
- // CREATION - pressing N creates a new node
- // d3.select(window).on('keydown', function() {
- // if (d3.event.keyCode === 46) {
- // if (global.selection != null) {
- // graph.remove(global.selection);
- // global.selection = null;
- // return update();
- // }
- // } else if (d3.event.keyCode === 78) {
- // graph.add_node();
- // return update();
- // }
- // });
-
- //Parameter for Editing tools
- let toolbar = $("<div class='toolbar'></div>");
- $("div#" + this.svcContainerOpt.containerId).append(toolbar);
- toolbar.append($("<svg\n" +
- " class='active tool'\n " +
- "data-tool='pointer'\n" +
- " xmlns='http://www.w3.org/2000/svg'\n" +
- " version='1.1'\n" +
- " width='32'\n" +
- " height='32'\n" +
- " fill='#b52d0c'" +
- " viewBox='0 0 128 128'>\n" +
- " <g transform='translate(881.10358,-356.22543)'>\n" +
- " <g transform='matrix(0.8660254,-0.5,0.5,0.8660254,-266.51112,-215.31898)'>\n" +
- " <path\n" +
- " d='m -797.14902,212.29589 a 5.6610848,8.6573169 0 0 0 -4.61823,4.3125 l -28.3428,75.0625 a 5.6610848,8.6573169 0 0 0 4.90431,13 l 56.68561,0 a 5.6610848,8.6573169 0 0 0 4.9043,-13 l -28.3428,-75.0625 a 5.6610848,8.6573169 0 0 0 -5.19039,-4.3125 z m 0.28608,25.96875 18.53419,49.09375 -37.06838,0 18.53419,-49.09375 z'\n />\n" +
- " <path\n" +
- " d='m -801.84375,290.40625 c -2.09434,2.1e-4 -3.99979,1.90566 -4,4 l 0,35.25 c 2.1e-4,2.09434 1.90566,3.99979 4,4 l 10,0 c 2.09434,-2.1e-4 3.99979,-1.90566 4,-4 l 0,-35.25 c -2.1e-4,-2.09434 -1.90566,-3.99979 -4,-4 z'\n />\n" +
- " </g>\n" +
- " </g>\n" +
- "</svg>"));
- toolbar.append($("<svg\n" +
- " class='tool'\n" +
- " data-tool='add_node'\n" +
- " xmlns='http://www.w3.org/2000/svg'\n" +
- " version='1.1'\n" +
- " width='32'\n" +
- " height='32'\n" +
- " viewBox='0 0 128 128'>\n" +
- " <g transform='translate(720.71649,-356.22543)'>\n" +
- " <g transform='translate(-3.8571429,146.42857)'>\n" +
- " <path\n d='m -658.27638,248.37149 c -1.95543,0.19978 -3.60373,2.03442 -3.59375,4 l 0,12.40625 -12.40625,0 c -2.09434,2.1e-4 -3.99979,1.90566 -4,4 l 0,10 c -0.007,0.1353 -0.007,0.27095 0,0.40625 0.19978,1.95543 2.03442,3.60373 4,3.59375 l 12.40625,0 0,12.4375 c 2.1e-4,2.09434 1.90566,3.99979 4,4 l 10,0 c 2.09434,-2.1e-4 3.99979,-1.90566 4,-4 l 0,-12.4375 12.4375,0 c 2.09434,-2.1e-4 3.99979,-1.90566 4,-4 l 0,-10 c -2.1e-4,-2.09434 -1.90566,-3.99979 -4,-4 l -12.4375,0 0,-12.40625 c -2.1e-4,-2.09434 -1.90566,-3.99979 -4,-4 l -10,0 c -0.1353,-0.007 -0.27095,-0.007 -0.40625,0 z'\n" +
- " />\n" +
- " <path\n" +
- " d='m -652.84375,213.9375 c -32.97528,0 -59.875,26.86847 -59.875,59.84375 0,32.97528 26.89972,59.875 59.875,59.875 32.97528,0 59.84375,-26.89972 59.84375,-59.875 0,-32.97528 -26.86847,-59.84375 -59.84375,-59.84375 z m 0,14 c 25.40911,0 45.84375,20.43464 45.84375,45.84375 0,25.40911 -20.43464,45.875 -45.84375,45.875 -25.40911,0 -45.875,-20.46589 -45.875,-45.875 0,-25.40911 20.46589,-45.84375 45.875,-45.84375 z'\n" +
- " />\n" +
- " </g>\n" +
- " </g>\n" +
- "</svg>"));
- toolbar.append($("<svg\n" +
- " class='tool'\n" +
- " data-tool='add_link'\n" +
- " xmlns='http://www.w3.org/2000/svg'\n" +
- " version='1.1'\n" +
- " width='32'\n" +
- " height='32'\n" +
- " viewBox='0 0 128 128'>\n" +
- "<g transform='translate(557.53125,-356.22543)'>\n" +
- " <g transform='translate(20,0)'>\n" +
- " <path\n" +
- " d='m -480.84375,360 c -15.02602,0 -27.375,12.31773 -27.375,27.34375 0,4.24084 1.00221,8.28018 2.75,11.875 l -28.875,28.875 c -3.59505,-1.74807 -7.6338,-2.75 -11.875,-2.75 -15.02602,0 -27.34375,12.34898 -27.34375,27.375 0,15.02602 12.31773,27.34375 27.34375,27.34375 15.02602,0 27.375,-12.31773 27.375,-27.34375 0,-4.26067 -0.98685,-8.29868 -2.75,-11.90625 L -492.75,411.96875 c 3.60156,1.75589 7.65494,2.75 11.90625,2.75 15.02602,0 27.34375,-12.34898 27.34375,-27.375 C -453.5,372.31773 -465.81773,360 -480.84375,360 z m 0,14 c 7.45986,0 13.34375,5.88389 13.34375,13.34375 0,7.45986 -5.88389,13.375 -13.34375,13.375 -7.45986,0 -13.375,-5.91514 -13.375,-13.375 0,-7.45986 5.91514,-13.34375 13.375,-13.34375 z m -65.375,65.34375 c 7.45986,0 13.34375,5.91514 13.34375,13.375 0,7.45986 -5.88389,13.34375 -13.34375,13.34375 -7.45986,0 -13.34375,-5.88389 -13.34375,-13.34375 0,-7.45986 5.88389,-13.375 13.34375,-13.375 z'\n" +
- " />\n <path\n" +
- " d='m -484.34375,429.25 c -1.95543,0.19978 -3.60373,2.03442 -3.59375,4 l 0,12.40625 -12.40625,0 c -2.09434,2.1e-4 -3.99979,1.90566 -4,4 l 0,10 c -0.007,0.1353 -0.007,0.27095 0,0.40625 0.19978,1.95543 2.03442,3.60373 4,3.59375 l 12.40625,0 0,12.4375 c 2.1e-4,2.09434 1.90566,3.99979 4,4 l 10,0 c 2.09434,-2.1e-4 3.99979,-1.90566 4,-4 l 0,-12.4375 12.4375,0 c 2.09434,-2.1e-4 3.99979,-1.90566 4,-4 l 0,-10 c -2.1e-4,-2.09434 -1.90566,-3.99979 -4,-4 l -12.4375,0 0,-12.40625 c -2.1e-4,-2.09434 -1.90566,-3.99979 -4,-4 l -10,0 c -0.1353,-0.007 -0.27095,-0.007 -0.40625,0 z'\n" +
- " />\n" +
- " </g>\n" +
- " </g>\n" +
- "</svg>"));
- let library = $("<div class='library'></div></div>");
- toolbar.append(library);
-
- ['PON', 'ETH'].forEach(function(type) {
- var new_btn;
- new_btn = $("<svg width='42' height='42'>\n" +
- " <g class='node'>\n" +
- " <circle\n" +
- " cx='21'\n" +
- " cy='21'\n" +
- " r='18'\n" +
- " stroke='" + (colorify(type)) + "'\n" +
- " fill='" + (d3.hcl(colorify(type)).brighter(3)) + "'\n" +
- " >\n" +
- " <title>" + (type) + " UNI</title> \n" +
- " </circle>" +
- " </g>\n" +
- "</svg>");
- new_btn.bind('click', function() {
- graph.add_node(type);
- return update();
- });
- library.append(new_btn);
- return library.hide();
- });
-
- let tool = 'pointer';
- let new_link_source = null;
- let drag_link;
- vis.on('mousemove.add_link', (function(d) {
- /* check if there is a new link in creation
- */
- var p;
- if (new_link_source != null) {
- /* update the draggable link representation
- */
- p = d3.mouse(vis.node());
- return drag_link.attr('x1', new_link_source.x).attr('y1', new_link_source.y).attr('x2', p[0]).attr('y2', p[1]);
+ domainLocal.inniMap.set(srcNodeId + '-' + srcTpId, inni);
+ } else {
+ inni.data[1] = linkId;
+ }
}
- })).on('mouseup.add_link', (function(d) {
- new_link_source = null;
- /* remove the draggable link representation, if exists
- */
- if (drag_link != null) return drag_link.remove();
- }));
- d3.selectAll('.tool').on('click', function() {
- var new_tool, nodes;
- d3.selectAll('.tool').classed('active', false).style("fill", "#a3a4c3");
- d3.select(this).classed('active', true).style("fill", "#b52d0c");
- new_tool = $(this).data('tool');
- nodes = vis.selectAll('.node');
-
- //mode change to add_link
- if (new_tool === 'add_link' && tool !== 'add_link') {
- /* remove drag handlers from nodes
- */
- nodes.on('mousedown.drag', null).on('touchstart.drag', null);
- /* add drag handlers for the add_link tool
- */
- nodes.call(drag_add_link);
- } else if (new_tool !== 'add_link' && tool === 'add_link') {
- /* remove drag handlers for the add_link tool
- */
- nodes.on('mousedown.add_link', null).on('mouseup.add_link', null);
- /* add drag behavior to nodes
- */
- nodes.call(nodeDragging);
+ }
+ }
+
+ // main function that draws the topology view
+ finishSotnView() {
+ this.graph.model.clear()
+ this.graph.model.beginUpdate()
+ this.gLayers = [this.graph.getDefaultParent()]
+ for (let i = 0; i < 3; i++) {
+ this.gLayers.push(this.graph.model.root.insert(new mxCell()))
+ }
+
+ // Insert domains
+ for (let [networkId, domain] of this.domainMap) {
+ domain.vertex = this.graph.insertVertex(this.gLayers[0], null, null, 0, 0, 0, 0, this.DOMAIN_STYLE)
+ domain.vertex.connectable = false
+ domain.vertex.value = {
+ label: '(DOMAIN: ' + domain.domainId + ')',
+ networkId: networkId
}
- if (new_tool === 'add_node') {
- library.show();
- } else {
- library.hide();
+ // Insert nodes
+ for (let [nodeId, node] of domain.nodeMap) {
+ node.vertex = this.graph.insertVertex(domain.vertex, null, null, 0, 0, 26, 26)
+ node.vertex.value = {
+ nodeId: nodeId, name: node.name, label: node.name, node: node
+ }
}
- return tool = new_tool;
- });
- update();
- function update() {
- /* update the layout
- */
- var links, new_nodes, nodes;
- force.nodes(graph.nodes).links(graph.links).start();
- /* create nodes and links
- */
- /* (links are drawn with insert to make them appear under the nodes)
- */
- /* also define a drag behavior to drag nodes
- */
- /* dragged nodes become fixed
- */
- nodes = vis.selectAll('.node').data(graph.nodes, function(d) {
- return d.id;
- });
- new_nodes = nodes.enter().append('g').attr('class', 'node');
-/* .on('click', (function(d) {
- /!* SELECTION
- *!/
- _this.svcEditorGlobal.selection = d;
- d3.selectAll('.node').classed('selected', function(d2) {
- return d2 === d;
- });
- return d3.selectAll('.link').classed('selected', false);
- }));*/
- links = vis.selectAll('.link').data(graph.links, function(d) {
- return "" + d.source.id + "->" + d.target.id;
- });
-
- links.enter().insert('line', '.node').attr('class', 'link').on('click', (function(d) {
- /* SELECTION
- */
- _this.svcEditorGlobal.selection = d;
- d3.selectAll('.link').classed('selected', function(d2) {
- return d2 === d;
- });
- return d3.selectAll('.node').classed('selected', false);
- }));
- links
- .style("stroke-width", "6px")
- .style("stroke", "gray")
- .style("opacity", "0.5");
-
- links.exit().remove();
- /* TOOLBAR - add link tool initialization for new nodes
- */
- if (tool === 'add_link') {
- new_nodes.call(drag_add_link);
- } else {
- new_nodes.call(nodeDragging);
+ // Insert INNI links
+ for (let [key, inni] of domain.inniMap) {
+ inni.edge = this.graph.insertEdge(this.gLayers[1], null, null,
+ inni.srcNode.vertex, inni.dstNode.vertex, this.LINK_STYLE)
+ inni.edge.value = {
+ linkId: key,
+ inni: inni,
+ domain: domain
+ }
+ //inni.srcNniTp.edge = inni.edge
+ //inni.dstNniTp.edge = inni.edge
}
- new_nodes.append('circle').attr('r', 18).attr('stroke', function(d) {
- return colorify(d.type);
- }).attr('fill', function(d) {
- return d3.hcl(colorify(d.type)).brighter(3);
- });
- /* draw the label
- */
- new_nodes.append('text').text(function(d) {
- return d.id;
- }).attr('dy', '0.35em').attr('fill', function(d) {
- return colorify(d.type);
- });
- return nodes.exit().remove();
- };
- function drag_add_link (selection) {
- return selection.on('mousedown.add_link', (function(d) {
- var p;
- new_link_source = d;
- /* create the draggable link representation
- */
- p = d3.mouse(vis.node());
- drag_link = vis.insert('line', '.node').attr('class', 'drag_link').attr('x1', d.x).attr('y1', d.y).attr('x2', p[0]).attr('y2', p[1]);
- drag_link
- .style("stroke-width", "6px")
- .style("stroke", "gray")
- .style("opacity", "0.5");
- /* prevent pan activation
- */
- d3.event.stopPropagation();
- /* prevent text selection
- */
- return d3.event.preventDefault();
- })).on('mouseup.add_link', (function(d) {
- /* add link and update, but only if a link is actually added
- */ if (graph.add_link(new_link_source, d) != null) return update();
- }));
- };
+ // Insert client nodes
+ for (let [nodeName, clientNode] of domain.clientNodeMap) {
+ if (clientNode.isCloud) {
+ clientNode.vertex = this.graph.insertVertex(domain.vertex, null, null, 0, 0, 52, 26, this.CLOUD_STYLE)
+ } else {
+ clientNode.vertex = this.graph.insertVertex(domain.vertex, null, null, 0, 0, 26, 13, this.CPE_STYLE)
+ }
+ let labelName = nodeName.split('-')[1];
+ clientNode.vertex.value = {
+ name: nodeName, label: labelName, clientNode: clientNode
+ }
+ }
+ // Insert UNI links
+ for (let [key, uni] of domain.uniMap) {
+ let srcNode = domain.nodeMap.get(uni.srcNodeId);
+ uni.edge = this.graph.insertEdge(domain.vertex, null, null,
+ srcNode.vertex, uni.dstNode.vertex, this.UNI_LINK_STYLE)
+ uni.edge.value = {
+ linkId: key, uni: uni, domain: domain,
+ maximum: 1000000 / 1000000 + 'G',
+ unused: 1000000 / 1000000 + 'G'
+ }
+ //uni.srcUniTp.edge = uni.edge
+ }
+ // Insert ENNI links
+ for (let [key, enni] of this.enniMap) {
+ let srcNode = null;
+ let dstNode = null;
+
+ for (let [, tmpDomain] of this.domainMap){
+ srcNode = tmpDomain.nodeMap.get(enni.data[0].pnfId);
+ if (srcNode) break;
+ }
+ for (let [, tmpDomain] of this.domainMap){
+ dstNode = tmpDomain.nodeMap.get(enni.data[1].pnfId);
+ if (dstNode) break;
+ }
+
+ enni.edge = this.graph.insertEdge(this.gLayers[1], null, {
+ plugId: key, enni: enni }, srcNode.vertex, dstNode.vertex, this.LINK_STYLE)
+ //enni.data[0].nniTp.edge = enni.edge
+ //enni.data[1].nniTp.edge = enni.edge
+ }
+ }
+
+ // Insert tunnel edges
+ for (let [id, svc] of this.servicesMap){
+ let localTunnelMap = new Map();
+ for (let conn of svc.connections){
+ let srcArr = conn.srcEpLtpId.split('-');
+ let srcNodeId = srcArr[srcArr.length-3];
+ let dstArr = conn.dstEpLtpId.split('-');
+ let dstNodeId = dstArr[dstArr.length-3];
+ if (!localTunnelMap.get(srcNodeId + '-' + dstNodeId)) {
+ let srcNode = getNode(srcNodeId, this.domainMap);
+ let dstNode = getNode(dstNodeId, this.domainMap);
+ if(!srcNode.vertex || !dstNode.vertex) {
+ continue;
+ };
+ let e2eTunnel = {
+ name: id + '/' + srcNodeId + '-' + dstNodeId,
+ srcNode: srcNode,
+ dstNode: dstNode,
+ e2eEdge: null,
+ serviceId: id,
+ srcVertex: srcNode.vertex,
+ dstVertex: dstNode.vertex
+ }
+ e2eTunnel.e2eEdge =
+ this.graph.insertEdge(this.gLayers[2], null, {
+ tunnel: e2eTunnel, tunnelName: e2eTunnel.name
+ }, e2eTunnel.srcNode.vertex, e2eTunnel.dstNode.vertex, this.TUNNEL_STYLE)
+ localTunnelMap.set(srcNodeId + '-' + dstNodeId, e2eTunnel)
+ this.e2eTunnels.push(e2eTunnel);
+ }
+ }
+ }
+
+
+
+ this.graph.model.endUpdate();
+ this.graph.zoomTo(this.graphScale);
+ this.autoLayout(1);
+ this.changeLayer({ value:1, name: 'Link Layer'});
+
+ if (this.serviceSelected){
+ this.chooseService(this.serviceSelected);
+ }
+ function getNode(nodeId, domainMap){
+ let arr = nodeId.split('.');
+ return domainMap.get(arr[1]).nodeMap.get(nodeId);
+ }
}
- /**
- * Redraw the underlay network topology.
- * @param {Array<object>} nodes parsed from AAI logicalLinks.
- * @param {Array<object>} lines parsed from AAI logicalLinks.
- */
- drawTopo(nodes: Array<object>, lines: Array<object>){
- let margin = {top: 20, right: 120, bottom: 20, left: 120},
- width = 1000 - margin.right - margin.left,
- height = 350 - margin.top - margin.bottom;
+ changeLayer(layer){
+ this.layerSelected = layer;
+ for (let i = 1; i < this.gLayers.length; i++) {
+ this.gLayers[i].setVisible(i == this.layerSelected.value)
+ }
+ this.graph.refresh()
+ }
- let thisNg = this;
+ chooseService(svcInstId) {
+ this.serviceSelected = svcInstId;
+ //clear the label and color of all UNI links
+ for (let [, domain] of this.domainMap) {
+ for (let [, uni] of domain.uniMap) {
+ this.graph.setCellStyles(mxConstants.STYLE_STROKECOLOR, CE_COLOR, [uni.edge])
+ this.graph.setCellStyles(mxConstants.STYLE_FILLCOLOR, CE_COLOR, [uni.dstNode.vertex])
+ this.graph.setCellStyles(mxConstants.STYLE_DASHED, '1', [uni.edge])
+ uni.edge.value.label = ''
+ uni.edge.value.endPoint = null
+ }
+ }
- let nodeById = d3.map();
-
- nodes.forEach(function(node) {
- nodeById.set(node["id"], node);
- });
-
- lines.forEach(function(link) {
- link["source"] = nodeById.get(link["source"]);
- link["target"] = nodeById.get(link["target"]);
- });
-
- let svg = d3.select("div#tpContainer").append("svg")
- .attr("width", width + margin.right + margin.left)
- .attr("height", height + margin.top + margin.bottom)
- .style("pointer-events", "all");
-
- let graph = svg.append("g").attr("class", "graph");
-
- let force = d3.layout.force()
- .nodes(nodes)
- .links(lines)
- .size([width, height])
- /* .linkStrength(function(d){
- switch(d.type){
- case 1:
- return 0.15;
- case 2:
- default:
- return 0.1;
- }
- })*/
- //.gravity(0)
- //.gravity(0)
- .linkDistance(function (d) {
- return 150;
- })
- .charge(function(d) {
- return -600;
- })
- .start();
-
- let drag = force.drag()
- .on("dragstart", dragstart)
- .on("dragend", dragend);
-
- let _g_lines = graph.selectAll("line.line")
- .data(lines)
- .enter()
- .append("g")
- .attr("class", "line");
-
- let _g_nodes = graph.selectAll("g.node")
- .data(nodes)
- .enter()
- .append("g")
- .attr("class", "node")
- .call(drag);
- _g_lines.append("line")
- .style('stroke', function (d) {
- if(d.type === 2){
- return "#000000";
- } else {
- return '#93c62d';
- }
+ // Update the label and color of UNI links of current service
+ let service = this.servicesMap.get(this.serviceSelected);
+ if (service){
+ let bw = service.bw;
+ for (let conn of service.connections){
+ let srcUniLinkId = getShortName(conn.srcEpLtpId);
+ let dstUniLinkId = getShortName(conn.dstEpLtpId);
+ // left side uni link
+ let arr = srcUniLinkId.split('.');
+ let uni = this.domainMap.get(arr[1]).uniMap.get(srcUniLinkId);
+ colorUni(uni, this.graph, bw);
+ // right side uni
+ arr = dstUniLinkId.split('.');
+ uni = this.domainMap.get(arr[1]).uniMap.get(dstUniLinkId);
+ colorUni(uni, this.graph, bw);
+
+ }
+ }
- })
- .style("stroke-width", 4);
+ // Update tunnel edges
+ for (let e2eTunnel of this.e2eTunnels) {
+ e2eTunnel.e2eEdge.setVisible(e2eTunnel.serviceId === svcInstId)
+ }
+ this.graph.refresh();
+
+ // Utility func
+ function getShortName(ltpId){
+ let arr = ltpId.split('-');
+ let nodeId = arr[arr.length-3];
+ let ltp = arr[arr.length-1];
+ return nodeId + '-' + ltp;
+ }
+ function colorUni(uni, graph, bw){
+ let bandwidth = parseInt(bw);
+ let newColor = EP_COLOR_MAP.get("update")
+ graph.setCellStyles(mxConstants.STYLE_STROKECOLOR, newColor, [uni.edge])
+ graph.setCellStyles(mxConstants.STYLE_FONTCOLOR, newColor, [uni.edge])
+ graph.setCellStyles(mxConstants.STYLE_DASHED, '0', [uni.edge])
+ graph.setCellStyles(mxConstants.STYLE_FILLCOLOR, newColor, [uni.dstNode.vertex])
+ if (!uni.edge.value.endpoints) {
+ uni.edge.value.endpoints = [];
+ }
+ uni.edge.value.endpoints.push(bandwidth);
+ let sum = uni.edge.value.endpoints.reduce((a, b) => a + b, 0);
+ uni.edge.value.label = sum + 'G' ;
+ }
+ }
- _g_nodes.append("image")
- .attr("width", function (d) {
- switch (d.group) {
- case 'pnf':
- return 70;
- case 'tp':
- default:
- return 10;
+ getValueFromRelationList(rl, relatedTo, relatedKey){
+ let rlArr: Array<any> = this.getJsonValue(rl, 'relationship-list.relationship');
+ for (let rl of rlArr){
+ if (rl['related-to'] === relatedTo){
+ let pnfNameS: String;
+ let tpNameS: String;
+ for (let rld of rl['relationship-data']){
+ if (rld['relationship-key'] === relatedKey){
+ let val = rld['relationship-value'];
+ if (val) return val;
+ }
}
- })
- .attr("height", function (d) {
- switch (d.group) {
- case 'pnf':
- return 70;
- case 'tp':
- default:
- return 10;
- }
- })
- .attr("xlink:href", function (d) {
- return thisNg.imgMap[d.group];
- });
+ }
+ }
+ return null;
+ }
+ // get the key of an Endpoint
+ getEndPointKey(endPoint) {
+ return endPoint.networkId + '-' + endPoint.nodeId + '-' + endPoint.portId
+ }
- _g_nodes.append("text")
- .text(function (d) {
- return d.id.substr( d.id.lastIndexOf('-')+1);
- })
- .style('font-size', '12')
- .style('fill', '#333');
-
- //_g_nodes.each(function (d, i) {
- var selection = d3.select(this);
-/* if (d.status == '0') {
- selection.append("g").attr("class", "error-tip")
- .append("image").attr("xlink:href", function (d) {
- return imgMap['error-tip'];
- });
- }*/
- // });
-
- _g_lines.each(function (d, i) {
- var _this = d3.select(this);
- if (d.type === 1) {
- _this.append("text")
- .text("100GB")
- .style('fill', 'rgb(255,198,22)')
- .style('font-size', '11');
-
- _this.append("rect")
- .attr("fill", function (d) {
- return '#555';
- })
- .attr("width", function (d) {
- return 4;
- })
- .attr("height", function (d) {
- return 4;
- })
- .append("animate");
-
- _this.select("rect").append("animate");
- } else {
- _this.append("image")
- .attr("xlink:href", function () {
- return thisNg.imgMap['link-cut'];
- });
+ // Get color from slice Id
+ getSliceColor(sliceId) {
+ // let colorId = sliceMap.get(sliceId)
+ // if (!sliceId || colorId >= SLICE_COLORS.length) colorId = 1
+ return 'black'
+ }
+
+ // Function to create a table from js array data
+ createJsonTable(data) {
+ let table = document.createElement('table')
+ table.className = 'display compact'
+ this.tableContainer.nativeElement.appendChild(table)
+
+ if (!data.length) return
+ let columns = []
+ for (let key of Object.keys(data[0])) {
+ if (this.isBasicType(data[0][key]) && key[0] != '$') {
+ columns.push({
+ data: key, name: key,
+ title: key.charAt(0).toUpperCase() + key.slice(1),
+ defaultContent: ''
+ })
}
- });
+ }
+ let dataTable = $(table).DataTable({
+ autoWidth: false,
+ dom: 'ti',
+ order: [],
+ select: {toggleable: false},
+ columnDefs: [{className: 'dt-center', targets: '_all'}],
+ columns: columns,
+ data: data
+ })
+ dataTable.on('user-select', function (e, dt, type, cell, originalEvent) {
+ if (dt.row('.selected').index() != cell.index().row)
+ this.selectTableRow(cell.index().row, true)
+ return false
+ })
+ return dataTable
+ }
- force.on("tick", function (e) {
+ // disable mouse for application
+ disableAppMouse(disabled) {
+ //header.style.pointerEvents = disabled ? 'none' : 'auto'
+ //container.style.pointerEvents = disabled ? 'none' : 'auto'
+ this.graph.setEnabled(!disabled)
+ document.body.style.cursor = disabled ? 'wait' : 'default'
+ }
- _g_lines.select("line").attr("x1", function (d) {
- return d.source.x;
- })
- .attr("y1", function (d) {
- return d.source.y;
- })
- .attr("x2", function (d) {
- return d.target.x;
- })
- .attr("y2", function (d) {
- return d.target.y;
- });
- _g_lines.select("image").attr("x", function (d) {
- var x1 = d.source.x,
- x2 = d.target.x,
- x = x1 - (x1 - x2) / 2;
- return x - 8;
- })
- .attr("y", function (d) {
- var y1 = d.source.y,
- y2 = d.target.y,
- y = y1 - (y1 - y2) / 2;
- return y - 15;
- });
-
- _g_lines.select("text")
- .attr('x', function (d) {
- var x1 = d.source.x,
- x2 = d.target.x,
- halfX = x1 - (x1 - x2) / 2,
- x3 = x1 - (x1 - halfX) / 2;
- return x3;
- })
- .attr('y', function (d) {
- var y1 = d.source.y,
- y2 = d.target.y,
- halfY = y1 - (y1 - y2) / 2,
- y3 = y1 - (y1 - halfY) / 2;
- y3 = y3 - 5;
- return y3;
- })
- .attr("transform", function (d) {
- var x1 = d.source.x,
- x2 = d.target.x,
- y1 = d.source.y,
- y2 = d.target.y,
- x = x1 - (x1 - x2) / 2,
- y = y1 - (y1 - y2) / 2,
- rightAngleSide1 = Math.abs(y2 - y1),
- rightAngleSide2 = Math.abs(x2 - x1),
- _asin = 0,
- _rotateAngle = 0,
- x3 = x1 - (x1 - x) / 2,
- y3 = y1 - (y1 - y) / 2;
-
- if (x1 < x2) {
- _asin = (y2 - y1) / Math.sqrt(Math.pow(rightAngleSide1, 2) + Math.pow(
- rightAngleSide2, 2));
- _rotateAngle = Math.asin(_asin) * 180 / Math.PI;
- } else {
- _asin = (y1 - y2) / Math.sqrt(Math.pow(rightAngleSide1, 2) + Math.pow(
- rightAngleSide2, 2));
- _rotateAngle = Math.asin(_asin) * 180 / Math.PI;
- _rotateAngle = _rotateAngle < 0 ? (180 + _rotateAngle) : -(180 -
- _rotateAngle);
- }
- return 'rotate(' + (_rotateAngle) + ',' + x3 + ' ' + y3 + ')';
- });
+ choseConnectivity(item) {
+ if (this.connectivitySelected !== item) this.connectivitySelected = item;
+ //this.drawService(this.getSvcTree());
+ }
- _g_lines.select("rect")
- .attr('x', function (d) {
- return d.source.x - 1;
- })
- .attr('y', function (d) {
- return d.source.y - 1;
- })
- .selectAll('animate').each(function (d, i) {
- if (i == 0) {
- d3.select(this)
- .attr("attributeName", function (d) {
- return 'x';
- })
- .attr("from", function (d) {
- return d.source.x - 1;
- })
- .attr("to", function (d) {
- return d.target.x;
- });
- } else {
- d3.select(this)
- .attr("attributeName", function (d) {
- return 'y';
- })
- .attr("from", function (d) {
- return d.source.y - 1;
- })
- .attr("to", function (d) {
- return d.target.y;
- });
- }
+ _debounce(func: Function, delay: number) {
+ let inDebounce;
+ return function () {
+ const context = this;
+ const args = arguments;
+ clearTimeout(inDebounce)
+ inDebounce = setTimeout(() => func.apply(context, args), delay);
+ }
+ }
- d3.select(this).attr("attributeType", "XML")
- .attr("dur", function (d) {
- return '1.5s';
- })
- .attr("repeatCount", "indefinite");
+ // Layout the label of client nodes
+ clientNodeLabelLayout() {
+ for (let [,sotnDomain] of this.domainMap) {
+ for (let [, clientNode] of sotnDomain.clientNodeMap) {
+ let vertex = clientNode.vertex
+ let remote = clientNode.networkNode.vertex
+ let isAbove = (vertex.geometry.y + vertex.geometry.height / 2) < (remote.geometry.y + remote.geometry.height / 2)
+ this.graph.setCellStyles(mxConstants.STYLE_VERTICAL_LABEL_POSITION, isAbove ? 'top' : 'bottom', [vertex])
+ this.graph.setCellStyles(mxConstants.STYLE_VERTICAL_ALIGN, isAbove ? 'bottom' : 'top', [vertex])
+ }
+ }
+ }
- })
-/* let k = 6 * e.alpha;
- nodes.forEach(function(o, i) {
- if (o["layer"] === "Otn"){
- o["y"] += k
- //o["x"] += i & 2 ? k : -k;
-
- } else if (o["layer"] === "Eth") {
- o["y"] += -k;
- //o["x"] += i & 2 ? k : -k;
- }
- });*/
+ // Center the graph in the container
+ centerGraph() {
+
+ let domains = this.graph.model.getChildVertices(this.gLayers[0])
+ if (!domains) return
+ let bounds = this.graph.getBoundingBoxFromGeometry(domains, false)
+ if (!bounds) return
+ this.graphScale = this.graph.view.scale
+ let dx = (this.graph.container.clientWidth / this.graphScale - bounds.width) / 2
+ let dy = (this.graph.container.clientHeight / this.graphScale - bounds.height) / 2
+ this.graph.view.setTranslate(dx < 0 ? 0 : dx, dy < 0 ? 0 : dy)
+ this.graph.refresh()
+ }
- _g_nodes.attr("transform", function (d) {
- if(d.group === 'pnf') {
- var image = d3.select(this).select("image")[0][0],
- halfWidth = parseFloat("70") / 2,
- halfHeight = parseFloat("70") / 2;
+ // Functions ..0.
+ // Create popup menu for graph
+ createPopupMenu(menu, cell, evt) {
+ }
- return 'translate(' + (d.x - halfWidth) + ',' + (d.y - halfHeight) + ')';
- } else {
- return 'translate(' + (d.x) + ',' + (d.y) + ')';
+ // A utility function for setting the values of part of an Object's properties
+ setObjValues(obj, newValues, keyObj = null): void {
+ for (let key of Object.keys(newValues)) {
+ if (!keyObj) obj[key] = newValues[key]
+ else obj[keyObj[key]] = newValues[key]
+ }
+ }
+
+ // Save changed services to local storage
+ saveServices() {
+ let storedServices = []
+ for (let e2eService of this.e2eServices) {
+ let storedService = this.cloneWithSimpleProperties(e2eService)
+ storedService["endPoints"] = []
+ for (let endPointMap of [e2eService.rootEndPointMap, e2eService.leafEndPointMap]) {
+ for (let [, endPoint] of endPointMap) {
+ if (endPoint.status == 'retrieve') continue
+ storedService["endPoints"].push(this.cloneWithSimpleProperties(endPoint))
}
+ }
+ storedServices.push(storedService)
+ }
+ (this.storage)['actn-viewer-service'] = JSON.stringify(storedServices)
+ }
- });
+ // Hold for next release
+ // Read stored services from local storage.
+ readServices() {
+ /* let storedServices = JSON.parse((this.storage)['actn-viewer-service'] || '[]')
+ for (let storedService of storedServices) {
+ let e2eService = this.e2eServiceMap.get(storedService.name)
+ if (!e2eService) { //not exist then add new one
+ e2eService = storedService
+ e2eService.leafEndPointMap = new Map()
+ e2eService.rootEndPointMap = new Map()
+ e2eService.active = false
+ for (let endPoint of e2eService.endPoints) {
+ if (!endPoint.newBand) endPoint.newBand = endPoint.bandwidth
+ this.addNewEndPointToService(e2eService, endPoint, 'create')
+ }
+ this.updateOneE2eService(e2eService)
+ } else { //otherwise update the status of endpoint
+ for (let storedEndPoint of storedService.endPoints) {
+ let endPoint = e2eService.leafEndPointMap.get(storedEndPoint.id) || e2eService.rootEndPointMap.get(storedEndPoint.id)
+ if (endPoint) {
+ switch (storedEndPoint.status) {
+ case 'create':
+ break
+ case 'delete':
+ endPoint.status = 'delete';
+ endPoint.newBand = 0;
+ break
+ case 'update':
+ if (endPoint.bandwidth != storedEndPoint.newBand) {
+ endPoint.newBand = storedEndPoint.newBand
+ endPoint.status = 'update'
+ }
+ }
+ } else {
+ this.addNewEndPointToService(e2eService, storedEndPoint, 'create')
+ }
+ }
+ this.updateRootBandwidth(e2eService)
+ }
+ } */
+ }
- _g_nodes.select("text").attr('dy', function (d) {
- var image = this.previousSibling,
- height = parseFloat("10"),
- fontSize = parseFloat(this.style.fontSize);
+ // add a new endpoint to e2e service
+ addNewEndPointToService(e2eService, endPoint, status) {
+ endPoint.edge = this.getUniEdgeFromEp(endPoint)
+ if (!endPoint.edge) return
+ endPoint.status = status
+ let endPointMap = endPoint.role == 'leaf-access' ? e2eService.leafEndPointMap : e2eService.rootEndPointMap
+ endPoint.id = endPoint.id || this.getEndPointKey(endPoint)
+ endPointMap.set(endPoint.id, endPoint)
+ }
- return height + 1.5 * fontSize;
- });
+ // add a new uni to e2e service
+ addNewUni(e2eService, uni, isLeaf) {
+ let newEndPoint = {
+ networkId: uni.networkId,
+ nodeId: uni.srcNode.nodeId,
+ portId: uni.srcUniTp.tpId,
+ role: isLeaf ? 'leaf-access' : 'root-primary',
+ newBand: this.defBandwidth,
+ }
+ this.addNewEndPointToService(e2eService, newEndPoint, 'create')
+ this.updateCurrentCloud(e2eService)
+ }
- _g_nodes.select(".error-tip").attr("transform", function (d) {
+ deleteNewUni(e2eService, endPoint, isLeaf, doUpdate = true) {
+ let endPointMap = isLeaf ? e2eService.leafEndPointMap : e2eService.rootEndPointMap
+ endPointMap.delete(endPoint.id)
+ if (doUpdate) this.updateCurrentCloud(e2eService)
+ }
- var image = this.parentNode.firstChild,
- width = parseFloat("70");
+ deleteOldUni(e2eService, endPoint) {
+ endPoint.status = 'delete'
+ endPoint.newBand = 0
+ this.updateCurrentCloud(e2eService)
+ }
- return 'translate(' + 0.8 * width + ',0)';
+ cancelUniDeletion(e2eService, endPoint, doUpdate = true) {
+ endPoint.status = 'retrieve'
+ endPoint.newBand = endPoint.bandwidth
+ if (doUpdate) this.updateCurrentCloud(e2eService)
+ }
- });
+ cancelUniModification(e2eService, endPoint, doUpdate = true) {
+ endPoint.status = 'retrieve'
+ endPoint.newBand = endPoint.bandwidth
+ if (doUpdate) this.updateCurrentCloud(e2eService)
+ }
- });
+ updateCurrentCloud(e2eService) {
+ this.updateRootBandwidth(e2eService)
+ this.saveServices()
+ //this.showSotnCloud(this.currentCloud)
+ }
+ // Calculate and update the bandwidth of roots
+ updateRootBandwidth(e2eService) {
+ let newRootBand = 0
+ for (let [, endPoint] of e2eService.leafEndPointMap) {
+ newRootBand += endPoint.newBand
+ }
+ for (let [, endPoint] of e2eService.rootEndPointMap) {
+ if (endPoint.status == 'delete') continue
+ endPoint.newBand = newRootBand
+ if (endPoint.status == 'create') continue
+ endPoint.status = (endPoint.newBand != endPoint.bandwidth) ? 'update' : 'retrieve'
+ }
+ e2eService.changed = false
+ for (let endPointMap of [e2eService.leafEndPointMap, e2eService.rootEndPointMap]) {
+ for (let [, endPoint] of endPointMap) {
+ if (endPoint.status != 'retrieve') {
+ e2eService.changed = true;
+ break
+ }
+ }
+ if (e2eService.changed) break
+ }
+ this.serviceTable.row(e2eService.$index).data(e2eService)
+ }
- function dblclick(d) {
- d3.select(this).classed("fixed", d.fixed = false);
+ // cancel all service changes
+ cancelAllCloudChanges(currentService) {
+ for (let endPointMap of [currentService.leafEndPointMap, currentService.rootEndPointMap]) {
+ for (let [, endPoint] of endPointMap) {
+ switch (endPoint.status) {
+ case 'create':
+ this.deleteNewUni(currentService, endPoint, endPoint.role == 'leaf-access', false)
+ break
+ case 'delete':
+ this.cancelUniDeletion(currentService, endPoint, false)
+ break
+ case 'update':
+ if (endPoint.role == 'leaf-access') {
+ this.cancelUniModification(currentService, endPoint, false)
+ }
+ break
+ }
+ }
}
+ currentService.changed = false
+ this.updateCurrentCloud(currentService)
+ }
- function dragstart(d) {
- d3.select(this).classed("fixed", d.fixed = true);
- thisNg.eventDispatcher.dispatch(new AppEvent(AppEventType.UserNodeDrag, d));
+ // function for interact with ONAP SO
+ onapApplyCloudChanges(currentService) {
+ alert('Future feature.')
+ // let newSliceServices = e2eServices.filter(service =>
+ // service.sliceId == currentSlice && !service.active)
+ // if (newSliceServices.length == 0) return
+ // let connections = []
+ // newSliceServices.forEach((s, i) => {
+ // connections.push({
+ // epa: s.srcVertex.value.node.uniTpMap.get(s.srcPort).name.split(':')[0],
+ // epb: s.dstVertex.value.node.uniTpMap.get(s.dstPort).name.split(':')[0],
+ // bandwidth: s.bandwidth,
+ // name: s.name,
+ // })
+ // })
+ // let jsonData = jsonRender('ONAP_TS_ALLOCATE_TMPL',
+ // { sliceId: currentSlice, connections: connections })
+ // setRestJsonData('POST', onap, 'allocate', jsonData, null, false)
+
+ // let jsonData = jsonRender('ONAP_TS_OTHERS_TMPL',
+ // { sliceId: currentSlice })
+ // setRestJsonData(method, onap, action, jsonData, null, false)
+ }
+
+ // Reset the database of controllers
+/* resetControllerData() {
+ let result = confirm('The data of all controllers will be reset to initial state.')
+ if (!result) return
+ let reqNumber = 0
+ for (let controller of controllers) {
+ setRestJsonData('POST', {controller: controller}, RPC_RESET_DATA_URL, null)
}
- function dragend(d) {
+ }*/
+ // Filter table by cloud Id
+ filterTable(table, cloudId) {
+ if (table) table.column('cloudId:name').search(cloudId, true).draw()
+ }
+
+ // Hide or show table
+ hideTable(table, hide) {
+ let index;
+ if (table && !hide) {
+ $(table.table().container()).show()
+ index = table.row({selected: true, search: 'applied'}).index()
+ if (index == null) {
+ this.tableContainer.nativeElement.scrollTo(0, 0)
+ } else {
+ table.row(index).node().scrollIntoView(false)
+ }
+ } else if (table && hide) {
+ $(table.table().container()).hide()
}
+ }
- function color (d){
- const scale = d3.scaleOrdinal(d3.schemeCategory10);
- switch(d.group){
- case "pnf":
- return scale(1);
- case "tp":
- return scale(2);
- default:
- return scale(9);
+ // Select table row
+ selectTableRow(index = null, click = false) {
+ this.graph.clearSelection()
+ if ((this.currentLayer == 1 || this.currentLayer == 2) && this.tunnelTable) {
+ let indexes
+ if (index == null) {
+ indexes = this.tunnelTable.rows({selected: true, search: 'applied'}).indexes()
+ if (indexes.length == 0) return this.tunnelTable.rows('.selected').deselect()
+ indexes = indexes.toArray()
+ } else {
+ this.tunnelTable.rows('.selected').deselect()
+ let node = this.tunnelTable.row(index).select().node()
+ if (!click) node.scrollIntoView(false)
+ this.serviceTable.rows('.selected').deselect()
+ indexes = [index]
}
+ for (let i in indexes) {
+ mxConstants.EDGE_SELECTION_COLOR = parseInt(i) % 2 ? '#0000FF' : '#00FF00'
+ this.graph.addSelectionCells((this.currentLayer == 1) ?
+ this.e2eTunnels[indexes[i]].edges : [this.e2eTunnels[indexes[i]].e2eEdge])
+ this.showJsonData(this.tunnelsMap.get(this.e2eTunnels[indexes[i]].name), false)
+ }
+ mxConstants.EDGE_SELECTION_COLOR = '#00FF00'
+ } else if (this.currentLayer == 3 && this.serviceTable) {
+ if (index == null) {
+ index = this.serviceTable.row({selected: true, search: 'applied'}).index()
+ if (index == null) return this.serviceTable.rows('.selected').deselect()
+ } else {
+ this.serviceTable.rows('.selected').deselect()
+ let node = this.serviceTable.row(index).select().node()
+ if (!click) node.scrollIntoView(false)
+ }
+ this.graph.addSelectionCell(this.e2eServices[index].e2eEdge)
+ let currentService = this.e2eServices[index].name
+ this.showJsonData(this.servicesMap.get(this.e2eServices[index].name), false)
+ if (this.tunnelTable) this.tunnelTable.rows('.selected').deselect()
}
}
- choseConnectivity(item) {
- if (this.connectivitySelected !== item) this.connectivitySelected = item;
- this.drawService(this.getSvcTree());
+ // Function to show the data of js object in JSON format
+ showJsonData(data, show = true) {
+ /* $(jsonViewer).jsonViewer(data, { withLinks: false })
+ if (show) { popupWnd.show(); popupWnd.fit() }*/
}
- getSvcTree(): Array<object> {
- let tree = []
- let rel = this.connectivitySelected["relationship-list"]["relationship"] || null;
- if (rel){
- tree = rel.filter(rl => rl["related-to"] === "uni")
- .map(obj => {
- let rObj ={};
- rObj["id"] = obj["relationship-data"][0]["relationship-value"],
- rObj["type"] = "leaf";
- return rObj;
- })
+// A utility function for getting value from nested JSON data
+ getJsonValue(obj, path) {
+ if (!obj) return
+ let arr = path.split('.');
+ let tempObj = obj;
+ for (let e of arr) {
+ if (!e) continue
+ if (!(tempObj = tempObj[e]))
+ return;
+ }
+ return tempObj;
+ }
+
+// A utility function for getting the last part of a string split by :
+ getLastColonPart(longStr) {
+ if (!longStr) return ''
+ let strArray = longStr.split(':')
+ if (strArray.length > 1) return strArray[strArray.length - 1]
+ else return ''
+ }
+
+// A utility function for cloning a new object with simple properties of the source ojbect
+ cloneWithSimpleProperties(source) {
+ let target = {}
+ for (let key of Object.keys(source)) {
+ if (this.isBasicType(source[key])) {
+ target[key] = source[key]
}
- return tree;
+ }
+ return target
+ }
+
+// A utility function for copying same properties from the source to the target
+ copySameProperties(source, target) {
+ for (let key of Object.keys(source)) {
+ if (key in target) target[key] = source[key]
+ }
+ }
+
+// A utility function for getting a JSON Array
+ getJsonArray(obj, path) {
+ let tmpObj = this.getJsonValue(obj, path)
+ if (Array.isArray(tmpObj)) return tmpObj
+ else return
+ }
+
+// basic type of js object
+ isBasicType(obj) {
+ return /^(string|number|boolean)$/.test(typeof obj)
+ }
+
+
+ // Get uni edge from endpoint
+ getUniEdgeFromEp(ep) {
+ let node = this.getNodeFromId(ep.networkId, ep.nodeId)
+ if (!node || !ep.portId) return null
+ let uniTp = node.uniTpMap.get(ep.portId.toString())
+ if (uniTp) return uniTp.edge
+ }
+
+
+ // Get node from Ids
+ getNodeFromId(networkId, nodeId) {
+ if (!networkId || !nodeId) return
+ let domain = this.domainMap.get(networkId)
+ if (!domain) return
+ return domain.nodeMap.get(nodeId)
}
- getNodes(ptMapping: Array<object>) : Array<object>{
- let nodes = [];
- for (let pnf of ptMapping){
- if (pnf["layer"] === 2){
- continue;
+ // Lay out the multi-domain topology automatically
+ autoLayout(layer = null) {
+ switch (layer || this.currentLayer) {
+ case 1: this.vertexLayout();
+ case 2: this.edgeLayout.execute((this.gLayers)[2]); break
+ case 3: this.edgeLayout.execute((this.gLayers)[3]); break
+ }
+ }
+ // Lay out domains and nodes automatically
+ vertexLayout() {
+ // Move nodes out of domain for layout
+ for (let [, sotnDomain] of this.domainMap) {
+ for (let [, node] of sotnDomain.nodeMap) {
+ this.graph.model.add((this.gLayers)[1], node.vertex)
}
- let name = pnf["pnfName"];
- let newNode = {
- "id" : name,
- "group": "pnf",
- "radius" : 2,
- "layer" : pnf["layer"] === 2? "Eth" : "Otn"
+ for (let [, clientNode] of sotnDomain.clientNodeMap) {
+ this.graph.model.add((this.gLayers)[1], clientNode.vertex)
}
- nodes.push(newNode);
}
- return nodes;
- }
+ // Disconnect tunnel edge from source and target
+ for (let item of this.e2eTunnels) {
+ item.srcVertex.removeEdge(item.e2eEdge, true)
+ item.dstVertex.removeEdge(item.e2eEdge, false)
+ }
- getLinks(logicalLinks: Array<object>, ptMapping: Array<object>) : Array<object> {
- let links = [];
- for (let ll of logicalLinks){
- let lkName:string = ll["link-name"];
- let topoIdIdx:number = lkName.lastIndexOf("topologyId-");
- if (topoIdIdx !== -1 && lkName.charAt(topoIdIdx + 11) === '2'){
- //Ignore
- continue;
- } else if (typeof ll["relationship-list"] === 'undefined' ||
- typeof ll["relationship-list"]["relationship"] === 'undefined'){
- continue;
+ // Lay out the muti-domain topology including all nodes
+ this.graph.zoomTo(1);
+ this.organicLayout.execute(this.gLayers[1])
+ // get the center point of each domain
+ let centerPoints = []
+ for (let [, sotnDomain] of this.domainMap) {
+ let x = 0, y = 0
+ if (sotnDomain.nodeMap.size == 0) continue
+ for (let [, node] of sotnDomain.nodeMap) {
+ x += node.vertex.geometry.x
+ y += node.vertex.geometry.y
}
- //pnf to pnf
- let endpoints = [];
- for (let pi of ll["relationship-list"]["relationship"]) {
- if (pi["related-to"] === "p-interface"){
- for (let rd of pi["relationship-data"]){
- if (rd["relationship-key"] === "pnf.pnf-name"){
- endpoints.push(rd["relationship-value"]);
- }
- }
+ centerPoints.push({ x: x / sotnDomain.nodeMap.size, y: y / sotnDomain.nodeMap.size })
+ }
+ // calculate the rotation angel of topology in order to rotote it to horizontal direction
+ if (centerPoints.length >= 2) {
+ let theta = Math.atan2(centerPoints[centerPoints.length - 1].y - centerPoints[0].y,
+ centerPoints[centerPoints.length - 1].x - centerPoints[0].x) * 180 / Math.PI
+ let i = 0
+ for (let [, sotnDomain] of this.domainMap) {
+ for (let [, node] of sotnDomain.nodeMap) {
+ rotateVertex(node.vertex, centerPoints[i], -theta)
}
- }
- if (endpoints.length === 2){
- let newlk = {
- "source": endpoints[0],
- "target": endpoints[1],
- "type" : 1
+ for (let [, clientNode] of sotnDomain.clientNodeMap) {
+ let vertex = clientNode.vertex
+ rotateVertex(vertex, centerPoints[i], -theta)
+ // shorten the length of uni link by 1/3
+ let remote = clientNode.networkNode.vertex
+ vertex.geometry.x = (vertex.geometry.x * 2 + remote.geometry.x) / 3
+ vertex.geometry.y = (vertex.geometry.y * 2 + remote.geometry.y) / 3
}
- links.push(newlk);
+ i++
}
}
- return links;
- }
-
- getPnfTpMapping(logicalLinks: Array<object>) {
- let pnfs = [];
- let pnfVisited = {};
- let pnfIndex: number = 0;
- for (let ll of logicalLinks){
- let lkName:string = ll["link-name"];
- let topoIdIdx:number = lkName.lastIndexOf("topologyId-");
- if (topoIdIdx !== -1 && lkName.charAt(topoIdIdx + 11) === '2'){
- //Ethernet layer logical-link
- let lastDashIdx:number = lkName.lastIndexOf("-");
- let pnfName: string = lkName.replace("linkId", "nodeId").substr(0, lastDashIdx);
- let uniName: string = lkName.substr( lastDashIdx+1);
-
- if (pnfVisited[pnfName]){
- let idx: number = parseInt(pnfVisited[pnfName].substr(1));
- pnfs[idx].tps[uniName] = true;
- } else {
- pnfVisited[pnfName] = '#' + pnfIndex;
- let newPnf = {
- "pnfName" : pnfName,
- "tps" : {
- },
- "layer" :2
- }
- newPnf.tps[uniName] = true;
- pnfs.push(newPnf);
- pnfIndex++;
-
- }
- continue;
- } else if (ll["relationship-list"] === undefined ||
- ll["relationship-list"]["relationship"].length === 0 ){
- continue;
+ // resize the domains to just contain the nodes in each domain
+ for (let [, sotnDomain] of this.domainMap) {
+ let vertexes = []
+ for (let [, node] of sotnDomain.nodeMap) {
+ vertexes.push(node.vertex)
}
- for (let pi of ll["relationship-list"]["relationship"]) {
- if (pi["related-to"] === "p-interface"){
- let pnfName:string;
- let tpName:string;
- for (let rd of pi["relationship-data"]){
- if (rd["relationship-key"] === "pnf.pnf-name"){
- pnfName = rd["relationship-value"];
- } else if (rd["relationship-key"] === "p-interface.interface-name"){
- tpName = rd["relationship-value"];
- }
- }
- if (pnfVisited[pnfName]){
- let idx: number = parseInt(pnfVisited[pnfName].substr(1));
- pnfs[idx].tps[tpName] = true;
- } else {
- pnfVisited[pnfName] = '#' + pnfIndex;
- let newPnf = {
- "pnfName" : pnfName,
- "tps" : {
- },
- "layer" : 1
- }
- newPnf.tps[tpName] = true;
- pnfs.push(newPnf);
- pnfIndex++;
+ for (let [, clientNode] of sotnDomain.clientNodeMap) {
+ vertexes.push(clientNode.vertex)
+ }
+ let bounds = this.graph.getBoundingBoxFromGeometry(vertexes, false)
+ sotnDomain.vertex.geometry.setRect(bounds.x, bounds.y, bounds.width, bounds.height)
+ }
+ // Move nodes back to their orginal domain
+ for (let [, sotnDomain] of this.domainMap) {
+ for (let [, node] of sotnDomain.nodeMap) {
+ this.graph.model.add(sotnDomain.vertex, node.vertex)
+ }
+ for (let [, clientNode] of sotnDomain.clientNodeMap) {
+ this.graph.model.add(sotnDomain.vertex, clientNode.vertex)
+ }
+ }
+ // Reconnect tunnel edge to source and target
+ for (let item of this.e2eTunnels) {
+ item.srcVertex.insertEdge(item.e2eEdge, true)
+ item.dstVertex.insertEdge(item.e2eEdge, false)
+ }
- }
- }
+ this.clientNodeLabelLayout()
+ this.domainLayout(50, 50, 50)
+ this.centerGraph()
+
+ function rotateVertex(vertex, centerPoint, theta) {
+ let newPoint = mxAbstractCanvas2D.prototype.rotatePoint(
+ vertex.geometry.x, vertex.geometry.y, theta, centerPoint.x, centerPoint.y)
+ vertex.geometry.x = newPoint.x
+ vertex.geometry.y = newPoint.y
+ }
+ }
+ // Layout domains automatically with the same domain size
+ domainLayout(marginWidth, marginHeight, marginBetween) {
+ let domains = this.graph.model.getChildVertices(this.gLayers[0])
+ this.graph.cellsFolded(domains, false, false)
+ let maxWidth = 0, maxHeight = 0
+ for (let domain of domains) {
+ if (maxWidth < domain.geometry.width) maxWidth = domain.geometry.width
+ if (maxHeight < domain.geometry.height) maxHeight = domain.geometry.height
+ }
+ maxWidth += marginWidth;
+ maxHeight += marginHeight
+ // Center the nodes in the domain
+ for (let domain of domains) {
+ domain.geometry.width = maxWidth + marginBetween
+ domain.geometry.height = maxHeight
+ let nodes = this.graph.model.getChildVertices(domain)
+ let bounds = this.graph.getBoundingBoxFromGeometry(nodes, false)
+ let xOffset = (maxWidth / 2 - bounds.x - bounds.width / 2)
+ let yOffset = (maxHeight / 2 - bounds.y - bounds.height / 2)
+ for (let node of nodes) {
+ node.geometry.x += xOffset
+ node.geometry.y += yOffset
}
}
- return pnfs;
+ this.stackLayout.execute(this.gLayers[0])
+ for (let domain of domains) {
+ domain.geometry.width -= marginBetween
+ }
}
-}
+ getKeys(map){
+ return Array.from(map.keys());
+ }
+ getValues(map){
+ return Array.from(map.values());
+ }
+
+} \ No newline at end of file
diff --git a/usecaseui-portal/src/assets/i18n/cn.json b/usecaseui-portal/src/assets/i18n/cn.json
index e2eab0b2..ecaa4f5b 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 f47d7b99..6dabf760 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"