diff options
Diffstat (limited to 'usecaseui-portal')
34 files changed, 3267 insertions, 1186 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 1bf1b652..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"; @@ -75,6 +74,7 @@ import { CloudLeasedLineModalComponent } from './views/services/intent-based-ser import { CloudLeasedLineComponent } from './views/services/intent-based-services/cloud-leased-line/cloud-leased-line.component'; import { IntentBasedPredictComponent } from './views/services/intent-based-services/intent-based-predict/intent-based-predict.component'; import { IntentBasedServicesComponent } from './views/services/intent-based-services/intent-based-services.component'; +import { IntentInstanceComponent } from './views/services/intent-based-services/intent-instance/intent-instance.component'; import { SmartCloudLeasedModalComponent } from './views/services/intent-based-services/smart-cloud-leased-modal/smart-cloud-leased-modal.component'; import { CcvpnCreationComponent } from "./views/services/services-list/ccvpn-creation/ccvpn-creation.component"; import { CcvpnDetailComponent } from "./views/services/services-list/ccvpn-detail/ccvpn-detail.component"; @@ -135,7 +135,6 @@ registerLocaleData(en); ManagemencsService, TextService, SlicingTaskServices, - EventQueueService, // fakeBackendProvider ], declarations: [ @@ -177,6 +176,7 @@ registerLocaleData(en); MonitorFacpsServiceComponent, IntentBasedPredictComponent, IntentBasedServicesComponent, + IntentInstanceComponent, CloudLeasedLineComponent, CloudLeasedLineModalComponent, SmartCloudLeasedModalComponent, 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/intentBase.service.ts b/usecaseui-portal/src/app/core/services/intentBase.service.ts index 7fb8104f..5ee8424a 100644 --- a/usecaseui-portal/src/app/core/services/intentBase.service.ts +++ b/usecaseui-portal/src/app/core/services/intentBase.service.ts @@ -34,7 +34,10 @@ export class intentBaseService { invalidIntentInstance: this.baseUrl + "/intent/invalidIntentInstance", queryAccessNodeInfo: this.baseUrl + "/intent/queryAccessNodeInfo", intentInstancePredict: this.baseUrl + "/intent/predict", - intentBasedUnifyPredict: this.baseUrl + "/intent/unifyPredict" + intentBasedUnifyPredict: this.baseUrl + "/intent/unifyPredict", + getIntentInstanceList: this.baseUrl + "/intent/getIntentList", + delIntentInstance: this.baseUrl + "/intent/deleteIntent", + verifyIntentInstance: this.baseUrl + "/intent/verifyIntentInstance" }; //The following APIs function are optimizable------------------------ @@ -88,4 +91,17 @@ export class intentBaseService { intentBasedUnifyPredict(requestBody) { return this.http.post<any>(this.url["intentBasedUnifyPredict"], requestBody); } + + getIntentInstanceList(paramsObj) { + return this.http.post<any>(this.url["getIntentInstanceList"], paramsObj); + } + + delIntentInstance(id) { + let params = new HttpParams({ fromObject: { "id": id } }); + return this.http.delete<any>(this.url['delIntentInstance'], { params }); + } + + verifyIntentInstance(paramsObj) { + return this.http.post<any>(this.url['verifyIntentInstance'], paramsObj); + } } 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/core/services/slicingTaskServices.ts b/usecaseui-portal/src/app/core/services/slicingTaskServices.ts index 362e9f6a..292d9bdd 100644 --- a/usecaseui-portal/src/app/core/services/slicingTaskServices.ts +++ b/usecaseui-portal/src/app/core/services/slicingTaskServices.ts @@ -13,13 +13,10 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
-import { Injectable } from "@angular/core";
import {
- HttpClient,
- HttpHeaders,
- HttpParams,
- HttpResponse,
+ HttpClient
} from "@angular/common/http";
+import { Injectable } from "@angular/core";
import { Http } from "../../shared/utils/http";
@Injectable()
export class SlicingTaskServices {
@@ -85,6 +82,7 @@ export class SlicingTaskServices { csmfGetProgress:
"/api/usecaseui/csmf/5gSlicing/service/{serviceId}/progress",
csmfPurchase: "/api/usecaseui-server/v1/uui-slicing/csmf/5gSlicing",
+ csmfPurchaseWithContent: '/api/usecaseui-server/v1/intent/csmf/5gSlicing',
//monitor 5G
fetchTraffic:
this.baseUrl +
@@ -294,7 +292,10 @@ export class SlicingTaskServices { let url = this.url.csmfPurchase;
return this.Http.httpAxios("post", url, paramsObj, failedCallback);
}
-
+ csmfSlicingPurchaseWithContent(paramsObj: any, failedCallback?: any) {
+ let url = this.url.csmfPurchaseWithContent;
+ return this.Http.httpAxios("post", url, paramsObj, failedCallback);
+ }
//monitor 5G
getFetchTraffic(service_list, time, failedCallback?: any) {
let url = this.url.fetchTraffic.replace("{queryTimestamp}", time);
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/fcaps/monitor-management-service/monitor-facps-service/monitor-facps-service.component.ts b/usecaseui-portal/src/app/views/fcaps/monitor-management-service/monitor-facps-service/monitor-facps-service.component.ts index f86f02c1..858bfac2 100644 --- a/usecaseui-portal/src/app/views/fcaps/monitor-management-service/monitor-facps-service/monitor-facps-service.component.ts +++ b/usecaseui-portal/src/app/views/fcaps/monitor-management-service/monitor-facps-service/monitor-facps-service.component.ts @@ -1,5 +1,6 @@ import { HttpClient } from "@angular/common/http"; import { Component, OnInit } from "@angular/core"; +import { ActivatedRoute } from '@angular/router'; import { NzMessageService } from "ng-zorro-antd"; import { intentBaseService } from "../../../../core/services/intentBase.service"; @@ -13,7 +14,8 @@ export class MonitorFacpsServiceComponent implements OnInit { constructor( private nzMessage: NzMessageService, private myHttp: intentBaseService, - private http: HttpClient + private http: HttpClient, + private route: ActivatedRoute ) {} selectedSubscriptionType: string = ""; @@ -57,6 +59,14 @@ export class MonitorFacpsServiceComponent implements OnInit { progressSetTimeOut: any; ngOnInit() { + this.route.queryParams.subscribe( + params => { + this.instanceId= params['instanceId']; + if (this.instanceId) { + this.queryInstancePerformance(this.instanceId); + } + } + ); this.getFinishedInstanceInfo(); this.initOpts = { renderer: "canvas", 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/app/views/services/intent-based-services/cloud-leased-line/cloud-leased-line.component.html b/usecaseui-portal/src/app/views/services/intent-based-services/cloud-leased-line/cloud-leased-line.component.html index f4dd029f..ae733c5f 100644 --- a/usecaseui-portal/src/app/views/services/intent-based-services/cloud-leased-line/cloud-leased-line.component.html +++ b/usecaseui-portal/src/app/views/services/intent-based-services/cloud-leased-line/cloud-leased-line.component.html @@ -51,7 +51,7 @@ nz-button nzType="primary" class="buy-button" - (click)="goMonitorService()" + (click)="goMonitorService(data)" > Intent Monitor </button> diff --git a/usecaseui-portal/src/app/views/services/intent-based-services/cloud-leased-line/cloud-leased-line.component.ts b/usecaseui-portal/src/app/views/services/intent-based-services/cloud-leased-line/cloud-leased-line.component.ts index 7b39f1aa..a9d239df 100644 --- a/usecaseui-portal/src/app/views/services/intent-based-services/cloud-leased-line/cloud-leased-line.component.ts +++ b/usecaseui-portal/src/app/views/services/intent-based-services/cloud-leased-line/cloud-leased-line.component.ts @@ -147,8 +147,14 @@ export class CloudLeasedLineComponent implements OnInit { this.cloudLeasedLineShowFlag = true; } // to monitor page - goMonitorService(): void { - this.router.navigateByUrl('/fcaps/monitor_service'); + goMonitorService(data): void { + // this.router.navigateByUrl('/fcaps/monitor_service');navigate + this.router.navigate(['/fcaps/monitor_service'], { + queryParams: { + instanceId: data.instanceId + }, + skipLocationChange: true + }); } activeCloudLeasedLine(row): void { diff --git a/usecaseui-portal/src/app/views/services/intent-based-services/intent-based-services.component.html b/usecaseui-portal/src/app/views/services/intent-based-services/intent-based-services.component.html index e4262859..52f70988 100644 --- a/usecaseui-portal/src/app/views/services/intent-based-services/intent-based-services.component.html +++ b/usecaseui-portal/src/app/views/services/intent-based-services/intent-based-services.component.html @@ -9,4 +9,9 @@ *ngIf="selectedIndex === 1" ></app-cloud-leased-line> </nz-tab> + <nz-tab [nzTitle]="'i18nTextDefine_intentInstance' | translate"> + <app-intent-instance + *ngIf="selectedIndex === 2" + ></app-intent-instance> + </nz-tab> </nz-tabset>
\ No newline at end of file diff --git a/usecaseui-portal/src/app/views/services/intent-based-services/intent-instance/intent-instance.component.html b/usecaseui-portal/src/app/views/services/intent-based-services/intent-instance/intent-instance.component.html new file mode 100644 index 00000000..ee71be03 --- /dev/null +++ b/usecaseui-portal/src/app/views/services/intent-based-services/intent-instance/intent-instance.component.html @@ -0,0 +1,64 @@ +<div class="intent-resource_tab"> + <div class="intent-resource-table-list"> + <nz-table + #basicTable [nzData]="listOfData" + [nzFrontPagination]="false" + nzShowSizeChanger + [nzPageSizeOptions]="[5,10,15,20]" + [nzTotal]='total' + [(nzPageSize)]="pageSize" + [(nzPageIndex)]='pageIndex' + [nzLoading]="loading" + (nzPageIndexChange)="searchData()" + (nzPageSizeChange)="searchData()" + [nzScroll]="{ x: '1500px' }" + nzTableLayout="fixed" + > + <thead> + <tr> + <th [nzLeft]="true">No</th> + <th>Intent Name</th> + <th>Intent Source</th> + <th>Customer</th> + <th nzEllipsis>Intent Content</th> + <th>Intent Config</th> + <th>Business Instance</th> + <th [nzRight]="true" [nzWidth]="300"></th> + </tr> + </thead> + <tbody> + <ng-template ngFor let-data [ngForOf]="basicTable.data" let-i="index"> + <tr> + <td [nzLeft]="true">{{i+1}}</td> + <td>{{ data.intentName }}</td> + <td>{{ data.intentSource }}</td> + <td>{{ data.customer }}</td> + <td [title]="data.intentContent" nzEllipsis> + {{ data.intentContent }} + </td> + <td>{{ data.intentConfig }}</td> + <td>{{ data.businessInstance }}</td> + <td [nzRight]="true"> + <button + nz-button + nzType="primary" + class="buy-button" + (click)="verificationIntentionInstance(data)" + > + check + </button> + <button + nz-button + nzType="primary" + class="buy-button" + (click)="deleteIntentionInstance(data)" + > + Delete + </button> + </td> + </tr> + </ng-template> + </tbody> + </nz-table> + </div> +</div>
\ No newline at end of file diff --git a/usecaseui-portal/src/app/views/services/intent-based-services/intent-instance/intent-instance.component.less b/usecaseui-portal/src/app/views/services/intent-based-services/intent-instance/intent-instance.component.less new file mode 100644 index 00000000..f665fdb0 --- /dev/null +++ b/usecaseui-portal/src/app/views/services/intent-based-services/intent-instance/intent-instance.component.less @@ -0,0 +1,87 @@ +.intent-resource_tab { + width: 103%; + margin-left: 60px!important; + margin-top: -35px!important; + .ant-tabs-content.ant-tabs-content-animated{ + padding: 20px 0!important; + } +} +.slicing-resource-table{ + padding: 20px!important; +} +.intent-resource-table-list{ + padding: 20px!important; + nz-table{ + .ant-table-wrapper{ + .ant-table-body{ + th,td{ + word-break: break-word!important; + } + } + } + } +} +nz-select { + width: 200px; +} + +.task_status { + margin-bottom: 20px; + + span { + margin-right: 5%; + } +} + +.action-icon { + display: inline-block; + vertical-align: top; +} + +i.anticon { + cursor: pointer; + font-size: 18px; + padding: 2px 15px; + vertical-align: inherit !important; + + &:hover { + color: #147dc2; + } +} + +.cannotclick { + pointer-events: none; + color: #aaa; + opacity: 0.6; +} + +.buy-button { + float: right; + margin-right: 2%; +} +::ng-deep .ant-table-row .buy-button { + float: left; +} + +::ng-deep .ant-table-th-right-sticky { + width: 200px; +} +.ant-table-th-right-sticky, .ant-table-td-right-sticky { + position: -webkit-sticky; + position: sticky; + z-index: 1; + right: 0; +} +.ant-table-th-left-sticky, .ant-table-td-left-sticky { + position: -webkit-sticky; + position: sticky; + z-index: 1; + left: 0; +} +.ellipsisClass{ + display: inline-block; + max-width: 150px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +}
\ No newline at end of file diff --git a/usecaseui-portal/src/app/views/services/intent-based-services/intent-instance/intent-instance.component.ts b/usecaseui-portal/src/app/views/services/intent-based-services/intent-instance/intent-instance.component.ts new file mode 100644 index 00000000..d13b9d7e --- /dev/null +++ b/usecaseui-portal/src/app/views/services/intent-based-services/intent-instance/intent-instance.component.ts @@ -0,0 +1,96 @@ +import { Component, OnInit } from "@angular/core"; +import { Router } from "@angular/router"; +import { NzMessageService } from "ng-zorro-antd"; +import { intentBaseService } from "../../../../core/services/intentBase.service"; + +@Component({ + selector: 'app-intent-instance', + templateUrl: './intent-instance.component.html', + styleUrls: ['./intent-instance.component.less'] +}) +export class IntentInstanceComponent implements OnInit { + + constructor( + private router:Router, + private myHttp: intentBaseService, + private nzMessage: NzMessageService + ) {} + + ngOnChanges() {} + + ngOnInit() { + this.pageIndex = 1; + this.pageSize = 10; + this.getIntentionInstanceList(); + } + + ngOnDestroy() {} + + // table lists + listOfData: any[] = []; + // pageSize or pageNum + pageIndex: number = 1; + pageSize: number = 10; + total: number = 0; + loading = false; + + // init source data + getIntentionInstanceList(): void { + this.myHttp.getIntentInstanceList({ + currentPage: this.pageIndex, + pageSize: this.pageSize + }).subscribe((response) => { + const { code, message, data:{ totalRecords, list } } = response; + if (code !== 200) { + this.nzMessage.error(message); + return; + } + + this.total = totalRecords; + this.listOfData = list; + }, (err) => { + console.log(err); + }); + } + + // change page message + searchData(): void { + this.getIntentionInstanceList(); + } + + verificationIntentionInstance(row): void { + this.myHttp.verifyIntentInstance({ + id: row.id + }).subscribe((response) => { + const { code, message, data } = response; + if (code !== 200) { + this.nzMessage.error(message); + return; + } + this.nzMessage.success(data); + this.resetParam2Query(); + }, (err) => { + console.log(err); + }); + } + + deleteIntentionInstance(row): void { + this.myHttp.delIntentInstance(row.id).subscribe((response) => { + const { code, message } = response; + if (code !== 200) { + this.nzMessage.error(message); + return; + } + this.nzMessage.success('Delete IntentionInstance Success'); + this.resetParam2Query(); + }, (err) => { + console.log(err); + }); + } + + resetParam2Query() { + this.pageIndex = 1; + this.pageSize = 10; + this.getIntentionInstanceList(); + } +}
\ No newline at end of file diff --git a/usecaseui-portal/src/app/views/services/slicing-management/csmf-slicing-business-management/business-order/business-order.component.ts b/usecaseui-portal/src/app/views/services/slicing-management/csmf-slicing-business-management/business-order/business-order.component.ts index aa5a5db1..70ef4ef8 100644 --- a/usecaseui-portal/src/app/views/services/slicing-management/csmf-slicing-business-management/business-order/business-order.component.ts +++ b/usecaseui-portal/src/app/views/services/slicing-management/csmf-slicing-business-management/business-order/business-order.component.ts @@ -51,6 +51,7 @@ export class BusinessOrderComponent implements OnInit { uEMobilityLevel: "stationary", coverageArea: "", coverageAreaNumber: null, + intentContent: '', }; areaList: any[] = []; validateRulesShow: any[] = []; @@ -95,6 +96,7 @@ export class BusinessOrderComponent implements OnInit { uEMobilityLevel: "stationary", coverageArea: "", coverageAreaNumber: null, + intentContent: '' }; this.validateRulesShow = []; } @@ -152,7 +154,18 @@ export class BusinessOrderComponent implements OnInit { this.handleCancel(); }; this.loading = true; - this.myhttp + + // csmfSlicingPurchaseWithContent + const { intentContent } = this.slicing_order_info; + if (intentContent) { + this.csmfSlicingPurchaseWithContent(paramsObj, csmfSlicingPurchaseFailedCallback); + return; + } + this.csmfSlicingPurchase(paramsObj, csmfSlicingPurchaseFailedCallback); + } + + csmfSlicingPurchase(paramsObj, csmfSlicingPurchaseFailedCallback): void { + this.myhttp .csmfSlicingPurchase(paramsObj, csmfSlicingPurchaseFailedCallback) .then((res) => { const result = res.result_header; @@ -168,5 +181,24 @@ export class BusinessOrderComponent implements OnInit { this.loading = false; this.handleCancel(); }); - } + } + + csmfSlicingPurchaseWithContent(paramsObj, csmfSlicingPurchaseFailedCallback): void { + this.myhttp + .csmfSlicingPurchaseWithContent(paramsObj, csmfSlicingPurchaseFailedCallback) + .then((res) => { + const result = res.result_header; + if ( + result && + result.result_code && + +result.result_code === 200 + ) { + console.log(res); + } else { + this.message.create("error", "Network error"); + } + this.loading = false; + this.handleCancel(); + }); + } } diff --git a/usecaseui-portal/src/assets/i18n/cn.json b/usecaseui-portal/src/assets/i18n/cn.json index ad9d855e..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": "订购类型", @@ -172,7 +174,7 @@ "i18nTextDefine_manageService":"管理服务", "i18nTextDefine_cloudLeasedLine":"Cloud Leased Line", "i18nTextDefine_intentBaseService":"Intent Based Services", - + "i18nTextDefine_intentInstance":"Intent Instance Management", "mdons-network-component":"--:", "i18nTextDefine_InterDomainTitle": "域间链接", diff --git a/usecaseui-portal/src/assets/i18n/en.json b/usecaseui-portal/src/assets/i18n/en.json index 034262b2..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", @@ -166,7 +168,7 @@ "i18nTextDefine_manageService":"Manage Service", "i18nTextDefine_cloudLeasedLine":"Cloud Leased Line", "i18nTextDefine_intentBaseService":"Intent Based Services", - + "i18nTextDefine_intentInstance":"Intent Instance Management", "mdons-network-component":"--:", "i18nTextDefine_InterDomainTitle": "Inter-domain link", 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" |