From f792671ae247a931f34d902e9276202b5016ef9a Mon Sep 17 00:00:00 2001 From: Ittay Stern Date: Sun, 7 Jul 2019 19:23:03 +0300 Subject: Merge from ecomp 718fd196 - Modern UI Issue-ID: VID-378 Change-Id: I2736b98426e324ec3aa233b034229ba84d99839f Signed-off-by: Ittay Stern --- .../src/app/drawingBoard/drawingBoard.module.ts | 6 +- .../objectToModelTree/modelTreeNode.model.ts | 30 + .../available-models-tree.component.html | 2 +- .../available-models-tree.component.scss | 11 +- .../available-models-tree.component.ts | 23 +- .../available-models-tree.service.spec.ts | 227 +++- .../available-models-tree.service.ts | 19 + .../component-info/component-info-model.ts | 12 +- .../component-info/component-info.component.scss | 2 +- .../component-info/component-info.component.ts | 4 +- .../component-info/component-info.service.spec.ts | 12 +- .../component-info/component-info.service.ts | 31 +- .../drawing-board-header.component.html | 14 +- .../drawing-board-header.component.scss | 23 + .../drawing-board-header.component.ts | 29 +- .../drawing-board-header.service.spec.ts | 67 +- .../drawing-board-header.service.ts | 25 +- .../dragAndDrop/dragAndDrop.service.spec.ts | 24 +- .../drawing-board-tree.component.ts | 30 +- .../drawing-board-tree/drawing-board-tree.html | 95 +- .../drawing-board-tree/drawing-board-tree.scss | 146 ++- .../drawing-board-tree.service.spec.ts | 139 ++- .../drawing-board-tree.service.ts | 3 +- .../duplicate/duplicate.service.spec.ts | 55 +- .../duplicate/duplicate.service.ts | 15 +- .../objectsToTree/models/basic.model.info.ts | 19 +- .../collectionResource.model.info.spec.ts | 1207 ++++++++++++++++++++ .../collectionResource.model.info.ts | 102 ++ .../configuration/configuration.model.info.spec.ts | 326 +++--- .../configuration/configuration.model.info.ts | 10 +- .../models/ncf/ncf.model.info.spec.ts | 112 ++ .../objectsToTree/models/ncf/ncf.model.info.ts | 121 ++ .../models/network/network.model.info.spec.ts | 372 +++--- .../models/network/network.model.info.ts | 77 +- .../models/pnf/pnf.model.info.spec.ts | 134 +++ .../objectsToTree/models/pnf/pnf.model.info.ts | 70 ++ .../relatedVnfMember.info.model.spec.ts | 268 ++--- .../relatedVnfMember.info.model.ts | 7 +- .../models/vfModule/vfModule.model.info.spec.ts | 296 +++-- .../models/vfModule/vfModule.model.info.ts | 29 +- .../models/vnf/vnf.model.info.spec.ts | 343 +++--- .../objectsToTree/models/vnf/vnf.model.info.ts | 45 +- .../vnfGrouping/vnfGrouping.model.info.spec.ts | 158 ++- .../models/vnfGrouping/vnfGrouping.model.info.ts | 189 ++- .../models/vpn/vpn.model.info.spec.ts | 66 ++ .../objectsToTree/models/vpn/vpn.model.info.ts | 96 ++ .../models/vrf/vrf.model.info.spec.ts | 238 ++++ .../objectsToTree/models/vrf/vrf.model.info.ts | 188 +++ .../vrf/vrfModal/networkStep/network.step.model.ts | 18 + .../networkStep/network.step.service.spec.ts | 458 ++++++++ .../vrfModal/networkStep/network.step.service.ts | 242 ++++ .../models/vrf/vrfModal/vpnStep/vpn.step.model.ts | 17 + .../vrf/vrfModal/vpnStep/vpn.step.service.spec.ts | 463 ++++++++ .../vrf/vrfModal/vpnStep/vpn.step.service.ts | 195 ++++ .../objectToInstanceTree.service.spec.ts | 627 +++++----- .../objectToInstanceTree.service.ts | 53 +- .../objectToModelTree.service.spec.ts | 259 +++-- .../objectToModelTree/objectToModelTree.service.ts | 48 +- .../objectsToTree/objectToTree.service.ts | 14 +- .../objectsToTree/shared.tree.service.spec.ts | 714 +++++++++--- .../objectsToTree/shared.tree.service.ts | 37 +- .../service-planning.component.html | 10 +- 62 files changed, 6893 insertions(+), 1779 deletions(-) create mode 100644 vid-webpack-master/src/app/drawingBoard/objectsToTree/objectToModelTree/modelTreeNode.model.ts create mode 100644 vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/collectionResource/collectionResource.model.info.spec.ts create mode 100644 vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/collectionResource/collectionResource.model.info.ts create mode 100644 vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/ncf/ncf.model.info.spec.ts create mode 100644 vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/ncf/ncf.model.info.ts create mode 100644 vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/pnf/pnf.model.info.spec.ts create mode 100644 vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/pnf/pnf.model.info.ts create mode 100644 vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vpn/vpn.model.info.spec.ts create mode 100644 vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vpn/vpn.model.info.ts create mode 100644 vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vrf/vrf.model.info.spec.ts create mode 100644 vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vrf/vrf.model.info.ts create mode 100644 vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vrf/vrfModal/networkStep/network.step.model.ts create mode 100644 vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vrf/vrfModal/networkStep/network.step.service.spec.ts create mode 100644 vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vrf/vrfModal/networkStep/network.step.service.ts create mode 100644 vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vrf/vrfModal/vpnStep/vpn.step.model.ts create mode 100644 vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vrf/vrfModal/vpnStep/vpn.step.service.spec.ts create mode 100644 vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vrf/vrfModal/vpnStep/vpn.step.service.ts (limited to 'vid-webpack-master/src/app/drawingBoard') diff --git a/vid-webpack-master/src/app/drawingBoard/drawingBoard.module.ts b/vid-webpack-master/src/app/drawingBoard/drawingBoard.module.ts index 6a3574f23..67b54059e 100644 --- a/vid-webpack-master/src/app/drawingBoard/drawingBoard.module.ts +++ b/vid-webpack-master/src/app/drawingBoard/drawingBoard.module.ts @@ -34,6 +34,8 @@ import {SdcUiServices} from "onap-ui-angular/dist"; import {CreateDynamicComponentService} from "onap-ui-angular/dist/utils/create-dynamic-component.service"; import {ComponentInfoComponent} from './service-planning/component-info/component-info.component'; import {ComponentInfoService} from "./service-planning/component-info/component-info.service"; +import {NetworkStepService} from "./service-planning/objectsToTree/models/vrf/vrfModal/networkStep/network.step.service"; +import {VpnStepService} from "./service-planning/objectsToTree/models/vrf/vrfModal/vpnStep/vpn.step.service"; @NgModule({ @@ -66,7 +68,9 @@ import {ComponentInfoService} from "./service-planning/component-info/component- SdcUiServices.LoaderService, CreateDynamicComponentService, ComponentInfoService, - DragAndDropService], + DragAndDropService, + NetworkStepService, + VpnStepService], declarations: [ AvailableModelsTreeComponent, HighlightPipe, diff --git a/vid-webpack-master/src/app/drawingBoard/objectsToTree/objectToModelTree/modelTreeNode.model.ts b/vid-webpack-master/src/app/drawingBoard/objectsToTree/objectToModelTree/modelTreeNode.model.ts new file mode 100644 index 000000000..36dd3ac47 --- /dev/null +++ b/vid-webpack-master/src/app/drawingBoard/objectsToTree/objectToModelTree/modelTreeNode.model.ts @@ -0,0 +1,30 @@ +import {ITreeNode} from "angular-tree-component/dist/defs/api"; +import {ModelInformationItem} from "../../../shared/components/model-information/model-information.component"; +import {ComponentInfoType} from "../../service-planning/component-info/component-info-model"; + +export interface IModelTreeNodeModel { + id?: string; + modelCustomizationId? : string; + modelVersionId?: string; + modelUniqueId? : string; + name?: string; + tooltip?: string; + type?: string; + count?: number; + max?: number; + children?: any[]; + disabled?: boolean; + dynamicInputs?: any; + isEcompGeneratedNaming?: boolean; + typeName? : string; + componentInfoType?: ComponentInfoType; + + + onAddClick?(node, serviceId); + getNodeCount?(node, serviceId); + getMenuAction?(node, serviceId); + showNodeIcons?(node, serviceId); + getModel?(modelId: string, instance: any, serviceHierarchy) + getInfo?(model, instance): ModelInformationItem[]; + +} diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.component.html b/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.component.html index 91acca0d1..7864808fc 100644 --- a/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.component.html +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.component.html @@ -34,7 +34,7 @@ [name]="'maximum'"> - + diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.component.scss b/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.component.scss index 90c2cd878..62e9be73a 100644 --- a/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.component.scss +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.component.scss @@ -168,7 +168,7 @@ available-models-tree { .node-content-wrapper.node-content-wrapper-focused { tree-node-content { > div { - background: #009FDB; + background: #009FDB !important; color: white; } } @@ -178,7 +178,7 @@ available-models-tree { > div { background: #F2F2F2; &.tree-node-focused:not(.tree-node-disabled) { - background: #009FDB; + background: #009FDB !important; color: white; } span.actions { @@ -206,6 +206,8 @@ available-models-tree { border-color: #1EB9F3; } .node-content-wrapper-focused{ + background: #009FDB !important; + border-color: #1EB9F3; box-shadow: none; tree-node-content { @@ -395,6 +397,7 @@ available-models-tree { .node-content-wrapper.node-content-wrapper-focused{ border-color:#1EB9F3 ; + background: #009FDB !important; tree-node-content > div{ .vf-type,.model-info,.model-info .property-name { color: white; @@ -410,7 +413,9 @@ available-models-tree { } - + available-models-tree .node-content-wrapper.node-content-wrapper-focused { + background: #009FDB !important; + } .vf-type { width: 40px; height: 45px; diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.component.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.component.ts index 31d7b03b8..145ee19da 100644 --- a/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.component.ts +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.component.ts @@ -25,6 +25,9 @@ import {VnfGroupControlGenerator} from "../../../shared/components/genericForm/f import {HighlightPipe} from "../../../shared/pipes/highlight/highlight-filter.pipe"; import * as _ from 'lodash'; import {DrawingBoardTreeComponent} from "../drawing-board-tree/drawing-board-tree.component"; +import {ComponentInfoModel} from "../component-info/component-info-model"; +import {ComponentInfoService} from "../component-info/component-info.service"; +import {FeatureFlagsService, Features} from "../../../shared/services/featureFlag/feature-flags.service"; @Component({ @@ -72,6 +75,7 @@ export class AvailableModelsTreeComponent { value => { this.serviceHierarchy = value; this.nodes = this._objectToModelTreeService.convertServiceHierarchyModelToTreeNodes(this.serviceHierarchy); + this.shouldOpenVRFModal(this.nodes); }, error => { console.log('error is ', error) @@ -102,6 +106,13 @@ export class AvailableModelsTreeComponent { }; + shouldOpenVRFModal(nodes) :void { + const node = this._availableModelsTreeService.shouldOpenVRFModal(nodes, this.serviceModelId, this.store.getState().service); + if(!_.isNil(node)){ + this.onClickAdd(node, this.serviceModelId); + } + } + getNodeName(node : ITreeNode, filter : string) { return this._highlightPipe.transform(node.data.name ,filter ? filter : ''); } @@ -119,6 +130,13 @@ export class AvailableModelsTreeComponent { node.expand(); this._sharedTreeService.setSelectedVNF(null); this.highlightInstances.emit(node.data.modelUniqueId); + if (FeatureFlagsService.getFlagState(Features.FLAG_1906_COMPONENT_INFO, this.store)) { + const serviceHierarchy = this._store.getState().service.serviceHierarchy[this.serviceModelId]; + const model = node.data.getModel(node.data.name, node.data, serviceHierarchy); + const modelInfoItems = node.data.getInfo(model, null); + const componentInfoModel :ComponentInfoModel = this._sharedTreeService.addGeneralInfoItems(modelInfoItems, node.data.componentInfoType, model, null); + ComponentInfoService.triggerComponentInfoChange.next(componentInfoModel); + } } @@ -127,7 +145,7 @@ export class AvailableModelsTreeComponent { this.isNewObject = isNewObject; let data = node.data; let dynamicInputs = data.dynamicInputs; - let isAlaCarte: boolean = this.serviceHierarchy.service.instantiationType == "A-La-Carte"; + let isAlaCarte: boolean = this.serviceHierarchy.service.vidNotions.instantiationType == 'ALaCarte'; let isEcompGeneratedNaming: boolean = data.isEcompGeneratedNaming; let type: string = data.type; if (!this.store.getState().global.flags['FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD'] || node.data.type === ServiceNodeTypes.VF || @@ -150,7 +168,8 @@ export class AvailableModelsTreeComponent { let existVnf = this._store.getState().service.serviceInstance[this.serviceModelId].vnfs; if(!_.isNil(existVnf)){ for(let vnfKey in existVnf){ - if(existVnf[vnfKey]['modelInfo'].modelUniqueId === node.parent.data.id){ + const modelUniqueId = existVnf[vnfKey]['modelInfo'].modelCustomizationId || existVnf[vnfKey]['modelInfo'].modelInvariantId; + if(modelUniqueId === node.parent.data.id){ this.store.dispatch(createVFModuleInstance(vfModule, node.data.name, this.serviceModelId, null, vnfKey)); DrawingBoardTreeComponent.triggerreCalculateIsDirty.next(this.serviceModelId); } diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.service.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.service.spec.ts index cf9d04aae..4abc20324 100644 --- a/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.service.spec.ts +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.service.spec.ts @@ -1,9 +1,6 @@ -import {TestBed, getTestBed} from '@angular/core/testing'; -import { - HttpClientTestingModule, - HttpTestingController -} from '@angular/common/http/testing'; -import {AvailableModelsTreeService, AvailableNodeIcons} from './available-models-tree.service'; +import {getTestBed, TestBed} from '@angular/core/testing'; +import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'; +import {AvailableModelsTreeService} from './available-models-tree.service'; import {ServiceNodeTypes} from "../../../shared/models/ServiceNodeTypes"; import {DefaultDataGeneratorService} from "../../../shared/services/defaultDataServiceGenerator/default.data.generator.service"; import {MessageBoxService} from "../../../shared/components/messageBox/messageBox.service"; @@ -63,9 +60,9 @@ describe('Available Models Tree Service', () => { // add vfModule with dynamicInputs without defaultValues should return true result = service.shouldOpenDialog(ServiceNodeTypes.VFmodule, [{ - id: '2017488_adiodvpe0_vnf_config_template_version', + id: '2017488_pasqualevpe0_vnf_config_template_version', type: 'string', - name: '2017488_adiodvpe0_vnf_config_template_version', + name: '2017488_pasqualevpe0_vnf_config_template_version', isRequired: true, description: 'VPE Software Version' }], true); @@ -73,9 +70,9 @@ describe('Available Models Tree Service', () => { // add vfModule with dynamicInputs with defaultValues should return false result = service.shouldOpenDialog(ServiceNodeTypes.VFmodule, [{ - id: '2017488_adiodvpe0_vnf_config_template_version', + id: '2017488_pasqualevpe0_vnf_config_template_version', type: 'string', - name: '2017488_adiodvpe0_vnf_config_template_version', + name: '2017488_pasqualevpe0_vnf_config_template_version', value: '17.2', isRequired: true, description: 'VPE Software Version' @@ -84,6 +81,160 @@ describe('Available Models Tree Service', () => { }); }); + + test('shouldOpenVRFModal', () => { + const nodes = [{ + "id": "dd024d73-9bd1-425d-9db5-476338d53433", + "modelCustomizationId": "dd024d73-9bd1-425d-9db5-476338d53433", + "modelVersionId": "9cac02be-2489-4374-888d-2863b4511a59", + "modelUniqueId": "dd024d73-9bd1-425d-9db5-476338d53433", + "name": "VRF Entry Configuration 0", + "tooltip": "VRF", + "type": "VRF", + "count": 0, + "max": 1, + "children": [], + "disabled": false, + "dynamicInputs": [], + "isEcompGeneratedNaming": false, + "typeName": "VRF", + "componentInfoType": "VRF", + "getModel" : ()=>{ + return { + min : 1 + } + } + }]; + + + const serviceStore = { + "serviceInstance": { + "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc": { + "action": "Create", + "isDirty": false, + "vnfs": {}, + "vrfs": { + "VRF Entry Configuration": { + "action": "Create", + "uuid": "9cac02be-2489-4374-888d-2863b4511a59", + "inputs": {}, + "type": "Configuration", + "trackById": "s0z58emiprq", + "modelInfo": { + "modelInvariantId": "b67a289b-1688-496d-86e8-1583c828be0a", + "modelVersionId": "69e09f68-8b63-4cc9-b9ff-860960b5db09", + "modelName": "VRF Entry Configuration", + "modelVersion": "5.0", + "modelCustomizationId": "dd024d73-9bd1-425d-9db5-476338d53433", + "modelUniqueId": "dd024d73-9bd1-425d-9db5-476338d53433", + "modelCustomizationName": "VRF Entry Configuration", + "uuid": "9cac02be-2489-4374-888d-2863b4511a59" + }, + "vpns": { + "VRF Entry Configuration vpns 1": { + "action": "Create", + "instanceId": "46fcb25a-e7ba-4d96-99ba-3bb6eae6aba7", + "instanceName": "LPPVPN", + "platformName": "AVPN", + "instanceType": "SERVICE-INFRASTRUCTURE", + "region": "USA,EMEA", + "customerId": "VPN1271", + "modelInfo": { + "modelCustomizationId": null, + "modelInvariantId": null, + "modelVersionId": null + }, + "routeTargets": null, + "isSelected": true + } + }, + "networks": { + "VRF Entry Configuration networks 1": { + "action ": "Create", + "instanceName": "AUK51a_oam_calea_net_0", + "instanceType": "SR-IOV-PROVIDER2-0", + "role": "role-1", + "orchStatus": "Active", + "physicalName": "sriovnet0", + "instanceId": "46fcb25a-e7ba-4d96-99ba-3bb6eae6aba7", + "serviceName": "LPPVPN", + "serv§iceUUID": "VPN1271", + "tenantName": "ecomp_ispt", + "lcpCloudRegionId": "USA,EMEA", + "modelInfo": { + "modelCustomizationId": "46fcb25a-e7ba-4d96-99ba-3bb6eae6aba7", + "modelInvariantId": "46fcb25a-e7ba-4d96-99ba-3bb6eae6aba7", + "modelVersionId": "7010093-df36-4dcb-8428-c3d02bf3f88d", + "modelType": "vpn" + } + } + } + } + }, + "instanceParams": [], + "validationCounter": 0, + "existingNames": {}, + "existingVNFCounterMap": {}, + "existingVRFCounterMap": {}, + "existingVnfGroupCounterMap": {}, + "existingNetworksCounterMap": {}, + "optionalGroupMembersMap": {}, + "networks": {}, + "vnfGroups": {}, + "bulkSize": 1, + "service": { + "vidNotions": { + "instantiationUI": "serviceWithVRF", + "modelCategory": "other", + "viewEditUI": "serviceWithVRF", + "instantiationType": "ALaCarte" + }, + "uuid": "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc", + "invariantUuid": "7ee41ce4-4827-44b0-a48e-2707a59905d2", + "name": "VRF Service for Test", + "version": "1.0", + "toscaModelURL": null, + "category": "Network L4+", + "serviceType": "INFRASTRUCTURE", + "serviceRole": "Configuration", + "description": "xxx", + "serviceEcompNaming": "true", + "instantiationType": "A-La-Carte", + "inputs": {} + }, + "collectionResources": {}, + "configurations": {}, + "fabricConfigurations": {}, + "serviceProxies": {}, + "vfModules": {}, + "volumeGroups": {}, + "pnfs": {}, + "isALaCarte": true, + "testApi": "VNF_API", + "vidNotions": { + "instantiationUI": "serviceWithVVRF", + "modelCategory": "other", + "viewEditUI": "serviceWithVRF", + "instantiationType": "ALaCarte" + } + } + } + }; + + const serviceModelId :string = '4117a0b6-e234-467d-b5b9-fe2f68c8b0fc'; + + let result: boolean = service.shouldOpenVRFModal(nodes, serviceModelId, serviceStore); + expect(result).not.toBeNull(); + + serviceStore.serviceInstance[serviceModelId].existingVRFCounterMap = { + "dd024d73-9bd1-425d-9db5-476338d53433" : 1 + }; + + result = service.shouldOpenVRFModal(nodes, serviceModelId, serviceStore); + expect(result).toBeNull(); + + }); + function getServiceServiceHierarchy() { return JSON.parse(JSON.stringify( { @@ -103,11 +254,11 @@ describe('Available Models Tree Service', () => { 'inputs': {} }, 'vnfs': { - 'VF_vMee 0': { + 'VF_vGeraldine 0': { 'uuid': 'd6557200-ecf2-4641-8094-5393ae3aae60', 'invariantUuid': '4160458e-f648-4b30-a176-43881ffffe9e', - 'description': 'VSP_vMee', - 'name': 'VF_vMee', + 'description': 'VSP_vGeraldine', + 'name': 'VF_vGeraldine', 'version': '2.0', 'customizationUuid': '91415b44-753d-494c-926a-456a9172bbb9', 'inputs': {}, @@ -277,54 +428,54 @@ describe('Available Models Tree Service', () => { 'sctp-b-egress-dst_end_port': '65535.0' }, 'type': 'VF', - 'modelCustomizationName': 'VF_vMee 0', + 'modelCustomizationName': 'VF_vGeraldine 0', 'vfModules': { - 'vf_vmee0..VfVmee..vmme_vlc..module-1': { + 'vf_vgeraldine0..VfVgeraldine..vflorence_vlc..module-1': { 'uuid': '522159d5-d6e0-4c2a-aa44-5a542a12a830', 'invariantUuid': '98a7c88b-b577-476a-90e4-e25a5871e02b', 'customizationUuid': '55b1be94-671a-403e-a26c-667e9c47d091', 'description': null, - 'name': 'VfVmee..vmme_vlc..module-1', + 'name': 'VfVgeraldine..vflorence_vlc..module-1', 'version': '2', - 'modelCustomizationName': 'VfVmee..vmme_vlc..module-1', + 'modelCustomizationName': 'VfVgeraldine..vflorence_vlc..module-1', 'properties': {'minCountInstances': 0, 'maxCountInstances': null, 'initialCount': 0}, 'commands': {}, 'volumeGroupAllowed': false }, - 'vf_vmee0..VfVmee..vmme_gpb..module-2': { + 'vf_vgeraldine0..VfVgeraldine..vflorence_gpb..module-2': { 'uuid': '41708296-e443-4c71-953f-d9a010f059e1', 'invariantUuid': '1cca90b8-3490-495e-87da-3f3e4c57d5b9', 'customizationUuid': '6add59e0-7fe1-4bc4-af48-f8812422ae7c', 'description': null, - 'name': 'VfVmee..vmme_gpb..module-2', + 'name': 'VfVgeraldine..vflorence_gpb..module-2', 'version': '2', - 'modelCustomizationName': 'VfVmee..vmme_gpb..module-2', + 'modelCustomizationName': 'VfVgeraldine..vflorence_gpb..module-2', 'properties': {'minCountInstances': 0, 'maxCountInstances': null, 'initialCount': 0}, 'commands': {}, 'volumeGroupAllowed': false }, - 'vf_vmee0..VfVmee..base_vmme..module-0': { + 'vf_vgeraldine0..VfVgeraldine..base_vflorence..module-0': { 'uuid': 'a27f5cfc-7f12-4f99-af08-0af9c3885c87', 'invariantUuid': 'a6f9e51a-2b35-416a-ae15-15e58d61f36d', 'customizationUuid': 'f8c040f1-7e51-4a11-aca8-acf256cfd861', 'description': null, - 'name': 'VfVmee..base_vmme..module-0', + 'name': 'VfVgeraldine..base_vflorence..module-0', 'version': '2', - 'modelCustomizationName': 'VfVmee..base_vmme..module-0', + 'modelCustomizationName': 'VfVgeraldine..base_vflorence..module-0', 'properties': {'minCountInstances': 1, 'maxCountInstances': 1, 'initialCount': 1}, 'commands': {}, 'volumeGroupAllowed': true } }, 'volumeGroups': { - 'vf_vmee0..VfVmee..base_vmme..module-0': { + 'vf_vgeraldine0..VfVgeraldine..base_vflorence..module-0': { 'uuid': 'a27f5cfc-7f12-4f99-af08-0af9c3885c87', 'invariantUuid': 'a6f9e51a-2b35-416a-ae15-15e58d61f36d', 'customizationUuid': 'f8c040f1-7e51-4a11-aca8-acf256cfd861', 'description': null, - 'name': 'VfVmee..base_vmme..module-0', + 'name': 'VfVgeraldine..base_vflorence..module-0', 'version': '2', - 'modelCustomizationName': 'VfVmee..base_vmme..module-0', + 'modelCustomizationName': 'VfVgeraldine..base_vflorence..module-0', 'properties': {'minCountInstances': 1, 'maxCountInstances': 1, 'initialCount': 1} } } @@ -370,52 +521,52 @@ describe('Available Models Tree Service', () => { }, 'serviceProxies': {}, 'vfModules': { - 'vf_vmee0..VfVmee..vmme_vlc..module-1': { + 'vf_vgeraldine0..VfVgeraldine..vflorence_vlc..module-1': { 'uuid': '522159d5-d6e0-4c2a-aa44-5a542a12a830', 'invariantUuid': '98a7c88b-b577-476a-90e4-e25a5871e02b', 'customizationUuid': '55b1be94-671a-403e-a26c-667e9c47d091', 'description': null, - 'name': 'VfVmee..vmme_vlc..module-1', + 'name': 'VfVgeraldine..vflorence_vlc..module-1', 'version': '2', - 'modelCustomizationName': 'VfVmee..vmme_vlc..module-1', + 'modelCustomizationName': 'VfVgeraldine..vflorence_vlc..module-1', 'properties': {'minCountInstances': 0, 'maxCountInstances': null, 'initialCount': 0}, 'commands': {}, 'volumeGroupAllowed': false }, - 'vf_vmee0..VfVmee..vmme_gpb..module-2': { + 'vf_vgeraldine0..VfVgeraldine..vflorence_gpb..module-2': { 'uuid': '41708296-e443-4c71-953f-d9a010f059e1', 'invariantUuid': '1cca90b8-3490-495e-87da-3f3e4c57d5b9', 'customizationUuid': '6add59e0-7fe1-4bc4-af48-f8812422ae7c', 'description': null, - 'name': 'VfVmee..vmme_gpb..module-2', + 'name': 'VfVgeraldine..vflorence_gpb..module-2', 'version': '2', - 'modelCustomizationName': 'VfVmee..vmme_gpb..module-2', + 'modelCustomizationName': 'VfVgeraldine..vflorence_gpb..module-2', 'properties': {'minCountInstances': 0, 'maxCountInstances': null, 'initialCount': 0}, 'commands': {}, 'volumeGroupAllowed': false }, - 'vf_vmee0..VfVmee..base_vmme..module-0': { + 'vf_vgeraldine0..VfVgeraldine..base_vflorence..module-0': { 'uuid': 'a27f5cfc-7f12-4f99-af08-0af9c3885c87', 'invariantUuid': 'a6f9e51a-2b35-416a-ae15-15e58d61f36d', 'customizationUuid': 'f8c040f1-7e51-4a11-aca8-acf256cfd861', 'description': null, - 'name': 'VfVmee..base_vmme..module-0', + 'name': 'VfVgeraldine..base_vflorence..module-0', 'version': '2', - 'modelCustomizationName': 'VfVmee..base_vmme..module-0', + 'modelCustomizationName': 'VfVgeraldine..base_vflorence..module-0', 'properties': {'minCountInstances': 1, 'maxCountInstances': 1, 'initialCount': 1}, 'commands': {}, 'volumeGroupAllowed': true } }, 'volumeGroups': { - 'vf_vmee0..VfVmee..base_vmme..module-0': { + 'vf_vgeraldine0..VfVgeraldine..base_vflorence..module-0': { 'uuid': 'a27f5cfc-7f12-4f99-af08-0af9c3885c87', 'invariantUuid': 'a6f9e51a-2b35-416a-ae15-15e58d61f36d', 'customizationUuid': 'f8c040f1-7e51-4a11-aca8-acf256cfd861', 'description': null, - 'name': 'VfVmee..base_vmme..module-0', + 'name': 'VfVgeraldine..base_vflorence..module-0', 'version': '2', - 'modelCustomizationName': 'VfVmee..base_vmme..module-0', + 'modelCustomizationName': 'VfVgeraldine..base_vflorence..module-0', 'properties': {'minCountInstances': 1, 'maxCountInstances': 1, 'initialCount': 1} } }, diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.service.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.service.ts index dc72f8f12..39a3c5070 100644 --- a/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.service.ts +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.service.ts @@ -7,6 +7,8 @@ import {MessageBoxService} from "../../../shared/components/messageBox/messageBo import * as _ from "lodash"; import { SdcUiCommon} from "onap-ui-angular"; import {SharedTreeService} from "../objectsToTree/shared.tree.service"; +import {VrfModel} from "../../../shared/models/vrfModel"; +import {clearAllGenericModalhelper} from "../../../shared/storeUtil/utils/global/global.actions"; export class AvailableNodeIcons { addIcon: boolean; @@ -16,6 +18,7 @@ export class AvailableNodeIcons { this.addIcon = addIcon; this.vIcon = vIcon; } + } @Injectable() @@ -73,4 +76,20 @@ export class AvailableModelsTreeService { MessageBoxService.openModal.next(messageBoxData); } + shouldOpenVRFModal(nodes, serviceModelId: string , service) { + for(const node of nodes){ + if(node.type === 'VRF' && service.serviceInstance[serviceModelId].existingVRFCounterMap && !service.serviceInstance[serviceModelId].existingVRFCounterMap[node.modelUniqueId]){ + const vrfModel : VrfModel = node.getModel(node.name, node, service.serviceInstance[serviceModelId]); + const vrfCounter : number = service.serviceInstance[serviceModelId].existingVRFCounterMap[node.modelUniqueId]; + console.log('vrfCounter', vrfCounter); + if(vrfModel.min > 0 && (_.isNil(vrfCounter) || vrfCounter === 0)){ + node.data = node; + this.store.dispatch(clearAllGenericModalhelper()); + return node; + } + } + } + return null; + } + } diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info-model.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info-model.ts index 4c5bf6747..d06dfbe9a 100644 --- a/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info-model.ts +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info-model.ts @@ -7,11 +7,11 @@ export class ComponentInfoModel { title: string; - constructor(type: ComponentInfoType, modelInfoItems: ModelInformationItem[], additionalInfoItems: ModelInformationItem[], isInstance:boolean=true) { + constructor(type: ComponentInfoType, modelInfoItems: ModelInformationItem[], additionalInfoItems: ModelInformationItem[], isInstance:boolean = true) { this.type = type; this.modelInfoItems = modelInfoItems; this.additionalInfoItems = additionalInfoItems; - this.title=this.type+(isInstance ? " Instance" : ""); + this.title = this.type + (isInstance ? " Instance" : ""); } } @@ -22,5 +22,11 @@ export enum ComponentInfoType { NETWORK = "Network", VFMODULE = "VFModule", VNFGROUP = "Group", - VNFMEMBER = "VNF" + VNFMEMBER = "VNF", + CONFIGURATION = "Configuration", + COLLECTION_RESOURCE = "Collection Resource", + VRF = "VRF", + PNF = "PNF", + VPN = "VPN", + NCF = "Network Collection Function" } diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.component.scss b/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.component.scss index 2d7735678..62e53ed0d 100644 --- a/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.component.scss +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.component.scss @@ -26,7 +26,6 @@ font-family: OpenSans-Regular; font-size: 12px; color: #5A5A5A; - text-transform: capitalize; } .model-item-value { @@ -34,6 +33,7 @@ font-size: 14px; color: #191919; line-height: 16px; + word-break: break-word; } } diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.component.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.component.ts index c69ab52e1..d9fa98555 100644 --- a/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.component.ts +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.component.ts @@ -7,8 +7,8 @@ import {ActivatedRoute} from "@angular/router"; @Component({ selector: 'component-info', templateUrl: './component-info.component.html', - styleUrls: ['./component-info.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush + styleUrls: ['./component-info.component.scss']//, + // changeDetection: ChangeDetectionStrategy.OnPush }) export class ComponentInfoComponent implements OnInit { componentInfoModel: ComponentInfoModel = null; diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.service.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.service.spec.ts index 8b0da409b..6671e2e18 100644 --- a/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.service.spec.ts +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.service.spec.ts @@ -7,6 +7,7 @@ import {HttpClient, HttpHandler} from '@angular/common/http'; import {FeatureFlagsService} from '../../../shared/services/featureFlag/feature-flags.service'; import {ModelInformationItem} from "../../../shared/components/model-information/model-information.component"; import {ComponentInfoModel, ComponentInfoType} from "./component-info-model"; +import {SharedTreeService} from "../objectsToTree/shared.tree.service"; class MockAppStore { getState() { @@ -58,6 +59,7 @@ beforeAll(done => (async () => { HttpHandler, FeatureFlagsService, ComponentInfoService, + SharedTreeService, {provide: NgRedux, useClass: MockAppStore}, MockNgRedux] }); @@ -77,12 +79,12 @@ describe('Service Info Data', () => { let actualServiceInfo = service.getInfoForService('1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd'); let expectedServiceInfo = [ ModelInformationItem.createInstance('Type', 'pnf'), - ModelInformationItem.createInstance('Model Version', '1.0'), - ModelInformationItem.createInstance('Model Customization ID', ''), + ModelInformationItem.createInstance('Model version', '1.0'), + ModelInformationItem.createInstance('Model customization ID', ''), ModelInformationItem.createInstance('Instance ID', '2f7130e8-27d6-4c01-8988-60ca67e8dae4'), - ModelInformationItem.createInstance('Subscriber Name', 'SILVIA ROBBINS'), - ModelInformationItem.createInstance('Service Type', 'TYLER SILVIA'), - ModelInformationItem.createInstance('Service Role', 'Testing'), + ModelInformationItem.createInstance('Subscriber name', 'SILVIA ROBBINS'), + ModelInformationItem.createInstance('Service type', 'TYLER SILVIA'), + ModelInformationItem.createInstance('Service role', 'Testing'), ]; expect(actualServiceInfo).toEqual(new ComponentInfoModel(ComponentInfoType.SERVICE, expectedServiceInfo, [])); diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.service.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.service.ts index 9318b3aa7..32610d993 100644 --- a/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.service.ts +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.service.ts @@ -6,36 +6,27 @@ import {Subject} from "rxjs"; import {ComponentInfoModel, ComponentInfoType} from "./component-info-model"; import {ModelInformationItem} from "../../../shared/components/model-information/model-information.component"; import * as _ from 'lodash'; +import {SharedTreeService} from "../objectsToTree/shared.tree.service"; @Injectable() export class ComponentInfoService { static triggerComponentInfoChange: Subject = new Subject(); - constructor( private _store: NgRedux, private _aaiService : AaiService){ } + constructor( private _store: NgRedux, private _aaiService : AaiService, private _sharedTreeService : SharedTreeService){ } getInfoForService(serviceModelId):ComponentInfoModel { if(_.isNil(this._store.getState().service.serviceHierarchy[serviceModelId])) return null; - let serviceHierarchy = this._store.getState().service.serviceHierarchy[serviceModelId].service; + const serviceHierarchy = this._store.getState().service.serviceHierarchy[serviceModelId].service; const serviceInstance = this._store.getState().service.serviceInstance[serviceModelId]; const modelInfoItems: ModelInformationItem[] = [ - ModelInformationItem.createInstance("Subscriber Name",this._aaiService.extractSubscriberNameBySubscriberId(serviceInstance.globalSubscriberId)), - ModelInformationItem.createInstance("Service Type",serviceInstance.subscriptionServiceType), - ModelInformationItem.createInstance("Service Role",serviceHierarchy.serviceRole), + ModelInformationItem.createInstance("Type", serviceHierarchy.serviceType), + ModelInformationItem.createInstance("Model version", serviceHierarchy.version ), + ModelInformationItem.createInstance("Model customization ID", serviceHierarchy.customizationUuid ), + ModelInformationItem.createInstance("Instance ID", serviceInstance.instanceId), + ModelInformationItem.createInstance("Subscriber name",this._aaiService.extractSubscriberNameBySubscriberId(serviceInstance.globalSubscriberId)), + ModelInformationItem.createInstance("Service type",serviceInstance.subscriptionServiceType), + ModelInformationItem.createInstance("Service role",serviceHierarchy.serviceRole), ]; - serviceHierarchy.type = serviceHierarchy.serviceType; - return this.addGeneralInfoItems(modelInfoItems, ComponentInfoType.SERVICE, serviceHierarchy, serviceInstance ); - } - - addGeneralInfoItems(modelInfoSpecificItems: ModelInformationItem[], type: ComponentInfoType, model, instance) { - let modelInfoItems: ModelInformationItem[] = [ - ModelInformationItem.createInstance("Type", (model && model.type) ? model.type : ((instance && instance.modelInfo) ? instance.modelInfo.modelType : null)), - ModelInformationItem.createInstance("Model Version", model ? model.version : null), - ModelInformationItem.createInstance("Model Customization ID", model ? model.customizationUuid : null), - ModelInformationItem.createInstance("Instance ID", instance ? instance.instanceId : null), - ModelInformationItem.createInstance("In Maintenance", instance? instance.inMaint : null), - ]; - modelInfoItems = modelInfoItems.concat(modelInfoSpecificItems); - const modelInfoItemsWithoutEmpty = _.filter(modelInfoItems, function(item){ return !item.values.every(_.isNil)}); - return new ComponentInfoModel(type, modelInfoItemsWithoutEmpty, []); + return this._sharedTreeService.getComponentInfoModelByModelInformationItems(modelInfoItems, ComponentInfoType.SERVICE, serviceInstance ); } } diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.html b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.html index f02ed6293..46807607d 100644 --- a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.html +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.html @@ -10,7 +10,7 @@ -
+
Failed @@ -22,7 +22,9 @@
Orch Status: - {{serviceOrchStatus}} + {{serviceOrchStatus}}
+ Delete + Resume @@ -46,7 +50,7 @@ Edit
+ (execute)="onDeleteUndoDeleteClick()">
{{isDeleted ? 'Undo delete': 'Delete'}}
Show Audit Info
+ +
{{isResume ? 'Undo resume': 'Resume'}}
+