summaryrefslogtreecommitdiffstats
path: root/vid-webpack-master/src/app
diff options
context:
space:
mode:
authorIttay Stern <ittay.stern@att.com>2018-08-29 17:01:32 +0300
committerIttay Stern <ittay.stern@att.com>2019-02-18 18:35:30 +0200
commit6f900cc45d7dd7f97430812b86b5c1d1693c8ae3 (patch)
tree936005c364dc5a7264d6304d4777c3d83494db22 /vid-webpack-master/src/app
parent67d99f816cc583643c35193197594cf78d8ce60a (diff)
merge from ecomp a88f0072 - Modern UI
Issue-ID: VID-378 Change-Id: Ibcb23dd27f550cf32ce2fe0239f0f496ae014ff6 Signed-off-by: Ittay Stern <ittay.stern@att.com>
Diffstat (limited to 'vid-webpack-master/src/app')
-rw-r--r--vid-webpack-master/src/app/angular-tree-component.scss83
-rw-r--r--vid-webpack-master/src/app/app.component.html1
-rw-r--r--vid-webpack-master/src/app/app.component.ts21
-rw-r--r--vid-webpack-master/src/app/app.module.ts74
-rw-r--r--vid-webpack-master/src/app/app.routing.ts55
-rw-r--r--vid-webpack-master/src/app/browseSdc/browseSdc.component.html26
-rw-r--r--vid-webpack-master/src/app/browseSdc/browseSdc.component.scss59
-rw-r--r--vid-webpack-master/src/app/browseSdc/browseSdc.component.ts176
-rw-r--r--vid-webpack-master/src/app/browseSdc/browseSdc.module.ts35
-rw-r--r--vid-webpack-master/src/app/browseSdc/previous-versions/previous-versions.component.ts29
-rw-r--r--vid-webpack-master/src/app/browseSdc/previous-versions/previous-versions.css4
-rw-r--r--vid-webpack-master/src/app/browseSdc/previous-versions/previous-versions.html18
-rw-r--r--vid-webpack-master/src/app/browseSdc/vid-table/vid-table.component.html26
-rw-r--r--vid-webpack-master/src/app/browseSdc/vid-table/vid-table.component.scss40
-rw-r--r--vid-webpack-master/src/app/browseSdc/vid-table/vid-table.component.ts59
-rw-r--r--vid-webpack-master/src/app/components/instance-popup/instance-popup.components.ts9
-rw-r--r--vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.component.ts238
-rw-r--r--vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.html168
-rw-r--r--vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.service.spec.ts26
-rw-r--r--vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.service.ts22
-rw-r--r--vid-webpack-master/src/app/components/service-popup/service-instance-details/servicePopupDataModel.ts32
-rw-r--r--vid-webpack-master/src/app/components/service-popup/service-popup.component.ts144
-rw-r--r--vid-webpack-master/src/app/components/service-popup/service-popup.html52
-rw-r--r--vid-webpack-master/src/app/components/service-popup/service-popup.scss185
-rw-r--r--vid-webpack-master/src/app/components/service-popup/service-popup.service.spec.ts138
-rw-r--r--vid-webpack-master/src/app/components/service-popup/service-popup.service.ts33
-rw-r--r--vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.component.ts275
-rw-r--r--vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.html114
-rw-r--r--vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.scss64
-rw-r--r--vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.service.spec.ts241
-rw-r--r--vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.service.ts64
-rw-r--r--vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnfPopupDataModel.ts26
-rw-r--r--vid-webpack-master/src/app/components/vnf-popup/vnf-popup-service.ts55
-rw-r--r--vid-webpack-master/src/app/components/vnf-popup/vnf-popup.components.ts190
-rw-r--r--vid-webpack-master/src/app/components/vnf-popup/vnf-popup.html54
-rw-r--r--vid-webpack-master/src/app/configuration/vid.configuration.ts98
-rw-r--r--vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.component.html35
-rw-r--r--vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.component.scss398
-rw-r--r--vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.component.ts166
-rw-r--r--vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.service.ts36
-rw-r--r--vid-webpack-master/src/app/drawingBoard/drawing-board-header/drawing-board-header.component.html33
-rw-r--r--vid-webpack-master/src/app/drawingBoard/drawing-board-header/drawing-board-header.component.scss95
-rw-r--r--vid-webpack-master/src/app/drawingBoard/drawing-board-header/drawing-board-header.component.ts119
-rw-r--r--vid-webpack-master/src/app/drawingBoard/drawing-board-tree/drawing-board-tree.component.ts133
-rw-r--r--vid-webpack-master/src/app/drawingBoard/drawing-board-tree/drawing-board-tree.html42
-rw-r--r--vid-webpack-master/src/app/drawingBoard/drawingBoard.module.ts89
-rw-r--r--vid-webpack-master/src/app/drawingBoard/drawingBoard.routing.ts63
-rw-r--r--vid-webpack-master/src/app/drawingBoard/guards/servicePlanningGuard/drawingBoardGuard.ts56
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.component.html47
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.component.scss506
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.component.ts167
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.service.spec.ts (renamed from vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.service.spec.ts)145
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.service.ts76
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info-model.ts26
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.component.html20
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.component.scss40
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.component.ts40
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.service.spec.ts93
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.service.ts41
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.html78
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.scss176
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.ts187
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.service.spec.ts184
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.service.ts86
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/tmp_instansiate_request.ts (renamed from vid-webpack-master/src/app/drawingBoard/drawing-board-header/tmp_instansiate_request.ts)2
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/dragAndDrop/dragAndDrop.model.ts15
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/dragAndDrop/dragAndDrop.service.spec.ts227
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/dragAndDrop/dragAndDrop.service.ts78
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.component.ts207
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.html96
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.scss (renamed from vid-webpack-master/src/app/drawingBoard/drawing-board-tree/drawing-board-tree.scss)237
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.service.spec.ts147
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.service.ts129
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/instance.tree.generator.ts8
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component.html5
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component.scss24
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component.spec.ts25
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component.ts10
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board.modes.ts8
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate-vnf.component.html19
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate-vnf.component.scss9
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate-vnf.component.ts25
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate.service.spec.ts449
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate.service.ts189
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/dynamicInputs.service.spec.ts24
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/dynamicInputs.service.ts143
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/basic.model.info.ts121
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/configuration/configuration.model.info.spec.ts1500
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/configuration/configuration.model.info.ts87
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/network/network.model.info.spec.ts1553
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/network/network.model.info.ts264
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/relatedVnfMember/relatedVnfMember.info.model.spec.ts1211
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/relatedVnfMember/relatedVnfMember.info.model.ts158
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vfModule/vfModule.model.info.spec.ts1596
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vfModule/vfModule.model.info.ts388
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vnf/vnf.model.info.spec.ts1671
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vnf/vnf.model.info.ts332
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vnfGrouping/vnfGrouping.model.info.spec.ts291
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vnfGrouping/vnfGrouping.model.info.ts272
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToInstanceTree/objectToInstanceTree.service.spec.ts2764
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToInstanceTree/objectToInstanceTree.service.ts163
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToModelTree/objectToModelTree.service.spec.ts727
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToModelTree/objectToModelTree.service.ts98
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToTree.service.ts51
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/shared.tree.service.spec.ts1761
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/shared.tree.service.ts278
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/search/search.component.html8
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/search/search.component.scss3
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/search/search.component.spec.ts93
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/search/search.component.ts50
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/service-planning.component.html22
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/service-planning.component.scss12
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/service-planning.component.ts70
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/typeNodeInformation.model.spec.ts59
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/typeNodeInformation.model.ts39
-rw-r--r--vid-webpack-master/src/app/factories/models/requestDetails.model.ts3
-rw-r--r--vid-webpack-master/src/app/factories/mso.factory.spec.ts31
-rw-r--r--vid-webpack-master/src/app/factories/mso.factory.ts26
-rw-r--r--vid-webpack-master/src/app/featureFlag/directive/basic/basic.featureFlag.directive.spec.ts93
-rw-r--r--vid-webpack-master/src/app/featureFlag/directive/basic/basic.featureFlag.directive.ts29
-rw-r--r--vid-webpack-master/src/app/featureFlag/featureFlag.module.ts32
-rw-r--r--vid-webpack-master/src/app/featureFlag/service/featureFlag.service.ts28
-rw-r--r--vid-webpack-master/src/app/global.actions.ts23
-rw-r--r--vid-webpack-master/src/app/healthStatus/health-status.component.spec.ts64
-rw-r--r--vid-webpack-master/src/app/healthStatus/health-status.component.ts6
-rw-r--r--vid-webpack-master/src/app/healthStatus/health-status.module.ts25
-rw-r--r--vid-webpack-master/src/app/healthStatus/health-status.routing.ts19
-rw-r--r--vid-webpack-master/src/app/home/home.component.e2e-spec.js13
-rw-r--r--vid-webpack-master/src/app/home/home.component.html3
-rw-r--r--vid-webpack-master/src/app/home/home.component.scss4
-rw-r--r--vid-webpack-master/src/app/home/home.component.ts30
-rw-r--r--vid-webpack-master/src/app/instantiationStatus/InstantiationStatus.module.ts9
-rw-r--r--vid-webpack-master/src/app/instantiationStatus/InstantiationStatus.routing.ts19
-rw-r--r--vid-webpack-master/src/app/instantiationStatus/auditInfoModal/auditInfoModal.component.ts83
-rw-r--r--vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.html60
-rw-r--r--vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.service.spec.ts118
-rw-r--r--vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.service.ts136
-rw-r--r--vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.spec.ts251
-rw-r--r--vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.ts170
-rw-r--r--vid-webpack-master/src/app/modules/inputs.module.ts20
-rw-r--r--vid-webpack-master/src/app/service.actions.ts197
-rw-r--r--vid-webpack-master/src/app/service.reducer.spec.ts286
-rw-r--r--vid-webpack-master/src/app/service.reducer.ts214
-rw-r--r--vid-webpack-master/src/app/services/aaiService/aai.service.ts189
-rw-r--r--vid-webpack-master/src/app/services/msoService/mso.service.ts26
-rw-r--r--vid-webpack-master/src/app/services/sdc.service.ts28
-rw-r--r--vid-webpack-master/src/app/services/service-planning.service.spec.ts467
-rw-r--r--vid-webpack-master/src/app/services/service-planning.service.ts282
-rw-r--r--vid-webpack-master/src/app/shared/api.service.ts6
-rw-r--r--vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.html (renamed from vid-webpack-master/src/app/instantiationStatus/auditInfoModal/auditInfoModal.component.html)34
-rw-r--r--vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.scss (renamed from vid-webpack-master/src/app/instantiationStatus/auditInfoModal/auditInfoModal.component.scss)18
-rw-r--r--vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.service.spec.ts274
-rw-r--r--vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.service.ts79
-rw-r--r--vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.spec.ts203
-rw-r--r--vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.ts122
-rw-r--r--vid-webpack-master/src/app/shared/components/dynamic-inputs/dynamic-inputs.component.spec.ts157
-rw-r--r--vid-webpack-master/src/app/shared/components/dynamic-inputs/dynamic-inputs.component.ts (renamed from vid-webpack-master/src/app/components/dynamic-inputs/dynamic-inputs.component.ts)2
-rw-r--r--vid-webpack-master/src/app/shared/components/dynamic-inputs/dynamic-inputs.html (renamed from vid-webpack-master/src/app/components/dynamic-inputs/dynamic-inputs.html)2
-rw-r--r--vid-webpack-master/src/app/shared/components/dynamic-inputs/dynamic-inputs.scss (renamed from vid-webpack-master/src/app/components/dynamic-inputs/dynamic-inputs.scss)0
-rw-r--r--vid-webpack-master/src/app/shared/components/ellipsis/ellipsis.component.ts28
-rw-r--r--vid-webpack-master/src/app/shared/components/error-msg/error-msg.component.html5
-rw-r--r--vid-webpack-master/src/app/shared/components/error-msg/error-msg.component.scss22
-rw-r--r--vid-webpack-master/src/app/shared/components/error-msg/error-msg.component.spec.ts48
-rw-r--r--vid-webpack-master/src/app/shared/components/error-msg/error-msg.component.ts28
-rw-r--r--vid-webpack-master/src/app/shared/components/error-msg/error-msg.model.ts11
-rw-r--r--vid-webpack-master/src/app/shared/components/error-msg/error-msg.service.spec.ts38
-rw-r--r--vid-webpack-master/src/app/shared/components/error-msg/error-msg.service.ts22
-rw-r--r--vid-webpack-master/src/app/shared/components/error/error.component.service.ts15
-rw-r--r--vid-webpack-master/src/app/shared/components/formControls/component/checkbox/checkbox.formControl.component.html11
-rw-r--r--vid-webpack-master/src/app/shared/components/formControls/component/checkbox/checkbox.formControl.component.ts13
-rw-r--r--vid-webpack-master/src/app/shared/components/formControls/component/dropdown/dropdown.formControl.component.html21
-rw-r--r--vid-webpack-master/src/app/shared/components/formControls/component/dropdown/dropdown.formControl.component.scss7
-rw-r--r--vid-webpack-master/src/app/shared/components/formControls/component/dropdown/dropdown.formControl.component.ts27
-rw-r--r--vid-webpack-master/src/app/shared/components/formControls/component/file/file.formControl.component.html22
-rw-r--r--vid-webpack-master/src/app/shared/components/formControls/component/file/file.formControl.component.scss87
-rw-r--r--vid-webpack-master/src/app/shared/components/formControls/component/file/file.formControl.component.spec.ts62
-rw-r--r--vid-webpack-master/src/app/shared/components/formControls/component/file/file.formControl.component.ts27
-rw-r--r--vid-webpack-master/src/app/shared/components/formControls/component/file/fileUnit.enum.ts7
-rw-r--r--vid-webpack-master/src/app/shared/components/formControls/component/input/input.formControl.component.html25
-rw-r--r--vid-webpack-master/src/app/shared/components/formControls/component/input/input.formControl.component.scss (renamed from vid-webpack-master/src/app/instantiationStatus/auditInfoModal/auditInfoModal.component.service.ts)0
-rw-r--r--vid-webpack-master/src/app/shared/components/formControls/component/input/input.formControl.component.spec.ts68
-rw-r--r--vid-webpack-master/src/app/shared/components/formControls/component/input/input.formControl.component.ts18
-rw-r--r--vid-webpack-master/src/app/shared/components/formControls/component/multiselect/multiselect.formControl.component.html16
-rw-r--r--vid-webpack-master/src/app/shared/components/formControls/component/multiselect/multiselect.formControl.component.spec.ts74
-rw-r--r--vid-webpack-master/src/app/shared/components/formControls/component/multiselect/multiselect.formControl.component.ts20
-rw-r--r--vid-webpack-master/src/app/shared/components/formControls/component/number/number.formControl.component.html13
-rw-r--r--vid-webpack-master/src/app/shared/components/formControls/component/number/number.formControl.component.ts12
-rw-r--r--vid-webpack-master/src/app/shared/components/formControls/errorMessage/formControlMessageError.component.html5
-rw-r--r--vid-webpack-master/src/app/shared/components/formControls/errorMessage/formControlMessageError.component.ts15
-rw-r--r--vid-webpack-master/src/app/shared/components/formGeneralErrors/formGeneralErrors.component.scss1
-rw-r--r--vid-webpack-master/src/app/shared/components/formGeneralErrors/formGeneralErrors.service.ts7
-rw-r--r--vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/basic.control.generator.spec.ts48
-rw-r--r--vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/basic.control.generator.ts240
-rw-r--r--vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/networkGenerator/network.control.generator.spec.ts1979
-rw-r--r--vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/networkGenerator/network.control.generator.ts247
-rw-r--r--vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/service.control.generator.spec.ts1859
-rw-r--r--vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/service.control.generator.ts331
-rw-r--r--vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator.spec.ts2008
-rw-r--r--vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator.ts349
-rw-r--r--vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vnfGenerator/vnf.control.generator.spec.ts1943
-rw-r--r--vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vnfGenerator/vnf.control.generator.ts243
-rw-r--r--vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vnfGroupGenerator/vnfGroup.control.generator.spec.ts364
-rw-r--r--vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vnfGroupGenerator/vnfGroup.control.generator.ts118
-rw-r--r--vid-webpack-master/src/app/shared/components/genericForm/generic-form.component.html29
-rw-r--r--vid-webpack-master/src/app/shared/components/genericForm/generic-form.component.scss (renamed from vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.scss)16
-rw-r--r--vid-webpack-master/src/app/shared/components/genericForm/generic-form.component.ts45
-rw-r--r--vid-webpack-master/src/app/shared/components/genericForm/generic-form.service.spec.ts140
-rw-r--r--vid-webpack-master/src/app/shared/components/genericForm/generic-form.service.ts54
-rw-r--r--vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.component.html70
-rw-r--r--vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.component.scss (renamed from vid-webpack-master/src/app/components/vnf-popup/vnf-popup.scss)37
-rw-r--r--vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.component.ts145
-rw-r--r--vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.service.spec.ts1938
-rw-r--r--vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.service.ts93
-rw-r--r--vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/basic.popup.service.spec.ts92
-rw-r--r--vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/basic.popup.service.ts54
-rw-r--r--vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/generic-popup.interface.ts25
-rw-r--r--vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/network/network.popup.service.spec.ts2395
-rw-r--r--vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/network/network.popup.service.ts150
-rw-r--r--vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/service/service.popup.service.spec.ts2439
-rw-r--r--vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/service/service.popup.service.ts184
-rw-r--r--vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service.spec.ts2407
-rw-r--r--vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service.ts184
-rw-r--r--vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service.spec.ts3242
-rw-r--r--vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service.ts158
-rw-r--r--vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service.spec.ts3239
-rw-r--r--vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service.ts158
-rw-r--r--vid-webpack-master/src/app/shared/components/messageBox/messageBox.component.ts15
-rw-r--r--vid-webpack-master/src/app/shared/components/messageBox/messageBox.data.ts45
-rw-r--r--vid-webpack-master/src/app/shared/components/messageBox/messageBox.service.spec.ts21
-rw-r--r--vid-webpack-master/src/app/shared/components/messageBox/messageBox.service.ts8
-rw-r--r--vid-webpack-master/src/app/shared/components/model-information/model-information.component.ts23
-rw-r--r--vid-webpack-master/src/app/shared/components/model-information/model-information.html4
-rw-r--r--vid-webpack-master/src/app/shared/components/model-information/model-information.service.spec.ts32
-rw-r--r--vid-webpack-master/src/app/shared/components/model-information/model-information.service.ts16
-rw-r--r--vid-webpack-master/src/app/shared/components/model-information/model-information.spec.ts12
-rw-r--r--vid-webpack-master/src/app/shared/components/no-content-message-and-icon/no-content-message-and-icon.component.html5
-rw-r--r--vid-webpack-master/src/app/shared/components/no-content-message-and-icon/no-content-message-and-icon.component.scss3
-rw-r--r--vid-webpack-master/src/app/shared/components/no-content-message-and-icon/no-content-message-and-icon.component.ts1
-rw-r--r--vid-webpack-master/src/app/shared/components/popover/popover.component.html5
-rw-r--r--vid-webpack-master/src/app/shared/components/popover/popover.component.scss1
-rw-r--r--vid-webpack-master/src/app/shared/components/popover/popover.component.ts34
-rw-r--r--vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/member-table-row.model.ts6
-rw-r--r--vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.component.html75
-rw-r--r--vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.component.scss91
-rw-r--r--vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.component.ts57
-rw-r--r--vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.service.spec.ts270
-rw-r--r--vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.service.ts153
-rw-r--r--vid-webpack-master/src/app/shared/components/searchMembersModal/search-members-modal.component.html35
-rw-r--r--vid-webpack-master/src/app/shared/components/searchMembersModal/search-members-modal.component.scss89
-rw-r--r--vid-webpack-master/src/app/shared/components/searchMembersModal/search-members-modal.component.ts82
-rw-r--r--vid-webpack-master/src/app/shared/components/spinner/spinner.component.html8
-rw-r--r--vid-webpack-master/src/app/shared/components/spinner/spinner.component.spec.ts44
-rw-r--r--vid-webpack-master/src/app/shared/components/spinner/spinner.component.ts50
-rw-r--r--vid-webpack-master/src/app/shared/components/svg/svg-component.ts47
-rw-r--r--vid-webpack-master/src/app/shared/components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator.spec.ts39
-rw-r--r--vid-webpack-master/src/app/shared/components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator.ts20
-rw-r--r--vid-webpack-master/src/app/shared/directives/clickOutside/clickOutside.directive.spec.ts52
-rw-r--r--vid-webpack-master/src/app/shared/directives/clickOutside/clickOutside.directive.ts41
-rw-r--r--vid-webpack-master/src/app/shared/directives/inputPrevention/inputPreventionPattern.directive.spec.ts48
-rw-r--r--vid-webpack-master/src/app/shared/directives/inputPrevention/inputPreventionPattern.directive.ts19
-rw-r--r--vid-webpack-master/src/app/shared/directives/svg/svg.directive.html0
-rw-r--r--vid-webpack-master/src/app/shared/directives/svg/svg.directive.ts34
-rw-r--r--vid-webpack-master/src/app/shared/index.ts1
-rw-r--r--vid-webpack-master/src/app/shared/models/ServiceNodeTypes.ts4
-rw-r--r--vid-webpack-master/src/app/shared/models/VnfMember.ts11
-rw-r--r--vid-webpack-master/src/app/shared/models/formControlModels/checkboxFormControl.model.ts11
-rw-r--r--vid-webpack-master/src/app/shared/models/formControlModels/dropdownFormControl.model.ts29
-rw-r--r--vid-webpack-master/src/app/shared/models/formControlModels/fileFormControl.model.ts18
-rw-r--r--vid-webpack-master/src/app/shared/models/formControlModels/formControl.model.ts121
-rw-r--r--vid-webpack-master/src/app/shared/models/formControlModels/formControlTypes.enum.ts8
-rw-r--r--vid-webpack-master/src/app/shared/models/formControlModels/formPopupDetails.model.ts55
-rw-r--r--vid-webpack-master/src/app/shared/models/formControlModels/inputFormControl.model.ts19
-rw-r--r--vid-webpack-master/src/app/shared/models/formControlModels/multiselectFormControl.model.ts27
-rw-r--r--vid-webpack-master/src/app/shared/models/formControlModels/numberFormControl.model.ts16
-rw-r--r--vid-webpack-master/src/app/shared/models/inputTypes.ts14
-rw-r--r--vid-webpack-master/src/app/shared/models/lcpRegion.ts10
-rw-r--r--vid-webpack-master/src/app/shared/models/level1Instance.ts24
-rw-r--r--vid-webpack-master/src/app/shared/models/modelInfo.ts12
-rw-r--r--vid-webpack-master/src/app/shared/models/networkInstance.ts14
-rw-r--r--vid-webpack-master/src/app/shared/models/networkModel.ts32
-rw-r--r--vid-webpack-master/src/app/shared/models/networkTreeNode.ts23
-rw-r--r--vid-webpack-master/src/app/shared/models/nodeInstance.ts21
-rw-r--r--vid-webpack-master/src/app/shared/models/nodeModel.ts66
-rw-r--r--vid-webpack-master/src/app/shared/models/productFamily.ts2
-rw-r--r--vid-webpack-master/src/app/shared/models/serviceInstance.ts43
-rw-r--r--vid-webpack-master/src/app/shared/models/serviceInstanceActions.ts24
-rw-r--r--vid-webpack-master/src/app/shared/models/serviceModel.ts11
-rw-r--r--vid-webpack-master/src/app/shared/models/serviceProxyModel.ts22
-rw-r--r--vid-webpack-master/src/app/shared/models/tenant.ts2
-rw-r--r--vid-webpack-master/src/app/shared/models/treeNodeModel.ts53
-rw-r--r--vid-webpack-master/src/app/shared/models/vfModule.ts9
-rw-r--r--vid-webpack-master/src/app/shared/models/vfModuleInstance.ts13
-rw-r--r--vid-webpack-master/src/app/shared/models/vfModuleTreeNode.ts22
-rw-r--r--vid-webpack-master/src/app/shared/models/vnfGroupInstance.ts13
-rw-r--r--vid-webpack-master/src/app/shared/models/vnfGroupModel.ts32
-rw-r--r--vid-webpack-master/src/app/shared/models/vnfGroupTreeNode.ts12
-rw-r--r--vid-webpack-master/src/app/shared/models/vnfInstance.ts21
-rw-r--r--vid-webpack-master/src/app/shared/models/vnfModel.ts51
-rw-r--r--vid-webpack-master/src/app/shared/models/vnfTreeNode.ts23
-rw-r--r--vid-webpack-master/src/app/shared/pipes/capitalize/capitalize-and-format.pipe.spec.ts20
-rw-r--r--vid-webpack-master/src/app/shared/pipes/capitalize/capitalize-and-format.pipe.ts2
-rw-r--r--vid-webpack-master/src/app/shared/pipes/data-filter.pipe.ts29
-rw-r--r--vid-webpack-master/src/app/shared/pipes/dataFilter/data-filter.pipe.spec.ts52
-rw-r--r--vid-webpack-master/src/app/shared/pipes/dataFilter/data-filter.pipe.ts47
-rw-r--r--vid-webpack-master/src/app/shared/pipes/dynamicInputLabel/dynamic-input-label.pipe.spec.ts36
-rw-r--r--vid-webpack-master/src/app/shared/pipes/dynamicInputLabel/dynamic-input-label.pipe.ts2
-rw-r--r--vid-webpack-master/src/app/shared/pipes/highlight/highlight-filter.pipe.spec.ts29
-rw-r--r--vid-webpack-master/src/app/shared/pipes/highlight/highlight-filter.pipe.ts (renamed from vid-webpack-master/src/app/shared/pipes/highlight-filter.pipe.ts)2
-rw-r--r--vid-webpack-master/src/app/shared/pipes/objectToArray/objectToArray.pipe.spec.ts35
-rw-r--r--vid-webpack-master/src/app/shared/pipes/objectToArray/objectToArray.pipe.ts8
-rw-r--r--vid-webpack-master/src/app/shared/pipes/order/orderBy.pipe.spec.ts60
-rw-r--r--vid-webpack-master/src/app/shared/pipes/order/orderBy.pipe.ts35
-rw-r--r--vid-webpack-master/src/app/shared/pipes/safe/safe.pipe.spec.ts60
-rw-r--r--vid-webpack-master/src/app/shared/pipes/safe/safe.pipe.ts22
-rw-r--r--vid-webpack-master/src/app/shared/pipes/serviceInfo/serviceInfo.pipe.spec.ts21
-rw-r--r--vid-webpack-master/src/app/shared/pipes/serviceInfo/serviceInfo.pipe.ts4
-rw-r--r--vid-webpack-master/src/app/shared/resolvers/flag/flag.resolver.spec.ts61
-rw-r--r--vid-webpack-master/src/app/shared/resolvers/flag/flag.resolver.ts (renamed from vid-webpack-master/src/app/services/flags.resolve.ts)4
-rw-r--r--vid-webpack-master/src/app/shared/resolvers/retry/retry.resolver.spec.ts306
-rw-r--r--vid-webpack-master/src/app/shared/resolvers/retry/retry.resolver.ts27
-rw-r--r--vid-webpack-master/src/app/shared/resolvers/viewEdit/viewEdit.resolver.spec.ts82
-rw-r--r--vid-webpack-master/src/app/shared/resolvers/viewEdit/viewEdit.resolver.ts40
-rw-r--r--vid-webpack-master/src/app/shared/server/healthStatusService/health-status.service.spec.ts60
-rw-r--r--vid-webpack-master/src/app/shared/server/healthStatusService/health-status.service.ts6
-rw-r--r--vid-webpack-master/src/app/shared/server/serviceInfo/AuditStatus.model.ts4
-rw-r--r--vid-webpack-master/src/app/shared/server/serviceInfo/serviceInfo.model.ts6
-rw-r--r--vid-webpack-master/src/app/shared/server/serviceInfo/serviceInfo.service.spec.ts77
-rw-r--r--vid-webpack-master/src/app/shared/server/serviceInfo/serviceInfo.service.ts49
-rw-r--r--vid-webpack-master/src/app/shared/services/aaiService/aai.actions.ts (renamed from vid-webpack-master/src/app/services/aaiService/aai.actions.ts)4
-rw-r--r--vid-webpack-master/src/app/shared/services/aaiService/aai.epics.ts (renamed from vid-webpack-master/src/app/services/aaiService/aai.epics.ts)40
-rw-r--r--vid-webpack-master/src/app/shared/services/aaiService/aai.service.spec.ts497
-rw-r--r--vid-webpack-master/src/app/shared/services/aaiService/aai.service.ts619
-rw-r--r--vid-webpack-master/src/app/shared/services/aaiService/model/crawledAaiService.ts30
-rw-r--r--vid-webpack-master/src/app/shared/services/aaiService/responseInterfaces/getAicZonesResponseInterface.ts (renamed from vid-webpack-master/src/app/services/aaiService/responseInterfaces/getAicZonesResponseInterface.ts)0
-rw-r--r--vid-webpack-master/src/app/shared/services/aaiService/responseInterfaces/getCategoryParamsResponseInterface.ts (renamed from vid-webpack-master/src/app/services/aaiService/responseInterfaces/getCategoryParamsResponseInterface.ts)0
-rw-r--r--vid-webpack-master/src/app/shared/services/aaiService/responseInterfaces/getServiceModelResponseInterface.ts (renamed from vid-webpack-master/src/app/services/aaiService/responseInterfaces/getServiceModelResponseInterface.ts)2
-rw-r--r--vid-webpack-master/src/app/shared/services/aaiService/responseInterfaces/getServicesResponseInterface.ts (renamed from vid-webpack-master/src/app/services/aaiService/responseInterfaces/getServicesResponseInterface.ts)0
-rw-r--r--vid-webpack-master/src/app/shared/services/aaiService/responseInterfaces/getSubDetailsResponseInterface.ts (renamed from vid-webpack-master/src/app/services/aaiService/responseInterfaces/getSubDetailsResponseInterface.ts)0
-rw-r--r--vid-webpack-master/src/app/shared/services/aaiService/responseInterfaces/getSubscribersResponseInterface.ts (renamed from vid-webpack-master/src/app/services/aaiService/responseInterfaces/getSubscribersResponseInterface.ts)2
-rw-r--r--vid-webpack-master/src/app/shared/services/configuration.service.ts (renamed from vid-webpack-master/src/app/services/configuration.service.ts)9
-rw-r--r--vid-webpack-master/src/app/shared/services/data.service.ts (renamed from vid-webpack-master/src/app/services/data.service.ts)0
-rw-r--r--vid-webpack-master/src/app/shared/services/defaultDataServiceGenerator/default.data.generator.service.spec.ts372
-rw-r--r--vid-webpack-master/src/app/shared/services/defaultDataServiceGenerator/default.data.generator.service.ts448
-rw-r--r--vid-webpack-master/src/app/shared/services/featureFlag/feature-flags.service.spec.ts47
-rw-r--r--vid-webpack-master/src/app/shared/services/featureFlag/feature-flags.service.ts29
-rw-r--r--vid-webpack-master/src/app/shared/services/msoService/mso.service.spec.ts37
-rw-r--r--vid-webpack-master/src/app/shared/services/msoService/mso.service.ts38
-rw-r--r--vid-webpack-master/src/app/shared/shared.module.ts178
-rw-r--r--vid-webpack-master/src/app/shared/store/epics.ts (renamed from vid-webpack-master/src/app/store/epics.ts)4
-rw-r--r--vid-webpack-master/src/app/shared/store/module.ts36
-rw-r--r--vid-webpack-master/src/app/shared/store/reducers.ts16
-rw-r--r--vid-webpack-master/src/app/shared/storeUtil/utils/general/general.action.spec.ts157
-rw-r--r--vid-webpack-master/src/app/shared/storeUtil/utils/general/general.actions.ts150
-rw-r--r--vid-webpack-master/src/app/shared/storeUtil/utils/general/general.reducers.spec.ts376
-rw-r--r--vid-webpack-master/src/app/shared/storeUtil/utils/general/general.reducers.ts147
-rw-r--r--vid-webpack-master/src/app/shared/storeUtil/utils/global/global.actions.ts37
-rw-r--r--vid-webpack-master/src/app/shared/storeUtil/utils/global/global.reducers.spec.ts48
-rw-r--r--vid-webpack-master/src/app/shared/storeUtil/utils/global/global.reducers.ts (renamed from vid-webpack-master/src/app/global.reducer.ts)18
-rw-r--r--vid-webpack-master/src/app/shared/storeUtil/utils/main.reducer.ts67
-rw-r--r--vid-webpack-master/src/app/shared/storeUtil/utils/network/network.actions.ts94
-rw-r--r--vid-webpack-master/src/app/shared/storeUtil/utils/network/network.reducers.spec.ts114
-rw-r--r--vid-webpack-master/src/app/shared/storeUtil/utils/network/network.reducers.ts102
-rw-r--r--vid-webpack-master/src/app/shared/storeUtil/utils/relatedVnfMember/relatedVnfMember.actions.ts68
-rw-r--r--vid-webpack-master/src/app/shared/storeUtil/utils/relatedVnfMember/relatedVnfMember.reducers.spec.ts153
-rw-r--r--vid-webpack-master/src/app/shared/storeUtil/utils/relatedVnfMember/relatedVnfMember.reducers.ts58
-rw-r--r--vid-webpack-master/src/app/shared/storeUtil/utils/service/service.actions.ts102
-rw-r--r--vid-webpack-master/src/app/shared/storeUtil/utils/service/service.reducers.spec.ts499
-rw-r--r--vid-webpack-master/src/app/shared/storeUtil/utils/service/service.reducers.ts107
-rw-r--r--vid-webpack-master/src/app/shared/storeUtil/utils/vfModule/vfModule.actions.ts105
-rw-r--r--vid-webpack-master/src/app/shared/storeUtil/utils/vfModule/vfModule.reducers.spec.ts248
-rw-r--r--vid-webpack-master/src/app/shared/storeUtil/utils/vfModule/vfModule.reducers.ts165
-rw-r--r--vid-webpack-master/src/app/shared/storeUtil/utils/vnf/vnf.actions.ts99
-rw-r--r--vid-webpack-master/src/app/shared/storeUtil/utils/vnf/vnf.reducers.spec.ts132
-rw-r--r--vid-webpack-master/src/app/shared/storeUtil/utils/vnf/vnf.reducers.ts124
-rw-r--r--vid-webpack-master/src/app/shared/storeUtil/utils/vnfGroup/vnfGroup.actions.ts82
-rw-r--r--vid-webpack-master/src/app/shared/storeUtil/utils/vnfGroup/vnfGroup.reducers.spec.ts140
-rw-r--r--vid-webpack-master/src/app/shared/storeUtil/utils/vnfGroup/vnfGroup.reducers.ts108
-rw-r--r--vid-webpack-master/src/app/shared/utils/constants.ts9
-rw-r--r--vid-webpack-master/src/app/shared/utils/httpInterceptor/httpInterceptor.service.ts27
-rw-r--r--vid-webpack-master/src/app/shared/utils/log/log.service.spec.ts46
-rw-r--r--vid-webpack-master/src/app/shared/utils/util.spec.ts31
-rw-r--r--vid-webpack-master/src/app/shared/utils/utils.ts (renamed from vid-webpack-master/src/app/utils/utils.ts)4
-rw-r--r--vid-webpack-master/src/app/shared/validators/uniqueName/uniqueName.validator.spec.ts41
-rw-r--r--vid-webpack-master/src/app/shared/validators/uniqueName/uniqueName.validator.ts100
-rw-r--r--vid-webpack-master/src/app/store/module.ts29
-rw-r--r--vid-webpack-master/src/app/store/reducers.ts17
-rw-r--r--vid-webpack-master/src/app/support/support.component.ts20
-rw-r--r--vid-webpack-master/src/app/vlanTagging/form-async/form-async.component.ts (renamed from vid-webpack-master/src/app/components/form-async/form-async.component.ts)52
-rw-r--r--vid-webpack-master/src/app/vlanTagging/form-async/form-async.service.spec.ts31
-rw-r--r--vid-webpack-master/src/app/vlanTagging/form-async/form-async.service.ts12
-rw-r--r--vid-webpack-master/src/app/vlanTagging/form-async/form-async.style.scss (renamed from vid-webpack-master/src/app/components/form-async/form-async.style.scss)0
-rw-r--r--vid-webpack-master/src/app/vlanTagging/form-async/form-async.template.html (renamed from vid-webpack-master/src/app/components/form-async/form-async.template.html)6
-rw-r--r--vid-webpack-master/src/app/vlanTagging/network-selector/network-selector.component.ts4
-rw-r--r--vid-webpack-master/src/app/vlanTagging/vlan-tagging.component.html2
-rw-r--r--vid-webpack-master/src/app/vlanTagging/vlan-tagging.component.ts31
-rw-r--r--vid-webpack-master/src/app/vlanTagging/vlan-tagging.module.ts14
-rw-r--r--vid-webpack-master/src/app/vlanTagging/vlan-tagging.routing.ts19
397 files changed, 58550 insertions, 6921 deletions
diff --git a/vid-webpack-master/src/app/angular-tree-component.scss b/vid-webpack-master/src/app/angular-tree-component.scss
new file mode 100644
index 000000000..40333b9d1
--- /dev/null
+++ b/vid-webpack-master/src/app/angular-tree-component.scss
@@ -0,0 +1,83 @@
+.tree-children.tree-children-no-padding { padding-left: 0 }
+.tree-children { padding-left: 20px; overflow: hidden }
+.node-drop-slot { display: block; height: 2px }
+.node-drop-slot.is-dragging-over { background: #ddffee; height: 20px; border: 2px dotted #888; }
+.toggle-children-wrapper-expanded .toggle-children { transform: rotate(90deg) }
+.toggle-children-wrapper-collapsed .toggle-children { transform: rotate(0); }
+.toggle-children-wrapper {
+ padding: 2px 3px 5px 1px;
+}
+/* tslint:disable */
+.toggle-children {
+ background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAASCAYAAABSO15qAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABAhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDY3IDc5LjE1Nzc0NywgMjAxNS8wMy8zMC0yMzo0MDo0MiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ1dWlkOjY1RTYzOTA2ODZDRjExREJBNkUyRDg4N0NFQUNCNDA3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkYzRkRFQjcxODUzNTExRTU4RTQwRkQwODFEOUZEMEE3IiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkYzRkRFQjcwODUzNTExRTU4RTQwRkQwODFEOUZEMEE3IiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChNYWNpbnRvc2gpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MTk5NzA1OGEtZDI3OC00NDZkLWE4ODgtNGM4MGQ4YWI1NzNmIiBzdFJlZjpkb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6YzRkZmQxMGMtY2NlNS0xMTc4LWE5OGQtY2NkZmM5ODk5YWYwIi8+IDxkYzp0aXRsZT4gPHJkZjpBbHQ+IDxyZGY6bGkgeG1sOmxhbmc9IngtZGVmYXVsdCI+Z2x5cGhpY29uczwvcmRmOmxpPiA8L3JkZjpBbHQ+IDwvZGM6dGl0bGU+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+5iogFwAAAGhJREFUeNpiYGBgKABigf///zOQg0EARH4A4gZyDIIZ8B/JoAJKDIDhB0CcQIkBRBtEyABkgxwoMQCGD6AbRKoBGAYxQgXIBRuZGKgAKPIC3QLxArnRSHZCIjspk52ZKMrOFBUoAAEGAKnq593MQAZtAAAAAElFTkSuQmCC');
+ height: 8px;
+ width: 9px;
+ background-size: contain;
+ display: inline-block;
+ position: relative;
+ top: 1px;
+ background-repeat: no-repeat;
+ background-position: center;
+}
+.toggle-children-placeholder {
+ display: inline-block;
+ height: 10px;
+ width: 10px;
+ position: relative;
+ top: 1px;
+ padding-right: 3px;
+}
+.node-content-wrapper {
+ display: inline-block;
+ padding: 2px 5px;
+ border-radius: 2px;
+ transition: background-color .15s,box-shadow .15s;
+}
+.node-wrapper {display: flex; align-items: flex-start;}
+.node-content-wrapper-active,
+.node-content-wrapper.node-content-wrapper-active:hover,
+.node-content-wrapper-active.node-content-wrapper-focused {
+ background: #beebff;
+}
+.node-content-wrapper-focused { background: #e7f4f9 }
+.node-content-wrapper:hover { background: #f7fbff }
+.node-content-wrapper-active, .node-content-wrapper-focused, .node-content-wrapper:hover {
+ box-shadow: inset 0 0 1px #999;
+}
+.node-content-wrapper.is-dragging-over { background: #ddffee; box-shadow: inset 0 0 1px #999; }
+.node-content-wrapper.is-dragging-over-disabled { opacity: 0.5 }
+
+tree-viewport {
+ height: 100%;
+ overflow: auto;
+ display: block;
+}
+.tree-children { padding-left: 20px }
+.empty-tree-drop-slot .node-drop-slot { height: 20px; min-width: 100px }
+.angular-tree-component {
+ width: 100%;
+ position:relative;
+ display: inline-block;
+ cursor: pointer;
+ -webkit-touch-callout: none; /* iOS Safari */
+ -webkit-user-select: none; /* Chrome/Safari/Opera */
+ -khtml-user-select: none; /* Konqueror */
+ -moz-user-select: none; /* Firefox */
+ -ms-user-select: none; /* IE/Edge */
+ user-select: none; /* non-prefixed version, currently not supported by any browser */
+}
+
+tree-root .angular-tree-component-rtl {
+ direction: rtl;
+}
+tree-root .angular-tree-component-rtl .toggle-children-wrapper-collapsed .toggle-children {
+ transform: rotate(180deg) !important;
+}
+tree-root .angular-tree-component-rtl .tree-children {
+ padding-right: 20px;
+ padding-left: 0;
+}
+
+tree-node-checkbox {
+ padding: 1px;
+}
diff --git a/vid-webpack-master/src/app/app.component.html b/vid-webpack-master/src/app/app.component.html
index 3768d0c53..a247e2f5f 100644
--- a/vid-webpack-master/src/app/app.component.html
+++ b/vid-webpack-master/src/app/app.component.html
@@ -1,6 +1,7 @@
<main>
<router-outlet>
<message-box></message-box>
+ <audit-info-modal></audit-info-modal>
<spinner-component></spinner-component>
</router-outlet>
</main>
diff --git a/vid-webpack-master/src/app/app.component.ts b/vid-webpack-master/src/app/app.component.ts
index 528c7d7a4..dc4bc88c9 100644
--- a/vid-webpack-master/src/app/app.component.ts
+++ b/vid-webpack-master/src/app/app.component.ts
@@ -1,28 +1,17 @@
-import {Component, Inject} from '@angular/core';
-
-import { ApiService } from './shared';
-
-import '../style/app.scss';
+import {Component} from '@angular/core';
import {NgRedux} from "@angular-redux/store";
-import {AppState} from "./store/reducers";
-import { LogService } from './shared/utils/log/log.service';
+import {AppState} from "./shared/store/reducers";
+import '../style/app.scss';
@Component({
- selector: 'vid-app', // <vid-app></vid-app>
+ selector: 'vid-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
})
export class AppComponent {
- url = 'https://github.com/preboot/angular2-webpack';
- title: string;
-
-
- constructor(private api: ApiService, private store: NgRedux<AppState>, private _logService : LogService) {
- this.title = this.api.title;
+ constructor(private store: NgRedux<AppState>) {
store.subscribe(()=>{
sessionStorage.setItem('reduxState', JSON.stringify(store.getState()));
});
-
- this._logService.info("testing new log service");
}
}
diff --git a/vid-webpack-master/src/app/app.module.ts b/vid-webpack-master/src/app/app.module.ts
index a87ffb5b7..ce9b7da3b 100644
--- a/vid-webpack-master/src/app/app.module.ts
+++ b/vid-webpack-master/src/app/app.module.ts
@@ -1,26 +1,26 @@
-import { ApplicationRef, NgModule } from '@angular/core';
-import { BrowserModule } from '@angular/platform-browser';
-import { HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http';
-import { FormsModule, ReactiveFormsModule } from '@angular/forms';
-import { AppComponent } from './app.component';
-import { HomeComponent } from './home/home.component';
-import { ApiService } from './shared';
-import { routing } from './app.routing';
-import { createNewHosts, removeNgStyles } from '@angularclass/hmr';
-import { BrowseSdcModule } from './browseSdc/browseSdc.module';
-import { VlanTaggingModule } from './vlanTagging/vlan-tagging.module'
-import { BootstrapModalModule } from 'ng2-bootstrap-modal';
-import { HashLocationStrategy, LocationStrategy } from "@angular/common";
-import { InstantiationStatusModule } from './instantiationStatus/InstantiationStatus.module';
-import { SharedModule } from './shared/shared.module';
-import { AngularSvgIconModule } from 'angular-svg-icon';
-import { NgReduxModule } from '@angular-redux/store';
-import { StoreModule } from "./store/module";
-import { HttpInterceptorService } from './shared/utils/httpInterceptor/httpInterceptor.service';
-import { DrawingBoardModule } from './drawingBoard/drawingBoard.module';
-import { HealthStatusComponent } from './healthStatus/health-status.component';
-import { ScrollToModule } from '@nicky-lenaers/ngx-scroll-to';
-import { LogService } from './shared/utils/log/log.service';
+import {ApplicationRef, NgModule} from '@angular/core';
+import {BrowserModule} from '@angular/platform-browser';
+import {HTTP_INTERCEPTORS, HttpClientModule} from '@angular/common/http';
+import {FormsModule, ReactiveFormsModule} from '@angular/forms';
+import {AppComponent} from './app.component';
+import {routing} from './app.routing';
+import {VlanTaggingModule} from './vlanTagging/vlan-tagging.module'
+import {BootstrapModalModule} from 'ng2-bootstrap-modal';
+import {HashLocationStrategy, LocationStrategy} from "@angular/common";
+import {InstantiationStatusModule} from './instantiationStatus/InstantiationStatus.module';
+import {SharedModule} from './shared/shared.module';
+import {AngularSvgIconModule} from 'angular-svg-icon';
+import {NgReduxModule} from '@angular-redux/store';
+import {StoreModule} from "./shared/store/module";
+import {HttpInterceptorService} from './shared/utils/httpInterceptor/httpInterceptor.service';
+import {DrawingBoardModule} from './drawingBoard/drawingBoard.module';
+import {ScrollToModule} from '@nicky-lenaers/ngx-scroll-to';
+import {LogService} from './shared/utils/log/log.service';
+import {FeatureFlagsService} from "./shared/services/featureFlag/feature-flags.service";
+import {SupportComponent} from "./support/support.component";
+import {DrawingBoardGuard} from "./drawingBoard/guards/servicePlanningGuard/drawingBoardGuard";
+import {MsoService} from "./shared/services/msoService/mso.service";
+import {HealthStatusModule} from "./healthStatus/health-status.module";
@NgModule({
imports: [
@@ -31,11 +31,10 @@ import { LogService } from './shared/utils/log/log.service';
SharedModule.forRoot(),
ScrollToModule.forRoot(),
DrawingBoardModule,
+ HealthStatusModule,
VlanTaggingModule,
InstantiationStatusModule,
- BrowseSdcModule,
BootstrapModalModule,
- BrowseSdcModule,
AngularSvgIconModule,
ReactiveFormsModule,
NgReduxModule,
@@ -43,37 +42,22 @@ import { LogService } from './shared/utils/log/log.service';
],
declarations: [
AppComponent,
- HomeComponent,
- HealthStatusComponent
+ SupportComponent,
],
providers: [
- ApiService,
LogService,
+ FeatureFlagsService,
+ DrawingBoardGuard,
+ MsoService,
{ provide: LocationStrategy, useClass: HashLocationStrategy },
{ provide: HTTP_INTERCEPTORS, useClass: HttpInterceptorService, multi: true }
],
bootstrap: [AppComponent]
})
+
export class AppModule {
- private static CustomLoader: any;
constructor(public appRef: ApplicationRef) {
- //for ng2-bootstrap-modal in angualar 5
Object.defineProperty(appRef, '_rootComponents', { get: () => appRef['components'] });
}
- hmrOnInit(store) {
- console.log('HMR store', store);
- }
- hmrOnDestroy(store) {
- let cmpLocation = this.appRef.components.map(cmp => cmp.location.nativeElement);
- // recreate elements
- store.disposeOldHosts = createNewHosts(cmpLocation);
- // remove styles
- removeNgStyles();
- }
- hmrAfterDestroy(store) {
- // display new elements
- store.disposeOldHosts();
- delete store.disposeOldHosts;
- }
}
diff --git a/vid-webpack-master/src/app/app.routing.ts b/vid-webpack-master/src/app/app.routing.ts
index e6f42f9ed..779d17e3c 100644
--- a/vid-webpack-master/src/app/app.routing.ts
+++ b/vid-webpack-master/src/app/app.routing.ts
@@ -1,40 +1,23 @@
import {RouterModule, Routes} from '@angular/router';
-
-import {HomeComponent} from './home/home.component';
-import {BrowseSdcComponent} from './browseSdc/browseSdc.component';
-import {ServicePlanningComponent, ServicePlanningEmptyComponent} from './drawingBoard/service-planning/service-planning.component';
-import {VlanTaggingComponent} from './vlanTagging/vlan-tagging.component';
-import {ServicePopupComponent} from './components/service-popup/service-popup.component';
-import { InstantiationStatusComponent } from './instantiationStatus/instantiationStatus.component';
-import {HealthStatusComponent} from "./healthStatus/health-status.component";
-import {FlagsResolve} from "./services/flags.resolve";
-
+import {FlagsResolve} from "./shared/resolvers/flag/flag.resolver";
+import {DrawingBoardRoutes} from "./drawingBoard/drawingBoard.routing";
+import {GenericFormPopupComponent} from "./shared/components/genericFormPopup/generic-form-popup.component";
+import {SupportComponent} from "./support/support.component";
+import {HealthStatusRoutes} from "./healthStatus/health-status.routing";
+import {VlanTaggingRoutes} from "./vlanTagging/vlan-tagging.routing";
+import {InstantiationStatusRoutes} from "./instantiationStatus/InstantiationStatus.routing";
const routes: Routes = [
- { path: '', component: HomeComponent, pathMatch: 'full' ,resolve : {
- flags : FlagsResolve,
- }},
- { path: 'browseSdc', component: BrowseSdcComponent, resolve : {
- flags : FlagsResolve,
- }},
- { path: 'servicePlanning', component: ServicePlanningComponent, resolve : {
- flags : FlagsResolve,
- }},
- { path: 'servicePlanningEmpty', component: ServicePlanningEmptyComponent, resolve : {
- flags : FlagsResolve,
- }},
- { path: 'servicePopup', component: ServicePopupComponent, resolve : {
- flags : FlagsResolve,
- }},
- { path :'vlan', component : VlanTaggingComponent, resolve : {
- flags : FlagsResolve,
- }},
- { path: 'instantiationStatus', component: InstantiationStatusComponent, resolve : {
- flags : FlagsResolve,
- }},
- { path: 'healthStatus', component: HealthStatusComponent, resolve : {
- flags : FlagsResolve,
- }}
-
+ ...DrawingBoardRoutes,
+ ...HealthStatusRoutes,
+ ...VlanTaggingRoutes,
+ ...InstantiationStatusRoutes,
+ {
+ path: 'servicePopup',
+ component: GenericFormPopupComponent,
+ resolve: {
+ flags: FlagsResolve
+ }
+ },
+ {path: 'support', component: SupportComponent},
];
-
export const routing = RouterModule.forRoot(routes);
diff --git a/vid-webpack-master/src/app/browseSdc/browseSdc.component.html b/vid-webpack-master/src/app/browseSdc/browseSdc.component.html
deleted file mode 100644
index 7ffd7931c..000000000
--- a/vid-webpack-master/src/app/browseSdc/browseSdc.component.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<div>
-
- <span class="statusLine" [hidden]="!isSpinnerVisible">
- <img src="./img/spinner.gif"/>
- </span>
- <span class="statusLine" [hidden]="!isProgressVisible">
- <label>Status:</label><span class="status"><span [hidden]="!error"><font color='red'><b>Error: </b></font></span>{{status}}</span>
- </span>
- <br><br>
- <div>
- <input class="form-control search-query" placeholder="Filter..." data-tests-id="browseFilter" type="text" [(ngModel)]="filterQuery" size="20" style="width: 250px;">
- </div>
-
- <h1 class="heading1" style="margin-top:20px;">Browse SDC Service Models</h1>
- <div style="margin-top:30px">
- <button (click)="deploy()">deploy</button>
- <vid-table
- [options]="tableOptions"
- [filterQuery]="filterQuery"
- (clickEvent)="clickAction($event)">
- Loading table...
- </vid-table>
- </div>
-</div>
-
-
diff --git a/vid-webpack-master/src/app/browseSdc/browseSdc.component.scss b/vid-webpack-master/src/app/browseSdc/browseSdc.component.scss
deleted file mode 100644
index 0d1678a94..000000000
--- a/vid-webpack-master/src/app/browseSdc/browseSdc.component.scss
+++ /dev/null
@@ -1,59 +0,0 @@
-div[ng-controller=ServiceModelController] .popupContents {
- text-align: left;
-}
-
-div[ng-controller=ServiceModelController] .statusLine {
- vertical-align: center;
-}
-
-div[ng-controller=ServiceModelController] .statusLine img {
- width: 20px;
- margin: 10px;
-}
-
-div[ng-controller=ServiceModelController] .status {
- margin-left: 5px;
-}
-
-div[ng-controller=ServiceModelController] .feedback {
- height: 35px;
- vertical-align: center;
-}
-
-div[ng-controller=ServiceModelController] .progress {
- margin: 0px 10px;
- font-weight: bold;
-}
-
-div[ng-controller=ServiceModelController] .error {
- width: 630px;
- font-weight: bold;
- font-size: 16px;
- color: red;
- margin: 0px 10px 0px 45px;
-}
-
-div[ng-controller=ServiceModelController] .error img {
- width: 25px;
- margin: 0px 10px;
-}
-
-div[ng-controller=ServiceModelController] .buttonRow {
- text-align: center;
- margin-bottom: 10px;
-}
-
-div[ng-controller=ServiceModelController] .log {
- width: 700px;
- height: 500px;
- border: solid black 1px;
- text-align: left !important;
- margin: 10px;
- padding: 10px;
- overflow: auto;
-}
-
-
-.previous-versions-button {
- width: 113px;
-}
diff --git a/vid-webpack-master/src/app/browseSdc/browseSdc.component.ts b/vid-webpack-master/src/app/browseSdc/browseSdc.component.ts
deleted file mode 100644
index 46f37dc2e..000000000
--- a/vid-webpack-master/src/app/browseSdc/browseSdc.component.ts
+++ /dev/null
@@ -1,176 +0,0 @@
-import {Component, Input, OnInit} from '@angular/core';
-import * as _ from 'lodash';
-import {SdcService} from '../services/sdc.service';
-import {DialogService} from 'ng2-bootstrap-modal';
-import {Constants} from '../shared/utils/constants';
-import {CustomTableColumnDefinition, CustomTableOptions} from './vid-table/vid-table.component';
-import {ServicePopupComponent} from "../components/service-popup/service-popup.component";
-import { PreviousVersionsComponent } from './previous-versions/previous-versions.component';
-
-@Component({
- selector: 'browse-sdc',
- templateUrl: './browseSdc.component.html',
- styleUrls: ['./browseSdc.component.scss']
-})
-
-
-export class BrowseSdcComponent implements OnInit {
-
- isSpinnerVisible = false;
- isProgressVisible = false;
- error: boolean;
- status: string;
- // table
-
- private basicColumns: CustomTableColumnDefinition[];
- @Input () filterQuery = '';
- tableOptions: CustomTableOptions;
- private wholeData: any[];
-
- constructor(private _sdcService: SdcService, private dialogService: DialogService) {}
-
- initTableOptions() {
- this.basicColumns = [
- { displayName: 'Action', key: 'action', type: 'button' , text: 'deploy', action: 'deploy' },
- { displayName: 'UUID', key: 'uuid', filter: 'text'},
- { displayName: 'invariantUUID', key: 'invariantUUID', filter: 'text'},
- { displayName: 'Name', key: 'name', filter: 'text'},
- { displayName: 'Version', key: 'version', filter: 'text'},
- { displayName: 'Category', key: 'category', filter: 'text'},
- { displayName: 'Distribution Status', key: 'distributionStatus', filter: 'text'},
- { displayName: 'Last Updated By', key: 'lastUpdaterUserId', filter: 'text'},
- { displayName: 'Tosca Model', key: 'toscaModelUrl', filter: 'text'}
- ];
-
- let columns: CustomTableColumnDefinition[] = this.basicColumns.concat(
- {displayName: 'Action', key: 'actions', type: 'button', text: 'Previous Versions',
- showCondition: 'hasPreviousVersion', action: 'loadPreviousData' }
- );
-
- this.tableOptions = {
- data: [],
- columns: columns,
- config: {
- sortBy: 'name',
- sortOrder: 'asc',
- pageSize: 10,
- pageNumber: 1,
- totalCount: 0,
- totalPages: 0,
- maxSize: 10,
- showSelectCheckbox: true,
- showSelectAll: true,
- showSort: true,
- clientSort: true,
- clientPaging: true,
- // displayPager: true,
- // displayPageSize: true,
- stickyHeader: true,
- stickyHeaderOffset: 0,
- stickyContainer: '.table1-container'
- },
- };
- }
- private deploy(service: any): void {
- if (service) {
- console.log('this row uuid:' + service.uuid);
- }
-
- this.dialogService.addDialog(ServicePopupComponent, {
- })
- }
-
- private filterDataWithHigherVersion(serviceData) {
- let delimiter = '$$';
- let filterDataServices = {};
- for (let i = 0; i < serviceData.length; i++) {
- let index = serviceData[i].invariantUUID.trim() + delimiter + serviceData[i].name.trim();
- if (!filterDataServices[index]) {
- filterDataServices[index] = {
- service: serviceData[i],
- hasPreviousVersion: false
- };
- } else {
- filterDataServices[index].hasPreviousVersion = true;
- if (parseFloat(serviceData[i].version.trim()) > parseFloat(filterDataServices[index].service.version.trim())) {
- filterDataServices[index].service = serviceData[i];
- }
- }
- }
- return Object.keys(filterDataServices).map(function (key) {
- let service = filterDataServices[key].service;
- service.hasPreviousVersion = filterDataServices[key].hasPreviousVersion;
- return service;
- });
- }
-
- private initData() {
- this.isProgressVisible = true;
- this.isSpinnerVisible = true;
- console.log('getServicesModels: ');
- this._sdcService.getServicesModels().subscribe(
- // onNext() function
- value => this.getServiceCallback(value),
- // onError() function
- error => this.getServiceOnError(error),
- // onComplete() function
- () => console.log('completed')
- );
- }
-
- private getServiceCallback(responseBody: any): void {
- console.log('response is ' , responseBody);
- this.wholeData = responseBody.services;
- this.tableOptions.data = this.filterDataWithHigherVersion(responseBody.services);
- this.isSpinnerVisible = false;
- this.isProgressVisible = false;
- }
- private getServiceOnError(error: any): void {
- console.log('error is ' , error);
- this.status = Constants.Status.FAILED_SERVICE_MODELS_ASDC;
- this.error = true;
- this.isSpinnerVisible = false;
- }
-
- private loadPreviousVersionData(service): void {
- let previousVersionData: any[] = _.filter(this.wholeData, function(item) {
- return item.invariantUUID === service.invariantUUID && item.name === service.name && service.version !== item.version;
- });
-
- let modalTableOptions: CustomTableOptions = {
- data: previousVersionData,
- columns: this.basicColumns,
- config: {
- sortBy: 'version',
- sortOrder: 'desc'}
- };
- // open modal
- this.dialogService.addDialog(PreviousVersionsComponent, {
- title: service.name + ' - Previous Version',
- tableOptions: modalTableOptions
- })
- .subscribe( service => {
- if (service) {
- this.deploy(service);
- }
- });
- }
-
-
- public clickAction(row) {
- switch (row.actionName) {
- case 'loadPreviousData':
- this.loadPreviousVersionData(row);
- break;
- case 'deploy':
- this.deploy(row);
- break;
- }
- }
-
- ngOnInit() {
- console.log('Browse SDC Service Models');
- this.initTableOptions();
- this.initData();
- }
-}
diff --git a/vid-webpack-master/src/app/browseSdc/browseSdc.module.ts b/vid-webpack-master/src/app/browseSdc/browseSdc.module.ts
deleted file mode 100644
index b7dd78e54..000000000
--- a/vid-webpack-master/src/app/browseSdc/browseSdc.module.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-
-import { NgModule } from '@angular/core';
-import {BrowseSdcComponent} from './browseSdc.component';
-import {VidTableComponent} from './vid-table/vid-table.component';
-import {SdcService} from '../services/sdc.service';
-import {CommonModule} from '@angular/common';
-import {FormsModule, ReactiveFormsModule} from '@angular/forms';
-import {DataTableModule} from 'angular2-datatable';
-import {BootstrapModalModule} from 'ng2-bootstrap-modal';
-import {PreviousVersionsComponent} from './previous-versions/previous-versions.component';
-import {ServicePopupComponent} from '../components/service-popup/service-popup.component';
-import {ServiceInstanceDetailsComponent} from "../components/service-popup/service-instance-details/service-instance-details.component";
-import {TooltipModule} from 'ngx-tooltip';
-import {InputsModule} from "../modules/inputs.module";
-import {VnfPopupComponent} from "../components/vnf-popup/vnf-popup.components";
-import {VnfInstanceDetailsComponent} from "../components/vnf-popup/vnf-instance-details/vnf-instance-details.component";
-import { VnfInstanceDetailsService } from '../components/vnf-popup/vnf-instance-details/vnf-instance-details.service';
-import { SharedModule } from '../shared/shared.module';
-import { ServiceInstanceDetailsService } from '../components/service-popup/service-instance-details/service-instance-details.service';
-import { ServicePopupService } from '../components/service-popup/service-popup.service';
-import { DataFilterPipe } from '../shared/pipes/data-filter.pipe';
-
-
-@NgModule({
- imports: [CommonModule, FormsModule, ReactiveFormsModule, BootstrapModalModule, DataTableModule, TooltipModule, InputsModule, SharedModule.forRoot()],
- providers: [SdcService, VnfInstanceDetailsService, ServiceInstanceDetailsService, ServicePopupService],
- declarations: [BrowseSdcComponent, VidTableComponent, DataFilterPipe, PreviousVersionsComponent,
- ServicePopupComponent, ServiceInstanceDetailsComponent, VnfPopupComponent, VnfInstanceDetailsComponent
- ],
- entryComponents: [BrowseSdcComponent, PreviousVersionsComponent, ServicePopupComponent, VnfPopupComponent],
- exports: [ ]
-
-})
-
-export class BrowseSdcModule { }
diff --git a/vid-webpack-master/src/app/browseSdc/previous-versions/previous-versions.component.ts b/vid-webpack-master/src/app/browseSdc/previous-versions/previous-versions.component.ts
deleted file mode 100644
index 8faf04d6c..000000000
--- a/vid-webpack-master/src/app/browseSdc/previous-versions/previous-versions.component.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import { Component } from '@angular/core';
-import { DialogComponent, DialogService } from 'ng2-bootstrap-modal';
-import { CustomTableOptions } from '../vid-table/vid-table.component';
-
-export interface PreviousVersionsModel {
-
- title: string;
- tableOptions: CustomTableOptions;
-}
-
-@Component({
- selector: 'previous-versions',
- templateUrl: 'previous-versions.html',
- styleUrls: ['previous-versions.css']
-})
-export class PreviousVersionsComponent extends DialogComponent<PreviousVersionsModel, boolean> implements PreviousVersionsModel {
-
- title: string;
- tableOptions: CustomTableOptions;
-
- constructor(dialogService: DialogService) {
- super(dialogService);
- }
-
- public deploy(row) {
- this.result = row;
- this.close();
- }
-}
diff --git a/vid-webpack-master/src/app/browseSdc/previous-versions/previous-versions.css b/vid-webpack-master/src/app/browseSdc/previous-versions/previous-versions.css
deleted file mode 100644
index 92bcbd100..000000000
--- a/vid-webpack-master/src/app/browseSdc/previous-versions/previous-versions.css
+++ /dev/null
@@ -1,4 +0,0 @@
-.modal-dialog {
- width: 1145px;
- font-size: 11px;
-}
diff --git a/vid-webpack-master/src/app/browseSdc/previous-versions/previous-versions.html b/vid-webpack-master/src/app/browseSdc/previous-versions/previous-versions.html
deleted file mode 100644
index 68209b8e8..000000000
--- a/vid-webpack-master/src/app/browseSdc/previous-versions/previous-versions.html
+++ /dev/null
@@ -1,18 +0,0 @@
-<div class="modal-dialog">
- <div class="modal-content">
- <div class="modal-header">
- <button type="button" class="close" (click)="close()" >&times;</button>
- <h4 class="modal-title">{{title}}</h4>
- </div>
- <div class="modal-body">
- <vid-table
- [options]="tableOptions"
- (clickEvent)="deploy($event)">
- Loading table...
- </vid-table>
- </div>
- <div class="modal-footer">
- <button type="button" class="btn btn-default" (click)="close()" >Cancel</button>
- </div>
- </div>
-</div>
diff --git a/vid-webpack-master/src/app/browseSdc/vid-table/vid-table.component.html b/vid-webpack-master/src/app/browseSdc/vid-table/vid-table.component.html
deleted file mode 100644
index 5650e5d35..000000000
--- a/vid-webpack-master/src/app/browseSdc/vid-table/vid-table.component.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<table class="table table-hover table-striped table-sortable" [mfData]="options.data | dataFilter : filterQuery" #mf="mfDataTable" [(mfSortBy)]="options.config.sortBy" [(mfSortOrder)]="options.config.sortOrder" [mfRowsOnPage]="10">
- <thead>
- <tr>
- <th *ngFor="let column of options.columns">
- <mfDefaultSorter by="{{column.key}}"> {{column.displayName}}</mfDefaultSorter>
- </th>
- </tr>
- </thead>
- <tbody>
- <tr *ngFor="let row of mf.data">
- <td *ngFor="let column of options.columns" >
- <button class="btn btn-primary" *ngIf="column.type==='button' && (!column.showCondition || row[column.showCondition])" title="{{column.text}}" (click)="clickBtn(row, column.action)">
- {{column.text}}
- </button>
- {{row[column.key]}}
- </td>
- </tr>
- </tbody>
- <tfoot>
- <tr>
- <td colspan="5">
- <mfBootstrapPaginator [rowsOnPageSet]="[10,15,20]"></mfBootstrapPaginator>
- </td>
- </tr>
- </tfoot>
-</table>
diff --git a/vid-webpack-master/src/app/browseSdc/vid-table/vid-table.component.scss b/vid-webpack-master/src/app/browseSdc/vid-table/vid-table.component.scss
deleted file mode 100644
index f34887987..000000000
--- a/vid-webpack-master/src/app/browseSdc/vid-table/vid-table.component.scss
+++ /dev/null
@@ -1,40 +0,0 @@
-table > thead > tr > th {
- cursor: pointer;
- position: relative;
- background-image: none;
- color: #fff;
- background-color: #666;
- a{
- color: #fff;
- }
-}
-
-.table-sortable > thead > tr > th:after,
-.table-sortable > thead > tr > th.sort-false:after,
-.table-sortable > thead > tr > th.sort-true:after {
- font-family: FontAwesome;
- padding-left: 5px;
-}
-
-.table-sortable > thead > tr > th:after {
- content: "\f0dc";
- color: #ddd;
-}
-.table-sortable > thead > tr > th.sort-false:after {
- content: "\f0de";
- color: #767676;
-}
-.table-sortable > thead > tr > th.sort-true:after {
- content: "\f0dd";
- color: #767676;
-}
-//.table-sortable > tbody > td >
-.table-sortable {
- tbody{
- td{
- .btn-primary{
- min-width: 100px;
- }
- }
- }
-}
diff --git a/vid-webpack-master/src/app/browseSdc/vid-table/vid-table.component.ts b/vid-webpack-master/src/app/browseSdc/vid-table/vid-table.component.ts
deleted file mode 100644
index aa2030908..000000000
--- a/vid-webpack-master/src/app/browseSdc/vid-table/vid-table.component.ts
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
- * Created by cp2122 on 1/2/2018.
- */
-import { Component, Input, EventEmitter, Output } from '@angular/core';
-export class CustomTableColumnDefinition {
- public displayName = '';
- public key = '';
- public type? = 'text';
- public text? = ''; // for button
- public action? = ''; // for button - callback
- public showCondition? = ''; // for button
- // public binding = '';
- public filter? = '';
- // public computedClass: any;
- // public isComputed = false;
- // public isAnchor = false;
- // public srefBinding = '';
-}
-
-export class CustomTableConfig {
- public sortBy = '';
- public sortOrder = 'desc';
- public pageSize? = 10;
- public pageNumber? = 1;
- public totalCount? = 0;
- public totalPages? = 0;
- public maxSize? = 10;
- public showSelectCheckbox? = false;
- public showSelectAll? = true;
- public showSort? = true;
- public clientSort? = true;
- public clientPaging? = true;
- public stickyHeader? = true;
- public stickyHeaderOffset? = 0;
- public stickyContainer? = '';
-}
-
-export class CustomTableOptions {
- public data: any[];
- public columns: Array<CustomTableColumnDefinition>;
- public config: CustomTableConfig;
- // public callbacks: any;
-}
-@Component({
- selector: 'vid-table',
- styleUrls: ['./vid-table.component.scss'],
- templateUrl: './vid-table.component.html'
-})
-
-export class VidTableComponent {
- @Input() options: CustomTableOptions;
- @Input() filterQuery = '';
-
- @Output() clickEvent = new EventEmitter<any>();
- clickBtn(row, actionName) {
- row.actionName = actionName;
- this.clickEvent.emit(row);
- }
-}
diff --git a/vid-webpack-master/src/app/components/instance-popup/instance-popup.components.ts b/vid-webpack-master/src/app/components/instance-popup/instance-popup.components.ts
deleted file mode 100644
index b8ce613d4..000000000
--- a/vid-webpack-master/src/app/components/instance-popup/instance-popup.components.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import {ModelInformationItem} from "../../shared/components/model-information/model-information.component";
-
-
-export interface InstancePopup {
- onCancelClick():void;
- createModelInformationItems(): Array<ModelInformationItem>;
- getModelName():string;
-}
-
diff --git a/vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.component.ts b/vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.component.ts
deleted file mode 100644
index b6a2e3967..000000000
--- a/vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.component.ts
+++ /dev/null
@@ -1,238 +0,0 @@
-import {Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges, ViewChild} from '@angular/core';
-import {FormControl, FormGroup, Validators} from "@angular/forms";
-import {ServicePopupDataModel} from './servicePopupDataModel';
-import {AaiService} from '../../../services/aaiService/aai.service';
-import {updateServiceInstance} from "../../../service.actions";
-import * as _ from 'lodash';
-import {ServiceModel} from "../../../shared/models/serviceModel";
-import {ModelInfo} from "../../../shared/models/modelInfo";
-import {loadProductFamiliesAction} from "../../../services/aaiService/aai.actions";
-import {Observable} from "rxjs/Observable";
-import {SelectOptionInterface} from "../../../shared/models/selectOption";
-import {NgRedux, select} from "@angular-redux/store";
-import {AppState} from "../../../store/reducers";
-import {isNullOrUndefined} from 'util';
-import {ServiceInstanceDetailsService} from './service-instance-details.service';
-import {NumbersLettersUnderscoreValidator} from '../../../shared/components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator';
-import {DefaultDataGeneratorService} from '../../../shared/services/defaultDataServiceGenerator/default.data.generator.service';
-
-
-@Component({
- selector: 'service-instance-details',
- templateUrl: 'service-instance-details.html',
- styleUrls: ['service-instance-details.scss'],
- providers: [AaiService]
-})
-
-export class ServiceInstanceDetailsComponent implements OnInit, OnChanges {
- ngOnChanges(changes: SimpleChanges): void {
- if (changes["serviceInstance"] !== undefined && changes["serviceInstance"].currentValue !== changes["serviceInstance"].previousValue && changes["serviceInstance"].currentValue !== null) {
- this.oldServiceInstance = Object.assign({}, this.serviceInstance);
- }
- }
- _serviceModel: ServiceModel;
- @Input () serviceInstance: any;
- @Input () dynamicInputs;
- @Input () servicesQty: number;
- @Input ()
- set serviceModel(serviceModel: ServiceModel) {
- this._serviceModel = serviceModel;
- this.updateFormGroupControlsWithServiceModel(serviceModel);
- }
- @ViewChild('serviceForm') serviceForm: 'ServiceForm';
- @Output() closePopup : EventEmitter<any> = new EventEmitter<any>();
- @Output() onDataChanged: EventEmitter<any> = new EventEmitter<any>();
- oldServiceInstance = {};
-
- //todo: implement Epics and use @select to fetch the rest of the form's data as done with productFamilies.
- //that way we can loose the updateFormData function and the subscription to store in the constructor.
- @select(['service','productFamilies'])
- readonly productFamilies : Observable<SelectOptionInterface[]>;
- serviceDetails:any = {
-
- };
- servicePopupDataModel: ServicePopupDataModel = new ServicePopupDataModel();
- serviceInstanceDetailsFormGroup: FormGroup;
- serviceInstanceDetailsService : ServiceInstanceDetailsService;
-
- constructor(private _aaiService: AaiService, private store: NgRedux<AppState>, private _serviceInstanceDetailsService : ServiceInstanceDetailsService, private _defaultDataGeneratorService : DefaultDataGeneratorService) {
- this.store.subscribe(() => {this.updateFormData()});
- this.serviceInstanceDetailsService = this._serviceInstanceDetailsService;
- this.serviceInstanceDetailsFormGroup = this.createFormGroup();
-
- this.serviceInstanceDetailsFormGroup.valueChanges.subscribe(()=> {
- this.onDataChanged.next();
- })
- }
-
- ngOnInit() {
- this.subscribeToFormChanges();
- this._aaiService.getSubscribers().subscribe();
- this._aaiService.getCategoryParameters(null).subscribe();
- this._aaiService.getAicZones().subscribe();
- this.store.dispatch(loadProductFamiliesAction());
- }
-
-
- createFormGroup(): FormGroup {
- const formGroup = new FormGroup({
- globalSubscriberId: new FormControl(
- Validators.compose([Validators.required])
- ),
- productFamilyId: new FormControl(),
- subscriptionServiceType: new FormControl({value: null, disabled: true}, Validators.compose([Validators.required])),
- lcpCloudRegionId: new FormControl({value: null, disabled: true}, Validators.compose([Validators.required])),
- tenantId: new FormControl({value: null, disabled: true}, Validators.compose([Validators.required])),
- aicZoneId: new FormControl(),
- projectName: new FormControl(),
- owningEntityId: new FormControl(Validators.compose([Validators.required])),
- rollbackOnFailure: new FormControl(null, Validators.required),
- });
-
- return formGroup;
- }
-
- updateFormGroupControlsWithServiceModel(serviceModel: ServiceModel) {
- this.serviceInstanceDetailsFormGroup.markAsUntouched();
-
- if (serviceModel) {
- this.serviceDetails.isUserProvidedNaming = serviceModel.isUserProvidedNaming;
- if (serviceModel.isUserProvidedNaming) {
- this.serviceInstanceDetailsFormGroup.addControl('instanceName', new FormControl('', Validators.compose([Validators.required, NumbersLettersUnderscoreValidator.valid])))
- }else{
- this.serviceInstanceDetailsFormGroup.removeControl('instanceName');
- }
-
- if (serviceModel.isMultiStepDesign) {
- this.serviceInstanceDetailsFormGroup.addControl('pause', new FormControl(true));
- }else{
- this.serviceInstanceDetailsFormGroup.removeControl('pause');
- }
- }
- }
-
- updateFormData() {
- let service = this.store.getState().service;
- this.servicePopupDataModel.subscribers = service.subscribers;
- this.servicePopupDataModel.serviceTypes = service.serviceTypes[this.servicePopupDataModel.globalCustomerId];
- this.servicePopupDataModel.lcpRegions = service.lcpRegionsAndTenants.lcpRegionList;
- if (this.serviceInstance) {
- this.servicePopupDataModel.tenants = service.lcpRegionsAndTenants.lcpRegionsTenantsMap[this.serviceInstance.lcpCloudRegionId];
- }
- this.servicePopupDataModel.aicZones = service.aicZones;
- this.servicePopupDataModel.owningEntities = _.get(service.categoryParameters, 'owningEntityList');
- this.servicePopupDataModel.projects = _.get(service.categoryParameters, 'projectList');
- this.onDataChanged.next();
- }
-
- subscribeToFormChanges(): void {
- this.serviceInstanceDetailsFormGroup.get('globalSubscriberId').valueChanges.subscribe(val => {
- this.updateServiceTypes(val);
- this.setDisabledState(val, 'subscriptionServiceType');
-
- });
- this.serviceInstanceDetailsFormGroup.get('subscriptionServiceType').valueChanges.subscribe(val => {
- this.getTenants(val);
- this.setDisabledState(val, 'lcpCloudRegionId');
-
- });
- this.serviceInstanceDetailsFormGroup.get('lcpCloudRegionId').valueChanges.subscribe(val => {
- this.setDisabledState(val, 'tenantId');
- this.updateTenantList(val);
-
- });
-
- this.serviceInstanceDetailsFormGroup.get('tenantId').valueChanges.subscribe(val => {
- this.serviceDetails.tenantName = this.getNameFromListById(this.servicePopupDataModel.tenants, val);
- this.onDataChanged.next();
- });
-
- this.serviceInstanceDetailsFormGroup.get('aicZoneId').valueChanges.subscribe(val => {
- this.serviceDetails.aicZoneName = this.getNameFromListById(this.servicePopupDataModel.aicZones, val);
- this.onDataChanged.next();
- });
- }
-
- getNameFromListById(list, id:string ) {
- if(list && id) {
- let filterItem = list.filter(item => {
- return item.id == id;
- })
- return filterItem && filterItem[0].name;
- }
- return null;
- }
-
- setDisabledState(val, field: string): void {
- if(val) {
- this.serviceInstanceDetailsFormGroup.controls[field].enable();
- } else {
- this.serviceInstanceDetailsFormGroup.controls[field].disable();
- }
- }
-
- isShowingNotificationArea(): boolean {
- return this.servicesQty > 1;
- }
-
- updateServiceTypes(subscriberId) {
- if (subscriberId) {
- this.servicePopupDataModel.globalCustomerId = subscriberId;
- this._aaiService.getServiceTypes(subscriberId).subscribe(() => {
- this.updateFormData();
- this.onDataChanged.next();
- }, (error) => {
-
- });
- }
- }
-
- updateTenantList(cloudRegionId) {
- this.servicePopupDataModel.tenants = this.store.getState().service.lcpRegionsAndTenants.lcpRegionsTenantsMap[cloudRegionId];
- this.onDataChanged.next();
- }
-
- getTenants(serviceType) {
- if (serviceType) {
- this._aaiService.getLcpRegionsAndTenants(this.servicePopupDataModel.globalCustomerId, serviceType).subscribe(()=>{
- this.onDataChanged.next();
- });
- }
- }
-
- onSubmit(formValues): void {
- formValues.bulkSize = this.servicesQty;
- let dynamicFields: { [dynamicField: string] : string; };
- dynamicFields = {};
- this.dynamicInputs.map(function (x) {
- let dynamicField: string = x.id;
- dynamicFields[dynamicField] = formValues[dynamicField];
- delete formValues[dynamicField];
- });
- formValues.instanceParams = [];
- formValues.instanceParams.push(dynamicFields);
- formValues.modelInfo = new ModelInfo(this._serviceModel);
- Object.assign(formValues, this.serviceDetails);
- this.store.dispatch(updateServiceInstance(formValues, this._serviceModel.uuid));
- if (this.store.getState().global.flags['FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD']){
- this._defaultDataGeneratorService.updateReduxOnFirstSet(this._serviceModel.uuid,formValues);
- }
- window.parent.postMessage( {
- eventId: 'submitIframe',
- data: {
- serviceModelId: this._serviceModel.uuid
- }
- }, "*");
- this.closePopup.emit(this._serviceModel.uuid);
- }
-
- hasApiError(controlName : string, data : Array<any>){
- if(!isNullOrUndefined(this.servicePopupDataModel) && !isNullOrUndefined(data)){
- if(!this.serviceInstanceDetailsFormGroup.controls[controlName].disabled && data.length === 0){
- return true;
- }
- }
- return false;
- }
-
-}
diff --git a/vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.html b/vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.html
deleted file mode 100644
index 3d632bd89..000000000
--- a/vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.html
+++ /dev/null
@@ -1,168 +0,0 @@
-
-<div id="service-instance-details">
- <form id="serviceForm" #serviceForm="ngForm" (ngSubmit)="onSubmit(serviceForm.value)" [formGroup]="serviceInstanceDetailsFormGroup">
- <!--We can't use [hidden] since bootstrap.css label has display: inline-block. -->
- <!--see https://stackoverflow.com/questions/34650410/angular-2-hidden-does-not-seem-to-be-working-->
- <label id="notification-area" *ngIf="isShowingNotificationArea()">Data entered will apply to all service instances</label>
-
- <div class="details-item" *ngIf="serviceInstanceDetailsFormGroup.get('instanceName')">
- <label class="required">Instance name:</label>
- <input patternInput
- pattern="^[a-zA-Z0-9_]*$"
- [attr.data-tests-id]="'instanceName'"
- id="instance-name"
- name="instance-name"
- [ngClass]="{'error-style' :(serviceInstance?.instanceName != '' && serviceInstanceDetailsFormGroup.controls['instanceName']?.touched && serviceInstanceDetailsFormGroup.controls['instanceName']?.errors?.pattern !== null)}"
- [formControlName]="'instanceName'"
- class="form-control input-text"
- placeholder="Type Instance Name"
- type="text"
- [(ngModel)]="serviceInstance.instanceName" required>
- <form-control-error
- *ngIf="serviceInstance?.instanceName != '' && serviceInstanceDetailsFormGroup.controls['instanceName']?.touched && serviceInstanceDetailsFormGroup.controls['instanceName']?.errors?.pattern !== null"
- [message]="'Instance name may include only alphanumeric characters and underscore.'"></form-control-error>
-
- </div>
-
- <div class="details-item">
- <label class="required">Subscriber name:</label>
- <select class="subscriber form-control input-text" id="subscriber-name-select" data-tests-id="subscriberName"
- name="subscriber-name-select" [formControlName]="'globalSubscriberId'"
- [ngClass]="{'error-style' :serviceInstanceDetailsService.hasApiError('globalSubscriberId',servicePopupDataModel?.subscribers, serviceInstanceDetailsFormGroup)}"
- [(ngModel)]="serviceInstance.globalSubscriberId"
- required>
- <option [value]="undefined" disabled>Select Subscriber Name</option>
- <option class="subscriberNameOption" *ngFor="let subscriber of servicePopupDataModel.subscribers"
- [value]="subscriber.id" [disabled]="!subscriber.isPermitted">{{subscriber.name}}</option>
- </select>
- <form-control-error *ngIf="serviceInstanceDetailsService.hasApiError('globalSubscriberId',servicePopupDataModel?.subscribers, serviceInstanceDetailsFormGroup)" [message]="'No results for this request. Please change criteria.'"></form-control-error>
-
- </div>
-
- <div class="details-item">
- <label class="required">Service type:</label>
- <select class="form-control input-text"
- [(ngModel)]="serviceInstance.subscriptionServiceType"
- [formControlName]="'subscriptionServiceType'"
- [ngClass]="{'error-style' :serviceInstanceDetailsService.hasApiError('subscriptionServiceType',servicePopupDataModel?.serviceTypes, serviceInstanceDetailsFormGroup)}"
- data-tests-id="serviceType" id="service-type-select"
- name="service-type" required>
- <option [value]="undefined" disabled>Select Service Type</option>
- <option *ngFor="let serviceType of servicePopupDataModel.serviceTypes" class="serviceTypeOption" [value]="serviceType.name" [disabled]="!serviceType.isPermitted">{{serviceType.name}}</option>
- </select>
- <form-control-error *ngIf="serviceInstanceDetailsService.hasApiError('subscriptionServiceType',servicePopupDataModel?.serviceTypes, serviceInstanceDetailsFormGroup)" [message]="'No results for this request. Please change criteria.'"></form-control-error>
- </div>
-
- <div class="details-item">
- <label class="required">Product family:</label>
- <select class="form-control input-text"
- data-tests-id="productFamily"
- id="product-family-select"
- [ngClass]="{'error-style' :serviceInstanceDetailsService.hasApiError('productFamilyId',productFamilies, serviceInstanceDetailsFormGroup)}"
- [formControlName]="'productFamilyId'"
- [(ngModel)]="serviceInstance.productFamilyId"
- name="product-family-select" required>
- <option [value]="undefined" disabled>Select Product Family</option>
- <option *ngFor="let productFamily of productFamilies | async" [value]="productFamily.id"
- [disabled]="!productFamily.isPermitted">{{productFamily.name}}</option>
- </select>
- <form-control-error *ngIf="serviceInstanceDetailsService.hasApiError('productFamilyId',productFamilies, serviceInstanceDetailsFormGroup)" [message]="'No results for this request. Please change criteria.'"></form-control-error>
- </div>
-
- <div class="details-item">
- <label class="required">LCP region:</label>
- <select
- class="form-control input-text"
- [formControlName]="'lcpCloudRegionId'"
- [(ngModel)]="serviceInstance.lcpCloudRegionId"
- [ngClass]="{'error-style ' : serviceInstanceDetailsService.hasApiError('lcpCloudRegionId', servicePopupDataModel?.lcpRegions, serviceInstanceDetailsFormGroup)}"
- name="lcpRegion"
- id="lcpRegion-select"
- data-tests-id="lcpRegion"
- required>
- <option [value]="undefined" disabled>Select LCP Region</option>
- <option *ngFor="let lcpRegion of servicePopupDataModel.lcpRegions" [value]="lcpRegion.id" [disabled]="!lcpRegion.isPermitted" class="lcpRegionOption">{{lcpRegion.id}}</option>
- </select>
- <form-control-error *ngIf="serviceInstanceDetailsService.hasApiError('lcpCloudRegionId', servicePopupDataModel?.lcpRegions, serviceInstanceDetailsFormGroup)" [message]="'No results for this request. Please change criteria.'"></form-control-error>
- </div>
-
- <div class="details-item">
- <label class="required">Tenant:</label>
- <select class="form-control input-text"
- [formControlName]="'tenantId'"
- [(ngModel)]="serviceInstance.tenantId"
- name="tenant" id="tenant-select"
- [ngClass]="{'error-style ' : serviceInstanceDetailsService.hasApiError('tenantId',servicePopupDataModel?.tenants ,serviceInstanceDetailsFormGroup)}"
- data-tests-id="tenant" required>
- <option [value]="undefined" disabled>Select Tenant</option>
- <option *ngFor="let tenant of servicePopupDataModel.tenants" [value]="tenant.id" [disabled]="!tenant.isPermitted">{{tenant.name}}</option>
- </select>
- <form-control-error *ngIf="serviceInstanceDetailsService.hasApiError('tenantId',servicePopupDataModel?.tenants ,serviceInstanceDetailsFormGroup)" [message]="'No results for this request. Please change criteria.'"></form-control-error>
- </div>
-
- <div class="details-item">
- <label>AIC Zone:</label>
- <select
- class="form-control input-text"
- name="aicZone" id="aicZone-select"
- data-tests-id="aic_zone"
- [formControlName]="'aicZoneId'"
- [ngClass]="{'error-style ' : servicePopupDataModel?.aicZones?.length == 0 && serviceInstanceDetailsFormGroup.controls['aicZoneId'].disabled == false}"
- [(ngModel)]="serviceInstance.aicZoneId" >
- <option [value]="undefined" disabled>Select AIC Zone</option>
- <option class="aicZoneOption" *ngFor="let aicZone of servicePopupDataModel.aicZones" [value]="aicZone.id">{{aicZone.name}}</option>
- </select>
- <form-control-error *ngIf="serviceInstanceDetailsService.hasApiError('aicZoneId',servicePopupDataModel?.aicZones ,serviceInstanceDetailsFormGroup)" [message]="'No results for this request. Please change criteria.'"></form-control-error>
-
- </div>
-
- <div class="details-item">
- <label>Project:</label>
- <select
- [attr.data-tests-id]="'project'"
- class="form-control input-text"
- [ngClass]="{'error-style ' : servicePopupDataModel?.projects?.length == 0 && serviceInstanceDetailsFormGroup.controls['projectName'].disabled == false}"
- name="project" id="project"
- [formControlName]="'projectName'"
- [(ngModel)]="serviceInstance.projectName" >
- <option [value]="undefined" disabled>Select Project</option>
- <option *ngFor="let project of servicePopupDataModel.projects" [value]="project.id">{{project.name}}</option>
- </select>
- <form-control-error *ngIf="serviceInstanceDetailsService.hasApiError('projectName',servicePopupDataModel?.projects ,serviceInstanceDetailsFormGroup)" [message]="'No results for this request. Please change criteria.'"></form-control-error>
-
- </div>
-
- <div class="details-item">
- <label class="required">Owning entity:</label>
- <select [attr.data-tests-id]="'owningEntity'"
- class="form-control input-text"
- [formControlName]="'owningEntityId'"
- [(ngModel)]="serviceInstance.owningEntityId"
- name="owningEntity" id="owningEntity"
- [ngClass]="{'error-style ' : servicePopupDataModel?.owningEntities?.length == 0 && serviceInstanceDetailsFormGroup.controls['owningEntityId'].disabled == false}"
- required>
- <option [value]="undefined" disabled>Select Owning Entity</option>
- <option *ngFor="let owningEntity of servicePopupDataModel.owningEntities" [value]="owningEntity.id">{{owningEntity.name}}</option>
- </select>
- <form-control-error *ngIf="serviceInstanceDetailsService.hasApiError('owningEntityId',servicePopupDataModel?.owningEntities ,serviceInstanceDetailsFormGroup)" [message]="'No results for this request. Please change criteria.'"></form-control-error>
- </div>
- <div class="details-item">
- <label class="required">Rollback On Failure:</label>
- <select [attr.data-tests-id]="'rollback'"
- [ngClass]="{'error-style' :serviceInstanceDetailsService.hasApiError('rollbackOnFailure',servicePopupDataModel?.rollbackOnFailure, serviceInstanceDetailsFormGroup)}"
- class="form-control input-text"
- [(ngModel)]="serviceInstance.rollbackOnFailure"
- [formControlName]="'rollbackOnFailure'" name="rollbackOnFailure" id="rollbackOnFailure">
- <option *ngFor="let option of servicePopupDataModel.rollbackOnFailure" [value]="option.id">{{option.name}}</option>
- </select>
- <form-control-error *ngIf="serviceInstanceDetailsService.hasApiError('rollbackOnFailure',servicePopupDataModel?.rollbackOnFailure, serviceInstanceDetailsFormGroup)" [message]="'No results for this request. Please change criteria.'"></form-control-error>
- </div>
- <div class="details-item" *ngIf="serviceInstanceDetailsFormGroup.get('pause')">
- <input #pause id="pause" [formControlName]="'pause'" [(ngModel)]="serviceInstance.pause" type="checkbox" name="pause" data-toggle="toggle">
- <label class="checkbox-label" for="pause">Pause on pause points:</label>
- </div>
-
-
- <dynamic-inputs *ngIf="dynamicInputs != undefined && dynamicInputs.length>0" [group]="serviceInstanceDetailsFormGroup" [list]="dynamicInputs"></dynamic-inputs>
- </form>
-</div>
diff --git a/vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.service.spec.ts b/vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.service.spec.ts
deleted file mode 100644
index 605653bd0..000000000
--- a/vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.service.spec.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-import { getTestBed, TestBed } from '@angular/core/testing';
-import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
-import { ServiceInstanceDetailsService } from './service-instance-details.service';
-import { NgRedux } from '@angular-redux/store';
-
-export class MockAppStore<T> {}
-
-describe('Service instance details service', () => {
- let injector;
- let service: ServiceInstanceDetailsService;
- let httpMock: HttpTestingController;
-
- beforeEach(() => {
- TestBed.configureTestingModule({
- imports: [HttpClientTestingModule],
- providers: [ServiceInstanceDetailsService,
- {provide: NgRedux, useClass: MockAppStore}]
- });
-
- injector = getTestBed();
- service = injector.get(ServiceInstanceDetailsService);
- httpMock = injector.get(HttpTestingController);
- });
-});
-
-
diff --git a/vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.service.ts b/vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.service.ts
deleted file mode 100644
index 99b390d2f..000000000
--- a/vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.service.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Injectable } from '@angular/core';
-import { isNullOrUndefined } from 'util';
-import { FormGroup } from '@angular/forms';
-import * as _ from 'lodash';
-import { createVFModuleInstance, updateVFModuleInstance, updateVNFInstance } from '../../../service.actions';
-import { NgRedux } from '@angular-redux/store';
-import { AppState } from '../../../store/reducers';
-
-@Injectable()
-export class ServiceInstanceDetailsService {
- static controlsFieldsStatus = {};
-
- constructor(private store: NgRedux<AppState>) { }
- hasApiError(controlName: string, data: Array<any>, serviceInstanceDetailsFormGroup: FormGroup) {
- if (!isNullOrUndefined(data)) {
- if (!serviceInstanceDetailsFormGroup.controls[controlName].disabled && data.length === 0) {
- return true;
- }
- }
- return false;
- }
-}
diff --git a/vid-webpack-master/src/app/components/service-popup/service-instance-details/servicePopupDataModel.ts b/vid-webpack-master/src/app/components/service-popup/service-instance-details/servicePopupDataModel.ts
deleted file mode 100644
index c7894e2cd..000000000
--- a/vid-webpack-master/src/app/components/service-popup/service-instance-details/servicePopupDataModel.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-import {SelectOption, SelectOptionInterface} from "../../../shared/models/selectOption";
-
-export class ServicePopupDataModel {
- subscribers: SelectOptionInterface[];
- serviceTypes: SelectOptionInterface[];
- aicZones: SelectOptionInterface[];
- lcpRegions: SelectOptionInterface[];
- productFamilies: SelectOptionInterface[];
- lcpRegionsTenantsMap: object;
- tenants: SelectOptionInterface[];
- projects: SelectOptionInterface[];
- owningEntities: SelectOptionInterface[];
- globalCustomerId: string;
- rollbackOnFailure: SelectOptionInterface[];
-
-
- constructor(){
- this.subscribers = null;
- this.serviceTypes = null;
- this.aicZones = null;
- this.lcpRegions = null;
- this.lcpRegionsTenantsMap = {};
- this.tenants = null;
- this.productFamilies = null;
- this.projects = null;
- this.owningEntities = null;
- this.rollbackOnFailure = [
- new SelectOption({id: 'true', name: 'Rollback'}),
- new SelectOption({id: 'false', name: 'Don\'t Rollback'})
- ];
- }
-}
diff --git a/vid-webpack-master/src/app/components/service-popup/service-popup.component.ts b/vid-webpack-master/src/app/components/service-popup/service-popup.component.ts
deleted file mode 100644
index 908ae4adf..000000000
--- a/vid-webpack-master/src/app/components/service-popup/service-popup.component.ts
+++ /dev/null
@@ -1,144 +0,0 @@
-import {Component, ViewChild} from '@angular/core';
-import {DialogComponent, DialogService} from 'ng2-bootstrap-modal';
-import {ServiceModel} from '../../shared/models/serviceModel';
-import {Constants} from '../../shared/utils/constants';
-import {ServiceInstanceDetailsComponent} from './service-instance-details/service-instance-details.component';
-import {ActivatedRoute} from "@angular/router";
-import {AaiService} from "../../services/aaiService/aai.service";
-import {Utils} from "../../utils/utils";
-import {ServicePlanningService} from "../../services/service-planning.service";
-import * as _ from 'lodash';
-import {ModelInformationItem} from '../../shared/components/model-information/model-information.component';
-import {deleteServiceInstance} from '../../service.actions';
-
-import {InstancePopup} from "../instance-popup/instance-popup.components";
-import {NgRedux} from "@angular-redux/store";
-import {AppState} from "../../store/reducers";
-import {ServicePopupService} from './service-popup.service';
-import {IframeService} from "../../shared/utils/iframe.service";
-
-export interface ServicePopupModel {
- serviceModel: ServiceModel
-}
-
-@Component({
- selector: 'service-popup',
- templateUrl: 'service-popup.html',
- styleUrls: ['service-popup.scss'],
- providers: [AaiService, ServicePopupService]
-})
-
-export class ServicePopupComponent extends DialogComponent<ServicePopupModel, boolean>
- implements ServicePopupModel, InstancePopup{
- @ViewChild(ServiceInstanceDetailsComponent) serviceInstanceDetails: ServiceInstanceDetailsComponent;
-
- serviceModel: ServiceModel;
- serviceModelId: string;
- serviceInstance: any = {
- 'rollbackOnFailure' : 'false'
- };
- title: string = Constants.ServicePopup.TITLE;
- dynamicInputs: any[] = null;
-
- maxServiceQty:number = 50;
- minServiceQty:number = 1;
- servicesQty = 1; //default
- quantityOptions = this.getQuantityOptions();
-
- modelInformationItems: Array<ModelInformationItem> = [];
- hasGeneralApiError : boolean = false;
- parentElementClassName = 'content';
-
- constructor(dialogService: DialogService, private route: ActivatedRoute, private _aaiService: AaiService,
- private _iframeService : IframeService,
- private _servicePlanningService: ServicePlanningService, private store: NgRedux<AppState>, private _servicePopupService : ServicePopupService) {
- super(dialogService);
- this.title = Constants.ServicePopup.TITLE;
- }
-
- updateGeneralErrorSection() : void {
- this.hasGeneralApiError = this._servicePopupService.onControlError(this.serviceInstanceDetails, this.serviceInstanceDetails.serviceInstanceDetailsFormGroup);
- }
-
-
- ngOnInit() {
- this.route
- .queryParams
- .subscribe(params => {
- this.serviceModelId = params['serviceModelId'];
- if(params['isCreate']=="true") {
- this.store.dispatch(deleteServiceInstance(this.serviceModelId));
- }
- this.updateServiceModelById(this.serviceModelId);
- this.updateInstanceFromStore();
- });
- }
-
- updateInstanceFromStore() {
- let serviceInstance;
- if (_.has(this.store.getState().service.serviceInstance, this.serviceModelId)) {
- serviceInstance = Object.assign({}, this.store.getState().service.serviceInstance[this.serviceModelId]);
- }
-
- this.serviceInstance = serviceInstance ? serviceInstance : this.serviceInstance;
- this.servicesQty = serviceInstance ? serviceInstance.bulkSize : 1;
- if (serviceInstance && serviceInstance.instanceParams && serviceInstance.instanceParams[0]) {
- this.dynamicInputs = this.dynamicInputs.map(function (x) {
- x.value = (serviceInstance.instanceParams[0][x.id]) ? serviceInstance.instanceParams[0][x.id] : x.value;
- return x;
- });
- }
- }
-
- updateServiceModelById(serviceModelId) {
- this._aaiService.getServiceModelById(serviceModelId).subscribe(
- value => {
- const convertedModel = Utils.convertModel(value);
- this.serviceModel = new ServiceModel(convertedModel);
- let displayInputs = Object.assign({},convertedModel.service.inputs);
- this.dynamicInputs = _.isEmpty(displayInputs)? [] : this._servicePlanningService.getArbitraryInputs(displayInputs);
- this.modelInformationItems = this.createModelInformationItems();
- },
- error => {console.log('error is ', error)},
- () => {console.log('completed')}
- );
- }
-
- createModelInformationItems() : Array<ModelInformationItem> {
- return [
- new ModelInformationItem("Model version", "modelVersion", [this.serviceModel.version], "", true),
- new ModelInformationItem("Description", "description", [this.serviceModel.description]),
- new ModelInformationItem("Category", "category", [this.serviceModel.category]),
- new ModelInformationItem("UUID", "uuid", [this.serviceModel.uuid], Constants.ServicePopup.TOOLTIP_UUID, true),
- new ModelInformationItem("Invariant UUID", "invariantUuid", [this.serviceModel.invariantUuid], Constants.ServicePopup.TOOLTIP_INVARIANT_UUID, true),
- new ModelInformationItem("Service type", "serviceType", [this.serviceModel.serviceType]),
- new ModelInformationItem("Service role", "serviceRole", [this.serviceModel.serviceRole])
- ];
- }
-
- onCancelClick() {
- this._iframeService.removeClassCloseModal(this.parentElementClassName);
- this.dialogService.removeDialog(this);
- this.serviceInstance = this.serviceInstanceDetails.oldServiceInstance;
-
- this._servicePopupService.resetDynamicInputs(this.serviceInstanceDetails, this.dynamicInputs);
- // Delaying the iframe close in few milliseconds.
- // This should workaround a problem in Selenium tests' that
- // blocks after click because the iframe goes out before
- // the driver understands it was clicked. Similar bug is
- // described here:
- // - https://github.com/mozilla/geckodriver/issues/611
- // - https://bugzilla.mozilla.org/show_bug.cgi?id=1223277
- setTimeout(() => {
- window.parent.postMessage("closeIframe", "*");
- }, 15);
- }
-
- getModelName(): string {
- return (this.serviceModel && this.serviceModel.name) || "";
- }
-
- getQuantityOptions(){
- return _.range(this.minServiceQty, this.maxServiceQty + 1);
- }
-}
diff --git a/vid-webpack-master/src/app/components/service-popup/service-popup.html b/vid-webpack-master/src/app/components/service-popup/service-popup.html
deleted file mode 100644
index e967daa3b..000000000
--- a/vid-webpack-master/src/app/components/service-popup/service-popup.html
+++ /dev/null
@@ -1,52 +0,0 @@
-<div id="service-popup" class="modal-dialog">
- <div class="modal-content">
- <div class="modal-header">
- <button type="button" class="close" (click)="onCancelClick()" >&times;</button>
- <span [attr.data-tests-id]="'create-modal-title'" class="modal-title">{{title}}</span>
- </div>
- <div class="modal-body popup-content">
-
- <div class="header-left">
- <div>SERVICE MODEL: <span>"{{getModelName()}}"</span></div>
- </div>
-
- <div class="header-right">
- Service Instance Details
- </div>
-
- <label class="quantity-label">Qty:</label>
- <div class="quantity">
- <select class="quantity-select" [(ngModel)]="servicesQty" name="quantity" id="quantity-select" required>
- <option *ngFor="let qty of quantityOptions" [value]="qty">{{qty}}</option>
- </select>
- </div>
-
- <div class="service-model">
-
- <model-information [modelInformationItems]="modelInformationItems"></model-information>
- </div>
-
- <div class="service-instance">
- <service-instance-details [dynamicInputs]="dynamicInputs"
- [serviceInstance]="serviceInstance"
- [serviceModel]="serviceModel"
- [servicesQty]="servicesQty"
- (onDataChanged)="updateGeneralErrorSection()"
- (closePopup)="onCancelClick($event)"></service-instance-details>
- </div>
-
- </div>
- <div class="modal-footer row" style="padding: 0">
- <div class="col-md-6">
- <div *ngIf="hasGeneralApiError == true">
- <form-general-error [message]="'Page contains errors. Please see details next to the relevant fields.'"></form-general-error>
- </div>
- </div>
- <div class="col-md-6" style="padding: 15px;padding-right: 35px;">
- <button [attr.data-tests-id]="'cancelButton'" type="button" class="btn btn-default cancel" (click)="onCancelClick()"><span>Cancel</span></button>
- <input type="submit" value="Set" form="serviceForm" data-tests-id="service-form-set"
- class="btn btn-success submit" [disabled]="!serviceInstanceDetails?.serviceForm?.valid">
- </div>
- </div>
- </div>
-</div>
diff --git a/vid-webpack-master/src/app/components/service-popup/service-popup.scss b/vid-webpack-master/src/app/components/service-popup/service-popup.scss
deleted file mode 100644
index aa4552d2f..000000000
--- a/vid-webpack-master/src/app/components/service-popup/service-popup.scss
+++ /dev/null
@@ -1,185 +0,0 @@
-$grid-border: 1px #d2d2d2 solid;
-
-#service-popup {
- color: #191919;
-
- .left-panel {
- background: #f2f2f2;
- border-right: $grid-border;
- }
-
- .header-common {
- height: 100%;
- align-items: center;
- display: flex;
- font-family: OpenSans-Semibold;
- font-size: 12px;
- }
-
- .header-text {
- padding-left: 30px;
- @extend .header-common;
- }
-
- .header-left {
- grid-area: header-left;
- @extend .header-text;
- @extend .left-panel;
- border-bottom: $grid-border;
-
- span {
- font-family: OpenSans-Regular;
- font-size: 14px;
- };
- }
-
- .header-right {
- grid-area: header-right;
-
- @extend .header-text;
- border-bottom: $grid-border;
- }
-
- .quantity-label {
- grid-area: quantity-label;
- @extend .header-common;
- border-bottom: $grid-border;
- height: 100%;
- font-family: OpenSans-Regular;
- }
-
- .quantity {
- grid-area: quantity;
- border-left: $grid-border;
- border-bottom: $grid-border;
- border-top-style: none;
- font-family: OpenSans-Semibold;
- text-align: start;
- text-indent: 10px;
- }
-
- .quantity-select {
- width: 78px;
- height: 100%;
- border: 0;
- background: white;
- outline: none;
- -webkit-appearance: none;
- -moz-appearance: none;
- appearance: none;
- background: url('../../../assets/img/chevron.svg') 0 0 no-repeat;
- background-size: 24px;
- background-position-x: right;
- background-position-y: center;
- }
- input[type="number"]:hover::-webkit-inner-spin-button {
- height: 20px;
- }
-
- .service-model {
- grid-area: service-model;
-
- padding: 30px;
- overflow: auto;
- @extend .left-panel;
- }
-
- .service-instance {
- grid-area: service-instance;
- }
-
- .popup-content {
- display: grid;
- grid-template-columns: 400px auto 30px 93px;
- grid-template-rows: 50px calc(100vh - 180px);
- grid-template-areas:
- "header-left header-right quantity-label quantity"
- "service-model service-instance service-instance service-instance";
- padding: 0;
- }
-}
-
-.modal {
- background-color: #191919;
- opacity: 0.8;
-}
-
-.modal-dialog {
- position: relative;
- width: auto;
- margin: 0;
-}
-@media (min-width: 1150px) {
- .popup-content {
- grid-template-rows: 30px 680px;
- }
-}
-
-.modal-content {
- border-radius: 0;
- box-shadow: none;
- border: none;
-}
-
-.modal-footer {
- .cancel {
- width: 120px;
- height: 36px;
- background: #ffffff;
- border: 1px solid #009fdb;
- border-radius: 2px;
- span {
- font-family: OpenSans-Regular;
- font-size: 14px;
- color: #009fdb;
- line-height: 16px;
- }
- }
-
- .submit {
- width: 120px;
- height: 36px;
- background: #009fdb;
- border-radius: 2px;
- border-color: #009fdb;
- span {
- font-family: OpenSans-Regular;
- font-size: 14px;
- color: #FFFFFF;
- line-height: 16px;
- }
- }
-}
-
-.modal-header {
- background-color: #009fdb;
-
- padding-bottom: 13px;
- padding-top: 13px;
- padding-left: 29px;
- padding-right: 21px;
-
- .close {
- font-size: 32px;
- font-weight: 200;
- color: #d8d8d8;
- text-shadow: none;
- filter: none;
- opacity: 1;
- }
-
- .modal-title {
- font-family: OpenSans-Regular;
- font-size: 24px;
- color: #fff;
- line-height: 34px;
- }
-}
-//
-//@media (min-width: 1200px) {
-// .service-model,
-// .service-instance {
-// width: 1050px;
-// margin: 30px auto;
-// }
-//}
diff --git a/vid-webpack-master/src/app/components/service-popup/service-popup.service.spec.ts b/vid-webpack-master/src/app/components/service-popup/service-popup.service.spec.ts
deleted file mode 100644
index cddc6400a..000000000
--- a/vid-webpack-master/src/app/components/service-popup/service-popup.service.spec.ts
+++ /dev/null
@@ -1,138 +0,0 @@
-
-import { TestBed, getTestBed} from '@angular/core/testing';
-import {
- HttpClientTestingModule,
- HttpTestingController
-} from '@angular/common/http/testing';
-import { ServicePopupService } from './service-popup.service';
-import { FormControl, FormGroup, Validators } from '@angular/forms';
-import { NumbersLettersUnderscoreValidator } from '../../shared/components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator';
-
-describe('Service Popup Service', () => {
- let injector;
- let service: ServicePopupService;
- let httpMock: HttpTestingController;
- let form : FormGroup;
- let servicePopupDataModel;
-
- beforeEach(() => {
- TestBed.configureTestingModule({
- imports: [HttpClientTestingModule],
- providers: [ServicePopupService]
- });
-
- injector = getTestBed();
- service = injector.get(ServicePopupService);
- httpMock = injector.get(HttpTestingController);
-
- form = generateFormGroup();
- servicePopupDataModel = generateServicePopupDataModel();
- });
-
- describe('#resetDynamicInputs', () => {
- it('resetDynamicInputs should reset dymanic fields',(done: DoneFn) => {
- const dynamicInputs = generateDynamicInputs();
- let serviceForm = generateFormGroup();
- serviceForm.addControl(dynamicInputs[0].name, new FormControl({value: dynamicInputs[0].value, disabled: false}));
-
- serviceForm.controls[dynamicInputs[0].name].setValue("diffValue");
- service.resetDynamicInputs({
- serviceInstanceDetailsFormGroup : serviceForm,
- dynamicInputs : dynamicInputs
- }, dynamicInputs);
-
- expect(serviceForm.controls[dynamicInputs[0].name].value).toEqual(dynamicInputs[0].value);
- done();
- })
- });
-
- describe('#onControlError', () => {
-
- it('should return true if instanceName is illegal', (done: DoneFn) => {
- form.controls['instanceName'].setValue("illegal - illegal");
-
- let result : boolean = service.onControlError(<any>servicePopupDataModel, form);
- expect(result).toBeTruthy();
- done();
- });
-
- it('should return false if instanceName is legal', (done: DoneFn) => {
-
- form.controls['instanceName'].setValue("legal");
- let result = service.onControlError(<any>servicePopupDataModel, form);
- expect(result).toBeFalsy();
- done();
- });
-
- it('should return false if lcpRegions is empty and is disabled', (done: DoneFn) => {
- servicePopupDataModel.servicePopupDataModel['lcpRegions'] = [];
- let result = service.onControlError(<any>servicePopupDataModel, form);
- expect(result).toBeFalsy();
- done();
- });
-
- it('should return true if lcpRegions is empty', (done: DoneFn) => {
- servicePopupDataModel.servicePopupDataModel['lcpRegions'] = [];
- form.controls['lcpCloudRegionId'].enable();
- let result = service.onControlError(<any>servicePopupDataModel, form);
- expect(result).toBeTruthy();
- done()
- });
- });
-
-
- function generateDynamicInputs(){
- return JSON.parse('[{"id":"2017488_adiodvpe0_ASN","type":"string","name":"2017488_adiodvpe0_ASN","value":"AV_vPE","isRequired":true,"description":"AV/PE"}]');
- }
-
-
- function generateServicePopupDataModel() {
- return {
- "servicePopupDataModel" : JSON.parse('{"subscribers":[{"id":"a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb","name":"Mobility","isPermitted":false},{"id":"a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fc","name":"PACKET CORE","isPermitted":false},{"id":"e433710f-9217-458d-a79d-1c7aff376d89","name":"USP VOICE","isPermitted":true}],"serviceTypes":[{"id":"0","name":"vFlowLogic","isPermitted":false},{"id":"1","name":"VIRTUAL USP","isPermitted":true},{"id":"2","name":"Mobility","isPermitted":false},{"id":"3","name":"vBNG","isPermitted":false},{"id":"4","name":"vVoiceMail","isPermitted":false},{"id":"5","name":"Nimbus","isPermitted":false},{"id":"6","name":"vSEGW","isPermitted":false},{"id":"7","name":"vVM","isPermitted":false},{"id":"8","name":"vOTA","isPermitted":false},{"id":"9","name":"vMME","isPermitted":false},{"id":"10","name":"vMNS","isPermitted":false},{"id":"11","name":"vSCP","isPermitted":false},{"id":"12","name":"VPMS","isPermitted":false},{"id":"13","name":"vMMSC","isPermitted":false},{"id":"14","name":"SSD","isPermitted":false},{"id":"15","name":"vMOG","isPermitted":false},{"id":"16","name":"FIRSTNET","isPermitted":false},{"id":"17","name":"ACTIVE_CHARGE","isPermitted":false},{"id":"18","name":"vHSS","isPermitted":false}],"aicZones":[{"id":"NFT1","name":"NFTJSSSS-NFT1"},{"id":"JAG1","name":"YUDFJULP-JAG1"},{"id":"YYY1","name":"UUUAIAAI-YYY1"},{"id":"BAN1","name":"VSDKYUTP-BAN1"},{"id":"DKJ1","name":"DKJSJDKA-DKJ1"},{"id":"MCS1","name":"ASACMAMS-MCS1"},{"id":"UIO1","name":"uioclli1-UIO1"},{"id":"RAJ1","name":"YGBIJNLQ-RAJ1"},{"id":"OPA1","name":"opaclli1-OPA1"},{"id":"SDE1","name":"ZXCVBNMA-SDE1"},{"id":"VEN2","name":"FGHJUHIL-VEN2"},{"id":"ORL1","name":"ORLDFLMA-ORL1"},{"id":"JAD1","name":"JADECLLI-JAD1"},{"id":"ZXL1","name":"LWLWCANN-ZXL1"},{"id":"CKL1","name":"CLKSKCKK-CKL1"},{"id":"SDF1","name":"sdfclli1-SDF1"},{"id":"RAD1","name":"RADICAL1-RAD1"},{"id":"KIT1","name":"BHYJFGLN-KIT1"},{"id":"REL1","name":"INGERFGT-REL1"},{"id":"JNL1","name":"CJALSDAC-JNL1"},{"id":"OLK1","name":"OLKOLKLS-OLK1"},{"id":"CHI1","name":"CHILLIWE-CHI1"},{"id":"UUU4","name":"UUUAAAUU-UUU4"},{"id":"TUF1","name":"TUFCLLI1-TUF1"},{"id":"KJN1","name":"CKALDKSA-KJN1"},{"id":"SAM1","name":"SNDGCA64-SAN1"},{"id":"SCK1","name":"SCKSCKSK-SCK1"},{"id":"HJH1","name":"AOEEQQQD-HJH1"},{"id":"HGD1","name":"SDFQWHGD-HGD1"},{"id":"KOR1","name":"HYFLNBVT-KOR1"},{"id":"ATL43","name":"AICLOCID-ATL43"},{"id":"ATL54","name":"AICFTAAI-ATL54"},{"id":"ATL66","name":"CLLIAAII-ATL66"},{"id":"VEL1","name":"BNMLKUIK-VEL1"},{"id":"ICC1","name":"SANJITAT-ICC1"},{"id":"MNT11","name":"WSXEFBTH-MNT11"},{"id":"DEF2","name":"WSBHGTYL-DEF2"},{"id":"MAD11","name":"SDFQWGKL-MAD11"},{"id":"OLG1","name":"OLHOLHOL-OLG1"},{"id":"GAR1","name":"NGFVSJKO-GAR1"},{"id":"SAN22","name":"GNVLSCTL-SAN22"},{"id":"HRG1","name":"HRGHRGGS-HRG1"},{"id":"JCS1","name":"JCSJSCJS-JCS1"},{"id":"DHA12","name":"WSXEDECF-DHA12"},{"id":"HJE1","name":"AOEEWWWD-HJE1"},{"id":"NCA1","name":"NCANCANN-NCA1"},{"id":"IOP1","name":"iopclli1-IOP1"},{"id":"RTY1","name":"rtyclli1-RTY1"},{"id":"KAP1","name":"HIOUYTRQ-KAP1"},{"id":"ZEN1","name":"ZENCLLI1-ZEN1"},{"id":"HKA1","name":"JAKHLASS-HKA1"},{"id":"CQK1","name":"CQKSCAKK-CQK1"},{"id":"SAI1","name":"UBEKQLPD-SAI1"},{"id":"ERT1","name":"ertclli1-ERT1"},{"id":"IBB1","name":"PLMKOIJU-IBB1"},{"id":"TIR2","name":"PLKINHYI-TIR2"},{"id":"HSD1","name":"CHASKCDS-HSD1"},{"id":"SLF78","name":"SDCTLFN1-SLF78"},{"id":"SEE78","name":"SDCTEEE4-SEE78"},{"id":"SAN13","name":"TOKYJPFA-SAN13"},{"id":"SAA78","name":"SDCTAAA1-SAA78"},{"id":"LUC1","name":"ATLDFGYC-LUC1"},{"id":"AMD13","name":"MEMATLAN-AMD13"},{"id":"TOR1","name":"TOROONXN-TOR1"},{"id":"QWE1","name":"QWECLLI1-QWE1"},{"id":"ZOG1","name":"ZOGASTRO-ZOG1"},{"id":"CAL33","name":"CALIFORN-CAL33"},{"id":"SHH78","name":"SDIT1HHH-SHH78"},{"id":"DSA1","name":"LKJHGFDS-DSA1"},{"id":"CLG1","name":"CLGRABAD-CLG1"},{"id":"BNA1","name":"BNARAGBK-BNA1"},{"id":"ATL84","name":"CANTTCOC-ATL84"},{"id":"APP1","name":"WBHGTYUI-APP1"},{"id":"RJN1","name":"RJNRBZAW-RJN1"},{"id":"EHH78","name":"SDCSHHH5-EHH78"},{"id":"mac10","name":"PKGTESTF-mac10"},{"id":"SXB78","name":"SDCTGXB1-SXB78"},{"id":"SAX78","name":"SDCTAXG1-SAX78"},{"id":"SYD1","name":"SYDNAUBV-SYD1"},{"id":"TOK1","name":"TOKYJPFA-TOK1"},{"id":"KGM2","name":"KGMTNC20-KGM2"},{"id":"DCC1b","name":"POIUYTGH-DCC1b"},{"id":"SKK78","name":"SDCTKKK1-SKK78"},{"id":"SGG78","name":"SDCTGGG1-SGG78"},{"id":"SJJ78","name":"SDCTJJJ1-SJJ78"},{"id":"SBX78","name":"SDCTBXG1-SBX78"},{"id":"LAG1","name":"LARGIZON-LAG1"},{"id":"IAA1","name":"QAZXSWED-IAA1"},{"id":"POI1","name":"PLMNJKIU-POI1"},{"id":"LAG1a","name":"LARGIZON-LAG1a"},{"id":"PBL1","name":"PBLAPBAI-PBL1"},{"id":"LAG45","name":"LARGIZON-LAG1a"},{"id":"MAR1","name":"MNBVCXZM-MAR1"},{"id":"HST70","name":"HSTNTX70-HST70"},{"id":"DCC1a","name":"POIUYTGH-DCC1a"},{"id":"TOL1","name":"TOLDOH21-TOL1"},{"id":"LON1","name":"LONEENCO-LON1"},{"id":"SJU78","name":"SDIT1JUB-SJU78"},{"id":"STN27","name":"HSTNTX01-STN27"},{"id":"SSW56","name":"ss8126GT-SSW56"},{"id":"SBB78","name":"SDIT1BBB-SBB78"},{"id":"DCC3","name":"POIUYTGH-DCC3"},{"id":"GNV1","name":"GNVLSCTL-GNV1"},{"id":"WAS1","name":"WASHDCSW-WAS1"},{"id":"TOY1","name":"TORYONNZ-TOY1"},{"id":"STT1","name":"STTLWA02-STT1"},{"id":"STG1","name":"STTGGE62-STG1"},{"id":"SLL78","name":"SDCTLLL1-SLL78"},{"id":"SBU78","name":"SDIT1BUB-SBU78"},{"id":"ATL2","name":"ATLNGANW-ATL2"},{"id":"BOT1","name":"BOTHWAKY-BOT1"},{"id":"SNG1","name":"SNGPSIAU-SNG1"},{"id":"NYC1","name":"NYCMNY54-NYC1"},{"id":"LAG1b","name":"LARGIZON-LAG1b"},{"id":"AMD15","name":"AMDFAA01-AMD15"},{"id":"SNA1","name":"SNANTXCA-SNA1"},{"id":"PLT1","name":"PLTNCA60-PLT1"},{"id":"TLP1","name":"TLPNXM18-TLP1"},{"id":"SDD81","name":"SAIT1DD6-SDD81"},{"id":"DCC1","name":"POIUYTGH-DCC1"},{"id":"DCC2","name":"POIUYTGH-DCC2"},{"id":"OKC1","name":"OKCBOK55-OKC1"},{"id":"PAR1","name":"PARSFRCG-PAR1"},{"id":"TES36","name":"ABCEETES-TES36"},{"id":"COM1","name":"PLMKOPIU-COM1"},{"id":"ANI1","name":"ATLNGTRE-ANI1"},{"id":"SDG78","name":"SDIT1BDG-SDG78"},{"id":"mac20","name":"PKGTESTF-mac20"},{"id":"DSF45","name":"DSFBG123-DSF45"},{"id":"HST25","name":"HSTNTX01-HST25"},{"id":"AMD18","name":"AUDIMA01-AMD18"},{"id":"SAA80","name":"SAIT9AA3-SAA80"},{"id":"SSA56","name":"SSIT2AA7-SSA56"},{"id":"SDD82","name":"SAIT1DD9-SDD82"},{"id":"JCV1","name":"JCVLFLBW-JCV1"},{"id":"SUL2","name":"WERTYUJK-SUL2"},{"id":"PUR1","name":"purelyde-PUR1"},{"id":"FDE55","name":"FDERT555-FDE55"},{"id":"SITE","name":"LONEENCO-SITE"},{"id":"ATL1","name":"ATLNGAMA-ATL1"},{"id":"JUL1","name":"ZXCVBNMM-JUL1"},{"id":"TAT34","name":"TESAAISB-TAT34"},{"id":"XCP12","name":"CHKGH123-XCP12"},{"id":"RAI1","name":"poiuytre-RAI1"},{"id":"HPO1","name":"ATLNGAUP-HPO1"},{"id":"KJF12","name":"KJFDH123-KJF12"},{"id":"SCC80","name":"SAIT9CC3-SCC80"},{"id":"SAA12","name":"SAIT9AF8-SAA12"},{"id":"SAA14","name":"SAIT1AA9-SAA14"},{"id":"ATL35","name":"TTESSAAI-ATL35"},{"id":"CWY1","name":"CWYMOWBS-CWY1"},{"id":"ATL76","name":"TELEPAAI-ATL76"},{"id":"DSL12","name":"DSLFK242-DSL12"},{"id":"ATL53","name":"AAIATLTE-ATL53"},{"id":"SAA11","name":"SAIT9AA2-SAA11"},{"id":"ATL62","name":"TESSASCH-ATL62"},{"id":"AUG1","name":"ASDFGHJK-AUG1"},{"id":"POI22","name":"POIUY123-POI22"},{"id":"SAA13","name":"SAIT1AA9-SAA13"},{"id":"BHY17","name":"BHYTFRF3-BHY17"},{"id":"LIS1","name":"HOSTPROF-LIS1"},{"id":"SIP1","name":"ZXCVBNMK-SIP1"},{"id":"ATL99","name":"TEESTAAI-ATL43"},{"id":"ATL64","name":"FORLOAAJ-ATL64"},{"id":"TAT33","name":"TESAAISA-TAT33"},{"id":"RAD10","name":"INDIPUNE-RAD10"},{"id":"RTW5","name":"BHYTFRY4-RTW5"},{"id":"JGS1","name":"KSJKKKKK-JGS1"},{"id":"ATL98","name":"TEESTAAI-ATL43"},{"id":"WAN1","name":"LEIWANGW-WAN1"},{"id":"ATL44","name":"ATLSANAB-ATL44"},{"id":"RTD2","name":"BHYTFRk4-RTD2"},{"id":"NIR1","name":"ORFLMANA-NIR1"},{"id":"ATL75","name":"SANAAIRE-ATL75"},{"id":"NUM1","name":"QWERTYUI-NUM1"},{"id":"MTN32","name":"MDTWNJ21-MTN32"},{"id":"RTZ4","name":"BHYTFRZ6-RTZ4"},{"id":"ATL56","name":"ATLSANAC-ATL56"},{"id":"AMS1","name":"AMSTNLBW-AMS1"},{"id":"RCT1","name":"AMSTERNL-RCT1"},{"id":"JAN1","name":"ORFLMATT-JAN1"},{"id":"ABC14","name":"TESAAISA-ABC14"},{"id":"TAT37","name":"TESAAISD-TAT37"},{"id":"MIC54","name":"MICHIGAN-MIC54"},{"id":"ABC11","name":"ATLSANAI-ABC11"},{"id":"AMF11","name":"AMDOCS01-AMF11"},{"id":"ATL63","name":"ATLSANEW-ATL63"},{"id":"ABC12","name":"ATLSECIA-ABC12"},{"id":"MTN20","name":"MDTWNJ21-MTN20"},{"id":"ABC15","name":"AAITESAN-ABC15"},{"id":"AVT1","name":"AVTRFLHD-AVT1"},{"id":"ATL34","name":"ATLSANAI-ATL34"}],"lcpRegions":[{"id":"AAIAIC25","name":"AAIAIC25","isPermitted":true},{"id":"mtn6","name":"mtn6","isPermitted":true}],"lcpRegionsTenantsMap":{},"tenants":[{"id":"bae71557c5bb4d5aac6743a4e5f1d054","name":"AIN Web Tool-15-D-testgamma","isPermitted":true},{"id":"229bcdc6eaeb4ca59d55221141d01f8e","name":"AIN Web Tool-15-D-STTest2","isPermitted":true},{"id":"1178612d2b394be4834ad77f567c0af2","name":"AIN Web Tool-15-D-SSPtestcustome","isPermitted":true},{"id":"19c5ade915eb461e8af52fb2fd8cd1f2","name":"AIN Web Tool-15-D-UncheckedEcopm","isPermitted":true},{"id":"de007636e25249238447264a988a927b","name":"AIN Web Tool-15-D-dfsdf","isPermitted":true},{"id":"62f29b3613634ca6a3065cbe0e020c44","name":"AIN/SMS-16-D-Multiservices1","isPermitted":true},{"id":"649289e30d3244e0b48098114d63c2aa","name":"AIN Web Tool-15-D-SSPST66","isPermitted":true},{"id":"3f21eeea6c2c486bba31dab816c05a32","name":"AIN Web Tool-15-D-ASSPST47","isPermitted":true},{"id":"f60ce21d3ee6427586cff0d22b03b773","name":"CESAR-100-D-sspjg67246","isPermitted":true},{"id":"8774659e425f479895ae091bb5d46560","name":"CESAR-100-D-sspjg68359","isPermitted":true},{"id":"624eb554b0d147c19ff8885341760481","name":"AINWebTool-15-D-iftach","isPermitted":true},{"id":"214f55f5fc414c678059c383b03e4962","name":"CESAR-100-D-sspjg612401","isPermitted":true},{"id":"c90666c291664841bb98e4d981ff1db5","name":"CESAR-100-D-sspjg621340","isPermitted":true},{"id":"ce5b6bc5c7b348e1bf4b91ac9a174278","name":"sspjg621351cloned","isPermitted":true},{"id":"b386b768a3f24c8e953abbe0b3488c02","name":"AINWebTool-15-D-eteancomp","isPermitted":true},{"id":"dc6c4dbfd225474e9deaadd34968646c","name":"AINWebTool-15-T-SPFET","isPermitted":true},{"id":"02cb5030e9914aa4be120bd9ed1e19eb","name":"AINWebTool-15-X-eeweww","isPermitted":true},{"id":"f2f3830e4c984d45bcd00e1a04158a79","name":"CESAR-100-D-spjg61909","isPermitted":true},{"id":"05b91bd5137f4929878edd965755c06d","name":"CESAR-100-D-sspjg621512cloned","isPermitted":true},{"id":"7002fbe8482d4a989ddf445b1ce336e0","name":"AINWebTool-15-X-vdr","isPermitted":true},{"id":"4008522be43741dcb1f5422022a2aa0b","name":"AINWebTool-15-D-ssasa","isPermitted":true},{"id":"f44e2e96a1b6476abfda2fa407b00169","name":"AINWebTool-15-D-PFNPT","isPermitted":true},{"id":"b69a52bec8a84669a37a1e8b72708be7","name":"AINWebTool-15-X-vdre","isPermitted":true},{"id":"fac7d9fd56154caeb9332202dcf2969f","name":"AINWebTool-15-X-NONPODECOMP","isPermitted":true},{"id":"2d34d8396e194eb49969fd61ffbff961","name":"DN5242-Nov16-T5","isPermitted":true},{"id":"cb42a77ff45b48a8b8deb83bb64acc74","name":"ro-T11","isPermitted":true},{"id":"fa45ca53c80b492fa8be5477cd84fc2b","name":"ro-T112","isPermitted":true},{"id":"4914ab0ab3a743e58f0eefdacc1dde77","name":"DN5242-Nov21-T1","isPermitted":true},{"id":"d0a3e3f2964542259d155a81c41aadc3","name":"test-mtn6-09","isPermitted":true},{"id":"cbb99fe4ada84631b7baf046b6fd2044","name":"DN5242-Nov16-T3","isPermitted":true}],"productFamilies":null,"projects":[{"id":"DFW","name":"DFW"},{"id":"x1","name":"x1"},{"id":"yyy1","name":"yyy1"}],"owningEntities":[{"id":"aaa1","name":"aaa1"},{"id":"d61e6f2d-12fa-4cc2-91df-7c244011d6fc","name":"MetroPacketCore"},{"id":"Wireline","name":"Wireline"}],"globalCustomerId":"e433710f-9217-458d-a79d-1c7aff376d89"}')}
- }
-
- function generateFormGroup(){
- return new FormGroup({
- globalSubscriberId: new FormControl(
- Validators.compose([Validators.required])
- ),
- productFamilyId: new FormControl(),
- subscriptionServiceType: new FormControl({value: null, disabled: true}, Validators.compose([Validators.required])),
- lcpCloudRegionId: new FormControl({value: null, disabled: true}, Validators.compose([Validators.required])),
- tenantId: new FormControl({value: null, disabled: true}, Validators.compose([Validators.required])),
- aicZoneId: new FormControl(),
- projectName: new FormControl(),
- owningEntityId: new FormControl(Validators.compose([Validators.required])),
- instanceName : new FormControl({value: null}, Validators.compose([Validators.required, NumbersLettersUnderscoreValidator.valid]))
- });
- }
-
-
- function generateServiceInstanceDetails(){
- return {
- servicePopupDataModel : {
- "productFamilies" : []
- },
- serviceInstanceDetailsFormGroup : {
- controls : {
- productFamilyId : {
- disabled : false
- }
- }
- }
- }
- }
-
- function generateLegalServiceInstance(){
- return {
- instanceName : "legalInstanceName"
- }
- }
-
- function generateIllegalServiceInstance(){
- return {
- instanceName : "illegalInstanceName"
- }
- }
-
-});
diff --git a/vid-webpack-master/src/app/components/service-popup/service-popup.service.ts b/vid-webpack-master/src/app/components/service-popup/service-popup.service.ts
deleted file mode 100644
index f6efd353b..000000000
--- a/vid-webpack-master/src/app/components/service-popup/service-popup.service.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-import {Injectable} from '@angular/core';
-import {isNullOrUndefined} from "util";
-import {NumbersLettersUnderscoreValidator} from '../../shared/components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator';
-import {ServiceInstanceDetailsComponent} from './service-instance-details/service-instance-details.component';
-import {FormGroup} from '@angular/forms';
-import * as _ from "lodash";
-
-@Injectable()
-export class ServicePopupService {
- onControlError(serviceInstanceDetails : ServiceInstanceDetailsComponent, serviceInstanceDetailsFormGroup : FormGroup) : boolean{
- if(!isNullOrUndefined(serviceInstanceDetailsFormGroup) && !isNullOrUndefined(serviceInstanceDetailsFormGroup.controls['instanceName']) && NumbersLettersUnderscoreValidator.valid(serviceInstanceDetailsFormGroup.controls['instanceName'].value) && serviceInstanceDetailsFormGroup.controls['instanceName'].value != null && serviceInstanceDetailsFormGroup.controls['instanceName'].value.length > 0){
- return true;
- }
-
- const controlName : Array<string> = ['productFamilyId', 'lcpCloudRegionId', 'tenantId', 'owningEntityId', 'projectName', 'aicZoneId', 'subscriptionServiceType', 'globalSubscriberId', 'rollbackOnFailure'];
- const selectDataName : Array<string> = ['productFamilies', 'lcpRegions', 'tenants', 'owningEntities', 'projects', 'aicZones', 'serviceTypes', 'subscribers', 'rollbackOnFailure'];
- for(let i = 0 ; i < controlName.length ; i++){
- if (!isNullOrUndefined(serviceInstanceDetails.servicePopupDataModel) && !isNullOrUndefined(serviceInstanceDetails.servicePopupDataModel[selectDataName[i]])) {
- if (!serviceInstanceDetailsFormGroup.controls[controlName[i]].disabled && serviceInstanceDetails.servicePopupDataModel[selectDataName[i]].length === 0) {
- return true;
- }
- }
- }
- return false;
- }
-
- resetDynamicInputs(serviceInstance : any, defaultDynamicInputs : any) : void {
- for(let dynamicInput of serviceInstance.dynamicInputs){
- const defaultDymanicInput = _.find(defaultDynamicInputs, {name:dynamicInput.name});
- serviceInstance.serviceInstanceDetailsFormGroup.controls[dynamicInput.name].setValue(defaultDymanicInput.value);
- }
- }
-}
diff --git a/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.component.ts b/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.component.ts
deleted file mode 100644
index 725e44293..000000000
--- a/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.component.ts
+++ /dev/null
@@ -1,275 +0,0 @@
-import {Component, EventEmitter, Input, OnInit, Output, ViewChild} from '@angular/core';
-import {FormControl, FormGroup, Validators} from "@angular/forms";
-import {VNFPopupDataModel} from './vnfPopupDataModel';
-import {AaiService} from '../../../services/aaiService/aai.service';
-import { createVFModuleInstance, updateVFModuleInstance, updateVNFInstance } from '../../../service.actions';
-import {VnfInstance} from "../../../shared/models/vnfInstance";
-import {ServiceInstance} from "../../../shared/models/serviceInstance";
-import {VNFModel} from "../../../shared/models/vnfModel";
-import {InputType} from "../../../shared/models/inputTypes";
-import {ModelInfo} from "../../../shared/models/modelInfo";
-import {VfModuleInstance} from "../../../shared/models/vfModuleInstance";
-import {NgRedux, select} from "@angular-redux/store";
-import {AppState} from "../../../store/reducers";
-import {SelectOptionInterface} from "../../../shared/models/selectOption";
-import {Observable} from "rxjs/Observable";
-import {loadProductFamiliesAction} from "../../../services/aaiService/aai.actions";
-import {VnfInstanceDetailsService} from "./vnf-instance-details.service";
-import {isNullOrUndefined} from 'util';
-import {NumbersLettersUnderscoreValidator} from '../../../shared/components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator';
-import * as _ from "lodash";
-import {ServiceNodeTypes} from "../../../shared/models/ServiceNodeTypes";
-
-@Component({
- selector: 'vnf-instance-details',
- templateUrl: 'vnf-instance-details.html',
- styleUrls: ['vnf-instance-details.scss'],
- providers: [AaiService]
-})
-
-export class VnfInstanceDetailsComponent implements OnInit {
- @ViewChild('vnfForm') vnfForm: 'VnfForm';
- _vnfModel: VNFModel;
- @Input ()
- set vnfModel(vnfModel: VNFModel) {
- this._vnfModel = vnfModel;
- this.updateFormGroupControlsFromVNFModel();
- }
- @Input() vnfInstance: any;
- @Input() serviceInstance: ServiceInstance;
- @Input() dynamicInputs;
- @Input() modelName: string;
- @Input() serviceUuid: string;
- @Input() userProvidedNaming: boolean;
- _modelType: string;
- @Input()
- set modelType(modelType: string) {
- this._modelType = modelType;
- this.updateFormGroupControlsFromVNFModel();
- }
-
- @Input() parentModelName: string;
- @Input() isNewVfModule : boolean;
-
-
- @Output() onSubmitClick: EventEmitter<any> = new EventEmitter<any>();
- @Output() onServiceInstanceNameChanged : EventEmitter<boolean> = new EventEmitter<boolean>();
- @Output() onVolumeGroupNameChanged : EventEmitter<boolean> = new EventEmitter<boolean>();
-
-@Output() onDataChanged: EventEmitter<any> = new EventEmitter<any>();
- @select(['service','productFamilies'])
- readonly productFamilies : Observable<SelectOptionInterface[]>;
-
- vnfPopupDataModel: VNFPopupDataModel = new VNFPopupDataModel();
- lcpRegionsThatEnableLegacyRegionField = ['AAIAIC25', 'rdm3', 'rdm5a'];
- shouldShowLegacyRegion: boolean;
- instanceFormGroup: FormGroup = null;
- inputType = InputType;
- isNotUniqueInstanceName : boolean = false;
- isNotUniqueVolumeGroupName : boolean = false;
-
- constructor(private _aaiService: AaiService, private store: NgRedux<AppState>,
- private _vnfInstanceDetailsService : VnfInstanceDetailsService) {
- this.store.subscribe(() => {
- this.updateFormData()
- });
- }
-
- ngOnInit() {
- this.updateFormGroup();
- this.subscribeToFormChanges();
- this._aaiService.getCategoryParameters(null).subscribe();
- this._aaiService.getLcpRegionsAndTenants(this.serviceInstance.globalSubscriberId, this.serviceInstance.subscriptionServiceType).subscribe();
- this.updateLegacyRegionVisibility();
- this.store.dispatch(loadProductFamiliesAction());
- }
-
- isInputShouldBeShown(inputType: any) {
- let vnfInputs = [InputType.LCP_REGION, InputType.LOB, InputType.TENANT, InputType.PRODUCT_FAMILY, InputType.PLATFORM, InputType.ROLLBACK];
- let vfInputs = [InputType.VG];
- let exist = false;
- if (this._modelType === 'VF') {
- exist = vnfInputs.indexOf(inputType) > -1;
- }
- else {
- exist = vfInputs.indexOf(inputType) > -1;
- }
- return exist;
- }
-
- updateFormGroupControlsFromVNFModel() {
- if (this._vnfModel && this._modelType) {
- if (this._modelType === ServiceNodeTypes.VF) {
- const vnfInstance = <VnfInstance>this.vnfInstance;
- if (this.instanceFormGroup && this.userProvidedNaming
- && !this.instanceFormGroup.get('instanceName')) {
- const initialInstanceName = vnfInstance.instanceName || (!isNullOrUndefined(this._vnfModel.name) ? this._vnfModel.name.replace(/[-]/g, "") : this._vnfModel.name);
- this.instanceFormGroup.addControl('instanceName', new FormControl(initialInstanceName, Validators.compose([Validators.required, NumbersLettersUnderscoreValidator.valid])))
- }
- }
- else if (this._modelType === ServiceNodeTypes.VFmodule) {
- const vfInstance = <VfModuleInstance>this.vnfInstance;
- if (this.instanceFormGroup && this.userProvidedNaming && !this.instanceFormGroup.get('instanceName')) {
- this.instanceFormGroup.addControl('instanceName', new FormControl(vfInstance.instanceName, Validators.required));
-
- let vfModule = this.extractVfAccordingToVfModuleUuid(this.store.getState(), this._vnfModel.uuid);
- if (vfModule.volumeGroupAllowed && !this.instanceFormGroup.get('volumeGroupName')) {
- this.instanceFormGroup.addControl('volumeGroupName', new FormControl(vfInstance.volumeGroupName));
- }
- }
- }
- }
- }
-
- updateFormGroup() {
- const tenantDisabled = !this.vnfInstance.lcpCloudRegionId;
-
- if (this._modelType === ServiceNodeTypes.VF) {
- const vnfInstance = <VnfInstance>this.vnfInstance;
- this.instanceFormGroup = new FormGroup({
- productFamilyId: new FormControl(vnfInstance.productFamilyId),
- lcpCloudRegionId: new FormControl(vnfInstance.lcpCloudRegionId, Validators.required),
- tenantId: new FormControl({value: vnfInstance.tenantId, disabled: tenantDisabled}, Validators.required),
- legacyRegion: new FormControl(vnfInstance.legacyRegion),
- lineOfBusiness: new FormControl(vnfInstance.lineOfBusiness),
- platformName: new FormControl(vnfInstance.platformName, Validators.required),
- });
- }
- else if (this._modelType === ServiceNodeTypes.VFmodule) {
- const vfInstance = <VfModuleInstance>this.vnfInstance;
- this.instanceFormGroup = new FormGroup({
- });
- }
-
- this.instanceFormGroup.valueChanges.subscribe(()=> {
- this.checkForUniqueInstanceName();
- this.onDataChanged.next();
- });
-
- this.updateFormGroupControlsFromVNFModel();
- }
-
- private getParentVnfModel(): VNFModel {
- const rawModel = _.get(this.store.getState().service.serviceHierarchy[this.serviceUuid], ['vnfs', this.parentModelName]);
- return new VNFModel(rawModel);
- }
-
- extractVfAccordingToVfModuleUuid(state : any,vfModuleUuid : string) {
- const vnfs = this.store.getState().service.serviceHierarchy[this.serviceUuid].vnfs;
- const vnfsArray = Object.values(vnfs);
- for (let i = 0; i<vnfsArray.length;i++){
- let vfModules = Object.values(vnfsArray[i].vfModules);
- for (let j = 0; j<vfModules.length;j++){
- if (vfModules[j].uuid === vfModuleUuid){
- return vfModules[j];
- }
- }
- }
- }
-
- updateFormData() {
- let service = this.store.getState().service;
- this.vnfPopupDataModel.lcpRegions = service.lcpRegionsAndTenants.lcpRegionList;
- if (this.vnfInstance && this.vnfInstance.lcpCloudRegionId) {
- this.vnfPopupDataModel.tenants = service.lcpRegionsAndTenants.lcpRegionsTenantsMap[this.vnfInstance.lcpCloudRegionId];
- console.log('setting vnf instances tenant: ' + JSON.stringify(this.vnfPopupDataModel.tenants));
- }
- this.vnfPopupDataModel.platforms = service.categoryParameters.platformList;
- this.vnfPopupDataModel.lineOfBusinesses = service.categoryParameters.lineOfBusinessList;
- this.onDataChanged.next();
- }
-
- subscribeToFormChanges(): void {
- if (this.instanceFormGroup.get('lcpCloudRegionId') !== null) {
- this.instanceFormGroup.get('lcpCloudRegionId').valueChanges.subscribe(val => {
- this.setDisabledState(val, 'tenantId');
- this.updateTenantList(val);
- this.updateLegacyRegionVisibility();
- this.onDataChanged.next();
- });
- }
- }
-
- setDisabledState(val, field: string): void {
- if (val) {
- this.instanceFormGroup.controls[field].enable();
- }
- }
-
- updateLegacyRegionVisibility() {
- if (this.instanceFormGroup.get('lcpCloudRegionId') !== null) {
- this.shouldShowLegacyRegion = this.lcpRegionsThatEnableLegacyRegionField.indexOf(this.instanceFormGroup.get('lcpCloudRegionId').value) > -1;
- if (!this.shouldShowLegacyRegion) {
- this.instanceFormGroup.controls.legacyRegion.setValue(undefined);
- }
- }
- }
-
- updateTenantList(cloudRegionId) {
- this.resetTenantSelection();
- const tenantsForCloudRegionId = this.store.getState().service.lcpRegionsAndTenants.lcpRegionsTenantsMap[cloudRegionId];
- console.log('tenants for selected cloud region id: ' + JSON.stringify(tenantsForCloudRegionId));
- this.vnfPopupDataModel.tenants = tenantsForCloudRegionId;
- }
-
- resetTenantSelection() {
- this.instanceFormGroup.controls.tenantId.setValue(undefined);
- }
-
- checkForUniqueInstanceName() {
- let currentName = !isNullOrUndefined(this.instanceFormGroup.get('instanceName')) ? this.instanceFormGroup.get('instanceName').value : null;
-
- if(currentName && !this._vnfInstanceDetailsService.isUnique(this.store.getState().service.serviceInstance, this.serviceUuid, currentName, currentName === this.serviceInstance.instanceName) && this.userProvidedNaming){
- this.isNotUniqueInstanceName = true;
- this.onServiceInstanceNameChanged.emit(true);
- }else {
- this.isNotUniqueInstanceName = false;
- this.onServiceInstanceNameChanged.emit(false);
- }
- }
-
- checkForUniqueGroupName(){
- let currentName = this.instanceFormGroup.get('volumeGroupName').value;
- if( !this._vnfInstanceDetailsService.isUnique(this.store.getState().service.serviceInstance, this.serviceUuid, currentName, currentName === this.serviceInstance['volumeGroupName'])){
- this.isNotUniqueVolumeGroupName = true;
- this.onVolumeGroupNameChanged.emit(true);
- }else {
- this.isNotUniqueVolumeGroupName = false;
- this.onVolumeGroupNameChanged.emit(false);
- }
- }
-
- onSubmit(formValues): void {
- formValues.modelInfo = new ModelInfo(this._vnfModel);
- if (this._modelType === 'VFmodule') {
- let dynamicFields: { [dynamicField: string]: string; };
- dynamicFields = {};
- if(!_.isEmpty(this.dynamicInputs)) {
- this.dynamicInputs.map(function (x) {
- let dynamicField: string = x.id;
- dynamicFields[dynamicField] = formValues[dynamicField];
- delete formValues[dynamicField];
- });
- }
- formValues.instanceParams = [];
- formValues.instanceParams.push(dynamicFields);
- if(this.isNewVfModule){
- this.store.dispatch(createVFModuleInstance(formValues, this.modelName, this.serviceUuid));
- }else {
- this.store.dispatch(updateVFModuleInstance(formValues, this.modelName, this.serviceUuid));
- }
-
- }
- else {
- formValues.isUserProvidedNaming = this.userProvidedNaming;
- this.store.dispatch(updateVNFInstance(formValues, this.modelName, this.serviceUuid));
- }
- window.parent.postMessage({
- eventId: 'submitIframe',
- data: {
- serviceModelId: this.serviceUuid
- }
- }, "*");
- this.onSubmitClick.emit(this.serviceUuid);
- }
-}
diff --git a/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.html b/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.html
deleted file mode 100644
index ccdaac53b..000000000
--- a/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.html
+++ /dev/null
@@ -1,114 +0,0 @@
-
-<div id="vnf-instance-details">
- <form id="vnfForm" #vnfForm="ngForm" (ngSubmit)="onSubmit(vnfForm.value)" [formGroup]="instanceFormGroup">
-
- <div class="details-item" *ngIf="instanceFormGroup.get('instanceName')">
- <label class="required">Instance name:</label>
- <input patternInput
- pattern="^[a-zA-Z0-9_]*$"
- [attr.data-tests-id]="'instanceName'"
- [ngClass]="{'error-style' : _vnfInstanceDetailsService.hasInstanceNameError(instanceFormGroup) || _vnfInstanceDetailsService.hasUniqueError(isNotUniqueInstanceName)}"
- id="instance-name" name="instance-name"
- [formControlName]="'instanceName'"
- class="form-control input-text"
- placeholder="Type Instance Name"
- type="text"
- (blur)="checkForUniqueInstanceName()">
- <form-control-error *ngIf="_vnfInstanceDetailsService.hasUniqueError(isNotUniqueInstanceName)" [message]="'Instance name is already in use, please pick another name.'"></form-control-error>
- <form-control-error *ngIf="_vnfInstanceDetailsService.hasInstanceNameError(instanceFormGroup)" [message]="'Instance name may include only alphanumeric characters and underscore.'"></form-control-error>
- </div>
-
- <div *ngIf="isInputShouldBeShown(inputType.PRODUCT_FAMILY)" class="details-item">
- <label>Product family:</label>
- <select class="form-control input-text"
- [ngClass]="{'error-style' :_vnfInstanceDetailsService.hasApiError('productFamilyId',productFamilies, instanceFormGroup)}"
- data-tests-id="productFamily"
- id="product-family-select"
- [formControlName]="'productFamilyId'"
- name="product-family-select" >
- <option [value]="null" disabled>Select Product Family</option>
- <option *ngFor="let productFamily of productFamilies | async" [value]="productFamily.id"
- [disabled]="!productFamily.isPermitted">{{productFamily.name}}</option>
- </select>
- <form-control-error *ngIf="_vnfInstanceDetailsService.hasApiError('productFamilyId',productFamilies, instanceFormGroup)" [message]="'No results for this request. Please change criteria.'"></form-control-error>
- </div>
-
- <div *ngIf="isInputShouldBeShown(inputType.LCP_REGION)" class="details-item">
- <label class="required">LCP region:</label>
- <select
- [ngClass]="{'error-style' :_vnfInstanceDetailsService.hasApiError('lcpCloudRegionId',vnfPopupDataModel?.lcpRegions, instanceFormGroup)}"
- class="form-control input-text"
- [formControlName]="'lcpCloudRegionId'"
- name="lcpRegion" id="lcpRegion-select"
- data-tests-id="lcpRegion">
- <option [value]="null" disabled>Select LCP Region</option>
- <option *ngFor="let lcpRegion of vnfPopupDataModel.lcpRegions" [value]="lcpRegion.id" [disabled]="!lcpRegion.isPermitted" class="lcpRegionOption">{{lcpRegion.id}}</option>
- </select>
- <form-control-error *ngIf="_vnfInstanceDetailsService.hasApiError('lcpCloudRegionId',vnfPopupDataModel?.lcpRegions, instanceFormGroup)" [message]="'No results for this request. Please change criteria.'"></form-control-error>
- </div>
-
- <div class="details-item" *ngIf="shouldShowLegacyRegion">
- <label>Legacy Region:</label>
- <input
- [attr.data-tests-id]="'lcpRegionText'"
- id="legacy-region"
- name="legacy-region"
- [formControlName]="'legacyRegion'"
- class="form-control input-text"
- placeholder="Type Legacy Region" type="text">
- </div>
-
- <div *ngIf="isInputShouldBeShown(inputType.TENANT)" class="details-item">
- <label class="required">Tenant:</label>
- <select class="form-control input-text"
- [ngClass]="{'error-style' :_vnfInstanceDetailsService.hasApiError('tenantId',vnfPopupDataModel?.tenants, instanceFormGroup)}"
- [formControlName]="'tenantId'"
- name="tenant" id="tenant-select" data-tests-id="tenant">
- <option [value]="undefined" disabled>Select Tenant</option>
- <option *ngFor="let tenant of vnfPopupDataModel.tenants" [value]="tenant.id" [disabled]="!tenant.isPermitted">{{tenant.name}}</option>
- </select>
- <form-control-error *ngIf="_vnfInstanceDetailsService.hasApiError('tenantId',vnfPopupDataModel?.tenants, instanceFormGroup)" [message]="'No results for this request. Please change criteria.'"></form-control-error>
- </div>
-
- <div *ngIf="isInputShouldBeShown(inputType.LOB)" class="details-item">
- <label>Line of business:</label>
- <select [attr.data-tests-id]="'lineOfBusiness'"
- class="form-control input-text"
- [ngClass]="{'error-style' :_vnfInstanceDetailsService.hasApiError('lineOfBusiness',vnfPopupDataModel?.lineOfBusinesses, instanceFormGroup)}"
- name="lineOfBusiness" id="lineOfBusiness"
- [formControlName]="'lineOfBusiness'">
- <option [value]="null" disabled>Select Line Of Business</option>
- <option *ngFor="let project of vnfPopupDataModel.lineOfBusinesses" [value]="project.id">{{project.name}}</option>
- </select>
- <form-control-error *ngIf="_vnfInstanceDetailsService.hasApiError('lineOfBusiness',vnfPopupDataModel?.lineOfBusinesses, instanceFormGroup)" [message]="'No results for this request. Please change criteria.'"></form-control-error>
- </div>
-
- <div *ngIf="isInputShouldBeShown(inputType.PLATFORM)" class="details-item">
- <label class="required">Platform:</label>
- <select
- [attr.data-tests-id]="'platform'"
- [ngClass]="{'error-style' :_vnfInstanceDetailsService.hasApiError('platformName',vnfPopupDataModel?.platforms, instanceFormGroup)}"
- class="form-control input-text"
- [formControlName]="'platformName'"
- name="platform" id="platform">
- <option [value]="null" disabled>Select Platform</option>
- <option *ngFor="let platform of vnfPopupDataModel.platforms" [value]="platform.id">{{platform.name}}</option>
- </select>
- <form-control-error *ngIf="_vnfInstanceDetailsService.hasApiError('platformName',vnfPopupDataModel?.platforms, instanceFormGroup)" [message]="'No results for this request. Please change criteria.'"></form-control-error>
- </div>
-
-
- <div *ngIf="isInputShouldBeShown(inputType.VG) && instanceFormGroup.get('volumeGroupName')" class="details-item" >
- <label class="required">Volume Group Name:</label>
- <input [attr.data-tests-id]="'volumeGroupName'"
- id="vgName" name="vgName"
- [ngClass]="{'error-style' :isNotUniqueVolumeGroupName}"
- [formControlName]="'volumeGroupName'"
- class="form-control input-text"
- placeholder="Type Instance Name" type="text" (blur)="checkForUniqueGroupName()">
- <form-control-error *ngIf="isNotUniqueVolumeGroupName" [message]="'Volume Group instance name is already in use, please pick another name.'"></form-control-error>
- </div>
-
- <dynamic-inputs *ngIf="dynamicInputs != undefined && dynamicInputs.length>0" [group]="instanceFormGroup" [list]="dynamicInputs"></dynamic-inputs>
- </form>
-</div>
diff --git a/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.scss b/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.scss
deleted file mode 100644
index 080540a57..000000000
--- a/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.scss
+++ /dev/null
@@ -1,64 +0,0 @@
-#vnf-instance-details {
- position: relative;
-
- #notification-area {
- color: #959595;
- font-size: 12px;
- position: absolute;
- top: 3px;
- left: 30px;
- }
-
- height: 100%;
- overflow: auto;
- padding: 30px;
-
- /deep/ {
- .form-control {
- border-radius: 2px;
- box-shadow: none;
- border-color: #D2D2D2;
- }
-
- label {
- font-family: OpenSans-Semibold;
- font-size: 12px;
- }
-
- select {
- @extend .form-control;
- -webkit-appearance: none;
- -moz-appearance: none;
- appearance: none;
- background: url('../../../../assets/img/chevron.svg') 0 0 no-repeat;
- background-size: 24px;
- background-position-x: right;
- background-position-y: center;
- font-family: OpenSans-Italic;
- font-size: 14px;
- color: #959595;
- height: 38px;
- }
-
- input:not([type='checkbox']) {
- @extend .form-control;
- height: 38px;
- }
-
- .form-control[disabled], fieldset[disabled] .form-control {
- opacity: 0.5;
- }
- .input-text {
- border: 1px solid #D2D2D2;
- border-radius: 2px;
- }
-
- .details-item {
- margin-bottom: 20px;
- }
- }
-
- .checkbox-label {
- font-family: OpenSans-Regular;
- }
-}
diff --git a/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.service.spec.ts b/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.service.spec.ts
deleted file mode 100644
index 41ddb4372..000000000
--- a/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.service.spec.ts
+++ /dev/null
@@ -1,241 +0,0 @@
-import { TestBed, getTestBed } from '@angular/core/testing';
-import {
- HttpClientTestingModule,
- HttpTestingController
-} from '@angular/common/http/testing';
-import { VnfInstanceDetailsService } from './vnf-instance-details.service';
-import { FormControl, FormGroup, Validators } from '@angular/forms';
-import { NumbersLettersUnderscoreValidator } from '../../../shared/components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator';
-
-describe('Vnf Instance Details Service', () => {
- let injector;
- let service: VnfInstanceDetailsService;
- let httpMock: HttpTestingController;
-
- let SERVICE_ID: string = '1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd';
- let serviceHierarchy;
-
- beforeEach(() => {
- TestBed.configureTestingModule({
- imports: [HttpClientTestingModule],
- providers: [VnfInstanceDetailsService]
- });
-
- injector = getTestBed();
- service = injector.get(VnfInstanceDetailsService);
- httpMock = injector.get(HttpTestingController);
- serviceHierarchy = getServiceServiceHierarchy();
- });
-
-
- describe('#hasInstanceNameError', ()=> {
- it('hasInstanceNameError should return true if instanceName is illegal and enabled', (done: DoneFn) => {
- let form = generateFormGroup();
- form.controls['instanceName'].setValue('----');
- form.controls['instanceName'].setErrors({
- pattern : true
- });
- form.controls['instanceName'].markAsTouched();
- let result = service.hasInstanceNameError(form);
- expect(result).toBeTruthy();
- done();
- });
-
- it('hasInstanceNameError should return false if instanceName is illegal and enabled and pattern is ok', (done: DoneFn) => {
- let form = generateFormGroup();
- form.controls['instanceName'].setValue('----');
- form.controls['instanceName'].setErrors({
- otherError : true
- });
- form.controls['instanceName'].markAsTouched();
- let result = service.hasInstanceNameError(form);
- expect(result).toBeFalsy();
- done();
- });
- });
-
- describe('#isUnique', () => {
- it('Create Mode: should return false if instanceName exist', (done: DoneFn) => {
- serviceHierarchy = getServiceServiceHierarchy();
- let result = service.isUnique(serviceHierarchy, SERVICE_ID, 'uniqueInstanceName', false);
- expect(result).toBeFalsy();
- done();
- });
-
- it('Update Mode: should return true if instanceName exist once', (done: DoneFn) => {
- let result = service.isUnique(serviceHierarchy, SERVICE_ID, 'uniqueInstanceName', true);
- expect(result).toBeTruthy()
- done();
- });
-
- it('Create Mode: should return true if instanceName not exist', (done: DoneFn) => {
- let result = service.isUnique(serviceHierarchy, SERVICE_ID, 'uniqueInstanceNameNotExist', false);
- expect(result).toBeTruthy();
- done();
- });
-
- it('Create Mode: should return false if instanceName exist inside vf modules', (done: DoneFn) => {
- let result = service.isUnique(serviceHierarchy, SERVICE_ID, 'uniqueInstanceNameVfModule', false);
- expect(result).toBeFalsy();
- done();
- });
-
- it('Update Mode: should return true if instanceName exist once inside vf modules', (done: DoneFn) => {
- let result = service.isUnique(serviceHierarchy, SERVICE_ID, 'uniqueInstanceNameVfModule', true);
- expect(result).toBeTruthy();
- done();
- });
-
- it('Create Mode: should return true if instanceName is not exist at vf modules and vnfs', (done: DoneFn) => {
- let result = service.isUnique(serviceHierarchy, SERVICE_ID, 'uniqueInstanceNameVfModuleNotExist', false);
- expect(result).toBeTruthy();
- done();
- });
-
- it('Create Mode: should return false if instanceName exist service name', (done: DoneFn) => {
- let result = service.isUnique(serviceHierarchy, SERVICE_ID, 'Instance-Name', false);
- expect(result).toBeFalsy();
- done();
- });
-
- it('Create Mode: should return false if volumeGroupName exist service name', (done: DoneFn) => {
- let result = service.isUnique(serviceHierarchy, SERVICE_ID, 'volumeGroupNameExist', false);
- expect(result).toBeFalsy();
- done();
- });
-
- it('Create Mode: should return true if volumeGroupName not exist service name', (done: DoneFn) => {
- let result = service.isUnique(serviceHierarchy, SERVICE_ID, 'volumeGroupNameNotExist', false);
- expect(result).toBeTruthy();
- done();
- });
- });
-
- function getServiceServiceHierarchy() {
- return JSON.parse(JSON.stringify(
- {
- "1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd": {
- "vnfs": {
- "2017-388_ADIOD-vPE 1": {
- "rollbackOnFailure": "true",
- "vfModules": {},
- "instanceParams": [
- {}
- ],
- "productFamilyId": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7",
- "lcpCloudRegionId": "AAIAIC25",
- "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
- "lineOfBusiness": "zzz1",
- "platformName": "platform",
- "instanceName": "uniqueInstanceName",
- "modelInfo": {
- "modelInvariantId": "00beb8f9-6d39-452f-816d-c709b9cbb87d",
- "modelVersionId": "0903e1c0-8e03-4936-b5c2-260653b96413",
- "modelName": "2017-388_ADIOD-vPE",
- "modelVersion": "1.0",
- "modelCustomizationId": "280dec31-f16d-488b-9668-4aae55d6648a",
- "modelCustomizationName": "2017-388_ADIOD-vPE 1"
- },
- "isUserProvidedNaming": true
- },
- "2017-388_ADIOD-vPE 0": {
- "rollbackOnFailure": "true",
- "vfModules": {},
- "instanceParams": [
- {}
- ],
- "productFamilyId": null,
- "lcpCloudRegionId": "mtn6",
- "tenantId": "1178612d2b394be4834ad77f567c0af2",
- "lineOfBusiness": "ECOMP",
- "platformName": "xxx1",
- "instanceName": "blaaa",
- "modelInfo": {
- "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
- "modelVersionId": "afacccf6-397d-45d6-b5ae-94c39734b168",
- "modelName": "2017-388_ADIOD-vPE",
- "modelVersion": "4.0",
- "modelCustomizationId": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c",
- "modelCustomizationName": "2017-388_ADIOD-vPE 0"
- },
- "isUserProvidedNaming": true
- },
- "2017488_ADIODvPE 0": {
- "rollbackOnFailure": "true",
- "vfModules": {
- "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
- "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
- "rollbackOnFailure": "true",
- "instanceName": "uniqueInstanceNameVfModule",
- "volumeGroupName": "volumeGroupNameExist",
- "modelInfo": {
- "modelInvariantId": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
- "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5",
- "modelName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
- "modelVersion": "6"
- }
- }
- }
- },
- "instanceParams": [
- {}
- ],
- "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
- "lcpCloudRegionId": "mtn6",
- "tenantId": "19c5ade915eb461e8af52fb2fd8cd1f2",
- "lineOfBusiness": "zzz1",
- "platformName": "platform",
- "instanceName": "2017488_ADIODvPE",
- "modelInfo": {
- "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
- "modelVersionId": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
- "modelName": "2017488_ADIODvPE",
- "modelVersion": "5.0",
- "modelCustomizationId": "1da7b585-5e61-4993-b95e-8e6606c81e45",
- "modelCustomizationName": "2017488_ADIODvPE 0"
- },
- "isUserProvidedNaming": true
- }
- },
- "instanceParams": [
- {}
- ],
- "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
- "productFamilyId": "17cc1042-527b-11e6-beb8-9e71128cae77",
- "subscriptionServiceType": "VIRTUAL USP",
- "lcpCloudRegionId": "AAIAIC25",
- "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
- "aicZoneId": "DKJ1",
- "projectName": "DFW",
- "owningEntityId": "aaa1",
- "instanceName": "Instance-Name",
- "bulkSize": 1,
- "modelInfo": {
- "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
- "modelVersionId": "1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd",
- "modelName": "action-data",
- "modelVersion": "1.0"
- },
- "tenantName": "USP-SIP-IC-24335-T-01",
- "aicZoneName": "DKJSJDKA-DKJ1",
- "isUserProvidedNaming": true
- }
- }
- ));
- }
-
- function generateFormGroup() {
- return new FormGroup({
- productFamilyId: new FormControl(),
- lcpCloudRegionId: new FormControl(Validators.required),
- tenantId: new FormControl({value: null, disabled: false}, Validators.required),
- legacyRegion: new FormControl(),
- lineOfBusiness: new FormControl(),
- platformName: new FormControl(Validators.required),
- rollbackOnFailure: new FormControl(Validators.required),
- instanceName: new FormControl({value: null}, Validators.compose([Validators.required, NumbersLettersUnderscoreValidator.valid]))
-
- });
- }
-
-});
diff --git a/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.service.ts b/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.service.ts
deleted file mode 100644
index 677895e72..000000000
--- a/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.service.ts
+++ /dev/null
@@ -1,64 +0,0 @@
-import { Injectable } from '@angular/core';
-import { isNullOrUndefined } from "util";
-import { FormGroup } from '@angular/forms';
-@Injectable()
-export class VnfInstanceDetailsService {
- isUnique(serviceInstance : any, serviceId : string, name: string, isEqualToOriginalInstanceName : boolean) : boolean {
- const service = serviceInstance[serviceId];
- let countInstanceName = 0;
- let countVolumeGroupName = 0;
- if(service){
- if(service.instanceName === name) return false;
- if(service.vnfs){
- for(let key in service.vnfs){
- if(service.vnfs[key].instanceName === name) {
- countInstanceName++;
- if((isEqualToOriginalInstanceName && countInstanceName > 1) || (!isEqualToOriginalInstanceName)) return false;
- }
- if(service.vnfs[key].vfModules){
- for(let vfModule in service.vnfs[key].vfModules){
- if(service.vnfs[key].vfModules[vfModule]) {
- for(let module in service.vnfs[key].vfModules[vfModule]){
- if(service.vnfs[key].vfModules[vfModule][module].instanceName === name ) {
- countInstanceName++;
- if((isEqualToOriginalInstanceName && countInstanceName > 1) || (!isEqualToOriginalInstanceName)) return false;
- }
-
- if(service.vnfs[key].vfModules[vfModule][module].volumeGroupName === name ) {
- countVolumeGroupName++;
- if((isEqualToOriginalInstanceName && countVolumeGroupName > 1) || (!isEqualToOriginalInstanceName)) return false;
- }
- }
- }
- }
- }
-
- }
- }
- }
- return true;
- }
-
- hasApiError(controlName: string, data: Array<any>, form: FormGroup) {
- if (!isNullOrUndefined(data)) {
- if (!form.controls[controlName].disabled && data.length === 0) {
- return true;
- }
- }
- return false;
- }
-
- hasInstanceNameError(form : FormGroup) : boolean {
- if(!isNullOrUndefined(form) && !isNullOrUndefined(form.controls['instanceName'])){
- if (form.controls['instanceName'].touched && form.controls['instanceName'].errors && form.controls['instanceName'].errors.pattern) {
- return true;
- }
- }
- return false;
- }
-
- hasUniqueError(isNotUniqueInstanceName) : boolean {
- return isNotUniqueInstanceName;
- }
-
-}
diff --git a/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnfPopupDataModel.ts b/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnfPopupDataModel.ts
deleted file mode 100644
index 9a2694c70..000000000
--- a/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnfPopupDataModel.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-import {Project} from "../../../shared/models/project";
-import {LcpRegion} from "../../../shared/models/lcpRegion";
-import {Tenant} from "../../../shared/models/tenant";
-import {ProductFamily} from "../../../shared/models/productFamily";
-import {SelectOption, SelectOptionInterface} from "../../../shared/models/selectOption";
-
-export class VNFPopupDataModel {
- productFamilies: ProductFamily[];
- lcpRegions: LcpRegion[];
- lcpRegionsTenantsMap: any;
- tenants: Tenant[];
- projects: Project[];
- lineOfBusinesses: SelectOption[];
- platforms: SelectOptionInterface[];
- globalCustomerId: string;
-
-
- constructor(){
- this.lcpRegions = [];
- this.lcpRegionsTenantsMap = {};
- this.tenants = [];
- this.productFamilies = [];
- this.lineOfBusinesses = [];
- this.platforms = [];
- }
-}
diff --git a/vid-webpack-master/src/app/components/vnf-popup/vnf-popup-service.ts b/vid-webpack-master/src/app/components/vnf-popup/vnf-popup-service.ts
deleted file mode 100644
index 7dbe9b11b..000000000
--- a/vid-webpack-master/src/app/components/vnf-popup/vnf-popup-service.ts
+++ /dev/null
@@ -1,55 +0,0 @@
-import {Injectable} from "@angular/core";
-import {ServiceNodeTypeToModelKeyMapper} from "../../shared/models/serviceNodeTypeToModelKeyMapper";
-import {ServiceNodeTypes} from "../../shared/models/ServiceNodeTypes";
-import {VfModule} from "../../shared/models/vfModule";
-import {ServicePlanningService} from "../../services/service-planning.service";
-import {VNFModel} from "../../shared/models/vnfModel";
-import * as _ from 'lodash';
-import {isNullOrUndefined} from "util";
-import {NumbersLettersUnderscoreValidator} from '../../shared/components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator';
-import {FormGroup} from '@angular/forms';
-import {VnfInstanceDetailsComponent} from './vnf-instance-details/vnf-instance-details.component';
-import {VnfInstanceDetailsService} from './vnf-instance-details/vnf-instance-details.service';
-
-@Injectable()
-export class VnfPopupService {
-
- constructor(private _servicePlanningService : ServicePlanningService, private _vnfInstanceDetailsService : VnfInstanceDetailsService) {
- }
-
- public getModelFromResponse(result : any, modelType : string, modelName:string) {
- let model = null;
- let rawModel = _.get(result, [ServiceNodeTypeToModelKeyMapper[modelType], modelName]);
- if (!rawModel) return;
-
- if (modelType === ServiceNodeTypes.VFmodule) {
- model = new VfModule(rawModel);
- }
- else {
- model = new VNFModel(rawModel);
- }
- return model;
- }
-
- onControlError(servicePopupDataModel : VnfInstanceDetailsComponent, serviceInstanceDetailsFormGroup : FormGroup, isNotUniqueInstanceName : boolean, isNotUniqueVolumeGroupName : boolean) : boolean{
- if(this._vnfInstanceDetailsService.hasUniqueError(isNotUniqueInstanceName) || isNotUniqueVolumeGroupName){
- return true;
- }
- if(!isNullOrUndefined(serviceInstanceDetailsFormGroup.controls['instanceName']) && NumbersLettersUnderscoreValidator.valid(serviceInstanceDetailsFormGroup.controls['instanceName'].value) && serviceInstanceDetailsFormGroup.controls['instanceName'].value != null && serviceInstanceDetailsFormGroup.controls['instanceName'].value.length > 0){
- return true;
- }
-
- const controlName : Array<string> = ['lcpCloudRegionId', 'tenantId', 'lineOfBusiness', 'platformName'];
- const selectDataName : Array<string> = ['lcpRegions', 'tenants', 'lineOfBusinesses', 'platforms', 'projects'];
-
- for(let i = 0 ; i < controlName.length ; i++){
- if (!isNullOrUndefined(servicePopupDataModel.vnfPopupDataModel) && !isNullOrUndefined(servicePopupDataModel.vnfPopupDataModel[selectDataName[i]])) {
- if (!isNullOrUndefined(serviceInstanceDetailsFormGroup.controls[controlName[i]]) && !serviceInstanceDetailsFormGroup.controls[controlName[i]].disabled && servicePopupDataModel.vnfPopupDataModel[selectDataName[i]].length === 0) {
- return true;
- }
- }
- }
- return false;
- }
-
-}
diff --git a/vid-webpack-master/src/app/components/vnf-popup/vnf-popup.components.ts b/vid-webpack-master/src/app/components/vnf-popup/vnf-popup.components.ts
deleted file mode 100644
index 26e667d4c..000000000
--- a/vid-webpack-master/src/app/components/vnf-popup/vnf-popup.components.ts
+++ /dev/null
@@ -1,190 +0,0 @@
-import {Component, OnInit, ViewChild} from "@angular/core";
-import {AaiService} from "../../services/aaiService/aai.service";
-import {ModelInformationItem} from "../../shared/components/model-information/model-information.component";
-import {ActivatedRoute} from "@angular/router";
-import {DialogComponent, DialogService} from "ng2-bootstrap-modal";
-import {InstancePopup} from "../instance-popup/instance-popup.components";
-import {ServiceModel} from "../../shared/models/serviceModel";
-import {Constants} from "../../shared/utils/constants";
-import * as _ from "lodash";
-import {VnfInstance} from "../../shared/models/vnfInstance";
-import {ServiceInstance} from "../../shared/models/serviceInstance";
-import {VnfInstanceDetailsComponent} from "./vnf-instance-details/vnf-instance-details.component";
-import {Subscriber} from "../../shared/models/subscriber";
-import {ServiceNodeTypes} from "../../shared/models/ServiceNodeTypes";
-import {AppState} from "../../store/reducers";
-import {NgRedux} from "@angular-redux/store";
-import {VfModuleInstance} from "../../shared/models/vfModuleInstance";
-import {VnfPopupService} from './vnf-popup-service';
-import {IframeService} from "../../shared/utils/iframe.service";
-
-export interface VnfPopupModel {
- serviceModelId: string;
- modelName: string;
- parentModelName: string;
- modelType: string;
- dynamicInputs: any;
- userProvidedNaming: boolean;
- isNewVfModule : boolean;
-}
-
-@Component({
- selector: 'vnf-popup',
- templateUrl: 'vnf-popup.html',
- styleUrls: ['vnf-popup.scss'],
- providers: [AaiService, VnfPopupService]
-})
-
-export class VnfPopupComponent extends DialogComponent<VnfPopupModel, boolean> implements VnfPopupModel, InstancePopup, OnInit {
-
- @ViewChild(VnfInstanceDetailsComponent) vnfInstanceDetails: VnfInstanceDetailsComponent;
-
- serviceModelId: string;
- modelName: string;
- parentModelName: string;
- modelType: string;
- isNewVfModule : boolean;
- model: any;
- serviceModel: ServiceModel;
- popupTypeName: string;
- serviceInstance: ServiceInstance;
- vnfInstance: VnfInstance;
- dynamicInputs;
- userProvidedNaming: boolean;
- typeMapperForTitle = {
- VF: "VNF",
- VFmodule: "Module (Heat stack)"
- };
-
- modelInformationItems: Array<ModelInformationItem> = [];
- isNotUniqueInstanceName : boolean = false;
- isNotUniqueVolumeGroupName : boolean = false;
- hasGeneralApiError : boolean = false;
-
- parentElementClassName = 'content';
-
- constructor(dialogService: DialogService, protected route: ActivatedRoute, protected _aaiService: AaiService,
- private store: NgRedux<AppState>,
- private _iframeService : IframeService,
- private _vnfPopupService: VnfPopupService) {
- super(dialogService);
- this.vnfInstance = new VnfInstance();
- }
-
- updateGeneralErrorSection() : void {
- this.hasGeneralApiError = this._vnfPopupService.onControlError(
- this.vnfInstanceDetails,
- this.vnfInstanceDetails.instanceFormGroup,
- this.vnfInstanceDetails.isNotUniqueInstanceName,
- this.vnfInstanceDetails.isNotUniqueVolumeGroupName);
- }
-
- ngOnInit(): void {
- this.updateServiceModelById();
- this.popupTypeName = this.getModelTypeForPopupTitle();
- this.updateServiceModelById();
- this.updateInstanceFromStore();
- }
-
- onCancelClick() {
- this._iframeService.removeClassCloseModal(this.parentElementClassName);
- super.close();
- }
-
- onServiceInstanceNameChanged(isNotUniqueInstanceName: boolean) : void {
- this.isNotUniqueInstanceName = isNotUniqueInstanceName;
- }
-
- onVolumeGroupNameChanged(isNotUniqueVolumeGroupName: boolean) : void {
- this.isNotUniqueVolumeGroupName = isNotUniqueVolumeGroupName;
- }
-
- onSetClick() {
- this._iframeService.removeClassCloseModal(this.parentElementClassName);
- this.result = true;
- super.close();
- }
-
- updateServiceModelById() {
- this._aaiService.getServiceModelById(this.serviceModelId).subscribe(
- result => {
- this.serviceModel = new ServiceModel(result);
- this.model = this._vnfPopupService.getModelFromResponse(result, this.modelType, this.modelName);
- this.modelInformationItems = this.createModelInformationItems();
- },
- error => {
- console.log('error is ', error)
- }
- );
- }
-
- updateInstanceFromStore() {
- let instance;
- const serviceInstance = this.store.getState().service.serviceInstance[this.serviceModelId];
- if (this.modelType === ServiceNodeTypes.VF) {
- instance = serviceInstance.vnfs[this.modelName] || new VnfInstance();
- } else {
- instance = new VfModuleInstance();
- }
-
- if (instance.instanceParams && instance.instanceParams[0]) {
- this.dynamicInputs = this.dynamicInputs.map(x => {
- x.value = (instance.instanceParams[0][x.id]) ? instance.instanceParams[0][x.id] : x.value;
- return x;
- });
- }
- this.vnfInstance = instance;
- }
-
- getModelName(): string {
- return this.modelName;
- }
-
- getModelTypeForPopupTitle(): string {
- if (_.has(this.typeMapperForTitle, this.modelType)) {
- return this.typeMapperForTitle[this.modelType];
- }
- return this.modelType;
- }
-
- extractSubscriberNameBySubscriberId(subsriberId: string) {
- var result: string = null;
- var filteredArray: any = _.filter(this.store.getState().service.subscribers, function (o: Subscriber) {
- return o.id === subsriberId
- })
- if (filteredArray.length > 0) {
- result = filteredArray[0].name;
- }
- return result;
- }
-
- createModelInformationItems(): Array<ModelInformationItem> {
- var serviceInstance = this.store.getState().service.serviceInstance[this.serviceModelId];
-
- let items = [
- new ModelInformationItem("Subscriber Name", "subscriberName", [this.extractSubscriberNameBySubscriberId(serviceInstance.globalSubscriberId)], "", true),
- new ModelInformationItem("Service Name", "serviceModelName", [this.serviceModel.name], "", true),
-
- new ModelInformationItem("Service Instance Name", "serviceName", [serviceInstance.instanceName], "", false),
- new ModelInformationItem("Model Name", "modelName", [this.model.name], "", true),
- new ModelInformationItem("Model version", "modelVersion", [this.model.version], "", true),
- new ModelInformationItem("Description", "description", [this.model.description]),
- new ModelInformationItem("Category", "category", [this.model.category]),
- new ModelInformationItem("Sub Category", "subCategory",[this.model.subCategory]),
- new ModelInformationItem("UUID", "uuid", [this.model.uuid], Constants.ServicePopup.TOOLTIP_UUID, true),
- new ModelInformationItem("Invariant UUID", "invariantUuid", [this.model.invariantUuid], Constants.ServicePopup.TOOLTIP_INVARIANT_UUID, true),
- new ModelInformationItem("Service type", "serviceType", [this.serviceModel.serviceType]),
- new ModelInformationItem("Service role", "serviceRole", [this.serviceModel.serviceRole]),
-
-
- ];
- if (this.modelType === 'VFmodule') {
- items.push(new ModelInformationItem("Minimum to instantiate", "min", [this.model.min], "", true),
- new ModelInformationItem("Maximum to instantiate", "max", this.model.max == undefined ? [1] : [this.model.max], "", true),
- new ModelInformationItem("Recommended to instantiate", "initial", [this.model.initial]));
-
- }
-
- return items;
- }
-}
diff --git a/vid-webpack-master/src/app/components/vnf-popup/vnf-popup.html b/vid-webpack-master/src/app/components/vnf-popup/vnf-popup.html
deleted file mode 100644
index d2e043b18..000000000
--- a/vid-webpack-master/src/app/components/vnf-popup/vnf-popup.html
+++ /dev/null
@@ -1,54 +0,0 @@
-<div id="instance-popup" class="modal-dialog">
- <div class="modal-content">
- <div class="modal-header">
- <button type="button" class="close" (click)="onCancelClick()" >&times;</button>
- <span [attr.data-tests-id]="'create-modal-title'" class="modal-title">Set a new {{popupTypeName}}</span>
- </div>
- <div class="modal-body popup-content">
-
- <div class="header-left">
- <div>MODEL: <span>"{{popupTypeName}}"</span></div>
- </div>
-
- <div class="header-right">
- {{getModelTypeForPopupTitle()}} Instance Details
- </div>
-
- <div class="model-information">
- <model-information [modelInformationItems]="modelInformationItems"></model-information>
- </div>
-
- <div class="instance-form">
- <vnf-instance-details [dynamicInputs]="dynamicInputs"
- [vnfModel]="model"
- [modelType]="modelType"
- [modelName]="modelName"
- [parentModelName]="parentModelName"
- [isNewVfModule]="isNewVfModule"
- [serviceInstance]="vnfInstance"
- [vnfInstance]="vnfInstance"
- [serviceUuid]="serviceModelId"
- [userProvidedNaming]="userProvidedNaming"
- (onSubmitClick)="onSetClick($event)"
- (onDataChanged)="updateGeneralErrorSection()"
- (onServiceInstanceNameChanged)="onServiceInstanceNameChanged($event)"
- (onVolumeGroupNameChanged)="onVolumeGroupNameChanged($event)"
-
- ></vnf-instance-details>
- </div>
-
- </div>
- <div class="modal-footer row" style="padding: 0">
- <div class="col-md-6">
- <div *ngIf="hasGeneralApiError == true">
- <form-general-error [message]="'Page contains errors. Please see details next to the relevant fields.'"></form-general-error>
- </div>
- </div>
- <div class="col-md-6" style="padding: 15px;padding-right: 35px;">
- <button [attr.data-tests-id]="'cancelButton'" type="button" class="btn btn-default cancel" (click)="onCancelClick()"><span>Cancel</span></button>
- <input type="submit" value="Set" form="vnfForm" data-tests-id="vnf-form-set"
- class="btn btn-success submit" [disabled]="!vnfInstanceDetails?.vnfForm?.valid || isNotUniqueInstanceName || isNotUniqueVolumeGroupName">
- </div>
- </div>
- </div>
-</div>
diff --git a/vid-webpack-master/src/app/configuration/vid.configuration.ts b/vid-webpack-master/src/app/configuration/vid.configuration.ts
deleted file mode 100644
index 2430d3ba5..000000000
--- a/vid-webpack-master/src/app/configuration/vid.configuration.ts
+++ /dev/null
@@ -1,98 +0,0 @@
-export class VidConfiguration {
-
- public static VNF_STATUS_CHECK_ENABLED = false;
-
- /*
- * UPLOAD_SUPPLEMENTARY_STATUS_CHECK_ENABLED: Determines the Property to Govern Presence of
- * Upload Supplementary File on Volume Group Screen.
- * Set to false, to disable the check.
- */
- public static UPLOAD_SUPPLEMENTARY_STATUS_CHECK_ENABLED = false;
-
- /*
- * List of valid VNF status combinations
- */
- public static VNF_VALID_STATUS_LIST = [
- {
- 'provStatus': 'preprov',
- 'orchestrationStatus': 'pending-create',
- 'inMaint': false,
- 'operationalStatus': null
- },
- {
- 'provStatus': 'preprov',
- 'orchestrationStatus': 'created',
- 'inMaint': false,
- 'operationalStatus': null
- },
- {
- 'provStatus': 'preprov',
- 'orchestrationStatus': 'active',
- 'inMaint': false,
- 'operationalStatus': null
- },
- {
- 'provStatus': 'nvtprov',
- 'orchestrationStatus': 'active',
- 'inMaint': false,
- 'operationalStatus': null
- },
- {
- 'provStatus': 'prov',
- 'orchestrationStatus': 'active',
- 'inMaint': false,
- 'operationalStatus': 'out-of-service-path'
- },
- {
- 'provStatus': 'prov',
- 'orchestrationStatus': 'activated',
- 'inMaint': false,
- 'operationalStatus': 'out-of-service-path'
- }
- ];
-
- /*
- * The model status VID uses to query SDC for a list of models. The possible values are:
- * DISTRIBUTION_NOT_APPROVED,
- * DISTRIBUTION_APPROVED,
- * DISTRIBUTED,
- * DISTRIBUTION_REJECTED,
- * ALL,
- * In the production env, this should always be set to DISTRIBUTED
- */
- public static ASDC_MODEL_STATUS = 'DISTRIBUTED';
-
- /*
- * Max number of times that VID will poll MSO for a given request status
- */
- public static MSO_MAX_POLLS = 10;
-
- /*
- * Number of msecs that VID will wait between MSO polls.
- */
- public static MSO_POLLING_INTERVAL_MSECS = 10000;
-
- public static SCHEDULER_POLLING_INTERVAL_MSECS = 10000;
-
- public static SCHEDULER_MAX_POLLS = 10;
-
- public static COMPONENT_LIST_NAMED_QUERY_ID = '0367193e-c785-4d5f-9cb8-7bc89dc9ddb7';
-
- /*
- * List of all service model invariant UUIDs that need macro instantiation.
- * Example:
- * MACRO_SERVICES : ['3cf30cbb-5fe7-4fb3-b049-559a4997b221', 'b135a703-bab5-4295-a37f-580a4f2d0961']
- *
- */
- public static MACRO_SERVICES = ['c9514b73-3dfe-4d7e-9146-b318d48655d9', '93150ffa-00c6-4ea0-85f2-3536ca46ebd2',
- '2b54297f-72e7-4a94-b451-72df88d0be0b',
- 'd27e42cf-087e-4d31-88ac-6c4b7585f800',
- 'ec0c4bab-c272-4dab-b087-875031bb0c9f', '0311f998-9268-4fd6-bbba-afff15087b72',
- '43596836-ae36-4608-a987-6608ede10dac', '306caa85-74c7-48a9-aa22-7e3a564b957a',
- 'e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0'];
-
- public static SCHEDULER_CALLBACK_URL = 'https://vid-web-ete.ecomp.cci.att.com:8000/vid/change-management/workflow/';
-
- public static SCHEDULER_PORTAL_URL = 'http://www.ecomp.att.com';
-
-}
diff --git a/vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.component.html b/vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.component.html
deleted file mode 100644
index 5eb977325..000000000
--- a/vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.component.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<div class="available-models-tree">
- <h5>
- <span>SERVICE MODEL:</span>
- <span id="service-model-name">{{service | serviceInfo: _store: serviceModelId : 'name'}}</span>
- </h5>
- <div class="available-models-content-wrapper">
- <div class="search-container">
- <input [attr.data-tests-id]="'search-left-tree'" #filter (keyup)="searchTree(filter.value, $event)" placeholder="Filter..."/>
- <span class="icon-search"></span>
- </div>
-
- <tree-root #tree [attr.data-tests-id]="'available-models-tree'" [nodes]="nodes" [options]="options">
- <ng-template #treeNodeTemplate let-node let-index="index">
- <div [attr.data-tests-id]="'node-'+node.data.name" (click)="selectNode(node)" [ngClass]="{'selected': index , 'isParent': node.data.type !== 'VFmodule' , 'isChild': node.data.type === 'VFmodule' }">
- <span class="vf-type">{{node.data.type.substring(0,1)}}</span>
- <span class="span-name" [innerHTML]=" isFilterEnabled ? (node.data.name | highlight : filter.value) : (node.data.name)"></span>
- <span class="actions">
- <span class="number-button" *ngIf="isShowNodeCount(node)">
- <span>{{getNodeCount(node)}}</span>
- </span>
- <span class="icon-v" *ngIf="isShowIconV(node)">
- <span ></span>
- </span>
- <span class="icon-plus" *ngIf="isShowIconAdd(node)">
- <span tooltip="Add" [attr.data-tests-id]="'node-'+node.data.name+'-add-btn'" (click)="onClickAdd($event,node)">
- <i class="fa fa-plus-circle" aria-hidden="true"></i>
- </span>
- </span>
- </span>
- </div>
- </ng-template>
- </tree-root>
-
- </div>
-</div>
diff --git a/vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.component.scss b/vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.component.scss
deleted file mode 100644
index 44f94109a..000000000
--- a/vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.component.scss
+++ /dev/null
@@ -1,398 +0,0 @@
-available-models-tree {
- .available-models-tree {
- height: 100%;
- display: flex;
- flex-direction: column;
- line-height: 14px;
- border-right: #D2D2D2 1.5px solid;
- min-width: 340px;
- h5 {
- font-family: OpenSans-Semibold;
- color: #5A5A5A;
- background-color: #F2F2F2;
- margin: 0;
- padding: 15px;
- padding-left: 20px;
- span {
- vertical-align: middle;
- &:first-child {
- font-size: 12px;
- color: #191919;
- }
- }
- }
- .available-models-content-wrapper {
- flex: 1;
- display: flex;
- flex-direction: column;
- padding: 20px;
- background-color: #F2F2F2;
- .search-container {
- margin-bottom: 30px;
- width: 100%;
- display: flex;
- background: #FFFFFF;
- border: 1px solid #D2D2D2;
- border-radius: 2px;
- height: 40px;
- min-width: 40px;
- font-family: OpenSans-Italic;
- color: #959595;
- input {
- flex: 1;
- border: 0;
- padding-left: 10px;
- outline: 0;
- }
- .icon-search {
- display: flex;
- width: 40px;
- &:after {
- content: "\e92e";
- cursor: pointer;
- font-size: 20px;
- font-weight: 600;
- text-align: center;
- display: inline-block;
- flex: auto;
- align-self: center;
- }
- }
- }
- tree-root {
- flex: 1;
- display: flex;
- }
- tree-viewport {
- flex: 1;
- height: auto;
- overflow: auto;
- padding-top: 5px;
- .tree-node {
- color: #5A5A5A;
- font-size: 13px;
- white-space: normal;
- word-break: break-all;
- tree-node-drop-slot {
- .node-drop-slot {
- display: none;
- }
- }
- &.tree-node-disabled {
- color: #D2D2D2;
- cursor: default;
- pointer-events: none;
- }
- &:not(.tree-node-disabled) {
- >tree-node-wrapper {
- .node-wrapper:hover {
- color: #009FDB;
- .node-content-wrapper {
- tree-node-content {
- > div {
- span.actions {
- .number-button {
- span {
- //background-color: #009FDB;
- }
- }
- .icon-plus span:before {
- display: inline-block;
- color: #5A5A5A;
- }
- }
- }
- }
- }
- }
- }
- }
- &.tree-node-focused:not(.tree-node-disabled) {
- & > tree-node-wrapper {
- .node-wrapper {
- color: #009FDB;
- .node-content-wrapper-focused,
- .node-content-wrapper:hover {
- background: none;
- box-shadow: none;
- tree-node-content {
- > div {
- span.actions {
- .number-button {
- span {
- //background-color: #009FDB;
- }
- }
- }
- }
- }
- }
- }
- }
- }
- tree-node-wrapper {
- .node-wrapper {
- height: 36px;
- tree-node-expander {
- font-family: 'icomoon' !important;
- height: 100%;
- .toggle-children-wrapper {
- padding: 0;
- display: block;
- height: 100%;
- span.toggle-children {
- display: flex;
- width: 20px;
- top: 0;
- height: inherit;
- background-image: none;
- &:before {
- content: "\e900";
- font-weight: 600;
- text-align: center;
- display: inline-block;
- flex: auto;
- align-self: center;
- font-size: 20px;
- }
- }
- }
- .toggle-children-wrapper-expanded {
- span.toggle-children {
- transform: none;
- &:before {
- content: "\e930";
- }
- }
- }
- .toggle-children-placeholder {
- width: 20px;
- }
- }
- .node-content-wrapper {
- padding: 0;
- background: none;
- box-shadow: none;
- height: 100%;
- flex: 1;
- min-width: 0;
- border-left: 1px solid #D2D2D2;
- tree-node-content {
- > div {
- height: 100%;
- display: flex;
- align-items: center;
- justify-content: space-between;
- padding-left: 10px;
- span {
- &.actions {
- height: 100%;
- display: flex;
- justify-content: space-between;
- align-items: center;
- >span {
- width: 45px;
- max-width: 45px;
- text-align: center;
- }
- .number-button {
- width: 30px;
- padding-left: 0;
- text-align: center;
- span {
- display: block;
- font-size: 11px;
- }
- }
- .icon-v {
- width: 45px;
- span:before {
- content: "\e932";
- color: #5A5A5A;
- font-size: 16px;
- text-align: center;
- display: inline-block;
- vertical-align: baseline;
- }
- }
- .icon-plus {
- width: 45px;
- span {
- &:before {
- //content: "\e901";
- //fill:#009FDB;
- //color: #009FDB;
- //font-size: 16px;
- //text-align: center;
- //display: none;
- //vertical-align: baseline;
- }
- &:hover:before {
- //color: #009FDB !important;
-
- }
- }
- }
- }
- }
- }
- }
- }
-
- }
- }
- tree-node-children {
- .tree-children {
- padding-left: 20px;
- }
- }
- }
- }
-
- }
- }
-}
-.highlight {
- background-color: #9DD9EF;
-}
-
-#drawing-board-tree{
- .tree-node.tree-node-expanded.tree-node-focused {
- border: 1px solid #009FDB;
- }
-
-}
-
-available-models-tree {
-
- .tree-root {
- margin-top: 35px;
- }
-
- tree-node-expander {
- background: #FFFFFF;
- border: 1px solid #D2D2D2;
- border-right: none;
- width: 45px;
- padding-left: 12px;
- }
-
- .node-content-wrapper {
- border: none;
- }
-
- tree-node-wrapper tree-node-expander{
- background: none !important;
- border: none !important;
- }
-
- tree-node-content div {
- background: white;
- }
-
- .node-wrapper {
- height: 45px !important;
- background: #FFFFFF;
- border: 1px solid #D2D2D2;
- }
-
- tree-node-collection div {
- margin-top: 0px;
- }
-
- .tree-node-leaf .node-wrapper tree-node-expander {
- display: none;
- }
-
- .tree-children {
- padding: 20px;
- }
-
- .tree-node.tree-node-expanded.tree-node-focused {
- border: 1px solid #009FDB;
- }
-
- .tree-node.tree-node-expanded {
- border: 1px solid rgba(128, 128, 128, 0.72);
- margin-bottom: 10px;
- }
-
- .tree-children {
- padding-left: 0;
- }
-
- tree-node-content .actions .number-button {
- height: 45px;
- padding-top: 14px;
- border: 1px solid #D2D2D2;
- padding-left: 0;
- span {
- background: none;
- font-size: 11px;
- color: #5A5A5A;
- }
- }
-
-
-
- .node-content-wrapper.node-content-wrapper-focused tree-node-content div{
- background: #009FDB !important;
- color: white;
-
- .isParent {
- border-left: 1px solid #009FDB;
- }
-
- .number-button span{
- color: white !important;
- }
-
- .icon-v span:before{
- color: white !important;
- }
- }
-
- .vf-type {
- width: 20px;
- height: 45px;
- padding-top: 16px;
- border-right: 1px solid #D2D2D2;
-
- }
-
- .isParent {
- width: 100%;
- padding-left: 5px;
- }
-
- .tree-node-expanded .isChild .vf-type {
- display: none;
- }
-
- .isParent .span-name {
- width: 100%;
- padding-left: 10px;
- }
-
- .toggle-children-wrapper.toggle-children-wrapper-expanded {
- .toggle-children:before {
- color: #009FDB;
- }
- }
-
- .tree-node.tree-node-expanded .tree-children {
- border: 1px solid rgba(128, 128, 128, 0.72);
- }
-
- .tree-node.tree-node-expanded.tree-node-focused .tree-children {
- border: 1px solid #009fdb;
- }
-
- .tree-node-leaf .node-wrapper{
- margin-left: 45px;
- border-left: none;
- }
-}
-
-
-
diff --git a/vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.component.ts b/vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.component.ts
deleted file mode 100644
index 4e5819e4c..000000000
--- a/vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.component.ts
+++ /dev/null
@@ -1,166 +0,0 @@
-import {Component, EventEmitter, Output, ViewChild} from '@angular/core';
-import {ITreeOptions, TreeComponent} from 'angular-tree-component';
-import '../../../../node_modules/angular-tree-component/dist/angular-tree-component.css';
-import {IDType, ITreeNode} from 'angular-tree-component/dist/defs/api';
-import {DialogService} from 'ng2-bootstrap-modal';
-import {AvailableModelsTreeService} from './available-models-tree.service';
-import {NgRedux} from "@angular-redux/store";
-import {ActivatedRoute} from '@angular/router';
-import {AppState} from '../../store/reducers';
-import {AaiService} from '../../services/aaiService/aai.service';
-import {ServicePlanningService} from '../../services/service-planning.service';
-import {VnfPopupComponent} from '../../components/vnf-popup/vnf-popup.components';
-import {ServiceNodeTypes} from '../../shared/models/ServiceNodeTypes';
-import {VfModuleMap} from '../../shared/models/vfModulesMap';
-import {IframeService} from "../../shared/utils/iframe.service";
-import {createVFModuleInstance} from "../../service.actions";
-import {DefaultDataGeneratorService} from "../../shared/services/defaultDataServiceGenerator/default.data.generator.service";
-
-
-@Component({
- selector: 'available-models-tree',
- templateUrl: './available-models-tree.component.html',
- styleUrls: ['./available-models-tree.component.scss']
-})
-
-
-export class AvailableModelsTreeComponent{
-
- serviceModelId: string;
- serviceHierarchy;
- parentElementClassName = 'content';
- _store : NgRedux<AppState>;
- constructor(private _servicePlanningService: ServicePlanningService,
- private _iframeService: IframeService,
- private _aaiService: AaiService,
- private route: ActivatedRoute,
- private dialogService: DialogService,
- private _availableModelsTreeService: AvailableModelsTreeService,
- private _defaultDataGeneratorService: DefaultDataGeneratorService,
- private store: NgRedux<AppState>) {
- this._store = store;
- this.route
- .queryParams
- .subscribe(params => {
- this.serviceModelId = params['serviceModelId'];
- this._aaiService.getServiceModelById(this.serviceModelId).subscribe(
- value => {
- this.serviceHierarchy = value;
- this.nodes = this._servicePlanningService.convertServiceModelToTreeNodes(this.serviceHierarchy);
- },
- error => {
- console.log('error is ', error)
- }
- );
- });
-
- }
-
- @Output()
- highlightInstances: EventEmitter<number> = new EventEmitter<number>();
- @ViewChild('tree') tree: TreeComponent;
-
- nodes = [];
- service = {name: ''};
- isFilterEnabled: boolean = false;
-
- options: ITreeOptions = {
- nodeHeight: 36,
- dropSlotHeight: 0,
- nodeClass: (node: ITreeNode) => {
- if(node.data.type === ServiceNodeTypes.VFmodule && !this.getNodeCount(node.parent))
- {
- node.data.disabled = true;
- return 'tree-node tree-node-disabled';
- }
- node.data.disabled = false;
- return 'tree-node';
- }
- };
-
- expandParentByNodeId(id: IDType): void {
- this.tree.treeModel.getNodeById(id).parent.expand();
- }
-
- searchTree(searchText: string, event: KeyboardEvent): void {
- if (searchText === '') {
- return;
- }
- this.isFilterEnabled = event.key === 'Delete' || event.key === 'Backspace' || searchText.length > 1;
- if (this.isFilterEnabled) {
- let __this = this;
- let results: ITreeNode[] = [];
- this.nodes.forEach(function (node) {
- __this.searchTreeNode(node, searchText, results);
- });
- results.forEach(function (result) {
- __this.expandParentByNodeId(result.id)
- });
- }
- }
-
- searchTreeNode(node, searchText: string, results): void {
- if (node.name.toLowerCase().indexOf(searchText.toLowerCase()) != -1) {
- results.push(node);
- }
- if (node.children != null) {
- for (let i = 0; i < node.children.length; i++) {
- this.searchTreeNode(node.children[i], searchText, results);
- }
- }
- }
-
- selectNode(node: ITreeNode): void {
- node.expand();
- this.highlightInstances.emit(node.data.id);
- }
-
- onClickAdd(e: MouseEvent, node: ITreeNode): void {
- let data = node.data;
- let dynamicInputs = data.dynamicInputs;
- let userProvidedNaming:boolean = data.userProvidedNaming;
- let type:string = data.type;
- if(!this.store.getState().global.flags['FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD']|| node.data.type === ServiceNodeTypes.VF || this._availableModelsTreeService.shouldOpenDialog(type, dynamicInputs, userProvidedNaming)) {
- this._iframeService.addClassOpenModal(this.parentElementClassName);
- this.dialogService.addDialog(VnfPopupComponent, {
- serviceModelId: this.serviceModelId,
- parentModelName: node.parent && node.parent.data.name,
- modelName: data.name,
- modelType: type,
- dynamicInputs: dynamicInputs,
- userProvidedNaming: userProvidedNaming,
- isNewVfModule : true
- });
- }
- else {
- let vfModule = this._defaultDataGeneratorService.generateVFModule(this.serviceHierarchy, node.parent.data.name, node.data.name);
- this.store.dispatch(createVFModuleInstance(vfModule, node.data.name, this.serviceModelId));
- }
- e.preventDefault();
- e.stopPropagation();
- }
-
- getNodeCount(node: ITreeNode): number {
- let modelName: string = node.data.name;
- if (ServicePlanningService.isVfModule(node)) {
- let parentVnfModelName = node.parent.data.name;
- let vfModuleMap: VfModuleMap = this._servicePlanningService.getVfModuleMap(this.serviceModelId, parentVnfModelName, modelName);
- return vfModuleMap ? Object.keys(vfModuleMap).length : 0;
- } else if (ServicePlanningService.isVnf(node)) {
- let vnfInstance = this._servicePlanningService.getVnfInstance(this.serviceModelId, modelName);
- return vnfInstance ? 1 : 0;
- }
- }
-
- isShowIconV(node: ITreeNode): boolean {
- return this.getNodeCount(node) > 0;
- }
-
- isShowNodeCount(node: ITreeNode): boolean {
- return this.getNodeCount(node) > 0;
- }
-
- isShowIconAdd(node: ITreeNode): boolean {
- return this._availableModelsTreeService.shouldShowAddIcon(node, this.store.getState().service.serviceHierarchy, this.serviceModelId, this.getNodeCount(node));
- }
-}
diff --git a/vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.service.ts b/vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.service.ts
deleted file mode 100644
index 57dc4b409..000000000
--- a/vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.service.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-import {Injectable} from '@angular/core';
-import * as _ from "lodash";
-import {ServicePlanningService} from "../../services/service-planning.service";
-
-@Injectable()
-export class AvailableModelsTreeService {
- constructor(private _servicePlanningService: ServicePlanningService) {
- }
-
- shouldShowAddIcon(node: any, serviceHierarchy: any, serviceModelId: string, currentNodeCount: number): boolean {
- let maxNodes: number = 1;
- if (node.data.children !== null && node.data.children.length == 0) {
- let vnfModules = serviceHierarchy[serviceModelId].vfModules;
- if (vnfModules[node.data.name]) {
- maxNodes = vnfModules[node.data.name].properties.maxCountInstances || 1;
- }
- }
- return !node.data.disabled && currentNodeCount < maxNodes
- }
-
- shouldOpenDialog(type: string, dynamicInputs: any, userProvidedNaming: boolean): boolean {
- if (userProvidedNaming || this._servicePlanningService.requiredFields[type].length > 0) {
- return true;
- }
-
- if (dynamicInputs) {
- for(let input of dynamicInputs) {
- if (input.isRequired && _.isEmpty(input.value)) {
- return true;
- }
- }
- }
- return false;
- }
-
-}
diff --git a/vid-webpack-master/src/app/drawingBoard/drawing-board-header/drawing-board-header.component.html b/vid-webpack-master/src/app/drawingBoard/drawing-board-header/drawing-board-header.component.html
deleted file mode 100644
index 7d0f7f456..000000000
--- a/vid-webpack-master/src/app/drawingBoard/drawing-board-header/drawing-board-header.component.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<div class="drawing-board-header">
- <div class="left-header">
- <span [attr.data-tests-id]="'backBtn'" class="icon-back" (click)="closePage()"></span>
- <span [attr.data-tests-id]="'serviceInstance'" class="service-instance-label">Service instance:</span>
- <span [attr.data-tests-id]="'serviceName'" class="service-instance-name">{{serviceName}}</span>
- <span class="quantity-container" style=" padding: 10px;font-size: 13px;" tooltip="Number of services to instantiate including all their objects as defined below">
- <span [attr.data-tests-id]="'quantityLabel'" class="quantity-label" >Scale Times:</span>
- <span [attr.data-tests-id]="'servicesQuantity'" class="quantity" style="font-family: OpenSans-Semibold;font-size: 14px;"> {{numServicesToDeploy}} </span>
- </span>
- <span class="service-instance-label">status:</span>
- <span [attr.data-tests-id]="'serviceStatus'" class="status">{{status}}</span>
- </div>
- <div class="right-header">
- <span class="menu-container">
- <span [attr.data-tests-id]="'openMenuBtn'" class="icon-browse" (click)="onContextMenu($event)"></span>
- <context-menu>
- <ng-template contextMenuItem (execute)="editService()">
- <div [attr.data-tests-id]="'context-menu-header-edit-item'">
- <span class="icon-edit"></span>
- Edit
- </div>
- </ng-template>
- <ng-template contextMenuItem (execute)="closePage()">
- <div [attr.data-tests-id]="'context-menu-header-delete-item'">
- <span class="icon-trash"></span>
- Delete
- </div>
- </ng-template>
- </context-menu>
- </span>
- <button [disabled]="false" [attr.data-tests-id]="'deployBtn'" (click)="deployMacroservice()" class="deploy-btn">DEPLOY</button>
- </div>
-</div>
diff --git a/vid-webpack-master/src/app/drawingBoard/drawing-board-header/drawing-board-header.component.scss b/vid-webpack-master/src/app/drawingBoard/drawing-board-header/drawing-board-header.component.scss
deleted file mode 100644
index 29b7711bc..000000000
--- a/vid-webpack-master/src/app/drawingBoard/drawing-board-header/drawing-board-header.component.scss
+++ /dev/null
@@ -1,95 +0,0 @@
-.drawing-board-header {
- height: 56px;
- margin-bottom: 4px;
- position: relative;
- font-family: OpenSans-Regular;
- display: flex;
- justify-content: space-between;
- font-size: 14px;
- box-shadow: 2px 2px 6px #D2D2D2;
- color: #191919;
- [class^="icon-"] {
- height: 56px;
- width: 56px;
- display: flex;
- align-items: center;
- text-align: center;
- color: #5A5A5A;
- cursor: pointer;
- &:before {
- font-size: 18px;
- width: 100%;
- }
- &:hover:before {
- color: #009FDB;
- }
- }
- .left-header {
- display: flex;
- align-items: center;
- .icon-back {
- border-right: 1px solid #EAEAEA;
- &:before {
- content: "\e906";
- font-size: 24px;
- }
- }
- .service-instance-label {
- padding: 0 5px;
- font-family: OpenSans-Regular;
- font-size: 13px;
- color: #191919;
- }
- .service-instance-name {
- padding-right: 20px;
- color: #191919;
- font-family: OpenSans-Semibold;
- background-color: white;
- font-size: 16px
- }
- .status {
- font-family: OpenSans-Semibold;
- line-height: 14px;
- font-size: 14px;
- }
- }
- .right-header {
- display: flex;
- align-items: center;
- .quantity-container {
- .quantity-label {
- padding-left: 10px;
- font-family: OpenSans-Semibold;
- font-size: 12px;
- }
- .quantity {
- padding: 5px 10px 5px 0;
- font-family: OpenSans-Semibold;
- font-size: 18px;
- }
- }
- [class^="icon-"] {
- border-left: 1px solid #EAEAEA;
- }
- .menu-container {
- height: 100%;
- display: flex;
- background: none;
- border: none;
- padding: 0;
- outline: none;
- }
- .icon-browse:before {
- content: '\e924';
- display: inline-block;
- font-size: 24px;
- }
- .deploy-btn {
- color: #FFFFFF ;
- background: #009fdb;
- width: 128px;
- height: 100%;
- border: none;
- }
- }
-}
diff --git a/vid-webpack-master/src/app/drawingBoard/drawing-board-header/drawing-board-header.component.ts b/vid-webpack-master/src/app/drawingBoard/drawing-board-header/drawing-board-header.component.ts
deleted file mode 100644
index 38284e214..000000000
--- a/vid-webpack-master/src/app/drawingBoard/drawing-board-header/drawing-board-header.component.ts
+++ /dev/null
@@ -1,119 +0,0 @@
-import {Component, ViewChild} from '@angular/core';
-import {ContextMenuComponent, ContextMenuService} from 'ngx-contextmenu';
-import {DialogService} from 'ng2-bootstrap-modal';
-import {ServicePopupComponent} from '../../components/service-popup/service-popup.component';
-import {MsoService} from '../../services/msoService/mso.service'
-import * as _ from 'lodash';
-import {ActivatedRoute} from '@angular/router';
-import {ServiceInstance} from "../../shared/models/serviceInstance";
-import {OwningEntity} from "../../shared/models/owningEntity";
-import {MessageBoxData, ModalSize, ModalType} from "../../shared/components/messageBox/messageBox.data";
-import {MessageBoxService} from "../../shared/components/messageBox/messageBox.service";
-import {NgRedux} from "@angular-redux/store";
-import {AppState} from "../../store/reducers";
-import {IframeService} from "../../shared/utils/iframe.service";
-
-@Component({
- selector: 'drawing-board-header',
- providers: [MsoService],
- templateUrl: './drawing-board-header.component.html',
- styleUrls: ['./drawing-board-header.component.scss']
-})
-
-export class DrawingBoardHeader {
- serviceName: string;
- numServicesToDeploy: number;
- status: string = 'Designing a new service';
- serviceModelId: string;
- parentElementClassName = 'content';
-
- constructor(private _contextMenuService: ContextMenuService, private dialogService: DialogService,
- private _iframeService : IframeService,
- private route: ActivatedRoute, private msoService: MsoService,
- private store: NgRedux<AppState>) {
- this.route
- .queryParams
- .subscribe(params => {
- this.serviceModelId = params['serviceModelId'];
- if (_.has(this.store.getState().service.serviceHierarchy, this.serviceModelId)) {
- this.setValuesFromStore();
- this.store.subscribe(() => {
- this.setValuesFromStore();
- });
- }
- });
- }
-
-
- @ViewChild(ContextMenuComponent) public contextMenu: ContextMenuComponent;
-
- public onContextMenu($event: MouseEvent, item: any): void {
- this._contextMenuService.show.next({
- contextMenu: this.contextMenu,
- event: $event,
- item: item,
- });
- $event.preventDefault();
- $event.stopPropagation();
- }
-
- private setValuesFromStore() {
- const serviceInstance = this.store.getState().service.serviceInstance[this.serviceModelId];
- this.numServicesToDeploy = serviceInstance.bulkSize;
- this.serviceName = serviceInstance.instanceName || '<Automatically Assigned>';
-
- }
-
- public editService(): void {
- this._iframeService.addClassOpenModal(this.parentElementClassName);
- this.dialogService.addDialog(ServicePopupComponent, {})
-
- }
-
-
- extractOwningEntityNameAccordingtoId(id:String): string {
- let owningEntityName;
- _.forEach(this.store.getState().service.categoryParameters.owningEntityList,function(owningEntity: OwningEntity) {
- if (owningEntity.id === id) {
- owningEntityName = owningEntity.name;
-
- }})
-
- return owningEntityName;
- }
-
- extractServiceFields(): any {
- let instanceFields : ServiceInstance;
- instanceFields = this.store.getState().service.serviceInstance[Object.keys(this.store.getState().service.serviceInstance)[0]];
- instanceFields.subscriberName = this.store.getState().service.subscribers.find(sub => sub.id === instanceFields.globalSubscriberId).name;
- instanceFields.owningEntityName = this.extractOwningEntityNameAccordingtoId(instanceFields.owningEntityId);
- return instanceFields;
- }
-
- public deployMacroservice(): void {
- var instanceFields = this.extractServiceFields();
- instanceFields.rollbackOnFailure = instanceFields.rollbackOnFailure === 'true';
- this.msoService.submitMsoTask(instanceFields).subscribe((result) => {
- window.parent.postMessage("navigateToInstantiationStatus", '*');
- })
- }
-
- closePage() {
- let messageBoxData : MessageBoxData = new MessageBoxData(
- "Delete Instantiation", // modal title
- "You are about to stop the instantiation process of this service. \nAll data will be lost. Are you sure you want to stop?",
-
- ModalType.alert,
- ModalSize.medium,
- [
- {text:"Stop Instantiation", size:"large", callback: this.navigate.bind(this), closeModal:true},
- {text:"Cancel", size:"medium", closeModal:true}
- ]);
-
- MessageBoxService.openModal.next(messageBoxData);
- }
-
- navigate(){
- window.parent.postMessage("navigateTo", "*");
- }
-}
diff --git a/vid-webpack-master/src/app/drawingBoard/drawing-board-tree/drawing-board-tree.component.ts b/vid-webpack-master/src/app/drawingBoard/drawing-board-tree/drawing-board-tree.component.ts
deleted file mode 100644
index 6b717a930..000000000
--- a/vid-webpack-master/src/app/drawingBoard/drawing-board-tree/drawing-board-tree.component.ts
+++ /dev/null
@@ -1,133 +0,0 @@
-import {AfterViewInit, Component, EventEmitter, OnInit, Output, ViewChild} from '@angular/core';
-import { ContextMenuService } from 'ngx-contextmenu';
-import { Constants } from '../../shared/utils/constants';
-import {ServicePlanningService} from "../../services/service-planning.service";
-import {ITreeNode} from "angular-tree-component/dist/defs/api";
-import {ITreeOptions, TreeComponent} from "angular-tree-component";
-import {VnfPopupComponent} from "../../components/vnf-popup/vnf-popup.components";
-import {DialogService} from "ng2-bootstrap-modal";
-import {ActivatedRoute} from "@angular/router";
-import {NgRedux} from "@angular-redux/store";
-import {AppState} from "../../store/reducers";
-import { MessageBoxData, ModalSize, ModalType } from '../../shared/components/messageBox/messageBox.data';
-import { MessageBoxService } from '../../shared/components/messageBox/messageBox.service';
-import { deleteVnfInstance, deleteVfModuleInstance } from '../../service.actions';
-import { isNullOrUndefined } from 'util';
-import {IframeService} from "../../shared/utils/iframe.service";
-
-
-@Component({
- selector: 'drawing-board-tree',
- templateUrl: './drawing-board-tree.html',
- styleUrls : ['./drawing-board-tree.scss']
-})
-
-
-export class DrawingBoardTreeComponent implements OnInit, AfterViewInit {
- constructor(private _contextMenuService: ContextMenuService,
- private _servicePlanningService: ServicePlanningService,
- private _iframeService : IframeService,
- private dialogService: DialogService,
- private store: NgRedux<AppState>,
- private route: ActivatedRoute) {
- this.route
- .queryParams
- .subscribe(params => {
- this.serviceModelId = params['serviceModelId'];
- });
- }
-
- @Output()
- highlightNode : EventEmitter<number> = new EventEmitter<number>();
-
- @ViewChild('tree') tree: TreeComponent;
- missingDataTooltip: string = Constants.Error.MISSING_VNF_DETAILS;
- currentNode: ITreeNode = null; //
- nodes = [];
- serviceModelId: string;
- options: ITreeOptions = {
- nodeHeight: 45,
- dropSlotHeight: 1
- };
- parentElementClassName = 'content';
-
- ngOnInit(): void {
- this.store.subscribe(() => {this.updateTree()});
- this.updateTree()
- }
-
- updateTree() {
- const serviceInstance = this.store.getState().service.serviceInstance[this.serviceModelId];
- this.nodes = this._servicePlanningService.convertServiceInstanceToTreeData(serviceInstance, this.serviceModelId);
- }
-
- ngAfterViewInit():void {
- // Expand drawing tree on init.
- this.tree.treeModel.expandAll();
- }
-
- public onContextMenu($event: MouseEvent, node: ITreeNode): void {
- this.currentNode = node;
- node.focus();
- node.setActiveAndVisible(false);
- this.selectNode(node);
- this._contextMenuService.show.next({
- event: <any>$event,
- item: node,
- });
- $event.preventDefault();
- $event.stopPropagation();
- }
-
- public editItem(node: ITreeNode): void {
- node = this.currentNode;
- this._iframeService.addClassOpenModal(this.parentElementClassName);
- this.dialogService.addDialog(VnfPopupComponent, {
- serviceModelId: this.serviceModelId,
- modelName: node.data.modelName,
- modelType: node.data.type,
- parentModelName: node.parent.data.modelName,
- isNewVfModule : false
- })
- }
-
- public deleteItem(node: ITreeNode): void {
- if(this.currentNode.data.type === 'VF'){
- if(!isNullOrUndefined(this.currentNode.data.children) && this.currentNode.data.children.length === 0){
- this.store.dispatch(deleteVnfInstance(this.currentNode.data.modelName, this.serviceModelId));
- }else {
- let messageBoxData : MessageBoxData = new MessageBoxData(
- "Remove VNF", // modal title
- "You are about to remove this VNF and all its children from this service. Are you sure you want to remove it?",
-
- ModalType.alert,
- ModalSize.medium,
- [
- {text:"Remove VNF", size:"large", callback: this.removeVnf.bind(this), closeModal:true},
- {text:"Don’t Remove", size:"medium", closeModal:true}
- ]);
-
- MessageBoxService.openModal.next(messageBoxData);
- }
- }else {
- this.store.dispatch(deleteVfModuleInstance(this.currentNode.data.modelName, this.serviceModelId, node.parent.data.modelName));
- }
- }
-
- removeVnf() {
- this.store.dispatch(deleteVnfInstance(this.currentNode.data.modelName, this.serviceModelId));
- }
-
- public selectNode(node: ITreeNode): void {
- node.expand();
- this.highlightNode.emit(node.data.modelId);
- }
-
- isDataMissing(node: ITreeNode) {
- //todo: currently not showing the alert icon. will be implemented in upcoming story.
- return false;
- }
-
-}
-
-
diff --git a/vid-webpack-master/src/app/drawingBoard/drawing-board-tree/drawing-board-tree.html b/vid-webpack-master/src/app/drawingBoard/drawing-board-tree/drawing-board-tree.html
deleted file mode 100644
index c4061db9e..000000000
--- a/vid-webpack-master/src/app/drawingBoard/drawing-board-tree/drawing-board-tree.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<div class="drawing-board-tree">
- <div *ngIf="nodes?.length == 0" style="text-align: center; margin-top: 50px;">
- <no-content-message-and-icon class="span-over"
- data-title="Please add objects (VNFs, network, modules etc.) from the left tree to design the service instance"
- subtitle="Once done, click Deploy to start instantiation"
- iconPath="./assets/img/UPLOAD.svg"
- iconClass="upload-icon-service-planing"></no-content-message-and-icon>
- </div>
- <tree-root [attr.data-tests-id]="'drawing-board-tree'" #tree [nodes]="nodes" [options]="options" id="drawing-board-tree">
- <ng-template #treeNodeTemplate let-node let-index="index">
- <div [attr.data-tests-id]="'node-'+node.data.modelId +'-' +node.data.modelName" (click)="selectNode(node)">
- <div class="model-info">
- <span>
- <span class="property-name">{{node.data.type}}{{node.data.name ? ': ': ''}}<span class="auto-name">{{node.data.name? node.data.name: ''}}</span></span>
- </span>
- </div>
- <div class="model-actions">
- <span class="icon-browse" [attr.data-tests-id]="'node-'+node.data.modelId +'-' +node.data.modelName+'-menu-btn'" (click)="onContextMenu($event, node)" >
- <context-menu>
- <ng-template contextMenuItem (execute)="editItem(node)">
- <div [attr.data-tests-id]="'context-menu-item'">
- <span class="icon-edit"></span>
- Edit
- </div>
- </ng-template>
- <ng-template contextMenuItem (execute)="deleteItem(node)">
- <div>
- <span class="icon-trash"></span>
- Remove
- </div>
- </ng-template>
- </context-menu>
- </span>
- <span *ngIf="isDataMissing(node)" class="icon-alert" tooltip="{{ missingDataTooltip }}" tooltipPlacement="left" [attr.data-tests-id]="'node-'+node.data.modelId +'-' +node.data.modelName+'-alert-icon'"></span>
- </div>
- </div>
-
- </ng-template>
- </tree-root>
-</div>
-
-
diff --git a/vid-webpack-master/src/app/drawingBoard/drawingBoard.module.ts b/vid-webpack-master/src/app/drawingBoard/drawingBoard.module.ts
index 41efbe0e8..6a3574f23 100644
--- a/vid-webpack-master/src/app/drawingBoard/drawingBoard.module.ts
+++ b/vid-webpack-master/src/app/drawingBoard/drawingBoard.module.ts
@@ -1,41 +1,86 @@
-import { AvailableModelsTreeService } from './available-models-tree/available-models-tree.service';
-import { NgModule } from '@angular/core';
-import { HighlightPipe } from '../shared/pipes/highlight-filter.pipe';
-import { TreeModule } from 'angular-tree-component';
-import { BrowserModule } from '@angular/platform-browser';
-import { TooltipModule } from 'ngx-tooltip';
-import { AvailableModelsTreeComponent } from './available-models-tree/available-models-tree.component';
-import { ServicePlanningService } from '../services/service-planning.service';
-import { AaiService } from '../services/aaiService/aai.service';
-import { DrawingBoardTreeComponent } from './drawing-board-tree/drawing-board-tree.component';
-import { SharedModule } from '../shared/shared.module';
-import { ContextMenuModule, ContextMenuService } from 'ngx-contextmenu';
-import { CommonModule } from '@angular/common';
-import { DrawingBoardHeader } from './drawing-board-header/drawing-board-header.component';
-import { ServicePlanningComponent, ServicePlanningEmptyComponent } from './service-planning/service-planning.component';
+import {AvailableModelsTreeService} from './service-planning/available-models-tree/available-models-tree.service';
+import {HighlightPipe} from '../shared/pipes/highlight/highlight-filter.pipe';
+import {TreeModule} from 'angular-tree-component';
+import {BrowserModule} from '@angular/platform-browser';
+import {TooltipModule} from 'ngx-tooltip';
+import {AvailableModelsTreeComponent} from './service-planning/available-models-tree/available-models-tree.component';
+import {AaiService} from '../shared/services/aaiService/aai.service';
+import {DrawingBoardTreeComponent} from './service-planning/drawing-board-tree/drawing-board-tree.component';
+import {SharedModule} from '../shared/shared.module';
+import {ContextMenuModule, ContextMenuService} from 'ngx-contextmenu';
+import {CommonModule} from '@angular/common';
+import {DrawingBoardHeader} from './service-planning/drawing-board-header/drawing-board-header.component';
+import {ServicePlanningComponent, ServicePlanningEmptyComponent} from './service-planning/service-planning.component';
+import {DuplicateVnfComponent} from './service-planning/duplicate/duplicate-vnf.component';
+import {DuplicateService} from './service-planning/duplicate/duplicate.service';
+import {FormsModule} from '@angular/forms';
+import {DrawingBoardTreeService} from "./service-planning/drawing-board-tree/drawing-board-tree.service";
+import {DrawingBoardHeaderService} from "./service-planning/drawing-board-header/drawing-board-header.service";
+import {TreeNodeHeaderPropertiesComponent} from "./service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component";
+import {SafePipe} from "../shared/pipes/safe/safe.pipe";
+import {FeatureFlagModule} from "../featureFlag/featureFlag.module";
+import {DynamicInputsService} from "./service-planning/objectsToTree/dynamicInputs.service";
+import {InstanceTreeGenerator} from "./service-planning/drawing-board-tree/instance.tree.generator";
+import {SharedTreeService} from "./service-planning/objectsToTree/shared.tree.service";
+import {ObjectToModelTreeService} from "./service-planning/objectsToTree/objectToModelTree/objectToModelTree.service";
+import {ObjectToInstanceTreeService} from "./service-planning/objectsToTree/objectToInstanceTree/objectToInstanceTree.service";
+import {ObjectToTreeService} from "./service-planning/objectsToTree/objectToTree.service";
+import {SearchComponent} from "./service-planning/search/search.component";
+import {SdcUiComponentsModule} from "onap-ui-angular";
+import {DrawingBoardPermissions} from "./guards/servicePlanningGuard/drawingBoardGuard";
+import {NgModule} from '@angular/core';
+import {DragAndDropService} from "./service-planning/drawing-board-tree/dragAndDrop/dragAndDrop.service";
+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";
+
@NgModule({
imports: [
TreeModule,
BrowserModule,
ContextMenuModule,
+ FormsModule,
TooltipModule,
CommonModule,
- SharedModule.forRoot()],
+ SdcUiComponentsModule,
+ SharedModule.forRoot(),
+ FeatureFlagModule.forRoot()],
providers: [
- ServicePlanningService,
AaiService,
- AvailableModelsTreeService ,
+ ObjectToTreeService,
+ AvailableModelsTreeService,
ContextMenuService,
- ServicePlanningService],
+ DuplicateService,
+ DrawingBoardTreeService,
+ DrawingBoardHeaderService,
+ DrawingBoardPermissions,
+ SafePipe,
+ ObjectToInstanceTreeService,
+ ObjectToModelTreeService,
+ DynamicInputsService,
+ InstanceTreeGenerator,
+ SharedTreeService,
+ SdcUiServices.ModalService,
+ SdcUiServices.LoaderService,
+ CreateDynamicComponentService,
+ ComponentInfoService,
+ DragAndDropService],
declarations: [
AvailableModelsTreeComponent,
HighlightPipe,
DrawingBoardTreeComponent,
DrawingBoardHeader,
ServicePlanningComponent,
- ServicePlanningEmptyComponent],
- exports: [ AvailableModelsTreeComponent, DrawingBoardTreeComponent, DrawingBoardHeader]
+ ServicePlanningEmptyComponent,
+ DuplicateVnfComponent,
+ TreeNodeHeaderPropertiesComponent,
+ SearchComponent,
+ ComponentInfoComponent],
+ entryComponents: [DuplicateVnfComponent],
+ exports: [AvailableModelsTreeComponent, DrawingBoardTreeComponent, DrawingBoardHeader, TreeNodeHeaderPropertiesComponent, SearchComponent]
})
-export class DrawingBoardModule { }
+export class DrawingBoardModule {
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/drawingBoard.routing.ts b/vid-webpack-master/src/app/drawingBoard/drawingBoard.routing.ts
new file mode 100644
index 000000000..0c1fa700c
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/drawingBoard.routing.ts
@@ -0,0 +1,63 @@
+import {Route} from '@angular/router';
+import {ServicePlanningComponent, ServicePlanningEmptyComponent} from "./service-planning/service-planning.component";
+import {FlagsResolve} from "../shared/resolvers/flag/flag.resolver";
+import {ViewEditResolver} from "../shared/resolvers/viewEdit/viewEdit.resolver";
+import {DrawingBoardGuard} from "./guards/servicePlanningGuard/drawingBoardGuard";
+import {RetryResolver} from "../shared/resolvers/retry/retry.resolver";
+
+export const DrawingBoardRoutes: Route[] = [
+ {
+ path: 'servicePlanning',
+ children: [
+ {
+ path: 'EDIT',
+ component: ServicePlanningComponent,
+ resolve: {
+ flags: FlagsResolve,
+ viewEditResolver: ViewEditResolver
+ },
+ canActivate: [DrawingBoardGuard]
+ },
+ {
+ path: 'VIEW',
+ component: ServicePlanningComponent,
+ resolve: {
+ flags: FlagsResolve,
+ viewEditResolver: ViewEditResolver
+ }
+ },
+ {
+ path: 'RETRY_EDIT',
+ component: ServicePlanningComponent,
+ resolve: {
+ flags: FlagsResolve,
+ viewEditResolver: RetryResolver
+ },
+ canActivate: [DrawingBoardGuard]
+ },
+ {
+ path: 'RETRY',
+ component: ServicePlanningComponent,
+ resolve: {
+ flags: FlagsResolve,
+ viewEditResolver: RetryResolver
+ }
+ },
+ {
+ path: '',
+ component: ServicePlanningComponent,
+ resolve: {
+ flags: FlagsResolve
+ },
+ }
+ ]
+ },
+ {
+ path: 'servicePlanningEmpty',
+ component: ServicePlanningEmptyComponent,
+ resolve: {
+ flags: FlagsResolve,
+ }
+ },
+];
+
diff --git a/vid-webpack-master/src/app/drawingBoard/guards/servicePlanningGuard/drawingBoardGuard.ts b/vid-webpack-master/src/app/drawingBoard/guards/servicePlanningGuard/drawingBoardGuard.ts
new file mode 100644
index 000000000..4a305b193
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/guards/servicePlanningGuard/drawingBoardGuard.ts
@@ -0,0 +1,56 @@
+import {Injectable} from "@angular/core";
+import {CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router} from "@angular/router";
+import {NgRedux} from "@angular-redux/store";
+import {Observable} from "rxjs";
+import {HttpClient} from "@angular/common/http";
+import {AppState} from "../../../shared/store/reducers";
+import {updateDrawingBoardStatus} from "../../../shared/storeUtil/utils/global/global.actions";
+import {DrawingBoardModes} from "../../service-planning/drawing-board.modes";
+import {of} from "rxjs";
+
+@Injectable()
+export class DrawingBoardGuard implements CanActivate {
+ constructor(private store: NgRedux<AppState>, private _http: HttpClient, private _router : Router) { }
+ canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
+ let url : string = `/vid/roles/service_permissions?subscriberId=${next.queryParams['subscriberId']}&serviceType=${next.queryParams['serviceType']}`;
+ const viewMode = state.url.includes(DrawingBoardModes.RETRY_EDIT)? DrawingBoardModes.RETRY: DrawingBoardModes.VIEW;
+ return this._http.get(url)
+ .map((result : DrawingBoardPermissions) => {
+ if(!result.isEditPermitted){
+ this.navigateToNewViewEdit(next.queryParams, viewMode);
+ return false;
+ }else {
+ return true;
+ }
+ }).catch(err => {
+ this.navigateToNewViewEdit(next.queryParams, viewMode);
+ return of(false);
+ });
+ }
+
+ navigateToNewViewEdit(queryParams: any, mode: DrawingBoardModes): void{
+ this.store.dispatch(updateDrawingBoardStatus(mode));
+ const viewEditUrlTree = this.getNewViewEditUrlTree(queryParams, mode);
+ this._router.navigateByUrl(viewEditUrlTree);
+ window.parent.location.assign('../../serviceModels.htm#'+viewEditUrlTree.toString());
+ }
+
+ getNewViewEditUrlTree(queryParams: any, mode: DrawingBoardModes) {
+ return this._router.createUrlTree(
+ ['/servicePlanning/' + mode],
+ {
+ queryParams:
+ {
+ serviceModelId: queryParams['serviceModelId'],
+ serviceInstanceId: queryParams['serviceInstanceId'],
+ serviceType : queryParams['serviceType'],
+ subscriberId : queryParams['subscriberId'],
+ jobId : queryParams['jobId'],
+ }
+ });
+ }
+}
+
+export class DrawingBoardPermissions {
+ isEditPermitted : boolean
+}
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
new file mode 100644
index 000000000..91acca0d1
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.component.html
@@ -0,0 +1,47 @@
+<div class="available-models-tree" style="height: calc(100vh - 55px);">
+ <div class="models-tree-header">
+ <h5>
+ <span class="main" >MODEL <span class="sub-title">(from SDC)</span>:</span>
+ <span id="service-model-name">{{service | serviceInfo: _store: serviceModelId : 'name'}}</span>
+ </h5>
+ <search-component (updateNodes)="updateNodes($event)"
+ [nodes]="nodes" [tree]="tree? tree: {}"
+ [inputTestId]="'search-left-tree'"
+ *ngIf="nodes?.length > 0"></search-component>
+ </div>
+ <div class="available-models-content-wrapper" *ngIf="nodes?.length > 0" >
+ <tree-root #tree [attr.data-tests-id]="'available-models-tree'" [nodes]="nodes" [options]="options" id="available-models-tree">
+ <ng-template #treeNodeTemplate let-node let-index="index">
+ <div [attr.data-tests-id]="'node-'+node.data.name" (click)="selectNode(node)" [ngClass]="{'selected': index , 'isParent': node.data.type !== 'VFmodule' , 'isChild': node.data.type === 'VFmodule' }">
+ <span class="vf-type" title="{{node.data.type}}" [attr.data-tests-id]="'node-type-indicator'" >{{node?.data?.typeName}}</span>
+ <div class="model-info">
+ <span class="header-info">
+ <span class="property-name">
+ <span class="auto-name"
+ [innerHtml]="getNodeName(node, filterValue) | safe : 'html'"
+ [attr.data-tests-id]="'node-name'"
+ ></span>
+ </span>
+ </span>
+ </div>
+ <span class="actions">
+ <span class="number-button" *ngIf="node.data.getNodeCount(node, serviceModelId) > 0">
+ <span [attr.data-tests-id]="'numberButton'">{{node.data.getNodeCount(node, this.serviceModelId)}}</span>
+ </span>
+ <span class="icon-v" *ngIf="node?.data?.showNodeIcons(node, serviceModelId)?.vIcon">
+ <svg-icon
+ [mode]="'secondary'"
+ [name]="'maximum'">
+ </svg-icon>
+ </span>
+ <span class="icon-plus" *ngIf="node?.data?.showNodeIcons(node, serviceModelId)?.addIcon">
+ <span tooltip="Add" [attr.data-tests-id]="'node-'+node.data.name+'-add-btn'" (click)="onClickAdd(node, serviceModelId)">
+ <i class="fa fa-plus-circle" aria-hidden="true"></i>
+ </span>
+ </span>
+ </span>
+ </div>
+ </ng-template>
+ </tree-root>
+ </div>
+</div>
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
new file mode 100644
index 000000000..90c2cd878
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.component.scss
@@ -0,0 +1,506 @@
+.tree-children.tree-children-no-padding { padding-left: 0 }
+.tree-children { padding-left: 20px; overflow: hidden }
+.node-drop-slot { display: block; height: 2px }
+.node-drop-slot.is-dragging-over { background: #ddffee; height: 20px; border: 2px dotted #888; }
+.toggle-children-wrapper-expanded .toggle-children { transform: rotate(90deg) }
+.toggle-children-wrapper-collapsed .toggle-children { transform: rotate(0); }
+.toggle-children-wrapper {
+ padding: 2px 3px 5px 1px;
+}
+/* tslint:disable */
+.toggle-children {
+ background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAASCAYAAABSO15qAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABAhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDY3IDc5LjE1Nzc0NywgMjAxNS8wMy8zMC0yMzo0MDo0MiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ1dWlkOjY1RTYzOTA2ODZDRjExREJBNkUyRDg4N0NFQUNCNDA3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkYzRkRFQjcxODUzNTExRTU4RTQwRkQwODFEOUZEMEE3IiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkYzRkRFQjcwODUzNTExRTU4RTQwRkQwODFEOUZEMEE3IiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChNYWNpbnRvc2gpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MTk5NzA1OGEtZDI3OC00NDZkLWE4ODgtNGM4MGQ4YWI1NzNmIiBzdFJlZjpkb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6YzRkZmQxMGMtY2NlNS0xMTc4LWE5OGQtY2NkZmM5ODk5YWYwIi8+IDxkYzp0aXRsZT4gPHJkZjpBbHQ+IDxyZGY6bGkgeG1sOmxhbmc9IngtZGVmYXVsdCI+Z2x5cGhpY29uczwvcmRmOmxpPiA8L3JkZjpBbHQ+IDwvZGM6dGl0bGU+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+5iogFwAAAGhJREFUeNpiYGBgKABigf///zOQg0EARH4A4gZyDIIZ8B/JoAJKDIDhB0CcQIkBRBtEyABkgxwoMQCGD6AbRKoBGAYxQgXIBRuZGKgAKPIC3QLxArnRSHZCIjspk52ZKMrOFBUoAAEGAKnq593MQAZtAAAAAElFTkSuQmCC');
+ height: 8px;
+ width: 9px;
+ background-size: contain;
+ display: inline-block;
+ position: relative;
+ top: 1px;
+ background-repeat: no-repeat;
+ background-position: center;
+}
+.toggle-children-placeholder {
+ display: inline-block;
+ height: 10px;
+ width: 10px;
+ position: relative;
+ top: 1px;
+ padding-right: 3px;
+}
+.node-content-wrapper {
+ display: inline-block;
+ padding: 2px 5px;
+ border-radius: 2px;
+ transition: background-color .15s,box-shadow .15s;
+}
+.node-wrapper {display: flex; align-items: flex-start;}
+.node-content-wrapper-active,
+.node-content-wrapper.node-content-wrapper-active:hover,
+.node-content-wrapper-active.node-content-wrapper-focused {
+ background: #beebff;
+}
+.node-content-wrapper-focused { background: #e7f4f9 }
+.node-content-wrapper:hover { background: #f7fbff }
+.node-content-wrapper-active, .node-content-wrapper-focused, .node-content-wrapper:hover {
+ box-shadow: inset 0 0 1px #999;
+}
+.node-content-wrapper.is-dragging-over { background: #ddffee; box-shadow: inset 0 0 1px #999; }
+.node-content-wrapper.is-dragging-over-disabled { opacity: 0.5 }
+
+tree-viewport {
+ height: 100%;
+ overflow: auto;
+ display: block;
+}
+.tree-children { padding-left: 20px }
+.empty-tree-drop-slot .node-drop-slot { height: 20px; min-width: 100px }
+.angular-tree-component {
+ width: 100%;
+ position:relative;
+ display: inline-block;
+ cursor: pointer;
+ -webkit-touch-callout: none; /* iOS Safari */
+ -webkit-user-select: none; /* Chrome/Safari/Opera */
+ -khtml-user-select: none; /* Konqueror */
+ -moz-user-select: none; /* Firefox */
+ -ms-user-select: none; /* IE/Edge */
+ user-select: none; /* non-prefixed version, currently not supported by any browser */
+}
+
+tree-root .angular-tree-component-rtl {
+ direction: rtl;
+}
+tree-root .angular-tree-component-rtl .toggle-children-wrapper-collapsed .toggle-children {
+ transform: rotate(180deg) !important;
+}
+tree-root .angular-tree-component-rtl .tree-children {
+ padding-right: 20px;
+ padding-left: 0;
+}
+
+tree-node-checkbox {
+ padding: 1px;
+}
+
+
+available-models-tree {
+ height: 100%;
+ &.left-side{
+ background: #F2F2F2;
+ padding: 0;
+ border-right: #D2D2D2 1px solid;
+ max-width: 690px;
+ }
+
+ .available-models-tree {
+ display: flex;
+ flex-direction: column;
+ line-height: 14px;
+ min-width: 340px;
+ padding: 30px;
+ height: 100%;
+ .models-tree-header {
+ display: flex;
+ justify-content: space-between;
+
+ h5 {
+ margin: 0;
+ font-family: OpenSans-Semibold;
+ color: #191919;
+ font-size: 16px;
+
+ span {
+ vertical-align: middle;
+ display: inline-block;
+ font-size: 16px;
+ color: #191919;
+ line-height: 16px;
+ &.sub-title {
+ font-family: OpenSans-Regular;
+ font-size: 14px;
+ color: #0D0D0D;
+ }
+ }
+
+ #service-model-name {
+ padding-top: 5px;
+ display: block;
+ font-size: 14px;
+ }
+ }
+
+ .search-container {
+ width: 275px;
+ }
+ }
+ .available-models-content-wrapper {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ margin-top: 20px;
+
+
+ tree-root {
+ flex: 1;
+ display: flex;
+ }
+ tree-viewport {
+ flex: 1;
+ .tree-node {
+ color: #5A5A5A;
+ font-size: 13px;
+ white-space: normal;
+ word-break: break-all;
+ tree-node-drop-slot {
+ .node-drop-slot {
+ display: none;
+ }
+ }
+ &.tree-node-disabled {
+ color: #D2D2D2;
+ cursor: default;
+ pointer-events: none;
+ }
+ &:not(.tree-node-disabled) {
+ >tree-node-wrapper {
+ .node-wrapper:hover {
+ color: #191919;
+ .node-content-wrapper.node-content-wrapper-focused {
+ tree-node-content {
+ > div {
+ background: #009FDB;
+ color: white;
+ }
+ }
+ }
+ .node-content-wrapper {
+ tree-node-content {
+ > div {
+ background: #F2F2F2;
+ &.tree-node-focused:not(.tree-node-disabled) {
+ background: #009FDB;
+ color: white;
+ }
+ span.actions {
+ .icon-plus{
+ display: block;
+ color: #009FDB;
+ span:before {
+ display: inline-block;
+ color: #5A5A5A;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ &.tree-node-focused:not(.tree-node-disabled) {
+ & > tree-node-wrapper {
+ .node-wrapper {
+ border-color: #1EB9F3;
+ .node-content-wrapper{
+ background: #009FDB;
+ border-color: #1EB9F3;
+ }
+ .node-content-wrapper-focused{
+ box-shadow: none;
+ tree-node-content {
+
+ .vf-type{
+ color: #ffffff;
+ border-color: #1EB9F3;
+ }
+ > div {
+ span.actions {
+ .icon-plus {
+ color: #ffffff;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ tree-node-wrapper {
+ .node-wrapper {
+ height: 36px;
+ tree-node-expander {
+ font-family: 'icomoon' !important;
+ height: 100%;
+ .toggle-children-wrapper {
+ padding: 0;
+ display: block;
+ height: 100%;
+ span.toggle-children {
+ display: flex;
+ width: 20px;
+ top: 0;
+ height: inherit;
+ background-image: none;
+ &:before {
+ content: "\e900";
+ font-weight: 600;
+ text-align: center;
+ display: inline-block;
+ flex: auto;
+ align-self: center;
+ font-size: 20px;
+ }
+ }
+ }
+ .toggle-children-wrapper-expanded {
+ span.toggle-children {
+ transform: none;
+ &:before {
+ content: "\e930";
+ }
+ }
+ }
+ .toggle-children-placeholder {
+ width: 20px;
+ }
+ }
+ .node-content-wrapper {
+ padding: 0;
+ background: none;
+ box-shadow: none;
+ height: 100%;
+ flex: 1;
+ min-width: 0;
+ border-left: 1px solid #D2D2D2;
+ tree-node-content {
+ > div {
+ height: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ span {
+ &.actions {
+ height: 100%;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ >span {
+ width: 45px;
+ max-width: 45px;
+ text-align: center;
+ }
+ .number-button {
+ width: 30px;
+ padding-left: 0;
+ text-align: center;
+ span {
+ display: block;
+ font-family: OpenSans-SemiBold;
+ font-size: 13px;
+ color: #5A5A5A;
+ line-height: 16px;
+ }
+ }
+ .icon-plus {
+ display: none;
+ width: 45px;
+ font-size: 22px;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ }
+ }
+ }
+ & > tree-node-collection > tree-node > .node-wrapper{
+ //border-top: 1px solid #D2D2D2;
+ }
+ }
+
+ }
+ }
+}
+.highlight {
+ background-color: #9DD9EF;
+}
+
+#drawing-board-tree{
+ .tree-node.tree-node-expanded.tree-node-focused {
+ }
+}
+
+available-models-tree {
+
+ .tree-root {
+ margin-top: 35px;
+ }
+
+ tree-node-expander {
+ background: #FFFFFF;
+ border: 1px solid #D2D2D2;
+ border-right: none;
+ width: 45px;
+ padding-left: 12px;
+ }
+
+ .node-content-wrapper {
+ border: none;
+ }
+
+ tree-node-wrapper tree-node-expander{
+ background: none !important;
+ border: none !important;
+ }
+
+
+ .node-wrapper {
+ height: 45px !important;
+ background: #FFFFFF;
+ border: 1px solid #D2D2D2;
+ }
+
+ tree-node-collection div {
+ margin-top: 0px;
+ }
+
+ .tree-node-leaf .node-wrapper tree-node-expander {
+ display: none;
+ }
+
+ .tree-node.tree-node-expanded {
+ margin-bottom: 10px;
+ }
+ .tree-node-collapsed {
+ margin-bottom: 10px;
+ }
+ .tree-children {
+ padding-left: 0;
+ }
+
+ tree-node-content .actions .number-button {
+ height: 45px;
+ padding-top: 14px;
+ border-right: 1px solid #D2D2D2;
+ border-left: 1px solid #D2D2D2;
+ padding-left: 0;
+ span {
+ background: none;
+ font-size: 11px;
+ color: #5A5A5A;
+ }
+ }
+
+ .node-content-wrapper.node-content-wrapper-focused{
+ border-color:#1EB9F3 ;
+ tree-node-content > div{
+ .vf-type,.model-info,.model-info .property-name {
+ color: white;
+ }
+ .number-button{
+ border-color: #1EB9F3 ;
+ span{
+ color: white !important;
+ }
+ }
+
+ }
+ }
+
+
+
+ .vf-type {
+ width: 40px;
+ height: 45px;
+ padding-top: 16px;
+ border-right: 1px solid #D2D2D2;
+ color: #959595;
+ font-size: 13px;
+ font-family: OpenSans-SemiBold;
+ text-transform: uppercase;
+ text-align: center;
+ flex-basis: 40px;
+ flex-grow: 0;
+ flex-shrink: 0;
+ }
+
+ .isParent {
+ width: 100%;
+ padding-left: 0 !important;
+ }
+ .model-info {
+ padding-left: 16px;
+ width: 100%;
+ .property-name {
+ font-family: OpenSans-Regular;
+ font-size: 12px;
+ line-height: 12px;
+ color: #191919;
+ //text-transform: capitalize; problematic with search
+ .auto-name{
+ display: inline-flex;//required for search more then one sub highlight
+ }
+ }
+
+ tree-node-header-properties {
+ display: none;
+ }
+ }
+
+ .span-name {
+ margin-right: auto;
+ padding-left: 10px;
+ }
+
+ .toggle-children-wrapper.toggle-children-wrapper-expanded {
+ .toggle-children:before {
+ color: #009FDB;
+ }
+ }
+
+ .tree-node.tree-node-expanded .tree-children {
+ }
+
+ .tree-node.tree-node-expanded.tree-node-focused .tree-children {
+
+ }
+
+ .tree-node.tree-node-expanded > tree-node-wrapper{
+ box-shadow: 0 2px 2px 0 rgba(0,0,0,.1);
+ position: relative;
+ z-index: 1;
+ display: block;
+ }
+
+ .tree-node-leaf .node-wrapper{
+ margin-left: 46px;
+ border-left: none;
+ }
+ .tree-children .tree-node-leaf .node-wrapper{
+ margin-left: 86px;
+ }
+}
+
+@media (max-width: 992px) {
+ available-models-tree{
+ //width: 40%;
+ max-width: 690px;
+ }
+ drawing-board-tree{
+ //width: 60%;
+ }
+}
+
+@media (min-width: 992px) {
+ available-models-tree{
+ //width: 50%;
+ max-width: 650px;
+ }
+ drawing-board-tree{
+ //width: 50%;
+ }
+}
+
+
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
new file mode 100644
index 000000000..31d7b03b8
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.component.ts
@@ -0,0 +1,167 @@
+import {Component, EventEmitter, Output, ViewChild} from '@angular/core';
+import {ITreeOptions, TreeComponent} from 'angular-tree-component';
+import {IDType, ITreeNode} from 'angular-tree-component/dist/defs/api';
+import {DialogService} from 'ng2-bootstrap-modal';
+import {AvailableModelsTreeService} from './available-models-tree.service';
+import {NgRedux} from "@angular-redux/store";
+import {ActivatedRoute} from '@angular/router';
+import {AppState} from '../../../shared/store/reducers';
+import {AaiService} from '../../../shared/services/aaiService/aai.service';
+import {ServiceNodeTypes} from '../../../shared/models/ServiceNodeTypes';
+import {IframeService} from "../../../shared/utils/iframe.service";
+import {DefaultDataGeneratorService} from "../../../shared/services/defaultDataServiceGenerator/default.data.generator.service";
+import {VfModulePopuopService} from "../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service";
+import {NetworkPopupService} from "../../../shared/components/genericFormPopup/genericFormServices/network/network.popup.service";
+import {createVFModuleInstance} from "../../../shared/storeUtil/utils/vfModule/vfModule.actions";
+import {VnfPopupService} from "../../../shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service";
+import {DrawingBoardModes} from "../drawing-board.modes";
+import {DrawingBoardTreeService} from "../drawing-board-tree/drawing-board-tree.service";
+import {ObjectToModelTreeService} from "../objectsToTree/objectToModelTree/objectToModelTree.service";
+import {VnfGroupPopupService} from "../../../shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service";
+import {SharedTreeService} from "../objectsToTree/shared.tree.service";
+import {changeInstanceCounter} from "../../../shared/storeUtil/utils/general/general.actions";
+import {createVnfGroupInstance} from "../../../shared/storeUtil/utils/vnfGroup/vnfGroup.actions";
+import {VnfGroupControlGenerator} from "../../../shared/components/genericForm/formControlsServices/vnfGroupGenerator/vnfGroup.control.generator";
+import {HighlightPipe} from "../../../shared/pipes/highlight/highlight-filter.pipe";
+import * as _ from 'lodash';
+import {DrawingBoardTreeComponent} from "../drawing-board-tree/drawing-board-tree.component";
+
+
+@Component({
+ selector: 'available-models-tree',
+ templateUrl: './available-models-tree.component.html',
+ styleUrls: ['./available-models-tree.component.scss'],
+ providers : [HighlightPipe]
+})
+
+export class AvailableModelsTreeComponent {
+ filterValue : string = '';
+ serviceModelId: string;
+ serviceHierarchy;
+ parentElementClassName = 'content';
+ _store: NgRedux<AppState>;
+ isNewObject: boolean;
+ availableModelsTreeService: AvailableModelsTreeService;
+ drawingBoardTreeService: DrawingBoardTreeService;
+
+ constructor(private _iframeService: IframeService,
+ private _aaiService: AaiService,
+ private route: ActivatedRoute,
+ private dialogService: DialogService,
+ private _availableModelsTreeService: AvailableModelsTreeService,
+ private _drawingBoardTreeService: DrawingBoardTreeService,
+ private _defaultDataGeneratorService: DefaultDataGeneratorService,
+ private _vnfGroupControlGenerator: VnfGroupControlGenerator,
+ private _vfModulePopuopService: VfModulePopuopService,
+ private _vnfGroupPopupService: VnfGroupPopupService,
+ private _vnfPopupService: VnfPopupService,
+ private _networkPopupService: NetworkPopupService,
+ private store: NgRedux<AppState>,
+ private _objectToModelTreeService : ObjectToModelTreeService,
+ private _sharedTreeService : SharedTreeService,
+ private _highlightPipe : HighlightPipe) {
+ this.availableModelsTreeService = _availableModelsTreeService;
+ this.drawingBoardTreeService = _drawingBoardTreeService;
+
+ this._store = store;
+ this.route
+ .queryParams
+ .subscribe(params => {
+ this.serviceModelId = params['serviceModelId'];
+ this._aaiService.getServiceModelById(this.serviceModelId).subscribe(
+ value => {
+ this.serviceHierarchy = value;
+ this.nodes = this._objectToModelTreeService.convertServiceHierarchyModelToTreeNodes(this.serviceHierarchy);
+ },
+ error => {
+ console.log('error is ', error)
+ }
+ );
+ });
+
+ }
+
+ @Output()
+ highlightInstances: EventEmitter<number> = new EventEmitter<number>();
+ @ViewChild('tree') tree: TreeComponent;
+
+ nodes = [];
+ service = {name: ''};
+
+ options: ITreeOptions = {
+ nodeHeight: 36,
+ dropSlotHeight: 0,
+ nodeClass: (node: ITreeNode) => {
+ if (node.data.type === ServiceNodeTypes.VFmodule && ! node.parent.data['getNodeCount'](node.parent, this.serviceModelId) && this.store.getState().global.drawingBoardStatus !== DrawingBoardModes.VIEW) {
+ node.data.disabled = true;
+ return 'tree-node tree-node-disabled';
+ }
+ node.data.disabled = false;
+ return 'tree-node';
+ }
+ };
+
+
+ getNodeName(node : ITreeNode, filter : string) {
+ return this._highlightPipe.transform(node.data.name ,filter ? filter : '');
+ }
+
+ expandParentByNodeId(id: IDType): void {
+ this.tree.treeModel.getNodeById(id).parent.expand();
+ }
+
+ updateNodes(updateData : {nodes : any, filterValue : string}) : void {
+ this.nodes = updateData.nodes;
+ this.filterValue = updateData.filterValue;
+ }
+
+ selectNode(node: ITreeNode): void {
+ node.expand();
+ this._sharedTreeService.setSelectedVNF(null);
+ this.highlightInstances.emit(node.data.modelUniqueId);
+ }
+
+
+
+ onClickAdd(node: ITreeNode, serviceId: string , isNewObject: boolean = false): void {
+ this.isNewObject = isNewObject;
+ let data = node.data;
+ let dynamicInputs = data.dynamicInputs;
+ let isAlaCarte: boolean = this.serviceHierarchy.service.instantiationType == "A-La-Carte";
+ 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 ||
+ this._availableModelsTreeService.shouldOpenDialog(type, dynamicInputs, isEcompGeneratedNaming)) {
+ this._iframeService.addClassOpenModal(this.parentElementClassName);
+ node.data.onAddClick(node, serviceId);
+ } else {
+ if (node.data.type === ServiceNodeTypes.VnfGroup) {
+ let instanceName = this._vnfGroupControlGenerator.getDefaultInstanceName(null, serviceId, node.data.name);
+ let vnfGroup = this._defaultDataGeneratorService.generateVnfGroupInstance(this.serviceHierarchy.vnfGroups[node.data.name], isEcompGeneratedNaming, isAlaCarte, instanceName);
+ this._store.dispatch(changeInstanceCounter(node.data.modelUniqueId, serviceId, 1 , <any> {data: {type: 'VnfGroup'}}));
+ this._store.dispatch(createVnfGroupInstance(vnfGroup, node.data.name, serviceId, node.data.name));
+ DrawingBoardTreeComponent.triggerreCalculateIsDirty.next(this.serviceModelId);
+ } else {
+ let vfModule = this._defaultDataGeneratorService.generateVFModule(this.serviceHierarchy.vnfs[node.parent.data.name].vfModules[node.data.name], dynamicInputs, isEcompGeneratedNaming, isAlaCarte);
+ if (this._sharedTreeService.selectedVNF) {
+ this.store.dispatch(createVFModuleInstance(vfModule, node.data.name, this.serviceModelId, null, this._sharedTreeService.selectedVNF));
+ DrawingBoardTreeComponent.triggerreCalculateIsDirty.next(this.serviceModelId);
+ } else if (this._availableModelsTreeService.getOptionalVNFs(this.serviceModelId, node.parent.data.name).length === 1) {
+ 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){
+ this.store.dispatch(createVFModuleInstance(vfModule, node.data.name, this.serviceModelId, null, vnfKey));
+ DrawingBoardTreeComponent.triggerreCalculateIsDirty.next(this.serviceModelId);
+ }
+ }
+ }
+
+
+ } else {
+ this._availableModelsTreeService.addingAlertAddingNewVfModuleModal();
+ }
+ }
+ }
+ }
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/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 10cbb0d8f..cf9d04aae 100644
--- a/vid-webpack-master/src/app/drawingBoard/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
@@ -3,85 +3,62 @@ import {
HttpClientTestingModule,
HttpTestingController
} from '@angular/common/http/testing';
-import {AvailableModelsTreeService} from './available-models-tree.service';
-import {ServicePlanningService} from "../../services/service-planning.service";
-import {ServiceNodeTypes} from "../../shared/models/ServiceNodeTypes";
-import {NgRedux} from "@angular-redux/store";
-import {MockAppStore} from "../../services/service-planning.service.spec";
+import {AvailableModelsTreeService, AvailableNodeIcons} 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";
+import {MessageBoxData} from "../../../shared/components/messageBox/messageBox.data";
+import {SdcUiCommon} from "onap-ui-angular";
+import {MockNgRedux, NgReduxTestingModule} from "@angular-redux/store/testing";
+import {SharedTreeService} from "../objectsToTree/shared.tree.service";
describe('Available Models Tree Service', () => {
+
let injector;
let service: AvailableModelsTreeService;
let httpMock: HttpTestingController;
- beforeEach(() => {
-
+ beforeAll(done => (async () => {
TestBed.configureTestingModule({
- imports: [HttpClientTestingModule],
+ imports: [HttpClientTestingModule, NgReduxTestingModule],
providers: [AvailableModelsTreeService,
- ServicePlanningService,
- {provide: NgRedux, useClass: MockAppStore}]
+ DefaultDataGeneratorService,
+ SharedTreeService,
+ MockNgRedux]
});
+ await TestBed.compileComponents();
+ injector = getTestBed();
+ service = injector.get(AvailableModelsTreeService);
+ httpMock = injector.get(HttpTestingController);
+ })().then(done).catch(done.fail));
- injector = getTestBed();
- service = injector.get(AvailableModelsTreeService);
- httpMock = injector.get(HttpTestingController);
- });
-
- describe('#shouldShowAddIcon', () => {
- it('should return true if number of current vnf modules is under the max', (done: DoneFn) => {
- let treeNode = {
- data: {
- children: [],
- name: 'vf_vmee0..VfVmee..base_vmme..module-0'
- }
- };
- let serviceHierarchy = getSericeServiceHierarchy();
- let result = service.shouldShowAddIcon(treeNode, serviceHierarchy, '6e59c5de-f052-46fa-aa7e-2fca9d674c44', 0);
- expect(result).toBeTruthy();
- done();
- });
-
- it('should return false if number of current vnf modules are more than max', (done: DoneFn) => {
- let treeNode = {
- data: {
- children: [],
- name: 'vf_vmee0..VfVmee..base_vmme..module-0'
- }
- };
+ test('addingAlertAddingNewVfModuleModal should open message modal', () => {
+ jest.spyOn(MessageBoxService.openModal, 'next');
+ service.addingAlertAddingNewVfModuleModal();
- let serviceHierarchy = getSericeServiceHierarchy();
- let result = service.shouldShowAddIcon(treeNode, serviceHierarchy, '6e59c5de-f052-46fa-aa7e-2fca9d674c44', 2);
- expect(result).toBeFalsy();
- done();
- });
+ expect(MessageBoxService.openModal.next).toHaveBeenCalledWith(new MessageBoxData(
+ "Select a parent", // modal title
+ "There are multiple instances on the right side that can contain this vf-module Please select the VNF instance, to add this vf-module to, on the right side and then click the + sign",
+ SdcUiCommon.ModalType.warning,
+ SdcUiCommon.ModalSize.medium,
+ [
+ {text: "Close", size: "medium", closeModal: true}
+ ]));
+ });
- it('should return true if number of current vnf modules are more than max and max is null', (done: DoneFn) => {
- let treeNode = {
- data: {
- children: [],
- name: 'vf_vmee0..VfVmee..base_vmme..module-0'
- }
- };
- let serviceHierarchy = getSericeServiceHierarchy();
- let result = service.shouldShowAddIcon(treeNode, serviceHierarchy, '6e59c5de-f052-46fa-aa7e-2fca9d674c44', 0);
- expect(result).toBeTruthy();
- done();
- });
- });
describe('#shouldOpenModalDialogOnAddInstance', () => {
- let serviceHierarchy = getSericeServiceHierarchy();
+ let serviceHierarchy = getServiceServiceHierarchy();
- it('should open popup on add instance', (done: DoneFn) => {
+ test('should open popup on add instance', () => {
// add vnf should return true
- let result = service.shouldOpenDialog(ServiceNodeTypes.VF, [], false);
+ let result = service.shouldOpenDialog(ServiceNodeTypes.VF, [], true);
expect(result).toBeTruthy();
// add vfModule with user provided naming should return true
- result = service.shouldOpenDialog(ServiceNodeTypes.VFmodule, [], true);
+ result = service.shouldOpenDialog(ServiceNodeTypes.VFmodule, [], false);
expect(result).toBeTruthy();
// add vfModule with dynamicInputs without defaultValues should return true
@@ -91,7 +68,7 @@ describe('Available Models Tree Service', () => {
name: '2017488_adiodvpe0_vnf_config_template_version',
isRequired: true,
description: 'VPE Software Version'
- }], false);
+ }], true);
expect(result).toBeTruthy();
// add vfModule with dynamicInputs with defaultValues should return false
@@ -102,13 +79,12 @@ describe('Available Models Tree Service', () => {
value: '17.2',
isRequired: true,
description: 'VPE Software Version'
- }], false);
+ }], true);
expect(result).toBeFalsy();
- done();
});
});
- function getSericeServiceHierarchy() {
+ function getServiceServiceHierarchy() {
return JSON.parse(JSON.stringify(
{
'6e59c5de-f052-46fa-aa7e-2fca9d674c44': {
@@ -118,7 +94,7 @@ describe('Available Models Tree Service', () => {
'name': 'ComplexService',
'version': '1.0',
'toscaModelURL': null,
- 'category': 'Mobility',
+ 'category': 'Emanuel',
'serviceType': '',
'serviceRole': '',
'description': 'ComplexService',
@@ -137,7 +113,9 @@ describe('Available Models Tree Service', () => {
'inputs': {},
'commands': {},
'properties': {
- 'gpb2_Internal2_mac': '00:80:37:0E:02:22',
+ 'max_instances': '3',
+ 'min_instances': '1',
+ 'gpb2_Internal2_mac': '00:11:22:EF:AC:DF',
'sctp-b-ipv6-egress_src_start_port': '0',
'sctp-a-ipv6-egress_rule_application': 'any',
'Internal2_allow_transit': 'true',
@@ -145,9 +123,9 @@ describe('Available Models Tree Service', () => {
'sctp-a-egress_rule_application': 'any',
'sctp-b-ingress_action': 'pass',
'sctp-b-ingress_rule_protocol': 'icmp',
- 'ncb2_Internal1_mac': '00:80:37:0E:0F:12',
+ 'ncb2_Internal1_mac': '00:11:22:EF:AC:DF',
'sctp-b-ipv6-ingress-src_start_port': '0.0',
- 'ncb1_Internal2_mac': '00:80:37:0E:09:12',
+ 'ncb1_Internal2_mac': '00:11:22:EF:AC:DF',
'fsb_volume_size_0': '320.0',
'sctp-b-egress_src_addresses': 'local',
'sctp-a-ipv6-ingress_ethertype': 'IPv4',
@@ -166,12 +144,12 @@ describe('Available Models Tree Service', () => {
'sctp-a-ipv6-ingress_src_subnet_prefix': '0.0.0.0',
'sctp-b-egress-dst_start_port': '0.0',
'ncb_flavor_name': 'nv.c20r64d1',
- 'gpb1_Internal1_mac': '00:80:37:0E:01:22',
+ 'gpb1_Internal1_mac': '00:11:22:EF:AC:DF',
'sctp-b-egress_dst_subnet_prefix_len': '0.0',
- 'Internal2_net_cidr': '169.255.0.0',
+ 'Internal2_net_cidr': '10.0.0.10',
'sctp-a-ingress-dst_start_port': '0.0',
'sctp-a-egress-dst_start_port': '0.0',
- 'fsb1_Internal2_mac': '00:80:37:0E:0B:12',
+ 'fsb1_Internal2_mac': '00:11:22:EF:AC:DF',
'sctp-a-egress_ethertype': 'IPv4',
'vlc_st_service_mode': 'in-network-nat',
'sctp-a-ipv6-egress_ethertype': 'IPv4',
@@ -181,17 +159,17 @@ describe('Available Models Tree Service', () => {
'sctp-a-ingress-src_subnet_prefix_len': '0.0',
'sctp-b-ipv6-ingress-src_end_port': '65535.0',
'sctp-b-name': 'epc-sctp-b-ipv4v6-sec-group',
- 'fsb2_Internal1_mac': '00:80:37:0E:0D:12',
+ 'fsb2_Internal1_mac': '00:11:22:EF:AC:DF',
'sctp-a-ipv6-ingress-src_start_port': '0.0',
'sctp-b-ipv6-egress_ethertype': 'IPv4',
- 'Internal1_net_cidr': '169.253.0.0',
+ 'Internal1_net_cidr': '10.0.0.10',
'sctp-a-egress_dst_subnet_prefix': '0.0.0.0',
'fsb_flavor_name': 'nv.c20r64d1',
'sctp_rule_protocol': '132',
'sctp-b-ipv6-ingress_src_subnet_prefix_len': '0',
'sctp-a-ipv6-ingress_rule_application': 'any',
'sctp-a-IPv6_ethertype': 'IPv6',
- 'vlc2_Internal1_mac': '00:80:37:0E:02:12',
+ 'vlc2_Internal1_mac': '00:11:22:EF:AC:DF',
'vlc_st_virtualization_type': 'virtual-machine',
'sctp-b-ingress-dst_start_port': '0.0',
'sctp-b-ingress-dst_end_port': '65535.0',
@@ -209,7 +187,7 @@ describe('Available Models Tree Service', () => {
'Internal2_shared': 'false',
'sctp-a-ipv6-egress_dst_subnet_prefix_len': '0',
'Internal2_rpf': 'disable',
- 'vlc1_Internal1_mac': '00:80:37:0E:01:12',
+ 'vlc1_Internal1_mac': '00:11:22:EF:AC:DF',
'sctp-b-ipv6-egress_src_end_port': '65535',
'sctp-a-ipv6-egress_src_addresses': 'local',
'sctp-a-ingress-dst_end_port': '65535.0',
@@ -219,41 +197,41 @@ describe('Available Models Tree Service', () => {
'sctp-a-dst_subnet_prefix_v6': '::',
'pxe_image_name': 'MME_PXE-Boot_16ACP04_GA.qcow2',
'vlc_st_interface_type_gtp': 'other0',
- 'ncb1_Internal1_mac': '00:80:37:0E:09:12',
+ 'ncb1_Internal1_mac': '00:11:22:EF:AC:DF',
'sctp-b-src_subnet_prefix_v6': '::',
'sctp-a-egress_dst_subnet_prefix_len': '0.0',
'int1_sec_group_name': 'int1-sec-group',
'Internal1_dhcp': 'false',
'sctp-a-ipv6-egress_dst_end_port': '65535',
'Internal2_forwarding_mode': 'l2',
- 'fsb2_Internal2_mac': '00:80:37:0E:0D:12',
+ 'fsb2_Internal2_mac': '00:11:22:EF:AC:DF',
'sctp-b-egress_dst_subnet_prefix': '0.0.0.0',
'Internal1_net_cidr_len': '17',
- 'gpb2_Internal1_mac': '00:80:37:0E:02:22',
+ 'gpb2_Internal1_mac': '00:11:22:EF:AC:DF',
'sctp-b-ingress-src_subnet_prefix_len': '0.0',
'sctp-a-ingress_dst_addresses': 'local',
'sctp-a-egress_action': 'pass',
'fsb_volume_type_0': 'SF-Default-SSD',
- 'ncb2_Internal2_mac': '00:80:37:0E:0F:12',
+ 'ncb2_Internal2_mac': '00:11:22:EF:AC:DF',
'vlc_st_interface_type_sctp_a': 'left',
'vlc_st_interface_type_sctp_b': 'right',
'sctp-a-src_subnet_prefix_v6': '::',
'vlc_st_version': '2',
'sctp-b-egress_ethertype': 'IPv4',
'sctp-a-ingress_rule_application': 'any',
- 'gpb1_Internal2_mac': '00:80:37:0E:01:22',
+ 'gpb1_Internal2_mac': '00:11:22:EF:AC:DF',
'instance_ip_family_v6': 'v6',
'sctp-a-ipv6-egress_src_start_port': '0',
'sctp-b-ingress-src_start_port': '0.0',
'sctp-b-ingress_dst_addresses': 'local',
- 'fsb1_Internal1_mac': '00:80:37:0E:0B:12',
+ 'fsb1_Internal1_mac': '00:11:22:EF:AC:DF',
'vlc_st_interface_type_oam': 'management',
'multi_stage_design': 'false',
'oam_sec_group_name': 'oam-sec-group',
- 'Internal2_net_gateway': '169.255.0.3',
+ 'Internal2_net_gateway': '10.0.0.10',
'sctp-a-ipv6-ingress-dst_end_port': '65535',
'sctp-b-ipv6-egress-dst_start_port': '0',
- 'Internal1_net_gateway': '169.253.0.3',
+ 'Internal1_net_gateway': '10.0.0.10',
'sctp-b-ipv6-egress_rule_protocol': 'any',
'gtp_sec_group_name': 'gtp-sec-group',
'sctp-a-ipv6-egress_dst_subnet_prefix': '0.0.0.0',
@@ -275,7 +253,7 @@ describe('Available Models Tree Service', () => {
'vlc_st_service_type': 'firewall',
'sctp-b-ipv6-egress_dst_end_port': '65535',
'sctp-b-ipv6-ingress-dst_start_port': '0',
- 'vlc2_Internal2_mac': '00:80:37:0E:02:12',
+ 'vlc2_Internal2_mac': '00:11:22:EF:AC:DF',
'vlc_st_availability_zone': 'true',
'fsb_volume_image_name_1': 'MME_FSB2_16ACP04_GA.qcow2',
'sctp-b-ingress-src_subnet_prefix': '0.0.0.0',
@@ -287,7 +265,7 @@ describe('Available Models Tree Service', () => {
'sctp-b-ipv6-ingress_dst_addresses': 'local',
'sctp-b-ipv6-egress_dst_subnet_prefix': '0.0.0.0',
'sctp-b-ipv6-ingress_ethertype': 'IPv4',
- 'vlc1_Internal2_mac': '00:80:37:0E:01:12',
+ 'vlc1_Internal2_mac': '00:11:22:EF:AC:DF',
'sctp-a-ingress-src_subnet_prefix': '0.0.0.0',
'sctp-a-ipv6-ingress_action': 'pass',
'Internal1_rpf': 'disable',
@@ -446,5 +424,4 @@ describe('Available Models Tree Service', () => {
}
));
}
-
});
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
new file mode 100644
index 000000000..dc72f8f12
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.service.ts
@@ -0,0 +1,76 @@
+import {Injectable} from '@angular/core';
+import {DefaultDataGeneratorService} from "../../../shared/services/defaultDataServiceGenerator/default.data.generator.service";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../../shared/store/reducers";
+import {MessageBoxData} from "../../../shared/components/messageBox/messageBox.data";
+import {MessageBoxService} from "../../../shared/components/messageBox/messageBox.service";
+import * as _ from "lodash";
+import { SdcUiCommon} from "onap-ui-angular";
+import {SharedTreeService} from "../objectsToTree/shared.tree.service";
+
+export class AvailableNodeIcons {
+ addIcon: boolean;
+ vIcon: boolean;
+
+ constructor(addIcon: boolean, vIcon: boolean) {
+ this.addIcon = addIcon;
+ this.vIcon = vIcon;
+ }
+}
+
+@Injectable()
+export class AvailableModelsTreeService {
+ constructor(private _defaultDataGeneratorService: DefaultDataGeneratorService,
+ private store: NgRedux<AppState>,
+ public _shareTreeService : SharedTreeService) {
+ }
+
+
+
+ shouldOpenDialog(type: string, dynamicInputs: any, isEcompGeneratedNaming: boolean): boolean {
+ if (!isEcompGeneratedNaming || this._defaultDataGeneratorService.requiredFields[type].length > 0) {
+ return true;
+ }
+
+ if (dynamicInputs) {
+ for(let input of dynamicInputs) {
+ if (input.isRequired && _.isEmpty(input.value)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ getOptionalVNFs(serviceUUID: string, vnfOriginalModelName : string) : any[] {
+ let result = [];
+ if(!_.isNil(this.store.getState().service.serviceInstance) && !_.isNil(this.store.getState().service.serviceInstance[serviceUUID])){
+ const serviceVNFsInstances = this.store.getState().service.serviceInstance[serviceUUID].vnfs;
+ for(let vnfKey in serviceVNFsInstances){
+ if(serviceVNFsInstances[vnfKey].originalName === vnfOriginalModelName){
+ serviceVNFsInstances[vnfKey].vnfStoreKey = vnfKey;
+ result.push(serviceVNFsInstances[vnfKey]);
+ }
+ }
+ }
+
+
+ return result;
+ }
+
+
+
+ addingAlertAddingNewVfModuleModal() : void {
+ let messageBoxData : MessageBoxData = new MessageBoxData(
+ "Select a parent", // modal title
+ "There are multiple instances on the right side that can contain this vf-module Please select the VNF instance, to add this vf-module to, on the right side and then click the + sign",
+ SdcUiCommon.ModalType.warning,
+ SdcUiCommon.ModalSize.medium,
+ [
+ {text:"Close", size:"medium", closeModal:true}
+ ]);
+
+ MessageBoxService.openModal.next(messageBoxData);
+ }
+
+}
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
new file mode 100644
index 000000000..4c5bf6747
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info-model.ts
@@ -0,0 +1,26 @@
+import {ModelInformationItem} from "../../../shared/components/model-information/model-information.component";
+
+export class ComponentInfoModel {
+ type: ComponentInfoType;
+ modelInfoItems: ModelInformationItem[];
+ additionalInfoItems: ModelInformationItem[];
+ title: string;
+
+
+ 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" : "");
+ }
+}
+
+
+export enum ComponentInfoType {
+ SERVICE = "Service",
+ VNF = "VNF",
+ NETWORK = "Network",
+ VFMODULE = "VFModule",
+ VNFGROUP = "Group",
+ VNFMEMBER = "VNF"
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.component.html b/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.component.html
new file mode 100644
index 000000000..8f08de076
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.component.html
@@ -0,0 +1,20 @@
+<div *ngIf="componentInfoModel">
+ <div class="component-info-wrapper" [attr.data-tests-id]="'component-info-wrapper'">
+ <div class="component-info-section" [attr.data-tests-id]="'component-info-section'">
+ <div class="title" [attr.data-tests-id]="'component-info-section-title'">{{componentInfoModel?.title}} INFO</div>
+ <div class="component-info-list" [attr.data-tests-id]="'component-info-section-list'">
+ <model-information [modelInformationItems]="componentInfoModel?.modelInfoItems" [itemClass]="'componentInfoItem'"></model-information>
+ </div>
+ </div>
+ </div>
+ <!-- commented out till we will have a data to show in additional info
+ <div class="component-info-wrapper" [attr.data-tests-id]="'additional-info-wrapper'">-->
+ <!--<div class="component-info-section" [attr.data-tests-id]="'additional-info-section'">-->
+ <!--<div class="title" [attr.data-tests-id]="'additional-info-section-title'">ADDITIONAL INFO</div>-->
+ <!--<div class="component-info-list" [attr.data-tests-id]="'additional-info-section-title'">-->
+ <!--<model-information [modelInformationItems]="componentInfoModel.additionalInfoItems" [itemClass]="'componentInfoItem'"></model-information>-->
+ <!--</div>-->
+ <!--</div>-->
+ <!--</div>
+ -->
+</div>
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
new file mode 100644
index 000000000..2d7735678
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.component.scss
@@ -0,0 +1,40 @@
+.component-info-wrapper {
+
+ &:first-child {
+ border-bottom: 1px solid #D2D2D2;
+ }
+ .component-info-section {
+ margin: 15px 25px 0 25px;
+
+ .title {
+ font-family: OpenSans-SemiBold;
+ font-size: 14px;
+ color: #191919;
+ text-transform: uppercase;
+ margin-bottom: 15px;
+ }
+ }
+
+}
+
+:host ::ng-deep .componentInfoItem {
+ border-top: 1px solid #D2D2D2;
+ padding-top: 10px;
+ margin-bottom: 10px;
+
+ label {
+ font-family: OpenSans-Regular;
+ font-size: 12px;
+ color: #5A5A5A;
+ text-transform: capitalize;
+ }
+
+ .model-item-value {
+ font-family: OpenSans-SemiBold;
+ font-size: 14px;
+ color: #191919;
+ line-height: 16px;
+ }
+}
+
+
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
new file mode 100644
index 000000000..c69ab52e1
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.component.ts
@@ -0,0 +1,40 @@
+import {ChangeDetectionStrategy, Component, OnInit} from '@angular/core';
+import {ComponentInfoService} from "./component-info.service";
+import {ComponentInfoModel, ComponentInfoType} from "./component-info-model";
+import {ActivatedRoute} from "@angular/router";
+
+
+@Component({
+ selector: 'component-info',
+ templateUrl: './component-info.component.html',
+ styleUrls: ['./component-info.component.scss'],
+ changeDetection: ChangeDetectionStrategy.OnPush
+})
+export class ComponentInfoComponent implements OnInit {
+ componentInfoModel: ComponentInfoModel = null;
+
+ constructor(private _componentInfoService:ComponentInfoService, private route: ActivatedRoute) {}
+
+ ngOnInit() {
+ ComponentInfoService.triggerComponentInfoChange.subscribe((input : ComponentInfoModel) => {
+ if(input.type === ComponentInfoType.SERVICE){
+ this.getServiceInformation();
+ }else {
+ this.componentInfoModel = input;
+ }
+ });
+
+ this.getServiceInformation();
+ }
+
+
+
+ getServiceInformation() : void {
+ this.route
+ .queryParams
+ .subscribe(params => {
+ let serviceModelId = params['serviceModelId'];
+ this.componentInfoModel = this._componentInfoService.getInfoForService(serviceModelId);
+ });
+ }
+}
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
new file mode 100644
index 000000000..8b0da409b
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.service.spec.ts
@@ -0,0 +1,93 @@
+import {ComponentInfoService} from './component-info.service';
+import {getTestBed, TestBed} from '@angular/core/testing';
+import {MockNgRedux, NgReduxTestingModule} from '@angular-redux/store/testing';
+import {NgRedux} from '@angular-redux/store';
+import {AaiService} from '../../../shared/services/aaiService/aai.service';
+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";
+
+class MockAppStore<T> {
+ getState() {
+ return {
+ global: {
+ },
+ service : {
+ serviceHierarchy : {
+ '1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd' : {
+ service:{
+ serviceRole: 'Testing',
+ serviceType: 'pnf',
+ uuid: '1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd',
+ version: '1.0',
+ customizationUuid: ''
+ }
+ }
+ },
+ serviceInstance : {
+ '1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd' : {
+ globalSubscriberId: 'e433710f-9217-458d-a79d-1c7aff376d89',
+ subscriptionServiceType:'TYLER SILVIA',
+ instanceId: '2f7130e8-27d6-4c01-8988-60ca67e8dae4'
+ }
+ },
+ subscribers: [
+ {
+ 'id': 'CAR_2020_ER',
+ 'name': 'CAR_2020_ER',
+ 'isPermitted': true
+ },
+ {
+ 'id': 'e433710f-9217-458d-a79d-1c7aff376d89',
+ 'name': 'SILVIA ROBBINS',
+ 'isPermitted': true
+ }
+ ]
+ }
+ }
+ }
+}
+
+beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+ imports: [NgReduxTestingModule],
+ providers: [
+ AaiService,
+ HttpClient,
+ HttpHandler,
+ FeatureFlagsService,
+ ComponentInfoService,
+ {provide: NgRedux, useClass: MockAppStore},
+ MockNgRedux]
+ });
+ await TestBed.compileComponents();
+ let injector = getTestBed();
+ service = injector.get(ComponentInfoService);
+ })().then(done).catch(done.fail));
+
+let service: ComponentInfoService;
+describe('Service Info Data', () => {
+
+ test('ComponentInfoService should be defined', () => {
+ expect(service).toBeDefined();
+ });
+
+ test('Info for service should be correct', () => {
+ 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('Instance ID', '2f7130e8-27d6-4c01-8988-60ca67e8dae4'),
+ 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
new file mode 100644
index 000000000..9318b3aa7
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.service.ts
@@ -0,0 +1,41 @@
+import {Injectable} from "@angular/core";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../../shared/store/reducers";
+import {AaiService} from "../../../shared/services/aaiService/aai.service";
+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';
+@Injectable()
+export class ComponentInfoService {
+ static triggerComponentInfoChange: Subject<ComponentInfoModel> = new Subject<ComponentInfoModel>();
+ constructor( private _store: NgRedux<AppState>, private _aaiService : AaiService){ }
+
+ getInfoForService(serviceModelId):ComponentInfoModel {
+ if(_.isNil(this._store.getState().service.serviceHierarchy[serviceModelId])) return null;
+
+ let 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),
+ ];
+ 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, []);
+ }
+}
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
new file mode 100644
index 000000000..f02ed6293
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.html
@@ -0,0 +1,78 @@
+<div class="drawing-board-header">
+ <div class="left-header">
+ <span class="vid-logo-small"></span>
+ <span class="icon-back">
+ <svg-icon
+ (click)="closePage()"
+ [testId]="'backBtn'"
+ [size]="'large'"
+ [name]="'navigation-arrow-back'">
+ </svg-icon>
+ </span>
+
+ <div class="header-col middleDetails" style="padding-top: 5px;padding-left: 13px;line-height: 100%;" *ngIf="isServiceFailed">
+ <custom-popover class="failed-popover-wrap" [value]= "serviceStatusMessage" [placement]="'bottom'" [popoverType]="'error'">
+ <span [attr.data-tests-id]="'service-failed-msg'" class="failed-msg labelPosition" >Failed</span>
+ </custom-popover>
+ </div>
+ <div class="header-col middleDetails" style="padding-top: 0px;padding-left: 13px;line-height: 100%;padding-right: 50px;">
+ <span [attr.data-tests-id]="'serviceInstance'" class="service-instance-label labelPosition">Service instance:</span>
+ <span [attr.data-tests-id]="'serviceName'" [ngClass]="{'deleted' : isDeleted}" class="service-instance-name">{{serviceName}}</span>
+ </div>
+ <div class="header-col middleDetails notShowOnCreateMode"
+ style="padding-top: 0px;padding-left: 13px;line-height: 100%;">
+ <span [attr.data-tests-id]="'orchStatusLabel'" class="service-instance-label labelPosition">Orch Status:</span>
+ <span [attr.data-tests-id]="'orchStatusValue'" class="orch-status-value">{{serviceOrchStatus}}</span>
+ </div>
+ <div class="quantity-container header-col middleDetails"
+ style="padding-top: 0px;padding-left: 13px;line-height: 100%;"
+ tooltip="Number of services to instantiate including all their objects as defined below">
+ <span [attr.data-tests-id]="'quantityLabel'" class="quantity-instance-label labelPosition">Scale Times:</span>
+ <span [attr.data-tests-id]="'servicesQuantity'" class="scale-value"
+ style="font-family: OpenSans-Semibold;font-size: 13px;"> {{numServicesToDeploy}} </span>
+ </div>
+
+ <span [attr.data-tests-id]="'serviceStatus'" class="status" tooltip="{{status}}"></span>
+ <span [attr.data-tests-id]="'isViewOnly-status-test'" class="service-instance-label purple">{{getModeName()}}</span>
+ </div>
+
+
+ <div class="right-header">
+ <span class="menu-container notShowOnViewMode notShowOnRetryMode">
+ <span [attr.data-tests-id]="'openMenuBtn'" class="icon-browse" (click)="onContextMenu($event)"></span>
+ <context-menu>
+ <ng-template *ngIf="drawingBoardHeaderService?.showEditService(mode, serviceModelId)" contextMenuItem (execute)="editService()">
+ <div [attr.data-tests-id]="'context-menu-header-edit-item'">
+ <span class="icon-edit"></span>Edit</div>
+ </ng-template>
+ <ng-template *ngIf="mode === 'EDIT'" contextMenuItem
+ (execute)="isDeleted=!isDeleted; drawingBoardHeaderService.deleteService(serviceModelId,isDeleted)">
+ <div [attr.data-tests-id]="'context-menu-header-delete-item'"><span class="icon-trash"></span>{{isDeleted ? 'Undo delete': 'Delete'}}</div>
+ </ng-template>
+ <ng-template *ngIf="mode !== 'CREATE'" contextMenuItem
+ (execute)="drawingBoardHeaderService.showAuditInfo(serviceModelId)">
+ <div [attr.data-tests-id]="'context-menu-header-audit-item'" style="float: left;margin-top: 8px;">
+ <svg-icon
+ [ngClass]="'eye-o'"
+ class="eye-o"
+ [size]="'small'"
+ [name]="'eye-o'">
+ </svg-icon></div>
+ <div style="padding-left: 12px;">Show Audit Info</div>
+ </ng-template>
+ </context-menu>
+ </span>
+ <button [disabled]="drawingBoardHeaderService?.deployShouldBeDisabled(serviceModelId, mode)"
+ *ngIf="mode !== 'VIEW' && mode !== 'RETRY'; else viewEditButton"
+ [attr.data-tests-id]="'deployBtn'"
+ (click)="deployService()"
+ class="deploy-btn">{{drawingBoardHeaderService?.getModeButton(mode)}}</button>
+ <ng-template #viewEditButton>
+ <button [disabled]="!isPermitted()"
+ [attr.data-tests-id]="'editBtn'"
+ (click)="editViewEdit()"
+ class="deploy-btn">{{drawingBoardHeaderService?.getButtonText(mode)}}
+ </button>
+ </ng-template>
+ </div>
+</div>
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.scss b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.scss
new file mode 100644
index 000000000..1242f9429
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.scss
@@ -0,0 +1,176 @@
+.drawing-board-header {
+ height: 60px;
+ font-family: OpenSans-Regular;
+ display: flex;
+ justify-content: space-between;
+ font-size: 14px;
+ box-shadow: 2px 2px 6px #D2D2D2;
+ color: #191919;
+ z-index: 1;
+ position: relative;
+ [class^="icon-"] {
+ height: 60px;
+ width: 60px;
+ display: flex;
+ align-items: center;
+ text-align: center;
+ color: #5A5A5A;
+ cursor: pointer;
+ &:before {
+ font-size: 18px;
+ width: 100%;
+ }
+ &:hover:before {
+ color: #009FDB;
+ }
+ }
+ .left-header {
+ display: flex;
+ align-items: center;
+ .icon-back {
+ justify-content: center;
+ border-right: 1px solid #EAEAEA;
+ }
+ .vid-logo-small{
+ background: url('../../../../assets/img/vid-logo.jpg') no-repeat;
+ width: 60px;
+ height: 60px;
+ }
+ .status{
+ background: url('../../../../assets/img/indesign.svg') no-repeat center;
+ width: 24px;
+ height: 24px;
+ margin-left: 20px;
+ }
+ .header-col {
+ border-right: 1px solid #d2d2d2;
+ padding-right: 15px;
+ margin-left: 15px;
+ span{
+ display: block;
+ }
+ &:after{
+ content: "";
+ background: #D2D2D2;
+ height: 35px;
+ width: 1px;
+ }
+ }
+ .service-instance-label {
+ font-family: OpenSans-Semibold;
+ font-size: 13px;
+ color: #5A5A5A;
+ }
+ .quantity-instance-label {
+ font-family: OpenSans-Regular;
+ font-size: 13px;
+ color: #5A5A5A;
+ }
+
+ .labelPosition {
+ margin-top: 4px;
+ margin-bottom: 6px;
+ font-size: 12px;
+ }
+ .service-instance-name {
+ font-family: OpenSans-Semibold;
+ color: #191919;
+ background-color: white;
+ font-size: 14px;
+ &.deleted{
+ text-decoration: line-through;
+ }
+ }
+ .orch-status-value {
+ font-family: OpenSans-Regular;
+ font-size: 14px;
+ color: #191919;
+ }
+ .scale-value {
+ font-family: OpenSans-Regular;
+ font-size: 14px;
+ color: #191919;
+ }
+ .status {
+ font-family: OpenSans-Semibold;
+ line-height: 14px;
+ font-size: 14px;
+ text-align: center;
+ width: 30px;
+ margin-left: 13px;
+ margin-right: 3px;
+ }
+
+ .purple {
+ color: #9063CD;
+ }
+
+ .middleDetails {
+ border-right: 1px solid #EAEAEA;
+ margin-left: 0;
+ height: 45px;
+ }
+ }
+ .right-header {
+ display: flex;
+ align-items: center;
+ .quantity-container {
+ .quantity-label {
+ padding-left: 10px;
+ font-family: OpenSans-Semibold;
+ font-size: 12px;
+ }
+ .quantity {
+ padding: 5px 10px 5px 0;
+ font-family: OpenSans-Semibold;
+ font-size: 18px;
+ }
+ }
+ .scale-container {
+ .scale-label {
+ padding-left: 10px;
+ font-family: OpenSans-Semibold;
+ font-size: 12px;
+ }
+ .scale {
+ padding: 5px 10px 5px 0;
+ font-family: OpenSans-Semibold;
+ font-size: 18px;
+ }
+ }
+ [class^="icon-"] {
+ border-left: 1px solid #EAEAEA;
+ }
+ .menu-container {
+ height: 100%;
+ display: flex;
+ background: none;
+ border: none;
+ padding: 0;
+ outline: none;
+ justify-content: center;
+ flex-direction: column;
+ text-align: center;
+ cursor: pointer;
+ }
+ .icon-browse:before {
+ content: '\e924';
+ display: inline-block;
+ font-size: 24px;
+ }
+ .deploy-btn {
+ color: #FFFFFF ;
+ background: #009fdb;
+ width: 128px;
+ height: 100%;
+ border: none;
+ &[disabled] {
+ cursor: not-allowed;
+ opacity: .65;
+ color: #99d6ec;
+ }
+ }
+ }
+ }
+
+
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.ts
new file mode 100644
index 000000000..6e4391572
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.ts
@@ -0,0 +1,187 @@
+import {Component, ViewChild} from '@angular/core';
+import {ContextMenuComponent, ContextMenuService} from 'ngx-contextmenu';
+import {DialogService} from 'ng2-bootstrap-modal';
+import {MsoService} from '../../../shared/services/msoService/mso.service'
+import * as _ from 'lodash';
+import {ActivatedRoute} from '@angular/router';
+import {ServiceInstance} from "../../../shared/models/serviceInstance";
+import {OwningEntity} from "../../../shared/models/owningEntity";
+import {MessageBoxData} from "../../../shared/components/messageBox/messageBox.data";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../../shared/store/reducers";
+import {IframeService} from "../../../shared/utils/iframe.service";
+import {
+ GenericFormPopupComponent,
+ PopupType
+} from "../../../shared/components/genericFormPopup/generic-form-popup.component";
+import {ServicePopupService} from "../../../shared/components/genericFormPopup/genericFormServices/service/service.popup.service";
+import {SdcUiCommon} from "onap-ui-angular";
+import {DrawingBoardModes} from "../drawing-board.modes";
+import {DrawingBoardHeaderService} from "./drawing-board-header.service";
+import {ServiceInstanceActions} from "../../../shared/models/serviceInstanceActions";
+import {DrawingBoardPermissions} from "../../guards/servicePlanningGuard/drawingBoardGuard";
+import {MessageBoxService} from "../../../shared/components/messageBox/messageBox.service";
+
+@Component({
+ selector: 'drawing-board-header',
+ providers: [MsoService],
+ templateUrl: './drawing-board-header.component.html',
+ styleUrls: ['./drawing-board-header.component.scss']
+})
+
+export class DrawingBoardHeader {
+ serviceName: string;
+ numServicesToDeploy: number;
+ status: string = 'Designing a new service';
+ serviceModelId: string;
+ jobId: string;
+ parentElementClassName = 'content';
+ mode : DrawingBoardModes = DrawingBoardModes.CREATE;
+ serviceOrchStatus: string;
+ isDeleted: boolean = false;
+ store : NgRedux<AppState>;
+ drawingBoardPermissions : DrawingBoardPermissions;
+ drawingBoardHeaderService : DrawingBoardHeaderService;
+ isServiceFailed: boolean;
+ serviceStatusMessage: string;
+ constructor(private _contextMenuService: ContextMenuService, private dialogService: DialogService,
+ private _iframeService : IframeService,
+ private route: ActivatedRoute, private msoService: MsoService,
+ private _servicePopupService : ServicePopupService,
+ private _drawingBoardHeaderService : DrawingBoardHeaderService,
+ private _store: NgRedux<AppState>,
+ private _drawingBoardPermissions : DrawingBoardPermissions) {
+ this.store = _store;
+ this.drawingBoardPermissions = _drawingBoardPermissions;
+ this.drawingBoardHeaderService = _drawingBoardHeaderService;
+ this.mode = (!_.isNil(this.route.routeConfig.path) && this.route.routeConfig.path !== "") ? this.route.routeConfig.path as DrawingBoardModes : DrawingBoardModes.CREATE;
+ this.route
+ .queryParams
+ .subscribe((params) => {
+ this.serviceModelId = params['serviceModelId'];
+ this.jobId = params['jobId'];
+ if (_.has(this.store.getState().service.serviceHierarchy, this.serviceModelId)) {
+ this.setValuesFromStore();
+ this.store.subscribe(() => {
+ this.setValuesFromStore();
+ });
+ }
+ });
+ }
+
+
+ @ViewChild(ContextMenuComponent) public contextMenu: ContextMenuComponent;
+
+ editViewEdit(): void {
+ window.parent.location.assign(this._drawingBoardHeaderService.generateOldViewEditPath());
+ }
+
+ isPermitted() : boolean {
+ return this.drawingBoardPermissions.isEditPermitted;
+}
+
+ getModeName():string {
+ switch (this.mode) {
+ case DrawingBoardModes.CREATE:
+ return 'IN DESIGN';
+ case DrawingBoardModes.VIEW:
+ case DrawingBoardModes.RETRY:
+ return 'VIEW ONLY';
+ case DrawingBoardModes.EDIT:
+ case DrawingBoardModes.RETRY_EDIT:
+ return 'IN EDITING';
+ default:
+ return 'IN DESIGN';
+ }
+
+ }
+ public onContextMenu($event: MouseEvent, item: any): void {
+ this._contextMenuService.show.next({
+ contextMenu: this.contextMenu,
+ event: $event,
+ item: item,
+ });
+ $event.preventDefault();
+ $event.stopPropagation();
+ }
+
+ private setValuesFromStore() {
+ if(!_.isNil(this.store.getState().service.serviceInstance) && !_.isNil(this.store.getState().service.serviceInstance[this.serviceModelId])){
+ const serviceInstance = this.store.getState().service.serviceInstance[this.serviceModelId];
+ this.numServicesToDeploy = serviceInstance.bulkSize;
+ this.serviceName = serviceInstance.instanceName || '<Automatically Assigned>';
+ this.serviceOrchStatus = serviceInstance.orchStatus || "";
+ this.isServiceFailed = serviceInstance.isFailed;
+ this.serviceStatusMessage = serviceInstance.statusMessage;
+ }
+ }
+
+ public editService(): void {
+ this._iframeService.addClassOpenModal(this.parentElementClassName);
+ this.dialogService.addDialog(GenericFormPopupComponent, {
+ type: PopupType.SERVICE,
+ uuidData: <any>{
+ type : PopupType.SERVICE,
+ isMacro : this.store.getState().service.serviceHierarchy[this.serviceModelId].service.instantiationType === 'Macro',
+ serviceId: this.serviceModelId,
+ popupService: this._servicePopupService
+ },
+ isUpdateMode: true
+ });
+ }
+
+ extractOwningEntityNameAccordingtoId(id:String): string {
+ let owningEntityName;
+ _.forEach(this.store.getState().service.categoryParameters.owningEntityList,(owningEntity: OwningEntity) => {
+ if (owningEntity.id === id) {
+ owningEntityName = owningEntity.name;
+
+ }});
+ return owningEntityName;
+ }
+
+ extractServiceFields(): any {
+ let instanceFields : ServiceInstance;
+ instanceFields = this.store.getState().service.serviceInstance[this.serviceModelId];
+ if (instanceFields.action === ServiceInstanceActions.Create) {
+ instanceFields.subscriberName = this.store.getState().service.subscribers.find(sub => sub.id === instanceFields.globalSubscriberId).name;
+ instanceFields.owningEntityName = this.extractOwningEntityNameAccordingtoId(instanceFields.owningEntityId);
+ }
+ return _.omit(instanceFields,'optionalGroupMembersMap');
+ }
+
+
+ public deployService(): void {
+ let instanceFields = this.extractServiceFields();
+ if (this.mode !== DrawingBoardModes.RETRY_EDIT) {
+ instanceFields.rollbackOnFailure = instanceFields.rollbackOnFailure === 'true';
+ this.msoService.submitMsoTask(instanceFields).subscribe((result) => {
+ window.parent.postMessage("navigateToInstantiationStatus", '*');
+ });
+ } else {
+ this.msoService.retryBulkMsoTask(this.jobId, instanceFields).subscribe((result) => {
+ window.parent.postMessage("navigateToInstantiationStatus", '*');
+ });
+ }
+ }
+
+ closePage() {
+ let messageBoxData : MessageBoxData = new MessageBoxData(
+ "Delete Instantiation", // modal title
+ "You are about to stop the instantiation process of this service. \nAll data will be lost. Are you sure you want to stop?",
+ SdcUiCommon.ModalType.warning,
+ SdcUiCommon.ModalSize.medium,
+ [
+ {text:"Stop Instantiation", size:"large", callback: this.navigate.bind(this), closeModal:true},
+ {text:"Cancel", size:"medium", closeModal:true}
+ ]);
+
+ MessageBoxService.openModal.next(messageBoxData);
+ }
+
+
+
+ navigate(){
+ window.parent.postMessage("navigateTo", "*");
+ }
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.service.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.service.spec.ts
new file mode 100644
index 000000000..bcf6753b9
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.service.spec.ts
@@ -0,0 +1,184 @@
+import {getTestBed, TestBed} from '@angular/core/testing';
+import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing';
+import {DefaultDataGeneratorService} from "../../../shared/services/defaultDataServiceGenerator/default.data.generator.service";
+import {MockNgRedux, NgReduxTestingModule} from "@angular-redux/store/testing";
+import {DrawingBoardHeaderService} from "./drawing-board-header.service";
+import {ActivatedRoute} from '@angular/router';
+import {ServiceInstanceActions} from "../../../shared/models/serviceInstanceActions";
+import {AppState} from "../../../shared/store/reducers";
+import {NgRedux} from "@angular-redux/store";
+import {addServiceAction} from "../../../shared/storeUtil/utils/service/service.actions";
+import {ErrorMsgService} from "../../../shared/components/error-msg/error-msg.service";
+import {DrawingBoardModes} from "../drawing-board.modes";
+import each from "jest-each";
+
+class MockAppStore<T>{
+ getState() {
+ return {
+ service : {
+ serviceInstance : {
+ "serviceInstanceId" : {
+ action: 'None'
+ }
+ }
+ }
+ }
+ }
+}
+
+describe('Generate path to old View/Edit ', () => {
+ let injector;
+ let service: DrawingBoardHeaderService;
+ let httpMock: HttpTestingController;
+ let store : NgRedux<AppState>;
+
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+ imports: [HttpClientTestingModule, NgReduxTestingModule],
+ providers: [
+ DrawingBoardHeaderService,
+ DefaultDataGeneratorService,
+ MockNgRedux,
+ ErrorMsgService,
+ {
+ provide: ActivatedRoute,
+ useValue: {
+ snapshot : {
+ queryParams:{
+ 'subscriberId' : 'subscriberId',
+ 'subscriberName' : 'subscriberName',
+ 'serviceType' : 'serviceType',
+ 'serviceInstanceId' : 'serviceInstanceId'
+ }
+ }
+ },
+ }]
+ });
+ await TestBed.compileComponents();
+
+ injector = getTestBed();
+ service = injector.get(DrawingBoardHeaderService);
+ httpMock = injector.get(HttpTestingController);
+ store = injector.get(NgRedux);
+
+ })().then(done).catch(done.fail));
+
+
+ test('should generate url to old view/edit ', () => {
+ const query: string = 'subscriberId=subscriberId&subscriberName=subscriberName&serviceType=serviceType&serviceInstanceId=serviceInstanceId';
+ const path = '../../serviceModels.htm#/instantiate?' + query;
+ let result = service.generateOldViewEditPath();
+ expect(result).toEqual(path);
+ });
+
+ test('should call update action for Delete',()=>{
+
+ jest.spyOn(store, 'dispatch');
+ service.deleteService("serviceInstanceId", true);
+ expect(store.dispatch).toHaveBeenCalledWith(addServiceAction("serviceInstanceId", ServiceInstanceActions.Delete));
+ });
+
+ test('should call update action for undo delete',()=>{
+ jest.spyOn(store, 'dispatch');
+ service.deleteService("serviceInstanceId", false);
+ expect(store.dispatch).toHaveBeenCalledWith(addServiceAction("serviceInstanceId", ServiceInstanceActions.None));
+ });
+
+ test('deployShouldBeDisabled with validationCounter greater then 0',()=>{
+ jest.spyOn(store, 'getState').mockReturnValue({
+ service: {
+ serviceInstance : {
+ 'serviceInstanceId' : {
+ validationCounter : 1
+ }
+ }
+ }
+ });
+ let result = service.deployShouldBeDisabled("serviceInstanceId");
+ expect(result).toBeTruthy();
+ });
+
+ test('deployShouldBeDisabled with validationCounter is 0 and not dirty',()=>{
+ jest.spyOn(store, 'getState').mockReturnValue({
+ service: {
+ serviceInstance : {
+ 'serviceInstanceId' : {
+ validationCounter : 0,
+ isDirty : false
+ }
+ }
+ }
+ });
+ let result = service.deployShouldBeDisabled("serviceInstanceId");
+ expect(result).toBeFalsy();
+ });
+
+ test('deployShouldBeDisabled with validationCounter is 0 and dirty',()=>{
+ jest.spyOn(store, 'getState').mockReturnValue({
+ service: {
+ serviceInstance : {
+ 'serviceInstanceId' : {
+ validationCounter : 0,
+ action : 'None',
+ isDirty : true
+ }
+ }
+ }
+ });
+ let result = service.deployShouldBeDisabled("serviceInstanceId");
+ expect(result).not.toBeTruthy();
+ });
+
+ test('deployShouldBeDisabled with validationCounter is 0 and not and action is None and dirty',()=>{
+ jest.spyOn(store, 'getState').mockReturnValue({
+ service: {
+ serviceInstance : {
+ 'serviceInstanceId' : {
+ validationCounter : 0,
+ action : ServiceInstanceActions.None,
+ isDirty : true
+ }
+ }
+ }
+ });
+ let result = service.deployShouldBeDisabled("serviceInstanceId");
+ expect(result).not.toBeTruthy();
+ });
+
+
+ test('getModeButton',()=>{
+ let result : string = service.getModeButton("EDIT");
+ expect(result).toEqual('UPDATE');
+
+ result = service.getModeButton("");
+ expect(result).toEqual('DEPLOY');
+
+ result = service.getModeButton("RETRY_EDIT");
+ expect(result).toEqual('REDEPLOY');
+ });
+ test('getButtonText',()=>{
+ expect(service.getButtonText("VIEW")).toEqual('EDIT');
+ expect(service.getButtonText("RETRY")).toEqual('REDEPLOY');
+
+ });
+ const showEditServiceDataProvider = [
+ ['Create action CREATE mode', DrawingBoardModes.CREATE ,ServiceInstanceActions.Create, true],
+ ['Create action RETRY_EDIT mode',DrawingBoardModes.RETRY_EDIT, ServiceInstanceActions.Create, true],
+ ['Create action EDIT mode',DrawingBoardModes.EDIT, ServiceInstanceActions.Create, true],
+ ['Create action RETRY mode',DrawingBoardModes.RETRY, ServiceInstanceActions.Create, false],
+ ['None action EDIT mode',DrawingBoardModes.EDIT, ServiceInstanceActions.None, false],
+ ['None action RETRY_EDIT mode', DrawingBoardModes.RETRY_EDIT, ServiceInstanceActions.None, false]];
+ each(showEditServiceDataProvider).test('showEditService service with %s', (description, mode, action, enabled) => {
+ jest.spyOn(store, 'getState').mockReturnValue({
+ service: {
+ serviceInstance : {
+ 'serviceInstanceId' : {
+ action : action
+ }
+ }
+ }
+ });
+ expect(service.showEditService(mode, 'serviceInstanceId')).toBe(enabled);
+
+ });
+});
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.service.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.service.ts
new file mode 100644
index 000000000..946c5cab5
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.service.ts
@@ -0,0 +1,86 @@
+import {Injectable} from "@angular/core";
+import {ActivatedRoute} from "@angular/router";
+import {addServiceAction} from "../../../shared/storeUtil/utils/service/service.actions";
+import {ServiceInstanceActions} from "../../../shared/models/serviceInstanceActions";
+import {AppState} from "../../../shared/store/reducers";
+import {DrawingBoardTreeComponent} from "../drawing-board-tree/drawing-board-tree.component";
+import {AuditInfoModalComponent} from "../../../shared/components/auditInfoModal/auditInfoModal.component";
+import {ServiceModel} from "../../../shared/models/serviceModel";
+import {NgRedux} from "@angular-redux/store";
+import * as _ from 'lodash';
+import {ErrorMsgService} from "../../../shared/components/error-msg/error-msg.service";
+import {DrawingBoardModes} from "../drawing-board.modes";
+import {ServiceInstance} from "../../../shared/models/serviceInstance";
+
+@Injectable()
+export class DrawingBoardHeaderService{
+
+ constructor(private route: ActivatedRoute, private store: NgRedux<AppState>, private errorMsgService: ErrorMsgService){}
+ generateOldViewEditPath(): string{
+ let query: string =
+ `subscriberId=${this.route.snapshot.queryParams['subscriberId']}&` +
+ `subscriberName=${this.route.snapshot.queryParams['subscriberName']}&` +
+ `serviceType=${this.route.snapshot.queryParams['serviceType']}&` +
+ `serviceInstanceId=${this.route.snapshot.queryParams['serviceInstanceId']}`;
+ return '../../serviceModels.htm#/instantiate?' + query;
+ }
+
+ deleteService(serviceModelId: string, isDeleted: boolean ) {
+ if(isDeleted){
+ this.store.dispatch(addServiceAction(serviceModelId, ServiceInstanceActions.Delete));
+ DrawingBoardTreeComponent.triggerDeleteActionService.next(serviceModelId);
+ } else{
+ this.store.dispatch(addServiceAction(serviceModelId, ServiceInstanceActions.None));
+ DrawingBoardTreeComponent.triggerUndoDeleteActionService.next(serviceModelId);
+ }
+ }
+
+ showAuditInfo(serviceModelId) : void {
+ let instance: ServiceInstance = this.store.getState().service.serviceInstance[serviceModelId];
+ let model = new ServiceModel(this.store.getState().service.serviceHierarchy[serviceModelId]);
+ AuditInfoModalComponent.openInstanceAuditInfoModal.next({instanceId : serviceModelId , type : 'SERVICE', model : model , instance : instance, trackById: instance.trackById});
+ }
+
+
+ /*************************************************
+ should return true if deploy should be disabled
+ *************************************************/
+ deployShouldBeDisabled(serviceInstanceId: string, mode : string) : boolean {
+ const serviceInstance = this.store.getState().service.serviceInstance[serviceInstanceId];
+ if(!_.isNil(serviceInstance)){
+ const validationCounter = serviceInstance.validationCounter;
+ if (!_.isNil(this.errorMsgService.errorMsgObject)&& mode !== DrawingBoardModes.RETRY_EDIT) return true;
+ if(validationCounter > 0) return true;
+ if(serviceInstance.action !== ServiceInstanceActions.None) return false;
+ if(mode === DrawingBoardModes.RETRY_EDIT) return false;
+ return !serviceInstance.isDirty;
+ }
+ return true;
+ }
+
+ getModeButton(mode : string) : string {
+ switch (mode) {
+ case DrawingBoardModes.EDIT:
+ return 'UPDATE';
+ case DrawingBoardModes.RETRY_EDIT:
+ return 'REDEPLOY';
+ default: return 'DEPLOY';
+ }
+ }
+ getButtonText(mode : DrawingBoardModes) : string {
+ switch (mode) {
+ case DrawingBoardModes.EDIT:
+ case DrawingBoardModes.VIEW:
+ return 'EDIT';
+ case DrawingBoardModes.RETRY_EDIT:
+ case DrawingBoardModes.RETRY:
+ return 'REDEPLOY';
+ }
+ }
+
+ showEditService(mode: DrawingBoardModes, serviceModelId: string): boolean{
+ const serviceInstance = this.store.getState().service.serviceInstance;
+ return mode === DrawingBoardModes.CREATE || ((mode === DrawingBoardModes.RETRY_EDIT || mode === DrawingBoardModes.EDIT)&&
+ !_.isNil(serviceInstance) && !_.isNil(serviceInstance[serviceModelId])&& serviceInstance[serviceModelId].action === ServiceInstanceActions.Create);
+ }
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/drawing-board-header/tmp_instansiate_request.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/tmp_instansiate_request.ts
index 7accc3a9c..d57e0202f 100644
--- a/vid-webpack-master/src/app/drawingBoard/drawing-board-header/tmp_instansiate_request.ts
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/tmp_instansiate_request.ts
@@ -8,7 +8,7 @@ export default
"modelVersion": "10.0"
},
"owningEntityId": "038d99af-0427-42c2-9d15-971b99b9b489",
- "owningEntityName": "PACKET CORE",
+ "owningEntityName": "JULIO ERICKSON",
"projectName": "{some project name}",
"globalSubscriberId": "{some subscriber id}",
"productFamilyId": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/dragAndDrop/dragAndDrop.model.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/dragAndDrop/dragAndDrop.model.ts
new file mode 100644
index 000000000..a8e9b435a
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/dragAndDrop/dragAndDrop.model.ts
@@ -0,0 +1,15 @@
+/******************************************
+ type - node type
+ isFirstLevel : node is first level
+ ******************************************/
+
+export class DragAndDropModel {
+ type : string;
+ isFirstLevel : boolean;
+
+ constructor(type : string, isFirstLevel : boolean){
+ this.type = type;
+ this.isFirstLevel = isFirstLevel;
+ }
+
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/dragAndDrop/dragAndDrop.service.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/dragAndDrop/dragAndDrop.service.spec.ts
new file mode 100644
index 000000000..1221cef5f
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/dragAndDrop/dragAndDrop.service.spec.ts
@@ -0,0 +1,227 @@
+import {TestBed, getTestBed} from '@angular/core/testing';
+import {
+ HttpClientTestingModule,
+ HttpTestingController
+} from '@angular/common/http/testing';
+import {NgRedux} from "@angular-redux/store";
+import {DragAndDropService} from "./dragAndDrop.service";
+import {AppState} from "../../../../shared/store/reducers";
+
+class MockAppStore<T> {
+ dispatch(){
+
+ }
+ getState() {
+ return {
+ global: {
+ flags: {
+ "DRAG_AND_DROP_OPERATION" : true
+ }
+ },
+ service: {
+ serviceInstance: {
+ "serviceInstanceId": {
+ vnfs: {
+ "vnfStoreKey": {
+ isMissingData: true,
+ vfModules: {
+ "vfModulesName": {
+ "vfModulesName": {
+ isMissingData: true
+ }
+ }
+ }
+ },
+
+ "vnfStoreKey1": {
+ isMissingData: false,
+ vfModules: {
+ "vfModulesName": {
+ "vfModulesName": {
+ isMissingData: false
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+describe('Drag and drop service', () => {
+ let injector;
+ let service: DragAndDropService;
+ let httpMock: HttpTestingController;
+ let store: NgRedux<AppState>;
+
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+ imports: [HttpClientTestingModule],
+ providers: [
+ DragAndDropService,
+ {provide: NgRedux, useClass: MockAppStore}]
+ });
+ await TestBed.compileComponents();
+
+ injector = getTestBed();
+ service = injector.get(DragAndDropService);
+ httpMock = injector.get(HttpTestingController);
+ store = injector.get(NgRedux);
+ })().then(done).catch(done.fail));
+
+
+ test('drag should move element position', () => {
+ let nodes = [{
+ "modelCustomizationId": "91415b44-753d-494c-926a-456a9172bbb9",
+ "modelId": "d6557200-ecf2-4641-8094-5393ae3aae60",
+ "modelUniqueId": "91415b44-753d-494c-926a-456a9172bbb9",
+ "missingData": false,
+ "id": "tjjongy92jn",
+ "action": "Create",
+ "inMaint": false,
+ "name": "yoav2_001",
+ "modelName": "VF_vMee 0",
+ "type": "VF",
+ "isEcompGeneratedNaming": true,
+ "networkStoreKey": "VF_vMee 0:0001",
+ "vnfStoreKey": "VF_vMee 0:0001",
+ "typeName": "VNF",
+ "menuActions": {"edit": {}, "showAuditInfo": {}, "duplicate": {}, "remove": {}, "delete": {}, "undoDelete": {}},
+ "isFailed": false,
+ "statusProperties": [{"key": "Prov Status:", "testId": "provStatus"}, {
+ "key": "Orch Status:",
+ "testId": "orchStatus"
+ }],
+ "trackById": "di9khuolht",
+ "parentType": "",
+ "position": 0,
+ "children": [{
+ "modelCustomizationId": "f8c040f1-7e51-4a11-aca8-acf256cfd861",
+ "modelId": "a27f5cfc-7f12-4f99-af08-0af9c3885c87",
+ "modelUniqueId": "f8c040f1-7e51-4a11-aca8-acf256cfd861",
+ "missingData": false,
+ "id": 6654971919519,
+ "action": "Create",
+ "name": "VFModule1",
+ "modelName": "vf_vmee0..VfVmee..base_vmme..module-0",
+ "type": "VFmodule",
+ "isEcompGeneratedNaming": true,
+ "dynamicInputs": [],
+ "dynamicModelName": "vf_vmee0..VfVmee..base_vmme..module-0bykqx",
+ "typeName": "M",
+ "menuActions": {"edit": {}, "showAuditInfo": {}, "remove": {}, "delete": {}, "undoDelete": {}},
+ "isFailed": false,
+ "statusProperties": [{"key": "Prov Status:", "testId": "provStatus"}, {
+ "key": "Orch Status:",
+ "testId": "orchStatus"
+ }],
+ "trackById": "5pfyfah820h",
+ "parentType": "VNF",
+ "position": 0,
+ "errors": {}
+ }, {
+ "modelCustomizationId": "6add59e0-7fe1-4bc4-af48-f8812422ae7c",
+ "modelId": "41708296-e443-4c71-953f-d9a010f059e1",
+ "modelUniqueId": "6add59e0-7fe1-4bc4-af48-f8812422ae7c",
+ "missingData": false,
+ "id": 987761655742,
+ "action": "Create",
+ "name": "VNFModule3",
+ "modelName": "vf_vmee0..VfVmee..vmme_gpb..module-2",
+ "type": "VFmodule",
+ "isEcompGeneratedNaming": true,
+ "dynamicInputs": [],
+ "dynamicModelName": "vf_vmee0..VfVmee..vmme_gpb..module-2fjrrc",
+ "typeName": "M",
+ "menuActions": {"edit": {}, "showAuditInfo": {}, "remove": {}, "delete": {}, "undoDelete": {}},
+ "isFailed": false,
+ "statusProperties": [{"key": "Prov Status:", "testId": "provStatus"}, {
+ "key": "Orch Status:",
+ "testId": "orchStatus"
+ }],
+ "trackById": "i3dllio31bb",
+ "parentType": "VNF",
+ "position": 1,
+ "errors": {}
+ }, {
+ "modelCustomizationId": "55b1be94-671a-403e-a26c-667e9c47d091",
+ "modelId": "522159d5-d6e0-4c2a-aa44-5a542a12a830",
+ "modelUniqueId": "55b1be94-671a-403e-a26c-667e9c47d091",
+ "missingData": false,
+ "id": 873798901625,
+ "action": "Create",
+ "name": "VFModule2",
+ "modelName": "vf_vmee0..VfVmee..vmme_vlc..module-1",
+ "type": "VFmodule",
+ "isEcompGeneratedNaming": true,
+ "dynamicInputs": [],
+ "dynamicModelName": "vf_vmee0..VfVmee..vmme_vlc..module-1djjni",
+ "typeName": "M",
+ "menuActions": {"edit": {}, "showAuditInfo": {}, "remove": {}, "delete": {}, "undoDelete": {}},
+ "isFailed": false,
+ "statusProperties": [{"key": "Prov Status:", "testId": "provStatus"}, {
+ "key": "Orch Status:",
+ "testId": "orchStatus"
+ }],
+ "trackById": "w7bvw1nh47s",
+ "parentType": "VNF",
+ "position": 2,
+ "errors": {}
+ }],
+ "errors": {}
+ }, {
+ "modelCustomizationId": "91415b44-753d-494c-926a-456a9172bbb9",
+ "modelId": "d6557200-ecf2-4641-8094-5393ae3aae60",
+ "modelUniqueId": "91415b44-753d-494c-926a-456a9172bbb9",
+ "missingData": false,
+ "id": "dywch8hkomi",
+ "action": "Create",
+ "inMaint": false,
+ "name": "yoav2",
+ "modelName": "VF_vMee 0",
+ "type": "VF",
+ "isEcompGeneratedNaming": true,
+ "networkStoreKey": "VF_vMee 0",
+ "vnfStoreKey": "VF_vMee 0",
+ "typeName": "VNF",
+ "menuActions": {"edit": {}, "showAuditInfo": {}, "duplicate": {}, "remove": {}, "delete": {}, "undoDelete": {}},
+ "isFailed": false,
+ "statusProperties": [{"key": "Prov Status:", "testId": "provStatus"}, {
+ "key": "Orch Status:",
+ "testId": "orchStatus"
+ }],
+ "trackById": "fjczf1urdqo",
+ "parentType": "",
+ "position": 1,
+ "children": [],
+ "errors": {}
+ }];
+ let from = {
+ data: {
+ type: 'VF',
+ index: 1
+ }
+ };
+
+ let to = {
+ parent: {
+ data: {
+ type: 'VF',
+ index: 0
+ }
+ }
+ };
+ jest.spyOn(service, 'array_move');
+
+ service.drag(store, "serviceInstanceId", nodes, {from, to});
+
+
+ expect(service.array_move).toHaveBeenCalled();
+
+ });
+
+
+});
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/dragAndDrop/dragAndDrop.service.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/dragAndDrop/dragAndDrop.service.ts
new file mode 100644
index 000000000..01763c685
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/dragAndDrop/dragAndDrop.service.ts
@@ -0,0 +1,78 @@
+import {Injectable} from "@angular/core";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../../../shared/store/reducers";
+import {DragAndDropModel} from "./dragAndDrop.model";
+import {FeatureFlagsService, Features} from "../../../../shared/services/featureFlag/feature-flags.service";
+import * as _ from 'lodash';
+
+@Injectable()
+export class DragAndDropService {
+
+ constructor(private store: NgRedux<AppState>){}
+
+ isAllow(): boolean {
+ return FeatureFlagsService.getFlagState(Features.DRAG_AND_DROP_OPERATION, this.store);
+ }
+ /********************************************************************
+ * manage drawing-board drag and drop operation
+ * @param nodes - array with elements data.
+ * @param tree - tree instance
+ * @param node - element information
+ * @param from - element from information
+ * @param to - element to information
+ ************************************************************/
+
+ drag(store, instanceId : string , nodes, {from, to}) :void{
+ if (!store.getState().global.flags["DRAG_AND_DROP_OPERATION"]) return;
+
+ let firstLevelNames : DragAndDropModel[] = [
+ new DragAndDropModel('VF',true),
+ new DragAndDropModel('VL',true),
+ new DragAndDropModel('VFmodule',false)
+ ];
+
+ const fromObject = _.find(firstLevelNames, ['type', from.data.type]);
+ const toObject = _.find(firstLevelNames, ['type', to.parent.data.type]);
+
+ /***********************************************************************************************
+ if the type are the same and there in same level + same parent -> then change element position
+ ***********************************************************************************************/
+ if(fromObject.isFirstLevel === toObject.isFirstLevel){ // moving element in the same level and in the first level
+ if(fromObject.isFirstLevel){
+ this.array_move(nodes, from.index , to.parent.index, instanceId);
+ } else if(fromObject.isFirstLevel === toObject.isFirstLevel){
+ /* check if they have the same parent */
+ if(from.parent.data.trackById === to.parent.parent.data.trackById){
+ let vfModules = nodes.find((parents)=> {
+ return parents.trackById === to.parent.parent.data.trackById;
+ }).children;
+ this.array_move(vfModules, from.index , to.parent.index, instanceId, to.parent.parent.data.vnfStoreKey);
+ }
+ }
+ }
+ }
+
+
+ /********************************************************************
+ * move element inside array with elements position
+ * @param arr - array with elements data.
+ * @param originalPosition - element original position
+ * @param destPosition - element dest position
+ * @param destPinstanceIdosition - instance id
+ ******************************************************************/
+ array_move(arr, originalPosition, destPosition, instanceId : string, parentStoreKey?) {
+ if (destPosition >= arr.length) {
+ let k = destPosition - arr.length + 1;
+ while (k--) {
+ arr.push(undefined);
+ }
+ }
+ arr.splice(destPosition, 0, arr.splice(originalPosition, 1)[0]);
+ arr.forEach((item, index) => {
+ if(item.position !== index){
+ item.position = index;
+ item.updatePoistionFunction(this, item, instanceId, parentStoreKey);
+ }
+ });
+ };
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.component.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.component.ts
new file mode 100644
index 000000000..d0715982c
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.component.ts
@@ -0,0 +1,207 @@
+import {AfterViewInit, Component, EventEmitter, OnInit, Output, ViewChild,} from '@angular/core';
+import {ContextMenuComponent, ContextMenuService} from 'ngx-contextmenu';
+import {Constants} from '../../../shared/utils/constants';
+import {IDType, ITreeNode} from "angular-tree-component/dist/defs/api";
+import {TreeComponent, TreeModel, TreeNode} from "angular-tree-component";
+import {DialogService} from "ng2-bootstrap-modal";
+import {ActivatedRoute} from "@angular/router";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../../shared/store/reducers";
+import {IframeService} from "../../../shared/utils/iframe.service";
+import {DuplicateService} from '../duplicate/duplicate.service';
+import {DrawingBoardTreeService, TreeNodeContextMenuModel} from "./drawing-board-tree.service";
+import {NetworkPopupService} from "../../../shared/components/genericFormPopup/genericFormServices/network/network.popup.service";
+import {VfModulePopuopService} from "../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service";
+import {VnfPopupService} from "../../../shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service";
+import {SdcUiServices} from "onap-ui-angular";
+import {HighlightPipe} from "../../../shared/pipes/highlight/highlight-filter.pipe";
+import {VnfGroupPopupService} from "../../../shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service";
+import {ObjectToInstanceTreeService} from "../objectsToTree/objectToInstanceTree/objectToInstanceTree.service";
+import {SharedTreeService} from "../objectsToTree/shared.tree.service";
+import {Subject} from "rxjs/Subject";
+import {changeServiceIsDirty} from "../../../shared/storeUtil/utils/service/service.actions";
+import * as _ from 'lodash';
+import {ErrorMsgService} from "../../../shared/components/error-msg/error-msg.service";
+import {DragAndDropService} from "./dragAndDrop/dragAndDrop.service";
+import {FeatureFlagsService, Features} from "../../../shared/services/featureFlag/feature-flags.service";
+import {PopoverPlacement} from "../../../shared/components/popover/popover.component";
+
+@Component({
+ selector: 'drawing-board-tree',
+ templateUrl: './drawing-board-tree.html',
+ styleUrls: ['./drawing-board-tree.scss'],
+ providers: [HighlightPipe]
+})
+
+export class DrawingBoardTreeComponent implements OnInit, AfterViewInit {
+ _store: NgRedux<AppState>;
+ duplicateService: DuplicateService;
+ drawingBoardTreeService: DrawingBoardTreeService;
+ errorMsgService: ErrorMsgService;
+ isFilterEnabled: boolean = false;
+ filterValue: string = '';
+ contextMenuOptions: TreeNodeContextMenuModel[];
+ static triggerDeleteActionService: Subject<string> = new Subject<string>();
+ static triggerUndoDeleteActionService: Subject<string> = new Subject<string>();
+ static triggerreCalculateIsDirty: Subject<string> = new Subject<string>();
+ @ViewChild(ContextMenuComponent) public contextMenu: ContextMenuComponent;
+
+ constructor(private _contextMenuService: ContextMenuService,
+ private _iframeService: IframeService,
+ private dialogService: DialogService,
+ private store: NgRedux<AppState>,
+ private route: ActivatedRoute,
+ private _duplicateService: DuplicateService,
+ private modalService: SdcUiServices.ModalService,
+ private _drawingBoardTreeService: DrawingBoardTreeService,
+ private _networkPopupService: NetworkPopupService,
+ private _vfModulePopuopService: VfModulePopuopService,
+ private _vnfPopupService: VnfPopupService,
+ private _vnfGroupPopupService: VnfGroupPopupService,
+ private _errorMsgService: ErrorMsgService,
+ private _highlightPipe: HighlightPipe,
+ private _objectToInstanceTreeService: ObjectToInstanceTreeService,
+ private _sharedTreeService: SharedTreeService,
+ private _dragAndDropService : DragAndDropService) {
+
+ this.errorMsgService = _errorMsgService;
+ this.duplicateService = _duplicateService;
+ this.drawingBoardTreeService = _drawingBoardTreeService;
+ this.contextMenuOptions = _drawingBoardTreeService.generateContextMenuOptions();
+
+ DrawingBoardTreeComponent.triggerDeleteActionService.subscribe((serviceModelId) => {
+ this._sharedTreeService.shouldShowDeleteInstanceWithChildrenModal(this.nodes, serviceModelId, (node, serviceModelId)=>{
+ this.drawingBoardTreeService.deleteActionService(this.nodes, serviceModelId);
+ this.store.dispatch(changeServiceIsDirty(this.nodes, serviceModelId));
+ });
+ });
+
+ DrawingBoardTreeComponent.triggerUndoDeleteActionService.subscribe((serviceModelId) => {
+ this.drawingBoardTreeService.undoDeleteActionService(this.nodes, serviceModelId);
+ this.store.dispatch(changeServiceIsDirty(this.nodes, serviceModelId));
+ });
+
+ DrawingBoardTreeComponent.triggerreCalculateIsDirty.subscribe((serviceModelId) => {
+ this.store.dispatch(changeServiceIsDirty(this.nodes, serviceModelId));
+ });
+
+ this._store = store;
+ this.route
+ .queryParams
+ .subscribe(params => {
+ this.serviceModelId = params['serviceModelId'];
+ });
+ }
+
+ getNodeId(node: ITreeNode): string {
+ return (node.data.parentType !== "" ? (node.data.parentType + "_") : "") + node.data.typeName;
+ }
+
+ updateNodes(updateData: { nodes: any, filterValue: string }): void {
+ this.nodes = updateData.nodes;
+ this.filterValue = updateData.filterValue;
+ }
+
+ @Output()
+ highlightNode: EventEmitter<number> = new EventEmitter<number>();
+
+ @ViewChild('tree') tree: TreeComponent;
+ missingDataTooltip: string = Constants.Error.MISSING_VNF_DETAILS;
+ currentNode: ITreeNode = null;
+ flags: any;
+ nodes = [];
+ serviceModelId: string;
+ options = {
+ allowDrag: this._dragAndDropService.isAllow(),
+ actionMapping: {
+ mouse: {
+ drop: (tree:TreeModel, node:TreeNode, $event:any, {from, to}) => {
+ this._dragAndDropService.drag(this.store, this.serviceModelId, this.nodes, {from, to});
+ }
+ }
+ },
+ nodeHeight: 45,
+ dropSlotHeight: 1
+ };
+ parentElementClassName = 'content';
+
+ ngOnInit(): void {
+ this.store.subscribe(() => {
+ this.updateTree();
+ });
+ this.updateTree()
+ }
+
+ getNodeName(node: ITreeNode, filter: string) {
+ return this._highlightPipe.transform(node.data.name, filter ? filter : '');
+ }
+
+ updateTree() {
+ const serviceInstance = this.store.getState().service.serviceInstance[this.serviceModelId];
+ this.nodes = this._objectToInstanceTreeService.convertServiceInstanceToTreeData(serviceInstance, this.store.getState().service.serviceHierarchy[this.serviceModelId]);
+ console.log('right nodes', this.nodes);
+
+ }
+
+
+ ngAfterViewInit(): void {
+ this.tree.treeModel.expandAll();
+ }
+
+ public onContextMenu($event: MouseEvent, node: ITreeNode): void {
+ this.flags = this.store.getState().global.flags;
+
+ this.currentNode = node;
+ node.focus();
+ node.setActiveAndVisible(false);
+ this.selectNode(node);
+ setTimeout(() => {
+ this._contextMenuService.show.next({
+ contextMenu: this.contextMenu,
+ event: <any>$event,
+ item: node,
+ });
+ $event.preventDefault();
+ $event.stopPropagation();
+ }, 250);
+
+ }
+
+
+ executeMenuAction(methodName: string): void {
+ if (!_.isNil(this.currentNode.data.menuActions) && !_.isNil(this.currentNode.data.menuActions[methodName])) {
+ this.currentNode.data.menuActions[methodName]['method'](this.currentNode, this.serviceModelId);
+ this.store.dispatch(changeServiceIsDirty(this.nodes, this.serviceModelId));
+ }
+ }
+
+ isEnabled(node: ITreeNode, serviceModelId: string, methodName: string): boolean {
+ if (!_.isNil(this.currentNode) && !_.isNil(this.currentNode.data.menuActions) && !_.isNil(this.currentNode.data.menuActions[methodName])) {
+ return this.currentNode.data.menuActions[methodName]['enable'](this.currentNode, this.serviceModelId);
+ }
+ return false;
+ }
+
+ isVisible(node: ITreeNode, methodName: string): boolean {
+ if (!_.isNil(this.currentNode) && !_.isNil(this.currentNode.data.menuActions) && !_.isNil(this.currentNode.data.menuActions[methodName])) {
+ return this.currentNode.data.menuActions[methodName]['visible'](this.currentNode, this.serviceModelId);
+ }
+ return false;
+ }
+
+ public selectNode(node: ITreeNode): void {
+ node.expand();
+ this._sharedTreeService.setSelectedVNF(node);
+ this.highlightNode.emit(node.data.modelUniqueId);
+ if (FeatureFlagsService.getFlagState(Features.FLAG_1906_COMPONENT_INFO, this.store)) {
+ node.data.onSelectedNode(node);
+ }
+ }
+
+ expandParentByNodeId(id: IDType): void {
+ this.tree.treeModel.getNodeById(id).parent.expand();
+ }
+
+}
+
+
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.html b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.html
new file mode 100644
index 000000000..8af909ffc
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.html
@@ -0,0 +1,96 @@
+<error-msg></error-msg>
+<div class="drawing-board-tree" style="height: calc(100vh - 55px);">
+ <div *ngIf="nodes?.length == 0" style="text-align: center; margin-top: 50px;">
+ <no-content-message-and-icon class="span-over"
+ data-title="Please add objects (VNFs, network, modules etc.)"
+ title2="from the left tree to design the service instance"
+ subtitle="Once done, click Deploy to start instantiation"
+ iconPath="./assets/img/UPLOAD.svg"
+ iconClass="upload-icon-service-planing"></no-content-message-and-icon>
+ </div>
+ <div class="tree-header" *ngIf="nodes?.length > 0">
+ <div class="title-tree">Instance:</div>
+ <search-component (updateNodes)="updateNodes($event)"
+ [nodes]="nodes" [tree]="tree"
+ [inputTestId]="'search-right-tree'"
+ *ngIf="drawingBoardTreeService.isViewEditFlagTrue()"></search-component>
+ </div>
+ <tree-root [attr.data-tests-id]="'drawing-board-tree'" #tree [nodes]="nodes" [options]="options"
+ id="drawing-board-tree">
+
+ <ng-template #treeNodeTemplate let-node let-index="index" >
+ <div [attr.id]="getNodeId(node)" [attr.data-tests-id]="'node-'+node.data.modelId +'-' +node.data.modelName" (click)="selectNode(node)" >
+ <custom-popover class="failed-popover-wrap" *ngIf= "node?.data?.isFailed" [value]= "node?.data?.statusMessage" [placement]="'left'" [popoverType]="'error'">
+ <div class="failed-msg" [attr.data-tests-id]="'failed-error-message'" *ngIf= "node?.data?.isFailed">Failed</div>
+ </custom-popover>
+ <div class="instance-type" style="position: relative;">
+ <div *ngIf="node?.data?.action == 'Create'" class="notShowOnViewMode notShowOnCreateMode newIcon"></div>
+ <div><span title="{{node.data.type}}" [attr.data-tests-id]="'node-type-indicator'">{{node?.data?.typeName}}</span></div>
+ </div>
+ <div class="model-info">
+ <span class="header-info">
+ <span class="property-name">
+ <span class="auto-name"
+ [ngClass]="{'text_decoration' : drawingBoardTreeService.isTextDecoration(node)}"
+ [innerHtml]="getNodeName(node, filterValue) | safe : 'html'"
+ [attr.data-tests-id]="'node-name'"
+ ></span>
+ </span>
+ </span>
+ <tree-node-header-properties
+ *ngIf="(node?.data?.action !== 'Create' || node?.data?.parentType === 'VnfGroup') && !node?.data?.isFailed"
+ [properties]="node.data.statusProperties"></tree-node-header-properties>
+ </div>
+ <div class="scaling invalid" *ngIf="node?.data?.errors?.scalingError" [attr.data-tests-id]="'scaling-policy'">
+ <span>Limit</span><span>{{node?.data?.limitMembers}}</span>
+ </div>
+ <div class="model-actions notShowOnViewMode">
+ <span class="icon-browse"
+ [attr.data-tests-id]="'node-'+node.data.modelId +'-' +node.data.modelName+'-menu-btn'"
+ (click)="onContextMenu($event, node)">
+ <context-menu>
+ <ng-template *ngFor="let contextMenuOption of contextMenuOptions"
+ contextMenuItem (execute)="executeMenuAction(contextMenuOption.methodName)"
+ [visible]="isVisible(currentNode, contextMenuOption.methodName)"
+ [enabled]="isEnabled(currentNode, serviceModelId, contextMenuOption.methodName)">
+ <div [attr.data-tests-id]="contextMenuOption.dataTestId">
+ <div style="float: left;margin-top: 3px;">
+ <svg-icon
+ [ngClass]="contextMenuOption.iconClass"
+ class="icon-edit"
+ [size]="'small'"
+ [name]="contextMenuOption.iconClass">
+ </svg-icon></div>
+ <div style="padding-left: 25px;">{{contextMenuOption.label}}</div>
+ </div>
+ </ng-template>
+ </context-menu>
+ </span>
+ <span
+ *ngIf="drawingBoardTreeService.isVNFMissingData(node, serviceModelId)"
+ tooltip="{{ missingDataTooltip }}"
+ tooltipPlacement="left"
+ [attr.data-tests-id]="'node-'+node.data.modelId +'-' +node.data.modelName+'-alert-icon'"
+ class="icon-alert" >
+ <svg-icon
+ [mode]="'warning'"
+ [testId]="'icon-alert'"
+ [size]="'medium'"
+ [name]="'alert-triangle-o'">
+ </svg-icon>
+ </span>
+
+ <!--<span *ngIf="drawingBoardTreeService.isVNFMissingData(node, serviceModelId)" class="icon-alert"-->
+ <!--tooltip="{{ missingDataTooltip }}" tooltipPlacement="left"-->
+ <!--[attr.data-tests-id]="'node-'+node.data.modelId +'-' +node.data.modelName+'-alert-icon'"></span>-->
+ <span *ngIf="drawingBoardTreeService.isVFModuleMissingData(node, serviceModelId)" class="icon-alert"
+ tooltip="{{ missingDataTooltip }}" tooltipPlacement="left"
+ [attr.data-tests-id]="'node-'+node.data.modelId +'-' +node.data.modelName+'-alert-icon'"></span>
+ </div>
+ </div >
+ </ng-template>
+ </tree-root>
+</div>
+
+
+
diff --git a/vid-webpack-master/src/app/drawingBoard/drawing-board-tree/drawing-board-tree.scss b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.scss
index fed9ead10..be9f9f2d4 100644
--- a/vid-webpack-master/src/app/drawingBoard/drawing-board-tree/drawing-board-tree.scss
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.scss
@@ -11,11 +11,19 @@
span.toggle-children {
@include highlight(white, #009FDB);
border-right: none;
+ .isFailed {
+ left: 0px !important;
+ }
}
}
+
}
}
+#VNF > node-content-wrapper {
+ border: 1px dashed #D2D2D2 !important;
+}
+
@mixin highlight-tree-node-content {
tree-node-content {
> div {
@@ -28,23 +36,55 @@
}
}
+#RETRY_EDIT drawing-board-tree tree-node-collection > div,
+#RETRY drawing-board-tree tree-node-collection > div {
+ margin-top: 0px;
+ width: calc(100% - 50px);
+ margin-left: auto;
+ }
+
drawing-board-tree {
+ flex: 1;
+ color: #5A5A5A;
+ line-height: 14px;
+ flex-direction:column;
+
+ &.col-md-6,&.col-md-5{
+ padding: 0;
+ }
+ .tree-header {
+ display: flex;
+ justify-content: space-between;
+ .title-tree {
+ font-family: OpenSans-SemiBold;
+ font-size: 16px;
+ color: #191919;
+ text-align: left;
+ text-transform: uppercase;
+ padding-bottom: 48px;
+ }
+ .search-container {
+ width: 275px;
+ }
+ }
+ .highlight {
+ background-color: #9DD9EF;
+ }
.toggle-children-wrapper.toggle-children-wrapper-expanded {
.toggle-children:before {
color: #009FDB;
}
}
-
- overflow: auto;
- flex: 1;
- color: #5A5A5A;
- line-height: 14px;
.drawing-board-tree {
width: 100%;
+ padding: 30px 45px;
+ }
+
+ .tree-node-level-1 {
+ margin-bottom: 10px;
}
tree-viewport {
- padding: 50px 3.5% 1% 6%;
tree-node {
tree-node-drop-slot {
.node-drop-slot {
@@ -57,14 +97,17 @@ drawing-board-tree {
.node-wrapper {
@include highlight-toggle-children;
.node-content-wrapper-focused,
- .node-content-wrapper-active
- {
+ .node-content-wrapper-active {
+ @include highlight-toggle-children;
@include highlight(#E6F6FB, #009FDB);
- .property-name {
- color: #009FDB;
+ .property-name,.instance-type {
+ color: #009FDB !important;
+ position: relative;
}
- .auto-name {
- font-family: OpenSans-Regular !important;
+ .status-properties {
+ .status-property-value,.status-property-name {
+ color: #009FDB;
+ }
}
.icon-browse:before {
color: #5A5A5A;
@@ -81,30 +124,29 @@ drawing-board-tree {
}
.tree-node-active .tree-children {
- border: 1px solid #009FDB;
- padding: 20px;
+ //border: 1px solid #009FDB;
+ padding-left: 45px;
}
-
-
.tree-node.tree-node-active.tree-node-expanded {
- border: 1px solid #009FDB;
}
- .tree-node-leaf .node-wrapper{
- margin-left: -45px;
+ .tree-children .tree-node-leaf .node-wrapper{
+ margin-left: -5px;
}
+ .tree-node.tree-node-expanded > tree-node-wrapper{
+ box-shadow: 0 2px 2px 0 rgba(0,0,0,.1);
+ position: relative;
+ z-index: 1;
+ display: block;
+ }
tree-node-wrapper {
.node-wrapper {
height: 45px;
&:hover {
- @include highlight-toggle-children;
- .node-content-wrapper {
- @include highlight(#E6F6FB, #009FDB);
- .property-name {
- color: #009FDB;
- }
+ .node-content-wrapper:not(.node-content-wrapper-focused) {
+ background: #F2F2F2;
.icon-browse:before {
color: #5A5A5A;
}
@@ -114,6 +156,9 @@ drawing-board-tree {
tree-node-expander {
font-family: 'icomoon' !important;
height: 100%;
+ .failed-msg {
+
+ }
.toggle-children-wrapper {
padding: 0;
display: block;
@@ -151,6 +196,7 @@ drawing-board-tree {
width:45px;
}
}
+
.node-content-wrapper {
padding: 0;
background: none;
@@ -159,33 +205,93 @@ drawing-board-tree {
border: 1px solid #D2D2D2;
height: 100%;
flex: 1;
+ .resourceGroup {
+ border: 1px dashed #D2D2D2 !important;
+ }
tree-node-content {
> div {
height: 100%;
display: flex;
align-items: center;
- justify-content: space-between;
- .model-info {
+
+ .instance-type {
+ width: 40px;
+ height: 100%;
+ padding-top: 16px;
+ text-transform: uppercase;
+ text-align: center;
+ border-right: 1px solid #D2D2D2;
+ word-break: break-all;
+ color: #959595;
+ font-size: 13px;
+ font-family: OpenSans-SemiBold;
+ .newIcon {
+ background: #45B16D;
+ position: absolute;
+ top: 5%;
+ width: 90%;
+ left: 5%;
+ right: 5%;
+ border-radius: 2px;
+ height: 5px;
+ }
+ span {
+ width: 40px;
+ display: block;
+ }
+ } > span {
flex: 1;
- display: flex;
- justify-content: space-between;
- align-items: center;
- padding-left: 8px;
- > span {
- flex: 1;
- padding: 0 8px;
- span:nth-child(2) {
- display: block;
+ display: block;
+
+ span:nth-child(2) {
+ display: block;
+ }
+ }
+ .model-info {
+ padding-left: 16px;
+ width: 100%;
+ .property-name {
+ font-family: OpenSans-SemiBold;
+ font-size: 13px;
+ color: #191919;
+ //text-transform: capitalize; problematic with search
+ .auto-name{
+ display: inline-flex;//required for search more then one sub highlight,
+ font-size: 13px;
+ }
+ .text_decoration{
+ text-decoration: line-through;
+ }
+
+ .text_decoration:after {
+ height: 10px;
}
}
+ tree-node-header-properties{
+ display: block;
+ }
+ }
+ .scaling {
+ background: #4ca90c;
+ padding: 5px;
+ border-radius: 3px;
+ font-family: OpenSans-SemiBold;
+ font-size: 12px;
+ color: #FFF9F9;
+ &.invalid{
+ background: #cf2a2a;
+ }
+ span:first-child{
+ margin-right: 3px;
+ }
}
.model-actions {
display: flex;
align-items: center;
- padding-right: 12px;
.icon-browse {
padding: 0;
width: 30px;
+ height: 24px;
&:before {
content: "\e924";
font-size: 24px;
@@ -201,31 +307,17 @@ drawing-board-tree {
}
.icon-alert {
- padding-left: 10px;
- &:before {
- content: "\e904";
- font-size: 16px;
- color: #ffb81c;
- }
+ padding-right: 10px;
}
}
}
}
- .property-name {
- font-family: OpenSans-Semibold;
- font-size: 12px;
- line-height: 12px;
- color: #191919;
- text-transform: capitalize;
- }
}
-
-
}
}
tree-node-children {
.tree-children {
- padding: 20px;
+ padding-left: 45px;
.model-info span:first-child {
flex: 1.1 !important;
}
@@ -234,6 +326,44 @@ drawing-board-tree {
}
}
}
+
+
+.tree-node-level-1.tree-node.tree-node-expanded {
+ .failed-popover-wrap {
+ left: -50px !important;
+ position: absolute;
+ }
+}
+.tree-node-level-1 {
+ .failed-popover-wrap {
+ left: 45px !important;
+ position: absolute;
+ }
+}
+
+.tree-node-level-2.tree-node.tree-node-leaf {
+ .failed-popover-wrap {
+ left: 135px !important;
+ position: absolute;
+ }
+}
+
+.tree-node-level-1.tree-node.tree-node-collapsed {
+ .failed-popover-wrap{
+ left: 0px !important;
+ position: absolute;
+ }
+}
+
+.failed-msg{
+ background: #cf2a2a;
+ padding: 5px;
+ border-radius: 3px;
+ font-family: OpenSans-SemiBold;
+ font-size: 12px;
+ color: #FFF9F9;
+}
+
.cdk-overlay-pane.ngx-contextmenu {
ul.dropdown-menu {
width: 200px;
@@ -272,3 +402,4 @@ drawing-board-tree {
}
}
+
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.service.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.service.spec.ts
new file mode 100644
index 000000000..1b913cfe9
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.service.spec.ts
@@ -0,0 +1,147 @@
+import {TestBed, getTestBed} from '@angular/core/testing';
+import {
+ HttpClientTestingModule,
+ HttpTestingController
+} from '@angular/common/http/testing';
+import {NgRedux} from "@angular-redux/store";
+import {DrawingBoardTreeService, TreeNodeContextMenuModel} from "./drawing-board-tree.service";
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+
+ class MockAppStore<T>{
+ getState() {
+ return {
+ service : {
+ serviceInstance : {
+ "serviceInstanceId" : {
+ vnfs : {
+ "vnfStoreKey" : {
+ isMissingData : true,
+ vfModules : {
+ "vfModulesName" : {
+ "vfModulesName" : {
+ isMissingData : true
+ }
+ }
+ }
+ },
+
+ "vnfStoreKey1" : {
+ isMissingData : false,
+ vfModules : {
+ "vfModulesName" : {
+ "vfModulesName" : {
+ isMissingData : false
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+describe('Drawing board tree Service', () => {
+ let injector;
+ let service: DrawingBoardTreeService;
+ let httpMock: HttpTestingController;
+
+
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+ imports: [HttpClientTestingModule],
+ providers: [
+ DrawingBoardTreeService,
+ {provide: NgRedux, useClass: MockAppStore}]
+ });
+ await TestBed.compileComponents();
+
+ injector = getTestBed();
+ service = injector.get(DrawingBoardTreeService);
+ httpMock = injector.get(HttpTestingController);
+
+ })().then(done).catch(done.fail));
+
+
+
+
+ test('generateContextMenuOptions should return list of optional context menu', () => {
+ const options : TreeNodeContextMenuModel[] = service.generateContextMenuOptions();
+ const expected : TreeNodeContextMenuModel[] = [
+ new TreeNodeContextMenuModel('edit', 'context-menu-edit', 'Edit', 'edit-file-o'),
+ new TreeNodeContextMenuModel('duplicate', 'context-menu-duplicate', 'Duplicate', 'copy-o'),
+ new TreeNodeContextMenuModel('showAuditInfo', 'context-menu-showAuditInfo', 'Show audit info', 'eye-o'),
+ new TreeNodeContextMenuModel('addGroupMember', 'context-menu-addGroupMember', 'Add group members', 'plus'),
+ new TreeNodeContextMenuModel('delete', 'context-menu-delete', 'Delete', 'trash-o'),
+ new TreeNodeContextMenuModel('remove', 'context-menu-remove', 'Remove', 'trash-o'),
+ new TreeNodeContextMenuModel('undoDelete', 'context-menu-undoDelete', 'Undo Delete', 'undo-delete')
+ ];
+ expect(options.length).toEqual(7);
+ expect(options).toEqual(expected);
+ });
+
+ test('isVNFMissingData should return true if vnf isMissingData = true', () => {
+ let node : ITreeNode = <any>{
+ data : {
+ type : 'VF',
+ vnfStoreKey : "vnfStoreKey"
+ }
+ };
+ let result : boolean = service.isVNFMissingData(node, "serviceInstanceId");
+ expect(result).toBeTruthy();
+ });
+
+
+ test('isVNFMissingData should return false if vnf has isMissingData = false', () => {
+ let node : ITreeNode = <any>{
+ data : {
+ type : 'VFModule',
+ modelName : "vfModulesName",
+ dynamicModelName : "vfModulesName",
+ parent : {
+ vnfStoreKey : "vnfStoreKey1",
+ type : 'VF'
+ }
+ }
+ };
+ let result : boolean = service.isVNFMissingData(node, "serviceInstanceId");
+ expect(result).toBeFalsy();
+ });
+
+
+ test('isVFModuleMissingData should return true if vnfModule has isMissingData = true', () => {
+ let node : ITreeNode = <any>{
+ data : {
+ type : 'VFModule',
+ modelName : "vfModulesName",
+ dynamicModelName : "vfModulesName",
+ parent : {
+ vnfStoreKey : "vnfStoreKey",
+ type : 'VF'
+ }
+ }
+ };
+ let result : boolean = service.isVFModuleMissingData(node, "serviceInstanceId");
+ expect(result).toBeFalsy();
+ });
+
+
+ test('isVFModuleMissingData should return false if vnfModule has isMissingData = false', () => {
+ let node : ITreeNode = <any>{
+ data : {
+ type : 'VFModule',
+ modelName : "vfModulesName",
+ dynamicModelName : "vfModulesName",
+ parent : {
+ vnfStoreKey : "vnfStoreKey1",
+ type : 'VF'
+ }
+ }
+ };
+ let result : boolean = service.isVFModuleMissingData(node, "serviceInstanceId");
+ expect(result).toBeFalsy();
+ });
+
+});
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.service.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.service.ts
new file mode 100644
index 000000000..17f761c41
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.service.ts
@@ -0,0 +1,129 @@
+import {Injectable} from "@angular/core";
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import * as _ from 'lodash';
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../../shared/store/reducers";
+import {FeatureFlagsService, Features} from "../../../shared/services/featureFlag/feature-flags.service";
+import {ServiceInstanceActions} from "../../../shared/models/serviceInstanceActions";
+
+@Injectable()
+export class DrawingBoardTreeService {
+ constructor(private store: NgRedux<AppState>){}
+ isVFModuleMissingData(node: ITreeNode, serviceModelId : string): boolean {
+ if(node.data.type === 'VFmodule' &&!_.isNil(this.store.getState().service.serviceInstance[serviceModelId].vnfs) && !_.isNil(this.store.getState().service.serviceInstance[serviceModelId].vnfs[node.parent.data.vnfStoreKey])){
+ if(!_.isNil(this.store.getState().service.serviceInstance[serviceModelId].vnfs[node.parent.data.vnfStoreKey].vfModules)
+ && !_.isNil(this.store.getState().service.serviceInstance[serviceModelId].vnfs[node.parent.data.vnfStoreKey].vfModules[node.data.modelName])
+ && !_.isNil(this.store.getState().service.serviceInstance[serviceModelId].vnfs[node.parent.data.vnfStoreKey].vfModules[node.data.modelName][node.data.dynamicModelName])){
+
+ return this.store.getState().service.serviceInstance[serviceModelId].vnfs[node.parent.data.vnfStoreKey].vfModules[node.data.modelName][node.data.dynamicModelName].isMissingData;
+ }
+ }
+ return false;
+ }
+
+ isVNFMissingData(node : ITreeNode, serviceModelId : string) : boolean {
+ if(node.data.type == 'VF' && !_.isNil(this.store.getState().service.serviceInstance[serviceModelId].vnfs[node.data.vnfStoreKey])){
+ return this.store.getState().service.serviceInstance[serviceModelId].vnfs[node.data.vnfStoreKey].isMissingData;
+ }
+ }
+
+ isViewEditFlagTrue():boolean{
+ return FeatureFlagsService.getFlagState(Features.FLAG_1902_NEW_VIEW_EDIT, this.store);
+ }
+
+ /**********************************************
+ return all drawing board context menu options
+ ***********************************************/
+ generateContextMenuOptions() : TreeNodeContextMenuModel[]{
+ return [
+ new TreeNodeContextMenuModel('edit', 'context-menu-edit', 'Edit', 'edit-file-o'),
+ new TreeNodeContextMenuModel('duplicate', 'context-menu-duplicate', 'Duplicate', 'copy-o'),
+ new TreeNodeContextMenuModel('showAuditInfo', 'context-menu-showAuditInfo', 'Show audit info', 'eye-o'),
+ new TreeNodeContextMenuModel('addGroupMember', 'context-menu-addGroupMember', 'Add group members', 'plus'),
+ new TreeNodeContextMenuModel('delete', 'context-menu-delete', 'Delete', 'trash-o'),
+ new TreeNodeContextMenuModel('remove', 'context-menu-remove', 'Remove', 'trash-o'),
+ new TreeNodeContextMenuModel('undoDelete', 'context-menu-undoDelete', 'Undo Delete', 'undo-delete')
+ ];
+ }
+
+
+ /*******************************************************************
+ delete or remove all service child's on delete existing service
+ *******************************************************************/
+ deleteActionService(nodes : ITreeNode[], serviceModelId : string){
+ if(!_.isNil(nodes)){
+ for(let node of nodes){
+ node.data = node;
+ if(!_.isNil(node.children)){
+ node.children.map((child)=>{
+ child.data = child;
+ child.parent = node;
+ });
+ }
+
+ let menuActionsName : string = node.data.action === ServiceInstanceActions.Create ? 'remove' : 'delete';
+ if(!_.isNil(node.data.menuActions) && !_.isNil(node.data.menuActions[menuActionsName])){
+ node.data.menuActions[menuActionsName]['method'](node, serviceModelId)
+ }
+
+ }
+ }
+ }
+ /*******************************************************************
+ undo delete all service child's on undo delete existing service
+ *******************************************************************/
+ undoDeleteActionService(nodes : ITreeNode[], serviceModelId : string){
+ if(!_.isNil(nodes)){
+ for(let node of nodes){
+ node.data = node;
+ if(!_.isNil(node.children)){
+ node.children.map((child)=>{
+ child.data = child;
+ child.parent = node;
+ });
+ }
+
+ if(!_.isNil(node.data.menuActions) && !_.isNil(node.data.menuActions['undoDelete'])){
+ node.data.menuActions['undoDelete']['method'](node, serviceModelId)
+ }
+ }
+ }
+ }
+
+ /***********************************************************
+ return true if should add line hover the instance name
+ ***********************************************************/
+ isTextDecoration(node) : boolean{
+ return !_.isNil(node.data) && !_.isNil(node.data.action) && node.data.action.split('_').pop() === 'Delete';
+ }
+
+
+ /******************************************
+ should create object of instances action
+ ******************************************/
+ generateServiceActionObject(nodes){
+ let obj = {};
+ let index = 0;
+ for(let node of nodes){
+ obj[index] = {};
+ index++;
+ }
+ }
+}
+
+export class TreeNodeContextMenuModel {
+ methodName: string;
+ dataTestId: string;
+ label: string;
+ iconClass: string;
+
+ constructor(methodName: string,
+ dataTestId: string,
+ label: string,
+ iconClass: string) {
+ this.methodName = methodName;
+ this.dataTestId = dataTestId;
+ this.label = label;
+ this.iconClass = iconClass;
+ }
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/instance.tree.generator.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/instance.tree.generator.ts
new file mode 100644
index 000000000..188feaaba
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/instance.tree.generator.ts
@@ -0,0 +1,8 @@
+import {Injectable} from "@angular/core";
+
+@Injectable()
+export class InstanceTreeGenerator {
+ convertServiceInstanceToTreeData(serviceInstance, serviceModelId : string) {
+
+ }
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component.html b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component.html
new file mode 100644
index 000000000..dae6762e0
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component.html
@@ -0,0 +1,5 @@
+<div class="status-properties" *ngFor="let prop of properties">
+ <span class="status-property-name" [ngClass]="{'mark': prop.key=='In-maintenance'}">{{ prop.key }}</span>
+ <span class="status-property-value" [attr.data-tests-id]="'status-property-'+prop?.testId" >{{ prop.value }}</span>
+ <span class="separator">|</span>
+</div>
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component.scss b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component.scss
new file mode 100644
index 000000000..305de8cd7
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component.scss
@@ -0,0 +1,24 @@
+.status-properties{
+ display: inline-block;
+ font-family: OpenSans-Regular;
+ font-size: 12px;
+ padding-top: 3px;
+ .status-property-name{
+ color: #5A5A5A;
+ &.mark{
+ background-color: #959595;
+ color: #ffffff;
+ }
+ }
+ .status-property-value{
+ color: #191919;
+ }
+ .separator{
+ padding: 0 8px;
+ }
+ &:last-child .separator{
+ display: none;
+ }
+
+}
+
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component.spec.ts
new file mode 100644
index 000000000..047f2e89d
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component.spec.ts
@@ -0,0 +1,25 @@
+import {ComponentFixture, TestBed } from '@angular/core/testing';
+import { TreeNodeHeaderPropertiesComponent } from './tree-node-header-properties.component';
+
+describe('TreeNodeHeaderPropertiesComponent', () => {
+ let component: TreeNodeHeaderPropertiesComponent;
+ let fixture: ComponentFixture<TreeNodeHeaderPropertiesComponent>;
+
+
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+ declarations: [ TreeNodeHeaderPropertiesComponent ]
+ });
+ await TestBed.compileComponents();
+
+ fixture = TestBed.createComponent(TreeNodeHeaderPropertiesComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+
+ })().then(done).catch(done.fail));
+
+
+ test('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component.ts
new file mode 100644
index 000000000..535d7ea52
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component.ts
@@ -0,0 +1,10 @@
+import {Component, Input} from '@angular/core';
+
+@Component({
+ selector: 'tree-node-header-properties',
+ templateUrl: './tree-node-header-properties.component.html',
+ styleUrls: ['./tree-node-header-properties.component.scss']
+})
+export class TreeNodeHeaderPropertiesComponent {
+ @Input() properties : object[] = [];
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board.modes.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board.modes.ts
new file mode 100644
index 000000000..452666f91
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board.modes.ts
@@ -0,0 +1,8 @@
+export enum DrawingBoardModes {
+ RETRY = 'RETRY',
+ RETRY_EDIT = 'RETRY_EDIT',
+ VIEW = 'VIEW',
+ EDIT = 'EDIT',
+ OLD_VIEW_EDIT = 'OLD_VIEW_EDIT',
+ CREATE = 'CREATE'
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate-vnf.component.html b/vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate-vnf.component.html
new file mode 100644
index 000000000..c5f43b9c8
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate-vnf.component.html
@@ -0,0 +1,19 @@
+<div>
+ <div>
+ <span style="font-weight: bold;">
+ Please select the number of additional instances you want to add of this node.
+ </span>
+ </div>
+ <div>
+ <span style="font-weight: bold;">
+ Important: VID will duplicate this node including its children.
+ </span>
+ </div>
+
+ <div class="duplicate-number">
+ <select class="quantity-select" [(ngModel)]="duplicateNumber" name="duplicate" [attr.data-tests-id]="'duplicate-amount-vfmodules'" id="duplicate-select" (change)="onDuplicateNumberChange()">
+ <option *ngFor="let item of duplicateOptions" [value]="item">{{item}}</option>
+ </select>
+ </div>
+ <!--TODO max -->
+</div>
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate-vnf.component.scss b/vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate-vnf.component.scss
new file mode 100644
index 000000000..f5b566d0b
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate-vnf.component.scss
@@ -0,0 +1,9 @@
+.quantity-select {
+ width: 100%;
+ font-family: inherit;
+ font-size: inherit;
+ border: 1px solid #009FDB;
+ margin-top: 10px;
+ padding-left: 7px;
+ height: 30px;
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate-vnf.component.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate-vnf.component.ts
new file mode 100644
index 000000000..e1c5d7296
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate-vnf.component.ts
@@ -0,0 +1,25 @@
+import { Component } from '@angular/core';
+import * as _ from 'lodash';
+import {DuplicateService} from "./duplicate.service";
+
+@Component({
+ selector: 'duplicate-vnf',
+ templateUrl : './duplicate-vnf.component.html',
+ styleUrls : ['./duplicate-vnf.component.scss']
+})
+export class DuplicateVnfComponent {
+ duplicateNumber : number = 1;
+ duplicateOptions : number[] = [];
+ duplicateService:DuplicateService;
+ constructor( private _duplicateService: DuplicateService ){
+ this.duplicateService = _duplicateService;
+ this.duplicateOptions = _.range(1, this._duplicateService.maxNumberOfDuplicate + 1);
+ this.onDuplicateNumberChange();
+ }
+
+ onDuplicateNumberChange() {
+ this.duplicateService.setNumberOfDuplicates(+this.duplicateNumber);
+ }
+
+
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate.service.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate.service.spec.ts
new file mode 100644
index 000000000..81251cb1a
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate.service.spec.ts
@@ -0,0 +1,449 @@
+import { DuplicateService } from './duplicate.service';
+import { LogService } from '../../../shared/utils/log/log.service';
+import { NgRedux } from '@angular-redux/store';
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import { SdcUiServices} from "onap-ui-angular";
+import {IModalConfig} from "onap-ui-angular/dist/components/common";
+import {AppState} from "../../../shared/store/reducers";
+import {getTestBed, TestBed} from "@angular/core/testing";
+
+class MockAppStore<T> {
+ getState(){
+ return {
+ getState() {
+ return {
+ service : {
+ serviceHierarchy: {
+ "serviceId" : {
+ vnfs : {
+ "vnfModelName" : {
+ properties : {
+ max_instances : 2
+ }
+ },
+ "vnfModelName2" : {
+ properties : {
+ max_instances : 2
+ }
+ },
+ "vnfModelName3" : {
+ properties : {
+ }
+ }
+ }
+ }
+ },
+ serviceInstance : {
+ "serviceId" : {
+ existingVNFCounterMap : {
+ "vnfModelId" : 1,
+ "vnfModelId2" : 2,
+ "vnfModelId3" : 0
+ }
+ }
+
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+class MockModalService<T> {}
+
+describe('Drawing board tree service', () => {
+ let injector;
+ let service: DuplicateService;
+ let store : NgRedux<AppState>;
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+ providers : [
+ DuplicateService,
+ LogService,
+ {provide: NgRedux, useClass: MockAppStore},
+ {provide: SdcUiServices.ModalService, useClass: MockModalService}
+ ]
+ });
+ await TestBed.compileComponents();
+
+ injector = getTestBed();
+ service = injector.get(DuplicateService);
+ store = injector.get(NgRedux);
+
+ })().then(done).catch(done.fail));
+
+
+ test('setNumberOfDuplicates should set number of duplicates', ()=>{
+ service.setNumberOfDuplicates(10);
+ expect(service.numberOfDuplicates).toEqual(10);
+ });
+
+ test('isEnabled should return false if type is VNF and has missing data', ()=>{
+ let node = {
+ data : {
+ type : 'VF',
+ menuActions : {
+ duplicate : () => {
+
+ }
+ }
+ }
+ };
+ spyOn(node.data.menuActions, 'duplicate').and.returnValue(true);
+ spyOn(service, 'hasMissingData').and.returnValue(true);
+ let result : boolean = service.isEnabled(<any>node, null, null);
+ expect(result).toBeFalsy();
+ });
+
+ test('openDuplicateModal', ()=>{
+ spyOn(service, 'getRemainsInstance').and.returnValue(1);
+ let result : IModalConfig = service.openDuplicateModal(
+ 'currentServiceId',
+ 'currentServiceId',
+ 'currentId',
+ 'storeKey',
+ 2,
+ null,null);
+ expect(result.title).toEqual('Duplicate Node');
+ });
+
+ test('openDuplicateModal should call getRemainsInstance with correct parameters', ()=>{
+ spyOn(service, 'getRemainsInstance');
+ service.openDuplicateModal(
+ 'currentServiceId',
+ 'currentServiceId',
+ 'currentId',
+ 'storeKey',
+ 2,
+ null,null);
+ expect(service.getRemainsInstance).toHaveBeenCalledWith('currentServiceId', 'currentId', 'currentServiceId', null, null);
+ });
+
+ test('canDuplicate VNF should return true', () => {
+ sessionStorage.setItem('reduxState' , JSON.stringify({global : { flags : {FLAG_DUPLICATE_VNF : true}}}));
+ let node : ITreeNode = <any> {data : {type : 'VF'}};
+
+ let result = service.canDuplicate(node);
+ expect(result).toBeTruthy();
+ });
+
+ test('canDuplicate Network should return true', () => {
+ sessionStorage.setItem('reduxState' , JSON.stringify({global : { flags : {FLAG_DUPLICATE_VNF : true}}}));
+ let node : ITreeNode = <any> {data : {type : 'VL'}};
+
+ let result = service.canDuplicate(node);
+ expect(result).toBeTruthy();
+ });
+
+ test('canDuplicate VFModule should return false', () => {
+ sessionStorage.setItem('reduxState' , JSON.stringify({global : { flags : {FLAG_DUPLICATE_VNF : true}}}));
+ let node : ITreeNode = <any> {data : {type : 'VFModule'}};
+
+ let result = service.canDuplicate(node);
+ expect(result).toBeFalsy();
+ });
+
+ test('Drawing board tree service should be defined', () => {
+ expect(service).toBeDefined();
+ });
+
+ test('DrawingBoardDuplicateService should be defined', () => {
+ expect(service).toBeDefined();
+ });
+
+ test('Duplicate multi vnfs should save multi vnfs in redux', () => {
+ service.existingNames = {
+ "2017488_adiodvpe": "",
+ "rrr": "",
+ "ttt": ""
+ };
+ let newVnfs = service.cloneVnf(<any>{
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2mtlfi": {
+ "instanceName": "rrr",
+ "volumeGroupName": "ttt"
+ }
+ }
+ },
+ "originalName": null,
+ "trackById": "pfs1f0len3",
+ "instanceName": "2017488_ADIODvPE"
+ }, "2017-488_ADIOD-vPE 0");
+
+ expect(newVnfs.instanceName).toBe("2017488_ADIODvPE_001");
+ expect(newVnfs.vfModules['2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2']['2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2mtlfi'].instanceName).toBe("rrr_001");
+ expect(newVnfs.vfModules['2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2']['2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2mtlfi'].volumeGroupName).toBe("ttt_001");
+
+ newVnfs = service.cloneVnf(<any>{
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2mtlfi": {
+ "instanceName": "rrr",
+ "volumeGroupName": "ttt"
+ }
+ }
+ },
+ "originalName": null,
+ "trackById": "pfs1f0len3",
+ "instanceName": "2017488_ADIODvPE"
+ }, "2017-488_ADIOD-vPE 0");
+
+ expect(newVnfs.instanceName).toBe("2017488_ADIODvPE_002");
+ expect(newVnfs.vfModules['2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2']['2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2mtlfi'].instanceName).toBe("rrr_002");
+ expect(newVnfs.vfModules['2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2']['2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2mtlfi'].volumeGroupName).toBe("ttt_002");
+ });
+
+ test('ensure name is unique - send new name - shouldn\'t change name', () => {
+ service.existingNames = {
+ "2017488_adiodvpe": "",
+ "uniqueinstancename": ""
+ };
+ const name = "uniqueInstanceName-1";
+ let uniqueName: string = service.ensureUniqueNameOrGenerateOne(name);
+ expect(uniqueName).toEqual(name);
+ });
+
+ test('ensure name is unique send existing name should change name', () => {
+ service.existingNames = {
+ "2017488_adiodvpe": "",
+ "uniqueinstancename-1": ""
+ };
+ const name = "uniqueInstanceName-1";
+ let uniqueName: string = service.ensureUniqueNameOrGenerateOne(name);
+ expect(uniqueName).toEqual(name + "_001");
+ });
+
+ test('isAlreadyExist - send new name should return false', () => {
+ service.existingNames = {
+ "2017488_adiodvpe": "",
+ "uniqueinstancename": ""
+ };
+ const name = "uniqueinstancename-1";
+ let isExist: boolean = service.isAlreadyExists(name, service.existingNames);
+ expect(isExist).toBeFalsy();
+ });
+
+ test('isAlreadyExist - send existing name should return true', () => {
+ service.existingNames = {
+ "2017488_adiodvpe": "",
+ "uniqueinstancename-1": ""
+ };
+ const name = "uniqueinstancename-1";
+ let isExist: boolean = service.isAlreadyExists(name, service.existingNames);
+ expect(isExist).toBeTruthy();
+ });
+
+ test('isAlreadyExist - send existing name case insensitive should return true', () => {
+ service.existingNames = {
+ "2017488_adiodvpe": "",
+ "uniqueinstancename-1": ""
+ };
+ const name = "uniqueInstanceName-1";
+ let isExist: boolean = service.isAlreadyExists(name, service.existingNames);
+ expect(isExist).toBeTruthy();
+ });
+
+ test('getNumberAsPaddingString should return 001 if padding is 000 and val is 1 string', () => {
+ let paddingNumber: string = service.getNumberAsPaddingString(1, '0000');
+ expect(paddingNumber).toEqual('0001');
+ });
+
+ test('getNumberAsPaddingString should return 010 if padding is 000 and val is 10 string', () => {
+ let paddingNumber: string = service.getNumberAsPaddingString(10, '0000');
+ expect(paddingNumber).toEqual('0010');
+ });
+
+ test('generateVNFUniqueName should return the next free number', () => {
+ const vnfName: string = "VF_vMee 0";
+ let result: string = service.generateUniqueStoreKey(
+ "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ vnfName,
+ getExistingVNFs(),
+ {}
+ );
+
+ expect(result).toEqual(vnfName + ":0003");
+ });
+
+ test('generateVNFUniqueName on duplicate multi vnfs should return the next free number', () => {
+ spyOn(service, 'openDuplicateModal');
+ service.openDuplicateModal(null, null, null,null, 2, null, null);
+
+ expect(service.openDuplicateModal).toHaveBeenCalledWith(null, null, null,null, 2, null, null);
+ });
+
+
+ test('isEnabled should return false if node has missing data', () => {
+ let node = {
+ data : {
+ missingData: true,
+ menuActions : {
+ duplicate : () => {
+
+ }
+ }
+ }
+ };
+ let result : boolean = service.isEnabled(<any>node, null, null);
+ expect(result).toBeFalsy();
+ });
+
+ test('isEnabled should return true if not reach to max', () => {
+ let node = {
+ data : {
+ missingData: false, modelName : "vnfModelName" , modelId : "vnfModelId", type : "VF", children: [], modelCustomizationId : "vnfModelId",modelUniqueId: "vnfModelId",
+ menuActions : {
+ duplicate : () => {
+
+ }
+ }
+ }
+ };
+ let result : boolean = service.isEnabled(<any>node, <any>getStoreState(), "serviceId");
+ expect(result).toBeTruthy();
+ });
+
+ test('isEnabled should return false if reach to max', () => {
+ let node = {
+ data : {
+ missingData: false, modelName : "vnfModelName2" , modelId : "vnfModelId2", type : "VF" ,children: [],
+ menuActions : {
+ duplicate : () => {
+
+ }
+ }
+ }
+ };
+ let result : boolean = service.isEnabled(<any>node, <any>getStoreState(), "serviceId");
+ expect(result).toBeFalsy();
+ });
+
+ test('isEnabled should return true if max is null', () => {
+ let node = {
+ data : {
+ missingData: false, modelName : "vnfModelName3" , modelId : "vnfModelId3",type : "VF", children: [], modelUniqueId: "vnfModelId3",
+ menuActions : {
+ duplicate : () => {
+
+ }
+ }
+ }
+ };
+ let result : boolean = service.isEnabled(<any>node, <any>getStoreState(), "serviceId");
+ expect(result).toBeTruthy();
+ });
+
+ test('isEnabled should return false if type is vf module', () => {
+ let node = {
+ data : {
+ missingData: false, modelName : "vnfModelName3" , modelId : "vnfModelId3",type : "VFModule", children: [],
+ menuActions : {
+ }
+ }
+ };
+ let result : boolean = service.isEnabled(<any>node, <any>getStoreState(), "serviceId");
+ expect(result).toBeFalsy();
+ });
+
+ test('getRemainsVNFinstance should return the remains 1 VNF', () => {
+ let result : number = service.getRemainsInstance("vnfModelId", "vnfModelName" , "serviceId" , <any>getStoreState(), <any>{data : {type : 'VF'}});
+ expect(result).toBe(1);
+ });
+
+ test('getRemainsVNFinstance should return the remains 0 VNF', () => {
+ let result : number = service.getRemainsInstance("vnfModelId2", "vnfModelName2" , "serviceId" , <any>getStoreState(),<any>{data : {type : 'VF'}});
+ expect(result).toBe(0);
+ });
+
+ test('isVNFChildrensHasMissingData should return true if vnf missing data = true', () => {
+ let result : boolean = service.hasMissingData(<any>getTreeNode(true,false));
+ expect(result).toBeTruthy();
+ });
+
+ test('isVNFChildrensHasMissingData return should false if vnf missing data = false', () => {
+ let result : boolean = service.hasMissingData(<any>getTreeNode(false,false));
+ expect(result).toBeFalsy();
+ });
+
+ test('isVNFChildrensHasMissingData should return true if vfModule missing data = true', () => {
+ let result : boolean = service.hasMissingData(<any>getTreeNode(false,true));
+ expect(result).toBeTruthy();
+ });
+
+ test('isVNFChildrensHasMissingData should return false if no children and vfModule missing data = false', () => {
+ let node = <any>getTreeNode(false,false);
+ node.data.children = [];
+ let result : boolean = service.hasMissingData(node);
+ expect(result).toBeFalsy();
+ });
+
+ function getExistingVNFs(){
+ return {"VF_vMee 0":{"rollbackOnFailure":"true","vfModules":{"vf_vmee0..VfVmee..vmme_vlc..module-1":{"vf_vmee0..VfVmee..vmme_vlc..module-1dgbxq":{"modelInfo":{"modelInvariantId":"98a7c88b-b577-476a-90e4-e25a5871e02b","modelVersionId":"522159d5-d6e0-4c2a-aa44-5a542a12a830","modelName":"VfVmee..vmme_vlc..module-1","modelVersion":"2","modelCustomizationId":"55b1be94-671a-403e-a26c-667e9c47d091","modelCustomizationName":"VfVmee..vmme_vlc..module-1"},"instanceParams":[{}]}}},"productFamilyId":"17cc1042-527b-11e6-beb8-9e71128cae77","lcpCloudRegionId":"hvf6","tenantId":"bae71557c5bb4d5aac6743a4e5f1d054","lineOfBusiness":"ONAP","platformName":"platform","modelInfo":{"modelInvariantId":"4160458e-f648-4b30-a176-43881ffffe9e","modelVersionId":"d6557200-ecf2-4641-8094-5393ae3aae60","modelName":"VF_vMee","modelVersion":"2.0","modelCustomizationId":"91415b44-753d-494c-926a-456a9172bbb9","modelCustomizationName":"VF_vMee 0"}},"VF_vMee 0:0001":{"rollbackOnFailure":"true","vfModules":{"vf_vmee0..VfVmee..vmme_vlc..module-1":{"vf_vmee0..VfVmee..vmme_vlc..module-1dgbxq":{"modelInfo":{"modelInvariantId":"98a7c88b-b577-476a-90e4-e25a5871e02b","modelVersionId":"522159d5-d6e0-4c2a-aa44-5a542a12a830","modelName":"VfVmee..vmme_vlc..module-1","modelVersion":"2","modelCustomizationId":"55b1be94-671a-403e-a26c-667e9c47d091","modelCustomizationName":"VfVmee..vmme_vlc..module-1"},"instanceParams":[{}]}}},"productFamilyId":"17cc1042-527b-11e6-beb8-9e71128cae77","lcpCloudRegionId":"hvf6","tenantId":"bae71557c5bb4d5aac6743a4e5f1d054","lineOfBusiness":"ONAP","platformName":"platform","modelInfo":{"modelInvariantId":"4160458e-f648-4b30-a176-43881ffffe9e","modelVersionId":"d6557200-ecf2-4641-8094-5393ae3aae60","modelName":"VF_vMee","modelVersion":"2.0","modelCustomizationId":"91415b44-753d-494c-926a-456a9172bbb9","modelCustomizationName":"VF_vMee 0"},"originalName":"VF_vMee 0"},"VF_vMee 0:0002":{"rollbackOnFailure":"true","vfModules":{"vf_vmee0..VfVmee..vmme_vlc..module-1":{"vf_vmee0..VfVmee..vmme_vlc..module-1dgbxq":{"modelInfo":{"modelInvariantId":"98a7c88b-b577-476a-90e4-e25a5871e02b","modelVersionId":"522159d5-d6e0-4c2a-aa44-5a542a12a830","modelName":"VfVmee..vmme_vlc..module-1","modelVersion":"2","modelCustomizationId":"55b1be94-671a-403e-a26c-667e9c47d091","modelCustomizationName":"VfVmee..vmme_vlc..module-1"},"instanceParams":[{}]}}},"productFamilyId":"17cc1042-527b-11e6-beb8-9e71128cae77","lcpCloudRegionId":"hvf6","tenantId":"bae71557c5bb4d5aac6743a4e5f1d054","lineOfBusiness":"ONAP","platformName":"platform","modelInfo":{"modelInvariantId":"4160458e-f648-4b30-a176-43881ffffe9e","modelVersionId":"d6557200-ecf2-4641-8094-5393ae3aae60","modelName":"VF_vMee","modelVersion":"2.0","modelCustomizationId":"91415b44-753d-494c-926a-456a9172bbb9","modelCustomizationName":"VF_vMee 0"},"originalName":"VF_vMee 0"}}
+ }
+
+ function getStoreState(){
+ return {
+ getState() {
+ return {
+ service : {
+ serviceHierarchy: {
+ "serviceId" : {
+ vnfs : {
+ "vnfModelName" : {
+ properties : {
+ ecomp_generated_naming: "false",
+ max_instances : 2
+ }
+ },
+ "vnfModelName2" : {
+ properties : {
+ ecomp_generated_naming: "false",
+ max_instances : 2
+ }
+ },
+ "vnfModelName3" : {
+ properties : {
+ ecomp_generated_naming: "false",
+ }
+ }
+ }
+ }
+ },
+ serviceInstance : {
+ "serviceId" : {
+ existingVNFCounterMap : {
+ "vnfModelId" : 1,
+ "vnfModelId2" : 2,
+ "vnfModelId3" : 0
+ }
+ }
+
+ }
+ }
+ }
+ }
+ }
+ }
+
+
+ function getTreeNode(VNfMissingData : boolean, vfModuleMissingData : boolean){
+ return {
+ data : {
+ children : vfModuleMissingData ?
+ [{
+ missingData : true
+ }] :
+ [{
+ missingData : false
+ }
+ ],
+ missingData : VNfMissingData
+ }
+ }
+ }
+});
+
+
+
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate.service.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate.service.ts
new file mode 100644
index 000000000..e695edf86
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate.service.ts
@@ -0,0 +1,189 @@
+import { Injectable } from '@angular/core';
+import { ITreeNode } from 'angular-tree-component/dist/defs/api';
+import { AppState } from '../../../shared/store/reducers';
+import { LogService } from '../../../shared/utils/log/log.service';
+import { NgRedux } from '@angular-redux/store';
+import {VnfInstance} from "../../../shared/models/vnfInstance";
+import {VfModuleMap} from "../../../shared/models/vfModulesMap";
+import * as _ from "lodash";
+import {DefaultDataGeneratorService} from "../../../shared/services/defaultDataServiceGenerator/default.data.generator.service";
+import {TypeNodeInformation} from "../typeNodeInformation.model";
+import { SdcUiServices} from "onap-ui-angular";
+import { SdcUiCommon} from "onap-ui-angular";
+import {changeInstanceCounter, duplicateBulkInstances} from "../../../shared/storeUtil/utils/general/general.actions";
+import {IModalConfig} from "onap-ui-angular/dist/modals/models/modal-config";
+
+@Injectable()
+export class DuplicateService {
+
+ constructor(private _logService : LogService, private _store: NgRedux<AppState>, modalService: SdcUiServices.ModalService) {
+ this.modalService = modalService;
+ }
+
+ numberOfDuplicates:number;
+ setNumberOfDuplicates(numberOfDuplicates: number) {
+ this.numberOfDuplicates = numberOfDuplicates;
+ }
+
+ currentInstanceId: string = null;
+ currentServiceId: string = null;
+ maxNumberOfDuplicate: number = 0;
+ storeKey: string = null;
+ padding = '0000';
+ modalService: SdcUiServices.ModalService;
+ store : NgRedux<AppState>;
+ existingNames : {[key: string] : any};
+ currentNode : ITreeNode = null;
+
+
+
+ canDuplicate(node: ITreeNode): boolean {
+ let reduxState = <AppState>JSON.parse(sessionStorage.getItem('reduxState'));
+ return reduxState.global.flags['FLAG_DUPLICATE_VNF'] && (node.data.type === 'VF' || node.data.type === 'VL');
+ }
+
+ isEnabled(node: ITreeNode, store: NgRedux<AppState>, serviceId : string): boolean {
+ if(!_.isNil(node) && !_.isNil(node.data.menuActions['duplicate'])){
+ if(this.hasMissingData(node)) return false;
+ const typeNodeInformation : TypeNodeInformation = new TypeNodeInformation(node);
+ const max : number = store.getState().service.serviceHierarchy[serviceId][typeNodeInformation.hierarchyName][node.data.modelName].properties['max_instances'] || 1;
+ const currentExisting: number = store.getState().service.serviceInstance[serviceId][typeNodeInformation.existingMappingCounterName][node.data.modelUniqueId];
+
+ return max - currentExisting > 0;
+ }else {
+ return false;
+ }
+ }
+
+ hasMissingData(node : ITreeNode): boolean {
+ if(!_.isNil(node)){
+ if(node.data.missingData) return true;
+ if(!_.isNil(node.data.children)){
+ for(let child of node.data.children) {
+ if(child.missingData){
+ return true;
+ }
+ }
+ }
+
+ }
+ return false;
+ }
+
+ getRemainsInstance(modelId : string, modelName : string, serviceId : string, store: NgRedux<AppState>, node : ITreeNode) : number {
+ const typeNodeInformation : TypeNodeInformation = new TypeNodeInformation(node);
+ const properties = store.getState().service.serviceHierarchy[serviceId][typeNodeInformation.hierarchyName][modelName].properties;
+ const currentExisting : number = store.getState().service.serviceInstance[serviceId][typeNodeInformation.existingMappingCounterName][modelId];
+ return (!_.isNil(properties) && !_.isNil(properties['max_instances'])) ? properties['max_instances'] - currentExisting : null;
+ }
+
+
+
+ openDuplicateModal(currentServiceId: string, currentUuid: string, currentId: string, storeKey : string, numberOfDuplicate: number, _store : NgRedux<AppState>, node: ITreeNode): IModalConfig {
+ this.currentInstanceId = currentId;
+ this.currentServiceId = currentServiceId;
+ this.maxNumberOfDuplicate = this.getRemainsInstance(currentUuid, currentId, currentServiceId, _store, node);
+ this.storeKey = storeKey;
+ this.store = _store;
+ this.currentNode = node;
+
+
+ return {
+ size: SdcUiCommon.ModalSize.medium,
+ title: 'Duplicate Node',
+ type: SdcUiCommon.ModalType.custom,
+ buttons: [
+ {text: 'Duplicate', callback: this.duplicate.bind(this, this.currentNode), closeModal: true},
+ {text: 'Cancel', closeModal: true}
+ ]
+ };
+ }
+
+ duplicate(node : ITreeNode): void {
+ const typeNodeInformation : TypeNodeInformation = new TypeNodeInformation(node);
+ this.existingNames = this.store.getState().service.serviceInstance[this.currentServiceId].existingNames;
+ const toClone = this.store.getState().service.serviceInstance[this.currentServiceId][typeNodeInformation.hierarchyName][this.storeKey];
+ let newObjects = {};
+ for(let i = 0; i < this.numberOfDuplicates; i++) {
+ const uniqueStoreKey = this.generateUniqueStoreKey(this.currentServiceId, this.currentInstanceId, this.store.getState().service.serviceInstance[this.currentServiceId][typeNodeInformation.hierarchyName], newObjects);
+ const clone = this.cloneVnf(toClone, this.currentInstanceId);
+ newObjects[uniqueStoreKey] = clone;
+ }
+ this.store.dispatch(duplicateBulkInstances(this.currentServiceId, newObjects, this.existingNames, node));
+ this.store.dispatch(changeInstanceCounter(toClone.modelInfo.modelUniqueId, this.currentServiceId, this.numberOfDuplicates, node));
+ this._logService.info("Duplicate " + this.storeKey + " serviceId: " + this.currentServiceId + "number of duplicate: " + this.numberOfDuplicates, toClone);
+ }
+
+
+ cloneVnf(vnf : VnfInstance, originalName: string): VnfInstance {
+ let newUniqueVnf : VnfInstance = _.cloneDeep(vnf);
+
+ newUniqueVnf.originalName = originalName;
+ newUniqueVnf.trackById = DefaultDataGeneratorService.createRandomTrackById();
+ if (!_.isNil(vnf.instanceName)){
+ newUniqueVnf.instanceName = this.ensureUniqueNameOrGenerateOne(vnf.instanceName);
+ }
+
+ for (let vf_module_model_name in vnf.vfModules) {
+ const vfModuleModel: VfModuleMap = vnf.vfModules[vf_module_model_name];
+ for (let vfModule in vfModuleModel) {
+ newUniqueVnf.vfModules[vf_module_model_name][vfModule].trackById = DefaultDataGeneratorService.createRandomTrackById();
+ if (!_.isNil(vfModuleModel[vfModule].instanceName)){
+ newUniqueVnf.vfModules[vf_module_model_name][vfModule].instanceName = this.ensureUniqueNameOrGenerateOne(vfModuleModel[vfModule].instanceName);
+ }
+ if (!_.isNil(vfModuleModel[vfModule].volumeGroupName)){
+ newUniqueVnf.vfModules[vf_module_model_name][vfModule].volumeGroupName = this.ensureUniqueNameOrGenerateOne(vfModuleModel[vfModule].volumeGroupName);
+ }
+ }
+ }
+ return newUniqueVnf;
+ }
+
+ ensureUniqueNameOrGenerateOne(instanceName){
+ let uniqueInstanceName = instanceName;
+ if (this.isAlreadyExists(instanceName, this.existingNames)) {
+ uniqueInstanceName = this.generateNextUniqueName(instanceName, this.existingNames);
+ this.existingNames[uniqueInstanceName.toLowerCase()] = "";
+ }
+ return uniqueInstanceName;
+ }
+
+
+ isAlreadyExists(name : string, existingNames : {[key: string] : any}){
+ return _.has(existingNames, name.toLowerCase());
+ }
+
+ generateNextUniqueName(name : string, existingNames : {[key: string] : any}) :string{
+ let suffix = "000";
+ let counter = 1;
+ if (name.match(/^.*_[\d]{3}$/)){
+ name = name.substring(0, name.length - 4);
+ }
+
+ while(true){
+ let paddingNumber : string = this.getNumberAsPaddingString(counter, suffix);
+ let candidateUniqueName = name + '_' + paddingNumber;
+ if(!this.isAlreadyExists(candidateUniqueName, existingNames)){
+ return candidateUniqueName;
+ }
+ counter++;
+ }
+ }
+
+ generateUniqueStoreKey(serviceId : string, objectName : string, existing : any, newObjects: any) : string {
+ let counter = 1;
+ while(true){
+ let paddingNumber : string = this.getNumberAsPaddingString(counter, this.padding);
+ const name = objectName + ':' + paddingNumber;
+ if(_.isNil(existing[name]) && _.isNil(newObjects[name])){
+ return name;
+ }
+ counter++;
+ }
+ }
+
+ getNumberAsPaddingString(val: number, padding: string): string {
+ const str = "" + val;
+ return padding.substring(0, padding.length - str.length) + str;
+ }
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/dynamicInputs.service.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/dynamicInputs.service.spec.ts
new file mode 100644
index 000000000..56bf94f48
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/dynamicInputs.service.spec.ts
@@ -0,0 +1,24 @@
+import {DynamicInputsService} from "./dynamicInputs.service";
+import {HttpClientTestingModule} from "@angular/common/http/testing";
+import {getTestBed, TestBed} from "@angular/core/testing";
+import {NgReduxTestingModule} from "@angular-redux/store/testing";
+describe('DynamicInputs service', () => {
+ let injector;
+ let service: DynamicInputsService;
+
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+ imports: [HttpClientTestingModule, NgReduxTestingModule],
+ providers: [
+ DynamicInputsService
+ ]
+ });
+ await TestBed.compileComponents();
+ injector = getTestBed();
+ service = injector.get(DynamicInputsService);
+ })().then(done).catch(done.fail));
+
+ test('DynamicInputs should be defined', () => {
+ expect(service).toBeDefined();
+ });
+});
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/dynamicInputs.service.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/dynamicInputs.service.ts
new file mode 100644
index 000000000..cb0e7cf5d
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/dynamicInputs.service.ts
@@ -0,0 +1,143 @@
+import {Injectable} from "@angular/core";
+import {Utils} from "../../../shared/utils/utils";
+import {Constants} from "../../../shared/utils/constants";
+import Parameter = Constants.Parameter;
+
+@Injectable()
+export class DynamicInputsService {
+ public getArbitraryInputs(inputs) {
+ let parameter;
+ let parameterList = [];
+ for (let key in inputs) {
+ parameter = {
+ id: key,
+ type: Parameter.STRING,
+ name: key,
+ value: inputs[key][Parameter.DEFAULT],
+ isRequired: inputs[key][Parameter.REQUIRED],
+ description: inputs[key][Parameter.DESCRIPTION]
+ };
+ switch (inputs[key][Parameter.TYPE]) {
+ case Parameter.INTEGER:
+ parameter.type = Parameter.NUMBER;
+ break;
+ case Parameter.BOOLEAN:
+ parameter.type = Parameter.BOOLEAN;
+ break;
+ case Parameter.RANGE:
+ break;
+ case Parameter.LIST:
+ parameter.type = Parameter.LIST;
+ break;
+ case Parameter.MAP:
+ parameter.type = Parameter.MAP;
+ break;
+ }
+ if (Utils.hasContents(inputs[key][Parameter.CONSTRAINTS])
+ && ( inputs[key][Parameter.CONSTRAINTS].length > 0 )) {
+ let constraintsArray = inputs[key][Parameter.CONSTRAINTS];
+ this.addConstraintParameters(parameterList, constraintsArray, key, inputs, parameter);
+ }
+ else {
+
+ parameterList.push(parameter);
+ }
+ }
+ return parameterList;
+ }
+
+ private addConstraintParameters(parameterList, constraintsArray, key, inputs, parameter) {
+ // If there are constraints and the operator is "valid_values",
+ // use a select parameter type.
+ let i: number = constraintsArray.length;
+ let parameterPushed: boolean = false;
+ if (i > 0) {
+ while ((i--) && (!parameterPushed)) {
+ let keys = Object.keys(constraintsArray[i]);
+ for (let operator in keys) {
+ switch (keys[operator]) {
+ case Parameter.VALID_VALUES:
+ let j: number = constraintsArray[i][Parameter.VALID_VALUES].length;
+ if (j > 0) {
+ let oList = [];
+ let option;
+ while (j--) {
+ option = {
+ name: constraintsArray[i][Parameter.VALID_VALUES][j],
+ isDefault: false
+ };
+ if ((Utils.hasContents(inputs[key][Parameter.DEFAULT]) )
+ && (inputs[key][Parameter.DEFAULT] === constraintsArray[i][Parameter.VALID_VALUES][j] )) {
+ option = {
+ name: constraintsArray[i][Parameter.VALID_VALUES][j],
+ isDefault: true
+ }
+ }
+ oList.push(option);
+ }
+ parameter.type = Parameter.SELECT;
+ parameter.optionList = oList;
+ parameterList.push(parameter);
+ parameterPushed = true;
+ }
+ break;
+
+ case Parameter.EQUAL:
+ if (constraintsArray[i][Parameter.EQUAL] != null) {
+ parameter.type = Parameter.STRING;
+ parameter.isReadOnly = true;
+ parameter.value = constraintsArray[i][Parameter.EQUAL];
+ parameterList.push(parameter);
+ parameterPushed = true;
+ }
+ break;
+
+ case Parameter.LENGTH:
+ if (constraintsArray[i][Parameter.LENGTH] != null) {
+ parameter.minLength = constraintsArray[i][Parameter.LENGTH];
+ parameter.maxLength = constraintsArray[i][Parameter.LENGTH];
+ parameterList.push(parameter);
+ parameterPushed = true;
+ }
+ break;
+ case Parameter.MAX_LENGTH:
+ if (constraintsArray[i][Parameter.MAX_LENGTH] != null) {
+ parameter.maxLength = constraintsArray[i][Parameter.MAX_LENGTH];
+ parameterList.push(parameter);
+ parameterPushed = true;
+ }
+ break;
+ case Parameter.MIN_LENGTH:
+ if (constraintsArray[i][Parameter.MIN_LENGTH] != null) {
+ parameter.minLength = constraintsArray[i][Parameter.MIN_LENGTH];
+ parameterList.push(parameter);
+ parameterPushed = true;
+ }
+ break;
+ case Parameter.IN_RANGE:
+ if (constraintsArray[i][Parameter.IN_RANGE] != null) {
+ if (constraintsArray[i][Parameter.IN_RANGE].length > 1) {
+ parameter.min = constraintsArray[i][Parameter.IN_RANGE][0];
+ parameter.max = constraintsArray[i][Parameter.IN_RANGE][1];
+ parameter.type = Parameter.NUMBER;
+ parameter.value = inputs[key][Parameter.DEFAULT];
+ parameterList.push(parameter);
+ parameterPushed = true;
+ }
+ }
+ break;
+ case Parameter.GREATER_THAN:
+ if (constraintsArray[i][Parameter.GREATER_THAN] != null) {
+ parameter.type = Parameter.NUMBER;
+ parameter.min = constraintsArray[i][Parameter.GREATER_THAN];
+ parameter.value = inputs[key][Parameter.DEFAULT];
+ parameterList.push(parameter);
+ parameterPushed = true;
+ }
+ break;
+ }
+ }
+ }
+ }
+ };
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/basic.model.info.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/basic.model.info.ts
new file mode 100644
index 000000000..51b6cfacb
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/basic.model.info.ts
@@ -0,0 +1,121 @@
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import {AvailableNodeIcons} from "../../available-models-tree/available-models-tree.service";
+
+export interface ILevelNodeInfo {
+ /** Name of the key inside the serviceHierarchy object **/
+ name: string;
+
+ /** Type of the object**/
+ type: string;
+
+ /** Child name inside the of the serviceHierarchy object (if exist) **/
+ childName?: string;
+
+ /** Child type the of object (if exist) **/
+ childType?: string;
+
+ /** model type name **/
+ typeName?: string;
+
+ /** is instance failed **/
+ isFailed?: boolean;
+
+ /** number of failed **/
+ numberOfFailed?: number;
+
+ /***********************************************************
+ * return node position
+ * @param instance - instance
+ ************************************************************/
+ getNodePosition(instance, deepNodeName? : string) : number;
+
+ /***********************************************************
+ * return if user should provide instance name or not
+ * @param currentModel - The model of current object
+ * @param parentModel - The parent model of current object.
+ ************************************************************/
+ isEcompGeneratedNaming(currentModel, parentModel?): boolean;
+
+
+ /***********************
+ * update node position
+ ***********************/
+ updatePosition(node, that, instanceId, parentStoreKey?) : void;
+
+ /***********************************************************
+ * return object instance
+ * @param modelId - The model id
+ * @param serviceHierarchy - The serviceHierarchy store
+ * @param instance - existing instance details
+ ************************************************************/
+ getModel(modelId: string, instance: any, serviceHierarchy): any;
+
+ /***********************************************************
+ * return dynamic inputs of current model
+ * @param currentModel - The model of current object
+ ************************************************************/
+ updateDynamicInputsDataFromModel(currentModel): any;
+
+ /***********************************************************
+ * return tree node instance
+ * @param instance - The model of current object
+ * @param model - The model of current object
+ * @param parentModel
+ * @param storeKey - instance storeKey if exist (for duplicate)
+ ************************************************************/
+ createInstanceTreeNode(instance: any, model: any, parentModel: any, storeKey: string): any
+
+ /***********************************************************
+ * return if instance has some missing data
+ * @param instance - The instance of current object
+ * @param dynamicInputs
+ * @param isEcompGeneratedNaming - boolean
+ ************************************************************/
+ hasMissingData(instance, dynamicInputs: any, isEcompGeneratedNaming: boolean): boolean;
+
+ /************************
+ * return object tooltip
+ ************************/
+ getTooltip(): string;
+
+ /************************
+ * return object type
+ ************************/
+ getType(): string;
+
+ /************************************
+ * return child model option object
+ ***********************************/
+ getNextLevelObject(): any;
+
+ /***********************************************************
+ * open popup
+ * @param node - current ITrees node
+ * @param serviceModelId - service id
+ ************************************************************/
+ onClickAdd(node: ITreeNode, serviceModelId: string): void;
+
+ /***********************************************************
+ * get number of existing node instance
+ * @param node - current ITrees node
+ * @param serviceModelId - service id
+ ************************************************************/
+ getNodeCount(node: ITreeNode, serviceModelId: string): number;
+
+ /***********************************************************
+ * should show node icon
+ * @param node - current ITrees node
+ * @param serviceModelId - service id
+ ************************************************************/
+ showNodeIcons(node: ITreeNode, serviceModelId: string): AvailableNodeIcons;
+
+ /***********************************************************
+ * should return list of actions and there methods
+ * @param node - current ITrees node
+ * @param serviceModelId
+ ************************************************************/
+ getMenuAction(node: ITreeNode, serviceModelId: string): { [methodName: string]: { method: Function, visible: Function, enable: Function } };
+
+
+ onSelectedNode(node : ITreeNode): void
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/configuration/configuration.model.info.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/configuration/configuration.model.info.spec.ts
new file mode 100644
index 000000000..d99ec3bc6
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/configuration/configuration.model.info.spec.ts
@@ -0,0 +1,1500 @@
+import {HttpClientTestingModule} from "@angular/common/http/testing";
+import {TestBed} from "@angular/core/testing";
+import {MockNgRedux, NgReduxTestingModule} from "@angular-redux/store/testing";
+import {DynamicInputsService} from "../../dynamicInputs.service";
+import {ConfigurationModelInfo} from "./configuration.model.info";
+import {SharedTreeService} from "../../shared.tree.service";
+
+describe('Vnf Model Info', () => {
+ let _dynamicInputsService : DynamicInputsService;
+ let _sharedTreeService : SharedTreeService;
+
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+ imports: [HttpClientTestingModule, NgReduxTestingModule],
+ providers: [
+ MockNgRedux,
+ SharedTreeService,
+ DynamicInputsService]
+ });
+ await TestBed.compileComponents();
+ })().then(done).catch(done.fail));
+
+ test('ConfigurationModelInfo should be defined', () => {
+ expect(ConfigurationModelInfo).toBeDefined();
+ });
+
+ test('ConfigurationModelInfo should defined extra details', () => {
+ let configurationModelInfo: ConfigurationModelInfo = new ConfigurationModelInfo(_dynamicInputsService, _sharedTreeService);
+ expect(configurationModelInfo.name).toEqual('configurations');
+ expect(configurationModelInfo.type).toEqual('Configuration');
+ });
+
+ test('isEcompGeneratedNaming should return false', () => {
+ let configurationModelInfo: ConfigurationModelInfo = new ConfigurationModelInfo(_dynamicInputsService, _sharedTreeService);
+ let isEcompGeneratedNaming: boolean = configurationModelInfo.isEcompGeneratedNaming();
+ expect(isEcompGeneratedNaming).toBeTruthy();
+ });
+
+ test('getTooltip should return "Configuration"', () => {
+ let configurationModelInfo: ConfigurationModelInfo = new ConfigurationModelInfo(_dynamicInputsService, _sharedTreeService);
+ let tooltip: string = configurationModelInfo.getTooltip();
+ expect(tooltip).toEqual('Configuration');
+ });
+
+ test('getType should return "Configuration"', () => {
+ let configurationModelInfo: ConfigurationModelInfo = new ConfigurationModelInfo(_dynamicInputsService, _sharedTreeService);
+ let tooltip: string = configurationModelInfo.getType();
+ expect(tooltip).toEqual('Configuration');
+ });
+
+ test('getModel should return Configuration model', () => {
+ let configurationModelInfo: ConfigurationModelInfo = new ConfigurationModelInfo(_dynamicInputsService, _sharedTreeService);
+ let model = configurationModelInfo.getModel('2017-388_ADIOD-vPE 1__configuration', getServiceHierarchy());
+ expect(model.uuid).toEqual('0903e1c0-8e03-4936-b5c2-260653b96413');
+ });
+
+
+ function getServiceHierarchy(){
+ return {
+ "service": {
+ "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+ "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "name": "action-data",
+ "version": "1.0",
+ "toscaModelURL": null,
+ "category": "",
+ "serviceType": "",
+ "serviceRole": "",
+ "description": "",
+ "serviceEcompNaming": "false",
+ "instantiationType": "Macro",
+ "inputs": {
+ "2017488_adiodvpe0_ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ }
+ },
+ "vidNotions": {
+ "instantiationUI": "legacy",
+ "modelCategory": "other"
+ }
+ },
+ "vnfs": {
+ "2017-388_ADIOD-vPE 1": {
+ "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413",
+ "invariantUuid": "00beb8f9-6d39-452f-816d-c709b9cbb87d",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-388_ADIOD-vPE",
+ "version": "1.0",
+ "customizationUuid": "280dec31-f16d-488b-9668-4aae55d6648a",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {
+ "vnf_config_template_version": {
+ "displayName": "vnf_config_template_version",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_config_template_version"
+ },
+ "bandwidth_units": {
+ "displayName": "bandwidth_units",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth_units"
+ },
+ "bandwidth": {
+ "displayName": "bandwidth",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth"
+ },
+ "AIC_CLLI": {
+ "displayName": "AIC_CLLI",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_AIC_CLLI"
+ },
+ "ASN": {
+ "displayName": "ASN",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_ASN"
+ },
+ "vnf_instance_name": {
+ "displayName": "vnf_instance_name",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_instance_name"
+ }
+ },
+ "properties": {
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=false}",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "false",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VF",
+ "modelCustomizationName": "2017-388_ADIOD-vPE 1",
+ "vfModules": {},
+ "volumeGroups": {},
+ "vfcInstanceGroups": {}
+ },
+ "2017-388_ADIOD-vPE 0": {
+ "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168",
+ "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-388_ADIOD-vPE",
+ "version": "4.0",
+ "customizationUuid": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {
+ "vnf_config_template_version": {
+ "displayName": "vnf_config_template_version",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_config_template_version"
+ },
+ "bandwidth_units": {
+ "displayName": "bandwidth_units",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth_units"
+ },
+ "bandwidth": {
+ "displayName": "bandwidth",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth"
+ },
+ "AIC_CLLI": {
+ "displayName": "AIC_CLLI",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_AIC_CLLI"
+ },
+ "ASN": {
+ "displayName": "ASN",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_ASN"
+ },
+ "vnf_instance_name": {
+ "displayName": "vnf_instance_name",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_instance_name"
+ }
+ },
+ "properties": {
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=false}",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "min_instances": "1",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "false",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VF",
+ "modelCustomizationName": "2017-388_ADIOD-vPE 0",
+ "vfModules": {},
+ "volumeGroups": {},
+ "vfcInstanceGroups": {}
+ },
+ "2017-488_ADIOD-vPE 0": {
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-488_ADIOD-vPE",
+ "version": "5.0",
+ "customizationUuid": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {
+ "vnf_config_template_version": {
+ "displayName": "vnf_config_template_version",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_config_template_version"
+ },
+ "bandwidth_units": {
+ "displayName": "bandwidth_units",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth_units"
+ },
+ "bandwidth": {
+ "displayName": "bandwidth",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth"
+ },
+ "AIC_CLLI": {
+ "displayName": "AIC_CLLI",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_AIC_CLLI"
+ },
+ "ASN": {
+ "displayName": "ASN",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_ASN"
+ },
+ "vnf_instance_name": {
+ "displayName": "vnf_instance_name",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_instance_name"
+ }
+ },
+ "properties": {
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=false}",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "max_instances": "3",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "min_instances": "1",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "false",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VF",
+ "modelCustomizationName": "2017-488_ADIOD-vPE 0",
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "baseModule": false
+ },
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "fromInputName": "adiodvpe0_bandwidth_units",
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "fromInputName": "adiodvpe0_bandwidth",
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "AIC_CLLI"
+ },
+ "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "volumeGroupAllowed": true
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+ "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+ "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+ "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "version": "5",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "ADIOD_base_vPE_BV",
+ "baseModule": true
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV",
+ "baseModule": false
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "baseModule": false
+ },
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "fromInputName": "adiodvpe0_bandwidth_units",
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "fromInputName": "adiodvpe0_bandwidth",
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "AIC_CLLI"
+ },
+ "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ }
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV",
+ "baseModule": false
+ },
+ "inputs": {}
+ }
+ },
+ "vfcInstanceGroups": {}
+ }
+ },
+ "networks": {
+ "2017-388_ADIOD-vPE 1": {
+ "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413",
+ "invariantUuid": "00beb8f9-6d39-452f-816d-c709b9cbb87d",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-388_ADIOD-vPE",
+ "version": "1.0",
+ "customizationUuid": "280dec31-f16d-488b-9668-4aae55d6648a",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {
+ "vnf_config_template_version": {
+ "displayName": "vnf_config_template_version",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_config_template_version"
+ },
+ "bandwidth_units": {
+ "displayName": "bandwidth_units",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth_units"
+ },
+ "bandwidth": {
+ "displayName": "bandwidth",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth"
+ },
+ "AIC_CLLI": {
+ "displayName": "AIC_CLLI",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_AIC_CLLI"
+ },
+ "ASN": {
+ "displayName": "ASN",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_ASN"
+ },
+ "vnf_instance_name": {
+ "displayName": "vnf_instance_name",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_instance_name"
+ }
+ },
+ "properties": {
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=false}",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "false",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VF",
+ "modelCustomizationName": "2017-388_ADIOD-vPE 1",
+ "vfModules": {},
+ "volumeGroups": {},
+ "vfcInstanceGroups": {}
+ }
+ },
+ "collectionResource": {},
+ "configurations": {
+ "2017-388_ADIOD-vPE 1__configuration": {
+ "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413",
+ "invariantUuid": "00beb8f9-6d39-452f-816d-c709b9cbb87d",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-388_ADIOD-vPE",
+ "version": "1.0",
+ "customizationUuid": "280dec31-f16d-488b-9668-4aae55d6648a",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {
+ "vnf_config_template_version": {
+ "displayName": "vnf_config_template_version",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_config_template_version"
+ },
+ "bandwidth_units": {
+ "displayName": "bandwidth_units",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth_units"
+ },
+ "bandwidth": {
+ "displayName": "bandwidth",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth"
+ },
+ "AIC_CLLI": {
+ "displayName": "AIC_CLLI",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_AIC_CLLI"
+ },
+ "ASN": {
+ "displayName": "ASN",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_ASN"
+ },
+ "vnf_instance_name": {
+ "displayName": "vnf_instance_name",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_instance_name"
+ }
+ },
+ "properties": {
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=false}",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "false",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VF",
+ "modelCustomizationName": "2017-388_ADIOD-vPE 1",
+ "vfModules": {},
+ "volumeGroups": {},
+ "vfcInstanceGroups": {}
+ }
+
+ },
+ "fabricConfigurations": {},
+ "serviceProxies": {},
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "baseModule": false
+ },
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "fromInputName": "adiodvpe0_bandwidth_units",
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "fromInputName": "adiodvpe0_bandwidth",
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "AIC_CLLI"
+ },
+ "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "volumeGroupAllowed": true
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+ "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+ "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+ "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "version": "5",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "ADIOD_base_vPE_BV",
+ "baseModule": true
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV",
+ "baseModule": false
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "baseModule": false
+ },
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "fromInputName": "adiodvpe0_bandwidth_units",
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "fromInputName": "adiodvpe0_bandwidth",
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "AIC_CLLI"
+ },
+ "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ }
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV",
+ "baseModule": false
+ },
+ "inputs": {}
+ }
+ },
+ "pnfs": {}
+ }
+ }
+});
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/configuration/configuration.model.info.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/configuration/configuration.model.info.ts
new file mode 100644
index 000000000..dd85ea110
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/configuration/configuration.model.info.ts
@@ -0,0 +1,87 @@
+import {ILevelNodeInfo} from "../basic.model.info";
+import {DynamicInputsService} from "../../dynamicInputs.service";
+import * as _ from 'lodash';
+import {SharedTreeService} from "../../shared.tree.service";
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service";
+
+export class ConfigurationModelInfo implements ILevelNodeInfo{
+ constructor(private _dynamicInputsService : DynamicInputsService,
+ private _sharedTreeService : SharedTreeService){}
+ name: string = 'configurations';
+ type : string = 'Configuration';
+ typeName : string = 'C';
+
+ isEcompGeneratedNaming = () : boolean => true;
+
+ updateDynamicInputsDataFromModel = () : any => [];
+
+ getNextLevelObject = (): any => null;
+
+ getTooltip = () : string => 'Configuration';
+
+ getType = () : string => "Configuration";
+
+ /***********************************************************
+ * return configuration model
+ * @param configurationModelId - current Model id
+ * @param serviceHierarchy - serviceHierarchy
+ ************************************************************/
+ getModel = (configurationModelId : string, serviceHierarchy) : any =>{
+ if(!_.isNil(serviceHierarchy)){
+ if(!_.isNil(serviceHierarchy[this.name]) && !_.isNil(serviceHierarchy[this.name][configurationModelId])){
+ return serviceHierarchy[this.name][configurationModelId];
+ }
+ }
+ return {};
+ };
+
+ createInstanceTreeNode(instance: any, model: any, storeKey: string): any {return null;}
+
+ childName: string;
+ childType: string;
+
+ /***********************************************************
+ * return if instance has missing data
+ * @param instance - vnf instance
+ * @param dynamicInputs
+ * @param isEcompGeneratedNaming
+ ************************************************************/
+ hasMissingData(instance, dynamicInputs: any, isEcompGeneratedNaming: boolean): boolean {
+ return this._sharedTreeService.hasMissingData(instance, dynamicInputs, isEcompGeneratedNaming, []);
+ }
+
+ onClickAdd(node: ITreeNode, serviceModelId: string): void {
+ }
+
+ getNodeCount(node: ITreeNode, serviceModelId: string): number {
+ return 0;
+ }
+
+ /***********************************************************
+ * should show node icon
+ * @param node - current ITrees node
+ * @param serviceModelId - service id
+ ************************************************************/
+ showNodeIcons(node: ITreeNode, serviceModelId: string): AvailableNodeIcons {
+ return null;
+ }
+
+ getMenuAction(node: ITreeNode, serviceModelId : string){
+ return {
+
+ }
+ }
+
+ updatePosition(that , node, instanceId): void {
+ // TODO
+ }
+
+ getNodePosition(instance): number {
+ return null;
+ }
+
+ onSelectedNode(node: ITreeNode): void {
+ }
+
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/network/network.model.info.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/network/network.model.info.spec.ts
new file mode 100644
index 000000000..206adb6d1
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/network/network.model.info.spec.ts
@@ -0,0 +1,1553 @@
+import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing";
+import {getTestBed, TestBed} from "@angular/core/testing";
+import {MockNgRedux, NgReduxTestingModule} from "@angular-redux/store/testing";
+import {NetworkModelInfo} from "./network.model.info";
+import {DynamicInputsService} from "../../dynamicInputs.service";
+import {SharedTreeService} from "../../shared.tree.service";
+import {NgRedux} from "@angular-redux/store";
+import {NetworkPopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/network/network.popup.service";
+import {DialogService} from "ng2-bootstrap-modal";
+import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service";
+import {DrawingBoardModes} from "../../../drawing-board.modes";
+import {IframeService} from "../../../../../shared/utils/iframe.service";
+import {DuplicateService} from "../../../duplicate/duplicate.service";
+class MockAppStore<T> {
+ getState() {
+ return {
+ global: {
+ 'drawingBoardStatus': DrawingBoardModes.CREATE
+ },
+ service : {
+ serviceHierarchy : {
+ 'servicedId' : {
+ 'networks' : {
+ 'networkName' : {
+ 'properties' : {
+ 'max_instances' : 1
+ }
+ }
+ }
+ }
+ },
+ serviceInstance : {
+ 'servicedId' : {
+ 'existingNetworksCounterMap' : {
+ 'networkId' : 1
+ },
+ 'networks' : {
+ 'networkName' :{
+ 'action': 'Create',
+ 'originalName' : 'networkName'
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+describe('Network Model Info', () => {
+ let injector;
+ let _dynamicInputsService : DynamicInputsService;
+ let _sharedTreeService : SharedTreeService;
+ let networkModel: NetworkModelInfo;
+ let _dialogService : DialogService;
+ let _networkPopupService : NetworkPopupService;
+ let _duplicateService : DuplicateService;
+ let _iframeService : IframeService;
+
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+ imports: [HttpClientTestingModule, NgReduxTestingModule],
+ providers: [
+ DynamicInputsService,
+ SharedTreeService,
+ DialogService,
+ NetworkPopupService,
+ IframeService,
+ DuplicateService,
+ {provide: NgRedux, useClass: MockAppStore},
+ MockNgRedux]
+ });
+ await TestBed.compileComponents();
+
+ injector = getTestBed();
+ _sharedTreeService = injector.get(SharedTreeService);
+ networkModel = new NetworkModelInfo(_dynamicInputsService, _sharedTreeService, _dialogService, _networkPopupService, _duplicateService, null, _iframeService, MockNgRedux.getInstance());
+ })().then(done).catch(done.fail));
+
+ test('NetworkModelInfo should be defined', () => {
+ expect(NetworkModelInfo).toBeDefined();
+ });
+
+ test('NetworkModelInfo should defined extra details', () => {
+ expect(networkModel.name).toEqual('networks');
+ expect(networkModel.type).toEqual('Network');
+ });
+
+ test('isEcompGeneratedNaming should return true if = isEcompGeneratedNaming is "true" ', () => {
+ let isEcompGeneratedNaming: boolean = networkModel.isEcompGeneratedNaming({
+ properties: {
+ ecomp_generated_naming: 'true'
+ }
+ });
+ expect(isEcompGeneratedNaming).toBeTruthy();
+ });
+
+ test('isEcompGeneratedNaming should return false if isEcompGeneratedNaming is "false"', () => {
+ let isEcompGeneratedNaming: boolean = networkModel.isEcompGeneratedNaming({
+ properties: {
+ ecomp_generated_naming: 'false'
+ }
+ });
+ expect(isEcompGeneratedNaming).toBeFalsy();
+ });
+
+ test('isEcompGeneratedNaming should return false if isEcompGeneratedNaming is not defined', () => {
+ let isEcompGeneratedNaming: boolean = networkModel.isEcompGeneratedNaming({
+ properties: {}
+ });
+ expect(isEcompGeneratedNaming).toBeFalsy();
+ });
+
+ test('getTooltip should return "VF"', () => {
+ let tooltip: string = networkModel.getTooltip();
+ expect(tooltip).toEqual('Network');
+ });
+
+ test('getType should return "VF"', () => {
+ let tooltip: string = networkModel.getType();
+ expect(tooltip).toEqual('Network');
+ });
+
+ test('getNextLevelObject should return null', () => {
+ let nextLevel = networkModel.getNextLevelObject();
+ expect(nextLevel).toBeNull();
+ });
+
+ test('updateDynamicInputsDataFromModel should return empty array', () => {
+ let dynamicInputs = networkModel.updateDynamicInputsDataFromModel({});
+ expect(dynamicInputs).toEqual([]);
+ });
+
+ test('getModel should return Network model', () => {
+ let model = networkModel.getModel('2017-388_ADIOD-vPE 1_1', <any>{}, getServiceHierarchy());
+ expect(model.type).toEqual('VL');
+ });
+
+ test('showNodeIcons should return false if reachLimit of max', ()=>{
+ let serviceId : string = 'servicedId';
+ let node = {
+ data : {
+ id : 'networkId',
+ name : 'networkName',
+ modelCustomizationId : 'modelCustomizationId'
+ }
+ };
+ jest.spyOn(_sharedTreeService, 'getExistingInstancesWithDeleteMode').mockReturnValue(0);
+ jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+ global : {},
+ service : {
+ serviceHierarchy : {
+ 'servicedId' : {
+ 'networks' : {
+ 'networkName' : {
+ 'properties' : {
+ 'max_instances' : 1
+ }
+ }
+ }
+ }
+ },
+ serviceInstance : {
+ 'servicedId' : {
+ 'existingNetworksCounterMap' : {
+ 'modelCustomizationId' : 1
+ },
+ 'networks' : {
+ 'networkName' :{
+
+ }
+ }
+ }
+ }
+ }
+ });
+
+ let result = networkModel.showNodeIcons(<any>node, serviceId);
+ expect(result).toEqual(new AvailableNodeIcons(true , false));
+ });
+
+ test('showNodeIcons should return true if not reachLimit of max', ()=>{
+ let serviceId : string = 'servicedId';
+ let node = {
+ data : {
+ id : 'networkId',
+ name : 'networkName'
+ }
+ };
+ jest.spyOn(_sharedTreeService, 'getExistingInstancesWithDeleteMode').mockReturnValue(0);
+ jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+ global : {},
+ service : {
+ serviceHierarchy : {
+ 'servicedId' : {
+ 'networks' : {
+ 'networkName' : {
+ 'properties' : {
+ 'max_instances' : 2
+ }
+ }
+ }
+ }
+ },
+ serviceInstance : {
+ 'servicedId' : {
+ 'existingNetworksCounterMap' : {
+ 'networkId' : 1
+ },
+ 'networks' : {
+ 'networkName' :{
+
+ }
+ }
+ }
+ }
+ }
+ });
+
+ let result = networkModel.showNodeIcons(<any>node, serviceId);
+ expect(result).toEqual(new AvailableNodeIcons(true , false));
+ });
+
+ test('getNodeCount should return number of nodes', ()=>{
+ let serviceId : string = 'servicedId';
+ jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+ global : {},
+ service : {
+ serviceHierarchy : {
+ 'servicedId' : {
+ 'networks' : {
+ 'networkName' : {
+ 'properties' : {
+ 'max_instances' : 1
+ }
+ }
+ }
+ }
+ },
+ serviceInstance : {
+ 'servicedId' : {
+ 'existingNetworksCounterMap' : {
+ 'modelCustomizationId' : 1
+ },
+ 'networks' : {
+ 'networkName' :{
+ 'action': 'Create',
+ 'originalName' : 'networkName'
+ }
+ }
+ }
+ }
+ }
+ });
+
+ let node = {
+ data : {
+ id : 'networkId',
+ name : 'networkName',
+ action: 'Create',
+ modelCustomizationId : "modelCustomizationId",
+ modelUniqueId: "modelCustomizationId"
+ }
+ };
+ let result = networkModel.getNodeCount(<any>node , serviceId);
+ expect(result).toEqual(1);
+
+ node.data.modelCustomizationId = 'networkId_notExist';
+ node.data.modelUniqueId = 'networkId_notExist';
+ result = networkModel.getNodeCount(<any>node , serviceId);
+ expect(result).toEqual(0);
+ });
+
+ test('getMenuAction: showAuditInfoNetwork', ()=>{
+
+ jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+ global: {
+ "drawingBoardStatus": DrawingBoardModes.RETRY
+ }
+ });
+ jest.spyOn(_sharedTreeService, 'isRetryMode').mockReturnValue(true);
+ let node = {
+ data : {
+ "modelId": "6b528779-44a3-4472-bdff-9cd15ec93450",
+ "action": "Create",
+ "isFailed": true,
+ }
+ };
+ let serviceModelId = "6b528779-44a3-4472-bdff-9cd15ec93450";
+ let result = networkModel.getMenuAction(<any>node, serviceModelId);
+ spyOn(result['showAuditInfo'], 'method');
+ expect(result['showAuditInfo']).toBeDefined();
+ expect(result['showAuditInfo'].visible(node)).toBeTruthy();
+ expect(result['showAuditInfo'].enable(node)).toBeTruthy();
+ result['showAuditInfo']['method'](node, serviceModelId);
+ expect(result['showAuditInfo']['method']).toHaveBeenCalledWith(node, serviceModelId);
+ });
+
+
+ function getServiceHierarchy(){
+ return {
+ "service": {
+ "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+ "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "name": "action-data",
+ "version": "1.0",
+ "toscaModelURL": null,
+ "category": "",
+ "serviceType": "",
+ "serviceRole": "",
+ "description": "",
+ "serviceEcompNaming": "false",
+ "instantiationType": "Macro",
+ "inputs": {
+ "2017488_adiodvpe0_ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ }
+ },
+ "vidNotions": {
+ "instantiationUI": "legacy",
+ "modelCategory": "other"
+ }
+ },
+ "vnfs": {
+ "2017-388_ADIOD-vPE 1": {
+ "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413",
+ "invariantUuid": "00beb8f9-6d39-452f-816d-c709b9cbb87d",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-388_ADIOD-vPE",
+ "version": "1.0",
+ "customizationUuid": "280dec31-f16d-488b-9668-4aae55d6648a",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {
+ "vnf_config_template_version": {
+ "displayName": "vnf_config_template_version",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_config_template_version"
+ },
+ "bandwidth_units": {
+ "displayName": "bandwidth_units",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth_units"
+ },
+ "bandwidth": {
+ "displayName": "bandwidth",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth"
+ },
+ "AIC_CLLI": {
+ "displayName": "AIC_CLLI",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_AIC_CLLI"
+ },
+ "ASN": {
+ "displayName": "ASN",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_ASN"
+ },
+ "vnf_instance_name": {
+ "displayName": "vnf_instance_name",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_instance_name"
+ }
+ },
+ "properties": {
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=false}",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "false",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VF",
+ "modelCustomizationName": "2017-388_ADIOD-vPE 1",
+ "vfModules": {},
+ "volumeGroups": {},
+ "vfcInstanceGroups": {}
+ },
+ "2017-388_ADIOD-vPE 0": {
+ "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168",
+ "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-388_ADIOD-vPE",
+ "version": "4.0",
+ "customizationUuid": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {
+ "vnf_config_template_version": {
+ "displayName": "vnf_config_template_version",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_config_template_version"
+ },
+ "bandwidth_units": {
+ "displayName": "bandwidth_units",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth_units"
+ },
+ "bandwidth": {
+ "displayName": "bandwidth",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth"
+ },
+ "AIC_CLLI": {
+ "displayName": "AIC_CLLI",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_AIC_CLLI"
+ },
+ "ASN": {
+ "displayName": "ASN",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_ASN"
+ },
+ "vnf_instance_name": {
+ "displayName": "vnf_instance_name",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_instance_name"
+ }
+ },
+ "properties": {
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=false}",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "min_instances": "1",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "false",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VF",
+ "modelCustomizationName": "2017-388_ADIOD-vPE 0",
+ "vfModules": {},
+ "volumeGroups": {},
+ "vfcInstanceGroups": {}
+ },
+ "2017-488_ADIOD-vPE 0": {
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-488_ADIOD-vPE",
+ "version": "5.0",
+ "customizationUuid": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {
+ "vnf_config_template_version": {
+ "displayName": "vnf_config_template_version",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_config_template_version"
+ },
+ "bandwidth_units": {
+ "displayName": "bandwidth_units",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth_units"
+ },
+ "bandwidth": {
+ "displayName": "bandwidth",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth"
+ },
+ "AIC_CLLI": {
+ "displayName": "AIC_CLLI",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_AIC_CLLI"
+ },
+ "ASN": {
+ "displayName": "ASN",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_ASN"
+ },
+ "vnf_instance_name": {
+ "displayName": "vnf_instance_name",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_instance_name"
+ }
+ },
+ "properties": {
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=false}",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "max_instances": "3",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "min_instances": "1",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "false",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VF",
+ "modelCustomizationName": "2017-488_ADIOD-vPE 0",
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "baseModule": false
+ },
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "fromInputName": "adiodvpe0_bandwidth_units",
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "fromInputName": "adiodvpe0_bandwidth",
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "AIC_CLLI"
+ },
+ "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "volumeGroupAllowed": true
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+ "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+ "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+ "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "version": "5",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "ADIOD_base_vPE_BV",
+ "baseModule": true
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV",
+ "baseModule": false
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "baseModule": false
+ },
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "fromInputName": "adiodvpe0_bandwidth_units",
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "fromInputName": "adiodvpe0_bandwidth",
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "AIC_CLLI"
+ },
+ "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ }
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV",
+ "baseModule": false
+ },
+ "inputs": {}
+ }
+ },
+ "vfcInstanceGroups": {}
+ }
+ },
+ "networks": {
+ "2017-388_ADIOD-vPE 1_1": {
+ "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413",
+ "invariantUuid": "00beb8f9-6d39-452f-816d-c709b9cbb87d",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-388_ADIOD-vPE",
+ "version": "1.0",
+ "customizationUuid": "280dec31-f16d-488b-9668-4aae55d6648a",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {
+ "vnf_config_template_version": {
+ "displayName": "vnf_config_template_version",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_config_template_version"
+ },
+ "bandwidth_units": {
+ "displayName": "bandwidth_units",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth_units"
+ },
+ "bandwidth": {
+ "displayName": "bandwidth",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth"
+ },
+ "AIC_CLLI": {
+ "displayName": "AIC_CLLI",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_AIC_CLLI"
+ },
+ "ASN": {
+ "displayName": "ASN",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_ASN"
+ },
+ "vnf_instance_name": {
+ "displayName": "vnf_instance_name",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_instance_name"
+ }
+ },
+ "properties": {
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=false}",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "false",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VL",
+ "modelCustomizationName": "2017-388_ADIOD-vPE 1",
+ "vfModules": {},
+ "volumeGroups": {},
+ "vfcInstanceGroups": {}
+ }
+ },
+ "collectionResource": {},
+ "configurations": {},
+ "fabricConfigurations": {},
+ "serviceProxies": {},
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "baseModule": false
+ },
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "fromInputName": "adiodvpe0_bandwidth_units",
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "fromInputName": "adiodvpe0_bandwidth",
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "AIC_CLLI"
+ },
+ "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "volumeGroupAllowed": true
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+ "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+ "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+ "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "version": "5",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "ADIOD_base_vPE_BV",
+ "baseModule": true
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV",
+ "baseModule": false
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "baseModule": false
+ },
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "fromInputName": "adiodvpe0_bandwidth_units",
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "fromInputName": "adiodvpe0_bandwidth",
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "AIC_CLLI"
+ },
+ "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ }
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV",
+ "baseModule": false
+ },
+ "inputs": {}
+ }
+ },
+ "pnfs": {}
+ }
+ }
+});
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/network/network.model.info.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/network/network.model.info.ts
new file mode 100644
index 000000000..3d99750ae
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/network/network.model.info.ts
@@ -0,0 +1,264 @@
+import {DynamicInputsService} from "../../dynamicInputs.service";
+import {ILevelNodeInfo} from "../basic.model.info";
+import {NetworkInstance} from "../../../../../shared/models/networkInstance";
+import {NetworkModel} from "../../../../../shared/models/networkModel";
+import {NetworkTreeNode} from "../../../../../shared/models/networkTreeNode";
+import {SharedTreeService} from "../../shared.tree.service";
+import {InputType} from "../../../../../shared/models/inputTypes";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../../../../shared/store/reducers";
+import {
+ GenericFormPopupComponent,
+ PopupType
+} from "../../../../../shared/components/genericFormPopup/generic-form-popup.component";
+import {DialogService} from "ng2-bootstrap-modal";
+import {NetworkPopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/network/network.popup.service";
+import * as _ from "lodash";
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service";
+import {DuplicateVnfComponent} from "../../../duplicate/duplicate-vnf.component";
+import {changeInstanceCounter, removeInstance} from "../../../../../shared/storeUtil/utils/general/general.actions";
+import {IframeService} from "../../../../../shared/utils/iframe.service";
+import {SdcUiServices} from "onap-ui-angular";
+import {DuplicateService} from "../../../duplicate/duplicate.service";
+import {ServiceInstanceActions} from "../../../../../shared/models/serviceInstanceActions";
+import {
+ deleteActionNetworkInstance,
+ undoDeleteActionNetworkInstance,
+ updateNetworkPosition
+} from "../../../../../shared/storeUtil/utils/network/network.actions";
+import {IModalConfig} from "onap-ui-angular/dist/modals/models/modal-config";
+
+export class NetworkModelInfo implements ILevelNodeInfo {
+ constructor(private _dynamicInputsService: DynamicInputsService,
+ private _sharedTreeService: SharedTreeService,
+ private _dialogService: DialogService,
+ private _networkPopupService: NetworkPopupService,
+ private _duplicateService: DuplicateService,
+ private modalService: SdcUiServices.ModalService,
+ private _iframeService: IframeService,
+ private _store: NgRedux<AppState>) {
+ }
+
+ name: string = 'networks';
+ type: string = 'Network';
+ typeName: string = 'N';
+
+ /***********************************************************
+ * return model dynamic inputs
+ * @param currentModel - current Model object
+ ************************************************************/
+ isEcompGeneratedNaming(currentModel): boolean {
+ const ecompGeneratedNaming = currentModel.properties.ecomp_generated_naming;
+ return ecompGeneratedNaming === "true";
+ }
+
+ updateDynamicInputsDataFromModel = (currentModel): any => {
+ let displayInputs;
+ return _.isEmpty(displayInputs) ? [] : this._dynamicInputsService.getArbitraryInputs(displayInputs);
+ };
+
+ /***********************************************************
+ * return network model
+ * @param networkModelId - current Model id
+ * @param instance
+ * @param serviceHierarchy - serviceHierarchy
+ ************************************************************/
+ getModel = (networkModelId: string, instance: NetworkInstance, serviceHierarchy): NetworkModel => {
+ const originalModelName = instance.originalName ? instance.originalName : networkModelId;
+ return new NetworkModel(serviceHierarchy[this.name][originalModelName]);
+ };
+
+
+ /***********************************************************
+ * return network instance tree node
+ * @param instance - network instance
+ * @param model - network model
+ * @param parentModel
+ * @param storeKey - store key if exist
+ ************************************************************/
+ createInstanceTreeNode = (instance: NetworkInstance, model: NetworkModel, parentModel, storeKey: string): NetworkTreeNode => {
+ let node = new NetworkTreeNode(instance, model, storeKey);
+ node.missingData = this.hasMissingData(instance, node, model.isEcompGeneratedNaming);
+ node.typeName = this.typeName;
+ node.menuActions = this.getMenuAction(<any>node, model.uuid);
+ node.isFailed = _.isNil(instance.isFailed) ? false : instance.isFailed;
+ node.statusMessage = !_.isNil(instance.statusMessage) ? instance.statusMessage: "";
+ node = this._sharedTreeService.addingStatusProperty(node);
+ return node;
+ };
+
+ /***********************************************************
+ * return next level object (null because is last level)
+ ************************************************************/
+ getNextLevelObject(): any {
+ return null;
+ }
+
+ getTooltip = (): string => 'Network';
+
+ getType = (): string => 'Network';
+
+ /***********************************************************
+ * return if instance has missing data
+ * @param instance - vnf instance
+ * @param dynamicInputs
+ * @param isEcompGeneratedNaming
+ ************************************************************/
+ hasMissingData(instance, dynamicInputs: any, isEcompGeneratedNaming: boolean): boolean {
+ return this._sharedTreeService.hasMissingData(instance, dynamicInputs, isEcompGeneratedNaming, [InputType.LCP_REGION, InputType.TENANT, InputType.PLATFORM]);
+ }
+
+
+ /***********************************************************
+ * return if instance has missing data
+ * @param node - Network node
+ * @param serviceModelId - current service id
+ ************************************************************/
+ onClickAdd(node, serviceModelId: string): void {
+ this._dialogService.addDialog(GenericFormPopupComponent, <any>{
+ type: PopupType.NETWORK,
+ uuidData: {
+ serviceId: serviceModelId,
+ networkId: node.data.name,
+ networkStoreKey: null,
+ type: 'VL',
+ popupService: this._networkPopupService
+ },
+ node: node,
+ isUpdateMode: false
+ });
+ }
+
+ /***********************************************************
+ * return number of existing instances
+ * @param node - Network node
+ * @param serviceModelId - current service id
+ ************************************************************/
+ getNodeCount(node: ITreeNode, serviceModelId: string): number {
+ let map = null;
+ if (!_.isNil(this._store.getState().service.serviceInstance[serviceModelId])) {
+ map = this._store.getState().service.serviceInstance[serviceModelId].existingNetworksCounterMap || 0;
+ if (!_.isNil(map)) {
+ let count = map[node.data.modelUniqueId] || 0;
+ count -= this._sharedTreeService.getExistingInstancesWithDeleteMode(node, serviceModelId , 'networks');
+ return count;
+ }
+ }
+ return 0;
+ }
+
+ /***********************************************************
+ * should show node icon
+ * @param node - current ITrees node
+ * @param serviceModelId - service id
+ ************************************************************/
+ showNodeIcons(node: ITreeNode, serviceModelId: string): AvailableNodeIcons {
+ let counter: number = !_.isNil(this._store.getState().service.serviceInstance[serviceModelId]) ?
+ (this._store.getState().service.serviceInstance[serviceModelId].existingNetworksCounterMap[node.data.modelUniqueId] || 0) : 0;
+
+ counter -= this._sharedTreeService.getExistingInstancesWithDeleteMode(node, serviceModelId , 'networks');
+
+ const properties = this._store.getState().service.serviceHierarchy[serviceModelId].networks[node.data.name].properties;
+ const maxInstances: number = !_.isNil(properties) ? (properties.max_instances || 1) : 1;
+ const isReachedLimit = !(maxInstances > counter);
+ const showAddIcon = this._sharedTreeService.shouldShowAddIcon() && !isReachedLimit;
+
+ return new AvailableNodeIcons(showAddIcon, isReachedLimit)
+ }
+
+ getMenuAction(node: ITreeNode, serviceModelId: string): { [methodName: string]: { method: Function, visible: Function, enable: Function }} {
+ const mode = this._store.getState().global.drawingBoardStatus;
+ return {
+ edit: {
+ method: (node, serviceModelId) => {
+ this._iframeService.addClassOpenModal('content');
+ this._dialogService.addDialog(GenericFormPopupComponent, {
+ type: PopupType.NETWORK,
+ uuidData: <any>{
+ serviceId: serviceModelId,
+ networkId: node.data.modelName,
+ networkStoreKey: node.data.networkStoreKey,
+ type: node.data.type,
+ popupService: this._networkPopupService
+ },
+ node: node,
+ isUpdateMode: true
+ });
+ },
+ visible: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
+ enable: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node)
+ },
+ showAuditInfo: {
+ method: (node, serviceModelId) => {
+ let instance = this._store.getState().service.serviceInstance[serviceModelId].networks[node.data.networkStoreKey];
+ this._sharedTreeService.openAuditInfoModal(node, serviceModelId, instance, 'NETWORK', this);
+ },
+ visible: (node) => this._sharedTreeService.shouldShowAuditInfo(node),
+ enable: (node) => this._sharedTreeService.shouldShowAuditInfo(node)
+ },
+ duplicate: {
+ method: (node, serviceModelId) => {
+ if (this._store.getState().global.flags['FLAG_DUPLICATE_VNF']) {
+ const storeKey = node.data.networkStoreKey;
+ let modalConfig: IModalConfig = this._duplicateService.openDuplicateModal(serviceModelId, node.data.modelUniqueId, node.data.modelName, storeKey, 1, this._store, node);
+ this.modalService.openCustomModal(modalConfig, DuplicateVnfComponent);
+ }
+ },
+ visible: (node) => this._sharedTreeService.shouldShowDuplicate(node) && !_.isNil(node.data) && !_.isNil(node.data.action) && node.data.action === ServiceInstanceActions.Create && this._duplicateService.canDuplicate(node),
+ enable: (node, serviceModelId) => this._duplicateService.isEnabled(node, this._store, serviceModelId)
+ },
+ remove: {
+ method: (node, serviceModelId) => {
+ let storeKey: string = node.data.networkStoreKey;
+ this._store.dispatch(removeInstance(node.data.networkStoreKey, serviceModelId, storeKey, node));
+ this._store.dispatch(changeInstanceCounter(node.data.modelUniqueId , serviceModelId, -1, node));
+ this._sharedTreeService.selectedVNF = null;
+ },
+ visible: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
+ enable: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
+ },
+ delete : {
+ method : (node, serviceModelId) => {
+ if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) {
+ this._store.dispatch(deleteActionNetworkInstance(node.data.networkStoreKey, serviceModelId));
+ }else {
+ this._sharedTreeService.removeDeleteAllChild(node, serviceModelId, (node, serviceModelId)=>{
+ this._store.dispatch(deleteActionNetworkInstance(node.data.networkStoreKey, serviceModelId));
+ });
+ }
+ },
+ visible: (node) => this._sharedTreeService.shouldShowDelete(node),
+ enable: (node) => this._sharedTreeService.shouldShowDelete(node)
+ },
+ undoDelete : {
+ method : (node, serviceModelId) => {
+ if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) {
+ this._store.dispatch(undoDeleteActionNetworkInstance(node.data.networkStoreKey, serviceModelId));
+ }else {
+ this._sharedTreeService.undoDeleteAllChild(node, serviceModelId, (node, serviceModelId)=>{
+ this._store.dispatch(undoDeleteActionNetworkInstance(node.data.networkStoreKey, serviceModelId));
+ });
+ }
+ },
+ visible: (node) => this._sharedTreeService.shouldShowUndoDelete(node),
+ enable: (node, serviceModelId) => this._sharedTreeService.shouldShowUndoDelete(node) && !this._sharedTreeService.isServiceOnDeleteMode(serviceModelId)
+ }
+ };
+ }
+
+ /***********************************************************
+ * should update node position inside the tree
+ * @param node - current ITrees node
+ ************************************************************/
+ updatePosition(that , node, instanceId): void {
+ that.store.dispatch(updateNetworkPosition(node));
+ }
+
+ getNodePosition(instance): number {
+ return !_.isNil(instance) ? instance.position : null;
+ }
+
+ onSelectedNode(node: ITreeNode): void {
+ }
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/relatedVnfMember/relatedVnfMember.info.model.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/relatedVnfMember/relatedVnfMember.info.model.spec.ts
new file mode 100644
index 000000000..dcf25f579
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/relatedVnfMember/relatedVnfMember.info.model.spec.ts
@@ -0,0 +1,1211 @@
+import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing";
+import {getTestBed, TestBed} from "@angular/core/testing";
+import {MockNgRedux, NgReduxTestingModule} from "@angular-redux/store/testing";
+import {DynamicInputsService} from "../../dynamicInputs.service";
+import {VNFModel} from "../../../../../shared/models/vnfModel";
+import {SharedTreeService} from "../../shared.tree.service";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../../../../shared/store/reducers";
+import {DefaultDataGeneratorService} from "../../../../../shared/services/defaultDataServiceGenerator/default.data.generator.service";
+import {DialogService} from "ng2-bootstrap-modal";
+import {VfModulePopuopService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service";
+import {VnfPopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service";
+import {DuplicateService} from "../../../duplicate/duplicate.service";
+import {IframeService} from "../../../../../shared/utils/iframe.service";
+import {RelatedVnfMemberInfoModel} from "./relatedVnfMember.info.model";
+
+
+class MockAppStore<T> {
+ getState() {
+ return {}
+ }
+}
+
+
+describe('Related Vnf member Model Info', () => {
+ let injector;
+ let httpMock: HttpTestingController;
+ let _dynamicInputsService : DynamicInputsService;
+ let _sharedTreeService : SharedTreeService;
+
+ let _store : NgRedux<AppState>;
+ let relatedVnfMemeber: RelatedVnfMemberInfoModel;
+ beforeEach(() => {
+ TestBed.configureTestingModule({
+ imports: [HttpClientTestingModule, NgReduxTestingModule],
+ providers: [
+ MockNgRedux,
+ DynamicInputsService,
+ DialogService,
+ VfModulePopuopService,
+ VnfPopupService,
+ DefaultDataGeneratorService,
+ SharedTreeService,
+ DuplicateService,
+ IframeService]
+ }).compileComponents();
+
+ injector = getTestBed();
+ _sharedTreeService = injector.get(SharedTreeService);
+ _store = injector.get(NgRedux);
+
+ relatedVnfMemeber = new RelatedVnfMemberInfoModel(
+ _sharedTreeService,
+ _dynamicInputsService,
+ _store);
+ });
+
+ test('relatedVnfMemeber should be defined', () => {
+ expect(relatedVnfMemeber).toBeDefined();
+ });
+
+ test('RelatedVnfMemeber should defined extra details', () => {
+ expect(relatedVnfMemeber.name).toEqual('vnfs');
+ expect(relatedVnfMemeber.type).toEqual('relatedVnfMember');
+ });
+
+ test('isEcompGeneratedNaming should return true if isEcompGeneratedNaming is "true" ', () => {
+ let isEcompGeneratedNaming: boolean = relatedVnfMemeber.isEcompGeneratedNaming(<any>{
+ properties: {
+ ecomp_generated_naming: 'true'
+ }
+ });
+ expect(isEcompGeneratedNaming).toBeTruthy();
+ });
+
+ test('isEcompGeneratedNaming should return false if isEcompGeneratedNaming is "false"', () => {
+ let isEcompGeneratedNaming: boolean = relatedVnfMemeber.isEcompGeneratedNaming({
+ properties: {
+ ecomp_generated_naming: 'false'
+ }
+ });
+ expect(isEcompGeneratedNaming).toBeFalsy();
+ });
+
+ test('isEcompGeneratedNaming should return false if isEcompGeneratedNaming is not defined', () => {
+ let isEcompGeneratedNaming: boolean = relatedVnfMemeber.isEcompGeneratedNaming({
+ properties: {
+ }
+ });
+ expect(isEcompGeneratedNaming).toBeFalsy();
+ });
+
+
+ test('getTooltip should return "VF"', () => {
+ let tooltip: string = relatedVnfMemeber.getTooltip();
+ expect(tooltip).toEqual('VF');
+ });
+
+ test('getType should return "VF"', () => {
+ let tooltip: string = relatedVnfMemeber.getType();
+ expect(tooltip).toEqual('VF');
+ });
+
+ test('getNextLevelObject should be null', () => {
+ let nextLevel = relatedVnfMemeber.getNextLevelObject();
+ expect(nextLevel).toBeNull();
+ });
+
+ test('getModel should return VNF model', () => {
+ let model: VNFModel = relatedVnfMemeber.getModel('2017-388_ADIOD-vPE 1', <any>{
+ originalName : '2017-388_ADIOD-vPE 1'
+ }, getServiceHierarchy());
+ expect(model.type).toEqual('VF');
+ });
+
+
+ test('getMenuAction: delete', ()=>{
+ let node = {"modelId":"d6557200-ecf2-4641-8094-5393ae3aae60","missingData":true,"action":"None","inMaint":true,"name":"jlfBwIks283yKlCD8","modelName":"VF_vMee 0","type":"VF","isEcompGeneratedNaming":true,"networkStoreKey":"VF_vMee 0:004","vnfStoreKey":"VF_vMee 0:004","typeName":"VNF"};
+ let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
+ let result = relatedVnfMemeber.getMenuAction(<any>node, serviceModelId);
+ spyOn(result['delete'], 'method');
+ expect(result['delete']).toBeDefined();
+ expect(result['delete'].visible).toBeTruthy();
+ expect(result['delete'].enable).toBeTruthy();
+ result['delete']['method'](node, serviceModelId);
+ expect(result['delete']['method']).toHaveBeenCalledWith(node, serviceModelId);
+ });
+
+
+ test('getMenuAction: undoDelete', ()=>{
+ let node = {"modelId":"d6557200-ecf2-4641-8094-5393ae3aae60","missingData":true,"action":"None","inMaint":true,"name":"jlfBwIks283yKlCD8","modelName":"VF_vMee 0","type":"VF","isEcompGeneratedNaming":true,"networkStoreKey":"VF_vMee 0:004","vnfStoreKey":"VF_vMee 0:004","typeName":"VNF"};
+ let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
+ let result = relatedVnfMemeber.getMenuAction(<any>node, serviceModelId);
+ spyOn(result['undoDelete'], 'method');
+ expect(result['undoDelete']).toBeDefined();
+ expect(result['undoDelete'].visible).toBeDefined();
+ expect(result['undoDelete'].enable).toBeDefined();
+ result['undoDelete']['method'](node, serviceModelId);
+ expect(result['undoDelete']['method']).toHaveBeenCalledWith(node, serviceModelId);
+ });
+
+
+
+ function getServiceHierarchy(){
+ return {
+ "service": {
+ "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+ "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "name": "action-data",
+ "version": "1.0",
+ "toscaModelURL": null,
+ "category": "",
+ "serviceType": "",
+ "serviceRole": "",
+ "description": "",
+ "serviceEcompNaming": "false",
+ "instantiationType": "Macro",
+ "inputs": {
+ "2017488_adiodvpe0_ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ }
+ },
+ "vidNotions": {
+ "instantiationUI": "legacy",
+ "modelCategory": "other"
+ }
+ },
+ "vnfs": {
+ "2017-388_ADIOD-vPE 1": {
+ "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413",
+ "invariantUuid": "00beb8f9-6d39-452f-816d-c709b9cbb87d",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-388_ADIOD-vPE",
+ "version": "1.0",
+ "customizationUuid": "280dec31-f16d-488b-9668-4aae55d6648a",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {
+ "vnf_config_template_version": {
+ "displayName": "vnf_config_template_version",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_config_template_version"
+ },
+ "bandwidth_units": {
+ "displayName": "bandwidth_units",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth_units"
+ },
+ "bandwidth": {
+ "displayName": "bandwidth",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth"
+ },
+ "AIC_CLLI": {
+ "displayName": "AIC_CLLI",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_AIC_CLLI"
+ },
+ "ASN": {
+ "displayName": "ASN",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_ASN"
+ },
+ "vnf_instance_name": {
+ "displayName": "vnf_instance_name",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_instance_name"
+ }
+ },
+ "properties": {
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=false}",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "false",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VF",
+ "modelCustomizationName": "2017-388_ADIOD-vPE 1",
+ "vfModules": {},
+ "volumeGroups": {},
+ "vfcInstanceGroups": {}
+ },
+ "2017-388_ADIOD-vPE 0": {
+ "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168",
+ "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-388_ADIOD-vPE",
+ "version": "4.0",
+ "customizationUuid": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {
+ "vnf_config_template_version": {
+ "displayName": "vnf_config_template_version",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_config_template_version"
+ },
+ "bandwidth_units": {
+ "displayName": "bandwidth_units",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth_units"
+ },
+ "bandwidth": {
+ "displayName": "bandwidth",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth"
+ },
+ "AIC_CLLI": {
+ "displayName": "AIC_CLLI",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_AIC_CLLI"
+ },
+ "ASN": {
+ "displayName": "ASN",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_ASN"
+ },
+ "vnf_instance_name": {
+ "displayName": "vnf_instance_name",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_instance_name"
+ }
+ },
+ "properties": {
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=false}",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "min_instances": "1",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "false",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VF",
+ "modelCustomizationName": "2017-388_ADIOD-vPE 0",
+ "vfModules": {},
+ "volumeGroups": {},
+ "vfcInstanceGroups": {}
+ },
+ "2017-488_ADIOD-vPE 0": {
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-488_ADIOD-vPE",
+ "version": "5.0",
+ "customizationUuid": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {
+ "vnf_config_template_version": {
+ "displayName": "vnf_config_template_version",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_config_template_version"
+ },
+ "bandwidth_units": {
+ "displayName": "bandwidth_units",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth_units"
+ },
+ "bandwidth": {
+ "displayName": "bandwidth",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth"
+ },
+ "AIC_CLLI": {
+ "displayName": "AIC_CLLI",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_AIC_CLLI"
+ },
+ "ASN": {
+ "displayName": "ASN",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_ASN"
+ },
+ "vnf_instance_name": {
+ "displayName": "vnf_instance_name",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_instance_name"
+ }
+ },
+ "properties": {
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=false}",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "max_instances": "3",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "min_instances": "1",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "false",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VF",
+ "modelCustomizationName": "2017-488_ADIOD-vPE 0",
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "baseModule": false
+ },
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "fromInputName": "adiodvpe0_bandwidth_units",
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "fromInputName": "adiodvpe0_bandwidth",
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "AIC_CLLI"
+ },
+ "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "volumeGroupAllowed": true
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+ "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+ "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+ "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "version": "5",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "ADIOD_base_vPE_BV",
+ "baseModule": true
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV",
+ "baseModule": false
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "baseModule": false
+ },
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "fromInputName": "adiodvpe0_bandwidth_units",
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "fromInputName": "adiodvpe0_bandwidth",
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "AIC_CLLI"
+ },
+ "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ }
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV",
+ "baseModule": false
+ },
+ "inputs": {}
+ }
+ },
+ "vfcInstanceGroups": {}
+ }
+ },
+ "networks": {},
+ "collectionResource": {},
+ "configurations": {},
+ "fabricConfigurations": {},
+ "serviceProxies": {},
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "baseModule": false
+ },
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "fromInputName": "adiodvpe0_bandwidth_units",
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "fromInputName": "adiodvpe0_bandwidth",
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "AIC_CLLI"
+ },
+ "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "volumeGroupAllowed": true
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+ "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+ "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+ "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "version": "5",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "ADIOD_base_vPE_BV",
+ "baseModule": true
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV",
+ "baseModule": false
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "baseModule": false
+ },
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "fromInputName": "adiodvpe0_bandwidth_units",
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "fromInputName": "adiodvpe0_bandwidth",
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "AIC_CLLI"
+ },
+ "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ }
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV",
+ "baseModule": false
+ },
+ "inputs": {}
+ }
+ },
+ "pnfs": {}
+ }
+ }
+});
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/relatedVnfMember/relatedVnfMember.info.model.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/relatedVnfMember/relatedVnfMember.info.model.ts
new file mode 100644
index 000000000..b1eb10937
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/relatedVnfMember/relatedVnfMember.info.model.ts
@@ -0,0 +1,158 @@
+import {ILevelNodeInfo} from "../basic.model.info";
+import {SharedTreeService} from "../../shared.tree.service";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../../../../shared/store/reducers";
+import * as _ from "lodash";
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service";
+import {DynamicInputsService} from "../../dynamicInputs.service";
+import {
+ deleteActionRelatedVnfMemberInstance,
+ removeRelatedVnfMemberInstance,
+ undoDeleteActionRelatedVnfMemberInstance
+} from "../../../../../shared/storeUtil/utils/relatedVnfMember/relatedVnfMember.actions";
+import {VnfInstance} from "../../../../../shared/models/vnfInstance";
+import {VNFModel} from "../../../../../shared/models/vnfModel";
+import {VnfTreeNode} from "../../../../../shared/models/vnfTreeNode";
+import {InputType} from "../../../../../shared/models/inputTypes";
+
+export class RelatedVnfMemberInfoModel implements ILevelNodeInfo {
+ constructor(private _sharedTreeService: SharedTreeService,
+ private _dynamicInputsService : DynamicInputsService,
+ private _store: NgRedux<AppState>) {
+ }
+
+ name: string = 'vnfs';
+ type: string = 'relatedVnfMember';
+ typeName: string = 'VNF';
+
+ /***********************************************************
+ * return if user should provide instance name or not.
+ * @param currentModel - current Model object
+ ************************************************************/
+ isUserProvidedNaming = (currentModel): boolean => {
+ const ecompGeneratedNaming = currentModel.properties.ecomp_generated_naming;
+ return ecompGeneratedNaming !== undefined && ecompGeneratedNaming === "false";
+ };
+
+ /***********************************************************
+ * return model dynamic inputs
+ * @param currentModel - current Model object
+ ************************************************************/
+ updateDynamicInputsDataFromModel = (currentModel): any => {
+ let displayInputs;
+ return _.isEmpty(displayInputs) ? [] : this._dynamicInputsService.getArbitraryInputs(displayInputs);
+ };
+
+ /***********************************************************
+ * return vnf model
+ * @param vnfModelId - current Model id
+ * @param instance - vnf instance
+ * @param serviceHierarchy - serviceHierarchy
+ ************************************************************/
+ getModel = (vnfModelId: string, instance: VnfInstance, serviceHierarchy): VNFModel => {
+ const originalModelName = instance.originalName ? instance.originalName : vnfModelId;
+ return new VNFModel(serviceHierarchy[this.name][originalModelName]);
+ };
+
+
+ /***********************************************************
+ * return vnf instance tree node
+ * @param instance - vnf instance
+ * @param model - vnf model
+ * @param parentModel
+ * @param storeKey - store key if exist
+ ************************************************************/
+ createInstanceTreeNode = (instance: VnfInstance, model: VNFModel, parentModel, storeKey: string): VnfTreeNode => {
+ let node = new VnfTreeNode(instance, model, storeKey);
+ node.missingData = this.hasMissingData(instance, node, model.isEcompGeneratedNaming);
+ node.typeName = this.typeName;
+ node.menuActions = this.getMenuAction(<any>node, model.uuid);
+ node.isFailed = _.isNil(instance.isFailed) ? false : instance.isFailed;
+ node.statusMessage = !_.isNil(instance.statusMessage) ? instance.statusMessage: "";
+ node = this._sharedTreeService.addingStatusProperty(node);
+ return node;
+ };
+
+ /***********************************************************
+ * return next level object (null because is last level)
+ ************************************************************/
+ getNextLevelObject(): any {
+ return null;
+ }
+
+ /***********************************************************
+ * return if instance has missing data
+ * @param instance - vnf instance
+ * @param dynamicInputs
+ * @param isUserProvidedNaming
+ ************************************************************/
+ hasMissingData(instance, dynamicInputs: any, isUserProvidedNaming: boolean): boolean {
+ return this._sharedTreeService.hasMissingData(instance, dynamicInputs, isUserProvidedNaming, [InputType.LCP_REGION, InputType.TENANT, InputType.PLATFORM]);
+ }
+
+ getTooltip = (): string => 'VF';
+
+ getType = (): string => 'VF';
+
+ /***********************************************************
+ * doesn't have option from DrawingBoard model tree
+ ************************************************************/
+ onClickAdd(node, serviceModelId: string): void {}
+
+ /***********************************************************
+ * doesn't have option from DrawingBoard model tree
+ ************************************************************/
+ getNodeCount(node: ITreeNode, serviceModelId: string): number {return 0;}
+
+ /***********************************************************
+ * doesn't have option from DrawingBoard model tree
+ ************************************************************/
+ showNodeIcons(node: ITreeNode, serviceModelId: string): AvailableNodeIcons {
+ return new AvailableNodeIcons(false, false);
+ }
+
+ getMenuAction(node: ITreeNode, serviceModelId: string): { [methodName: string]: { method: Function, visible: Function, enable: Function }} {
+ return <any>{
+ remove: {
+ method: (node, serviceModelId) => {
+ this._store.dispatch(removeRelatedVnfMemberInstance(node.parent.data.vnfGroupStoreKey, node.data.vnfStoreKey, serviceModelId));
+ },
+ visible: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
+ enable: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node)
+ },
+ delete : {
+ method : (node, serviceModelId) => {
+ this._store.dispatch(deleteActionRelatedVnfMemberInstance(node.parent.data.vnfGroupStoreKey, node.data.vnfStoreKey, serviceModelId));
+ },
+ visible: (node) => this._sharedTreeService.shouldShowDelete(node),
+ enable: (node) => this._sharedTreeService.shouldShowDelete(node)
+ },
+ undoDelete : {
+ method : (node, serviceModelId) => {
+ this._store.dispatch(undoDeleteActionRelatedVnfMemberInstance(node.parent.data.vnfGroupStoreKey , node.data.vnfStoreKey, serviceModelId));
+
+ },
+ visible: (node) => this._sharedTreeService.shouldShowUndoDelete(node),
+ enable: (node, serviceModelId) => this._sharedTreeService.shouldShowUndoDelete(node) && this._sharedTreeService.shouldShowDelete(node.parent) && !this._sharedTreeService.isServiceOnDeleteMode(serviceModelId)
+ }
+ }
+ }
+
+ isEcompGeneratedNaming = (currentModel): boolean => {
+ const ecompGeneratedNaming = currentModel.properties.ecomp_generated_naming;
+ return ecompGeneratedNaming === "true";
+ };
+
+
+ updatePosition(that , node, instanceId): void {
+ // TODO
+ }
+
+ getNodePosition(instance): number {
+ return null;
+ }
+
+ onSelectedNode(node: ITreeNode): void {
+ }
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vfModule/vfModule.model.info.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vfModule/vfModule.model.info.spec.ts
new file mode 100644
index 000000000..dc7452516
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vfModule/vfModule.model.info.spec.ts
@@ -0,0 +1,1596 @@
+
+import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing";
+import {getTestBed, TestBed} from "@angular/core/testing";
+import {MockNgRedux, NgReduxTestingModule} from "@angular-redux/store/testing";
+import {VFModuleModelInfo} from "./vfModule.model.info";
+import {DynamicInputsService} from "../../dynamicInputs.service";
+import {SharedTreeService} from "../../shared.tree.service";
+import {VfModulePopuopService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service";
+import {DialogService} from "ng2-bootstrap-modal";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../../../../shared/store/reducers";
+import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service";
+import {MessageBoxService} from "../../../../../shared/components/messageBox/messageBox.service";
+import {DrawingBoardModes} from "../../../drawing-board.modes";
+import {IframeService} from "../../../../../shared/utils/iframe.service";
+import {ComponentInfoService} from "../../../component-info/component-info.service";
+import {ModelInformationItem} from "../../../../../shared/components/model-information/model-information.component";
+import {ComponentInfoModel, ComponentInfoType} from "../../../component-info/component-info-model";
+import {AaiService} from "../../../../../shared/services/aaiService/aai.service";
+import {HttpClient, HttpHandler} from "@angular/common/http";
+import {FeatureFlagsService} from "../../../../../shared/services/featureFlag/feature-flags.service";
+class MockAppStore<T> {
+ getState() {
+ return {
+ global: {
+ 'drawingBoardStatus': DrawingBoardModes.CREATE
+ }
+ }
+ }
+}
+
+describe('VFModule Model Info', () => {
+ let injector;
+ let _dynamicInputsService : DynamicInputsService;
+ let _sharedTreeService : SharedTreeService;
+ let vfModuleModel: VFModuleModelInfo;
+ let _dialogService : DialogService;
+ let _vfModulePopupService : VfModulePopuopService;
+ let _iframeService : IframeService;
+ let _componentInfoService : ComponentInfoService;
+
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+ imports: [HttpClientTestingModule, NgReduxTestingModule],
+ providers: [
+ DynamicInputsService,
+ DialogService,
+ VfModulePopuopService,
+ SharedTreeService,
+ IframeService,
+ {provide: NgRedux, useClass: MockAppStore},
+ MockNgRedux,
+ AaiService,
+ HttpClient,
+ HttpHandler,
+ FeatureFlagsService,
+ ComponentInfoService
+ ]
+ });
+ await TestBed.compileComponents();
+
+ injector = getTestBed();
+ _sharedTreeService = injector.get(SharedTreeService);
+ _componentInfoService = injector.get(ComponentInfoService)
+ vfModuleModel = new VFModuleModelInfo(_dynamicInputsService, _sharedTreeService, _dialogService, _vfModulePopupService, _iframeService, MockNgRedux.getInstance(),_componentInfoService);
+
+ })().then(done).catch(done.fail));
+
+
+
+ test('VFModuleModelInfo should be defined', () => {
+ expect(VFModuleModelInfo).toBeDefined();
+ });
+
+ test('VnfModelInfo should defined extra details', () => {
+ expect(vfModuleModel.name).toEqual('vfModules');
+ expect(vfModuleModel.type).toEqual('Module');
+ });
+
+ test('isEcompGeneratedNaming should return true if vnf has isEcompGeneratedNaming is "true" ', () => {
+ let isEcompGeneratedNaming : boolean = vfModuleModel.isEcompGeneratedNaming({}, {
+ properties: {
+ ecomp_generated_naming: 'true'
+ }
+ });
+ expect(isEcompGeneratedNaming).toBeTruthy();
+ });
+
+ test('isEcompGeneratedNaming should return false if isEcompGeneratedNaming is "false"', () => {
+ let isEcompGeneratedNaming : boolean = vfModuleModel.isEcompGeneratedNaming({}, {
+ properties: {
+ ecomp_generated_naming: 'false'
+ }
+ });
+ expect(isEcompGeneratedNaming).toBeFalsy();
+ });
+
+ test('isEcompGeneratedNaming should return false if isEcompGeneratedNaming is not defined', () => {
+ let isEcompGeneratedNaming : boolean = vfModuleModel.isEcompGeneratedNaming({}, {
+ properties: {
+ }
+ });
+ expect(isEcompGeneratedNaming).toBeFalsy();
+ });
+
+
+ test('getTooltip should return "VFModule"', () => {
+ let tooltip: string = vfModuleModel.getTooltip();
+ expect(tooltip).toEqual('VFmodule');
+ });
+
+ test('getType should return "VFModule"', () => {
+ let tooltip: string = vfModuleModel.getType();
+ expect(tooltip).toEqual('VFmodule');
+ });
+
+ test('getNextLevelObject should return null', () => {
+ let nextLevel = vfModuleModel.getNextLevelObject();
+ expect(nextLevel).toBeNull();
+ });
+
+ test('getModel should return Module model', () => {
+ let model = vfModuleModel.getModel('2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1',{}, getServiceHierarchy());
+ expect(model.uuid).toEqual('25284168-24bb-4698-8cb4-3f509146eca5');
+ });
+
+ test('showNodeIcons should return false false if reachLimit of max', ()=>{
+ let serviceId : string = 'servicedId';
+ let node = {
+ parent : {
+ data : {
+ id : 'vnfId',
+ name : 'vnfName'
+ }
+ },
+ data : {
+ id : 'vnfId',
+ name : 'vnfName'
+ }
+ };
+ _sharedTreeService.setSelectedVNF({
+ data : {
+ id : 'vfModuleId',
+ name : 'VfModuleName'
+ }
+ });
+ jest.spyOn(vfModuleModel, 'getOptionalVNFs').mockReturnValue([]);
+ jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+ global : {},
+ service : {
+ serviceHierarchy : {
+ 'servicedId' : {
+ 'vnfs' : {
+ 'vnfName' : {
+ 'properties' : {
+ 'max_instances' : 1
+ }
+ }
+ }
+ }
+ },
+ serviceInstance : {
+ 'servicedId' : {
+ 'existingVNFCounterMap' : {
+ 'vnfId' : 1
+ },
+ 'vnfs' : {
+ 'vnfName' :{
+
+ }
+ }
+ }
+ }
+ }
+ });
+
+ let result = vfModuleModel.showNodeIcons(<any>node, serviceId);
+ expect(result).toEqual(new AvailableNodeIcons(false , false));
+ });
+
+ test('showNodeIcons should return true, false if reachLimit of max', ()=>{
+ let serviceId : string = 'servicedId';
+ let node = {
+ data : {
+ id : 'vfModuleId',
+ name : 'vfModuleName'
+ },
+ parent : {
+ data : {
+ id : 'vnfId',
+ name : 'vnfName'
+ }
+ }
+ };
+ jest.spyOn(_sharedTreeService, 'getSelectedVNF').mockReturnValue('vnfName');
+ jest.spyOn(vfModuleModel, 'getOptionalVNFs').mockReturnValue(['vnfName']);
+ jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+ global : {},
+ service : {
+ serviceHierarchy : {
+ 'servicedId' : {
+ 'vnfs' : {
+ 'vnfName' : {
+ 'properties' : {
+ 'max_instances' : 1
+ }
+ }
+ },
+ 'vfModules' : {
+ 'vfModuleName' : {
+ 'properties' : {
+ maxCountInstances : 1
+ }
+ }
+ }
+ }
+ },
+ serviceInstance : {
+ 'servicedId' : {
+ 'existingVNFCounterMap' : {
+ 'vnfId' : 1
+ },
+ 'vnfs' : {
+ 'vnfName' :{
+ 'originalName' : 'vnfName',
+ 'vfModules' : {
+ 'vfModuleName' : {
+
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ });
+
+ let result = vfModuleModel.showNodeIcons(<any>node, 'servicedId');
+ expect(result).toEqual(new AvailableNodeIcons(true , false));
+ });
+
+
+ test('showNodeIcons should return false, true if reachLimit of max', ()=>{
+ let serviceId : string = 'servicedId';
+ let node = {
+ data : {
+ id : 'vfModuleId',
+ name : 'vfModuleName'
+ },
+ parent : {
+ data : {
+ id : 'vnfId',
+ name : 'vnfName'
+ }
+ }
+ };
+ jest.spyOn(_sharedTreeService, 'getSelectedVNF').mockReturnValue('vnfName');
+ jest.spyOn(vfModuleModel, 'getOptionalVNFs').mockReturnValue(['vnfName']);
+ jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+ global : {},
+ service : {
+ serviceHierarchy : {
+ 'servicedId' : {
+ 'vnfs' : {
+ 'vnfName' : {
+ 'properties' : {
+ 'max_instances' : 1
+ }
+ }
+ },
+ 'vfModules' : {
+ 'vfModuleName' : {
+ 'properties' : {
+ maxCountInstances : 2
+ }
+ }
+ }
+ }
+ },
+ serviceInstance : {
+ 'servicedId' : {
+ 'existingVNFCounterMap' : {
+ 'vnfId' : 1
+ },
+ 'vnfs' : {
+ 'vnfName' :{
+ 'originalName' : 'vnfName',
+ 'vfModules' : {
+ 'vfModuleName' : {
+
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ });
+
+ let result = vfModuleModel.showNodeIcons(<any>node, 'servicedId');
+ expect(result).toEqual(new AvailableNodeIcons(true , false));
+ });
+
+
+ test('getOptionalVNFs should instance if exist', ()=>{
+ let serviceId : string = 'servicedId';
+ jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+ global : {},
+ service : {
+ serviceHierarchy : {
+ 'servicedId' : {
+ 'vnfs' : {
+ 'vnfName' : {
+ 'properties' : {
+ 'max_instances' : 1
+ }
+ }
+ },
+ 'vfModules' : {
+ 'vfModuleName' : {
+ 'properties' : {
+ maxCountInstances : 2
+ }
+ }
+ }
+ }
+ },
+ serviceInstance : {
+ 'servicedId' : {
+ 'existingVNFCounterMap' : {
+ 'vnfId' : 1
+ },
+ 'vnfs' : {
+ 'vnfName' :{
+ 'originalName' : 'vnfName',
+ 'vfModules' : {
+ 'vfModuleName' : {
+
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ });
+
+ let node = {
+ data : {
+ id : 'vfModuleId',
+ name : 'vfModuleName'
+ },
+ parent : {
+ data : {
+ id : 'vnfId',
+ name : 'vnfName'
+ }
+ }
+ };
+ let result = vfModuleModel.getOptionalVNFs(serviceId , 'vnfName');
+ expect(result.length).toEqual(1);
+ });
+
+ test('getNodeCount should return number of nodes', ()=>{
+ let serviceId : string = 'servicedId';
+ jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+ global : {},
+ service : {
+ serviceHierarchy : {
+ 'servicedId' : {
+ 'vnfs' : {
+ 'vnfName' : {
+ 'properties' : {
+ 'max_instances' : 1
+ }
+ }
+ },
+ 'vfModules' : {
+ 'vfModuleName' : {
+ 'properties' : {
+ maxCountInstances : 2
+ }
+ }
+ }
+ }
+ },
+ serviceInstance : {
+ 'servicedId' : {
+ 'existingVNFCounterMap' : {
+ 'vnfId' : 1
+ },
+ 'vnfs' : {
+ 'vnfName' :{
+ 'action': 'Create',
+ 'originalName' : 'vnfName',
+ 'vfModules' : {
+ 'vfModuleName' : {
+ 'vnfModuleName_111': {
+ 'action': 'Create',
+ 'modelInfo' : {
+ modelVersionId : 'vfModuleId'
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ });
+
+ let node = {
+ data : {
+ id : 'vfModuleId',
+ name : 'vfModuleName',
+ 'action': 'Create',
+ },
+ parent : {
+ data : {
+ id : 'vnfId',
+ name : 'vnfName',
+ 'action': 'Create',
+ }
+ }
+ };
+ let result = vfModuleModel.getNodeCount(<any>node , serviceId);
+ expect(result).toEqual(1);
+ });
+
+
+ test('onClickAdd should open message box if no vnfStoreKey', ()=>{
+ jest.spyOn(_sharedTreeService, 'getSelectedVNF').mockReturnValue(null);
+ jest.spyOn(vfModuleModel, 'getDefaultVNF').mockReturnValue(null);
+ jest.spyOn(MessageBoxService.openModal, 'next');
+ vfModuleModel.onClickAdd(<any>{}, 'serviceId');
+ expect(MessageBoxService.openModal.next).toHaveBeenCalled();
+ });
+
+ test('getMenuAction: showAuditInfoVfModule', ()=>{
+ jest.spyOn(_sharedTreeService, 'isRetryMode').mockReturnValue(true);
+
+ let node = {
+ data : {
+ "modelId": "6b528779-44a3-4472-bdff-9cd15ec93450",
+ "action": "Create",
+ "isFailed": true,
+ }
+ };
+ let serviceModelId = "6b528779-44a3-4472-bdff-9cd15ec93450";
+ let result = vfModuleModel.getMenuAction(<any>node, serviceModelId);
+ spyOn(result['showAuditInfo'], 'method');
+ expect(result['showAuditInfo']).toBeDefined();
+ expect(result['showAuditInfo'].visible(node)).toBeTruthy();
+ expect(result['showAuditInfo'].enable(node)).toBeTruthy();
+ result['showAuditInfo']['method'](node, serviceModelId);
+ expect(result['showAuditInfo']['method']).toHaveBeenCalledWith(node, serviceModelId);
+ });
+
+ test('Info for vfModule should be correct', () => {
+ const model = getVFModule();
+ const instance = getVFModuleInstance();
+ let actualVNFInfo = vfModuleModel.getInfoForVFModule(model,instance);
+ let expectedVNFInfo = [
+ ModelInformationItem.createInstance('Type', 'vfModule'),
+ ModelInformationItem.createInstance('Model Version', '2'),
+ ModelInformationItem.createInstance('Model Customization ID','55b1be94-671a-403e-a26c-667e9c47d091'),
+ ModelInformationItem.createInstance('Instance ID', '2c1ca484-cbc2-408b-ab86-25a2c15ce280'),
+ ModelInformationItem.createInstance('In Maintenance', true),
+ ModelInformationItem.createInstance('Base Module', false),
+ ModelInformationItem.createInstance('Min Instances', 0),
+ ModelInformationItem.createInstance('Initial Instances Count',0)
+ ];
+ expect(actualVNFInfo).toEqual(new ComponentInfoModel(ComponentInfoType.VFMODULE, expectedVNFInfo, []));
+ });
+
+ function getVFModule(){
+ return {
+ "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",
+ "version":"2",
+ "modelCustomizationName":"VfVmee..vmme_vlc..module-1",
+ "properties":{
+ "minCountInstances":0,
+ "maxCountInstances":null,
+ "initialCount":0,
+ "vfModuleLabel":"vmme_vlc",
+ "baseModule":false
+ },
+ "inputs":{},
+ "volumeGroupAllowed":false
+ };
+ }
+
+ function getVFModuleInstance() {
+ return {
+ "action":"None",
+ "instanceName":"ss820f_0918_db",
+ "instanceId":"2c1ca484-cbc2-408b-ab86-25a2c15ce280",
+ "orchStatus":"deleted",
+ "productFamilyId":null,
+ "lcpCloudRegionId":null,
+ "tenantId":null,
+ "modelInfo":{
+ "modelCustomizationName":"VfVmee..vmme_vlc..module-1",
+ "modelCustomizationId":"b200727a-1bf9-4e7c-bd06-b5f4c9d920b9",
+ "modelInvariantId":"09edc9ef-85d0-4b26-80de-1f569d49e750",
+ "modelVersionId":"522159d5-d6e0-4c2a-aa44-5a542a12a830",
+ "modelType":"vfModule"
+ },
+ "instanceType":null,
+ "provStatus":null,
+ "inMaint":true,
+ "uuid":"522159d5-d6e0-4c2a-aa44-5a542a12a830",
+ "originalName":"VfVmee..vmme_vlc..module-1",
+ "legacyRegion":null,
+ "lineOfBusiness":null,
+ "platformName":null,
+ "trackById":"vf_vmee0..VfVmee..vmme_vlc..module-1:008",
+ "isBase":false,
+ "volumeGroupName":null
+ };
+ }
+
+
+ function getServiceHierarchy(){
+ return {
+ "service": {
+ "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+ "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "name": "action-data",
+ "version": "1.0",
+ "toscaModelURL": null,
+ "category": "",
+ "serviceType": "",
+ "serviceRole": "",
+ "description": "",
+ "serviceEcompNaming": "false",
+ "instantiationType": "Macro",
+ "inputs": {
+ "2017488_adiodvpe0_ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ }
+ },
+ "vidNotions": {
+ "instantiationUI": "legacy",
+ "modelCategory": "other"
+ }
+ },
+ "vnfs": {
+ "2017-388_ADIOD-vPE 1": {
+ "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413",
+ "invariantUuid": "00beb8f9-6d39-452f-816d-c709b9cbb87d",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-388_ADIOD-vPE",
+ "version": "1.0",
+ "customizationUuid": "280dec31-f16d-488b-9668-4aae55d6648a",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {
+ "vnf_config_template_version": {
+ "displayName": "vnf_config_template_version",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_config_template_version"
+ },
+ "bandwidth_units": {
+ "displayName": "bandwidth_units",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth_units"
+ },
+ "bandwidth": {
+ "displayName": "bandwidth",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth"
+ },
+ "AIC_CLLI": {
+ "displayName": "AIC_CLLI",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_AIC_CLLI"
+ },
+ "ASN": {
+ "displayName": "ASN",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_ASN"
+ },
+ "vnf_instance_name": {
+ "displayName": "vnf_instance_name",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_instance_name"
+ }
+ },
+ "properties": {
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=false}",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "false",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VF",
+ "modelCustomizationName": "2017-388_ADIOD-vPE 1",
+ "vfModules": {},
+ "volumeGroups": {},
+ "vfcInstanceGroups": {}
+ },
+ "2017-388_ADIOD-vPE 0": {
+ "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168",
+ "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-388_ADIOD-vPE",
+ "version": "4.0",
+ "customizationUuid": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {
+ "vnf_config_template_version": {
+ "displayName": "vnf_config_template_version",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_config_template_version"
+ },
+ "bandwidth_units": {
+ "displayName": "bandwidth_units",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth_units"
+ },
+ "bandwidth": {
+ "displayName": "bandwidth",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth"
+ },
+ "AIC_CLLI": {
+ "displayName": "AIC_CLLI",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_AIC_CLLI"
+ },
+ "ASN": {
+ "displayName": "ASN",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_ASN"
+ },
+ "vnf_instance_name": {
+ "displayName": "vnf_instance_name",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_instance_name"
+ }
+ },
+ "properties": {
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=false}",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "min_instances": "1",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "false",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VF",
+ "modelCustomizationName": "2017-388_ADIOD-vPE 0",
+ "vfModules": {},
+ "volumeGroups": {},
+ "vfcInstanceGroups": {}
+ },
+ "2017-488_ADIOD-vPE 0": {
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-488_ADIOD-vPE",
+ "version": "5.0",
+ "customizationUuid": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {
+ "vnf_config_template_version": {
+ "displayName": "vnf_config_template_version",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_config_template_version"
+ },
+ "bandwidth_units": {
+ "displayName": "bandwidth_units",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth_units"
+ },
+ "bandwidth": {
+ "displayName": "bandwidth",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth"
+ },
+ "AIC_CLLI": {
+ "displayName": "AIC_CLLI",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_AIC_CLLI"
+ },
+ "ASN": {
+ "displayName": "ASN",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_ASN"
+ },
+ "vnf_instance_name": {
+ "displayName": "vnf_instance_name",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_instance_name"
+ }
+ },
+ "properties": {
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=false}",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "max_instances": "3",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "min_instances": "1",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "false",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VF",
+ "modelCustomizationName": "2017-488_ADIOD-vPE 0",
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "baseModule": false
+ },
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "fromInputName": "adiodvpe0_bandwidth_units",
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "fromInputName": "adiodvpe0_bandwidth",
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "AIC_CLLI"
+ },
+ "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "volumeGroupAllowed": true
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+ "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+ "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+ "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "version": "5",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "ADIOD_base_vPE_BV",
+ "baseModule": true
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV",
+ "baseModule": false
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "baseModule": false
+ },
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "fromInputName": "adiodvpe0_bandwidth_units",
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "fromInputName": "adiodvpe0_bandwidth",
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "AIC_CLLI"
+ },
+ "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ }
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV",
+ "baseModule": false
+ },
+ "inputs": {}
+ }
+ },
+ "vfcInstanceGroups": {}
+ }
+ },
+ "networks": {},
+ "collectionResource": {},
+ "configurations": {},
+ "fabricConfigurations": {},
+ "serviceProxies": {},
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "baseModule": false
+ },
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "fromInputName": "adiodvpe0_bandwidth_units",
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "fromInputName": "adiodvpe0_bandwidth",
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "AIC_CLLI"
+ },
+ "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "volumeGroupAllowed": true
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+ "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+ "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+ "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "version": "5",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "ADIOD_base_vPE_BV",
+ "baseModule": true
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV",
+ "baseModule": false
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "baseModule": false
+ },
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "fromInputName": "adiodvpe0_bandwidth_units",
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "fromInputName": "adiodvpe0_bandwidth",
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "AIC_CLLI"
+ },
+ "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ }
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV",
+ "baseModule": false
+ },
+ "inputs": {}
+ }
+ },
+ "pnfs": {}
+ }
+ }
+});
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vfModule/vfModule.model.info.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vfModule/vfModule.model.info.ts
new file mode 100644
index 000000000..7db3d906e
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vfModule/vfModule.model.info.ts
@@ -0,0 +1,388 @@
+import {DynamicInputsService} from "../../dynamicInputs.service";
+import {ILevelNodeInfo} from "../basic.model.info";
+import * as _ from "lodash";
+import {VNFModel} from "../../../../../shared/models/vnfModel";
+import {SharedTreeService} from "../../shared.tree.service";
+import {VfModuleTreeNode} from "../../../../../shared/models/vfModuleTreeNode";
+import {VfModuleInstance} from "../../../../../shared/models/vfModuleInstance";
+import {VfModule} from "../../../../../shared/models/vfModule";
+import {NgRedux} from "@angular-redux/store";
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import {
+ GenericFormPopupComponent,
+ PopupType
+} from "../../../../../shared/components/genericFormPopup/generic-form-popup.component";
+import {DialogService} from "ng2-bootstrap-modal";
+import {VfModulePopuopService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service";
+import {AppState} from "../../../../../shared/store/reducers";
+import {MessageBoxData} from "../../../../../shared/components/messageBox/messageBox.data";
+import {MessageBoxService} from "../../../../../shared/components/messageBox/messageBox.service";
+import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service";
+import {IframeService} from "../../../../../shared/utils/iframe.service";
+import {
+ deleteActionVfModuleInstance,
+ removeVfModuleInstance,
+ undoDeleteVfModuleInstance,
+ updateVFModulePosition
+} from "../../../../../shared/storeUtil/utils/vfModule/vfModule.actions";
+import {ComponentInfoService} from "../../../component-info/component-info.service";
+import {ComponentInfoModel, ComponentInfoType} from "../../../component-info/component-info-model";
+import {ModelInformationItem} from "../../../../../shared/components/model-information/model-information.component";
+
+export class VFModuleModelInfo implements ILevelNodeInfo {
+ constructor(private _dynamicInputsService: DynamicInputsService,
+ private _sharedTreeService: SharedTreeService,
+ private _dialogService: DialogService,
+ private _vfModulePopupService: VfModulePopuopService,
+ private _iframeService: IframeService,
+ private _store: NgRedux<AppState>,
+ private _componentInfoService: ComponentInfoService) {
+ }
+
+ name: string = 'vfModules';
+ type: string = 'Module';
+ typeName: string = 'M';
+
+ /***********************************************************
+ * return if user should provide instance name or not.
+ * get info from parent (VNF)
+ * @param currentModel - current Model object
+ * @param parentModel - current parent Model object
+ ************************************************************/
+ isEcompGeneratedNaming(currentModel, parentModel): boolean {
+ const ecompGeneratedNaming = !_.isNil(parentModel.properties) ? parentModel.properties.ecomp_generated_naming : undefined;
+ return ecompGeneratedNaming === "true";
+ }
+
+ /***********************************************************
+ * return model dynamic inputs
+ * @param currentModel - current Model object
+ ************************************************************/
+ updateDynamicInputsDataFromModel = (currentModel): any => {
+ let displayInputs = _.isNil(currentModel) ? [] : currentModel.inputs;
+ return _.isEmpty(displayInputs) ? [] : this._dynamicInputsService.getArbitraryInputs(displayInputs);
+ };
+
+ /***********************************************************
+ * return vfModule model
+ * @param vfModuleModelId - current Model id
+ * @param instance
+ * @param serviceHierarchy - serviceHierarchy
+ ************************************************************/
+ getModel = (vfModuleModelId: string, instance, serviceHierarchy): any => {
+ if (!_.isNil(serviceHierarchy)) {
+ if (!_.isNil(serviceHierarchy[this.name]) && !_.isNil(serviceHierarchy[this.name][vfModuleModelId])) {
+ return serviceHierarchy[this.name][vfModuleModelId];
+ }
+ }
+ return {};
+ };
+
+ createNode(instance: VfModuleInstance, currentModel: VfModule, parentModel: VNFModel, modelName: string, index: number): VfModuleTreeNode {
+ let dynamicModelName = Object.keys(instance)[index];
+ instance = instance[Object.keys(instance)[index]];
+ const isEcompGeneratedNaming: boolean = this.isEcompGeneratedNaming(currentModel, parentModel);
+
+ const dynamicInputs = this.updateDynamicInputsDataFromModel(currentModel);
+ let newVfModule: VfModuleTreeNode = new VfModuleTreeNode(instance, currentModel, modelName, dynamicInputs, isEcompGeneratedNaming, dynamicModelName);
+
+ newVfModule.missingData = this._sharedTreeService.hasMissingData(instance, newVfModule.dynamicInputs, isEcompGeneratedNaming, []);
+ newVfModule.typeName = this.typeName;
+ newVfModule.menuActions = this.getMenuAction(<any>newVfModule, currentModel.uuid);
+ newVfModule.isFailed = _.isNil(instance.isFailed) ? false : instance.isFailed;
+ newVfModule.statusMessage = !_.isNil(instance.statusMessage) ? instance.statusMessage: "";
+
+ newVfModule = this._sharedTreeService.addingStatusProperty(newVfModule);
+ return newVfModule;
+ }
+
+ createInstanceTreeNode(instance: VfModuleInstance, currentModel: VfModule, parentModel: VNFModel, modelName: string): VfModuleTreeNode | VfModuleTreeNode[] {
+ let numberOfChilds = Object.keys(instance).length;
+ if (numberOfChilds > 1) {
+ let result: VfModuleTreeNode[] = [];
+ for (let i = 0; i < numberOfChilds; i++) {
+ result.push(this.createNode(instance, currentModel, parentModel, modelName, i));
+ }
+ return result;
+ } else {
+ return this.createNode(instance, currentModel, parentModel, modelName, 0);
+ }
+ }
+
+ /***********************************************************
+ * return next level object (null because is last level)
+ ************************************************************/
+ getNextLevelObject(): any {
+ return null;
+ }
+
+ getTooltip = (): string => 'VFmodule';
+
+ getType = (): string => 'VFmodule';
+
+ /***********************************************************
+ * return if instance has missing data
+ * @param instance - vnf instance
+ * @param dynamicInputs
+ * @param isEcompGeneratedNaming
+ ************************************************************/
+ hasMissingData(instance, dynamicInputs: any, isEcompGeneratedNaming: boolean): boolean {
+ return this._sharedTreeService.hasMissingData(instance, dynamicInputs, isEcompGeneratedNaming, []);
+ }
+
+
+ /***********************************************************
+ * return if instance has missing data
+ * @param node - VFModule node
+ * @param serviceModelId - current service id
+ ************************************************************/
+ onClickAdd(node: ITreeNode, serviceModelId: string): void {
+ const vnfStoreKey = this._sharedTreeService.getSelectedVNF() || this.getDefaultVNF(node.parent, serviceModelId);
+ if (vnfStoreKey) {
+ this._dialogService.addDialog(GenericFormPopupComponent, {
+ type: PopupType.VF_MODULE,
+ uuidData: <any>{
+ serviceId: serviceModelId,
+ modelName: node.data.name,
+ vFModuleStoreKey: null,
+ vnfStoreKey: vnfStoreKey,
+ modelId: node.data.modelId,
+ type: node.data.type,
+ popupService: this._vfModulePopupService
+ },
+ node: node,
+ isUpdateMode: false
+ });
+ } else {
+ let messageBoxData: MessageBoxData = new MessageBoxData(
+ "Select a parent", // modal title
+ "There are multiple instances on the right side that can contain this vf-module Please select the VNF instance, to add this vf-module to, on the right side and then click the + sign",
+ <any>"warning",
+ <any>"md",
+ [
+ {text: "Close", size: "medium", closeModal: true}
+ ]);
+ MessageBoxService.openModal.next(messageBoxData);
+ }
+ }
+
+ getDefaultVNF(node: ITreeNode, serviceModelId: string): string {
+ let keys = _.keys(_.pickBy(this._store.getState().service.serviceInstance[serviceModelId].vnfs, vnf => {
+ return (vnf.originalName == node.data.name);
+ }));
+ return keys.length === 1 ? this._store.getState().service.serviceInstance[serviceModelId].vnfs[keys[0]].vnfStoreKey : null;
+ }
+
+ /***********************************************************
+ * return number of existing instances (in all VNF's)
+ * @param node - VfModule node
+ * @param serviceModelId - current service id
+ ************************************************************/
+ getNodeCount(node: ITreeNode, serviceModelId: string): number {
+ let count: number = 0;
+ if (!_.isNil(this._store.getState().service.serviceInstance) && !_.isNil(this._store.getState().service.serviceInstance[serviceModelId])) {
+ const vnfs = this._store.getState().service.serviceInstance[serviceModelId].vnfs;
+
+ for (let vnfKey in vnfs) {
+ count += this.countNumberOfVFModule(vnfs[vnfKey], node);
+ }
+ return count;
+ }
+ return count;
+ }
+
+
+ countNumberOfVFModule(vnf, node): number {
+ let count = 0;
+ for (let vfModuleKey in vnf['vfModules']) {
+ for (let vfModule in vnf['vfModules'][vfModuleKey]) {
+ if (vnf['vfModules'][vfModuleKey][vfModule]['modelInfo'].modelCustomizationId === node.data.modelUniqueId) {
+ const vfModuleObj = vnf['vfModules'][vfModuleKey][vfModule];
+ if (!(!_.isNil(vfModuleObj) && !_.isNil(vfModuleObj.action) && vfModuleObj.action.split('_').pop() === 'Delete')) count++;
+ }
+ }
+ }
+ return count;
+ }
+
+ getCountVFModuleOfSelectedVNF(node: ITreeNode, vnfStoreKey: string, serviceModelId: string): number {
+ let count: number = 0;
+ if (!_.isNil(this._store.getState().service.serviceInstance) && !_.isNil(this._store.getState().service.serviceInstance[serviceModelId])) {
+ const vnfs = this._store.getState().service.serviceInstance[serviceModelId].vnfs;
+
+ for (let vnfKey in vnfs) {
+ count += this.countNumberOfVFModule(vnfs[vnfKey], node);
+ }
+ return count;
+ }
+ return count;
+ }
+
+
+ /***********************************************************
+ * should show node icon
+ * @param node - current ITrees node
+ * @param serviceModelId - service id
+ ************************************************************/
+ showNodeIcons(node: ITreeNode, serviceModelId: string): AvailableNodeIcons {
+ const selectedVNF: string = this._sharedTreeService.getSelectedVNF();
+ if (selectedVNF) {
+ return this.showVFModuleOnSelectedVNF(node, selectedVNF, serviceModelId);
+ } else {
+ const optionalSelected = this.getOptionalVNFs(serviceModelId, node.parent.data.name);
+ if (optionalSelected.length === 1) {
+ return this.showVFModuleOnSelectedVNF(node, optionalSelected[0].vnfStoreKey, serviceModelId);
+ } else {
+ return new AvailableNodeIcons(false, false);
+ }
+ }
+ }
+
+
+ showVFModuleOnSelectedVNF(node: ITreeNode, selectedVNF: string, serviceModelId: string): AvailableNodeIcons {
+
+ if (!_.isNil(this._store.getState().service.serviceInstance[serviceModelId].vnfs[selectedVNF]) && node.parent.data.name === this._store.getState().service.serviceInstance[serviceModelId].vnfs[selectedVNF].originalName) {
+ const existingVFModules = this.getCountVFModuleOfSelectedVNF(node, selectedVNF, serviceModelId);
+ const reachedLimit = this.isVFModuleReachedLimit(node, this._store.getState().service.serviceHierarchy, serviceModelId, existingVFModules);
+ const showAddIcon = this._sharedTreeService.shouldShowAddIcon()&& !reachedLimit;
+ return new AvailableNodeIcons(showAddIcon, reachedLimit);
+ }
+ return new AvailableNodeIcons(false, false);
+
+ }
+
+ getOptionalVNFs(serviceUUID: string, vnfOriginalModelName: string): any[] {
+ let result = [];
+ if (!_.isNil(this._store.getState().service.serviceInstance) && !_.isNil(this._store.getState().service.serviceInstance[serviceUUID])) {
+ const serviceVNFsInstances = this._store.getState().service.serviceInstance[serviceUUID].vnfs;
+ for (let vnfKey in serviceVNFsInstances) {
+ if (serviceVNFsInstances[vnfKey].originalName === vnfOriginalModelName) {
+ serviceVNFsInstances[vnfKey].vnfStoreKey = vnfKey;
+ result.push(serviceVNFsInstances[vnfKey]);
+ }
+ }
+ }
+ return result;
+ }
+
+
+ /************************************************
+ return number of instances with action Delete
+ @type: vnfs networks, vngGroups (only vfModule)
+ @node : node model from the left tree
+ ************************************************/
+ getExistingInstancesWithDeleteMode(node, serviceModelId: string, selectedVNF: string): number {
+ const existingInstances = this._store.getState().service.serviceInstance[serviceModelId].vnfs[selectedVNF].vfModules;
+ let counter = 0;
+ const modelUuid = node.data.uuid;
+
+ if (!_.isNil(existingInstances)) {
+ for (let instanceKey in existingInstances) {
+ let size = Object.keys(existingInstances[instanceKey]).length;
+ for (let i = 0; i < size; i++) {
+ let vfModuleDynamicKey = Object.keys(existingInstances[instanceKey])[i];
+ if (!_.isNil(existingInstances[instanceKey][vfModuleDynamicKey].action)) {
+ if (existingInstances[instanceKey][vfModuleDynamicKey]['uuid'] === modelUuid && existingInstances[instanceKey][vfModuleDynamicKey].action.split('_').pop() === 'Delete') {
+ counter++;
+ }
+ }
+ }
+
+ }
+ }
+ return counter;
+ }
+
+ isVFModuleReachedLimit(node: any, serviceHierarchy: any, serviceModelId: string, currentNodeCount: number): boolean {
+ let maxNodes: number = 1;
+ let vnfModules = serviceHierarchy[serviceModelId].vfModules;
+ if (vnfModules[node.data.name]) {
+ maxNodes = vnfModules[node.data.name].properties.maxCountInstances || 1;
+ }
+ return !(maxNodes > currentNodeCount);
+
+ }
+
+ getMenuAction(node: ITreeNode, serviceModelId: string): { [methodName: string]: { method: Function, visible: Function, enable: Function } } {
+ return {
+ edit: {
+ method: (node, serviceModelId) => {
+ this._iframeService.addClassOpenModal('content');
+ this._dialogService.addDialog(GenericFormPopupComponent, {
+ type: PopupType.VF_MODULE,
+ uuidData: <any>{
+ serviceId: serviceModelId,
+ modelName: node.data.modelName,
+ vFModuleStoreKey: node.data.dynamicModelName,
+ vnfStoreKey: node.parent.data.vnfStoreKey,
+ modelId: node.data.modelId,
+ type: node.data.type,
+ popupService: this._vfModulePopupService
+ },
+ node: node,
+ isUpdateMode: true
+ });
+ },
+ visible: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
+ enable: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
+ },
+ showAuditInfo: {
+ method: (node, serviceModelId) => {
+ let instance = this._store.getState().service.serviceInstance[serviceModelId].vnfs[node.parent.data.vnfStoreKey].vfModules[node.data.modelName][node.data.modelVersionId];
+ this._sharedTreeService.openAuditInfoModal(node, serviceModelId, instance, 'VFMODULE', this);
+ },
+ visible: (node) => this._sharedTreeService.shouldShowAuditInfo(node),
+ enable: (node) => this._sharedTreeService.shouldShowAuditInfo(node)
+ },
+ remove: {
+ method: (node, serviceModelId) => this._store.dispatch(removeVfModuleInstance(node.data.modelName, serviceModelId, node.parent.data.modelName, node.parent.data.vnfStoreKey, node.data.dynamicModelName)),
+ visible: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
+ enable: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
+ },
+ delete: {
+ method: (node, serviceModelId) => {
+ this._store.dispatch(deleteActionVfModuleInstance(node.data.dynamicModelName, node.parent.data.vnfStoreKey, serviceModelId))
+ },
+ visible: (node) => this._sharedTreeService.shouldShowDelete(node),
+ enable: (node) => this._sharedTreeService.shouldShowDelete(node)
+ },
+ undoDelete: {
+ method: (node, serviceModelId) => {
+ this._store.dispatch(undoDeleteVfModuleInstance(node.data.dynamicModelName, node.parent.data.vnfStoreKey, serviceModelId))
+ },
+ visible: (node) => this._sharedTreeService.shouldShowUndoDelete(node),
+ enable: (node, serviceModelId) => this._sharedTreeService.shouldShowUndoDelete(node) && this._sharedTreeService.shouldShowDelete(node.parent) && !this._sharedTreeService.isServiceOnDeleteMode(serviceModelId)
+ }
+ };
+
+
+ }
+
+ updatePosition(that , node, instanceId, parentStoreKey): void {
+ that.store.dispatch(updateVFModulePosition(node, instanceId, parentStoreKey));
+ }
+
+
+ getNodePosition(instance, deepDynamicName): number {
+ return (!_.isNil(instance) && !_.isNil(instance[deepDynamicName])) ? instance[deepDynamicName].position : null;
+ }
+
+ onSelectedNode(node: ITreeNode): void {
+ }
+
+ getInfoForVFModule(model, instance): ComponentInfoModel {
+ let modelInfoItems: ModelInformationItem[] = [];
+ if (model && !_.isNil(model.properties))
+ {
+ modelInfoItems = [
+ ModelInformationItem.createInstance("Base Module", model.properties.baseModule),
+ ModelInformationItem.createInstance("Min Instances", model.properties.minCountInstances),
+ ModelInformationItem.createInstance("Max Instances", model.properties.maxCountInstances),
+ ModelInformationItem.createInstance("Initial Instances Count", model.properties.initialCount)
+ ];
+ }
+ return this._componentInfoService.addGeneralInfoItems(modelInfoItems, ComponentInfoType.VFMODULE, model, instance);
+ }
+
+
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vnf/vnf.model.info.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vnf/vnf.model.info.spec.ts
new file mode 100644
index 000000000..10c8e399c
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vnf/vnf.model.info.spec.ts
@@ -0,0 +1,1671 @@
+import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing";
+import {getTestBed, TestBed} from "@angular/core/testing";
+import {MockNgRedux, NgReduxTestingModule} from "@angular-redux/store/testing";
+import {VnfModelInfo} from "./vnf.model.info";
+import {DynamicInputsService} from "../../dynamicInputs.service";
+import {VFModuleModelInfo} from "../vfModule/vfModule.model.info";
+import {VNFModel} from "../../../../../shared/models/vnfModel";
+import {SharedTreeService} from "../../shared.tree.service";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../../../../shared/store/reducers";
+import {DefaultDataGeneratorService} from "../../../../../shared/services/defaultDataServiceGenerator/default.data.generator.service";
+import {DialogService} from "ng2-bootstrap-modal";
+import {VfModulePopuopService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service";
+import {VnfPopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service";
+import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service";
+import {DuplicateService} from "../../../duplicate/duplicate.service";
+import {IframeService} from "../../../../../shared/utils/iframe.service";
+import {ServiceInfoService} from "../../../../../shared/server/serviceInfo/serviceInfo.service";
+import {AuditInfoModalComponent} from "../../../../../shared/components/auditInfoModal/auditInfoModal.component";
+import {ModelInformationItem} from "../../../../../shared/components/model-information/model-information.component";
+import {ComponentInfoModel, ComponentInfoType} from "../../../component-info/component-info-model";
+import {ComponentInfoService} from "../../../component-info/component-info.service";
+import {AaiService} from "../../../../../shared/services/aaiService/aai.service";
+import {HttpClient, HttpHandler} from "@angular/common/http";
+import {FeatureFlagsService} from "../../../../../shared/services/featureFlag/feature-flags.service";
+
+describe('Vnf Model Info', () => {
+ let injector;
+ let httpMock: HttpTestingController;
+ let _dynamicInputsService : DynamicInputsService;
+ let _sharedTreeService : SharedTreeService;
+ let _serviceInfoService: ServiceInfoService;
+ let _defaultDataGeneratorService : DefaultDataGeneratorService;
+ let _dialogService : DialogService;
+ let _vfModulePopupService : VfModulePopuopService;
+ let _vnfPopupService : VnfPopupService;
+ let _duplicateService : DuplicateService;
+ let _iframeService : IframeService;
+ let _componentInfoService : ComponentInfoService;
+
+ let _store : NgRedux<AppState>;
+ let vnfModel: VnfModelInfo;
+ beforeEach(() => {
+ TestBed.configureTestingModule({
+ imports: [HttpClientTestingModule, NgReduxTestingModule],
+ providers: [
+ MockNgRedux,
+ DynamicInputsService,
+ DialogService,
+ VfModulePopuopService,
+ VnfPopupService,
+ DefaultDataGeneratorService,
+ SharedTreeService,
+ DuplicateService,
+ AaiService,
+ HttpClient,
+ HttpHandler,
+ FeatureFlagsService,
+ ComponentInfoService,
+ IframeService]
+ }).compileComponents();
+
+ injector = getTestBed();
+ _sharedTreeService = injector.get(SharedTreeService);
+ _store = injector.get(NgRedux);
+ _componentInfoService = injector.get(ComponentInfoService);
+
+ vnfModel = new VnfModelInfo(
+ _dynamicInputsService,
+ _sharedTreeService,
+ _defaultDataGeneratorService,
+ _dialogService,
+ _vnfPopupService,
+ _vfModulePopupService,
+ _duplicateService,
+ null,
+ _iframeService,
+ _componentInfoService,
+ _store);
+
+
+ });
+
+ test('VnfModelInfo should be defined', () => {
+ expect(VnfModelInfo).toBeDefined();
+ });
+
+ test('VnfModelInfo should defined extra details', () => {
+ expect(vnfModel.name).toEqual('vnfs');
+ expect(vnfModel.type).toEqual('VNF');
+ expect(vnfModel.childName).toEqual('vfModules');
+ expect(vnfModel.childType).toEqual('VFModuleModelInfo');
+ });
+
+ test('isEcompGeneratedNaming should return true if isEcompGeneratedNaming is "true" ', () => {
+ let isEcompGeneratedNaming: boolean = vnfModel.isEcompGeneratedNaming(<any>{
+ properties: {
+ ecomp_generated_naming: 'true'
+ }
+ });
+ expect(isEcompGeneratedNaming).toBeTruthy();
+ });
+
+ test('isEcompGeneratedNaming should return false if isEcompGeneratedNaming is "false"', () => {
+ let isEcompGeneratedNaming: boolean = vnfModel.isEcompGeneratedNaming({
+ properties: {
+ ecomp_generated_naming: 'false'
+ }
+ });
+ expect(isEcompGeneratedNaming).toBeFalsy();
+ });
+
+ test('isEcompGeneratedNaming should return false if isEcompGeneratedNaming is not defined', () => {
+ let isEcompGeneratedNaming: boolean = vnfModel.isEcompGeneratedNaming({
+ properties: {
+ }
+ });
+ expect(isEcompGeneratedNaming).toBeFalsy();
+ });
+
+
+ test('getTooltip should return "VF"', () => {
+ let tooltip: string = vnfModel.getTooltip();
+ expect(tooltip).toEqual('VF');
+ });
+
+ test('getType should return "VF"', () => {
+ let tooltip: string = vnfModel.getType();
+ expect(tooltip).toEqual('VF');
+ });
+
+ test('getNextLevelObject should vfModule level object', () => {
+ let nextLevel: VFModuleModelInfo = vnfModel.getNextLevelObject();
+ expect(nextLevel.type).toEqual('Module');
+ });
+
+ test('getModel should return VNF model', () => {
+ let model: VNFModel = vnfModel.getModel('2017-388_ADIOD-vPE 1', <any>{
+ originalName : '2017-388_ADIOD-vPE 1'
+ }, getServiceHierarchy());
+ expect(model.type).toEqual('VF');
+ });
+
+ test('showNodeIcons should return false if reachLimit of max', ()=>{
+ let serviceId : string = 'servicedId';
+ let node = {
+ data : {
+ id : 'vnfId',
+ name : 'vnfName',
+ modelCustomizationId : "modelCustomizationId",
+ modelUniqueId: "modelCustomizationId"
+ }
+ };
+ jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+ global:{},
+ service : {
+ serviceHierarchy : {
+ 'servicedId' : {
+ 'vnfs' : {
+ modelCustomizationId : "modelCustomizationId",
+ 'modelInfo': {
+ modelCustomizationId : "modelCustomizationId"
+ },
+ 'vnfName' : {
+ 'properties' : {
+ 'max_instances' : 1
+ }
+ }
+ }
+ }
+ },
+ serviceInstance : {
+ 'servicedId' : {
+ 'existingVNFCounterMap' : {
+ 'modelCustomizationId' : 1
+ },
+ 'vnfs' : {
+ 'vnfName' :{
+
+ }
+ }
+ }
+ }
+ }
+ });
+
+ let result = vnfModel.showNodeIcons(<any>node, serviceId);
+ expect(result).toEqual(new AvailableNodeIcons(false , true));
+ });
+
+ test('showNodeIcons should return true if not reachLimit of max', ()=>{
+ let serviceId : string = 'servicedId';
+ let node = {
+ data : {
+ id : 'vnfId',
+ name : 'vnfName'
+ }
+ };
+ jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+ global:{
+ drawingBoardStatus: "EDIT"
+ },
+ service : {
+ serviceHierarchy : {
+ 'servicedId' : {
+ 'vnfs' : {
+ 'vnfName' : {
+ 'properties' : {
+ 'max_instances' : 2
+ }
+ }
+ }
+ }
+ },
+ serviceInstance : {
+ 'servicedId' : {
+ 'existingVNFCounterMap' : {
+ 'vnfId' : 1
+ },
+ 'vnfs' : {
+ 'vnfName' :{
+
+ }
+ }
+ }
+ }
+ }
+ });
+
+ let result = vnfModel.showNodeIcons(<any>node, serviceId);
+ expect(result).toEqual(new AvailableNodeIcons(true , false));
+ });
+
+ test('getNodeCount should return number of nodes', ()=>{
+ let serviceId : string = 'servicedId';
+ jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+ global : {},
+ service : {
+ serviceHierarchy : {
+ 'servicedId' : {
+ 'vnfs' : {
+ 'vnfName' : {
+ 'properties' : {
+ 'max_instances' : 1
+ }
+ }
+ }
+ }
+ },
+ serviceInstance : {
+ 'servicedId' : {
+ 'existingVNFCounterMap' : {
+ 'modelCustomizationId' : 1
+ },
+ 'vnfs' : {
+ 'vnfName' :{
+ 'originalName' : 'vnfName'
+ }
+ }
+ }
+ }
+ }
+ });
+
+ let node = {
+ data : {
+ id : 'vnfId',
+ name : 'vnfName',
+ modelCustomizationId : "modelCustomizationId",
+ modelUniqueId: "modelCustomizationId"
+ }
+ };
+ let result = vnfModel.getNodeCount(<any>node , serviceId);
+ expect(result).toEqual(1);
+
+ node.data.modelCustomizationId = 'vnfId_notExist';
+ node.data.modelUniqueId = 'vnfId_notExist';
+ result = vnfModel.getNodeCount(<any>node , serviceId);
+ expect(result).toEqual(0);
+
+ result = vnfModel.getNodeCount(<any>node , serviceId + '_notExist');
+ expect(result).toEqual(0);
+ });
+
+ test('getMenuAction: edit', ()=>{
+ let node = {"modelId":"d6557200-ecf2-4641-8094-5393ae3aae60","missingData":true,"action":"None","inMaint":true,"name":"jlfBwIks283yKlCD8","modelName":"VF_vMee 0","type":"VF","isEcompGeneratedNaming":true,"networkStoreKey":"VF_vMee 0:004","vnfStoreKey":"VF_vMee 0:004","typeName":"VNF"};
+ let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
+ let result = vnfModel.getMenuAction(<any>node, serviceModelId);
+ spyOn(result['edit'], 'method');
+ expect(result['edit']).toBeDefined();
+ expect(result['edit'].visible).toBeTruthy();
+ expect(result['edit'].enable).toBeTruthy();
+ result['edit']['method'](node, serviceModelId);
+ expect(result['edit']['method']).toHaveBeenCalledWith(node, serviceModelId);
+ });
+
+ test('member should defined edit method', () => {
+ let node = {
+ data : {
+ "modelId": "d6557200-ecf2-4641-8094-5393ae3aae60",
+ "missingData": true,
+ "action": "None",
+ "inMaint": true,
+ "name": "jlfBwIks283yKlCD8",
+ "modelName": "VF_vMee 0",
+ "type": "VF",
+ "userProvidedNaming": false,
+ "networkStoreKey": "VF_vMee 0:004",
+ "vnfStoreKey": "VF_vMee 0:004",
+ "typeName": "VNF"
+ },
+ type : 'VNF'
+
+ };
+ let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
+
+ let menuActions = vnfModel.getMenuAction(<any>node, serviceModelId);
+ spyOn(menuActions['edit'], 'method');
+ expect(menuActions['edit']).toBeDefined();
+ expect(menuActions['edit'].visible(node)).toBeFalsy();
+ menuActions['edit']['method'](node, serviceModelId);
+ expect(menuActions['edit']['method']).toHaveBeenCalledWith(node, serviceModelId);
+ });
+
+ test('getMenuAction: duplicate', ()=>{
+ jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+ "global": {
+ "name": null,
+ "type": "UPDATE_DRAWING_BOARD_STATUS",
+ "drawingBoardStatus": "CREATE"
+ }
+ });
+ let node = {
+ data : {
+ "modelId": "d6557200-ecf2-4641-8094-5393ae3aae60",
+ "missingData": true,
+ "action": "None",
+ "inMaint": true,
+ "name": "jlfBwIks283yKlCD8",
+ "modelName": "VF_vMee 0",
+ "type": "VF",
+ "isEcompGeneratedNaming":true,
+ "networkStoreKey": "VF_vMee 0:004",
+ "vnfStoreKey": "VF_vMee 0:004",
+ "typeName": "VNF"
+ },
+ type : 'VNF'
+
+ };
+ let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
+ let menuActions = vnfModel.getMenuAction(<any>node, serviceModelId);
+ spyOn(menuActions['duplicate'], 'method');
+ expect(menuActions['duplicate']).toBeDefined();
+ expect(menuActions['duplicate'].visible(node)).toBeFalsy();
+ menuActions['duplicate']['method'](node, serviceModelId);
+ expect(menuActions['duplicate']['method']).toHaveBeenCalledWith(node, serviceModelId);
+ });
+
+ test('getMenuAction: remove', ()=>{
+ let node = {
+ data : {
+ "modelId": "d6557200-ecf2-4641-8094-5393ae3aae60",
+ "missingData": true,
+ "action": "None",
+ "inMaint": true,
+ "name": "jlfBwIks283yKlCD8",
+ "modelName": "VF_vMee 0",
+ "type": "VF",
+ "isEcompGeneratedNaming":true,
+ "networkStoreKey": "VF_vMee 0:004",
+ "vnfStoreKey": "VF_vMee 0:004",
+ "typeName": "VNF"
+ },
+ type : 'VNF'
+
+ };
+ let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
+
+ let menuActions = vnfModel.getMenuAction(<any>node, serviceModelId);
+ spyOn(menuActions['remove'], 'method');
+ expect(menuActions['remove']).toBeDefined();
+ expect(menuActions['remove'].visible(node)).toBeFalsy();
+ menuActions['remove']['method'](node, serviceModelId);
+ expect(menuActions['remove']['method']).toHaveBeenCalledWith(node, serviceModelId);
+ });
+
+ test('getMenuAction: delete', ()=>{
+ let node = {"modelId":"d6557200-ecf2-4641-8094-5393ae3aae60","missingData":true,"action":"None","inMaint":true,"name":"jlfBwIks283yKlCD8","modelName":"VF_vMee 0","type":"VF","isEcompGeneratedNaming":true,"networkStoreKey":"VF_vMee 0:004","vnfStoreKey":"VF_vMee 0:004","typeName":"VNF"};
+ let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
+ let result = vnfModel.getMenuAction(<any>node, serviceModelId);
+ spyOn(result['delete'], 'method');
+ expect(result['delete']).toBeDefined();
+ expect(result['delete'].visible).toBeTruthy();
+ expect(result['delete'].enable).toBeTruthy();
+ result['delete']['method'](node, serviceModelId);
+ expect(result['delete']['method']).toHaveBeenCalledWith(node, serviceModelId);
+ });
+
+
+ test('getMenuAction: undoDelete', ()=>{
+ let node = {"modelId":"d6557200-ecf2-4641-8094-5393ae3aae60","missingData":true,"action":"None","inMaint":true,"name":"jlfBwIks283yKlCD8","modelName":"VF_vMee 0","type":"VF","isEcompGeneratedNaming":true,"networkStoreKey":"VF_vMee 0:004","vnfStoreKey":"VF_vMee 0:004","typeName":"VNF"};
+ let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
+ let result = vnfModel.getMenuAction(<any>node, serviceModelId);
+ spyOn(result['undoDelete'], 'method');
+ expect(result['undoDelete']).toBeDefined();
+ expect(result['undoDelete'].visible).toBeDefined();
+ expect(result['undoDelete'].enable).toBeDefined();
+ result['undoDelete']['method'](node, serviceModelId);
+ expect(result['undoDelete']['method']).toHaveBeenCalledWith(node, serviceModelId);
+ });
+
+ test('getMenuAction: showAuditInfo', ()=>{
+ jest.spyOn(_sharedTreeService, 'isRetryMode').mockReturnValue(true);
+
+ jest.spyOn(AuditInfoModalComponent.openInstanceAuditInfoModal, 'next');
+ let node = {
+ data : {
+ "modelId": "6b528779-44a3-4472-bdff-9cd15ec93450",
+ "action": "Create",
+ "type": "VF",
+ "vnfStoreKey": "MSOTEST103a",
+ "typeName": "VNF",
+ "isFailed": true,
+ },
+ type : 'VNF'
+
+ };
+ let serviceModelId = "6b528779-44a3-4472-bdff-9cd15ec93450";
+ let result = vnfModel.getMenuAction(<any>node, serviceModelId);
+ spyOn(result['showAuditInfo'], 'method');
+ expect(result['showAuditInfo']).toBeDefined();
+ expect(result['showAuditInfo'].visible(node)).toBeTruthy();
+ expect(result['showAuditInfo'].enable(node)).toBeTruthy();
+ result['showAuditInfo']['method'](node, serviceModelId);
+
+ // expect(AuditInfoModalComponent.openInstanceAuditInfoModal.next).toBeCalled();
+ // expect(result['showAuditInfo'].method)
+
+ });
+
+ test('Info for vnf should be correct', () => {
+ const model = getVNFModel();
+ const instance = getVNFInstance();
+ let actualVNFInfo = vnfModel.getInfoForVnf(model,instance);
+ let expectedVNFInfo = [
+ ModelInformationItem.createInstance('Type', 'VF'),
+ ModelInformationItem.createInstance('Model Version', '2.0'),
+ ModelInformationItem.createInstance('Model Customization ID','91415b44-753d-494c-926a-456a9172bbb9'),
+ ModelInformationItem.createInstance('Instance ID', '66cbb3b5-c823-470c-9520-4e0b85112250'),
+ ModelInformationItem.createInstance('In Maintenance', true),
+ ModelInformationItem.createInstance('Min Instances', 0),
+ ModelInformationItem.createInstance('Max Instances',1)
+ ];
+ expect(actualVNFInfo).toEqual(new ComponentInfoModel(ComponentInfoType.VNF, expectedVNFInfo, []));
+ });
+
+ test('Info for vnf in left side - model only - should be correct', () => {
+ const model = getVNFModel();
+ let actualVNFInfo = vnfModel.getInfoForVnf(model,null);
+ let expectedVNFInfo = [
+ ModelInformationItem.createInstance('Type', 'VF'),
+ ModelInformationItem.createInstance('Model Version', '2.0'),
+ ModelInformationItem.createInstance('Model Customization ID','91415b44-753d-494c-926a-456a9172bbb9'),
+ ModelInformationItem.createInstance('Min Instances', 0),
+ ModelInformationItem.createInstance('Max Instances',1)
+ ];
+ expect(actualVNFInfo).toEqual(new ComponentInfoModel(ComponentInfoType.VNF, expectedVNFInfo, []));
+ });
+
+ function getVNFModel(){
+ return {
+ "name":"VF_vMee",
+ "version":"2.0",
+ "description":"VSP_vMee",
+ "uuid":"d6557200-ecf2-4641-8094-5393ae3aae60",
+ "invariantUuid":"4160458e-f648-4b30-a176-43881ffffe9e",
+ "max":1,
+ "min":0,
+ "customizationUuid":"91415b44-753d-494c-926a-456a9172bbb9",
+ "isEcompGeneratedNaming":true,
+ "type":"VF",
+ "modelCustomizationName":"VF_vMee 0",
+ "vfcInstanceGroups":{},
+ "properties":{
+ "gpb2_Internal2_mac":"00:11:22:EF:AC:DF",
+ "sctp-a-ipv6-egress_rule_application":"any",
+ "sctp-b-ipv6-egress_src_start_port":"0",
+ "Internal2_allow_transit":"true",
+ "sctp-b-IPv6_ethertype":"IPv6",
+ "ncb2_Internal1_mac":"00:11:22:EF:AC:DF",
+ "sctp-b-ingress_rule_protocol":"icmp","sctp-b-ingress_action":"pass",
+ "sctp-a-egress_rule_application":"any",
+ "sctp-b-ipv6-ingress-src_start_port":"0.0",
+ "ncb1_Internal2_mac":"00:11:22:EF:AC:DF","sctp-b-egress_src_addresses":"local",
+ "fsb_volume_size_0":"320.0",
+ "sctp-a-ipv6-ingress-dst_start_port":"0",
+ "sctp-a-ipv6-ingress_ethertype":"IPv4","sctp-b-ipv6-ingress_rule_application":"any",
+ "domain_name":"default-domain",
+ "sctp-a-egress_src_addresses":"local",
+ "sctp-b-egress-src_start_port":"0.0",
+ "sctp-a-ingress_rule_protocol":"icmp",
+ "sctp-b-display_name":"epc-sctp-b-ipv4v6-sec-group",
+ "sctp-b-ipv6-ingress-dst_end_port":"65535",
+ "sctp-a-ingress_ethertype":"IPv4",
+ "sctp-a-egress-src_start_port":"0.0",
+ "sctp-b-dst_subnet_prefix_v6":"::",
+ "nf_naming":"{ecomp_generated_naming=true}",
+ "sctp-a-ipv6-ingress_src_subnet_prefix":"0.0.0.0"
+ }
+ };
+
+ }
+
+ function getVNFInstance(){
+ return {
+ "action":"None",
+ "instanceName":"4O61SmpFAdCm1oVEs",
+ "instanceId":"66cbb3b5-c823-470c-9520-4e0b85112250",
+ "orchStatus":null,
+ "productFamilyId":null,
+ "lcpCloudRegionId":null,
+ "tenantId":null,
+ "modelInfo":{
+ "modelCustomizationName":"VF_vMee 0",
+ "modelInvariantId":"vnf-instance-model-invariant-id",
+ "modelVersionId":"d6557200-ecf2-4641-8094-5393ae3aae60",
+ "modelType":"vnf"
+ },
+ "instanceType":"7538ifdSoTccmbEkr",
+ "provStatus":null,
+ "inMaint":true,
+ "uuid":"d6557200-ecf2-4641-8094-5393ae3aae60",
+ "originalName":"VF_vMee 0",
+ "legacyRegion":null,
+ "lineOfBusiness":null,
+ "platformName":null,
+ "trackById":"VF_vMee 0:004",
+ "vfModules":{
+ "vf_vmee0..VfVmee..vmme_vlc..module-1":{
+ "vf_vmee0..VfVmee..vmme_vlc..module-1:008":{
+ "action":"None",
+ "instanceName":"ss820f_0918_db",
+ "instanceId":"2c1ca484-cbc2-408b-ab86-25a2c15ce280",
+ "orchStatus":"deleted",
+ "productFamilyId":null,
+ "lcpCloudRegionId":null,
+ "tenantId":null,
+ "modelInfo":{
+ "modelCustomizationName":"VfVmee..vmme_vlc..module-1",
+ "modelCustomizationId":"b200727a-1bf9-4e7c-bd06-b5f4c9d920b9",
+ "modelInvariantId":"09edc9ef-85d0-4b26-80de-1f569d49e750",
+ "modelVersionId":"522159d5-d6e0-4c2a-aa44-5a542a12a830",
+ "modelType":"vfModule"
+ },
+ "instanceType":null,
+ "provStatus":null,
+ "inMaint":true,
+ "uuid":"522159d5-d6e0-4c2a-aa44-5a542a12a830",
+ "originalName":"VfVmee..vmme_vlc..module-1",
+ "legacyRegion":null,
+ "lineOfBusiness":null,
+ "platformName":null,
+ "trackById":"vf_vmee0..VfVmee..vmme_vlc..module-1:008",
+ "isBase":false,
+ "volumeGroupName":null
+ }
+ },
+ "dc229cd8-c132-4455-8517-5c1787c18b14":{
+ "dc229cd8-c132-4455-8517-5c1787c18b14:009":{
+ "action":"None",
+ "instanceName":"ss820f_0918_base",
+ "instanceId":"3ef042c4-259f-45e0-9aba-0989bd8d1cc5",
+ "orchStatus":"Assigned",
+ "productFamilyId":null,
+ "lcpCloudRegionId":null,
+ "tenantId":null,
+ "modelInfo":{
+ "modelCustomizationId":"8ad8670b-0541-4499-8101-275bbd0e8b6a",
+ "modelInvariantId":"1e463c9c-404d-4056-ba56-28fd102608de",
+ "modelVersionId":"dc229cd8-c132-4455-8517-5c1787c18b14",
+ "modelType":"vfModule"
+ },
+ "instanceType":null,
+ "provStatus":null,
+ "inMaint":false,
+ "uuid":"dc229cd8-c132-4455-8517-5c1787c18b14",
+ "originalName":null,
+ "legacyRegion":null,
+ "lineOfBusiness":null,
+ "platformName":null,
+ "trackById":"dc229cd8-c132-4455-8517-5c1787c18b14:009",
+ "isBase":true,
+ "volumeGroupName":null
+ }
+ }
+ },
+ "networks":{
+
+ }
+ };
+ }
+
+ function getServiceHierarchy(){
+ return {
+ "service": {
+ "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+ "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "name": "action-data",
+ "version": "1.0",
+ "toscaModelURL": null,
+ "category": "",
+ "serviceType": "",
+ "serviceRole": "",
+ "description": "",
+ "serviceEcompNaming": "false",
+ "instantiationType": "Macro",
+ "inputs": {
+ "2017488_adiodvpe0_ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ }
+ },
+ "vidNotions": {
+ "instantiationUI": "legacy",
+ "modelCategory": "other"
+ }
+ },
+ "vnfs": {
+ "2017-388_ADIOD-vPE 1": {
+ "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413",
+ "invariantUuid": "00beb8f9-6d39-452f-816d-c709b9cbb87d",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-388_ADIOD-vPE",
+ "version": "1.0",
+ "customizationUuid": "280dec31-f16d-488b-9668-4aae55d6648a",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {
+ "vnf_config_template_version": {
+ "displayName": "vnf_config_template_version",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_config_template_version"
+ },
+ "bandwidth_units": {
+ "displayName": "bandwidth_units",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth_units"
+ },
+ "bandwidth": {
+ "displayName": "bandwidth",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth"
+ },
+ "AIC_CLLI": {
+ "displayName": "AIC_CLLI",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_AIC_CLLI"
+ },
+ "ASN": {
+ "displayName": "ASN",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_ASN"
+ },
+ "vnf_instance_name": {
+ "displayName": "vnf_instance_name",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_instance_name"
+ }
+ },
+ "properties": {
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=false}",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "false",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VF",
+ "modelCustomizationName": "2017-388_ADIOD-vPE 1",
+ "vfModules": {},
+ "volumeGroups": {},
+ "vfcInstanceGroups": {}
+ },
+ "2017-388_ADIOD-vPE 0": {
+ "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168",
+ "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-388_ADIOD-vPE",
+ "version": "4.0",
+ "customizationUuid": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {
+ "vnf_config_template_version": {
+ "displayName": "vnf_config_template_version",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_config_template_version"
+ },
+ "bandwidth_units": {
+ "displayName": "bandwidth_units",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth_units"
+ },
+ "bandwidth": {
+ "displayName": "bandwidth",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth"
+ },
+ "AIC_CLLI": {
+ "displayName": "AIC_CLLI",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_AIC_CLLI"
+ },
+ "ASN": {
+ "displayName": "ASN",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_ASN"
+ },
+ "vnf_instance_name": {
+ "displayName": "vnf_instance_name",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_instance_name"
+ }
+ },
+ "properties": {
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=false}",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "min_instances": "1",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "false",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VF",
+ "modelCustomizationName": "2017-388_ADIOD-vPE 0",
+ "vfModules": {},
+ "volumeGroups": {},
+ "vfcInstanceGroups": {}
+ },
+ "2017-488_ADIOD-vPE 0": {
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-488_ADIOD-vPE",
+ "version": "5.0",
+ "customizationUuid": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {
+ "vnf_config_template_version": {
+ "displayName": "vnf_config_template_version",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_config_template_version"
+ },
+ "bandwidth_units": {
+ "displayName": "bandwidth_units",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth_units"
+ },
+ "bandwidth": {
+ "displayName": "bandwidth",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth"
+ },
+ "AIC_CLLI": {
+ "displayName": "AIC_CLLI",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_AIC_CLLI"
+ },
+ "ASN": {
+ "displayName": "ASN",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_ASN"
+ },
+ "vnf_instance_name": {
+ "displayName": "vnf_instance_name",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_instance_name"
+ }
+ },
+ "properties": {
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=false}",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "max_instances": "3",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "min_instances": "1",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "false",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VF",
+ "modelCustomizationName": "2017-488_ADIOD-vPE 0",
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "baseModule": false
+ },
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "fromInputName": "adiodvpe0_bandwidth_units",
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "fromInputName": "adiodvpe0_bandwidth",
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "AIC_CLLI"
+ },
+ "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "volumeGroupAllowed": true
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+ "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+ "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+ "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "version": "5",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "ADIOD_base_vPE_BV",
+ "baseModule": true
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV",
+ "baseModule": false
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "baseModule": false
+ },
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "fromInputName": "adiodvpe0_bandwidth_units",
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "fromInputName": "adiodvpe0_bandwidth",
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "AIC_CLLI"
+ },
+ "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ }
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV",
+ "baseModule": false
+ },
+ "inputs": {}
+ }
+ },
+ "vfcInstanceGroups": {}
+ }
+ },
+ "networks": {},
+ "collectionResource": {},
+ "configurations": {},
+ "fabricConfigurations": {},
+ "serviceProxies": {},
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "baseModule": false
+ },
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "fromInputName": "adiodvpe0_bandwidth_units",
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "fromInputName": "adiodvpe0_bandwidth",
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "AIC_CLLI"
+ },
+ "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "volumeGroupAllowed": true
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+ "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+ "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+ "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "version": "5",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "ADIOD_base_vPE_BV",
+ "baseModule": true
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV",
+ "baseModule": false
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "baseModule": false
+ },
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "fromInputName": "adiodvpe0_bandwidth_units",
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "fromInputName": "adiodvpe0_bandwidth",
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "AIC_CLLI"
+ },
+ "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ }
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV",
+ "baseModule": false
+ },
+ "inputs": {}
+ }
+ },
+ "pnfs": {}
+ }
+ }
+
+});
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vnf/vnf.model.info.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vnf/vnf.model.info.ts
new file mode 100644
index 000000000..cec3fad1e
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vnf/vnf.model.info.ts
@@ -0,0 +1,332 @@
+import {DynamicInputsService} from "../../dynamicInputs.service";
+import {ILevelNodeInfo} from "../basic.model.info";
+import {VFModuleModelInfo} from "../vfModule/vfModule.model.info";
+import {VNFModel} from "../../../../../shared/models/vnfModel";
+import {VnfInstance} from "../../../../../shared/models/vnfInstance";
+import {VnfTreeNode} from "../../../../../shared/models/vnfTreeNode";
+import {InputType} from "../../../../../shared/models/inputTypes";
+import {SharedTreeService} from "../../shared.tree.service";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../../../../shared/store/reducers";
+import {DefaultDataGeneratorService} from "../../../../../shared/services/defaultDataServiceGenerator/default.data.generator.service";
+import {
+ GenericFormPopupComponent,
+ PopupType
+} from "../../../../../shared/components/genericFormPopup/generic-form-popup.component";
+import {DialogService} from 'ng2-bootstrap-modal';
+import {VnfPopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service";
+import {VfModulePopuopService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service";
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service";
+import {DuplicateService} from "../../../duplicate/duplicate.service";
+import {DuplicateVnfComponent} from "../../../duplicate/duplicate-vnf.component";
+import {SdcUiServices} from "onap-ui-angular";
+import {IframeService} from "../../../../../shared/utils/iframe.service";
+import {changeInstanceCounter, removeInstance} from "../../../../../shared/storeUtil/utils/general/general.actions";
+import {MessageBoxData} from "../../../../../shared/components/messageBox/messageBox.data";
+import {MessageBoxService} from "../../../../../shared/components/messageBox/messageBox.service";
+import {ServiceInstanceActions} from "../../../../../shared/models/serviceInstanceActions";
+import {
+ deleteActionVnfInstance,
+ undoDeleteActionVnfInstance,
+ updateVnfPosition
+} from "../../../../../shared/storeUtil/utils/vnf/vnf.actions";
+import * as _ from 'lodash';
+import {IModalConfig} from "onap-ui-angular/dist/modals/models/modal-config";
+import {ComponentInfoModel, ComponentInfoType} from "../../../component-info/component-info-model";
+import {ComponentInfoService} from "../../../component-info/component-info.service";
+import {ModelInformationItem} from "../../../../../shared/components/model-information/model-information.component";
+
+export class VnfModelInfo implements ILevelNodeInfo {
+ constructor(private _dynamicInputsService: DynamicInputsService,
+ private _sharedTreeService: SharedTreeService,
+ private _defaultDataGeneratorService: DefaultDataGeneratorService,
+ private _dialogService: DialogService,
+ private _vnfPopupService: VnfPopupService,
+ private _vfModulePopupService: VfModulePopuopService,
+ private _duplicateService: DuplicateService,
+ private modalService: SdcUiServices.ModalService,
+ private _iframeService: IframeService,
+ private _componentInfoService: ComponentInfoService,
+ private _store: NgRedux<AppState>) {
+ }
+
+ name: string = 'vnfs';
+ type: string = 'VNF';
+ childName: string = 'vfModules';
+ childType: string = 'VFModuleModelInfo';
+ typeName: string = 'VNF';
+
+ /***********************************************************
+ * return if user should provide instance name or not.
+ * @param currentModel - current Model object
+ ************************************************************/
+ isEcompGeneratedNaming = (currentModel): boolean => {
+ const ecompGeneratedNaming = currentModel.properties.ecomp_generated_naming;
+ return ecompGeneratedNaming === "true";
+ };
+
+ /***********************************************************
+ * return model dynamic inputs
+ * @param currentModel - current Model object
+ ************************************************************/
+ updateDynamicInputsDataFromModel = (currentModel): any => {
+ let displayInputs;
+ return _.isEmpty(displayInputs) ? [] : this._dynamicInputsService.getArbitraryInputs(displayInputs);
+ };
+
+ /***********************************************************
+ * return vnf model
+ * @param vnfModelId - current Model id
+ * @param instance - vnf instance
+ * @param serviceHierarchy - serviceHierarchy
+ ************************************************************/
+ getModel = (vnfModelId: string, instance: VnfInstance, serviceHierarchy): VNFModel => {
+ const originalModelName = instance.originalName ? instance.originalName : vnfModelId;
+ return new VNFModel(serviceHierarchy[this.name][originalModelName]);
+ };
+
+
+ /***********************************************************
+ * return vnf instance tree node
+ * @param instance - vnf instance
+ * @param model - vnf model
+ * @param parentModel
+ * @param storeKey - store key if exist
+ ************************************************************/
+ createInstanceTreeNode = (instance: VnfInstance, model: VNFModel, parentModel, storeKey: string): VnfTreeNode => {
+ let node = new VnfTreeNode(instance, model, storeKey);
+ node.missingData = this.hasMissingData(instance, node, model.isEcompGeneratedNaming);
+ node.typeName = this.typeName;
+ node.menuActions = this.getMenuAction(<any>node, model.uuid);
+ node.isFailed = _.isNil(instance.isFailed) ? false : instance.isFailed;
+ node.statusMessage = !_.isNil(instance.statusMessage) ? instance.statusMessage: "";
+ node = this._sharedTreeService.addingStatusProperty(node);
+ return node;
+ };
+
+ /***********************************************************
+ * return next level object (VFModule)
+ ************************************************************/
+ getNextLevelObject = (): VFModuleModelInfo => {
+ return new VFModuleModelInfo(this._dynamicInputsService, this._sharedTreeService, this._dialogService, this._vfModulePopupService, this._iframeService, this._store, this._componentInfoService);
+ };
+
+ /***********************************************************
+ * return if instance has missing data
+ * @param instance - vnf instance
+ * @param dynamicInputs
+ * @param isEcompGeneratedNaming
+ ************************************************************/
+ hasMissingData(instance, dynamicInputs: any, isEcompGeneratedNaming: boolean): boolean {
+ return this._sharedTreeService.hasMissingData(instance, dynamicInputs, isEcompGeneratedNaming, [InputType.LCP_REGION, InputType.TENANT, InputType.PLATFORM]);
+ }
+
+ getTooltip = (): string => 'VF';
+
+ getType = (): string => 'VF';
+
+ /***********************************************************
+ * return if instance has missing data
+ * @param node - VNF node
+ * @param serviceModelId - current service id
+ ************************************************************/
+ onClickAdd(node, serviceModelId: string): void {
+ this._dialogService.addDialog(GenericFormPopupComponent, {
+ type: PopupType.VNF,
+ uuidData: <any>{
+ serviceId: serviceModelId,
+ modelName: node.data.name,
+ vnfStoreKey: null,
+ modelId: node.data.modelVersionId,
+ type: node.data.type,
+ popupService: this._vnfPopupService
+ },
+ node: node,
+ isUpdateMode: false
+ })
+ }
+
+ /***********************************************************
+ * return number of existing instances
+ * @param node - VNF node
+ * @param serviceModelId - current service id
+ ************************************************************/
+ getNodeCount(node: ITreeNode, serviceModelId: string): number {
+ let map = null;
+ if (!_.isNil(this._store.getState().service.serviceInstance[serviceModelId])) {
+ map = this._store.getState().service.serviceInstance[serviceModelId].existingVNFCounterMap || 0;
+
+ if (!_.isNil(map)) {
+ let count = map[node.data.modelUniqueId] || 0;
+ count -= this._sharedTreeService.getExistingInstancesWithDeleteMode(node, serviceModelId, 'vnfs');
+ return count;
+ }
+ }
+ return 0;
+ }
+
+ /***********************************************************
+ * should show node icon
+ * @param node - current ITrees node
+ * @param serviceModelId - service id
+ ************************************************************/
+ showNodeIcons(node: ITreeNode, serviceModelId: string): AvailableNodeIcons {
+ let counter: number = !_.isNil(this._store.getState().service.serviceInstance[serviceModelId]) ?
+ (this._store.getState().service.serviceInstance[serviceModelId].existingVNFCounterMap[node.data.modelUniqueId] || 0) : 0;
+ counter -= this._sharedTreeService.getExistingInstancesWithDeleteMode(node, serviceModelId, 'vnfs');
+
+ const properties = this._store.getState().service.serviceHierarchy[serviceModelId].vnfs[node.data.name].properties;
+ const maxInstances: number = !_.isNil(properties) ? (properties.max_instances || 1) : 1;
+ const isReachedLimit = !(maxInstances > counter);
+ const showAddIcon = this._sharedTreeService.shouldShowAddIcon() && !isReachedLimit;
+ return new AvailableNodeIcons(showAddIcon, isReachedLimit)
+ }
+
+ getMenuAction(node: ITreeNode, serviceModelId: string): { [methodName: string]: { method: Function, visible: Function, enable: Function } } {
+ return <any>{
+ edit: {
+ method: (node, serviceModelId) => {
+ this._iframeService.addClassOpenModal('content');
+ this._dialogService.addDialog(GenericFormPopupComponent, {
+ type: PopupType.VNF,
+ uuidData: <any>{
+ serviceId: serviceModelId,
+ modelName: node.data.modelName,
+ vnfStoreKey: node.data.vnfStoreKey,
+ modelId: node.data.modelId,
+ type: node.data.type,
+ popupService: this._vnfPopupService
+ },
+ node: node,
+ isUpdateMode: true
+ });
+ },
+ visible: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
+ enable: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
+ },
+ showAuditInfo: {
+ method: (node, serviceModelId) => {
+ const instance = this._store.getState().service.serviceInstance[serviceModelId].vnfs[node.data.vnfStoreKey];
+ this._sharedTreeService.openAuditInfoModal(node, serviceModelId, instance, 'VNF', this);
+ },
+ visible: (node) => this._sharedTreeService.shouldShowAuditInfo(node),
+ enable: (node) => this._sharedTreeService.shouldShowAuditInfo(node)
+ },
+ duplicate: {
+ method: (node, serviceModelId) => {
+ if (this._store.getState().global.flags['FLAG_DUPLICATE_VNF']) {
+ const storeKey = node.data.vnfStoreKey;
+ let modalConfig: IModalConfig = this._duplicateService.openDuplicateModal(serviceModelId, node.data.modelUniqueId, node.data.modelName, storeKey, 1, this._store, node);
+ this.modalService.openCustomModal(modalConfig, DuplicateVnfComponent);
+ }
+ },
+ visible: (node) => this._sharedTreeService.shouldShowDuplicate(node) && !_.isNil(node.data) && !_.isNil(node.data.action) && node.data.action === ServiceInstanceActions.Create && this._duplicateService.canDuplicate(node),
+ enable: (node, serviceModelId) => this._duplicateService.isEnabled(node, this._store, serviceModelId)
+ },
+ remove: {
+ method: (node, serviceModelId) => {
+ if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) {
+ let storeKey: string = node.data.vnfStoreKey;
+ this._store.dispatch(removeInstance(node.data.vnfStoreKey, serviceModelId, storeKey, node));
+ this._store.dispatch(changeInstanceCounter(node.data.modelUniqueId, serviceModelId, -1, node));
+ this._sharedTreeService.selectedVNF = null;
+ } else {
+ let messageBoxData: MessageBoxData = new MessageBoxData(
+ "Remove VNF", // modal title
+ "You are about to remove this VNF and all its children from this service. Are you sure you want to remove it?",
+ <any>"warning",
+ <any>"md",
+ [
+ {
+ text: "Remove VNF",
+ size: "large",
+ callback: this.removeVnf.bind(this, node, serviceModelId),
+ closeModal: true
+ },
+ {text: "Don’t Remove", size: "medium", closeModal: true}
+ ]);
+
+ MessageBoxService.openModal.next(messageBoxData);
+ }
+ },
+ visible: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
+ enable: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
+ },
+ delete: {
+ method: (node, serviceModelId) => {
+ if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) {
+ this._store.dispatch(deleteActionVnfInstance(node.data.vnfStoreKey, serviceModelId));
+ } else {
+ this._sharedTreeService.shouldShowDeleteInstanceWithChildrenModal(node, serviceModelId, (node, serviceModelId) => {
+ this._sharedTreeService.removeDeleteAllChild(node, serviceModelId, (node, serviceModelId) => {
+ this._store.dispatch(deleteActionVnfInstance(node.data.vnfStoreKey, serviceModelId));
+ });
+ });
+ }
+ },
+ visible: (node) => this._sharedTreeService.shouldShowDelete(node),
+ enable: (node) => this._sharedTreeService.shouldShowDelete(node)
+ },
+ undoDelete: {
+ method: (node, serviceModelId) => {
+ if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) {
+ this._store.dispatch(undoDeleteActionVnfInstance(node.data.vnfStoreKey, serviceModelId));
+ } else {
+ this._sharedTreeService.undoDeleteAllChild(node, serviceModelId, (node, serviceModelId) => {
+ this._store.dispatch(undoDeleteActionVnfInstance(node.data.vnfStoreKey, serviceModelId));
+ });
+ }
+ },
+ visible: (node) => this._sharedTreeService.shouldShowUndoDelete(node),
+ enable: (node, serviceModelId) => this._sharedTreeService.shouldShowUndoDelete(node) && !this._sharedTreeService.isServiceOnDeleteMode(serviceModelId)
+ }
+ }
+ }
+
+ removeVnf(this, node, serviceModelId) {
+ this._store.dispatch(removeInstance(node.data.modelName, serviceModelId, node.data.vnfStoreKey, node));
+ this._store.dispatch(changeInstanceCounter(node.data.modelUniqueId, serviceModelId, -1, node));
+ this._sharedTreeService.selectedVNF = null;
+ }
+
+ /***********************************************************
+ * should update node position inside the tree
+ * @param node - current ITrees node
+ ************************************************************/
+ updatePosition(that, node, instanceId): void {
+ that.store.dispatch(updateVnfPosition(node, instanceId, node.vnfStoreKey));
+ }
+
+ /***********************************************************
+ * return the position of the current node in the tree
+ * @param instance - current ITrees node instance
+ ************************************************************/
+ getNodePosition(instance): number {
+ return !_.isNil(instance) ? instance.position : null;
+ }
+
+ /***********************************************************
+ * When user is click on some nod element
+ * @param node - current ITrees node
+ ************************************************************/
+ onSelectedNode(node: ITreeNode): void {
+ ComponentInfoService.triggerComponentInfoChange.next(new ComponentInfoModel(ComponentInfoType.VNF,[], []));
+ }
+
+ getInfoForVnf(model, instance): ComponentInfoModel {
+ let modelInfoItems: ModelInformationItem[] = [];
+ if (model) {
+ modelInfoItems.push(ModelInformationItem.createInstance("Min Instances", model.min));
+ modelInfoItems.push(ModelInformationItem.createInstance("Max Instances", model.max));
+ }
+ if (instance) {
+ modelInfoItems.push(ModelInformationItem.createInstance("NF Type", instance.nfType));
+ modelInfoItems.push(ModelInformationItem.createInstance("NF Role", instance.nfRole));
+ }
+ return this._componentInfoService.addGeneralInfoItems(modelInfoItems, ComponentInfoType.VNF, model, instance);
+
+ }
+
+
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vnfGrouping/vnfGrouping.model.info.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vnfGrouping/vnfGrouping.model.info.spec.ts
new file mode 100644
index 000000000..532a8fe17
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vnfGrouping/vnfGrouping.model.info.spec.ts
@@ -0,0 +1,291 @@
+
+import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing";
+import {getTestBed, TestBed} from "@angular/core/testing";
+import {MockNgRedux, NgReduxTestingModule} from "@angular-redux/store/testing";
+import {VnfGroupingModelInfo} from "./vnfGrouping.model.info";
+import {DynamicInputsService} from "../../dynamicInputs.service";
+import {SharedTreeService} from "../../shared.tree.service";
+import {VnfGroupPopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service";
+import {DialogService} from "ng2-bootstrap-modal";
+import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service";
+import {VnfGroupModel} from "../../../../../shared/models/vnfGroupModel";
+import {IframeService} from "../../../../../shared/utils/iframe.service";
+import {ActivatedRoute} from "@angular/router";
+import {RouterTestingModule} from "@angular/router/testing";
+import {DrawingBoardModes} from "../../../drawing-board.modes";
+
+describe('VnfGroupingModelInfo Model Info', () => {
+ let injector;
+ let _dialogService : DialogService;
+ let _vnfGroupPopupService : VnfGroupPopupService;
+ let _dynamicInputsService : DynamicInputsService;
+ let _sharedTreeService : SharedTreeService;
+ let _iframeService : IframeService;
+ let vnfGroupModel: VnfGroupingModelInfo;
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+ imports: [HttpClientTestingModule, NgReduxTestingModule, RouterTestingModule],
+ providers: [
+ DialogService,
+ VnfGroupPopupService,
+ DynamicInputsService,
+ SharedTreeService,
+ IframeService,
+ MockNgRedux]
+ });
+ await TestBed.compileComponents();
+ injector = getTestBed();
+ _sharedTreeService = injector.get(SharedTreeService);
+
+ vnfGroupModel = new VnfGroupingModelInfo(_dynamicInputsService, _sharedTreeService, _dialogService, _vnfGroupPopupService, _iframeService, MockNgRedux.getInstance());
+ })().then(done).catch(done.fail));
+
+
+ test('VnfGroupingModelInfo should be defined', () => {
+ expect(vnfGroupModel).toBeDefined();
+ });
+
+ test('VnfGroupingModelInfo should defined extra details', () => {
+ expect(vnfGroupModel.name).toEqual('vnfGroups');
+ expect(vnfGroupModel.type).toEqual('VnfGroup');
+ });
+
+ test('isEcompGeneratedNaming should return true if vnf group has isEcompGeneratedNaming is "true" ', () => {
+ let isEcompGeneratedNaming : boolean = vnfGroupModel.isEcompGeneratedNaming({
+ properties: {
+ ecomp_generated_naming: 'true'
+ }
+ });
+ expect(isEcompGeneratedNaming).toBeTruthy();
+ });
+
+
+ test('getTooltip should return "vnfGrouping"', () => {
+ let tooltip: string = vnfGroupModel.getTooltip();
+ expect(tooltip).toEqual('VnfGroup');
+ });
+
+ test('getType should return "vnfGrouping"', () => {
+ let tooltip: string = vnfGroupModel.getType();
+ expect(tooltip).toEqual('VnfGroup');
+ });
+
+ test('getNextLevelObject should return null', () => {
+ let nextLevel = vnfGroupModel.getNextLevelObject();
+ expect(nextLevel).not.toBeNull();
+ });
+
+
+ test('showNodeIcons should return true if not reachLimit of max', ()=>{
+ let serviceId : string = 'servicedId';
+ let node = {
+ data : {
+ id : 'vnfGroupId',
+ name : 'vnfGroupName'
+ }
+ };
+ jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+ global:{
+ drawingBoardStatus: "EDIT"
+ },
+ service : {
+ serviceHierarchy : {
+ 'servicedId' : {
+ 'vnfGroups' : {
+ 'vnfGroupName' : {
+ 'properties' : {
+ }
+ }
+ }
+ }
+ },
+ serviceInstance : {
+ 'servicedId' : {
+ 'existingVnfGroupCounterMap' : {
+ 'vnfGroupId' : 1
+ },
+ 'vnfGroups' : {
+ 'vnfGroupName' :{
+
+ }
+ }
+ }
+ }
+ }
+ });
+
+ let result = vnfGroupModel.showNodeIcons(<any>node, serviceId);
+ expect(result).toEqual(new AvailableNodeIcons(true , false));
+ });
+
+ test('getNodeCount should return number of nodes', ()=>{
+ let serviceId : string = 'servicedId';
+ jest.spyOn(_sharedTreeService, 'getExistingInstancesWithDeleteMode').mockReturnValue(0);
+ jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+ global : {},
+ service : {
+ serviceHierarchy : {
+ 'servicedId' : {
+ 'vnfGroups' : {
+ 'vnfGroupName' : {
+ 'properties' : {
+ }
+ }
+ }
+ }
+ },
+ serviceInstance : {
+ 'servicedId' : {
+ 'existingVnfGroupCounterMap' : {
+ 'vnfGroupId' : 1
+ },
+ 'vnfGroups' : {
+ 'vnfGroupName' :{
+ 'originalName' : 'vnfGroupName'
+ }
+ }
+ }
+ }
+ }
+ });
+
+ let node = {
+ data : {
+ id : 'vnfGroupId',
+ name : 'vnfGroupName',
+ modelUniqueId: 'vnfGroupId',
+ }
+ };
+ let result = vnfGroupModel.getNodeCount(<any>node , serviceId);
+ expect(result).toEqual(1);
+
+ node.data.modelUniqueId = 'vnfGroupId_notExist';
+ result = vnfGroupModel.getNodeCount(<any>node , serviceId);
+ expect(result).toEqual(0);
+
+ result = vnfGroupModel.getNodeCount(<any>node , serviceId + '_notExist');
+ expect(result).toEqual(0);
+ });
+
+ test('getModel should return VnfGroup model', () => {
+ let model: VnfGroupModel = vnfGroupModel.getModel('ResourceGroup0', <any>{
+ originalName : 'ResourceGroup0'
+ }, getServiceHierarchy());
+ expect(model.type).toEqual('VnfGroup');
+ });
+
+ test('getMenuAction: showAuditInfoVnfGroup', ()=>{
+
+ jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+ global: {
+ "drawingBoardStatus": DrawingBoardModes.RETRY
+ }
+ });
+ jest.spyOn(_sharedTreeService, 'isRetryMode').mockReturnValue(true);
+ let node = {
+ data : {
+ "modelId": "6b528779-44a3-4472-bdff-9cd15ec93450",
+ "action": "Create",
+ "isFailed": true,
+ }
+ };
+ let serviceModelId = "6b528779-44a3-4472-bdff-9cd15ec93450";
+ let result = vnfGroupModel.getMenuAction(<any>node, serviceModelId);
+ spyOn(result['showAuditInfo'], 'method');
+ expect(result['showAuditInfo']).toBeDefined();
+ expect(result['showAuditInfo'].visible(node)).toBeTruthy();
+ expect(result['showAuditInfo'].enable(node)).toBeTruthy();
+ result['showAuditInfo']['method'](node, serviceModelId);
+ expect(result['showAuditInfo']['method']).toHaveBeenCalledWith(node, serviceModelId);
+ });
+
+ function getServiceHierarchy(){
+ return {
+ "service": {
+ "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+ "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "name": "action-data",
+ "version": "1.0",
+ "toscaModelURL": null,
+ "category": "",
+ "serviceType": "",
+ "serviceRole": "",
+ "description": "",
+ "serviceEcompNaming": "false",
+ "instantiationType": "Macro",
+ "inputs": {
+ "2017488_adiodvpe0_ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ }
+ },
+ "vidNotions": {
+ "instantiationUI": "legacy",
+ "modelCategory": "other"
+ }
+ },
+ "vnfGroups": {
+ "ResourceGroup0": {
+ "type": "VnfGroup",
+ "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413",
+ "invariantUuid": "00beb8f9-6d39-452f-816d-c709b9cbb87d",
+ "version": "1",
+ "name": "ResourceGroup0",
+ "modelCustomizationName": "ResourceGroup0",
+ "properties": {
+ "contained_resource_type": "VF",
+ "role": "SERVICE-ACCESS",
+ "function": "DATA",
+ "description": "DDD0",
+ "type": "LOAD-GROUP"
+ },
+ "members": {
+ "vdbe_svc_vprs_proxy 0": {
+ "uuid": "65fadfa8-a0d9-443f-95ad-836cd044e26c",
+ "invariantUuid": "f4baae0c-b3a5-4ca1-a777-afbffe7010bc",
+ "description": "A Proxy for Service vDBE_Svc_vPRS",
+ "name": "vDBE_Svc_vPRS Service Proxy",
+ "version": "1.0",
+ "customizationUuid": "bdb63d23-e132-4ce7-af2c-a493b4cafac9",
+ "inputs": {},
+ "commands": {},
+ "properties": {},
+ "type": "Service Proxy",
+ "sourceModelUuid": "da7827a2-366d-4be6-8c68-a69153c61274",
+ "sourceModelInvariant": "24632e6b-584b-4f45-80d4-fefd75fd9f14",
+ "sourceModelName": "vDBE_Svc_vPRS"
+ },
+ "vdbe_svc_vprs_proxy 1": {
+ "uuid": "111dfa8-a0d9-443f-95ad-836cd044e26c",
+ "invariantUuid": "111ae0c-b3a5-4ca1-a777-afbffe7010bc",
+ "description": "A Proxy for Service vDBE_Svc_vPRS",
+ "name": "111_Svc_vPRS Service Proxy",
+ "version": "1.0",
+ "customizationUuid": "1113d23-e132-4ce7-af2c-a493b4cafac9",
+ "inputs": {},
+ "commands": {},
+ "properties": {},
+ "type": "Service Proxy",
+ "sourceModelUuid": "11127a2-366d-4be6-8c68-a69153c61274",
+ "sourceModelInvariant": "1112e6b-584b-4f45-80d4-fefd75fd9f14",
+ "sourceModelName": "111_Svc_vPRS"
+ }
+ }
+ }
+ },
+ "networks": {},
+ "collectionResource": {},
+ "configurations": {},
+ "fabricConfigurations": {},
+ "serviceProxies": {},
+ "vfModules": {},
+ "volumeGroups": {},
+ "pnfs": {}
+ }
+ }
+});
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vnfGrouping/vnfGrouping.model.info.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vnfGrouping/vnfGrouping.model.info.ts
new file mode 100644
index 000000000..7f2052a0c
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vnfGrouping/vnfGrouping.model.info.ts
@@ -0,0 +1,272 @@
+import {ILevelNodeInfo} from "../basic.model.info";
+import {DynamicInputsService} from "../../dynamicInputs.service";
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service";
+import {VnfGroupModel} from "../../../../../shared/models/vnfGroupModel";
+import {VnfGroupTreeNode} from "../../../../../shared/models/vnfGroupTreeNode";
+import {SharedTreeService} from "../../shared.tree.service";
+import {VnfGroupPopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service";
+import {
+ GenericFormPopupComponent,
+ PopupType
+} from "../../../../../shared/components/genericFormPopup/generic-form-popup.component";
+import {DialogService} from 'ng2-bootstrap-modal';
+import {AppState} from "../../../../../shared/store/reducers";
+import {NgRedux} from "@angular-redux/store";
+import {changeInstanceCounter, removeInstance} from "../../../../../shared/storeUtil/utils/general/general.actions";
+import {IframeService} from "../../../../../shared/utils/iframe.service";
+import {
+ deleteActionVnfGroupInstance,
+ undoDeleteActionVnfGroupInstance
+} from "../../../../../shared/storeUtil/utils/vnfGroup/vnfGroup.actions";
+import {RelatedVnfMemberInfoModel} from "../relatedVnfMember/relatedVnfMember.info.model";
+import {SearchMembersModalComponent} from "../../../../../shared/components/searchMembersModal/search-members-modal.component";
+import * as _ from "lodash";
+import {MessageBoxData} from "../../../../../shared/components/messageBox/messageBox.data";
+import {MessageBoxService} from "../../../../../shared/components/messageBox/messageBox.service";
+
+export class VnfGroupingModelInfo implements ILevelNodeInfo {
+ constructor(private _dynamicInputsService: DynamicInputsService,
+ private _sharedTreeService: SharedTreeService,
+ private _dialogService: DialogService,
+ private _vnfGroupPopupService: VnfGroupPopupService,
+ private _iframeService: IframeService,
+ private _store: NgRedux<AppState>) {
+ }
+
+ name: string = 'vnfGroups';
+ type: string = 'VnfGroup';
+ typeName: string = 'G';
+ childType: string = 'RelatedVnfMemberInfoModel';
+ childName: string = 'vnfs';
+ limitMembers : number;
+
+ /***********************************************************
+ * return if user should provide instance name or not.
+ * get info from parent (VNF)
+ * @param currentModel - current Model object
+ ************************************************************/
+ isEcompGeneratedNaming(currentModel): boolean {
+ const ecompGeneratedNaming = currentModel.properties.ecomp_generated_naming;
+ return ecompGeneratedNaming === "true";
+ }
+
+ /***********************************************************
+ * return model dynamic inputs
+ * @param currentModel - current Model object
+ ************************************************************/
+ updateDynamicInputsDataFromModel = (currentModel): any => {
+ let displayInputs = currentModel.inputs;
+ return _.isEmpty(displayInputs) ? [] : this._dynamicInputsService.getArbitraryInputs(displayInputs);
+ };
+
+ /***********************************************************
+ * return next level object (null because is last level)
+ ************************************************************/
+ getNextLevelObject = (): RelatedVnfMemberInfoModel => {
+ return new RelatedVnfMemberInfoModel(this._sharedTreeService, this._dynamicInputsService, this._store);
+ };
+
+ getTooltip = (): string => 'VnfGroup';
+
+ getType = (): string => 'VnfGroup';
+
+ createInstanceTreeNode(instance: any, model: any, parentModel: any, storeKey: string): any {
+ let node = new VnfGroupTreeNode(instance, model, storeKey);
+ node.missingData = this.hasMissingData(instance, node, model.isEcompGeneratedNaming);
+ node = this._sharedTreeService.addingStatusProperty(node);
+ node.typeName = this.typeName;
+ node.menuActions = this.getMenuAction(<any>node, model.uuid);
+ node.isFailed = _.isNil(instance.isFailed) ? false : instance.isFailed;
+ node.statusMessage = !_.isNil(instance.statusMessage) ? instance.statusMessage: "";
+ node.limitMembers = (!_.isNil(model.properties.quantity)) ? model.properties.quantity : null;
+ return node;
+ }
+
+ getModel(modelId: string, instance: any, serviceHierarchy): any {
+ const originalModelName = instance.originalName ? instance.originalName : modelId;
+ return new VnfGroupModel(serviceHierarchy[this.name][originalModelName]);
+ }
+
+ hasMissingData(instance, dynamicInputs: any, isEcompGeneratedNaming: boolean): boolean {
+ return this._sharedTreeService.hasMissingData(instance, dynamicInputs, isEcompGeneratedNaming, []);
+ }
+
+ onClickAdd(node: ITreeNode, serviceModelId: string): void {
+ this._dialogService.addDialog(GenericFormPopupComponent, {
+ type: PopupType.VNF_GROUP,
+ uuidData: <any>{
+ serviceId: serviceModelId,
+ modelName: node.data.name,
+ vnfGroupStoreKey: null,
+ modelId: node.data.modelVersionId,
+ type: node.data.type,
+ popupService: this._vnfGroupPopupService
+ },
+ node: node,
+ isUpdateMode: false
+ });
+ }
+
+ getNodeCount(node: ITreeNode, serviceModelId: string): number {
+ let map = null;
+ if (!_.isNil(this._store.getState().service.serviceInstance[serviceModelId])) {
+ map = this._store.getState().service.serviceInstance[serviceModelId].existingVnfGroupCounterMap || 0;
+ if (!_.isNil(map)) {
+ let count = map[node.data.modelUniqueId] || 0;
+ count -= this._sharedTreeService.getExistingInstancesWithDeleteMode(node, serviceModelId, 'vnfGroups');
+ return count;
+ }
+ }
+ return 0;
+ }
+
+ /***********************************************************
+ * should show node icon
+ * @param node - current ITrees node
+ * @param serviceModelId - service id
+ ************************************************************/
+ showNodeIcons(node: ITreeNode, serviceModelId: string): AvailableNodeIcons {
+ const showAddIcon = this._sharedTreeService.shouldShowAddIcon();
+ return new AvailableNodeIcons(showAddIcon, false);
+ }
+
+ getMenuAction(node: ITreeNode, serviceModelId: string): { [methodName: string]: { method: Function, visible: Function, enable: Function } } {
+ return {
+ edit: {
+ method: (node, serviceModelId) => {
+ this._iframeService.addClassOpenModal('content');
+ this._dialogService.addDialog(GenericFormPopupComponent, {
+ type: PopupType.VNF_GROUP,
+ uuidData: <any>{
+ serviceId: serviceModelId,
+ modelName: node.data.modelName,
+ vnfGroupStoreKey: node.data.vnfGroupStoreKey,
+ modelId: node.data.modelId,
+ type: node.data.type,
+ popupService: this._vnfGroupPopupService
+ },
+ node: node,
+ isUpdateMode: true
+ });
+ },
+ visible: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
+ enable: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node)
+ },
+ remove: {
+ method: (node, serviceModelId) => {
+ if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) {
+ let storeKey: string = node.data.vnfGroupStoreKey;
+ this._store.dispatch(removeInstance(node.data.vnfGroupStoreKey, serviceModelId, storeKey, node));
+ this._store.dispatch(changeInstanceCounter(node.data.modelUniqueId, serviceModelId, -1, node));
+ this._sharedTreeService.selectedVNF = null;
+ } else {
+ let messageBoxData: MessageBoxData = new MessageBoxData(
+ "Remove VNFGroup", // modal title
+ "You are about to remove this group and all its children from this service. Are you sure you want to remove it?",
+ <any>"warning",
+ <any>"md",
+ [
+ {
+ text: "Remove Group",
+ size: "large",
+ callback: this.removeGroup.bind(this, node, serviceModelId),
+ closeModal: true
+ },
+ {text: "Don’t Remove", size: "medium", closeModal: true}
+ ]);
+
+ MessageBoxService.openModal.next(messageBoxData);
+ }
+ },
+ visible: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
+ enable: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node)
+ },
+ addGroupMember: {
+ method: (node, serviceModelId) => {
+ let serviceHierarchy = this._store.getState().service.serviceHierarchy[serviceModelId];
+ let serviceInstance = this._store.getState().service.serviceInstance[serviceModelId];
+ let vnfGroupModel = new VnfGroupModel(serviceHierarchy['vnfGroups'][node.data.modelName]);
+ this._dialogService.addDialog(SearchMembersModalComponent, {
+ title: 'Add members to group',
+ description: 'Select VNF instances to associate',
+ subscriberId: serviceInstance.globalSubscriberId,
+ serviceType: serviceInstance.subscriptionServiceType,
+ vnfGroupModel: vnfGroupModel,
+ serviceModelId: serviceModelId,
+ node: node.data,
+ searchFields: [{
+ title: 'Service model name',
+ dataTestId: 'sourceModelName',
+ value: (Object.values(vnfGroupModel.members))[0].sourceModelName
+ },
+ {
+ title: 'Service invariant UUID',
+ dataTestId: 'sourceModelInvariant',
+ value: (Object.values(vnfGroupModel.members))[0].sourceModelInvariant
+ }]
+ }
+ );
+ },
+ visible: (node) => !_.isNil(node.data.action) ? node.data.action.split('_').pop() !== 'Delete' : true,
+ enable: (node) => !_.isNil(node.data.action) ? node.data.action.split('_').pop() !== 'Delete' : true
+ },
+ showAuditInfo: {
+ method: (node, serviceModelId) => {
+ let instance = this._store.getState().service.serviceInstance[serviceModelId].vnfGroups[node.data.vnfGroupStoreKey];
+ this._sharedTreeService.openAuditInfoModal(node, serviceModelId, instance, 'VNFGROUP', this);
+ },
+ visible: (node) => this._sharedTreeService.shouldShowAuditInfo(node),
+ enable: (node) => this._sharedTreeService.shouldShowAuditInfo(node)
+ },
+ delete: {
+ method: (node, serviceModelId) => {
+ if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) {
+ this._store.dispatch(deleteActionVnfGroupInstance(node.data.vnfGroupStoreKey, serviceModelId));
+ }else {
+ this._sharedTreeService.shouldShowDeleteInstanceWithChildrenModal(node, serviceModelId, (node, serviceModelId)=>{
+ this._sharedTreeService.removeDeleteAllChild(node, serviceModelId, (node, serviceModelId)=>{
+ this._store.dispatch(deleteActionVnfGroupInstance(node.data.vnfGroupStoreKey, serviceModelId));
+ });
+ });
+ }
+ },
+ visible: (node) => this._sharedTreeService.shouldShowDelete(node),
+ enable: (node) => this._sharedTreeService.shouldShowDelete(node)
+ },
+ undoDelete: {
+ method: (node, serviceModelId) => {
+ if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) {
+ this._store.dispatch(undoDeleteActionVnfGroupInstance(node.data.vnfGroupStoreKey, serviceModelId));
+ } else {
+ this._sharedTreeService.undoDeleteAllChild(node, serviceModelId, (node, serviceModelId) => {
+ this._store.dispatch(undoDeleteActionVnfGroupInstance(node.data.vnfGroupStoreKey, serviceModelId));
+ });
+ }
+ },
+ visible: (node) => this._sharedTreeService.shouldShowUndoDelete(node),
+ enable: (node, serviceModelId) => this._sharedTreeService.shouldShowUndoDelete(node) && !this._sharedTreeService.isServiceOnDeleteMode(serviceModelId)
+ }
+ };
+
+
+ }
+
+ removeGroup(this, node, serviceModelId) {
+ this._store.dispatch(removeInstance(node.data.modelName, serviceModelId, node.data.vnfGroupStoreKey, node));
+ this._store.dispatch(changeInstanceCounter(node.data.modelUniqueId, serviceModelId, -1, node));
+ this._sharedTreeService.selectedVNF = null;
+ }
+
+ updatePosition(that , node, instanceId): void {
+ // TODO
+ }
+
+ getNodePosition(instance): number {
+ return !_.isNil(instance) ? instance.position : null;
+ }
+
+ onSelectedNode(node: ITreeNode): void {
+ }
+
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToInstanceTree/objectToInstanceTree.service.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToInstanceTree/objectToInstanceTree.service.spec.ts
new file mode 100644
index 000000000..fd39ed92a
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToInstanceTree/objectToInstanceTree.service.spec.ts
@@ -0,0 +1,2764 @@
+import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing";
+import {getTestBed, TestBed} from "@angular/core/testing";
+import {MockNgRedux, NgReduxTestingModule} from "@angular-redux/store/testing";
+import {NgRedux} from "@angular-redux/store";
+import {ObjectToInstanceTreeService} from "./objectToInstanceTree.service";
+import {SharedTreeService} from "../shared.tree.service";
+import {DynamicInputsService} from "../dynamicInputs.service";
+import {DefaultDataGeneratorService} from "../../../../shared/services/defaultDataServiceGenerator/default.data.generator.service";
+import {AvailableModelsTreeService} from "../../available-models-tree/available-models-tree.service";
+import {ObjectToTreeService} from "../objectToTree.service";
+import {DrawingBoardModes} from "../../drawing-board.modes";
+import {DialogService} from "ng2-bootstrap-modal";
+import {VnfPopupService} from "../../../../shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service";
+import {BasicControlGenerator} from "../../../../shared/components/genericForm/formControlsServices/basic.control.generator";
+import {AaiService} from "../../../../shared/services/aaiService/aai.service";
+import {FeatureFlagsService} from "../../../../shared/services/featureFlag/feature-flags.service";
+import {VnfControlGenerator} from "../../../../shared/components/genericForm/formControlsServices/vnfGenerator/vnf.control.generator";
+import {GenericFormService} from "../../../../shared/components/genericForm/generic-form.service";
+import {FormBuilder} from "@angular/forms";
+import {LogService} from "../../../../shared/utils/log/log.service";
+import {IframeService} from "../../../../shared/utils/iframe.service";
+import {BasicPopupService} from "../../../../shared/components/genericFormPopup/genericFormServices/basic.popup.service";
+import {NetworkPopupService} from "../../../../shared/components/genericFormPopup/genericFormServices/network/network.popup.service";
+import {NetworkControlGenerator} from "../../../../shared/components/genericForm/formControlsServices/networkGenerator/network.control.generator";
+import {VfModulePopuopService} from "../../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service";
+import {VfModuleControlGenerator} from "../../../../shared/components/genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator";
+import {VnfGroupPopupService} from "../../../../shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service";
+import {VnfGroupControlGenerator} from "../../../../shared/components/genericForm/formControlsServices/vnfGroupGenerator/vnfGroup.control.generator";
+import {DuplicateService} from "../../duplicate/duplicate.service";
+import {SdcUiComponentsModule, SdcUiServices} from "onap-ui-angular";
+import {ErrorMsgService} from "../../../../shared/components/error-msg/error-msg.service";
+import {ComponentInfoService} from "../../component-info/component-info.service";
+
+class MockAppStore<T> {
+ getState() {
+ return {
+ global: {
+ 'drawingBoardStatus': DrawingBoardModes.CREATE,
+ flags : {
+ DRAG_AND_DROP_OPERATION : false
+ }
+ }
+ }
+ }
+}
+
+describe('Model Tree Generator service', () => {
+ let injector;
+ let service: ObjectToInstanceTreeService;
+ let httpMock: HttpTestingController;
+
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+ imports: [HttpClientTestingModule, NgReduxTestingModule, SdcUiComponentsModule],
+ providers: [
+ DuplicateService,
+ AvailableModelsTreeService,
+ ObjectToTreeService,
+ ObjectToInstanceTreeService,
+ DefaultDataGeneratorService,
+ DynamicInputsService,
+ SharedTreeService,
+ VnfPopupService,
+ VnfGroupPopupService,
+ BasicControlGenerator,
+ GenericFormService,
+ FormBuilder,
+ LogService,
+ IframeService,
+ BasicPopupService,
+ NetworkPopupService,
+ NetworkControlGenerator,
+ VfModulePopuopService,
+ VfModuleControlGenerator,
+ VnfGroupControlGenerator,
+ DialogService,
+ FeatureFlagsService,
+ VnfControlGenerator,
+ AaiService,
+ DialogService,
+ ErrorMsgService,
+ ComponentInfoService,
+ SdcUiServices.ModalService,
+ { provide: NgRedux, useClass: MockAppStore },
+ MockNgRedux]
+ });
+ await TestBed.compileComponents();
+
+ injector = getTestBed();
+ service = injector.get(ObjectToInstanceTreeService);
+ httpMock = injector.get(HttpTestingController);
+
+ })().then(done).catch(done.fail));
+
+ test('ObjectToInstanceTreeService should be defined', () => {
+ expect(service).toBeDefined();
+ });
+
+
+ test('should return instance nodes correctly: VNF', () => {
+
+ let convertToNodes = service.convertServiceInstanceToTreeData(getInstanceServiceVNF(), getServiceInstanceHierarchy());
+ delete convertToNodes[0].menuActions;
+ delete convertToNodes[0].errors;
+ delete convertToNodes[0].isFailed;
+ delete convertToNodes[0].trackById;
+ delete convertToNodes[0].updatePoistionFunction;
+ delete convertToNodes[0].position;
+ delete convertToNodes[0].onSelectedNode;
+ delete convertToNodes[1].children[0].isFailed;
+ delete convertToNodes[1].children[0].menuActions;
+ delete convertToNodes[1].children[0].trackById;
+ delete convertToNodes[1].children[0].errors;
+ delete convertToNodes[1].children[0].updatePoistionFunction;
+ delete convertToNodes[1].children[0].position;
+ delete convertToNodes[1].children[0].onSelectedNode;
+ expect(Object.assign({}, convertToNodes[0])).toEqual(Object.assign({}, expectInstanceNodesResultVNF()[0]));
+ expect(Object.assign({}, convertToNodes[1].children[0])).toEqual(Object.assign({}, expectInstanceNodesResultVNF()[1].children[0]));
+ expect(convertToNodes[1].inMaint).toBeFalsy();
+ expect(convertToNodes[0].inMaint).toBeTruthy();
+ expect(service.numberOfFailed).toBe(0);
+ expect(service.numberOfElements).toBe(3);
+ });
+
+ test('should return instance nodes correctly: VNF and Network', () => {
+ let convertToNodes = service.convertServiceInstanceToTreeData(getInstanceServiceVNF_Network(), getServiceHeirarchyVNF_Network());
+
+ delete convertToNodes[1].menuActions;
+ delete convertToNodes[1].trackById;
+ delete convertToNodes[1].errors;
+ delete convertToNodes[1].isFailed;
+ delete convertToNodes[1].updatePoistionFunction;
+ delete convertToNodes[1].position;
+ delete convertToNodes[1].onSelectedNode;
+ expect(Object.assign({}, convertToNodes[0].children[0].dynamicInputs)).toEqual(Object.assign({}, expectInstanceNodesResultVNF_Network()[0]['children'][0].dynamicInputs));
+ expect(Object.assign({}, convertToNodes[0].children[0].missingData)).toEqual(Object.assign({}, expectInstanceNodesResultVNF_Network()[0]['children'][0].missingData));
+ expect(Object.assign({}, convertToNodes[1])).toEqual(Object.assign({}, expectInstanceNodesResultVNF_Network()[1]));
+ expect(service.numberOfFailed).toBe(0);
+ expect(service.numberOfElements).toBe(5);
+ });
+
+ function getServiceInstanceHierarchy() {
+ return {
+ "service": {
+ "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+ "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "name": "action-data",
+ "version": "1.0",
+ "toscaModelURL": null,
+ "category": "",
+ "serviceType": "",
+ "serviceRole": "",
+ "description": "",
+ "serviceEcompNaming": "false",
+ "instantiationType": "Macro",
+ "inputs": {
+ "2017488_adiodvpe0_ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ }
+ },
+ "vidNotions": {
+ "instantiationUI": "legacy",
+ "modelCategory": "other"
+ }
+ },
+ "vnfs": {
+ "2017-388_ADIOD-vPE 1": {
+ "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413",
+ "invariantUuid": "00beb8f9-6d39-452f-816d-c709b9cbb87d",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-388_ADIOD-vPE",
+ "version": "1.0",
+ "customizationUuid": "280dec31-f16d-488b-9668-4aae55d6648a",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {
+ "vnf_config_template_version": {
+ "displayName": "vnf_config_template_version",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_config_template_version"
+ },
+ "bandwidth_units": {
+ "displayName": "bandwidth_units",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth_units"
+ },
+ "bandwidth": {
+ "displayName": "bandwidth",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth"
+ },
+ "AIC_CLLI": {
+ "displayName": "AIC_CLLI",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_AIC_CLLI"
+ },
+ "ASN": {
+ "displayName": "ASN",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_ASN"
+ },
+ "vnf_instance_name": {
+ "displayName": "vnf_instance_name",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_instance_name"
+ }
+ },
+ "properties": {
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=false}",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "false",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VF",
+ "modelCustomizationName": "2017-388_ADIOD-vPE 1",
+ "vfModules": {},
+ "volumeGroups": {},
+ "vfcInstanceGroups": {}
+ },
+ "2017-388_ADIOD-vPE 0": {
+ "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168",
+ "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-388_ADIOD-vPE",
+ "version": "4.0",
+ "customizationUuid": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {
+ "vnf_config_template_version": {
+ "displayName": "vnf_config_template_version",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_config_template_version"
+ },
+ "bandwidth_units": {
+ "displayName": "bandwidth_units",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth_units"
+ },
+ "bandwidth": {
+ "displayName": "bandwidth",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth"
+ },
+ "AIC_CLLI": {
+ "displayName": "AIC_CLLI",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_AIC_CLLI"
+ },
+ "ASN": {
+ "displayName": "ASN",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_ASN"
+ },
+ "vnf_instance_name": {
+ "displayName": "vnf_instance_name",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_instance_name"
+ }
+ },
+ "properties": {
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=false}",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "min_instances": "1",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "false",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VF",
+ "modelCustomizationName": "2017-388_ADIOD-vPE 0",
+ "vfModules": {},
+ "volumeGroups": {},
+ "vfcInstanceGroups": {}
+ },
+ "2017-488_ADIOD-vPE 0": {
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-488_ADIOD-vPE",
+ "version": "5.0",
+ "customizationUuid": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {
+ "vnf_config_template_version": {
+ "displayName": "vnf_config_template_version",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_config_template_version"
+ },
+ "bandwidth_units": {
+ "displayName": "bandwidth_units",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth_units"
+ },
+ "bandwidth": {
+ "displayName": "bandwidth",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth"
+ },
+ "AIC_CLLI": {
+ "displayName": "AIC_CLLI",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_AIC_CLLI"
+ },
+ "ASN": {
+ "displayName": "ASN",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_ASN"
+ },
+ "vnf_instance_name": {
+ "displayName": "vnf_instance_name",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_instance_name"
+ }
+ },
+ "properties": {
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=false}",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "max_instances": "3",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "min_instances": "1",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "false",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VF",
+ "modelCustomizationName": "2017-488_ADIOD-vPE 0",
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "baseModule": false
+ },
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "fromInputName": "adiodvpe0_bandwidth_units",
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "fromInputName": "adiodvpe0_bandwidth",
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "AIC_CLLI"
+ },
+ "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "volumeGroupAllowed": true
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+ "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+ "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+ "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "version": "5",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "ADIOD_base_vPE_BV",
+ "baseModule": true
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV",
+ "baseModule": false
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "baseModule": false
+ },
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "fromInputName": "adiodvpe0_bandwidth_units",
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "fromInputName": "adiodvpe0_bandwidth",
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "AIC_CLLI"
+ },
+ "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ }
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV",
+ "baseModule": false
+ },
+ "inputs": {}
+ }
+ },
+ "vfcInstanceGroups": {}
+ }
+ },
+ "networks": {},
+ "collectionResource": {},
+ "configurations": {},
+ "fabricConfigurations": {},
+ "serviceProxies": {},
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "baseModule": false
+ },
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "fromInputName": "adiodvpe0_bandwidth_units",
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "fromInputName": "adiodvpe0_bandwidth",
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "AIC_CLLI"
+ },
+ "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "volumeGroupAllowed": true
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+ "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+ "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+ "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "version": "5",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "ADIOD_base_vPE_BV",
+ "baseModule": true
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV",
+ "baseModule": false
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "baseModule": false
+ },
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "fromInputName": "adiodvpe0_bandwidth_units",
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "fromInputName": "adiodvpe0_bandwidth",
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "AIC_CLLI"
+ },
+ "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ }
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV",
+ "baseModule": false
+ },
+ "inputs": {}
+ }
+ },
+ "pnfs": {}
+ }
+ }
+
+ function getServiceHeirarchyVNF_Network() {
+ return {
+ "service": {
+ "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+ "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "name": "action-data",
+ "version": "1.0",
+ "toscaModelURL": null,
+ "category": "",
+ "serviceType": "",
+ "serviceRole": "",
+ "description": "",
+ "serviceEcompNaming": "false",
+ "instantiationType": "A-La-Carte",
+ "inputs": {
+ "2017488_adiodvpe0_ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ }
+ }
+ },
+ "vnfs": {
+ "2017-388_ADIOD-vPE 1": {
+ "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413",
+ "invariantUuid": "00beb8f9-6d39-452f-816d-c709b9cbb87d",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-388_ADIOD-vPE",
+ "version": "1.0",
+ "customizationUuid": "280dec31-f16d-488b-9668-4aae55d6648a",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {
+ "vnf_config_template_version": {
+ "displayName": "vnf_config_template_version",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_config_template_version"
+ },
+ "bandwidth_units": {
+ "displayName": "bandwidth_units",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth_units"
+ },
+ "bandwidth": {
+ "displayName": "bandwidth",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth"
+ },
+ "AIC_CLLI": {
+ "displayName": "AIC_CLLI",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_AIC_CLLI"
+ },
+ "ASN": {
+ "displayName": "ASN",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_ASN"
+ },
+ "vnf_instance_name": {
+ "displayName": "vnf_instance_name",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_instance_name"
+ }
+ },
+ "properties": {
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=false}",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "false",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5",
+ "max_instances": 5
+ },
+ "type": "VF",
+ "modelCustomizationName": "2017-388_ADIOD-vPE 1",
+ "vfModules": {},
+ "volumeGroups": {},
+ "vfcInstanceGroups": {}
+ },
+ "2017-388_ADIOD-vPE 0": {
+ "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168",
+ "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-388_ADIOD-vPE",
+ "version": "4.0",
+ "customizationUuid": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {
+ "vnf_config_template_version": {
+ "displayName": "vnf_config_template_version",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_config_template_version"
+ },
+ "bandwidth_units": {
+ "displayName": "bandwidth_units",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth_units"
+ },
+ "bandwidth": {
+ "displayName": "bandwidth",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth"
+ },
+ "AIC_CLLI": {
+ "displayName": "AIC_CLLI",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_AIC_CLLI"
+ },
+ "ASN": {
+ "displayName": "ASN",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_ASN"
+ },
+ "vnf_instance_name": {
+ "displayName": "vnf_instance_name",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_instance_name"
+ }
+ },
+ "properties": {
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=false}",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "min_instances": "1",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "false",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VF",
+ "modelCustomizationName": "2017-388_ADIOD-vPE 0",
+ "vfModules": {},
+ "volumeGroups": {},
+ "vfcInstanceGroups": {}
+ },
+ "2017-488_ADIOD-vPE 0": {
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-488_ADIOD-vPE",
+ "version": "5.0",
+ "customizationUuid": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {
+ "vnf_config_template_version": {
+ "displayName": "vnf_config_template_version",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_config_template_version"
+ },
+ "bandwidth_units": {
+ "displayName": "bandwidth_units",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth_units"
+ },
+ "bandwidth": {
+ "displayName": "bandwidth",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth"
+ },
+ "AIC_CLLI": {
+ "displayName": "AIC_CLLI",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_AIC_CLLI"
+ },
+ "ASN": {
+ "displayName": "ASN",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_ASN"
+ },
+ "vnf_instance_name": {
+ "displayName": "vnf_instance_name",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_instance_name"
+ }
+ },
+ "properties": {
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=false}",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "max_instances": "3",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "min_instances": "1",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "false",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VF",
+ "modelCustomizationName": "2017-488_ADIOD-vPE 0",
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV"
+ },
+ "inputs": {
+ "adiodvpe0_bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "2017488_adiodvpe0_vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ },
+ "2017488_adiodvpe0_vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "2017488_adiodvpe0_AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "AIC_CLLI"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "adiodvpe0_bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ }
+ },
+ "volumeGroupAllowed": true
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+ "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+ "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+ "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "version": "5",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "ADIOD_base_vPE_BV"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV"
+ },
+ "inputs": {
+ "adiodvpe0_bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "2017488_adiodvpe0_vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ },
+ "2017488_adiodvpe0_vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "2017488_adiodvpe0_AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "AIC_CLLI"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "adiodvpe0_bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ }
+ }
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV"
+ },
+ "inputs": {}
+ }
+ },
+ "vfcInstanceGroups": {}
+ }
+ },
+ "networks": {
+ "ExtVL 0": {
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ "invariantUuid": "379f816b-a7aa-422f-be30-17114ff50b7c",
+ "description": "ECOMP generic virtual link (network) base type for all other service-level and global networks",
+ "name": "ExtVL",
+ "version": "37.0",
+ "customizationUuid": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {},
+ "properties": {
+ "network_role": "network role 1, network role 2",
+ "min_instances": 1,
+ "max_instances": 10,
+ "ecomp_generated_naming": "true",
+ "network_assignments": "{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}",
+ "exVL_naming": "{ecomp_generated_naming=true}",
+ "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}",
+ "network_homing": "{ecomp_selected_instance_node_target=false}"
+ },
+ "type": "VL",
+ "modelCustomizationName": "ExtVL 0"
+ }
+ },
+ "collectionResource": {},
+ "configurations": {},
+ "fabricConfigurations": {},
+ "serviceProxies": {},
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV"
+ },
+ "inputs": {
+ "adiodvpe0_bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "2017488_adiodvpe0_vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ },
+ "2017488_adiodvpe0_vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "2017488_adiodvpe0_AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "AIC_CLLI"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "adiodvpe0_bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ }
+ },
+ "volumeGroupAllowed": true
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+ "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+ "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+ "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "version": "5",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "ADIOD_base_vPE_BV"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ }
+ }
+ }
+
+ function getInstanceServiceVNF() {
+ return {
+ "vnfs": {
+ "2017-388_ADIOD-vPE 0": {
+ "action": 'None',
+ "inMaint": true,
+ "orchStatus": "Active",
+ "provStatus": "prov",
+ "rollbackOnFailure": "true",
+ "originalName": "2017-388_ADIOD-vPE 0",
+ "isMissingData": true,
+ "trackById": "u5mtsvzmq6p",
+ "vfModules": {},
+ "vnfStoreKey": "2017-388_ADIOD-vPE 0",
+ "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168",
+ "productFamilyId": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+ "lcpCloudRegionId": null,
+ "tenantId": null,
+ "lineOfBusiness": null,
+ "statusMessage": "Failed Vnf Message",
+ "platformName": null,
+ "modelInfo": {
+ "modelType": "VF",
+ "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "modelVersionId": "6b528779-44a3-4472-bdff-9cd15ec93450",
+ "modelName": "2017-388_ADIOD-vPE",
+ "modelVersion": "4.0",
+ "modelCustomizationName": "2017-388_ADIOD-vPE 0"
+ }
+ },
+ "2017-488_ADIOD-vPE 0": {
+ "action": 'None',
+ "inMaint": false,
+ "rollbackOnFailure": "true",
+ "originalName": "2017-488_ADIOD-vPE 0",
+ "isMissingData": false,
+ "trackById": "1d6dg4fsgbm",
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0zssmp": {
+ "action": 'None',
+ "isMissingData": true,
+ "sdncPreReload": null,
+ "modelInfo": {
+ "modelType": "VFmodule",
+ "modelInvariantId": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+ "modelVersionId": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+ "modelName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "modelVersion": "5",
+ "modelCustomizationId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "modelUniqueId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0"
+ },
+ "instanceParams": [
+ {}
+ ],
+ "trackById": "v2egx1b8i1l",
+ "statusMessage": "Failed vfModel message"
+ }
+ }
+ },
+ "vnfStoreKey": "2017-488_ADIOD-vPE 0",
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "productFamilyId": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+ "lcpCloudRegionId": "JANET25",
+ "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+ "lineOfBusiness": "ONAP",
+ "platformName": "platform",
+ "modelInfo": {
+ "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "modelVersionId": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "modelName": "2017-488_ADIOD-vPE",
+ "modelVersion": "5.0",
+ "modelCustomizationId": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+ "modelUniqueId": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+ "modelCustomizationName": "2017-488_ADIOD-vPE 0",
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09"
+ },
+ "instanceName": "2017488_ADIODvPE",
+ "legacyRegion": "123",
+ "instanceParams": [
+ {}
+ ]
+ }
+ },
+ "instanceParams": [
+ {
+ "2017488_adiodvpe0_ASN": "AV_vPE"
+ }
+ ],
+ "validationCounter": 3,
+ "existingNames": {
+ "yoav": ""
+ },
+ "existingVNFCounterMap": {
+ "afacccf6-397d-45d6-b5ae-94c39734b168": 1,
+ "69e09f68-8b63-4cc9-b9ff-860960b5db09": 1
+ },
+ "existingNetworksCounterMap": {},
+ "networks": {},
+ "instanceName": "yoav",
+ "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "subscriptionServiceType": "TYLER SILVIA",
+ "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+ "productFamilyId": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+ "lcpCloudRegionId": "JANET25",
+ "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+ "aicZoneId": "ABC15",
+ "projectName": "WATKINS",
+ "rollbackOnFailure": "true",
+ "bulkSize": 1,
+ "aicZoneName": "AAITESAN-ABC15",
+ "owningEntityName": "WayneHolland",
+ "testApi": "VNF_API",
+ "isEcompGeneratedNaming": false,
+ "tenantName": "USP-SIP-IC-24335-T-01",
+ "modelInfo": {
+ "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "modelVersionId": "6b528779-44a3-4472-bdff-9cd15ec93450",
+ "modelName": "action-data",
+ "modelVersion": "1.0",
+ "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450"
+ },
+ "isALaCarte": false,
+ "name": "action-data",
+ "version": "1.0",
+ "description": "",
+ "category": "",
+ "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+ "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "serviceType": "",
+ "serviceRole": "",
+ "isMultiStepDesign": false
+ }
+ }
+
+ function getInstanceServiceVNF_Network() {
+ return {
+ "vnfs": {
+ "2017-488_ADIOD-vPE 0": {
+ "action": 'None',
+ "rollbackOnFailure": "true",
+ "originalName": "2017-488_ADIOD-vPE 0",
+ "isMissingData": false,
+ "trackById": "o65b26t2thj",
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1sgoqi": {
+ "action": 'None',
+ "instanceName": "yoav",
+ "volumeGroupName": "123",
+ "modelInfo": {
+ "modelInvariantId": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "modelName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "modelVersion": "6",
+ "modelCustomizationId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "modelUniqueId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5"
+ },
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "isMissingData": false,
+ "instanceParams": [
+ {
+ "adiodvpe0_bandwidth": "10",
+ "2017488_adiodvpe0_vnf_instance_name": "mtnj309me6",
+ "2017488_adiodvpe0_vnf_config_template_version": "17.2",
+ "2017488_adiodvpe0_AIC_CLLI": "ATLMY8GA",
+ "adiodvpe0_bandwidth_units": "Gbps"
+ }
+ ]
+ }
+ }
+ },
+ "vnfStoreKey": "2017-488_ADIOD-vPE 0",
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+ "lcpCloudRegionId": "hvf6",
+ "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054",
+ "lineOfBusiness": "ONAP",
+ "platformName": "platform",
+ "modelInfo": {
+ "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "modelVersionId": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "modelName": "2017-488_ADIOD-vPE",
+ "modelVersion": "5.0",
+ "modelCustomizationId": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+ "modelCustomizationName": "2017-488_ADIOD-vPE 0",
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09"
+ },
+ "instanceName": "2017488_ADIODvPE",
+ "instanceParams": [
+ {}
+ ]
+ }
+ },
+ "instanceParams": [
+ {
+ "2017488_adiodvpe0_ASN": "AV_vPE"
+ }
+ ],
+ "validationCounter": 0,
+ "existingNames": {
+ "123": "",
+ "yoav": "",
+ "instancename": "",
+ "extvl": ""
+ },
+ "existingVNFCounterMap": {
+ "69e09f68-8b63-4cc9-b9ff-860960b5db09": 1
+ },
+ "existingNetworksCounterMap": {
+ "ddc3f20c-08b5-40fd-af72-c6d14636b986": 3
+ },
+ "networks": {
+ "ExtVL 0": {
+ "action": "None",
+ "rollbackOnFailure": "true",
+ "isMissingData": false,
+ "originalName": "ExtVL 0",
+ "networkStoreKey": "ExtVL 0",
+ "trackById": "sf3zth68xjf",
+ "statusMessage": "Network failed message",
+ "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+ "lcpCloudRegionId": "hvf6",
+ "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+ "platformName": "xxx1",
+ "lineOfBusiness": "ONAP",
+ "instanceParams": [
+ {}
+ ],
+ "modelInfo": {
+ "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c",
+ "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ "modelName": "ExtVL",
+ "modelVersion": "37.0",
+ "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+ "modelCustomizationName": "ExtVL 0",
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+ },
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+ },
+ "ExtVL 0:0001": {
+ "action": "None",
+ "rollbackOnFailure": "true",
+ "isMissingData": false,
+ "originalName": "ExtVL 0",
+ "networkStoreKey": "ExtVL 0",
+ "trackById": "2mdxioxca9h",
+ "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+ "lcpCloudRegionId": "hvf6",
+ "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+ "platformName": "xxx1",
+ "lineOfBusiness": "ONAP",
+ "instanceParams": [
+ {}
+ ],
+ "modelInfo": {
+ "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c",
+ "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ "modelName": "ExtVL",
+ "modelVersion": "37.0",
+ "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+ "modelCustomizationName": "ExtVL 0",
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+ },
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+ },
+ "ExtVL 0_1": {
+ "action": "None",
+ "rollbackOnFailure": "true",
+ "isMissingData": false,
+ "originalName": "ExtVL 0",
+ "networkStoreKey": "ExtVL 0_1",
+ "trackById": "z7vd1gmpbs",
+ "instanceName": "ExtVL",
+ "productFamilyId": "17cc1042-527b-11e6-beb8-9e71128cae77",
+ "lcpCloudRegionId": "hvf6",
+ "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+ "platformName": "xxx1",
+ "lineOfBusiness": "zzz1",
+ "instanceParams": [
+ {
+ "vnf_config_template_version": "17.2",
+ "bandwidth_units": "Gbps",
+ "bandwidth": "10",
+ "AIC_CLLI": "ATLMY8GA",
+ "ASN": "AV_vPE",
+ "vnf_instance_name": "yoav"
+ }
+ ],
+ "modelInfo": {
+ "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c",
+ "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ "modelName": "ExtVL",
+ "modelVersion": "37.0",
+ "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+ "modelCustomizationName": "ExtVL 0",
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+ },
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+ }
+ },
+ "instanceName": "InstanceName",
+ "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "subscriptionServiceType": "TYLER SILVIA",
+ "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+ "productFamilyId": "17cc1042-527b-11e6-beb8-9e71128cae77",
+ "lcpCloudRegionId": "JANET25",
+ "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+ "aicZoneId": "JAG1",
+ "projectName": null,
+ "rollbackOnFailure": "true",
+ "bulkSize": 1,
+ "aicZoneName": "YUDFJULP-JAG1",
+ "owningEntityName": "WayneHolland",
+ "testApi": "GR_API",
+ "isEcompGeneratedNaming": false,
+ "tenantName": "USP-SIP-IC-24335-T-01",
+ "modelInfo": {
+ "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "modelVersionId": "6b528779-44a3-4472-bdff-9cd15ec93450",
+ "modelName": "action-data",
+ "modelVersion": "1.0",
+ "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450"
+ },
+ "isALaCarte": false,
+ "name": "action-data",
+ "version": "1.0",
+ "description": "",
+ "category": "",
+ "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+ "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "serviceType": "",
+ "serviceRole": "",
+ "isMultiStepDesign": false
+ }
+ }
+
+ function expectInstanceNodesResultVNF() {
+ return [
+ {
+ "action": 'None',
+ "modelId": "afacccf6-397d-45d6-b5ae-94c39734b168",
+ "modelCustomizationId": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c",
+ "modelUniqueId": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c",
+ "missingData": true,
+ "id": "u5mtsvzmq6p",
+ "orchStatus": 'Active',
+ "provStatus": 'prov',
+ "inMaint": true,
+ "name": "2017-388_ADIOD-vPE 0",
+ "modelName": "2017-388_ADIOD-vPE 0",
+ "type": "VF",
+ "parentType": '',
+ "isEcompGeneratedNaming": false,
+ "networkStoreKey": "2017-388_ADIOD-vPE 0",
+ "vnfStoreKey": "2017-388_ADIOD-vPE 0",
+ "typeName": "VNF",
+ "children": [],
+ "statusMessage": "Failed Vnf Message",
+ "statusProperties": [Object({
+ key: 'Prov Status:',
+ value: 'prov',
+ testId: 'provStatus'
+ }), Object({ key: 'Orch Status:', value: 'Active', testId: 'orchStatus' }), Object({
+ key: 'In-maintenance',
+ value: '',
+ testId: 'inMaint'
+ })]
+ },
+ {
+ "action": 'None',
+ "modelId": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "missingData": false,
+ "id": "1d6dg4fsgbm",
+ "inMaint": false,
+ "parentType": '',
+ "name": "2017-488_ADIOD-vPE 0",
+ "modelName": "2017-488_ADIOD-vPE 0",
+ "type": "VF",
+ "isEcompGeneratedNaming": false,
+ "networkStoreKey": "2017-488_ADIOD-vPE 0",
+ "vnfStoreKey": "2017-488_ADIOD-vPE 0",
+ "typeName": "VNF",
+ "statusProperties": [Object({
+ key: 'Prov Status:',
+ value: undefined,
+ testId: 'provStatus'
+ }), Object({ key: 'Orch Status:', value: undefined, testId: 'orchStatus' })],
+ "children": [{
+ "parentType": 'VNF',
+ "action": 'None',
+ "modelId": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+ "modelCustomizationId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "modelUniqueId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "missingData": true,
+ "id": "v2egx1b8i1l",
+ "statusMessage": "Failed vfModel message",
+ "name": "&lt;Automatically Assigned&gt;",
+ "modelName": "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "type": "VFmodule",
+ "isEcompGeneratedNaming": false,
+ "dynamicInputs": [],
+ "dynamicModelName": "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0zssmp",
+ "typeName": "M",
+ "statusProperties": [Object({
+ key: 'Prov Status:',
+ value: undefined,
+ testId: 'provStatus'
+ }), Object({ key: 'Orch Status:', value: undefined, testId: 'orchStatus' })],
+ }]
+ }]
+ }
+
+ function expectInstanceNodesResultVNF_Network() {
+ return [
+ {
+ "parentType": '',
+ "action": 'None',
+ "modelId": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "missingData": false,
+ "id": "o65b26t2thj",
+ "name": "2017488_ADIODvPE",
+ "modelName": "2017-488_ADIOD-vPE 0",
+ "type": "VF",
+ "isEcompGeneratedNaming": false,
+ "vnfStoreKey": "2017-488_ADIOD-vPE 0",
+ "typeName": "VNF",
+ "statusProperties": [Object({
+ key: 'Prov Status:',
+ value: undefined,
+ testId: 'provStatus'
+ }), Object({ key: 'Orch Status:', value: undefined, testId: 'orchStatus' })],
+ "children": [
+ {
+ "action": 'None',
+ "modelId": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "missingData": false,
+ "name": "yoav",
+ "modelName": "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "type": "VFmodule",
+ "isEcompGeneratedNaming": false,
+ "typeName": "M",
+ "dynamicInputs": [
+ {
+ "id": "adiodvpe0_bandwidth",
+ "type": "string",
+ "name": "adiodvpe0_bandwidth",
+ "value": "10",
+ "isRequired": true,
+ "description": "Requested VPE bandwidth"
+ },
+ {
+ "id": "2017488_adiodvpe0_vnf_instance_name",
+ "type": "string",
+ "name": "2017488_adiodvpe0_vnf_instance_name",
+ "value": "mtnj309me6",
+ "isRequired": true,
+ "description": "The hostname assigned to the vpe."
+ },
+ {
+ "id": "2017488_adiodvpe0_vnf_config_template_version",
+ "type": "string",
+ "name": "2017488_adiodvpe0_vnf_config_template_version",
+ "value": "17.2",
+ "isRequired": true,
+ "description": "VPE Software Version"
+ },
+ {
+ "id": "2017488_adiodvpe0_AIC_CLLI",
+ "type": "string",
+ "name": "2017488_adiodvpe0_AIC_CLLI",
+ "value": "ATLMY8GA",
+ "isRequired": true,
+ "description": "AIC Site CLLI"
+ },
+ {
+ "id": "adiodvpe0_bandwidth_units",
+ "type": "string",
+ "name": "adiodvpe0_bandwidth_units",
+ "value": "Gbps",
+ "isRequired": true,
+ "description": "Units of bandwidth"
+ }
+ ],
+ "dynamicModelName": "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1sgoqi"
+ }
+ ]
+ },
+ {
+ "parentType": '',
+ "action": 'None',
+ "modelId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+ "modelUniqueId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+ "missingData": false,
+ "id": "sf3zth68xjf",
+ "name": "&lt;Automatically Assigned&gt;",
+ "statusMessage": "Network failed message",
+ "modelName": "ExtVL 0",
+ "type": "VL",
+ "isEcompGeneratedNaming": true,
+ "networkStoreKey": "ExtVL 0",
+ "typeName": "N",
+ "statusProperties": [Object({
+ key: 'Prov Status:',
+ value: undefined,
+ testId: 'provStatus'
+ }), Object({ key: 'Orch Status:', value: undefined, testId: 'orchStatus' })],
+ },
+ {
+ "parentType": '',
+ "action": 'None',
+ "originalAction": 'None',
+ "modelId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ "missingData": false,
+ "id": "2mdxioxca9h",
+ "name": "&lt;Automatically Assigned&gt;",
+ "modelName": "ExtVL 0",
+ "type": "VL",
+ "isEcompGeneratedNaming": true,
+ "networkStoreKey": "ExtVL 0:0001",
+ "typeName": "M"
+ },
+ {
+ "parentType": '',
+ "action": 'None',
+ "originalAction": 'None',
+ "modelId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ "missingData": false,
+ "id": "z7vd1gmpbs",
+ "name": "ExtVL",
+ "modelName": "ExtVL 0",
+ "type": "VL",
+ "isEcompGeneratedNaming": true,
+ "networkStoreKey": "ExtVL 0_1",
+ "typeName": "M"
+ }
+ ];
+ }
+});
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToInstanceTree/objectToInstanceTree.service.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToInstanceTree/objectToInstanceTree.service.ts
new file mode 100644
index 000000000..1fc439ea3
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToInstanceTree/objectToInstanceTree.service.ts
@@ -0,0 +1,163 @@
+import {Injectable} from "@angular/core";
+import {ILevelNodeInfo} from "../models/basic.model.info";
+import {ObjectToTreeService} from "../objectToTree.service";
+import {DefaultDataGeneratorService} from "../../../../shared/services/defaultDataServiceGenerator/default.data.generator.service";
+import * as _ from "lodash";
+import {ServiceInstanceActions} from "../../../../shared/models/serviceInstanceActions";
+import {ErrorMsgService} from "../../../../shared/components/error-msg/error-msg.service";
+import {FeatureFlagsService, Features} from "../../../../shared/services/featureFlag/feature-flags.service";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../../../shared/store/reducers";
+
+@Injectable()
+export class ObjectToInstanceTreeService {
+ constructor(private _objectToTreeService: ObjectToTreeService, private _errorMsgService: ErrorMsgService, private store: NgRedux<AppState>) {
+ this.numberOfFailed = 0;
+ this.numberOfElements = 0;
+
+ }
+
+ /** store number of failed ******** ONLY IN RETRY MODE ******** **/
+ numberOfFailed: number = 0;
+
+ /** store number of existing elements **/
+ numberOfElements: number = 0;
+
+ /*****************************************************************
+ * return array of first level node with there child's
+ * @param serviceInstance - The service instance object from store
+ * @param serviceHierarchy - The service Hierarchy store
+ ****************************************************************/
+ convertServiceInstanceToTreeData(serviceInstance, serviceHierarchy): any[] {
+ this._errorMsgService.triggerClearError.next();
+ let nodes = [];
+ this.numberOfFailed = 0;
+ this.numberOfElements = 0;
+ let _this = this;
+ const firstLevelOptions: ILevelNodeInfo[] = _this._objectToTreeService.getFirstLevelOptions();
+ for (let option of firstLevelOptions) {
+ _.forOwn(serviceInstance[option.name], function (instance, modelName) {
+ nodes.push(_this.getNodeInstance(modelName, null, instance, serviceHierarchy, option));
+ });
+ }
+ return this.sortElementsByPosition(nodes);
+ }
+
+ /*****************************************************************
+ * should increase number of failed
+ * @param node - the current node
+ ****************************************************************/
+ increaseNumberOfFailed(node) {
+ if (node.isFailed) {
+ this.numberOfFailed++;
+ node['errors'] = !_.isNil(node['errors']) ? node['errors'] : {};
+ node['errors']["isFailed"] = true;
+ this._errorMsgService.triggerShowError.next(this._errorMsgService.getRetryErrorObject(this.numberOfFailed));
+ }
+ }
+
+ /*****************************************************************
+ * should increase number of existing elements
+ * @param node - the current node
+ ****************************************************************/
+ increaseNumberOfExcitingElements() {
+ this.numberOfElements++;
+ }
+
+ /*****************************************************************
+ * return array of first level node with there child's
+ * @param modelName
+ * @param parentModel
+ * @param instance
+ * @param serviceHierarchy - The service Hierarchy store
+ * @param option
+ * @param parentType
+ ****************************************************************/
+ getNodeInstance(modelName: string, parentModel: any, instance: any, serviceHierarchy, option: ILevelNodeInfo, parentType ?: string) {
+ const model = option.getModel(modelName, instance, serviceHierarchy);
+
+ let optionalNodes = option.createInstanceTreeNode(instance, model, parentModel, modelName);
+ this.increaseNumberOfFailed(optionalNodes);
+ this.increaseNumberOfExcitingElements();
+ let nodes: any[] = _.isArray(optionalNodes) ? optionalNodes : [optionalNodes];
+ for (let node of nodes) {
+ node = this.addingExtraDataToNode(node, modelName, parentModel, instance, serviceHierarchy, option, parentType);
+ let children = this.addNextInstanceTreeNode(instance, model, option, node, serviceHierarchy);
+ if (!_.isNil(children) && children.length > 0) {
+ node.children = this.sortElementsByPosition(children);
+ }
+ this.updateScalingPolicy(node);
+ }
+ return nodes.length === 1 ? nodes[0] : nodes;
+ }
+
+ addingExtraDataToNode(node, modelName: string, parentModel: any, instance: any, serviceHierarchy, option: ILevelNodeInfo, parentType ?: string) {
+ node.trackById = _.isNil(node.trackById) ? DefaultDataGeneratorService.createRandomTrackById() : node['trackById'];
+ node.parentType = !_.isNil(parentType) ? parentType : "";
+ node.updatePoistionFunction = option.updatePosition;
+ node.position = option.getNodePosition(instance, node.dynamicModelName);
+ node.onSelectedNode = option.onSelectedNode;
+ return node;
+ }
+
+ sortElementsByPosition(nodes: any[]): any[] {
+ if (!FeatureFlagsService.getFlagState(Features.DRAG_AND_DROP_OPERATION, this.store)) return nodes;
+ return nodes.sort((nodeA, nodeB) => {
+ return nodeA.position - nodeB.position;
+ });
+ }
+
+ /*****************************************************************
+ * return next level node with there child's
+ * @param parentInstance
+ * @param parentModel
+ * @param levelNodeInfo
+ * @param parentNode
+ * @param serviceHierarchy - The service Hierarchy store
+ ****************************************************************/
+ addNextInstanceTreeNode(parentInstance, parentModel, levelNodeInfo: ILevelNodeInfo, parentNode, serviceHierarchy): any[] {
+ if (!_.isNil(levelNodeInfo.childName)) {
+ parentNode.children = [];
+ if (!_.isNil(parentInstance[levelNodeInfo.childName])) {
+ let parentType = levelNodeInfo.type;
+ let nextLevelNodeInfo = levelNodeInfo.getNextLevelObject.apply(this);
+ Object.keys(parentInstance[levelNodeInfo.childName]).map((modelName) => {
+ let nextLevelInstance = parentInstance[levelNodeInfo.childName][modelName];
+ let nodes: any[] | any = this.getNodeInstance(modelName, parentModel, nextLevelInstance, serviceHierarchy, nextLevelNodeInfo, parentType);
+ if (_.isArray(nodes)) {
+ parentNode.children = parentNode.children.concat(nodes);
+ } else {
+ parentNode.children.push(nodes);
+ }
+ });
+ return this.sortElementsByPosition(parentNode.children);
+ }
+ }
+ return parentNode.children;
+ }
+
+
+ /************************************************************************************
+ * update instance scaling policy according to instance limit and existing children
+ * @param node
+ *********************************************************************************/
+ updateScalingPolicy(node): void {
+ node['errors'] = !_.isNil(node['errors']) ? node['errors'] : {};
+ if (!_.isNil(node['limitMembers']) && !_.isNil(node.children)) {
+ let effectiveChildren = (node.children).filter(child => [
+ ServiceInstanceActions.Create,
+ ServiceInstanceActions.None,
+ ServiceInstanceActions.Update
+ ].includes(child.action));
+
+
+ if (effectiveChildren.length > node.limitMembers) {
+ node['errors']["scalingError"] = true;
+ this._errorMsgService.triggerShowError.next(this._errorMsgService.getScalingErrorObject());
+ } else {
+ delete node['errors']["scalingError"];
+ }
+
+ }
+ }
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToModelTree/objectToModelTree.service.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToModelTree/objectToModelTree.service.spec.ts
new file mode 100644
index 000000000..41ad23f07
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToModelTree/objectToModelTree.service.spec.ts
@@ -0,0 +1,727 @@
+import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing";
+import {getTestBed, TestBed} from "@angular/core/testing";
+import {MockNgRedux, NgReduxTestingModule} from "@angular-redux/store/testing";
+import {NgRedux} from "@angular-redux/store";
+import {ObjectToTreeService} from "../objectToTree.service";
+import {ObjectToModelTreeService} from "./objectToModelTree.service";
+import {DefaultDataGeneratorService} from "../../../../shared/services/defaultDataServiceGenerator/default.data.generator.service";
+import {DynamicInputsService} from "../dynamicInputs.service";
+import {SharedTreeService} from "../shared.tree.service";
+import {DrawingBoardModes} from "../../drawing-board.modes";
+import {AvailableModelsTreeService} from "../../available-models-tree/available-models-tree.service";
+import {DialogService} from "ng2-bootstrap-modal";
+import {VnfPopupService} from "../../../../shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service";
+import {BasicControlGenerator} from "../../../../shared/components/genericForm/formControlsServices/basic.control.generator";
+import {GenericFormService} from "../../../../shared/components/genericForm/generic-form.service";
+import {FormBuilder} from "@angular/forms";
+import {LogService} from "../../../../shared/utils/log/log.service";
+import {IframeService} from "../../../../shared/utils/iframe.service";
+import {BasicPopupService} from "../../../../shared/components/genericFormPopup/genericFormServices/basic.popup.service";
+import {NetworkPopupService} from "../../../../shared/components/genericFormPopup/genericFormServices/network/network.popup.service";
+import {NetworkControlGenerator} from "../../../../shared/components/genericForm/formControlsServices/networkGenerator/network.control.generator";
+import {VfModulePopuopService} from "../../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service";
+import {VfModuleControlGenerator} from "../../../../shared/components/genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator";
+import {FeatureFlagsService} from "../../../../shared/services/featureFlag/feature-flags.service";
+import {VnfControlGenerator} from "../../../../shared/components/genericForm/formControlsServices/vnfGenerator/vnf.control.generator";
+import {AaiService} from "../../../../shared/services/aaiService/aai.service";
+import {VnfGroupPopupService} from "../../../../shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service";
+import {VnfGroupControlGenerator} from "../../../../shared/components/genericForm/formControlsServices/vnfGroupGenerator/vnfGroup.control.generator";
+import {DuplicateService} from "../../duplicate/duplicate.service";
+import {SdcUiComponentsModule} from "onap-ui-angular";
+import {ComponentInfoService} from "../../component-info/component-info.service";
+
+class MockAppStore<T> {
+ getState() {
+ return {
+ global: {
+ 'drawingBoardStatus': DrawingBoardModes.CREATE
+ }
+ }
+ }
+}
+
+describe('Model Tree Generator service', () => {
+ let injector;
+ let service: ObjectToModelTreeService;
+ let httpMock: HttpTestingController;
+
+ beforeEach(() => {
+
+ TestBed.configureTestingModule({
+ imports: [HttpClientTestingModule, NgReduxTestingModule, SdcUiComponentsModule],
+ providers: [
+ AvailableModelsTreeService,
+ ObjectToTreeService,
+ ObjectToModelTreeService,
+ DefaultDataGeneratorService,
+ DynamicInputsService,
+ SharedTreeService,
+ DialogService,
+ VnfPopupService,
+ VnfGroupPopupService,
+ BasicControlGenerator,
+ GenericFormService,
+ FormBuilder,
+ LogService,
+ IframeService,
+ BasicPopupService,
+ NetworkPopupService,
+ NetworkControlGenerator,
+ VfModulePopuopService,
+ VfModuleControlGenerator,
+ VnfGroupControlGenerator,
+ DialogService,
+ FeatureFlagsService,
+ VnfControlGenerator,
+ AaiService,
+ DialogService,
+ DuplicateService,
+ ComponentInfoService,
+ {provide: NgRedux, useClass: MockAppStore},
+ MockNgRedux]
+ }).compileComponents();
+
+ injector = getTestBed();
+ service = injector.get(ObjectToModelTreeService);
+ httpMock = injector.get(HttpTestingController);
+ });
+
+ test('ObjectToModelTreeService should be defined', () => {
+ expect(service).toBeDefined();
+ });
+
+ test('should return nodes correctly: VNF', () => {
+
+ let convertToNodes = service.convertServiceHierarchyModelToTreeNodes(getServiceHeirarchyVNF());
+ convertToNodes.map((item) => {
+ delete item['onAddClick'];
+ delete item['getNodeCount'];
+ delete item['showNodeIcons'];
+ delete item['menuActions'];
+ delete item['getMenuAction'];
+ delete item['trackById'];
+
+ if (item.children) {
+ item.children.map((child) => {
+ delete child['onAddClick'];
+ delete child['getNodeCount'];
+ delete child['showNodeIcons'];
+ delete child['menuActions'];
+ delete child['getMenuAction'];
+ delete child['trackById'];
+ });
+ }
+ });
+
+ expect(Object.assign({}, convertToNodes)).toEqual(Object.assign({}, expectNodesResultVNF()));
+ });
+
+
+ function expectNodesResultVNF() {
+ return [{
+ "id": "280dec31-f16d-488b-9668-4aae55d6648a",
+ "modelVersionId": "0903e1c0-8e03-4936-b5c2-260653b96413",
+ "name": "2017-388_ADIOD-vPE 1",
+ "tooltip": "VF",
+ "type": "VF",
+ "count": 0,
+ "max": 1,
+ "children": [],
+ "disabled": false,
+ "modelCustomizationId": "280dec31-f16d-488b-9668-4aae55d6648a",
+ "modelUniqueId": "280dec31-f16d-488b-9668-4aae55d6648a",
+ "dynamicInputs": [],
+ "isEcompGeneratedNaming": true,
+ "typeName": 'VNF'
+ }, {
+ "id": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c",
+ "modelVersionId": "afacccf6-397d-45d6-b5ae-94c39734b168",
+ "modelCustomizationId": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c",
+ "modelUniqueId": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c",
+ "name": "2017-388_ADIOD-vPE 0",
+ "tooltip": "VF",
+ "type": "VF",
+ "count": 0,
+ "max": 1,
+ "children": [],
+ "disabled": false,
+ "dynamicInputs": [],
+ "isEcompGeneratedNaming": true,
+ "typeName": 'VNF'
+ }, {
+ "id": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+ "modelVersionId": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "modelCustomizationId": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+ "modelUniqueId": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+ "name": "2017-488_ADIOD-vPE 0",
+ "tooltip": "VF",
+ "type": "VF",
+ "count": 0,
+ "max": 1,
+ "children": [{
+ "id": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "modelCustomizationId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "modelUniqueId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "name": "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "tooltip": "VFmodule",
+ "type": "VFmodule",
+ "count": 0,
+ "max": 1,
+ "children": [],
+ "disabled": false,
+ "dynamicInputs": [],
+ "isEcompGeneratedNaming": true,
+ "typeName": 'M'
+ }, {
+ "id": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "modelVersionId": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+ "modelCustomizationId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "modelUniqueId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "name": "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "tooltip": "VFmodule",
+ "type": "VFmodule",
+ "count": 0,
+ "max": 1,
+ "children": [],
+ "disabled": false,
+ "dynamicInputs": [],
+ "isEcompGeneratedNaming": true,
+ "typeName": 'M'
+ }, {
+ "id": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "modelVersionId": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "modelCustomizationId": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "modelUniqueId": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "name": "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "tooltip": "VFmodule",
+ "type": "VFmodule",
+ "count": 0,
+ "max": 1,
+ "children": [],
+ "disabled": false,
+ "dynamicInputs": [],
+ "isEcompGeneratedNaming": true,
+ "typeName": 'M'
+ }],
+ "disabled": false,
+ "dynamicInputs": [],
+ "isEcompGeneratedNaming": true,
+ "typeName": 'VNF'
+ }]
+
+ }
+
+ function getServiceHeirarchyVNF() {
+ return {
+ "service": {
+ "uuid": "1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd",
+ "invariantUuid": "cdb90b57-ed78-4d44-a5b4-7f43a02ec632",
+ "name": "action-data",
+ "version": "1.0",
+ "toscaModelURL": null,
+ "category": "Network L1-3",
+ "serviceType": "pnf",
+ "serviceRole": "Testing",
+ "description": "ADIOD vMX vPE based on Juniper 17.2 release. Updated with updated VF for v8.0 of VLM",
+ "serviceEcompNaming": "false",
+ "instantiationType": "Macro",
+ "inputs": {},
+ "vidNotions": {"instantiationUI": "legacy", "modelCategory": "other"}
+ },
+ "vnfs": {
+ "2017-388_ADIOD-vPE 1": {
+ "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413",
+ "invariantUuid": "00beb8f9-6d39-452f-816d-c709b9cbb87d",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-388_ADIOD-vPE",
+ "version": "1.0",
+ "customizationUuid": "280dec31-f16d-488b-9668-4aae55d6648a",
+ "inputs": {},
+ "commands": {},
+ "properties": {
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=true}",
+ "multi_stage_design": "true",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "true",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:2017488_adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:2017488_adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VF",
+ "modelCustomizationName": "2017-388_ADIOD-vPE 1",
+ "vfModules": {},
+ "volumeGroups": {},
+ "vfcInstanceGroups": {}
+ },
+ "2017-388_ADIOD-vPE 0": {
+ "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168",
+ "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-388_ADIOD-vPE",
+ "version": "4.0",
+ "customizationUuid": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c",
+ "inputs": {},
+ "commands": {},
+ "properties": {
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=true}",
+ "multi_stage_design": "true",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "true",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:2017488_adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:2017488_adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VF",
+ "modelCustomizationName": "2017-388_ADIOD-vPE 0",
+ "vfModules": {},
+ "volumeGroups": {},
+ "vfcInstanceGroups": {}
+ },
+ "2017-488_ADIOD-vPE 0": {
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-488_ADIOD-vPE",
+ "version": "5.0",
+ "customizationUuid": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+ "inputs": {},
+ "commands": {},
+ "properties": {
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=true}",
+ "multi_stage_design": "true",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "true",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:2017488_adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:2017488_adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VF",
+ "modelCustomizationName": "2017-488_ADIOD-vPE 0",
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "baseModule": false
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+ "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+ "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+ "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "version": "5",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "ADIOD_base_vPE_BV",
+ "baseModule": true
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV",
+ "baseModule": false
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "baseModule": false
+ },
+ "inputs": {}
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV",
+ "baseModule": false
+ },
+ "inputs": {}
+ }
+ },
+ "vfcInstanceGroups": {}
+ }
+ },
+ "networks": {},
+ "collectionResource": {},
+ "configurations": {},
+ "fabricConfigurations": {},
+ "serviceProxies": {},
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "baseModule": false
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+ "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+ "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+ "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "version": "5",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "ADIOD_base_vPE_BV",
+ "baseModule": true
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV",
+ "baseModule": false
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "baseModule": false
+ },
+ "inputs": {}
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV",
+ "baseModule": false
+ },
+ "inputs": {}
+ }
+ },
+ "pnfs": {}
+ }
+ }
+});
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToModelTree/objectToModelTree.service.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToModelTree/objectToModelTree.service.ts
new file mode 100644
index 000000000..e941faad3
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToModelTree/objectToModelTree.service.ts
@@ -0,0 +1,98 @@
+import {Injectable} from "@angular/core";
+import {ILevelNodeInfo} from "../models/basic.model.info";
+import {ObjectToTreeService} from "../objectToTree.service";
+import * as _ from "lodash";
+
+@Injectable()
+export class ObjectToModelTreeService {
+ constructor(private _objectToTreeService: ObjectToTreeService) {
+ }
+
+ /***********************************************************
+ * return array of first level node with there child's
+ * @param serviceModel - The serviceHierarchy object
+ ************************************************************/
+ convertServiceHierarchyModelToTreeNodes(serviceModel): any[] {
+ let _this = this;
+ const firstLevelOptions: ILevelNodeInfo[] = _this._objectToTreeService.getFirstLevelOptions();
+ let nodes = [];
+ for (let option of firstLevelOptions) {
+ _.forOwn(serviceModel[option.name], function (item, key) {
+ nodes.push(_this.addFirstLevelModel(serviceModel.service.uuid, key, item, item.type, serviceModel, option));
+ });
+ }
+ console.log('nodes', nodes);
+ return nodes;
+ }
+
+
+ /***********************************************************
+ * return node with all his child's
+ * @param name - Model name
+ * @param serviceId - service id
+ * @param currentModel - current Model object
+ * @param type - current Model type
+ * @param parentModel - current parent Model object
+ * @param levelNodeInfo - current level node information
+ ************************************************************/
+ private addFirstLevelModel(serviceId: string, name, currentModel, type, parentModel, levelNodeInfo: ILevelNodeInfo) {
+ let node = ObjectToModelTreeService.convertItemToTreeNode(serviceId, name, currentModel, type, null, levelNodeInfo);
+ node.children = this.addNextLevelNodes(serviceId, currentModel, parentModel, levelNodeInfo, node);
+ return node;
+ }
+
+ /***********************************************************
+ * return all the child's of node (is child exist)
+ * else return empty array.
+ * @param currentModel - current Model object
+ * @param parentModel - current parent Model object
+ * @param levelNodeInfo - current level node information
+ * @param parentNode - parent node.
+ ************************************************************/
+ addNextLevelNodes(serviceId: string, currentModel, parentModel, levelNodeInfo: ILevelNodeInfo, parentNode): any[] {
+ if (!_.isNil(levelNodeInfo.childName)) {
+ if (!_.isNil(currentModel[levelNodeInfo.childName])) {
+ let nextLevelNodeInfo = levelNodeInfo.getNextLevelObject.apply(this);
+ parentNode.children = Object.keys(currentModel[levelNodeInfo.childName]).map((key) =>
+ ObjectToModelTreeService.convertItemToTreeNode(serviceId, key, currentModel[levelNodeInfo.childName][key], levelNodeInfo.childName, currentModel, nextLevelNodeInfo));
+
+ }
+ }
+ return parentNode.children;
+ }
+
+
+ /***********************************************************
+ * return node with his properties
+ * @param serviceId
+ * @param name - model name
+ * @param currentModel - current model from serviceHierarchy
+ * @param valueType - model type
+ * @param parentModel - current parent model
+ * @param levelNodeInfo - current levelNodeInfo object
+ ************************************************************/
+ static convertItemToTreeNode(serviceId: string, name: string, currentModel: any, valueType: string, parentModel: string, levelNodeInfo: ILevelNodeInfo) {
+ let node = {
+ id: currentModel.customizationUuid || currentModel.uuid,
+ modelCustomizationId : currentModel.customizationUuid,
+ modelVersionId: currentModel.uuid,
+ modelUniqueId : currentModel.customizationUuid || currentModel.uuid,
+ name: name,
+ tooltip: levelNodeInfo.getTooltip(),
+ type: levelNodeInfo.getType(),
+ count: currentModel.count || 0,
+ max: currentModel.max || 1,
+ children: [],
+ disabled: false,
+ dynamicInputs: levelNodeInfo.updateDynamicInputsDataFromModel(currentModel),
+ isEcompGeneratedNaming: levelNodeInfo.isEcompGeneratedNaming(currentModel, parentModel)
+ };
+
+ node['onAddClick'] = (node, serviceId) => levelNodeInfo.onClickAdd(node, serviceId);
+ node['getNodeCount'] = (node, serviceId) => levelNodeInfo.getNodeCount(node, serviceId);
+ node['getMenuAction'] = (node, serviceId) => levelNodeInfo.getMenuAction(node, serviceId);
+ node['showNodeIcons'] = (node, serviceId) => levelNodeInfo.showNodeIcons(node, serviceId);
+ node['typeName'] = levelNodeInfo['typeName'];
+ return node;
+ }
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToTree.service.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToTree.service.ts
new file mode 100644
index 000000000..338964515
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToTree.service.ts
@@ -0,0 +1,51 @@
+import {Injectable} from "@angular/core";
+import {ILevelNodeInfo} from "./models/basic.model.info";
+import {VnfModelInfo} from "./models/vnf/vnf.model.info";
+import {NetworkModelInfo} from "./models/network/network.model.info";
+import {ConfigurationModelInfo} from "./models/configuration/configuration.model.info";
+import {DefaultDataGeneratorService} from "../../../shared/services/defaultDataServiceGenerator/default.data.generator.service";
+import {DynamicInputsService} from "./dynamicInputs.service";
+import {SharedTreeService} from "./shared.tree.service";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../../shared/store/reducers";
+import {DialogService} from "ng2-bootstrap-modal";
+import {VnfPopupService} from "../../../shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service";
+import {NetworkPopupService} from "../../../shared/components/genericFormPopup/genericFormServices/network/network.popup.service";
+import {VfModulePopuopService} from "../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service";
+import {VnfGroupingModelInfo} from "./models/vnfGrouping/vnfGrouping.model.info";
+import {VnfGroupPopupService} from "../../../shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service";
+import {DuplicateService} from "../duplicate/duplicate.service";
+import {SdcUiServices} from "onap-ui-angular";
+import {IframeService} from "../../../shared/utils/iframe.service";
+import {ComponentInfoService} from "../component-info/component-info.service";
+
+@Injectable()
+export class ObjectToTreeService {
+ constructor(private _defaultDataGeneratorService: DefaultDataGeneratorService,
+ private _dynamicInputsService: DynamicInputsService,
+ private _sharedTreeService : SharedTreeService,
+ private _dialogService : DialogService,
+ private _vnfPopupService : VnfPopupService,
+ private _networkPopupService : NetworkPopupService,
+ private _vfModulePopupService : VfModulePopuopService,
+ private _vnfGroupPopupService : VnfGroupPopupService,
+ private _duplicateService : DuplicateService,
+ private _modalService: SdcUiServices.ModalService,
+ private _iframeService : IframeService,
+ private _componentInfoService : ComponentInfoService,
+ private _store : NgRedux<AppState>) {
+ }
+
+
+
+
+ /***********************************************************
+ * return all first optional first level of the model tree
+ ************************************************************/
+ getFirstLevelOptions(): ILevelNodeInfo[] {
+ return [new VnfModelInfo(this._dynamicInputsService, this._sharedTreeService, this._defaultDataGeneratorService, this._dialogService, this._vnfPopupService, this._vfModulePopupService, this._duplicateService, this._modalService, this._iframeService, this._componentInfoService, this._store)
+ , new NetworkModelInfo(this._dynamicInputsService, this._sharedTreeService, this._dialogService, this._networkPopupService, this._duplicateService, this._modalService, this._iframeService, this._store),
+ new ConfigurationModelInfo(this._dynamicInputsService, this._sharedTreeService),
+ new VnfGroupingModelInfo(this._dynamicInputsService, this._sharedTreeService, this._dialogService, this._vnfGroupPopupService, this._iframeService, this._store)];
+ };
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/shared.tree.service.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/shared.tree.service.spec.ts
new file mode 100644
index 000000000..617a81e1f
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/shared.tree.service.spec.ts
@@ -0,0 +1,1761 @@
+import {HttpClientTestingModule} from "@angular/common/http/testing";
+import {getTestBed, TestBed} from "@angular/core/testing";
+import {MockNgRedux, NgReduxTestingModule} from "@angular-redux/store/testing";
+import {SharedTreeService} from "./shared.tree.service";
+import {ObjectToInstanceTreeService} from "./objectToInstanceTree/objectToInstanceTree.service";
+import {ObjectToTreeService} from "./objectToTree.service";
+import {DefaultDataGeneratorService} from "../../../shared/services/defaultDataServiceGenerator/default.data.generator.service";
+import {DynamicInputsService} from "./dynamicInputs.service";
+import {DialogService} from "ng2-bootstrap-modal";
+import {VnfPopupService} from "../../../shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service";
+import {BasicControlGenerator} from "../../../shared/components/genericForm/formControlsServices/basic.control.generator";
+import {AaiService} from "../../../shared/services/aaiService/aai.service";
+import {NetworkPopupService} from "../../../shared/components/genericFormPopup/genericFormServices/network/network.popup.service";
+import {NetworkControlGenerator} from "../../../shared/components/genericForm/formControlsServices/networkGenerator/network.control.generator";
+import {VfModulePopuopService} from "../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service";
+import {VfModuleControlGenerator} from "../../../shared/components/genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator";
+import {VnfGroupControlGenerator} from "../../../shared/components/genericForm/formControlsServices/vnfGroupGenerator/vnfGroup.control.generator";
+import {FeatureFlagsService} from "../../../shared/services/featureFlag/feature-flags.service";
+import {VnfControlGenerator} from "../../../shared/components/genericForm/formControlsServices/vnfGenerator/vnf.control.generator";
+import {NgRedux} from "@angular-redux/store";
+import {GenericFormService} from "../../../shared/components/genericForm/generic-form.service";
+import {FormBuilder} from "@angular/forms";
+import {SdcUiComponentsModule} from "onap-ui-angular";
+import {LogService} from "../../../shared/utils/log/log.service";
+import {IframeService} from "../../../shared/utils/iframe.service";
+import {BasicPopupService} from "../../../shared/components/genericFormPopup/genericFormServices/basic.popup.service";
+import {VnfGroupPopupService} from "../../../shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service";
+import {DuplicateService} from "../duplicate/duplicate.service";
+import {AppState} from "../../../shared/store/reducers";
+import {MessageBoxService} from "../../../shared/components/messageBox/messageBox.service";
+import {ErrorMsgService} from "../../../shared/components/error-msg/error-msg.service";
+import {AuditInfoModalComponent} from "../../../shared/components/auditInfoModal/auditInfoModal.component";
+import {ILevelNodeInfo} from "./models/basic.model.info";
+import {VnfModelInfo} from "./models/vnf/vnf.model.info";
+import {ServiceInstanceActions} from "../../../shared/models/serviceInstanceActions";
+import each from "jest-each";
+import {DrawingBoardModes} from "../drawing-board.modes";
+import {ComponentInfoService} from "../component-info/component-info.service";
+
+class MockAppStore<T> {
+ getState() {
+ return getStore()
+ }
+
+ dispatch() {
+ }
+}
+
+class MockVnfModelInfo<T> {
+ getModel() {
+ return {}
+ }
+}
+
+
+describe('Shared Tree Service', () => {
+ let injector;
+ let service: SharedTreeService;
+ let _objectToInstanceTreeService: ObjectToInstanceTreeService;
+ let store: NgRedux<AppState>;
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+ imports: [HttpClientTestingModule, NgReduxTestingModule, SdcUiComponentsModule],
+ providers: [
+ SharedTreeService,
+ ObjectToTreeService,
+ DefaultDataGeneratorService,
+ DialogService,
+ VnfPopupService,
+ BasicControlGenerator,
+ AaiService,
+ LogService,
+ BasicPopupService,
+ VnfGroupPopupService,
+ DuplicateService,
+ IframeService,
+ DynamicInputsService,
+ NetworkPopupService,
+ NetworkControlGenerator,
+ VfModulePopuopService,
+ VfModuleControlGenerator,
+ VnfGroupControlGenerator,
+ DialogService,
+ FeatureFlagsService,
+ VnfControlGenerator,
+ AaiService,
+ DialogService,
+ GenericFormService,
+ FormBuilder,
+ ErrorMsgService,
+ ObjectToInstanceTreeService,
+ ComponentInfoService,
+ {provide: NgRedux, useClass: MockAppStore}
+ ]
+ });
+ await TestBed.compileComponents();
+ injector = getTestBed();
+ service = injector.get(SharedTreeService);
+ _objectToInstanceTreeService = injector.get(ObjectToInstanceTreeService);
+ store = injector.get(NgRedux);
+ })().then(done).catch(done.fail));
+
+ test('SharedTreeService should be defined', () => {
+ expect(service).toBeDefined();
+ });
+
+ test('shouldShowDeleteInstanceWithChildrenModal should open modal if child exist with action create', () => {
+ jest.spyOn(MessageBoxService.openModal, 'next');
+ let foo = () => {
+
+ };
+ let node = <any>{
+ children: [{action: "Create"}, {action: "None"}],
+ data: {
+ typeName: 'VNF'
+ }
+ };
+ service.shouldShowDeleteInstanceWithChildrenModal(node, "serviceModelId", foo);
+ expect(MessageBoxService.openModal.next).toHaveBeenCalled();
+ });
+
+ test('openAuditInfoModal should open modal for failed instance', () => {
+ jest.spyOn(AuditInfoModalComponent.openInstanceAuditInfoModal, 'next');
+
+ let modelInfoServiceMock: ILevelNodeInfo = new VnfModelInfo(null, null, null, null, null, null, null, null, null, null);
+ const modelMock = {"a": "a"};
+ const instanceMock = {"instance": "instance", "trackById": "123456789"};
+ const instanceTypeMock = "instanceTypeMock";
+ jest.spyOn(modelInfoServiceMock, 'getModel').mockReturnValue(modelMock);
+ let node = <any>{
+ data: {
+ modelId: '6b528779-44a3-4472-bdff-9cd15ec93450',
+ trackById: '1245df21',
+ isFailed: true
+ }
+ };
+ service.openAuditInfoModal(node, "serviceModelId", instanceMock, instanceTypeMock, <any>modelInfoServiceMock);
+ expect(AuditInfoModalComponent.openInstanceAuditInfoModal.next).toHaveBeenCalledWith(
+ {
+ "instance": instanceMock,
+ "instanceId": "serviceModelId",
+ "isInstanceFailed": node.data.isFailed,
+ "model": modelMock,
+ "trackById": instanceMock.trackById,
+ "type": instanceTypeMock
+ });
+ });
+
+ test('shouldShowDeleteInstanceWithChildrfenModal should not open modal if all childs with action None', () => {
+ let foo = () => {
+ };
+ spyOn(MessageBoxService.openModal, 'next');
+
+ let node = <any>{
+ children: [{action: "None"}, {action: "None"}],
+ data: {
+ typeName: 'VNF'
+ }
+ };
+ service.shouldShowDeleteInstanceWithChildrenModal(node, "serviceModelId", foo);
+ expect(MessageBoxService.openModal.next).not.toHaveBeenCalled();
+ });
+
+ test('statusProperties should be prop on node according to node properties', () => {
+ let node = service.addingStatusProperty({orchStatus: 'completed', provStatus: 'inProgress', inMaint: false});
+ expect(node.statusProperties).toBeDefined();
+ expect(node.statusProperties).toEqual([Object({
+ key: 'Prov Status:',
+ value: 'inProgress',
+ testId: 'provStatus'
+ }), Object({key: 'Orch Status:', value: 'completed', testId: 'orchStatus'})]);
+ node = service.addingStatusProperty({orchStatus: 'completed', provStatus: 'inProgress', inMaint: true});
+ expect(node.statusProperties).toEqual([Object({
+ key: 'Prov Status:',
+ value: 'inProgress',
+ testId: 'provStatus'
+ }), Object({key: 'Orch Status:', value: 'completed', testId: 'orchStatus'}), Object({
+ key: 'In-maintenance',
+ value: '',
+ testId: 'inMaint'
+ })]);
+ });
+ const enableRemoveAndEditItemsDataProvider = [
+ ['Create action CREATE mode', DrawingBoardModes.CREATE ,ServiceInstanceActions.Create, true],
+ ['Create action VIEW mode',DrawingBoardModes.VIEW , ServiceInstanceActions.Create,false],
+ ['Create action RETRY_EDIT mode',DrawingBoardModes.RETRY_EDIT, ServiceInstanceActions.Create, true],
+ ['Create action EDIT mode',DrawingBoardModes.EDIT, ServiceInstanceActions.Create, true],
+ ['Create action RETRY mode',DrawingBoardModes.RETRY, ServiceInstanceActions.Create, false],
+ ['None action EDIT mode',DrawingBoardModes.EDIT, ServiceInstanceActions.None, false],
+ ['None action RETRY_EDIT mode', DrawingBoardModes.RETRY_EDIT, ServiceInstanceActions.None, false]];
+ each(enableRemoveAndEditItemsDataProvider).test('shouldShowEditAndDelete if child exist with %s', (description, mode, action, enabled) => {
+ jest.spyOn(store, 'getState').mockReturnValue({
+ global: {
+ drawingBoardStatus: mode
+ }
+ });
+ let node = <any>{
+ data:{
+ action: action
+ },
+ };
+ let res = service.shouldShowRemoveAndEdit(node);
+ expect(res).toBe(enabled);
+ });
+});
+function generateService() {
+ return {
+ "vnfs": {
+ "2017-488_ADIOD-vPE 0": {
+ "inMaint": false,
+ "rollbackOnFailure": "true",
+ "originalName": "2017-488_ADIOD-vPE 0",
+ "isMissingData": false,
+ "trackById": "stigekyxrqi",
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0gytfi": {
+ "isMissingData": false,
+ "sdncPreReload": null,
+ "modelInfo": {
+ "modelType": "VFmodule",
+ "modelInvariantId": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+ "modelVersionId": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+ "modelName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "modelVersion": "5",
+ "modelCustomizationId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0"
+ },
+ "instanceParams": [{}],
+ "trackById": "3oj23o7nupo"
+ }
+ }
+ },
+ "vnfStoreKey": "2017-488_ADIOD-vPE 0",
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "productFamilyId": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+ "lcpCloudRegionId": "JANET25",
+ "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+ "lineOfBusiness": "ONAP",
+ "platformName": "xxx1",
+ "modelInfo": {
+ "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "modelVersionId": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "modelName": "2017-488_ADIOD-vPE",
+ "modelVersion": "5.0",
+ "modelCustomizationName": "2017-488_ADIOD-vPE 0",
+ "modelCustomizationId": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09"
+ },
+ "legacyRegion": "11111111",
+ "instanceParams": [{}]
+ },
+ "2017-388_ADIOD-vPE 0": {
+ "inMaint": false,
+ "rollbackOnFailure": "true",
+ "originalName": "2017-388_ADIOD-vPE 0",
+ "isMissingData": false,
+ "trackById": "nib719t5vca",
+ "vfModules": {},
+ "vnfStoreKey": "2017-388_ADIOD-vPE 0",
+ "productFamilyId": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+ "lcpCloudRegionId": "JANET25",
+ "legacyRegion": "11111",
+ "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+ "platformName": "platform",
+ "lineOfBusiness": "zzz1",
+ "instanceParams": [{}],
+ "modelInfo": {
+ "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "modelVersionId": "afacccf6-397d-45d6-b5ae-94c39734b168",
+ "modelName": "2017-388_ADIOD-vPE",
+ "modelVersion": "4.0",
+ "modelCustomizationId": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c",
+ "modelCustomizationName": "2017-388_ADIOD-vPE 0",
+ "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168"
+ },
+ "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168"
+ },
+ "2017-388_ADIOD-vPE 1": {
+ "inMaint": false,
+ "rollbackOnFailure": "true",
+ "originalName": "2017-388_ADIOD-vPE 1",
+ "isMissingData": false,
+ "trackById": "cv7l1ak8vpe",
+ "vfModules": {},
+ "vnfStoreKey": "2017-388_ADIOD-vPE 1",
+ "productFamilyId": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+ "lcpCloudRegionId": "JANET25",
+ "legacyRegion": "123",
+ "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+ "platformName": "platform",
+ "lineOfBusiness": "ONAP",
+ "instanceParams": [{}],
+ "modelInfo": {
+ "modelInvariantId": "00beb8f9-6d39-452f-816d-c709b9cbb87d",
+ "modelVersionId": "0903e1c0-8e03-4936-b5c2-260653b96413",
+ "modelName": "2017-388_ADIOD-vPE",
+ "modelVersion": "1.0",
+ "modelCustomizationId": "280dec31-f16d-488b-9668-4aae55d6648a",
+ "modelCustomizationName": "2017-388_ADIOD-vPE 1",
+ "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413"
+ },
+ "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413"
+ }
+ },
+ "instanceParams": [{}],
+ "validationCounter": 0,
+ "existingNames": {"yoav": ""},
+ "existingVNFCounterMap": {
+ "69e09f68-8b63-4cc9-b9ff-860960b5db09": 1,
+ "afacccf6-397d-45d6-b5ae-94c39734b168": 1,
+ "0903e1c0-8e03-4936-b5c2-260653b96413": 1
+ },
+ "existingVnfGroupCounterMap": {
+ "daeb6568-cef8-417f-9075-ed259ce59f48": 0,
+ "c2b300e6-45de-4e5e-abda-3032bee2de56": -1
+ },
+ "existingNetworksCounterMap": {"ddc3f20c-08b5-40fd-af72-c6d14636b986": 1},
+ "networks": {
+ "ExtVL 0": {
+ "inMaint": false,
+ "rollbackOnFailure": "true",
+ "originalName": "ExtVL 0",
+ "isMissingData": false,
+ "trackById": "s6okajvv2n8",
+ "networkStoreKey": "ExtVL 0",
+ "productFamilyId": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+ "lcpCloudRegionId": "JANET25",
+ "legacyRegion": "12355555",
+ "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+ "platformName": "platform",
+ "lineOfBusiness": null,
+ "instanceParams": [{}],
+ "modelInfo": {
+ "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c",
+ "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ "modelName": "ExtVL",
+ "modelVersion": "37.0",
+ "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+ "modelCustomizationName": "ExtVL 0",
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+ },
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+ }
+ },
+ "vnfGroups": {
+ "groupingservicefortest..ResourceInstanceGroup..0": {
+ "inMaint": false,
+ "rollbackOnFailure": "true",
+ "originalName": "groupingservicefortest..ResourceInstanceGroup..0",
+ "isMissingData": false,
+ "trackById": "se0obn93qq",
+ "vnfGroupStoreKey": "groupingservicefortest..ResourceInstanceGroup..0",
+ "instanceName": "groupingservicefortestResourceInstanceGroup0",
+ "instanceParams": [{}],
+ "modelInfo": {
+ "modelInvariantId": "4bb2e27e-ddab-4790-9c6d-1f731bc14a45",
+ "modelVersionId": "daeb6568-cef8-417f-9075-ed259ce59f48",
+ "modelName": "groupingservicefortest..ResourceInstanceGroup..0",
+ "modelVersion": "1",
+ "modelCustomizationName": "groupingservicefortest..ResourceInstanceGroup..0",
+ "uuid": "daeb6568-cef8-417f-9075-ed259ce59f48"
+ },
+ "uuid": "daeb6568-cef8-417f-9075-ed259ce59f48"
+ }
+ },
+ "instanceName": "yoav",
+ "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "subscriptionServiceType": "TYLER SILVIA",
+ "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+ "productFamilyId": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+ "lcpCloudRegionId": "JANET25",
+ "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+ "aicZoneId": "ATL53",
+ "pause": null,
+ "projectName": "WATKINS",
+ "rollbackOnFailure": "true",
+ "bulkSize": 1,
+ "aicZoneName": "AAIATLTE-ATL53",
+ "owningEntityName": "WayneHolland",
+ "testApi": "VNF_API",
+ "isEcompGeneratedNaming": false,
+ "tenantName": "USP-SIP-IC-24335-T-01",
+ "modelInfo": {
+ "modelInvariantId": "cdb90b57-ed78-4d44-a5b4-7f43a02ec632",
+ "modelVersionId": "1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd",
+ "modelName": "action-data",
+ "modelVersion": "1.0",
+ "uuid": "1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd"
+ },
+ "isALaCarte": false,
+ "name": "action-data",
+ "version": "1.0",
+ "description": "ADIOD vMX vPE based on Juniper 17.2 release. Updated with updated VF for v8.0 of VLM",
+ "category": "Network L1-3",
+ "uuid": "1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd",
+ "invariantUuid": "cdb90b57-ed78-4d44-a5b4-7f43a02ec632",
+ "serviceType": "pnf",
+ "serviceRole": "Testing",
+ "vidNotions": {"instantiationUI": "legacy", "modelCategory": "other", "viewEditUI": "legacy"},
+ "isMultiStepDesign": true
+ };
+}
+
+function getStore() {
+ return {
+ "global": {
+ "name": null,
+ "flags": {
+ "CREATE_INSTANCE_TEST": false,
+ "EMPTY_DRAWING_BOARD_TEST": false,
+ "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false,
+ "FLAG_ASYNC_INSTANTIATION": true,
+ "FLAG_ASYNC_JOBS": true,
+ "FLAG_ADD_MSO_TESTAPI_FIELD": true,
+ "FLAG_UNASSIGN_SERVICE": true,
+ "FLAG_SERVICE_MODEL_CACHE": true,
+ "FLAG_COLLECTION_RESOURCE_SUPPORT": true,
+ "FLAG_SHOW_ASSIGNMENTS": true,
+ "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
+ "FLAG_DUPLICATE_VNF": true,
+ "FLAG_DEFAULT_VNF": true,
+ "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": true,
+ "FLAG_A_LA_CARTE_AUDIT_INFO": true,
+ "FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST": true,
+ "FLAG_PRESENT_PROVIDER_NETWORKS_ASSOCIATIONS": true,
+ "FLAG_1810_CR_SOFT_DELETE_ALACARTE_VF_MODULE": true,
+ "FLAG_1902_NEW_VIEW_EDIT": true,
+ "FLAG_1810_IDENTIFY_SERVICE_FOR_NEW_UI": false,
+ "FLAG_1902_VNF_GROUPING": true,
+ "FLAG_SHOW_VERIFY_SERVICE": true,
+ "FLAG_ASYNC_ALACARTE_VFMODULE": true,
+ "FLAG_ASYNC_ALACARTE_VNF": true,
+ "FLAG_SHIFT_VFMODULE_PARAMS_TO_VNF": true,
+ "FLAG_1810_AAI_LOCAL_CACHE": true,
+ "FLAG_EXP_USE_DEFAULT_HOST_NAME_VERIFIER": false,
+ "FLAG_EXP_ANY_ALACARTE_NEW_INSTANTIATION_UI": false,
+ "FLAG_SUPPLEMENTARY_FILE": true,
+ "FLAG_5G_IN_NEW_INSTANTIATION_UI": true,
+ "FLAG_RESTRICTED_SELECT": false,
+ "FLAG_1810_CR_LET_SELECTING_COLLECTOR_TYPE_UNCONDITIONALLY": true
+ },
+ "drawingBoardStatus": "VIEW",
+ "type": "UPDATE_DRAWING_BOARD_STATUS"
+ },
+ "service": {
+ "serviceHierarchy": {
+ "1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd": {
+ "service": {
+ "uuid": "1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd",
+ "invariantUuid": "cdb90b57-ed78-4d44-a5b4-7f43a02ec632",
+ "name": "action-data",
+ "version": "1.0",
+ "toscaModelURL": null,
+ "category": "Network L1-3",
+ "serviceType": "pnf",
+ "serviceRole": "Testing",
+ "description": "ADIOD vMX vPE based on Juniper 17.2 release. Updated with updated VF for v8.0 of VLM",
+ "serviceEcompNaming": "false",
+ "instantiationType": "Macro",
+ "inputs": {},
+ "vidNotions": {"instantiationUI": "legacy", "modelCategory": "other", "viewEditUI": "legacy"}
+ },
+ "vnfs": {
+ "2017-388_ADIOD-vPE 1": {
+ "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413",
+ "invariantUuid": "00beb8f9-6d39-452f-816d-c709b9cbb87d",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-388_ADIOD-vPE",
+ "version": "1.0",
+ "customizationUuid": "280dec31-f16d-488b-9668-4aae55d6648a",
+ "inputs": {},
+ "commands": {},
+ "properties": {
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=true}",
+ "multi_stage_design": "true",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "true",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:2017488_adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:2017488_adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VF",
+ "modelCustomizationName": "2017-388_ADIOD-vPE 1",
+ "vfModules": {},
+ "volumeGroups": {},
+ "vfcInstanceGroups": {}
+ },
+ "2017-388_ADIOD-vPE 0": {
+ "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168",
+ "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-388_ADIOD-vPE",
+ "version": "4.0",
+ "customizationUuid": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c",
+ "inputs": {},
+ "commands": {},
+ "properties": {
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=true}",
+ "multi_stage_design": "true",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "true",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:2017488_adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:2017488_adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VF",
+ "modelCustomizationName": "2017-388_ADIOD-vPE 0",
+ "vfModules": {},
+ "volumeGroups": {},
+ "vfcInstanceGroups": {}
+ },
+ "2017-488_ADIOD-vPE 0": {
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-488_ADIOD-vPE",
+ "version": "5.0",
+ "customizationUuid": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+ "inputs": {},
+ "commands": {},
+ "properties": {
+ "max_instances": 1,
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=true}",
+ "multi_stage_design": "true",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "true",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:2017488_adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:2017488_adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VF",
+ "modelCustomizationName": "2017-488_ADIOD-vPE 0",
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "baseModule": false
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+ "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+ "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+ "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "version": "5",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "ADIOD_base_vPE_BV",
+ "baseModule": true
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV",
+ "baseModule": false
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "baseModule": false
+ },
+ "inputs": {}
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV",
+ "baseModule": false
+ },
+ "inputs": {}
+ }
+ },
+ "vfcInstanceGroups": {}
+ }
+ },
+ "networks": {
+ "ExtVL 0": {
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ "invariantUuid": "379f816b-a7aa-422f-be30-17114ff50b7c",
+ "description": "ECOMP generic virtual link (network) base type for all other service-level and global networks",
+ "name": "ExtVL",
+ "version": "37.0",
+ "customizationUuid": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+ "inputs": {},
+ "commands": {},
+ "properties": {
+ "network_assignments": "{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}",
+ "exVL_naming": "{ecomp_generated_naming=true}",
+ "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}",
+ "network_homing": "{ecomp_selected_instance_node_target=false}"
+ },
+ "type": "VL",
+ "modelCustomizationName": "ExtVL 0"
+ }
+ },
+ "collectionResource": {},
+ "configurations": {},
+ "fabricConfigurations": {},
+ "serviceProxies": {},
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "baseModule": false
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+ "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+ "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+ "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "version": "5",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "ADIOD_base_vPE_BV",
+ "baseModule": true
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV",
+ "baseModule": false
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "baseModule": false
+ },
+ "inputs": {}
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV",
+ "baseModule": false
+ },
+ "inputs": {}
+ }
+ },
+ "pnfs": {},
+ "vnfGroups": {
+ "groupingservicefortest..ResourceInstanceGroup..0": {
+ "type": "VnfGroup",
+ "invariantUuid": "4bb2e27e-ddab-4790-9c6d-1f731bc14a45",
+ "uuid": "daeb6568-cef8-417f-9075-ed259ce59f48",
+ "version": "1",
+ "name": "groupingservicefortest..ResourceInstanceGroup..0",
+ "modelCustomizationName": "groupingservicefortest..ResourceInstanceGroup..0",
+ "properties": {
+ "contained_resource_type": "VF",
+ "role": "SERVICE-ACCESS",
+ "function": "DATA",
+ "description": "DDD0",
+ "type": "LOAD-GROUP",
+ "ecomp_generated_naming": "true"
+ },
+ "members": {
+ "vdbe_svc_vprs_proxy 0": {
+ "uuid": "65fadfa8-a0d9-443f-95ad-836cd044e26c",
+ "invariantUuid": "f4baae0c-b3a5-4ca1-a777-afbffe7010bc",
+ "description": "A Proxy for Service vDBE_Svc_vPRS",
+ "name": "vDBE_Svc_vPRS Service Proxy",
+ "version": "1.0",
+ "customizationUuid": "bdb63d23-e132-4ce7-af2c-a493b4cafac9",
+ "inputs": {},
+ "commands": {},
+ "properties": {},
+ "type": "Service Proxy",
+ "sourceModelUuid": "da7827a2-366d-4be6-8c68-a69153c61274",
+ "sourceModelInvariant": "24632e6b-584b-4f45-80d4-fefd75fd9f14",
+ "sourceModelName": "vDBE_Svc_vPRS"
+ }
+ }
+ },
+ "groupingservicefortest..ResourceInstanceGroup..1": {
+ "type": "VnfGroup",
+ "invariantUuid": "a704112d-dbc6-4e56-8d4e-aec57e95ef9a",
+ "uuid": "c2b300e6-45de-4e5e-abda-3032bee2de56",
+ "version": "1",
+ "name": "groupingservicefortest..ResourceInstanceGroup..1",
+ "modelCustomizationName": "groupingservicefortest..ResourceInstanceGroup..1",
+ "properties": {
+ "contained_resource_type": "VF",
+ "role": "SERVICE-ACCESS",
+ "function": "SIGNALING",
+ "description": "DDD1",
+ "type": "LOAD-GROUP",
+ "ecomp_generated_naming": "true"
+ },
+ "members": {
+ "tsbc0001vm001_svc_proxy 0": {
+ "uuid": "65fadfa8-a0d9-443f-95ad-836cd044e26c",
+ "invariantUuid": "f4baae0c-b3a5-4ca1-a777-afbffe7010bc",
+ "description": "A Proxy for Service tsbc0001vm001_Svc",
+ "name": "tsbc0001vm001_Svc Service Proxy",
+ "version": "1.0",
+ "customizationUuid": "3d814462-30fb-4c62-b997-9aa360d27ead",
+ "inputs": {},
+ "commands": {},
+ "properties": {},
+ "type": "Service Proxy",
+ "sourceModelUuid": "28aeb8f6-5620-4148-8bfb-a5fb406f0309",
+ "sourceModelInvariant": "c989ab9a-33c7-46ec-b521-1b2daef5f047",
+ "sourceModelName": "tsbc0001vm001_Svc"
+ }
+ }
+ }
+ }
+ },
+ "b75e0d22-05ff-4448-9266-5f0d4e1dbbd6": {
+ "service": {
+ "uuid": "b75e0d22-05ff-4448-9266-5f0d4e1dbbd6",
+ "invariantUuid": "5b9c0f33-eec1-484a-bf77-736a6644d7a8",
+ "name": "Using VID for VoIP Network Instantiations Shani",
+ "version": "1.0",
+ "toscaModelURL": null,
+ "category": "VoIP Call Control",
+ "serviceType": "",
+ "serviceRole": "",
+ "description": "Using VID for VoIP Network Instantiations Shani",
+ "serviceEcompNaming": "true",
+ "instantiationType": "ClientConfig",
+ "inputs": {},
+ "vidNotions": {"instantiationUI": "legacy", "modelCategory": "other", "viewEditUI": "legacy"}
+ },
+ "vnfs": {},
+ "networks": {
+ "AIC30_CONTRAIL_BASIC 0": {
+ "uuid": "ac815c68-35b7-4ea4-9d04-92d2f844b27c",
+ "invariantUuid": "de01afb5-532b-451d-aac4-ff9ff0644060",
+ "description": "Basic contrail 3.0.x L3 network for AIC 3.x sites. ",
+ "name": "AIC30_CONTRAIL_BASIC",
+ "version": "3.0",
+ "customizationUuid": "e94d61f7-b4b2-489a-a4a7-30b1a1a80daf",
+ "inputs": {},
+ "commands": {},
+ "properties": {
+ "network_assignments": "{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}",
+ "exVL_naming": "{ecomp_generated_naming=true}",
+ "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}",
+ "network_scope": "Service",
+ "network_type": "AIC30_CONTRAIL_BASIC",
+ "network_technology": "Contrail",
+ "network_homing": "{ecomp_selected_instance_node_target=false}"
+ },
+ "type": "VL",
+ "modelCustomizationName": "AIC30_CONTRAIL_BASIC 0"
+ }
+ },
+ "collectionResource": {},
+ "configurations": {},
+ "fabricConfigurations": {},
+ "serviceProxies": {},
+ "vfModules": {},
+ "volumeGroups": {},
+ "pnfs": {},
+ "vnfGroups": {}
+ }
+ },
+ "serviceInstance": {
+ "1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd": {
+ "vnfs": {
+ "2017-488_ADIOD-vPE 0": {
+ "action": "None",
+ "inMaint": false,
+ "rollbackOnFailure": "true",
+ "originalName": "2017-488_ADIOD-vPE 0",
+ "isMissingData": false,
+ "trackById": "stigekyxrqi",
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0gytfi": {
+ "isMissingData": false,
+ "sdncPreReload": null,
+ "modelInfo": {
+ "modelType": "VFmodule",
+ "modelInvariantId": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+ "modelVersionId": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+ "modelName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "modelVersion": "5",
+ "modelCustomizationId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0"
+ },
+ "instanceParams": [{}],
+ "trackById": "3oj23o7nupo"
+ }
+ }
+ },
+ "vnfStoreKey": "2017-488_ADIOD-vPE 0",
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "productFamilyId": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+ "lcpCloudRegionId": "JANET25",
+ "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+ "lineOfBusiness": "ONAP",
+ "platformName": "xxx1",
+ "modelInfo": {
+ "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "modelVersionId": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "modelName": "2017-488_ADIOD-vPE",
+ "modelVersion": "5.0",
+ "modelCustomizationName": "2017-488_ADIOD-vPE 0",
+ "modelCustomizationId": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09"
+ },
+ "legacyRegion": "11111111",
+ "instanceParams": [{}]
+ },
+ "2017-388_ADIOD-vPE 0": {
+ "action": "Create",
+ "inMaint": false,
+ "rollbackOnFailure": "true",
+ "originalName": "2017-388_ADIOD-vPE 0",
+ "isMissingData": false,
+ "trackById": "nib719t5vca",
+ "vfModules": {},
+ "vnfStoreKey": "2017-388_ADIOD-vPE 0",
+ "productFamilyId": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+ "lcpCloudRegionId": "JANET25",
+ "legacyRegion": "11111",
+ "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+ "platformName": "platform",
+ "lineOfBusiness": "zzz1",
+ "instanceParams": [{}],
+ "modelInfo": {
+ "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "modelVersionId": "afacccf6-397d-45d6-b5ae-94c39734b168",
+ "modelName": "2017-388_ADIOD-vPE",
+ "modelVersion": "4.0",
+ "modelCustomizationId": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c",
+ "modelCustomizationName": "2017-388_ADIOD-vPE 0",
+ "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168"
+ },
+ "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168"
+ },
+ "2017-388_ADIOD-vPE 1": {
+ "action": "None",
+ "inMaint": false,
+ "rollbackOnFailure": "true",
+ "originalName": "2017-388_ADIOD-vPE 1",
+ "isMissingData": false,
+ "trackById": "cv7l1ak8vpe",
+ "vfModules": {},
+ "vnfStoreKey": "2017-388_ADIOD-vPE 1",
+ "productFamilyId": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+ "lcpCloudRegionId": "JANET25",
+ "legacyRegion": "123",
+ "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+ "platformName": "platform",
+ "lineOfBusiness": "ONAP",
+ "instanceParams": [{}],
+ "modelInfo": {
+ "modelInvariantId": "00beb8f9-6d39-452f-816d-c709b9cbb87d",
+ "modelVersionId": "0903e1c0-8e03-4936-b5c2-260653b96413",
+ "modelName": "2017-388_ADIOD-vPE",
+ "modelVersion": "1.0",
+ "modelCustomizationId": "280dec31-f16d-488b-9668-4aae55d6648a",
+ "modelCustomizationName": "2017-388_ADIOD-vPE 1",
+ "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413"
+ },
+ "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413"
+ }
+ },
+ "instanceParams": [{}],
+ "validationCounter": 0,
+ "existingNames": {"yoav": ""},
+ "existingVNFCounterMap": {
+ "69e09f68-8b63-4cc9-b9ff-860960b5db09": 1,
+ "afacccf6-397d-45d6-b5ae-94c39734b168": 1,
+ "0903e1c0-8e03-4936-b5c2-260653b96413": 1
+ },
+ "existingVnfGroupCounterMap": {
+ "daeb6568-cef8-417f-9075-ed259ce59f48": 0,
+ "c2b300e6-45de-4e5e-abda-3032bee2de56": -1
+ },
+ "existingNetworksCounterMap": {"ddc3f20c-08b5-40fd-af72-c6d14636b986": 1},
+ "networks": {
+ "ExtVL 0": {
+ "inMaint": false,
+ "rollbackOnFailure": "true",
+ "originalName": "ExtVL 0",
+ "isMissingData": false,
+ "trackById": "s6okajvv2n8",
+ "networkStoreKey": "ExtVL 0",
+ "productFamilyId": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+ "lcpCloudRegionId": "JANET25",
+ "legacyRegion": "12355555",
+ "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+ "platformName": "platform",
+ "lineOfBusiness": null,
+ "instanceParams": [{}],
+ "modelInfo": {
+ "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c",
+ "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ "modelName": "ExtVL",
+ "modelVersion": "37.0",
+ "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+ "modelCustomizationName": "ExtVL 0",
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+ },
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+ }
+ },
+ "vnfGroups": {
+ "groupingservicefortest..ResourceInstanceGroup..0": {
+ "inMaint": false,
+ "rollbackOnFailure": "true",
+ "originalName": "groupingservicefortest..ResourceInstanceGroup..0",
+ "isMissingData": false,
+ "trackById": "se0obn93qq",
+ "vnfGroupStoreKey": "groupingservicefortest..ResourceInstanceGroup..0",
+ "instanceName": "groupingservicefortestResourceInstanceGroup0",
+ "instanceParams": [{}],
+ "modelInfo": {
+ "modelInvariantId": "4bb2e27e-ddab-4790-9c6d-1f731bc14a45",
+ "modelVersionId": "daeb6568-cef8-417f-9075-ed259ce59f48",
+ "modelName": "groupingservicefortest..ResourceInstanceGroup..0",
+ "modelVersion": "1",
+ "modelCustomizationName": "groupingservicefortest..ResourceInstanceGroup..0",
+ "uuid": "daeb6568-cef8-417f-9075-ed259ce59f48"
+ },
+ "uuid": "daeb6568-cef8-417f-9075-ed259ce59f48"
+ }
+ },
+ "instanceName": "yoav",
+ "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "subscriptionServiceType": "TYLER SILVIA",
+ "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+ "productFamilyId": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+ "lcpCloudRegionId": "JANET25",
+ "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+ "aicZoneId": "ATL53",
+ "pause": null,
+ "projectName": "WATKINS",
+ "rollbackOnFailure": "true",
+ "bulkSize": 1,
+ "aicZoneName": "AAIATLTE-ATL53",
+ "owningEntityName": "WayneHolland",
+ "testApi": "VNF_API",
+ "isEcompGeneratedNaming": false,
+ "tenantName": "USP-SIP-IC-24335-T-01",
+ "modelInfo": {
+ "modelInvariantId": "cdb90b57-ed78-4d44-a5b4-7f43a02ec632",
+ "modelVersionId": "1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd",
+ "modelName": "action-data",
+ "modelVersion": "1.0",
+ "uuid": "1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd"
+ },
+ "isALaCarte": false,
+ "name": "action-data",
+ "version": "1.0",
+ "description": "ADIOD vMX vPE based on Juniper 17.2 release. Updated with updated VF for v8.0 of VLM",
+ "category": "Network L1-3",
+ "uuid": "1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd",
+ "invariantUuid": "cdb90b57-ed78-4d44-a5b4-7f43a02ec632",
+ "serviceType": "pnf",
+ "serviceRole": "Testing",
+ "vidNotions": {"instantiationUI": "legacy", "modelCategory": "other", "viewEditUI": "legacy"},
+ "isMultiStepDesign": true
+ }
+ },
+ "lcpRegionsAndTenants": {
+ "lcpRegionList": [{
+ "id": "JANET25",
+ "name": "JANET25 (AIC)",
+ "isPermitted": true,
+ "cloudOwner": "irma-aic"
+ }, {"id": "hvf6", "name": "hvf6 (AIC)", "isPermitted": true, "cloudOwner": "irma-aic"}],
+ "lcpRegionsTenantsMap": {
+ "JANET25": [{
+ "id": "092eb9e8e4b7412e8787dd091bc58e86",
+ "name": "USP-SIP-IC-24335-T-01",
+ "isPermitted": true,
+ "cloudOwner": "irma-aic"
+ }],
+ "hvf6": [{
+ "id": "bae71557c5bb4d5aac6743a4e5f1d054",
+ "name": "AIN Web Tool-15-D-testalexandria",
+ "isPermitted": true,
+ "cloudOwner": "irma-aic"
+ }, {
+ "id": "229bcdc6eaeb4ca59d55221141d01f8e",
+ "name": "AIN Web Tool-15-D-STTest2",
+ "isPermitted": true,
+ "cloudOwner": "irma-aic"
+ }, {
+ "id": "1178612d2b394be4834ad77f567c0af2",
+ "name": "AIN Web Tool-15-D-SSPtestcustome",
+ "isPermitted": true,
+ "cloudOwner": "irma-aic"
+ }, {
+ "id": "19c5ade915eb461e8af52fb2fd8cd1f2",
+ "name": "AIN Web Tool-15-D-UncheckedEcopm",
+ "isPermitted": true,
+ "cloudOwner": "irma-aic"
+ }, {
+ "id": "de007636e25249238447264a988a927b",
+ "name": "AIN Web Tool-15-D-dfsdf",
+ "isPermitted": true,
+ "cloudOwner": "irma-aic"
+ }, {
+ "id": "62f29b3613634ca6a3065cbe0e020c44",
+ "name": "AIN/SMS-16-D-Multiservices1",
+ "isPermitted": true,
+ "cloudOwner": "irma-aic"
+ }, {
+ "id": "649289e30d3244e0b48098114d63c2aa",
+ "name": "AIN Web Tool-15-D-SSPST66",
+ "isPermitted": true,
+ "cloudOwner": "irma-aic"
+ }, {
+ "id": "3f21eeea6c2c486bba31dab816c05a32",
+ "name": "AIN Web Tool-15-D-ASSPST47",
+ "isPermitted": true,
+ "cloudOwner": "irma-aic"
+ }, {
+ "id": "f60ce21d3ee6427586cff0d22b03b773",
+ "name": "CESAR-100-D-sspjg67246",
+ "isPermitted": true,
+ "cloudOwner": "irma-aic"
+ }, {
+ "id": "8774659e425f479895ae091bb5d46560",
+ "name": "CESAR-100-D-sspjg68359",
+ "isPermitted": true,
+ "cloudOwner": "irma-aic"
+ }, {
+ "id": "624eb554b0d147c19ff8885341760481",
+ "name": "AINWebTool-15-D-iftach",
+ "isPermitted": true,
+ "cloudOwner": "irma-aic"
+ }, {
+ "id": "214f55f5fc414c678059c383b03e4962",
+ "name": "CESAR-100-D-sspjg612401",
+ "isPermitted": true,
+ "cloudOwner": "irma-aic"
+ }, {
+ "id": "c90666c291664841bb98e4d981ff1db5",
+ "name": "CESAR-100-D-sspjg621340",
+ "isPermitted": true,
+ "cloudOwner": "irma-aic"
+ }, {
+ "id": "ce5b6bc5c7b348e1bf4b91ac9a174278",
+ "name": "sspjg621351cloned",
+ "isPermitted": true,
+ "cloudOwner": "irma-aic"
+ }, {
+ "id": "b386b768a3f24c8e953abbe0b3488c02",
+ "name": "AINWebTool-15-D-eteancomp",
+ "isPermitted": true,
+ "cloudOwner": "irma-aic"
+ }, {
+ "id": "dc6c4dbfd225474e9deaadd34968646c",
+ "name": "AINWebTool-15-T-SPFET",
+ "isPermitted": true,
+ "cloudOwner": "irma-aic"
+ }, {
+ "id": "02cb5030e9914aa4be120bd9ed1e19eb",
+ "name": "AINWebTool-15-X-eeweww",
+ "isPermitted": true,
+ "cloudOwner": "irma-aic"
+ }, {
+ "id": "f2f3830e4c984d45bcd00e1a04158a79",
+ "name": "CESAR-100-D-spjg61909",
+ "isPermitted": true,
+ "cloudOwner": "irma-aic"
+ }, {
+ "id": "05b91bd5137f4929878edd965755c06d",
+ "name": "CESAR-100-D-sspjg621512cloned",
+ "isPermitted": true,
+ "cloudOwner": "irma-aic"
+ }, {
+ "id": "7002fbe8482d4a989ddf445b1ce336e0",
+ "name": "AINWebTool-15-X-vdr",
+ "isPermitted": true,
+ "cloudOwner": "irma-aic"
+ }, {
+ "id": "4008522be43741dcb1f5422022a2aa0b",
+ "name": "AINWebTool-15-D-ssasa",
+ "isPermitted": true,
+ "cloudOwner": "irma-aic"
+ }, {
+ "id": "f44e2e96a1b6476abfda2fa407b00169",
+ "name": "AINWebTool-15-D-PFNPT",
+ "isPermitted": true,
+ "cloudOwner": "irma-aic"
+ }, {
+ "id": "b69a52bec8a84669a37a1e8b72708be7",
+ "name": "AINWebTool-15-X-vdre",
+ "isPermitted": true,
+ "cloudOwner": "irma-aic"
+ }, {
+ "id": "fac7d9fd56154caeb9332202dcf2969f",
+ "name": "AINWebTool-15-X-NONPODECOMP",
+ "isPermitted": true,
+ "cloudOwner": "irma-aic"
+ }, {
+ "id": "2d34d8396e194eb49969fd61ffbff961",
+ "name": "DN5242-Nov16-T5",
+ "isPermitted": true,
+ "cloudOwner": "irma-aic"
+ }, {
+ "id": "cb42a77ff45b48a8b8deb83bb64acc74",
+ "name": "ro-T11",
+ "isPermitted": true,
+ "cloudOwner": "irma-aic"
+ }, {
+ "id": "fa45ca53c80b492fa8be5477cd84fc2b",
+ "name": "ro-T112",
+ "isPermitted": true,
+ "cloudOwner": "irma-aic"
+ }, {
+ "id": "4914ab0ab3a743e58f0eefdacc1dde77",
+ "name": "DN5242-Nov21-T1",
+ "isPermitted": true,
+ "cloudOwner": "irma-aic"
+ }, {
+ "id": "d0a3e3f2964542259d155a81c41aadc3",
+ "name": "test-hvf6-09",
+ "isPermitted": true,
+ "cloudOwner": "irma-aic"
+ }, {
+ "id": "cbb99fe4ada84631b7baf046b6fd2044",
+ "name": "DN5242-Nov16-T3",
+ "isPermitted": true,
+ "cloudOwner": "irma-aic"
+ }]
+ }
+ },
+ "subscribers": [{
+ "id": "ERICA5779-Subscriber-2",
+ "name": "ERICA5779-Subscriber-2",
+ "isPermitted": false
+ }, {
+ "id": "ERICA5779-Subscriber-3",
+ "name": "ERICA5779-Subscriber-3",
+ "isPermitted": false
+ }, {
+ "id": "ERICA5779-Subscriber-4",
+ "name": "ERICA5779-Subscriber-5",
+ "isPermitted": false
+ }, {
+ "id": "ERICA5779-TestSub-PWT-101",
+ "name": "ERICA5779-TestSub-PWT-101",
+ "isPermitted": false
+ }, {
+ "id": "ERICA5779-TestSub-PWT-102",
+ "name": "ERICA5779-TestSub-PWT-102",
+ "isPermitted": false
+ }, {
+ "id": "ERICA5779-TestSub-PWT-103",
+ "name": "ERICA5779-TestSub-PWT-103",
+ "isPermitted": false
+ }, {
+ "id": "31739f3e-526b-11e6-beb8-9e71128cae77",
+ "name": "CRAIG/ROBERTS",
+ "isPermitted": false
+ }, {"id": "DHV1707-TestSubscriber-2", "name": "DALE BRIDGES", "isPermitted": false}, {
+ "id": "jimmy-example",
+ "name": "JimmyExampleCust-20161102",
+ "isPermitted": false
+ }, {"id": "jimmy-example2", "name": "JimmyExampleCust-20161103", "isPermitted": false}, {
+ "id": "CAR_2020_ER",
+ "name": "CAR_2020_ER",
+ "isPermitted": true
+ }, {
+ "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+ "name": "Emanuel",
+ "isPermitted": false
+ }, {
+ "id": "21014aa2-526b-11e6-beb8-9e71128cae77",
+ "name": "JULIO ERICKSON",
+ "isPermitted": false
+ }, {
+ "id": "DHV1707-TestSubscriber-1",
+ "name": "LLOYD BRIDGES",
+ "isPermitted": false
+ }, {"id": "e433710f-9217-458d-a79d-1c7aff376d89", "name": "SILVIA ROBBINS", "isPermitted": true}],
+ "productFamilies": null,
+ "serviceTypes": {
+ "e433710f-9217-458d-a79d-1c7aff376d89": [{
+ "id": "17",
+ "name": "JOHANNA_SANTOS",
+ "isPermitted": false
+ }, {"id": "16", "name": "LINDSEY", "isPermitted": false}, {
+ "id": "2",
+ "name": "Emanuel",
+ "isPermitted": false
+ }, {"id": "5", "name": "Kennedy", "isPermitted": false}, {
+ "id": "14",
+ "name": "SSD",
+ "isPermitted": false
+ }, {"id": "1", "name": "TYLER SILVIA", "isPermitted": true}, {
+ "id": "12",
+ "name": "VPMS",
+ "isPermitted": false
+ }, {"id": "3", "name": "vJamie", "isPermitted": false}, {
+ "id": "0",
+ "name": "vRichardson",
+ "isPermitted": false
+ }, {"id": "18", "name": "vCarroll", "isPermitted": false}, {
+ "id": "9",
+ "name": "vMME",
+ "isPermitted": false
+ }, {"id": "13", "name": "vMMSC", "isPermitted": false}, {
+ "id": "10",
+ "name": "vMNS",
+ "isPermitted": false
+ }, {"id": "15", "name": "vMOG", "isPermitted": false}, {
+ "id": "8",
+ "name": "vOTA",
+ "isPermitted": false
+ }, {"id": "11", "name": "vSCP", "isPermitted": false}, {
+ "id": "6",
+ "name": "vSEGW",
+ "isPermitted": false
+ }, {"id": "7", "name": "vVM", "isPermitted": false}, {"id": "4", "name": "vVoiceMail", "isPermitted": false}]
+ },
+ "aicZones": [{"id": "ATL53", "name": "AAIATLTE-ATL53"}, {"id": "ABC15", "name": "AAITESAN-ABC15"}, {
+ "id": "TES36",
+ "name": "ABCEETES-TES36"
+ }, {"id": "ATL54", "name": "AICFTAAI-ATL54"}, {"id": "ATL43", "name": "AICLOCID-ATL43"}, {
+ "id": "AMD15",
+ "name": "AMDFAA01-AMD15"
+ }, {"id": "AMF11", "name": "AMDOCS01-AMF11"}, {"id": "RCT1", "name": "AMSTERNL-RCT1"}, {
+ "id": "AMS1",
+ "name": "AMSTNLBW-AMS1"
+ }, {"id": "HJH1", "name": "AOEEQQQD-HJH1"}, {"id": "HJE1", "name": "AOEEWWWD-HJE1"}, {
+ "id": "MCS1",
+ "name": "ASACMAMS-MCS1"
+ }, {"id": "AUG1", "name": "ASDFGHJK-AUG1"}, {"id": "LUC1", "name": "ATLDFGYC-LUC1"}, {
+ "id": "ATL1",
+ "name": "ATLNGAMA-ATL1"
+ }, {"id": "ATL2", "name": "ATLNGANW-ATL2"}, {"id": "HPO1", "name": "ATLNGAUP-HPO1"}, {
+ "id": "ANI1",
+ "name": "ATLNGTRE-ANI1"
+ }, {"id": "ATL44", "name": "ATLSANAB-ATL44"}, {"id": "ATL56", "name": "ATLSANAC-ATL56"}, {
+ "id": "ABC11",
+ "name": "ATLSANAI-ABC11"
+ }, {"id": "ATL34", "name": "ATLSANAI-ATL34"}, {"id": "ATL63", "name": "ATLSANEW-ATL63"}, {
+ "id": "ABC12",
+ "name": "ATLSECIA-ABC12"
+ }, {"id": "AMD18", "name": "AUDIMA01-AMD18"}, {"id": "AVT1", "name": "AVTRFLHD-AVT1"}, {
+ "id": "KIT1",
+ "name": "BHYJFGLN-KIT1"
+ }, {"id": "BHY17", "name": "BHYTFRF3-BHY17"}, {"id": "RTW5", "name": "BHYTFRY4-RTW5"}, {
+ "id": "RTZ4",
+ "name": "BHYTFRZ6-RTZ4"
+ }, {"id": "RTD2", "name": "BHYTFRk4-RTD2"}, {"id": "BNA1", "name": "BNARAGBK-BNA1"}, {
+ "id": "VEL1",
+ "name": "BNMLKUIK-VEL1"
+ }, {"id": "BOT1", "name": "BOTHWAKY-BOT1"}, {"id": "CAL33", "name": "CALIFORN-CAL33"}, {
+ "id": "ATL84",
+ "name": "CANTTCOC-ATL84"
+ }, {"id": "HSD1", "name": "CHASKCDS-HSD1"}, {"id": "CHI1", "name": "CHILLIWE-CHI1"}, {
+ "id": "XCP12",
+ "name": "CHKGH123-XCP12"
+ }, {"id": "JNL1", "name": "CJALSDAC-JNL1"}, {"id": "KJN1", "name": "CKALDKSA-KJN1"}, {
+ "id": "CLG1",
+ "name": "CLGRABAD-CLG1"
+ }, {"id": "CKL1", "name": "CLKSKCKK-CKL1"}, {"id": "ATL66", "name": "CLLIAAII-ATL66"}, {
+ "id": "CQK1",
+ "name": "CQKSCAKK-CQK1"
+ }, {"id": "CWY1", "name": "CWYMOWBS-CWY1"}, {"id": "DKJ1", "name": "DKJSJDKA-DKJ1"}, {
+ "id": "DSF45",
+ "name": "DSFBG123-DSF45"
+ }, {"id": "DSL12", "name": "DSLFK242-DSL12"}, {"id": "FDE55", "name": "FDERT555-FDE55"}, {
+ "id": "VEN2",
+ "name": "FGHJUHIL-VEN2"
+ }, {"id": "ATL64", "name": "FORLOAAJ-ATL64"}, {"id": "GNV1", "name": "GNVLSCTL-GNV1"}, {
+ "id": "SAN22",
+ "name": "GNVLSCTL-SAN22"
+ }, {"id": "KAP1", "name": "HIOUYTRQ-KAP1"}, {"id": "LIS1", "name": "HOSTPROF-LIS1"}, {
+ "id": "HRG1",
+ "name": "HRGHRGGS-HRG1"
+ }, {"id": "HST25", "name": "HSTNTX01-HST25"}, {"id": "STN27", "name": "HSTNTX01-STN27"}, {
+ "id": "HST70",
+ "name": "HSTNTX70-HST70"
+ }, {"id": "KOR1", "name": "HYFLNBVT-KOR1"}, {"id": "RAD10", "name": "INDIPUNE-RAD10"}, {
+ "id": "REL1",
+ "name": "INGERFGT-REL1"
+ }, {"id": "JAD1", "name": "JADECLLI-JAD1"}, {"id": "HKA1", "name": "JAKHLASS-HKA1"}, {
+ "id": "JCS1",
+ "name": "JCSJSCJS-JCS1"
+ }, {"id": "JCV1", "name": "JCVLFLBW-JCV1"}, {"id": "KGM2", "name": "KGMTNC20-KGM2"}, {
+ "id": "KJF12",
+ "name": "KJFDH123-KJF12"
+ }, {"id": "JGS1", "name": "KSJKKKKK-JGS1"}, {"id": "LAG1", "name": "LARGIZON-LAG1"}, {
+ "id": "LAG1a",
+ "name": "LARGIZON-LAG1a"
+ }, {"id": "LAG45", "name": "LARGIZON-LAG1a"}, {"id": "LAG1b", "name": "LARGIZON-LAG1b"}, {
+ "id": "WAN1",
+ "name": "LEIWANGW-WAN1"
+ }, {"id": "DSA1", "name": "LKJHGFDS-DSA1"}, {"id": "LON1", "name": "LONEENCO-LON1"}, {
+ "id": "SITE",
+ "name": "LONEENCO-SITE"
+ }, {"id": "ZXL1", "name": "LWLWCANN-ZXL1"}, {"id": "MTN20", "name": "MDTWNJ21-MTN20"}, {
+ "id": "MTN32",
+ "name": "MDTWNJ21-MTN32"
+ }, {"id": "AMD13", "name": "MEMATLAN-AMD13"}, {"id": "MIC54", "name": "MICHIGAN-MIC54"}, {
+ "id": "MAR1",
+ "name": "MNBVCXZM-MAR1"
+ }, {"id": "NCA1", "name": "NCANCANN-NCA1"}, {"id": "NFT1", "name": "NFTJSSSS-NFT1"}, {
+ "id": "GAR1",
+ "name": "NGFVSJKO-GAR1"
+ }, {"id": "NYC1", "name": "NYCMNY54-NYC1"}, {"id": "OKC1", "name": "OKCBOK55-OKC1"}, {
+ "id": "OLG1",
+ "name": "OLHOLHOL-OLG1"
+ }, {"id": "OLK1", "name": "OLKOLKLS-OLK1"}, {"id": "NIR1", "name": "ORFLMANA-NIR1"}, {
+ "id": "JAN1",
+ "name": "ORFLMATT-JAN1"
+ }, {"id": "ORL1", "name": "ORLDFLMA-ORL1"}, {"id": "PAR1", "name": "PARSFRCG-PAR1"}, {
+ "id": "PBL1",
+ "name": "PBLAPBAI-PBL1"
+ }, {"id": "mac10", "name": "PKGTESTF-mac10"}, {"id": "mac20", "name": "PKGTESTF-mac20"}, {
+ "id": "TIR2",
+ "name": "PLKINHYI-TIR2"
+ }, {"id": "IBB1", "name": "PLMKOIJU-IBB1"}, {"id": "COM1", "name": "PLMKOPIU-COM1"}, {
+ "id": "POI1",
+ "name": "PLMNJKIU-POI1"
+ }, {"id": "PLT1", "name": "PLTNCA60-PLT1"}, {"id": "POI22", "name": "POIUY123-POI22"}, {
+ "id": "DCC1",
+ "name": "POIUYTGH-DCC1"
+ }, {"id": "DCC1a", "name": "POIUYTGH-DCC1a"}, {"id": "DCC1b", "name": "POIUYTGH-DCC1b"}, {
+ "id": "DCC2",
+ "name": "POIUYTGH-DCC2"
+ }, {"id": "DCC3", "name": "POIUYTGH-DCC3"}, {"id": "IAA1", "name": "QAZXSWED-IAA1"}, {
+ "id": "QWE1",
+ "name": "QWECLLI1-QWE1"
+ }, {"id": "NUM1", "name": "QWERTYUI-NUM1"}, {"id": "RAD1", "name": "RADICAL1-RAD1"}, {
+ "id": "RJN1",
+ "name": "RJNRBZAW-RJN1"
+ }, {"id": "SAA13", "name": "SAIT1AA9-SAA13"}, {"id": "SAA14", "name": "SAIT1AA9-SAA14"}, {
+ "id": "SDD81",
+ "name": "SAIT1DD6-SDD81"
+ }, {"id": "SDD82", "name": "SAIT1DD9-SDD82"}, {"id": "SAA11", "name": "SAIT9AA2-SAA11"}, {
+ "id": "SAA80",
+ "name": "SAIT9AA3-SAA80"
+ }, {"id": "SAA12", "name": "SAIT9AF8-SAA12"}, {"id": "SCC80", "name": "SAIT9CC3-SCC80"}, {
+ "id": "ATL75",
+ "name": "SANAAIRE-ATL75"
+ }, {"id": "ICC1", "name": "SANJITAT-ICC1"}, {"id": "SCK1", "name": "SCKSCKSK-SCK1"}, {
+ "id": "EHH78",
+ "name": "SDCSHHH5-EHH78"
+ }, {"id": "SAA78", "name": "SDCTAAA1-SAA78"}, {"id": "SAX78", "name": "SDCTAXG1-SAX78"}, {
+ "id": "SBX78",
+ "name": "SDCTBXG1-SBX78"
+ }, {"id": "SEE78", "name": "SDCTEEE4-SEE78"}, {"id": "SGG78", "name": "SDCTGGG1-SGG78"}, {
+ "id": "SXB78",
+ "name": "SDCTGXB1-SXB78"
+ }, {"id": "SJJ78", "name": "SDCTJJJ1-SJJ78"}, {"id": "SKK78", "name": "SDCTKKK1-SKK78"}, {
+ "id": "SLF78",
+ "name": "SDCTLFN1-SLF78"
+ }, {"id": "SLL78", "name": "SDCTLLL1-SLL78"}, {"id": "MAD11", "name": "SDFQWGKL-MAD11"}, {
+ "id": "HGD1",
+ "name": "SDFQWHGD-HGD1"
+ }, {"id": "SBB78", "name": "SDIT1BBB-SBB78"}, {"id": "SDG78", "name": "SDIT1BDG-SDG78"}, {
+ "id": "SBU78",
+ "name": "SDIT1BUB-SBU78"
+ }, {"id": "SHH78", "name": "SDIT1HHH-SHH78"}, {"id": "SJU78", "name": "SDIT1JUB-SJU78"}, {
+ "id": "SNA1",
+ "name": "SNANTXCA-SNA1"
+ }, {"id": "SAM1", "name": "SNDGCA64-SAN1"}, {"id": "SNG1", "name": "SNGPSIAU-SNG1"}, {
+ "id": "SSA56",
+ "name": "SSIT2AA7-SSA56"
+ }, {"id": "STG1", "name": "STTGGE62-STG1"}, {"id": "STT1", "name": "STTLWA02-STT1"}, {
+ "id": "SYD1",
+ "name": "SYDNAUBV-SYD1"
+ }, {"id": "ATL99", "name": "TEESTAAI-ATL43"}, {"id": "ATL98", "name": "TEESTAAI-ATL43"}, {
+ "id": "ATL76",
+ "name": "TELEPAAI-ATL76"
+ }, {"id": "ABC14", "name": "TESAAISA-ABC14"}, {"id": "TAT33", "name": "TESAAISA-TAT33"}, {
+ "id": "TAT34",
+ "name": "TESAAISB-TAT34"
+ }, {"id": "TAT37", "name": "TESAAISD-TAT37"}, {"id": "ATL62", "name": "TESSASCH-ATL62"}, {
+ "id": "TLP1",
+ "name": "TLPNXM18-TLP1"
+ }, {"id": "SAN13", "name": "TOKYJPFA-SAN13"}, {"id": "TOK1", "name": "TOKYJPFA-TOK1"}, {
+ "id": "TOL1",
+ "name": "TOLDOH21-TOL1"
+ }, {"id": "TOR1", "name": "TOROONXN-TOR1"}, {"id": "TOY1", "name": "TORYONNZ-TOY1"}, {
+ "id": "ATL35",
+ "name": "TTESSAAI-ATL35"
+ }, {"id": "TUF1", "name": "TUFCLLI1-TUF1"}, {"id": "SAI1", "name": "UBEKQLPD-SAI1"}, {
+ "id": "UUU4",
+ "name": "UUUAAAUU-UUU4"
+ }, {"id": "YYY1", "name": "UUUAIAAI-YYY1"}, {"id": "BAN1", "name": "VSDKYUTP-BAN1"}, {
+ "id": "WAS1",
+ "name": "WASHDCSW-WAS1"
+ }, {"id": "APP1", "name": "WBHGTYUI-APP1"}, {"id": "SUL2", "name": "WERTYUJK-SUL2"}, {
+ "id": "DEF2",
+ "name": "WSBHGTYL-DEF2"
+ }, {"id": "DHA12", "name": "WSXEDECF-DHA12"}, {"id": "MNT11", "name": "WSXEFBTH-MNT11"}, {
+ "id": "RAJ1",
+ "name": "YGBIJNLQ-RAJ1"
+ }, {"id": "JAG1", "name": "YUDFJULP-JAG1"}, {"id": "ZEN1", "name": "ZENCLLI1-ZEN1"}, {
+ "id": "ZOG1",
+ "name": "ZOGASTRO-ZOG1"
+ }, {"id": "SDE1", "name": "ZXCVBNMA-SDE1"}, {"id": "SIP1", "name": "ZXCVBNMK-SIP1"}, {
+ "id": "JUL1",
+ "name": "ZXCVBNMM-JUL1"
+ }, {"id": "ERT1", "name": "ertclli1-ERT1"}, {"id": "IOP1", "name": "iopclli1-IOP1"}, {
+ "id": "OPA1",
+ "name": "opaclli1-OPA1"
+ }, {"id": "RAI1", "name": "poiuytre-RAI1"}, {"id": "PUR1", "name": "purelyde-PUR1"}, {
+ "id": "RTY1",
+ "name": "rtyclli1-RTY1"
+ }, {"id": "SDF1", "name": "sdfclli1-SDF1"}, {"id": "SSW56", "name": "ss8126GT-SSW56"}, {
+ "id": "UIO1",
+ "name": "uioclli1-UIO1"
+ }],
+ "categoryParameters": {
+ "owningEntityList": [{
+ "id": "aaa1",
+ "name": "aaa1"
+ }, {"id": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", "name": "WayneHolland"}, {
+ "id": "Melissa",
+ "name": "Melissa"
+ }],
+ "projectList": [{"id": "WATKINS", "name": "WATKINS"}, {"id": "x1", "name": "x1"}, {"id": "yyy1", "name": "yyy1"}],
+ "lineOfBusinessList": [{"id": "ONAP", "name": "ONAP"}, {"id": "zzz1", "name": "zzz1"}],
+ "platformList": [{"id": "platform", "name": "platform"}, {"id": "xxx1", "name": "xxx1"}]
+ },
+ "type": "UPDATE_LCP_REGIONS_AND_TENANTS"
+ }
+ }
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/shared.tree.service.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/shared.tree.service.ts
new file mode 100644
index 000000000..5a023d55c
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/shared.tree.service.ts
@@ -0,0 +1,278 @@
+import {Injectable} from "@angular/core";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../../shared/store/reducers";
+import {ServiceInstanceActions} from "../../../shared/models/serviceInstanceActions";
+import {MessageBoxData} from "../../../shared/components/messageBox/messageBox.data";
+import {MessageBoxService} from "../../../shared/components/messageBox/messageBox.service";
+import * as _ from "lodash";
+import {DrawingBoardModes} from "../drawing-board.modes";
+import {AuditInfoModalComponent} from "../../../shared/components/auditInfoModal/auditInfoModal.component";
+import {VnfModelInfo} from "./models/vnf/vnf.model.info";
+import {ILevelNodeInfo} from "./models/basic.model.info";
+
+@Injectable()
+export class SharedTreeService {
+ private _sharedTreeService: SharedTreeService;
+ constructor(private _store: NgRedux<AppState>) {
+ }
+
+ /***********************************************************
+ * return if instance has missing data
+ * @param instance - vnf instance
+ * @param dynamicInputs - from the instance
+ * @param isEcompGeneratedNaming
+ ************************************************************/
+ selectedVNF: string = null;
+
+
+ getSelectedVNF(): string {
+ return this.selectedVNF;
+ }
+
+ setSelectedVNF(node): void {
+ if (_.isNil(node) || node.data.type !== 'VF') {
+ this.selectedVNF = null;
+ } else {
+ this.selectedVNF = node.data.vnfStoreKey;
+ }
+ }
+
+ hasMissingData(instance, dynamicInputs: any, isEcompGeneratedNaming: boolean, requiredFields: string[]): boolean {
+ if (!isEcompGeneratedNaming && _.isEmpty(instance.instanceName)) {
+ return true;
+ }
+
+ for (let field of requiredFields) {
+ if (_.isEmpty(instance[field])) {
+ return true;
+ }
+ }
+
+ for (let field of dynamicInputs) {
+ if (field.isRequired && !_.isNil(instance.instanceParams) && _.isEmpty(instance.instanceParams[0][field.id])) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+
+ addingStatusProperty(node) {
+ node['statusProperties'] = [];
+ node['statusProperties'].push({key: 'Prov Status:', value: node.provStatus, testId: 'provStatus'});
+ node['statusProperties'].push({key: 'Orch Status:', value: node.orchStatus, testId: 'orchStatus'});
+ if (node.inMaint) {
+ node['statusProperties'].push({key: 'In-maintenance', value: '', testId: 'inMaint'});
+ }
+ return node;
+ }
+
+ /**********************************************
+ * should delete or remove child instance's
+ "new" -> should remove
+ !new" -> should change action status
+ **********************************************/
+ removeDeleteAllChild(node, serviceModelId: string, callback): void {
+ for (let nodeChild of node.children) {
+ if (nodeChild.data.action === ServiceInstanceActions.Create) {
+ if (!_.isNil(nodeChild.data) && !_.isNil(nodeChild.data.menuActions) && !_.isNil(nodeChild.data.menuActions['remove'])) {
+ nodeChild.data.menuActions['remove']['method'](nodeChild, serviceModelId);
+ }
+ } else {
+ if (!_.isNil(nodeChild.data) && !_.isNil(nodeChild.data.menuActions) && !_.isNil(nodeChild.data.menuActions['delete'])) {
+ nodeChild.data.menuActions['delete']['method'](nodeChild, serviceModelId);
+ }
+ }
+ }
+ callback(node, serviceModelId);
+ }
+
+
+ /**********************************************
+ * should undo delete child instance's
+ **********************************************/
+ undoDeleteAllChild(node, serviceModelId: string, callback): void {
+ for (let nodeChild of node.children) {
+ if (!_.isNil(nodeChild.data) && !_.isNil(nodeChild.data.menuActions) && !_.isNil(nodeChild.data.menuActions['undoDelete'])) {
+ nodeChild.data.menuActions['undoDelete']['method'](nodeChild, serviceModelId);
+ }
+ }
+ callback(node, serviceModelId);
+ }
+
+ /**********************************************
+ * should return true if can delete
+ **********************************************/
+ shouldShowDelete(node): boolean {
+ const mode = this._store.getState().global.drawingBoardStatus;
+ if (!_.isNil(node) && !_.isNil(node.data) && !_.isNil(node.data.action) && !_.isNil(node.data.menuActions['delete'])) {
+ if (mode !== DrawingBoardModes.EDIT || node.data.action === ServiceInstanceActions.Create) {
+ return false;
+ } else if (node.data.action === ServiceInstanceActions.None) {
+ return true
+ }
+ return false;
+ }
+ return false;
+ }
+
+ /**********************************************
+ * should return true if can undo delete
+ **********************************************/
+ shouldShowUndoDelete(node): boolean {
+ const mode = this._store.getState().global.drawingBoardStatus;
+ if (mode === DrawingBoardModes.EDIT && !_.isNil(node.data.action) && !_.isNil(node.data.menuActions['undoDelete'])) {
+ if (node.data.action === ServiceInstanceActions.Create || node.data.action === ServiceInstanceActions.Delete) {
+ return false;
+ } else if (node.data.action.split('_').pop() === 'Delete') {
+ return true
+ }
+ return false;
+ }
+ return false;
+ }
+ /**********************************************
+ * should return true if can remove or edit
+ * enabled only on edit/design mode and for new instances
+ **********************************************/
+ shouldShowRemoveAndEdit(node): boolean {
+ const mode = this._store.getState().global.drawingBoardStatus;
+ if (!_.isNil(node) && !_.isNil(node.data) && !_.isNil(node.data.action) && node.data.action === ServiceInstanceActions.Create &&
+ mode !== DrawingBoardModes.VIEW && mode !== DrawingBoardModes.RETRY) {
+ return true;
+ }
+ return false;
+ }
+ /**********************************************
+ * should return true if can duplicate by mode
+ **********************************************/
+ shouldShowDuplicate(node): boolean {
+ const mode = this._store.getState().global.drawingBoardStatus;
+ return !mode.includes('RETRY');
+ }
+
+ /**********************************************
+ * should return true if can audit info
+ **********************************************/
+ shouldShowAuditInfo(node): boolean {
+ return this.isRetryMode() || (!_.isNil(node.data) && !_.isNil(node.data.action) && node.data.action !== ServiceInstanceActions.Create);
+ }
+
+
+ isRetryMode(): boolean {
+ const mode = this._store.getState().global.drawingBoardStatus;
+ return mode.includes('RETRY');
+ }
+
+
+ /**********************************************
+ * should return true if can add node instances
+ **********************************************/
+ shouldShowAddIcon(): boolean{
+ const mode = this._store.getState().global.drawingBoardStatus;
+ return mode === DrawingBoardModes.EDIT || mode=== DrawingBoardModes.CREATE;
+ }
+ /************************************************
+ return number of instances with action Delete
+ @type: vnfs networks, vngGroups (not vfModule)
+ @node : node model from the left tree
+ ************************************************/
+ getExistingInstancesWithDeleteMode(node, serviceModelId: string, type: string): number {
+ let counter = 0;
+ const existingInstances = this._store.getState().service.serviceInstance[serviceModelId][type];
+ const modelUniqueId = node.data.modelUniqueId;
+ if (!_.isNil(existingInstances)) {
+ for (let instanceKey in existingInstances) {
+ if (!_.isNil(existingInstances[instanceKey].action)) {
+ if (existingInstances[instanceKey].modelInfo.modelUniqueId === modelUniqueId && existingInstances[instanceKey].action.split('_').pop() === 'Delete') {
+ counter++;
+ }
+ }
+ }
+ }
+ return counter;
+ }
+
+
+ isServiceOnDeleteMode(serviceId: string): boolean {
+ return this._store.getState().service.serviceInstance[serviceId].action === ServiceInstanceActions.Delete;
+ }
+
+
+ openModal(node : any | any[] , serviceModelId : string, cb : Function) : void {
+ let type: string = _.isArray(node) ? 'Service' : node.data.typeName;
+ let messageBoxData: MessageBoxData = new MessageBoxData(
+ "Mark for Delete",
+ `You are about to mark for delete this ${type} this will also mark all its children and remove all new instances just added`,
+ <any>"warning",
+ <any>"md",
+ [
+ {
+ text: "Mark and remove",
+ size: "large",
+ callback: cb.bind(this, node, serviceModelId),
+ closeModal: true
+ },
+ {text: "Don’t Remove", size: "medium", closeModal: true}
+ ]);
+
+ MessageBoxService.openModal.next(messageBoxData);
+ }
+
+ someChildHasCreateAction(nodes: any | any[]) : boolean {
+ let nodesArr = _.isArray(nodes) ? nodes : [nodes];
+ for(const node of nodesArr){
+ if(node.action === ServiceInstanceActions.Create) {return true;}
+ if(node.children){
+ for (let nodeChild of node.children) {
+ if (nodeChild.action === ServiceInstanceActions.Create) {
+ return true;
+ }
+ if(nodeChild.children && nodeChild.children.length > 0){
+ for(let child of nodeChild.children){
+ let hasCreateAction = this.someChildHasCreateAction(child);
+ if(hasCreateAction) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ shouldShowDeleteInstanceWithChildrenModal(node : any | any[] , serviceModelId : string, cb : Function) : void {
+ if(this.someChildHasCreateAction(node)){
+ this.openModal(node , serviceModelId, cb);
+ }else {
+ cb(node, serviceModelId)
+ }
+ }
+
+
+ isFailed(node): boolean {
+ return !_.isNil(node.data) ? node.data.isFailed : false;
+ }
+
+ /************************************************
+ in a case the node is failed e.g. not instantiated correctly
+ the function will call to openRetryInstanceAuditInfoModal
+ @node : node model from the left tree
+ @serviceModelId : serviceModelId
+ @instance : instance
+ @instanceType: instanceType
+ @modelInfoService : the model (vnf, vfmodule, network, vnfgroup)object that call to the function (this)
+ ************************************************/
+ openAuditInfoModal(node, serviceModelId, instance, instanceType, modelInfoService : ILevelNodeInfo){
+ let isInstanceFailed = this.isFailed(node);
+ AuditInfoModalComponent.openInstanceAuditInfoModal.next({
+ instanceId: serviceModelId,
+ type: instanceType,
+ model: modelInfoService.getModel(node.data.modelName, instance, this._store.getState().service.serviceHierarchy[serviceModelId]),
+ instance,
+ isInstanceFailed,
+ trackById: instance.trackById
+ });
+ }
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/search/search.component.html b/vid-webpack-master/src/app/drawingBoard/service-planning/search/search.component.html
new file mode 100644
index 000000000..0222b8097
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/search/search.component.html
@@ -0,0 +1,8 @@
+<div class="search-container">
+ <sdc-filter-bar
+ [placeHolder]="'Search...'"
+ [debounceTime]="250"
+ [testId]="inputTestId"
+ (valueChange)="searchTree($event)">
+ </sdc-filter-bar>
+</div>
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/search/search.component.scss b/vid-webpack-master/src/app/drawingBoard/service-planning/search/search.component.scss
new file mode 100644
index 000000000..5d9996256
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/search/search.component.scss
@@ -0,0 +1,3 @@
+.search-container {
+ min-width: 40px;
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/search/search.component.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/search/search.component.spec.ts
new file mode 100644
index 000000000..754dd6690
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/search/search.component.spec.ts
@@ -0,0 +1,93 @@
+import {ComponentFixture, TestBed} from '@angular/core/testing';
+import {HttpClientTestingModule} from '@angular/common/http/testing';
+import {CUSTOM_ELEMENTS_SCHEMA} from "@angular/core";
+import {SearchComponent} from "./search.component";
+import {FormsModule, ReactiveFormsModule} from "@angular/forms";
+
+describe('Spinner component', () => {
+
+ let component: SearchComponent;
+ let fixture: ComponentFixture<SearchComponent>;
+
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+ imports: [FormsModule, ReactiveFormsModule, HttpClientTestingModule],
+ providers: [],
+ declarations: [SearchComponent],
+ schemas: [CUSTOM_ELEMENTS_SCHEMA]
+ });
+ await TestBed.compileComponents();
+
+ fixture = TestBed.createComponent(SearchComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+
+ })().then(done).catch(done.fail));
+
+
+ test('component should be defined', () => {
+ expect(component).toBeDefined();
+ });
+
+ test('searchTree should return all nodes that include some text: with text', () => {
+ component.nodes = [
+ {
+ name: 'name_1'
+ },
+ {
+ name: 'name_2'
+ },
+ {
+ name: 'name_3'
+ },
+ {
+ name: 'name_3'
+ }];
+ jest.spyOn(component.updateNodes, 'emit');
+ spyOn(component, 'expandParentByNodeId').and.stub();
+ component.searchTree('name_1');
+
+ expect(component.updateNodes.emit).toHaveBeenCalledWith({
+ nodes: [
+ {
+ name: 'name_1'
+ },
+ {
+ name: 'name_2'
+ },
+ {
+ name: 'name_3'
+ },
+ {
+ name: 'name_3'
+ }],
+ filterValue: 'name_1'
+ });
+ });
+
+ test('searchTree should return all nodes that include some text: without text', () => {
+ component.nodes = [
+ {
+ name: 'name_1',
+ children: [
+ {
+ name: 'name_child_1'
+ }
+ ]
+ },
+ {
+ name: 'name_2'
+ },
+ {
+ name: 'name_3'
+ },
+ {
+ name: 'name_4'
+ }];
+ jest.spyOn(component.updateNodes, 'emit');
+ spyOn(component, 'expandParentByNodeId').and.stub();
+ component.searchTree('');
+
+ expect(component.updateNodes.emit).toHaveBeenCalled();
+ });
+});
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/search/search.component.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/search/search.component.ts
new file mode 100644
index 000000000..19edbcd09
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/search/search.component.ts
@@ -0,0 +1,50 @@
+import {Component, EventEmitter, Input, Output} from "@angular/core";
+import {IDType, ITreeNode} from "angular-tree-component/dist/defs/api";
+import * as _ from 'lodash';
+
+@Component({
+ selector: 'search-component',
+ templateUrl: './search.component.html',
+ styleUrls: ['./search.component.scss']
+})
+export class SearchComponent {
+ @Input() tree;
+ @Input() nodes;
+ @Input() inputTestId: string;
+
+ @Output() updateNodes: EventEmitter<any> = new EventEmitter();
+
+ searchTree(searchText: string): void {
+ if(_.isNil(searchText)){
+ return;
+ }
+ let __this = this;
+ let results: ITreeNode[] = [];
+ this.nodes.forEach( (node) => {
+ __this.searchTreeNode(node, searchText, results);
+ });
+ results.forEach(function (result) {
+ __this.expandParentByNodeId(result.id)
+ });
+ this.updateNodes.emit({
+ nodes: this.nodes,
+ filterValue: searchText
+ });
+ return;
+ }
+
+ expandParentByNodeId(id: IDType): void {
+ this.tree.treeModel.getNodeById(id).parent.expand();
+ }
+
+ searchTreeNode(node, searchText: string, results): void {
+ if (node.name.toLowerCase().indexOf(searchText.toLowerCase()) != -1) {
+ results.push(node);
+ }
+ if (node.children != null) {
+ for (let i = 0; i < node.children.length; i++) {
+ this.searchTreeNode(node.children[i], searchText, results);
+ }
+ }
+ }
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/service-planning.component.html b/vid-webpack-master/src/app/drawingBoard/service-planning/service-planning.component.html
index 5b2f22d5f..059937f6d 100644
--- a/vid-webpack-master/src/app/drawingBoard/service-planning/service-planning.component.html
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/service-planning.component.html
@@ -1,13 +1,13 @@
-<div class="service-planning-header">
- <drawing-board-header></drawing-board-header>
-</div>
-<div class="service-planning-content row">
- <available-models-tree class="left-side col-md-6" (highlightInstances)="highlightInstancesBySelectingNode($event)"></available-models-tree>
- <!--<no-content-message-and-icon *ngIf="!isShowTree()" class="span-over"-->
- <!--data-title="Please add objects (VNFs, network, modules etc.) from the left tree to design the service instance"-->
- <!--subtitle="Once done, click Deploy to start instantiation"-->
- <!--iconPath="./img/UPLOAD.svg"-->
- <!--iconClass="upload-icon-service-planing"></no-content-message-and-icon>-->
- <drawing-board-tree *ngIf="isShowTree()" class="span-over col-md-6" (highlightNode)="highlightNodeBySelectingInstance($event)"></drawing-board-tree>
+<div [attr.id]="pageMode" clickOutside [classElements]="['angular-tree-component']" (clickOutsideTrigger)="clickOutside();">
+ <div class="service-planning-header" >
+ <drawing-board-header></drawing-board-header>
+ </div>
+ <div class="service-planning-content">
+ <available-models-tree class="left-side" [ngClass]="isShowComponentInfo() ?'col-md-5':'col-md-6'"
+ (highlightInstances)="highlightInstancesBySelectingNode($event)"></available-models-tree>
+ <drawing-board-tree *ngIf="isShowTree()" class="span-over" [ngClass]="isShowComponentInfo() ?'col-md-5':'col-md-6'" (highlightNode)="highlightNodeBySelectingInstance($event)"></drawing-board-tree>
+ <component-info *ngIf="isShowComponentInfo()" class="col-md-2"></component-info>
+ </div>
+
</div>
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/service-planning.component.scss b/vid-webpack-master/src/app/drawingBoard/service-planning/service-planning.component.scss
index 69546a6c0..641af7acb 100644
--- a/vid-webpack-master/src/app/drawingBoard/service-planning/service-planning.component.scss
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/service-planning.component.scss
@@ -2,6 +2,8 @@
.service-planning-content {
display: flex;
flex: 1;
+ position: relative;
+ z-index: 0;
}
.span-over {
@@ -14,3 +16,13 @@
height: 117px;
margin-top: 32px;
}
+
+component-info {
+ border-left: 1px solid #D2D2D2;
+ height: calc(100vh - 60px);
+ overflow: auto;
+
+ &.col-md-2{
+ padding: 0;
+ }
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/service-planning.component.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/service-planning.component.ts
index 1ce0e8100..cbe8445ca 100644
--- a/vid-webpack-master/src/app/drawingBoard/service-planning/service-planning.component.ts
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/service-planning.component.ts
@@ -1,8 +1,17 @@
-import {Component, ViewChild} from '@angular/core';
-import {DrawingBoardTreeComponent} from "../drawing-board-tree/drawing-board-tree.component";
-import {AvailableModelsTreeComponent} from "../available-models-tree/available-models-tree.component";
+import {Component, OnInit, ViewChild} from '@angular/core';
+import {DrawingBoardTreeComponent} from "./drawing-board-tree/drawing-board-tree.component";
+import {AvailableModelsTreeComponent} from "./available-models-tree/available-models-tree.component";
import {ITreeNode} from "angular-tree-component/dist/defs/api";
import {TreeComponent} from 'angular-tree-component';
+import {ActivatedRoute} from "@angular/router";
+import * as _ from 'lodash';
+import {DrawingBoardModes} from "./drawing-board.modes";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../shared/store/reducers";
+import {updateDrawingBoardStatus} from "../../shared/storeUtil/utils/global/global.actions";
+import {FeatureFlagsService, Features} from "../../shared/services/featureFlag/feature-flags.service";
+import {ComponentInfoService} from "./component-info/component-info.service";
+import {ComponentInfoModel, ComponentInfoType} from "./component-info/component-info-model";
@Component({
selector: 'service-planning',
@@ -10,8 +19,13 @@ import {TreeComponent} from 'angular-tree-component';
styleUrls: ['./service-planning.component.scss']
})
-export class ServicePlanningComponent {
+export class ServicePlanningComponent implements OnInit {
+ constructor(private route: ActivatedRoute,
+ private store: NgRedux<AppState>) {
+ }
+
+ pageMode: DrawingBoardModes = DrawingBoardModes.CREATE;
@ViewChild(DrawingBoardTreeComponent) drawingModelTree;
@ViewChild(AvailableModelsTreeComponent) availableModelTree;
@@ -20,18 +34,23 @@ export class ServicePlanningComponent {
}
public highlightNodeBySelectingInstance(modelId: number): void {
- this.availableModelTree.tree.treeModel.getNodeBy((node: ITreeNode) => node.data.id === modelId)
- .setActiveAndVisible().expand();
+ // modelId might be undefined, e.g., if selected instance has no source in model
+ let matchInstance = modelId ? this.availableModelTree.tree.treeModel.getNodeBy((node: ITreeNode) => (node.data.modelUniqueId) === modelId) : undefined;
+ if (matchInstance) {
+ matchInstance.setActiveAndVisible().expand();
+ } else {
+ this.clearSelectionInTree(this.availableModelTree.tree);
+ }
}
- public highlightInstancesBySelectingNode(id: number): void {
- if(this.isShowTree()) {
+ public highlightInstancesBySelectingNode(uniqueId: string): void {
+ if (this.isShowTree()) {
let _this = this;
- let matchInstances = _this.searchTree(id);
+ let matchInstances = _this.searchTree(uniqueId);
if (!matchInstances.length)
_this.clearSelectionInTree(_this.drawingModelTree.tree);
matchInstances.forEach(function (instance, index) {
- let multi : boolean = !!index;
+ let multi: boolean = !!index;
_this.drawingModelTree.tree.treeModel.getNodeById(instance.id)
.setActiveAndVisible(multi).expand();
});
@@ -44,34 +63,47 @@ export class ServicePlanningComponent {
activateNode ? activateNode.toggleActivated().blur() : null;
}
- searchTree(modelId: number) {
+ searchTree(uniqueId: string) {
let _this = this;
let results = [];
let nodes = _this.drawingModelTree.nodes;
nodes.forEach(function (node) {
- _this.searchTreeNode(node, modelId, results);
+ _this.searchTreeNode(node, uniqueId, results);
});
return results;
}
- searchTreeNode(node, modelId: number, results): void {
- if(node.modelId === modelId){
+ searchTreeNode(node, uniqueId: string, results): void {
+ if ((node.modelUniqueId) === uniqueId) {
results.push(node);
}
- if (node.children != null){
- for(let i = 0; i < node.children.length; i++){
- this.searchTreeNode(node.children[i], modelId, results);
+
+ if (node.children != null) {
+ for (let i = 0; i < node.children.length; i++) {
+ this.searchTreeNode(node.children[i], uniqueId, results);
}
}
}
+ ngOnInit(): void {
+ this.pageMode = (!_.isNil(this.route.routeConfig.path) && this.route.routeConfig.path !== "") ? this.route.routeConfig.path as DrawingBoardModes : DrawingBoardModes.CREATE;
+ this.store.dispatch(updateDrawingBoardStatus(this.pageMode));
+ }
+
+ isShowComponentInfo():boolean {
+ return FeatureFlagsService.getFlagState(Features.FLAG_1906_COMPONENT_INFO, this.store)
+ }
+ clickOutside(): void{
+ this.clearSelectionInTree(this.drawingModelTree.tree);
+ this.clearSelectionInTree(this.availableModelTree.tree);
+ ComponentInfoService.triggerComponentInfoChange.next(new ComponentInfoModel(ComponentInfoType.SERVICE, [], []))
+ }
}
export class ServicePlanningEmptyComponent extends ServicePlanningComponent {
- isShowTree() : boolean {
+ isShowTree(): boolean {
return false;
}
}
-
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/typeNodeInformation.model.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/typeNodeInformation.model.spec.ts
new file mode 100644
index 000000000..a6d3b5398
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/typeNodeInformation.model.spec.ts
@@ -0,0 +1,59 @@
+import {TestBed, getTestBed} from '@angular/core/testing';
+import {
+ HttpClientTestingModule,
+} from '@angular/common/http/testing';
+import {TypeNodeInformation} from "./typeNodeInformation.model";
+
+describe('Available Models Tree Service', () => {
+ let injector;
+ beforeEach(() => {
+
+ TestBed.configureTestingModule({
+ imports: [HttpClientTestingModule],
+ providers: []
+ }).compileComponents();
+
+ injector = getTestBed();
+ });
+
+
+ test('TypeNodeInformation VNF', () => {
+ let type: TypeNodeInformation = new TypeNodeInformation(<any>{
+ data: {
+ type: 'VF'
+ }
+ });
+ expect(type.hierarchyName).toEqual('vnfs');
+ expect(type.existingMappingCounterName).toEqual('existingVNFCounterMap');
+ });
+
+ test('TypeNodeInformation VNF group', () => {
+ let type: TypeNodeInformation = new TypeNodeInformation(<any>{
+ data: {
+ type: 'VnfGroup'
+ }
+ });
+ expect(type.hierarchyName).toEqual('vnfGroups');
+ expect(type.existingMappingCounterName).toEqual('existingVnfGroupCounterMap');
+ });
+
+ test('TypeNodeInformation VL', () => {
+ let type: TypeNodeInformation = new TypeNodeInformation(<any>{
+ data: {
+ type: 'VL'
+ }
+ });
+ expect(type.hierarchyName).toEqual('networks');
+ expect(type.existingMappingCounterName).toEqual('existingNetworksCounterMap');
+ });
+
+ test('TypeNodeInformation Network', () => {
+ let type: TypeNodeInformation = new TypeNodeInformation(<any>{
+ data: {
+ type: 'Network'
+ }
+ });
+ expect(type.hierarchyName).toEqual('networks');
+ expect(type.existingMappingCounterName).toEqual('existingNetworksCounterMap');
+ });
+});
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/typeNodeInformation.model.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/typeNodeInformation.model.ts
new file mode 100644
index 000000000..e8e22a422
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/typeNodeInformation.model.ts
@@ -0,0 +1,39 @@
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import * as _ from 'lodash';
+
+export class TypeNodeInformation {
+ hierarchyName: string;
+ existingMappingCounterName: string;
+
+ constructor(node: ITreeNode) {
+ if (!_.isNil(node)) {
+ switch (node.data.type) {
+ case 'VF' : {
+ this.hierarchyName = 'vnfs';
+ this.existingMappingCounterName = 'existingVNFCounterMap';
+ break;
+ }
+ case 'VnfGroup' : {
+ this.hierarchyName = 'vnfGroups';
+ this.existingMappingCounterName = 'existingVnfGroupCounterMap';
+ break;
+ }
+ case 'VL' : {
+ this.hierarchyName = 'networks';
+ this.existingMappingCounterName = 'existingNetworksCounterMap';
+ break;
+ }
+ case 'Network': {
+ this.hierarchyName = 'networks';
+ this.existingMappingCounterName = 'existingNetworksCounterMap';
+ break;
+ }
+ default : {
+ console.error("Node type is not recognize");
+ }
+ }
+ }
+ }
+}
+
+
diff --git a/vid-webpack-master/src/app/factories/models/requestDetails.model.ts b/vid-webpack-master/src/app/factories/models/requestDetails.model.ts
index 4ccc4781b..1663f7af7 100644
--- a/vid-webpack-master/src/app/factories/models/requestDetails.model.ts
+++ b/vid-webpack-master/src/app/factories/models/requestDetails.model.ts
@@ -14,6 +14,7 @@ export class ModelInfo {
modelVersion: string;
modelCustomizationId: string;
modelCustomizationName: string;
+ customizationUuid: string;
}
export class RequestParameters {
@@ -109,7 +110,7 @@ export class RootObject {
// “relatedInstance”: {
// “instanceId”: “{instanceGroupId}”,
// “modelInfo”: {
-// “modelType”: “networkCollection”,
+// “modelType”: “networkInstanceGroup”,
// “modelInvariantId”: “9ea660dc-155f-44d3-b45c-cc7648b4f31c”,
// “modelVersionId”: “bb07aad1-ce2d-40c1-85cb-5392f76bb1ef”,
// “modelName”: “{network collection model name}”,
diff --git a/vid-webpack-master/src/app/factories/mso.factory.spec.ts b/vid-webpack-master/src/app/factories/mso.factory.spec.ts
index 16efd2970..75f205804 100644
--- a/vid-webpack-master/src/app/factories/mso.factory.spec.ts
+++ b/vid-webpack-master/src/app/factories/mso.factory.spec.ts
@@ -1,24 +1,25 @@
import {createRequest} from './mso.factory';
-sessionStorage.setItem("msoRequestParametersTestApiValue","GR_API");
+
describe('Vlantagging', () => {
- it('should create a correct request', (done: DoneFn) => {
+ test('should create a correct request', () => {
+ sessionStorage.setItem("msoRequestParametersTestApiValue","GR_API");
let userInputs_withEcompGeneratedNaming = {
"productFamily": "e433710f-9217-458d-a79d-1c7aff376d89",
- "lcpRegion": "AAIAIC25",
+ "lcpRegion": "JANET25",
"tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
"aicZone": "YYY1",
"platformName": "plat1",
- "lineOfBusiness": "ecomp"
+ "lineOfBusiness": "onap"
};
let userInputs_withoutEcompGeneratedNaming = {
"instanceName": "New Name",
"productFamily": "e433710f-9217-458d-a79d-1c7aff376d89",
- "lcpRegion": "AAIAIC25",
+ "lcpRegion": "JANET25",
"tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
"aicZone": "YYY1",
"platformName": "plat1",
- "lineOfBusiness": "ecomp"
+ "lineOfBusiness": "onap"
};
let service = {
"service": {
@@ -249,9 +250,9 @@ describe('Vlantagging', () => {
"requestorId": "az2016",
"suppressRollback": false
},
- "lineOfBusiness": Object({ lineOfBusinessName: "ecomp" }),
+ "lineOfBusiness": Object({ lineOfBusinessName: "onap" }),
"cloudConfiguration": {
- "lcpCloudRegionId": "AAIAIC25",
+ "lcpCloudRegionId": "JANET25",
"tenantId": "092eb9e8e4b7412e8787dd091bc58e86"
},
"platform": Object({ platformName: "plat1" }),
@@ -285,11 +286,7 @@ describe('Vlantagging', () => {
"relatedInstance": {
"instanceId": "AAI-12002-test3-vm230w",
"modelInfo": {
- "modelName": "oam_group",
- "modelType": "networkCollection",
- "modelVersion": "1",
- "modelVersionId": "a0efd5fc-f7be-4502-936a-a6c6392b958f",
- "modelInvariantId": "9384abf9-1231-4da4-bd8d-89e4d2f8a749"
+ "modelType": "networkInstanceGroup"
}
}
},
@@ -297,11 +294,7 @@ describe('Vlantagging', () => {
"relatedInstance": {
"instanceId": "AAI-12002-test3-vm230w",
"modelInfo": {
- "modelName": "oam_group",
- "modelType": "networkCollection",
- "modelVersion": "1",
- "modelVersionId": "a0efd5fc-f7be-4502-936a-a6c6392b958f",
- "modelInvariantId": "9384abf9-1231-4da4-bd8d-89e4d2f8a749"
+ "modelType": "networkInstanceGroup"
}
}
}
@@ -314,6 +307,6 @@ describe('Vlantagging', () => {
expectedResult["requestInfo"]["instanceName"] = "New Name";
let actualResult_withoutEcompGeneratedNaming = <any>createRequest("az2016",userInputs_withoutEcompGeneratedNaming, service, serviceInstanceId, networkInstanceGroups,'vDBE 0','1');
expect(actualResult_withoutEcompGeneratedNaming).toEqual(expectedResult);
- done();
+ sessionStorage.removeItem("msoRequestParametersTestApiValue");
});
});
diff --git a/vid-webpack-master/src/app/factories/mso.factory.ts b/vid-webpack-master/src/app/factories/mso.factory.ts
index c26296edf..ebca83412 100644
--- a/vid-webpack-master/src/app/factories/mso.factory.ts
+++ b/vid-webpack-master/src/app/factories/mso.factory.ts
@@ -1,4 +1,12 @@
-import { RequestInfo, RequestDetails, ModelInfo, CloudConfiguration, LineOfBusiness, Platform, RelatedInstanceList, VfcModel } from "./models/requestDetails.model";
+import {
+ CloudConfiguration,
+ LineOfBusiness,
+ ModelInfo,
+ Platform,
+ RelatedInstanceList,
+ RequestDetails,
+ RequestInfo
+} from "./models/requestDetails.model";
import * as _ from "lodash";
function extractModelInfoFromNodeTemplate(node: any, type: string) {
@@ -33,10 +41,6 @@ function extractPlatform(userInputs: any): Platform {
return platform;
}
-function extractVfcGroupModelAccordingToUuid(vnfModel: any, vfcUuid: string) {
- return _.find(vnfModel.vfcInstanceGroups, { uuid: vfcUuid });
-}
-
function extractLineOfBusiness(userInputs: any) {
let lob: LineOfBusiness = <LineOfBusiness>{};
lob.lineOfBusinessName = userInputs["lineOfBusiness"];
@@ -50,13 +54,9 @@ function extractCloudConfiguration(userInputs: any) {
return cloudConfig;
}
-function extractModelInfoFromVfcNode(vfcModel: VfcModel): ModelInfo {
+function extractModelInfoFromVfcNode(): ModelInfo {
let modelinfo: ModelInfo = <ModelInfo>{};
- modelinfo.modelName = vfcModel.name;
- modelinfo.modelType = "networkCollection";
- modelinfo.modelVersion = vfcModel.version;
- modelinfo.modelVersionId = vfcModel.uuid;
- modelinfo.modelInvariantId = vfcModel.invariantUuid;
+ modelinfo.modelType = "networkInstanceGroup";
return modelinfo;
}
@@ -77,12 +77,10 @@ export function createRequest(userId: string, userInputs: any, service: any, ser
};
request.relatedInstanceList.push(serviceRelatedInstance);
_.forOwn(networkInstanceGroups, function(group) {
- let modelUuid = group["instance-group"]["model-version-id"];
- let vfcModel = extractVfcGroupModelAccordingToUuid(service.vnfs[vnfCustomizationName], modelUuid);
let networkInstanceGroup: RelatedInstanceList = {
relatedInstance: {
instanceId: group["instance-group"].id,
- modelInfo: extractModelInfoFromVfcNode(vfcModel)
+ modelInfo: extractModelInfoFromVfcNode()
}
};
request.relatedInstanceList.push(networkInstanceGroup);
diff --git a/vid-webpack-master/src/app/featureFlag/directive/basic/basic.featureFlag.directive.spec.ts b/vid-webpack-master/src/app/featureFlag/directive/basic/basic.featureFlag.directive.spec.ts
new file mode 100644
index 000000000..5722aa795
--- /dev/null
+++ b/vid-webpack-master/src/app/featureFlag/directive/basic/basic.featureFlag.directive.spec.ts
@@ -0,0 +1,93 @@
+import {TestBed, ComponentFixture, tick, inject} from '@angular/core/testing';
+import {Component, DebugElement, Renderer2, Type} from "@angular/core";
+import {By} from "@angular/platform-browser";
+import {BasicFeatureFlagDirective} from "./basic.featureFlag.directive";
+import {FeatureFlagService} from "../../service/featureFlag.service";
+import {ConfigurationService} from "../../../shared/services/configuration.service";
+import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing";
+import {NgRedux} from "@angular-redux/store";
+import {of} from "rxjs";
+
+@Component({
+ template: `
+ <div
+ id="featureFlagOff"
+ featureFlag
+ [flagName]='"featureFlagOff"'>
+ </div>
+ <div
+ id="featureFlagOn"
+ featureFlag
+ [flagName]='"featureFlagOn"'>
+ </div>`
+})
+class TestFeatureFlagComponent {
+}
+
+class MockRenderer<T> {
+ setStyle() {
+
+ }
+}
+
+class MockAppStore<T> {
+ getState() {
+ return {
+ global: {
+ flags : {
+
+ }
+ }
+ }
+ }
+}
+
+
+describe('Basic Feature Flag Directive', () => {
+ let component: TestFeatureFlagComponent;
+ let fixture: ComponentFixture<TestFeatureFlagComponent>;
+ let directiveInstance: BasicFeatureFlagDirective;
+ let elementOff: DebugElement;
+ let elementOn: DebugElement;
+
+ beforeEach(() => {
+ TestBed.configureTestingModule({
+ imports: [
+ HttpClientTestingModule
+ ],
+ declarations: [
+ TestFeatureFlagComponent,
+ BasicFeatureFlagDirective],
+ providers: [
+ FeatureFlagService,
+ ConfigurationService,
+ {provide: NgRedux, useClass: MockAppStore},
+ {provide: Renderer2, useClass: MockRenderer}]
+ }).compileComponents();
+
+ fixture = TestBed.createComponent(TestFeatureFlagComponent);
+ component = fixture.componentInstance;
+ elementOff = fixture.debugElement.query(By.css('#featureFlagOff'));
+ elementOn = fixture.debugElement.query(By.css('#featureFlagOn'));
+ directiveInstance = elementOff.injector.get(BasicFeatureFlagDirective);
+ });
+
+
+ test('directive should be defined', () => {
+ expect(directiveInstance).toBeDefined();
+ });
+
+ test('should hide element if feature flag is off', () => {
+ directiveInstance.flagName = 'featureFlagOff';
+
+ directiveInstance.ngAfterContentChecked();
+ expect(elementOff.nativeElement.style.display).toEqual('none');
+ });
+
+ test('should show element if feature flag is on', () => {
+ directiveInstance.flagName = 'featureFlagOn';
+
+ directiveInstance.ngAfterContentChecked();
+ expect(elementOn.nativeElement.style.display).toEqual('');
+ });
+});
diff --git a/vid-webpack-master/src/app/featureFlag/directive/basic/basic.featureFlag.directive.ts b/vid-webpack-master/src/app/featureFlag/directive/basic/basic.featureFlag.directive.ts
new file mode 100644
index 000000000..e6cbb4f17
--- /dev/null
+++ b/vid-webpack-master/src/app/featureFlag/directive/basic/basic.featureFlag.directive.ts
@@ -0,0 +1,29 @@
+import {AfterContentChecked, Directive, ElementRef, Input} from '@angular/core';
+import {FeatureFlagService} from "../../service/featureFlag.service";
+import * as _ from 'lodash';
+
+/************************************************************************
+ Feature Flag Directive
+ Example:
+ <div featureFlag [flagName]='"<flag name>"'></div>
+ ************************************************************************/
+@Directive({
+ selector: '[featureFlag]'
+})
+export class BasicFeatureFlagDirective implements AfterContentChecked {
+ @Input() flagName: string;
+ element: ElementRef;
+
+ constructor(el: ElementRef, private _featureToggleService: FeatureFlagService) {
+ this.element = el;
+ }
+
+ ngAfterContentChecked(): void {
+ if (!_.isNil(this.element)) {
+ const isFeatureOn: boolean = this._featureToggleService.isFeatureOn(this.flagName);
+ if(!isFeatureOn){
+ this._featureToggleService.hideElement(this.element)
+ }
+ }
+ }
+}
diff --git a/vid-webpack-master/src/app/featureFlag/featureFlag.module.ts b/vid-webpack-master/src/app/featureFlag/featureFlag.module.ts
new file mode 100644
index 000000000..d22076682
--- /dev/null
+++ b/vid-webpack-master/src/app/featureFlag/featureFlag.module.ts
@@ -0,0 +1,32 @@
+import {ModuleWithProviders, NgModule} from '@angular/core';
+import {CommonModule} from '@angular/common';
+import {BrowserModule} from "@angular/platform-browser";
+import {HttpClientModule} from "@angular/common/http";
+import {FeatureFlagService} from "./service/featureFlag.service";
+import {BasicFeatureFlagDirective} from "./directive/basic/basic.featureFlag.directive";
+
+
+@NgModule({
+ imports: [
+ BrowserModule,
+ HttpClientModule,
+ CommonModule
+ ],
+ declarations: [
+ BasicFeatureFlagDirective
+ ],
+ exports: [
+ BasicFeatureFlagDirective
+ ],
+ providers: [
+ FeatureFlagService
+ ]
+})
+export class FeatureFlagModule {
+ static forRoot(): ModuleWithProviders {
+ return {
+ ngModule: FeatureFlagModule,
+ providers: []
+ };
+ }
+}
diff --git a/vid-webpack-master/src/app/featureFlag/service/featureFlag.service.ts b/vid-webpack-master/src/app/featureFlag/service/featureFlag.service.ts
new file mode 100644
index 000000000..09ce7bbf5
--- /dev/null
+++ b/vid-webpack-master/src/app/featureFlag/service/featureFlag.service.ts
@@ -0,0 +1,28 @@
+import {ElementRef, Injectable, Renderer2, RendererFactory2} from "@angular/core";
+import {ConfigurationService} from "../../shared/services/configuration.service";
+
+@Injectable()
+export class FeatureFlagService{
+ private features : { [key: string]: boolean } = {};
+ private renderer: Renderer2;
+ constructor(private _configurationService: ConfigurationService,
+ rendererFactory: RendererFactory2){
+ this.renderer = rendererFactory.createRenderer(null, null);
+ this._configurationService.getFlags().subscribe((res: { [key: string]: boolean }) =>{
+ this.features = res;
+ })
+ }
+
+
+ isFeatureOn(feature : string) : boolean {
+ return this.features && this.getFeatureFlag()[feature] === true;
+ }
+
+ getFeatureFlag() : { [key: string]: boolean } {
+ return this.features;
+ }
+
+ hideElement(element: ElementRef) {
+ this.renderer.setStyle(element.nativeElement, 'display', 'none');
+ }
+}
diff --git a/vid-webpack-master/src/app/global.actions.ts b/vid-webpack-master/src/app/global.actions.ts
deleted file mode 100644
index 46575fb34..000000000
--- a/vid-webpack-master/src/app/global.actions.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import {Action, ActionCreator} from "redux";
-export const UPDATE_NAME= '[NAME] Update';
-export const UPDATE_FLAGS= '[FLAGS] Update';
-
-export interface UpdateGlobalAction extends Action {
- name?: string;
-}
-
-export interface UpdateFlagsAction extends Action {
- flags?: any;
-}
-
-export const updateName: ActionCreator<UpdateGlobalAction> =
- (name) => ({
- type: UPDATE_NAME,
- name: name
- });
-
-export const updateFlags: ActionCreator<UpdateFlagsAction> =
- (flags) => ({
- type: UPDATE_FLAGS,
- flags: flags
- });
diff --git a/vid-webpack-master/src/app/healthStatus/health-status.component.spec.ts b/vid-webpack-master/src/app/healthStatus/health-status.component.spec.ts
new file mode 100644
index 000000000..8a37c77ee
--- /dev/null
+++ b/vid-webpack-master/src/app/healthStatus/health-status.component.spec.ts
@@ -0,0 +1,64 @@
+import {TestBed, ComponentFixture, async} from '@angular/core/testing';
+import {HealthStatusComponent} from "./health-status.component";
+import {HealthStatusService} from "../shared/server/healthStatusService/health-status.service";
+import {HttpClientTestingModule} from "@angular/common/http/testing";
+import {ExternalComponentStatus} from "../shared/models/externalComponentStatus";
+import {Observable} from "rxjs";
+import {of} from "rxjs";
+
+export class MockHealthStatusService {
+
+
+ getProbe(): Observable<Array<ExternalComponentStatus>> {
+ return of(new Array<ExternalComponentStatus>(
+ new ExternalComponentStatus("x", true, {y:"r"})));
+ }
+}
+
+describe('HealthStatusComponent', () => {
+ let component: HealthStatusComponent;
+ let fixture: ComponentFixture<HealthStatusComponent>;
+ let mockHealthStatusService : MockHealthStatusService;
+
+ mockHealthStatusService = new MockHealthStatusService();
+
+ beforeAll(done => (async () => {
+
+ TestBed.configureTestingModule({
+ imports: [HttpClientTestingModule],
+ providers: [{provide: HealthStatusService, useValue: mockHealthStatusService}],
+ declarations: [HealthStatusComponent]
+ });
+ await TestBed.compileComponents();
+
+ fixture = TestBed.createComponent(HealthStatusComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ })().then(done).catch(done.fail));
+
+ test('isAvailable taken from component status available field', () => {
+ expect(component.isAvailable(new ExternalComponentStatus("a", true, null))).toBeTruthy();
+ expect(component.isAvailable(new ExternalComponentStatus("a", false, null))).toBeFalsy();
+ });
+
+ test('getMetadata filter rawData ', () => {
+ let metadata:string = JSON.stringify(component.getMetadata(new ExternalComponentStatus("a", true, {a:1, rawData:2})));
+ expect(metadata).toContain("1");
+ expect(metadata.indexOf("2")).toEqual(-1);
+ });
+
+ test('componentStatus is initialized on startup ', () => {
+ expect(JSON.stringify(component.componentStatuses[0].metadata)).toContain("y");
+ });
+
+ test('when refresh componentStatus is updated', () => {
+ spyOn(mockHealthStatusService, "getProbe" ).and.returnValue(
+ of(new Array<ExternalComponentStatus>(
+ new ExternalComponentStatus("mySpecialValue", true, {y:"z"}))));
+ component.refreshData();
+ expect(component.componentStatuses[0].component).toEqual("mySpecialValue");
+ expect(mockHealthStatusService.getProbe).toHaveBeenCalledTimes(1);
+
+ });
+
+});
diff --git a/vid-webpack-master/src/app/healthStatus/health-status.component.ts b/vid-webpack-master/src/app/healthStatus/health-status.component.ts
index 6a9ddfdd7..a2b175788 100644
--- a/vid-webpack-master/src/app/healthStatus/health-status.component.ts
+++ b/vid-webpack-master/src/app/healthStatus/health-status.component.ts
@@ -8,9 +8,9 @@ import {HealthStatusService} from "../shared/server/healthStatusService/health-s
styleUrls: ['./health-status.component.scss']
})
export class HealthStatusComponent implements OnInit {
- private componentStatuses: Array<ExternalComponentStatus> = [];
- private dataIsReady: boolean;
- private lastUpdatedDate: Date;
+ componentStatuses: Array<ExternalComponentStatus> = [];
+ dataIsReady: boolean;
+ lastUpdatedDate: Date;
constructor(private _healthStatusService: HealthStatusService) {
}
diff --git a/vid-webpack-master/src/app/healthStatus/health-status.module.ts b/vid-webpack-master/src/app/healthStatus/health-status.module.ts
new file mode 100644
index 000000000..7479394f1
--- /dev/null
+++ b/vid-webpack-master/src/app/healthStatus/health-status.module.ts
@@ -0,0 +1,25 @@
+import {NgModule} from "@angular/core";
+import {BrowserModule} from "@angular/platform-browser";
+import {FormsModule} from "@angular/forms";
+import {TooltipModule} from "ngx-tooltip";
+import {CommonModule} from "@angular/common";
+import {SharedModule} from "../shared/shared.module";
+import {FeatureFlagModule} from "../featureFlag/featureFlag.module";
+import {HealthStatusService} from "../shared/server/healthStatusService/health-status.service";
+import {HealthStatusComponent} from "./health-status.component";
+
+@NgModule({
+ imports: [
+ BrowserModule,
+ FormsModule,
+ TooltipModule,
+ CommonModule,
+ SharedModule.forRoot(),
+ FeatureFlagModule.forRoot()],
+ providers: [HealthStatusService],
+ declarations: [HealthStatusComponent],
+ entryComponents: [HealthStatusComponent],
+ exports: [HealthStatusComponent]
+})
+
+export class HealthStatusModule {}
diff --git a/vid-webpack-master/src/app/healthStatus/health-status.routing.ts b/vid-webpack-master/src/app/healthStatus/health-status.routing.ts
new file mode 100644
index 000000000..5344d2e5b
--- /dev/null
+++ b/vid-webpack-master/src/app/healthStatus/health-status.routing.ts
@@ -0,0 +1,19 @@
+import {Route} from '@angular/router';
+import {FlagsResolve} from "../shared/resolvers/flag/flag.resolver";
+import {HealthStatusComponent} from "./health-status.component";
+
+export const HealthStatusRoutes: Route[] = [
+ {
+ path: 'healthStatus',
+ children: [
+ {
+ path: '',
+ component: HealthStatusComponent,
+ resolve: {
+ flags: FlagsResolve
+ },
+ }
+ ]
+ }
+];
+
diff --git a/vid-webpack-master/src/app/home/home.component.e2e-spec.js b/vid-webpack-master/src/app/home/home.component.e2e-spec.js
deleted file mode 100644
index 41203f9d8..000000000
--- a/vid-webpack-master/src/app/home/home.component.e2e-spec.js
+++ /dev/null
@@ -1,13 +0,0 @@
-describe('Home', function () {
-
- beforeEach(function () {
- browser.get('/');
- });
-
- it('should have <my-home>', function () {
- var home = element(by.css('vid-app my-home'));
- expect(home.isPresent()).toEqual(true);
- expect(home.getText()).toEqual("Home Works!");
- });
-
-});
diff --git a/vid-webpack-master/src/app/home/home.component.html b/vid-webpack-master/src/app/home/home.component.html
deleted file mode 100644
index 604d9e1d0..000000000
--- a/vid-webpack-master/src/app/home/home.component.html
+++ /dev/null
@@ -1,3 +0,0 @@
-<p>
- Home Works!
-</p>
diff --git a/vid-webpack-master/src/app/home/home.component.scss b/vid-webpack-master/src/app/home/home.component.scss
deleted file mode 100644
index 5db1e17a3..000000000
--- a/vid-webpack-master/src/app/home/home.component.scss
+++ /dev/null
@@ -1,4 +0,0 @@
-// component styles are encapsulated and only applied to their components
-* {
- color: #FFEF00;
-}
diff --git a/vid-webpack-master/src/app/home/home.component.ts b/vid-webpack-master/src/app/home/home.component.ts
deleted file mode 100644
index 1adaf0ebf..000000000
--- a/vid-webpack-master/src/app/home/home.component.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import { Component, OnInit } from '@angular/core';
-import { SdcService } from '../services/sdc.service';
-import { DataService } from '../services/data.service';
-
-@Component({
- selector: 'my-home',
- templateUrl: './home.component.html',
- styleUrls: ['./home.component.scss'],
- providers: [SdcService, DataService]
-})
-export class HomeComponent implements OnInit {
-
- constructor(private _sdcService: SdcService) {
- // Do stuff
- }
-
- ngOnInit() {
- console.log('Hello Home');
- console.log('getServicesModels: ');
- this._sdcService.getServicesModels().subscribe(
- // onNext() function
- value => console.log('value is ', value),
- // onError() function
- error => console.log('error is ', error),
- // onComplete() function
- () => console.log('completed')
- );
- }
-
-}
diff --git a/vid-webpack-master/src/app/instantiationStatus/InstantiationStatus.module.ts b/vid-webpack-master/src/app/instantiationStatus/InstantiationStatus.module.ts
index 01db0f187..6d14b149d 100644
--- a/vid-webpack-master/src/app/instantiationStatus/InstantiationStatus.module.ts
+++ b/vid-webpack-master/src/app/instantiationStatus/InstantiationStatus.module.ts
@@ -1,33 +1,30 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
-import { InputsModule } from '../modules/inputs.module';
import { DataTableModule } from 'angular2-datatable';
import { BootstrapModalModule } from 'ng2-bootstrap-modal';
import { TooltipModule } from 'ngx-tooltip';
import { InstantiationStatusComponent } from './instantiationStatus.component';
import { InstantiationStatusComponentService } from './instantiationStatus.component.service';
import { SharedModule } from '../shared/shared.module';
-import { AngularSvgIconModule } from 'angular-svg-icon';
import { ContextMenuModule, ContextMenuService } from 'ngx-contextmenu';
import {ModalModule, PopoverModule} from 'ngx-bootstrap';
-import {AuditInfoModalComponent} from "./auditInfoModal/auditInfoModal.component";
+import {SdcUiComponentsModule} from "onap-ui-angular";
@NgModule({
imports: [
CommonModule,
FormsModule,
ReactiveFormsModule,
+ SdcUiComponentsModule,
BootstrapModalModule,
DataTableModule,
TooltipModule,
ModalModule,
- InputsModule,
- AngularSvgIconModule,
ContextMenuModule,
SharedModule.forRoot(),
PopoverModule.forRoot()],
- declarations: [InstantiationStatusComponent, AuditInfoModalComponent],
+ declarations: [InstantiationStatusComponent, ],
providers: [InstantiationStatusComponentService, ContextMenuService]
})
export class InstantiationStatusModule { }
diff --git a/vid-webpack-master/src/app/instantiationStatus/InstantiationStatus.routing.ts b/vid-webpack-master/src/app/instantiationStatus/InstantiationStatus.routing.ts
new file mode 100644
index 000000000..6991eefef
--- /dev/null
+++ b/vid-webpack-master/src/app/instantiationStatus/InstantiationStatus.routing.ts
@@ -0,0 +1,19 @@
+import {Route} from "@angular/router";
+import {FlagsResolve} from "../shared/resolvers/flag/flag.resolver";
+import {InstantiationStatusComponent} from "./instantiationStatus.component";
+
+export const InstantiationStatusRoutes: Route[] = [
+ {
+ path: 'instantiationStatus',
+ children: [
+ {
+ path: '',
+ component: InstantiationStatusComponent,
+ resolve: {
+ flags: FlagsResolve
+ },
+ }
+ ]
+ }
+];
+
diff --git a/vid-webpack-master/src/app/instantiationStatus/auditInfoModal/auditInfoModal.component.ts b/vid-webpack-master/src/app/instantiationStatus/auditInfoModal/auditInfoModal.component.ts
deleted file mode 100644
index 1cff97f5b..000000000
--- a/vid-webpack-master/src/app/instantiationStatus/auditInfoModal/auditInfoModal.component.ts
+++ /dev/null
@@ -1,83 +0,0 @@
-import {Component, ViewChild} from '@angular/core';
-import {Subject} from 'rxjs/Subject';
-import {ModalDirective} from 'ngx-bootstrap'
-import {Constants} from '../../shared/utils/constants';
-import {ModelInformationItem} from '../../shared/components/model-information/model-information.component';
-import {ServiceModel} from '../../shared/models/serviceModel';
-import {ServiceInfoService} from '../../shared/server/serviceInfo/serviceInfo.service';
-import {ServiceInfoModel} from '../../shared/server/serviceInfo/serviceInfo.model';
-import {AuditStatus} from '../../shared/server/serviceInfo/AuditStatus.model';
-import {IframeService} from "../../shared/utils/iframe.service";
-
-@Component({
- selector: 'audit-info-modal',
- templateUrl: './auditInfoModal.component.html',
- styleUrls: ['./auditInfoModal.component.scss']
-})
-export class AuditInfoModalComponent {
- static openModal: Subject<ServiceInfoModel> = new Subject<ServiceInfoModel>();
- @ViewChild('auditInfoModal') public auditInfoModal: ModalDirective;
- title: string = Constants.AuditInfoModal.TITLE;
- modelInfoItems: Array<ModelInformationItem> = [];
- serviceModel: ServiceModel;
- serviceModelName: string;
- vidInfoData: Array<AuditStatus> = [];
- msoInfoData: Array<AuditStatus> = [];
- parentElementClassName = 'content';
- isLoading = true;
-
- constructor(private _serviceInfoService: ServiceInfoService, private _iframeService : IframeService) {
- AuditInfoModalComponent.openModal.subscribe((jobData: ServiceInfoModel) => {
- this.initializeProperties();
- if (jobData) {
- this.openAuditInfoModal(jobData);
- _iframeService.addClassOpenModal(this.parentElementClassName);
- this.serviceModelName = jobData.serviceModelName ? jobData.serviceModelName : '';
- this.auditInfoModal.show();
- } else {
- _iframeService.removeClassCloseModal(this.parentElementClassName);
- this.auditInfoModal.hide();
- }
- })
- }
-
- initializeProperties() : void {
- this.modelInfoItems = null;
- this.vidInfoData = [];
- this.msoInfoData = [];
- this.isLoading = true;
- }
-
- openAuditInfoModal(jobData: ServiceInfoModel): void {
- this.modelInfoItems = this.createModelInformationItems(jobData);
- this.initAuditInfoData(jobData['jobId']);
- this.auditInfoModal.show();
- }
-
- initAuditInfoData(jobId: string) {
- this._serviceInfoService.getJobAuditStatus(jobId)
- .subscribe((res: Array<Array<AuditStatus>>) => {
- this.vidInfoData = res[0];
- this.msoInfoData = res[1];
- this.isLoading = false;
- });
- }
-
- createModelInformationItems(serviceModel: ServiceInfoModel): Array<ModelInformationItem> {
- return [
- new ModelInformationItem('Subscriber name', 'subscriberName', [serviceModel.subscriberName]),
- new ModelInformationItem('Service type', 'serviceType', [serviceModel.serviceType]),
- new ModelInformationItem('Service model version', 'serviceModelVersion', [serviceModel.serviceModelVersion]),
- new ModelInformationItem('Service instance name', 'serviceInstanceName', [serviceModel.serviceInstanceName], '', true),
- new ModelInformationItem('Service instance ID', 'serviceInstanceId', [serviceModel.serviceInstanceId]),
- new ModelInformationItem('Requestor User ID', 'userId', [serviceModel.userId]),
- ];
- }
-
- onCancelClick() {
- this._iframeService.removeClassCloseModal(this.parentElementClassName);
- this.initializeProperties();
- this.auditInfoModal.hide();
- }
-}
-
diff --git a/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.html b/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.html
index e0641d03b..212981aaf 100644
--- a/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.html
+++ b/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.html
@@ -3,7 +3,7 @@
<div>
<div class="row" style="margin-left: 0;">
<div>
- <span class="title">Instantiation Status</span>
+ <span class="title" [attr.data-tests-id]="'instantiation-status-title'">Instantiation Status</span>
<span class="icon-info"
triggers="mouseenter:mouseleave"
popover="This table presents all the instantiation requests you made that are waiting, during or finished instantiating. You may see others requests by removing the Show only my requests checkmark."
@@ -24,6 +24,7 @@
<thead class="thead-dark">
<tr>
<th scope="col" class="smallTd">User ID</th>
+ <th scope="col" class="smallTd">Action</th>
<th scope="col" class="normal">Model Name</th>
<th scope="col" class="normal">Instance Name</th>
<th scope="col" class="smallTd">Model version</th>
@@ -40,8 +41,9 @@
</tr>
</thead>
<tbody >
- <tr *ngFor="let data of serviceInfoData; let i = index" [ngClass]="{'odd' : data.serviceIndex%2 == 1}" [id]="data.jobId" (mouseenter)="currentJobId = data?.jobId">
+ <tr *ngFor="let data of serviceInfoData; trackBy: trackByFn; let i = index" [ngClass]="{'odd' : data.serviceIndex%2 == 1}" [id]="data.jobId">
<td class="smallTd" id="userId"><custom-ellipsis [id]="data.userId" [value]="data.userId"></custom-ellipsis></td>
+ <td class="smallTd" id="action"><custom-ellipsis [id]="data.action" [value]="data.action | capitalizeAndFormat"></custom-ellipsis></td>
<td class="normal" id="serviceModelName"><custom-ellipsis [id]="data.serviceModelName" [value]="data.serviceModelName"></custom-ellipsis></td>
<td class="normal" id="serviceInstanceName"><custom-ellipsis [id]="data.serviceInstanceName" [value]="data.serviceInstanceName"></custom-ellipsis></td>
<td class="smallTd" id="serviceModelVersion"><custom-ellipsis [id]="data.serviceModelVersion" [value]="data.serviceModelVersion"></custom-ellipsis></td>
@@ -55,37 +57,32 @@
<td class="smallTd" id="pause"><custom-ellipsis [id]="data.pause" [value]="data.pause"></custom-ellipsis></td>
<td class="mediumTd" id="created"><custom-ellipsis [id]="data.created" [value]="data.created | date:'MMM. dd, yyyy HH:mm'"></custom-ellipsis></td>
<td class="last" id="jobStatus" [ngClass]="data.jobStatus">
- <custom-popover [value]="data.serviceStatus.tooltip" style="float: left;">
- <svg-icon id="jobStatusIcon-{{i}}" (click)="auditInfo(data)" svg-directive [fill]="data.serviceStatus.color" [widthViewBox]="27" [heightViewBox]="27"
- src="./assets/img/{{data.serviceStatus.iconClassName}}.svg"></svg-icon>
+ <custom-popover [value]="data.serviceStatus.tooltip" [popoverType]="data?.serviceStatus?.color" style="float: left;">
+ <svg-icon
+ id="jobStatusIcon-{{i}}"
+ (click)="auditInfo(data)"
+ [mode]="data.serviceStatus.color"
+ [size]="'large'"
+ [name]="data.serviceStatus.iconClassName">
+ </svg-icon>
+
</custom-popover>
- <div class="menu-div" (click)="onContextMenu($event, data); currentJobId = data.jobId">
+ <div class="menu-div" (click)="onContextMenu($event, data)">
<span class="icon-menu"></span>
- <context-menu>
- <ng-template contextMenuItem (execute)="open($event?.item)" [enabled]="isOpenVisible">
- <div [attr.data-tests-id]="'context-menu-open'">
- <span class="context-menu-icon"><i class="fa fa-external-link" aria-hidden="true"></i></span>
- Open
- </div>
- </ng-template>
- <ng-template contextMenuItem (execute)="auditInfo($event?.item)">
- <div [attr.data-tests-id]="'context-menu-audit-info'">
- <span class="context-menu-icon audit-icon"><i class="fa fa-info-circle" aria-hidden="true"></i></span>
- Audit info
- </div>
- </ng-template>
- <ng-template contextMenuItem let-item (execute)="deleteItem($event?.item)" [enabled]="isDeleteEnabled">
- <div [attr.data-tests-id]="'context-menu-delete'">
- <span class="context-menu-icon"><i class="fa fa-trash-o" aria-hidden="true"></i></span>
- Delete
- </div>
- </ng-template>
- <ng-template contextMenuItem let-item (execute)="hideItem($event?.item)" [enabled]="isHideEnabled">
- <div [attr.data-tests-id]="'context-menu-hide'">
- <span class="context-menu-icon"><i class="fa fa-eye-slash" aria-hidden="true"></i></span>
- Hide request
- </div>
- </ng-template>
+ <context-menu>
+ <ng-template *ngFor="let action of contextMenuActions" contextMenuItem let-item
+ [visible]="action.visible"
+ [enabled]="action.enabled"
+ (execute)="action.click($event.item)">
+ <div [attr.data-tests-id]="action.dataTestId"
+ [tooltip]="action?.tooltip"
+ [tooltipDisabled]="!action.tooltip">
+ <span class="context-menu-icon">
+ <i class="fa {{action.className}}" aria-hidden="true"></i>
+ </span>
+ {{action.name}}
+ </div>
+ </ng-template>
</context-menu>
</div>
</td>
@@ -93,7 +90,6 @@
</tbody>
</table>
</div>
- <audit-info-modal></audit-info-modal>
</div>
diff --git a/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.service.spec.ts b/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.service.spec.ts
index c9f434e99..4848d8e99 100644
--- a/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.service.spec.ts
+++ b/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.service.spec.ts
@@ -1,5 +1,6 @@
import {getTestBed, TestBed} from '@angular/core/testing';
import {
+ COMPLETED_WITH_ERRORS,
INPROGRESS,
InstantiationStatusComponentService,
PAUSE,
@@ -10,24 +11,64 @@ import {
X_O
} from './instantiationStatus.component.service';
import {ServiceInfoModel} from '../shared/server/serviceInfo/serviceInfo.model';
-import { Observable } from 'rxjs/Rx';
+import {AaiService} from "../shared/services/aaiService/aai.service";
+import {MsoService} from "../shared/services/msoService/mso.service";
+import {NgRedux} from "@angular-redux/store";
+import {HttpClientTestingModule} from "@angular/common/http/testing";
+import {FeatureFlagsService} from "../shared/services/featureFlag/feature-flags.service";
+import {DrawingBoardModes} from "../drawingBoard/service-planning/drawing-board.modes";
+import {RouterTestingModule} from "@angular/router/testing";
+import {of} from "rxjs";
+import {UrlTree} from "@angular/router";
+class MockAppStore<T> {
+
+ getState() {
+ return {
+ global: {
+ flags: {
+ 'FLAG_1902_NEW_VIEW_EDIT': true,
+
+ }
+ }
+ }
+ }
+
+ dispatch() {
+
+ }
+}
describe('Instantiation Status Service', () => {
let injector;
+ let aaiService: AaiService;
+ let msoService: MsoService;
let service: InstantiationStatusComponentService;
- beforeEach(() => {
+
+ beforeAll(done => (async () => {
TestBed.configureTestingModule({
- imports: [],
- providers: [InstantiationStatusComponentService]
+ imports: [
+ HttpClientTestingModule,
+ RouterTestingModule,
+ ],
+ providers: [
+ InstantiationStatusComponentService,
+ AaiService,
+ MsoService,
+ FeatureFlagsService,
+ {provide: NgRedux, useClass: MockAppStore}]
});
+ await TestBed.compileComponents();
injector = getTestBed();
+ aaiService = injector.get(AaiService);
+ msoService = injector.get(MsoService);
service = injector.get(InstantiationStatusComponentService);
- });
- it('generateServiceInfoDataMapping should return mapping of arrays', (done: DoneFn) => {
- let data : Array<ServiceInfoModel> = generateServiceInfoData();
+ })().then(done).catch(done.fail));
+
+ test('generateServiceInfoDataMapping should return mapping of arrays', () => {
+ let data : ServiceInfoModel[] = generateServiceInfoData();
let result = service.generateServiceInfoDataMapping(data);
expect(result['1']).toBeDefined();
@@ -37,53 +78,81 @@ describe('Instantiation Status Service', () => {
expect(result['1'].length).toEqual(2);
expect(result['2'].length).toEqual(2);
expect(result['3'].length).toEqual(1);
- done();
});
- it('generateServiceInfoDataMapping if array is empty should return empty object', (done: DoneFn) => {
+ test('generateServiceInfoDataMapping if array is empty should return empty object', () => {
let result = service.generateServiceInfoDataMapping([]);
expect(result['1']).not.toBeDefined();
expect(result['2']).not.toBeDefined();
expect(result['3']).not.toBeDefined();
- done();
});
- it('convertObjectToArray', (done: DoneFn) => {
+ test('convertObjectToArray', () => {
- spyOn(service, 'convertObjectToArray').and.returnValue(
- Observable.of([])
+ jest.spyOn(service, 'convertObjectToArray').mockReturnValue(
+ of([])
);
- let data : Array<ServiceInfoModel> = generateServiceInfoData();
+ let data : ServiceInfoModel[] = generateServiceInfoData();
service.convertObjectToArray(data).subscribe((result) => {
expect(result).toBeDefined();
- done();
});
});
- it('getStatusTooltip should return status popover', (done: DoneFn) => {
+ test('click on "Open" button should open new view edit' , ()=>{
+ const item = {
+ serviceModelId : 'serviceModelId',
+ serviceInstanceId : 'serviceInstanceId',
+ serviceType : 'serviceType',
+ subscriberId : 'subscriberId'
+ };
+ let params:UrlTree = service.getNewViewEditUrlTree(item, DrawingBoardModes.VIEW);
+ expect(params.toString().startsWith('/servicePlanning/VIEW')).toBeTruthy();
+ expect(params.queryParams).toEqual(
+ {
+ serviceModelId: item.serviceModelId,
+ serviceInstanceId: item.serviceInstanceId,
+ serviceType : item.serviceType,
+ subscriberId : item.subscriberId
+ });
+ });
+
+ test('build the View Edit url' , ()=>{
+ const item = {
+ serviceModelId : '28aeb8f6-5620-4148-8bfb-a5fb406f0309',
+ };
+ let serviceModelUrl: string = '/servicePlanning/EDIT?serviceModelId=28aeb8f6-5620-4148-8bfb-a5fb406f0309';
+ let suffix:string = '../../serviceModels.htm#';
+ let tree:UrlTree = service.getNewViewEditUrlTree(item, DrawingBoardModes.EDIT);
+ let result = service.getViewEditUrl(tree);
+ expect (suffix + serviceModelUrl).toEqual(result);
+ });
+
+ test('getStatusTooltip should return status popover', () => {
let result : ServiceStatus = service.getStatus('pending');
- expect(result.tooltip).toEqual('Pending: The service will automatically be sent for instantiation as soon as possible.');
+ expect(result.tooltip).toEqual('Pending: The action required will be sent as soon as possible.');
result = service.getStatus('IN_PROGRESS');
- expect(result.tooltip).toEqual('In-progress: the service is in process of instantiation.');
+ expect(result.tooltip).toEqual('In-progress: the service is in process of the action required.');
result = service.getStatus('PAUSED');
expect(result.tooltip).toEqual('Paused: Service has paused and waiting for your action.\n Select actions from the menu to the right.');
result = service.getStatus('FAILED');
- expect(result.tooltip).toEqual('Failed: Service instantiation has failed, load the service to see the error returned.');
+ expect(result.tooltip).toEqual('Failed: All planned actions have failed.');
result = service.getStatus('COMPLETED');
- expect(result.tooltip).toEqual('Completed successfully: Service is successfully instantiated.');
+ expect(result.tooltip).toEqual('Completed successfully: Service is successfully instantiated, updated or deleted.');
result = service.getStatus('STOPPED');
expect(result.tooltip).toEqual('Stopped: Due to previous failure, will not be instantiated.');
- done();
+
+ result = service.getStatus('COMPLETED_WITH_ERRORS');
+ expect(result.tooltip).toEqual('Completed with errors: some of the planned actions where successfully committed while other have not.\n Open the service to check it out.');
});
- it('getStatusTooltip should return correct icon per job status', (done: DoneFn) => {
+ test('getStatusTooltip should return correct icon per job status', () => {
let result : ServiceStatus = service.getStatus('pending');
expect(result.iconClassName).toEqual(PENDING);
@@ -101,9 +170,10 @@ describe('Instantiation Status Service', () => {
result = service.getStatus('STOPPED');
expect(result.iconClassName).toEqual(STOPED);
- done();
- });
+ result = service.getStatus('COMPLETED_WITH_ERRORS');
+ expect(result.iconClassName).toEqual(COMPLETED_WITH_ERRORS);
+ });
function generateServiceInfoData(){
return JSON.parse(JSON.stringify([
diff --git a/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.service.ts b/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.service.ts
index 293397cc9..0e4451ca8 100644
--- a/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.service.ts
+++ b/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.service.ts
@@ -1,23 +1,38 @@
import {Injectable} from '@angular/core';
import {ServiceInfoModel, ServiceInfoUiModel} from '../shared/server/serviceInfo/serviceInfo.model';
-import {isNullOrUndefined} from "util";
-import { Observable } from 'rxjs/Observable';
-import 'rxjs/observable/of';
-
+import * as _ from 'lodash';
+import {Observable} from 'rxjs/Observable';
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../shared/store/reducers";
+import {AaiService} from "../shared/services/aaiService/aai.service";
+import {ServiceModel} from "../shared/models/serviceModel";
+import {FeatureFlagsService, Features} from "../shared/services/featureFlag/feature-flags.service";
+import {DrawingBoardModes} from "../drawingBoard/service-planning/drawing-board.modes";
+import {updateDrawingBoardStatus} from "../shared/storeUtil/utils/global/global.actions";
+import {Router, UrlTree} from "@angular/router";
+import {of} from "rxjs";
+import {MsoService} from "../shared/services/msoService/mso.service";
export let PENDING : string = "pending";
-export let INPROGRESS : string = "inprogress";
+export let INPROGRESS : string = "in_progress";
export let PAUSE : string = "pause";
-export let X_O : string = "X_o";
-export let SUCCESS_CIRCLE : string = "success+Circle";
-export let STOPED : string = "stoped";
+export let X_O : string = "x-circle-o";
+export let SUCCESS_CIRCLE : string = "success-circle-o";
+export let STOPED : string = "stop";
+export let COMPLETED_WITH_ERRORS : string = "success_with_warning";
@Injectable()
export class InstantiationStatusComponentService {
- generateServiceInfoDataMapping(arr: Array<ServiceInfoModel>) : { [serviceInstanceId: string]: Array<ServiceInfoModel>}{
- let serviceInfoData: { [serviceInstanceId: string]: Array<ServiceInfoModel>; } = {};
+ constructor( private _aaiService: AaiService,
+ private _msoService: MsoService,
+ private _router : Router,
+ private _store: NgRedux<AppState>) {
+ }
+
+ generateServiceInfoDataMapping(arr: ServiceInfoModel[]) : { [serviceInstanceId: string]: ServiceInfoModel[]}{
+ let serviceInfoData: { [serviceInstanceId: string]: ServiceInfoModel[]; } = {};
for(let item of arr){
- if(isNullOrUndefined(serviceInfoData[item.templateId])){
+ if(_.isNil(serviceInfoData[item.templateId])){
serviceInfoData[item.templateId] = [item];
}else {
serviceInfoData[item.templateId].push(item);
@@ -26,7 +41,7 @@ export class InstantiationStatusComponentService {
return serviceInfoData;
}
- convertObjectToArray(arr: Array<ServiceInfoModel>) : Observable<Array<ServiceInfoUiModel>>{
+ convertObjectToArray(arr: ServiceInfoModel[]) : Observable<ServiceInfoUiModel[]>{
const obj = this.generateServiceInfoDataMapping(arr);
let index:number = 0;
let result = [];
@@ -40,25 +55,108 @@ export class InstantiationStatusComponentService {
}
console.log(result);
- return Observable.of(result);
+ return of(result);
+ }
+
+ isDrawingBoardViewEdit(serviceModel: ServiceModel): boolean {
+ if (!_.isNil(serviceModel.vidNotions) && !_.isNil(serviceModel.vidNotions.viewEditUI)
+ && serviceModel.vidNotions.viewEditUI !== 'legacy'){
+ return true;
+ }
+ return false;
+ }
+
+ open(item: ServiceInfoModel): void {
+ if (FeatureFlagsService.getFlagState(Features.FLAG_1902_VNF_GROUPING, this._store)) {
+ this._aaiService.getServiceModelById(item['serviceModelId']).subscribe((result)=>{
+ const serviceModel = new ServiceModel(result);
+
+ if (this.isDrawingBoardViewEdit(serviceModel)) {
+ this.navigateToNewViewEdit(item, DrawingBoardModes.EDIT);
+ return;
+ }
+
+ this.navigateToNewViewOnlyOrOldEditView(item);
+
+ });
+ }
+
+ /*this else is here only to save time in case we don't need to retrieve service model
+ it can be removed once it service model is always needed, and it doesn't save time*/
+ else {
+ this.navigateToNewViewOnlyOrOldEditView(item);
+ }
+ }
+
+ navigateToNewViewOnlyOrOldEditView(item: ServiceInfoModel) {
+ if (FeatureFlagsService.getFlagState(Features.FLAG_1902_NEW_VIEW_EDIT, this._store)) {
+ this.navigateToNewViewEdit(item, DrawingBoardModes.VIEW);
+ }
+ else {
+ this.navigateToOldViewEdit(item);
+ }
+ }
+
+ navigateToOldViewEdit(item: ServiceInfoModel) {
+ let query =
+ `subscriberId=${item.subscriberId}&` +
+ `subscriberName=${item.subscriberName}&` +
+ `serviceType=${item.serviceType}&` +
+ `serviceInstanceId=${item.serviceInstanceId}`;
+
+ this._store.dispatch(updateDrawingBoardStatus(DrawingBoardModes.OLD_VIEW_EDIT));
+ window.parent.location.assign('../../serviceModels.htm#/instantiate?' + query);
+ }
+
+ navigateToNewViewEdit(item: ServiceInfoModel, mode: DrawingBoardModes): void{
+ this._store.dispatch(updateDrawingBoardStatus(mode));
+ const viewEditUrlTree:UrlTree = this.getNewViewEditUrlTree(item, mode);
+ this._router.navigateByUrl(viewEditUrlTree);
+ window.parent.location.assign(this.getViewEditUrl(viewEditUrlTree));
+ }
+
+ getNewViewEditUrlTree(item: ServiceInfoModel, mode: DrawingBoardModes): UrlTree {
+ return this._router.createUrlTree(
+ ['/servicePlanning/' + mode],
+ {
+ queryParams:
+ {
+ serviceModelId: item.serviceModelId,
+ serviceInstanceId: item.serviceInstanceId,
+ serviceType : item.serviceType,
+ subscriberId : item.subscriberId,
+ jobId: item.jobId
+ }
+ });
+ }
+
+ getViewEditUrl(viewEditUrlTree:UrlTree): string {
+ return '../../serviceModels.htm#' + viewEditUrlTree.toString();
+
}
getStatus(status : string) : ServiceStatus {
switch(status.toUpperCase()) {
case 'PENDING' :
- return new ServiceStatus(PENDING, '#009FDB', 'Pending: The service will automatically be sent for instantiation as soon as possible.');
+ return new ServiceStatus(PENDING, 'primary', 'Pending: The action required will be sent as soon as possible.');
case 'IN_PROGRESS' :
- return new ServiceStatus(INPROGRESS, '#009FDB', 'In-progress: the service is in process of instantiation.');
+ return new ServiceStatus(INPROGRESS, 'primary', 'In-progress: the service is in process of the action required.');
case 'PAUSED' :
- return new ServiceStatus(PAUSE, '#009FDB', 'Paused: Service has paused and waiting for your action.\n Select actions from the menu to the right.');
+ return new ServiceStatus(PAUSE, 'primary', 'Paused: Service has paused and waiting for your action.\n Select actions from the menu to the right.');
case 'FAILED' :
- return new ServiceStatus(X_O, '#D02B2B', 'Failed: Service instantiation has failed, load the service to see the error returned.');
+ return new ServiceStatus(X_O, 'error', 'Failed: All planned actions have failed.');
case 'COMPLETED' :
- return new ServiceStatus(SUCCESS_CIRCLE, '#53AD15', 'Completed successfully: Service is successfully instantiated.');
+ return new ServiceStatus(SUCCESS_CIRCLE, 'success', 'Completed successfully: Service is successfully instantiated, updated or deleted.');
case 'STOPPED' :
- return new ServiceStatus(STOPED, '#D02B2B', 'Stopped: Due to previous failure, will not be instantiated.');
+ return new ServiceStatus(STOPED, 'error', 'Stopped: Due to previous failure, will not be instantiated.');
+ case 'COMPLETED_WITH_ERRORS' :
+ return new ServiceStatus(COMPLETED_WITH_ERRORS, 'success', 'Completed with errors: some of the planned actions where successfully committed while other have not.\n Open the service to check it out.');
}
}
+
+ retry(item: ServiceInfoModel): void {
+ this.navigateToNewViewEdit(item, DrawingBoardModes.RETRY_EDIT);
+ }
}
diff --git a/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.spec.ts b/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.spec.ts
index 00b6a9945..53dfcc1f2 100644
--- a/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.spec.ts
+++ b/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.spec.ts
@@ -1,88 +1,227 @@
-import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+import {ComponentFixture, TestBed} from '@angular/core/testing';
import {InstantiationStatusComponent} from './instantiationStatus.component';
import {ServiceInfoService} from '../shared/server/serviceInfo/serviceInfo.service';
import {InstantiationStatusComponentService} from './instantiationStatus.component.service';
-import { ContextMenuModule, ContextMenuService } from 'ngx-contextmenu';
+import {ContextMenuModule, ContextMenuService} from 'ngx-contextmenu';
import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
-import { HttpClientTestingModule } from '@angular/common/http/testing';
-import { ScrollToModule } from '@nicky-lenaers/ngx-scroll-to';
-import { ConfigurationService } from '../services/configuration.service';
-import { LogService } from '../shared/utils/log/log.service';
+import {HttpClientTestingModule} from '@angular/common/http/testing';
+import {ScrollToModule} from '@nicky-lenaers/ngx-scroll-to';
+import {ConfigurationService} from '../shared/services/configuration.service';
+import {LogService} from '../shared/utils/log/log.service';
+import {NgRedux} from '@angular-redux/store';
+import {RouterTestingModule} from '@angular/router/testing';
+import {CapitalizeAndFormatPipe} from "../shared/pipes/capitalize/capitalize-and-format.pipe";
+import {AaiService} from "../shared/services/aaiService/aai.service";
+import {MsoService} from "../shared/services/msoService/mso.service";
+import {FeatureFlagsService} from "../shared/services/featureFlag/feature-flags.service";
+import {JobStatus, ServiceAction} from "../shared/models/serviceInstanceActions";
+import each from 'jest-each';
+import {ServiceInfoModel} from "../shared/server/serviceInfo/serviceInfo.model";
+import { TooltipModule } from 'ngx-tooltip';
+
+class MockAppStore<T> {
+
+ getState() {
+ return {
+ global: {
+ flags: {
+ 'FLAG_1902_NEW_VIEW_EDIT': true
+ }
+ }
+ }
+ }
+
+ dispatch() {
+
+ }
+}
describe('Instantiation Status Component', () => {
let component: InstantiationStatusComponent;
let fixture: ComponentFixture<InstantiationStatusComponent>;
- let enableDeleteItems = [
- { jobStatus:"PENDING" },
- { jobStatus:"STOPPED" }];
- let disableDeleteItems = [
- { jobStatus:"COMPLETED" },
- { jobStatus:"FAILED" },
- {jobStatus:"IN_PROGRESS"},
- {jobStatus:"UnknownOne"}];
-
+let item = new ServiceInfoModel();
+ beforeAll(done => (async () => {
- beforeEach(async(() => {
TestBed.configureTestingModule({
- imports: [HttpClientTestingModule, ContextMenuModule, ScrollToModule.forRoot()],
- providers: [ServiceInfoService, InstantiationStatusComponentService, ContextMenuService, ConfigurationService, LogService],
- declarations: [InstantiationStatusComponent],
+ imports: [
+ HttpClientTestingModule,
+ ContextMenuModule,
+ ScrollToModule.forRoot(),
+ RouterTestingModule,
+ TooltipModule
+ ],
+ providers: [
+ ServiceInfoService,
+ InstantiationStatusComponentService,
+ AaiService,
+ MsoService,
+ ContextMenuService,
+ FeatureFlagsService,
+ ConfigurationService,
+ LogService,
+ {provide: NgRedux, useClass: MockAppStore}
+ ],
+ declarations: [InstantiationStatusComponent, CapitalizeAndFormatPipe],
schemas: [ CUSTOM_ELEMENTS_SCHEMA ]
- }).compileComponents();
- }));
+ });
+ await TestBed.compileComponents();
- beforeEach(() => {
fixture = TestBed.createComponent(InstantiationStatusComponent);
component = fixture.componentInstance;
fixture.detectChanges();
- });
+ })().then(done).catch(done.fail));
+
- it('component should initialize basic parameters', (done: DoneFn) => {
+ test('component should initialize basic parameters', () => {
component.TIMER_TIME_IN_SECONDS = 2;
expect(component.TIMER_TIME_IN_SECONDS).toEqual(2);
expect(component.dataIsReady).toBeFalsy();
expect(component.lastUpdatedDate).toBeNull();
- done();
});
- it('component constructor should call activateInterval and ngOnInit', (done: DoneFn) => {
+ test('component constructor should call activateInterval and ngOnInit', () => {
component.refreshData();
expect(component.dataIsReady).toBeFalsy();
- done();
});
- it('stopped and pending status isDeleteEnabled button should be enabled, not allowed delete statuses isDeleteEnabled button should be disabled', (done: DoneFn) => {
- enableDeleteItems.forEach((item) => {
- let isDeleteEnabled: boolean = component.isDeleteEnabled(item);
- expect(isDeleteEnabled).toBeTruthy();
- });
+ const enableDeleteItemsDataProvider = [
+ ['INSTANTIATE action PENDING job status',JobStatus.PENDING , ServiceAction.INSTANTIATE],
+ ['DELETE action PENDING job status',JobStatus.PENDING , ServiceAction.DELETE],
+ ['UPDATE action PENDING job status',JobStatus.PENDING , ServiceAction.UPDATE],
+ ['INSTANTIATE action STOPPED job status',JobStatus.STOPPED , ServiceAction.INSTANTIATE]];
+ each(enableDeleteItemsDataProvider).test('delete item should enable for %s', (desc, jobStatus, action ) => {
+ item.action=action;
+ item.jobStatus=jobStatus;
+ let isDeleteEnabled: boolean = component.isDeleteEnabled(item);
+ expect(isDeleteEnabled).toBeTruthy();
+ });
- disableDeleteItems.forEach((item) => {
- let isDeleteEnabled: boolean = component.isDeleteEnabled(item);
- expect(isDeleteEnabled).toBeFalsy();
- });
- done();
+ const disableDeleteItemsDataProvider = [
+ [ 'INSTANTIATE action COMPLETED job status', JobStatus.COMPLETED , ServiceAction.INSTANTIATE],
+ [ 'INSTANTIATE action FAILED job status', JobStatus.FAILED , ServiceAction.INSTANTIATE],
+ [ 'INSTANTIATE action IN_PROGRESS job status', JobStatus.IN_PROGRESS, ServiceAction.INSTANTIATE],
+ [ 'INSTANTIATE action COMPLETED_WITH_ERRORS job status', JobStatus.COMPLETED_WITH_ERRORS, ServiceAction.INSTANTIATE],
+ [ 'DELETE action IN_PROGRESS job status', JobStatus.IN_PROGRESS, ServiceAction.DELETE],
+ [ 'DELETE action COMPLETED_WITH_ERRORS job status',JobStatus.COMPLETED_WITH_ERRORS, ServiceAction.DELETE],
+ [ 'UPDATE action IN_PROGRESS job status', JobStatus.IN_PROGRESS, ServiceAction.UPDATE],
+ [ 'UPDATE action COMPLETED_WITH_ERRORS job status', JobStatus.COMPLETED_WITH_ERRORS, ServiceAction.UPDATE],
+ [ 'INSTANTIATE action UNKNOWN job status', "UNKNOWN", ServiceAction.INSTANTIATE]];
+ each(disableDeleteItemsDataProvider).test('delete item should disable for %s', (desc,jobStatus, action ) => {
+ item.action=action;
+ item.jobStatus=jobStatus;
+ let isDeleteEnabled: boolean = component.isDeleteEnabled(item);
+ expect(isDeleteEnabled).toBeFalsy();
});
- it('[COMPLETED, FAILED, STOPPED] status isHideEnable button should be enabled, [IN_PROGRESS, PAUSE, PENDING] status isHideEnable button should be disabled', (done: DoneFn) => {
- const enableHideItems = [
- { jobStatus:"COMPLETED" },
- { jobStatus:"FAILED" },
- { jobStatus:"STOPPED" }];
- enableHideItems.forEach((item) => {
- let isDeleteEnabled: boolean = component.isHideEnabled(item);
- expect(isDeleteEnabled).toBeTruthy();
- });
+ const enableHideItemsDataProvider = [
+ ['instantiate action job status COMPLETED',JobStatus.COMPLETED, ServiceAction.INSTANTIATE ],
+ ['instantiate action job status FAILED',JobStatus.FAILED, ServiceAction.INSTANTIATE ],
+ ['instantiate action job status STOPPED', JobStatus.STOPPED, ServiceAction.INSTANTIATE ],
+ ['instantiate action job status COMPLETED_WITH_ERRORS', JobStatus.COMPLETED_WITH_ERRORS, ServiceAction.INSTANTIATE ],
+ ['delete action job status COMPLETED', JobStatus.COMPLETED, ServiceAction.DELETE ],
+ ['delete action job status FAILED', JobStatus.FAILED, ServiceAction.DELETE ],
+ ['delete action job status STOPPED',JobStatus.STOPPED, ServiceAction.DELETE ],
+ ['delete action job status COMPLETED_WITH_ERRORS', JobStatus.COMPLETED_WITH_ERRORS, ServiceAction.DELETE ],
+ ['update action job status COMPLETED', JobStatus.COMPLETED, ServiceAction.UPDATE ],
+ ['update action job status FAILED',JobStatus.FAILED, ServiceAction.UPDATE ],
+ ['update action job status STOPPED', JobStatus.STOPPED, ServiceAction.UPDATE ],
+ ['update action job status COMPLETED_WITH_ERRORS', JobStatus.COMPLETED_WITH_ERRORS, ServiceAction.UPDATE ]];
+ each(enableHideItemsDataProvider).test('hide item should be enabled for %s', (desc, jobStatus, action ) => {
+ item.action=action;
+ item.jobStatus=jobStatus;
+ let isHideEnabled: boolean = component.isHideEnabled(item);
+ expect(isHideEnabled).toBeTruthy();
+ });
- const disableHideItems = [
- { jobStatus:"IN_PROGRESS" },
- { jobStatus:"PAUSE" },
- { jobStatus:"PENDING" },
- { jobStatus:"NOT_MATTER"}];
- disableHideItems.forEach((item) => {
- let isDeleteEnabled: boolean = component.isHideEnabled(item);
- expect(isDeleteEnabled).toBeFalsy();
- });
- done();
+ const disableHideItemsDataProvider = [
+ ['action instantiate job status IN_PROGRESS',JobStatus.IN_PROGRESS , ServiceAction.INSTANTIATE],
+ ['action instantiate job status PAUSE',JobStatus.PAUSE, ServiceAction.INSTANTIATE],
+ ['action instantiate job status PENDING', JobStatus.PENDING, ServiceAction.INSTANTIATE ],
+ ['action instantiate job status UNKNOWN', "UNKNOWN", ServiceAction.INSTANTIATE],
+ ['update instantiate job status IN_PROGRESS', JobStatus.IN_PROGRESS , ServiceAction.UPDATE],
+ ['update instantiate job status PAUSE', JobStatus.PAUSE, ServiceAction.UPDATE],
+ ['update instantiate job status PENDING', JobStatus.PENDING, ServiceAction.UPDATE ],
+ ['update instantiate job status UNKNOWN',"UNKNOWN", ServiceAction.UPDATE],
+ ['delete instantiate job status IN_PROGRESS',JobStatus.IN_PROGRESS , ServiceAction.DELETE],
+ ['delete instantiate job status PAUSE', JobStatus.PAUSE, ServiceAction.DELETE],
+ ['delete instantiate job status PENDING', JobStatus.PENDING, ServiceAction.DELETE ],
+ ['delete instantiate job status UNKNOWN', "UNKNOWN", ServiceAction.DELETE]];
+ each(disableHideItemsDataProvider).test('hide item should disable for %s', (desc, jobStatus, action ) => {
+ item.action=action;
+ item.jobStatus=jobStatus;
+ let isHideEnabled: boolean = component.isHideEnabled(item);
+ expect(isHideEnabled).toBeFalsy();
+ });
+
+ const enableAuditItemsDataProvider = [
+ ['instantiate action UNKNOWN job status', "UNKNOWN", ServiceAction.INSTANTIATE ],
+ ['delete action JobStatus IN_PROGRESS', JobStatus.IN_PROGRESS, ServiceAction.DELETE ],
+ ['delete action JobStatus PAUSE', JobStatus.PAUSE, ServiceAction.DELETE ],
+ ['delete action JobStatus FAILED', JobStatus.FAILED, ServiceAction.DELETE ],
+ ['delete action JobStatus COMPLETED', JobStatus.COMPLETED, ServiceAction.DELETE ],
+ ['delete action JobStatus COMPLETED_WITH_ERRORS', JobStatus.COMPLETED_WITH_ERRORS, ServiceAction.DELETE ],
+ ['update action JobStatus IN_PROGRESS', JobStatus.IN_PROGRESS, ServiceAction.UPDATE ],
+ ['update action JobStatus PAUSE', JobStatus.PAUSE, ServiceAction.UPDATE ],
+ ['update action JobStatus COMPLETED', JobStatus.COMPLETED, ServiceAction.UPDATE ],
+ ['update action JobStatus FAILED', JobStatus.FAILED, ServiceAction.UPDATE ],
+ ['update action JobStatus COMPLETED_WITH_ERRORS', JobStatus.COMPLETED_WITH_ERRORS, ServiceAction.UPDATE ]];
+
+ each(enableAuditItemsDataProvider).test('audit item should be enabled for %s', (desc, jobStatus, action ) => {
+ item.action=action;
+ item.jobStatus=jobStatus;
+ const isAuditEnabled: boolean = component.isAuditInfoEnabled(item);
+ expect(isAuditEnabled).toBeTruthy();
+ });
+
+ const disableAuditItemsDataProvider = [
+ ['Job status STOPPED action update', JobStatus.STOPPED, ServiceAction.UPDATE ],
+ ['Job status PENDING action update', JobStatus.PENDING, ServiceAction.UPDATE ],
+ ['Job status UNKNOWN action update', "UNKNOWN", ServiceAction.UPDATE],
+ ['Job status STOPPED action delete',JobStatus.STOPPED, ServiceAction.DELETE],
+ ['Job status PENDING action delete', JobStatus.PENDING, ServiceAction.DELETE ],
+ ['Job status UNKNOWN action delete', "UNKNOWN", ServiceAction.DELETE]];
+ each(disableAuditItemsDataProvider).test('audit item should be disabled for %s', (desc, jobStatus, action ) => {
+ item.action=action;
+ item.jobStatus=jobStatus;
+ let isAuditEnabled: boolean = component.isAuditInfoEnabled(item);
+ expect(isAuditEnabled).toBeFalsy();
+ });
+
+ const enableOpenItemsDataProvider = [
+ ['action instantiate job status PAUSE', JobStatus.PAUSE, ServiceAction.INSTANTIATE ],
+ ['action instantiate job status COMPLETED', JobStatus.COMPLETED, ServiceAction.INSTANTIATE ],
+ ['action instantiate job status COMPLETED_WITH_ERRORS', JobStatus.COMPLETED_WITH_ERRORS, ServiceAction.INSTANTIATE ],
+ ['action delete job status PENDING', JobStatus.PENDING, ServiceAction.DELETE ],
+ ['action delete job status FAILED', JobStatus.FAILED, ServiceAction.DELETE ],
+ ['action delete job status COMPLETED_WITH_ERRORS', JobStatus.COMPLETED_WITH_ERRORS, ServiceAction.DELETE ],
+ ['action update job status PENDING', JobStatus.PENDING, ServiceAction.UPDATE ],
+ ['action update job status PAUSE', JobStatus.PAUSE, ServiceAction.UPDATE ],
+ ['action update job status COMPLETED', JobStatus.COMPLETED, ServiceAction.UPDATE ],
+ ['action update job status FAILED', JobStatus.FAILED, ServiceAction.UPDATE ],
+ ['action update job status COMPLETED_WITH_ERRORS', JobStatus.COMPLETED_WITH_ERRORS, ServiceAction.UPDATE ]];
+ each(enableOpenItemsDataProvider).test('open item should be enabled for %s', (desc, jobStatus, action ) => {
+ item.action=action;
+ item.jobStatus=jobStatus;
+ let isOpenEnabled: boolean = component.isOpenEnabled(item);
+ expect(isOpenEnabled).toBeTruthy();
});
+
+ const disableOpenItemsDataProvider = [
+ ['action instantiate job status STOPPED', JobStatus.STOPPED, ServiceAction.INSTANTIATE],
+ ['action instantiate job status FAILED', JobStatus.FAILED, ServiceAction.INSTANTIATE],
+ ['action instantiate job status UNKNOWN', "UNKNOWN", ServiceAction.INSTANTIATE],
+ ['action update job status STOPPED', JobStatus.STOPPED, ServiceAction.UPDATE ],
+ ['action update job status IN_PROGRESS', JobStatus.IN_PROGRESS, ServiceAction.UPDATE ],
+ ['action update job status UNKNOWN', "UNKNOWN", ServiceAction.UPDATE],
+ ['action delete job status COMPLETED', JobStatus.COMPLETED, ServiceAction.DELETE],
+ ['action delete job status PAUSE', JobStatus.PAUSE, ServiceAction.DELETE],
+ ['action delete job status IN_PROGRESS', JobStatus.IN_PROGRESS, ServiceAction.DELETE ],
+ ['action delete job status UNKNOWN',"UNKNOWN", ServiceAction.DELETE]];
+ each(disableOpenItemsDataProvider).test('open item should be disabled for %s', (desc, jobStatus, action ) => {
+ item.action=action;
+ item.jobStatus=jobStatus;
+ let isOpenEnabled: boolean = component.isOpenEnabled(item);
+ expect(isOpenEnabled).toBeFalsy();
+ });
+
});
diff --git a/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.ts b/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.ts
index ed45ce43c..f3f651960 100644
--- a/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.ts
+++ b/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.ts
@@ -1,40 +1,97 @@
-import {AfterViewChecked, Component, ViewChild} from '@angular/core';
+import {Component, ViewChild} from '@angular/core';
import {ServiceInfoService} from '../shared/server/serviceInfo/serviceInfo.service';
import {ServiceInfoModel} from '../shared/server/serviceInfo/serviceInfo.model';
import {InstantiationStatusComponentService} from './instantiationStatus.component.service';
import {ContextMenuComponent, ContextMenuService} from 'ngx-contextmenu';
-import {AuditInfoModalComponent} from "./auditInfoModal/auditInfoModal.component";
+import {AuditInfoModalComponent} from "../shared/components/auditInfoModal/auditInfoModal.component";
import * as _ from 'lodash';
import {ScrollToConfigOptions, ScrollToService} from '@nicky-lenaers/ngx-scroll-to';
-import {ConfigurationService} from "../services/configuration.service";
+import {ConfigurationService} from "../shared/services/configuration.service";
import {LogService} from '../shared/utils/log/log.service';
-
+import {AppState} from "../shared/store/reducers";
+import {NgRedux} from '@angular-redux/store';
+import {JobStatus, ServiceAction} from "../shared/models/serviceInstanceActions";
+import {DrawingBoardModes} from "../drawingBoard/service-planning/drawing-board.modes";
+
+export interface MenuAction{
+ name: string;
+ dataTestId: string;
+ className: string;
+ tooltip?: string;
+ click(item: ServiceInfoModel): void;
+ enabled (item?: ServiceInfoModel): boolean;
+ visible (item?: ServiceInfoModel): boolean;
+}
@Component({
selector : 'instantiation-status',
templateUrl : './instantiationStatus.component.html',
styleUrls : ['./instantiationStatus.component.scss']
})
-export class InstantiationStatusComponent implements AfterViewChecked{
-
+export class InstantiationStatusComponent {
TIMER_TIME_IN_SECONDS : number = 0;
timer = null;
dataIsReady : boolean = false;
scroll : boolean = false;
lastUpdatedDate: Date = null;
- currentJobId: string = null;
instantiationStatusComponentService: InstantiationStatusComponentService;
configurationService : ConfigurationService;
- serviceInfoData: Array<ServiceInfoModel> = null;
+ serviceInfoData: ServiceInfoModel[] = null;
@ViewChild(ContextMenuComponent) public contextMenu: ContextMenuComponent;
+ public contextMenuActions: Array<MenuAction> = [
+ {
+ name: "Redeploy",
+ dataTestId: "context-menu-retry",
+ className: "fa-repeat",
+ click: (item: ServiceInfoModel) => this.retryItem(item),
+ enabled: () => true,
+ visible: (item: ServiceInfoModel) => item.isRetryEnabled,
+ },
+ {
+ name: "Open",
+ dataTestId: "context-menu-open",
+ className: "fa-external-link",
+ click: (item: ServiceInfoModel) => this.instantiationStatusComponentService.open(item),
+ enabled: (item: ServiceInfoModel) => this.isOpenEnabled(item),
+ visible: () => true,
+ },
+ {
+ name: "Audit info",
+ dataTestId: "context-menu-audit-info",
+ className: "fa-info-circle",
+ click: (item: ServiceInfoModel) => this.auditInfo(item),
+ enabled: (item: ServiceInfoModel) => this.isAuditInfoEnabled(item),
+ visible: () => true,
+ },
+ {
+ name: "Delete",
+ dataTestId: "context-menu-remove",
+ className: "fa-trash-o",
+ click: (item: ServiceInfoModel) => this.deleteItem(item),
+ enabled: (item: ServiceInfoModel) => this.isDeleteEnabled(item),
+ visible: () => true,
+ },
+ {
+ name: "Hide request",
+ dataTestId: "context-menu-hide",
+ className: "fa-eye-slash",
+ tooltip: "Hide this service from this table",
+ click: (item: ServiceInfoModel) => this.hideItem(item),
+ enabled: (item: ServiceInfoModel) => this.isHideEnabled(item),
+ visible: () => true,
+ }
+ ];
+
+ flags: any;
constructor(private _serviceInfoService: ServiceInfoService,
private _instantiationStatusComponentService : InstantiationStatusComponentService,
private _contextMenuService: ContextMenuService,
private _configurationService : ConfigurationService,
private _scrollToService: ScrollToService,
- private _logService : LogService) {
+ private _logService : LogService,
+ private _store: NgRedux<AppState>) {
this.instantiationStatusComponentService = _instantiationStatusComponentService;
this.configurationService = this._configurationService;
this.configurationService.getConfiguration("refreshTimeInstantiationDashboard").subscribe(response => {
@@ -58,61 +115,73 @@ export class InstantiationStatusComponent implements AfterViewChecked{
refreshData(): void {
this.dataIsReady = false;
- this._serviceInfoService.getServicesJobInfo(true)
- .subscribe((res: Array<ServiceInfoModel>) => {
+ this._serviceInfoService.getServicesJobInfo(true, this.lastUpdatedDate === null)
+ .subscribe((res: ServiceInfoModel[]) => {
this._instantiationStatusComponentService.convertObjectToArray(res).subscribe((res) => {
this._logService.info('refresh instantiation status table', res);
this.dataIsReady = true;
this.lastUpdatedDate = new Date();
if (!_.isEqual(this.serviceInfoData, res)) {
this.serviceInfoData = res;
- this.scroll = true;
+ this.scrollToElement(this.findFirstVisibleJob());
}
});
})
}
- ngAfterViewChecked(){
- if (this.scroll) {
- this.scrollToElement();
- this.scroll = false;
- }
+ trackByFn(index: number, item: ServiceInfoModel){
+ return _.isNil(item) ? null : item.jobId;
}
-
-
- isDeleteEnabled(item):boolean {
- return _.includes(['PENDING', 'STOPPED'], item.jobStatus);
- }
-
- deleteItem(item): void {
+ deleteItem(item: ServiceInfoModel): void {
this._serviceInfoService.deleteJob(item.jobId).subscribe(() => {
this.refreshData();
});
}
- hideItem(item): void {
+ hideItem(item: ServiceInfoModel): void {
this._serviceInfoService.hideJob(item.jobId).subscribe(() => {
this.refreshData();
});
}
+
+ retryItem(item: ServiceInfoModel) : void {
+ if (item.isRetryEnabled) {
+ this._instantiationStatusComponentService.retry(item);
+ }
+ }
auditInfo(jobData : ServiceInfoModel): void {
AuditInfoModalComponent.openModal.next(jobData);
+ }
+ isOpenEnabled(item: ServiceInfoModel):boolean {
+ switch(item.action) {
+ case ServiceAction.DELETE:
+ return _.includes([ JobStatus.PENDING, JobStatus.COMPLETED_WITH_ERRORS, JobStatus.FAILED], item.jobStatus);
+ case ServiceAction.UPDATE:
+ return _.includes([JobStatus.PENDING, JobStatus.PAUSE, JobStatus.COMPLETED_WITH_ERRORS, JobStatus.COMPLETED, JobStatus.FAILED], item.jobStatus);
+ default:
+ return _.includes([JobStatus.COMPLETED, JobStatus.PAUSE, JobStatus.COMPLETED_WITH_ERRORS], item.jobStatus);
+ }
}
- isOpenVisible(item):boolean {
- return _.includes(['COMPLETED', 'PAUSE'], item.jobStatus);
+ isAuditInfoEnabled(item: ServiceInfoModel): boolean {
+ if(item.action === ServiceAction.DELETE || item.action=== ServiceAction.UPDATE) {
+ return _.includes([JobStatus.FAILED, JobStatus.IN_PROGRESS, JobStatus.COMPLETED_WITH_ERRORS, JobStatus.PAUSE, JobStatus.COMPLETED], item.jobStatus);
+ }
+ return true;// ServiceAction.INSTANTIATE
}
- open(item): void {
- let query =
- `subscriberId=${item['subscriberName']}&` +
- `serviceType=${item['serviceType']}&` +
- `serviceInstanceId=${item['serviceInstanceId']}`;
+ isDeleteEnabled(item: ServiceInfoModel):boolean {
+ if( item.action === ServiceAction.DELETE || item.action === ServiceAction.UPDATE){
+ return _.includes([JobStatus.PENDING], item.jobStatus);
+ }
+ return _.includes([JobStatus.PENDING, JobStatus.STOPPED], item.jobStatus);
+ }
- window.parent.location.assign('../../serviceModels.htm#/instantiate?' + query);
+ isHideEnabled(item: ServiceInfoModel):boolean {
+ return _.includes([JobStatus.COMPLETED, JobStatus.FAILED, JobStatus.STOPPED, JobStatus.COMPLETED_WITH_ERRORS], item.jobStatus);
}
public onContextMenu($event: MouseEvent, item: any): void {
@@ -129,17 +198,36 @@ export class InstantiationStatusComponent implements AfterViewChecked{
return './' + imageName + '.svg';
}
- isHideEnabled(item: any):boolean {
- return _.includes(['COMPLETED', 'FAILED', 'STOPPED'], item.jobStatus);
+ private getHeaderHeaderClientRect(): ClientRect {
+ const element = document.querySelector("#instantiation-status thead") as HTMLElement;
+ return element.getBoundingClientRect();
}
- scrollToElement() {
- if(this.currentJobId){
+
+ findFirstVisibleJob(): HTMLElement {
+ const elements : any = document.querySelectorAll('#instantiation-status tr');
+ const headerRect = this.getHeaderHeaderClientRect();
+ if (headerRect) {
+ const topEdge = headerRect.bottom;
+ for (let i = 0; i < elements.length; i++) {
+ if (elements[i].getBoundingClientRect().top >= topEdge)
+ return elements[i];
+ }
+ }
+ return null;
+ }
+
+ scrollToElement(currentJob: HTMLElement) {
+ if (currentJob) {
const config: ScrollToConfigOptions = {
- target: this.currentJobId,
- duration: 50,
- offset: -35 //header height
+ target: currentJob,
+ duration: 0,
+ offset: -1 * (this.getHeaderHeaderClientRect().height + 2),
};
- this._scrollToService.scrollTo(config);
+
+ // wait after render
+ setTimeout(() => {
+ this._scrollToService.scrollTo(config);
+ }, 0)
}
}
}
diff --git a/vid-webpack-master/src/app/modules/inputs.module.ts b/vid-webpack-master/src/app/modules/inputs.module.ts
deleted file mode 100644
index cb5f914cd..000000000
--- a/vid-webpack-master/src/app/modules/inputs.module.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import { NgModule } from '@angular/core';
-import { CommonModule } from '@angular/common';
-import { FormsModule, ReactiveFormsModule } from '@angular/forms';
-import { DynamicInputsComponent } from '../components/dynamic-inputs/dynamic-inputs.component';
-import { AngularMultiSelectModule } from "angular2-multiselect-dropdown";
-import { DynamicInputLabelPipe } from '../shared/pipes/dynamicInputLabel/dynamic-input-label.pipe';
-
-
-@NgModule({
- imports: [
- CommonModule, FormsModule, ReactiveFormsModule, AngularMultiSelectModule
- ],
- providers: [],
- declarations: [ DynamicInputLabelPipe, DynamicInputsComponent ],
- entryComponents: [],
- exports: [ DynamicInputLabelPipe, DynamicInputsComponent ]
-
-})
-
-export class InputsModule { }
diff --git a/vid-webpack-master/src/app/service.actions.ts b/vid-webpack-master/src/app/service.actions.ts
deleted file mode 100644
index a62fec673..000000000
--- a/vid-webpack-master/src/app/service.actions.ts
+++ /dev/null
@@ -1,197 +0,0 @@
-import { Action, ActionCreator } from "redux";
-import { LcpRegionsAndTenants } from "./shared/models/lcpRegionsAndTenants";
-import { ServiceInstance } from "./shared/models/serviceInstance";
-import { SelectOptionInterface } from "./shared/models/selectOption";
-import { ServiceType } from "./shared/models/serviceType";
-import { VnfInstance } from "./shared/models/vnfInstance";
-
-export const UPDATE_MODEL = "[MODEL] Update";
-export const UPDATE_SERVICE_INSTANCE = "[SERVICE INSTANCE] Update";
-export const UPDATE_VNF_INSTANCE = "[VNF INSTANCE] Update";
-export const UPDATE_VF_MODULE = "[VF MODULE] Update";
-export const CREATE_VF_MODULE = "[VF MODULE] Create";
-
-export const UPDATE_LCP_REGIONS_AND_TENANTS = "[LCP_REGIONS_AND_TENANTS] Update";
-export const UPDATE_SUBSCRIBERS = "[SUBSCRIBERS] Update";
-export const UPDATE_PRODUCT_FAMILIES = "[PRODUCT_FAMILIES] Update";
-export const UPDATE_SERVICE_TYPES = "[SERVICE_TYPE] Update";
-export const UPDATE_AIC_ZONES = "[AIC_ZONES] Update";
-export const DELETE_SERVICE_INSTANCE = "[SERVICE_INSTANCE] Delete";
-export const DELETE_VNF_INSTANCE = "[VNF_INSTANCE] Delete";
-export const DELETE_VNF_MODULE_INSTANCE = "[VNF_MODULE_INSTANCE] Delete";
-export const UPDATE_CATEGORY_PARAMETERS = "[CATEGORY_PARAMETERS] Update";
-export const UPDATE_NETWORK_FUNCTION = "[UPDATE_NETWORK_FUNCTION] Update";
-export const UPDATE_USER_ID = "[UPDATE_USER_ID] Update";
-
-
-export interface UpdateServiceModelAction extends Action {
- serviceHierarchy?: any;
-}
-
-export interface UpdateNetworkCollectionFunction extends Action {
- networksAccordingToNetworkCollection: any;
- network_function: any;
-}
-
-export interface UpdateServiceInstanceAction extends Action {
- serviceUuid?: string;
- serviceInstance?: ServiceInstance;
-}
-
-export interface UpdateVFModuleInstanceAction extends Action {
- vfInstance: any;
- vfId: string;
- serviceUuid: string;
-}
-
-export interface CreateVFModuleInstanceAction extends Action {
- vfInstance: any;
- vfId: string;
- serviceUuid: string;
- index : number
-}
-
-export interface UpdateUserIdAction extends Action {
- userId: string;
-}
-
-export interface UpdateVnfInstanceAction extends Action {
- vnfInstance?: VnfInstance;
- vnfModelName?: string;
- serviceUuid?: string;
-}
-
-export interface UpdateLcpRegionsAndTenantsAction extends Action {
- lcpRegionsAndTenants?: LcpRegionsAndTenants;
-}
-
-export interface UpdateSubscribersAction extends Action {
- subscribers?: SelectOptionInterface[];
-}
-
-export interface UpdateProductFamiliesAction extends Action {
- productFamilies?: SelectOptionInterface[];
-}
-
-export interface UpdateAicZonesAction extends Action {
- aicZones?: SelectOptionInterface[];
-}
-
-export interface UpdateServiceTypesAction extends Action {
- serviceTypes?: ServiceType[];
- subscriberId: string;
-}
-
-export interface DeleteServiceInstanceAction extends Action {
- serviceUuid?: string;
-}
-
-export interface DeleteVnfInstanceAction extends Action {
- modelName?: string;
- serviceModelId: string;
-}
-
-export interface DeleteVfModuleInstanceAction extends Action {
- modelName?: string;
- serviceModelId?: string;
- vfName?: string;
-}
-
-export interface UpdateCategoryParametersAction extends Action {
- categoryParameters?: string;
-}
-
-export const updateModel: ActionCreator<UpdateServiceModelAction> = serviceHierarchy => ({
- type: UPDATE_MODEL,
- serviceHierarchy: serviceHierarchy
-});
-
-export const updateServiceInstance: ActionCreator<UpdateServiceInstanceAction> = (serviceInstance, serviceUuid) => ({
- type: UPDATE_SERVICE_INSTANCE,
- serviceInstance: serviceInstance,
- serviceUuid: serviceUuid
-});
-
-export const updateVFModuleInstance: ActionCreator<UpdateVFModuleInstanceAction> = (vfInstance, vfId, serviceUuid) => ({
- type: UPDATE_VF_MODULE,
- vfInstance: vfInstance,
- vfId: vfId,
- serviceUuid: serviceUuid
-})
-
-export const createVFModuleInstance: ActionCreator<CreateVFModuleInstanceAction> = (vfInstance, vfId, serviceUuid, index) => ({
- type: CREATE_VF_MODULE,
- vfInstance: vfInstance,
- vfId: vfId,
- serviceUuid: serviceUuid,
- index : index
-})
-
-
-
-export const updateVNFInstance: ActionCreator<UpdateVnfInstanceAction> = (vnfInstance, vnfModelName, serviceUuid) => ({
- type: UPDATE_VNF_INSTANCE,
- vnfInstance: vnfInstance,
- vnfModelName: vnfModelName,
- serviceUuid: serviceUuid
-});
-
-export const updateLcpRegionsAndTenants: ActionCreator<UpdateLcpRegionsAndTenantsAction> = lcpRegionsAndTenants => ({
- type: UPDATE_LCP_REGIONS_AND_TENANTS,
- lcpRegionsAndTenants: lcpRegionsAndTenants
-});
-
-export const updateSubscribers: ActionCreator<UpdateSubscribersAction> = subscribers => ({
- type: UPDATE_SUBSCRIBERS,
- subscribers: subscribers
-});
-
-export const updateProductFamilies: ActionCreator<UpdateProductFamiliesAction> = productFamilies => ({
- type: UPDATE_PRODUCT_FAMILIES,
- productFamilies: productFamilies
-});
-
-export const updateAicZones: ActionCreator<UpdateAicZonesAction> = aicZones => ({
- type: UPDATE_AIC_ZONES,
- aicZones: aicZones
-});
-
-export const updateUserId: ActionCreator<UpdateUserIdAction> = userId => ({
- type: UPDATE_USER_ID,
- userId: userId
-});
-
-export const updateCategoryParameters: ActionCreator<UpdateCategoryParametersAction> = categoryParameters => ({
- type: UPDATE_CATEGORY_PARAMETERS,
- categoryParameters: categoryParameters
-});
-
-export const updateServiceTypes: ActionCreator<UpdateServiceTypesAction> = (serviceTypes, subscriberId) => ({
- type: UPDATE_SERVICE_TYPES,
- serviceTypes: serviceTypes,
- subscriberId: subscriberId
-});
-
-export const updateNetworkCollectionFunction: ActionCreator<UpdateNetworkCollectionFunction> = (ncf, networksAccordingToNetworkCollection) => ({
- type: UPDATE_NETWORK_FUNCTION,
- networksAccordingToNetworkCollection: networksAccordingToNetworkCollection["results"],
- network_function: ncf
-});
-
-export const deleteServiceInstance: ActionCreator<DeleteServiceInstanceAction> = serviceUuid => ({
- type: DELETE_SERVICE_INSTANCE,
- serviceUuid: serviceUuid
-});
-
-export const deleteVnfInstance: ActionCreator<DeleteVnfInstanceAction> = (modelName, serviceModelId) => ({
- type: DELETE_VNF_INSTANCE,
- modelName: modelName,
- serviceModelId: serviceModelId
-});
-
-export const deleteVfModuleInstance: ActionCreator<DeleteVfModuleInstanceAction> = (modelName, serviceModelId, vfName) => ({
- type: DELETE_VNF_MODULE_INSTANCE,
- modelName: modelName,
- serviceModelId: serviceModelId,
- vfName: vfName
-});
diff --git a/vid-webpack-master/src/app/service.reducer.spec.ts b/vid-webpack-master/src/app/service.reducer.spec.ts
deleted file mode 100644
index f734979ac..000000000
--- a/vid-webpack-master/src/app/service.reducer.spec.ts
+++ /dev/null
@@ -1,286 +0,0 @@
-import { LcpRegionsAndTenants } from './shared/models/lcpRegionsAndTenants';
-import { ServiceReducer, ServiceState } from './service.reducer';
-import { CategoryParams } from './shared/models/categoryParams';
-import {
- DELETE_VNF_INSTANCE, DELETE_VNF_MODULE_INSTANCE, DeleteVfModuleInstanceAction,
- DeleteVnfInstanceAction,
- UPDATE_AIC_ZONES,
- UPDATE_LCP_REGIONS_AND_TENANTS,
- UPDATE_PRODUCT_FAMILIES,
- UPDATE_SERVICE_INSTANCE,
- UPDATE_SUBSCRIBERS,
- UPDATE_USER_ID,
- UPDATE_VNF_INSTANCE,
- UpdateAicZonesAction,
- UpdateProductFamiliesAction, UpdateServiceInstanceAction,
- UpdateSubscribersAction, UpdateUserIdAction,
- UpdateVnfInstanceAction
-} from './service.actions';
-import { VnfInstance } from './shared/models/vnfInstance';
-import { ServiceInstance } from './shared/models/serviceInstance';
-import { LcpRegion } from './shared/models/lcpRegion';
-import { Tenant } from './shared/models/tenant';
-import { SelectOption } from './shared/models/selectOption';
-
-
-const initialState: ServiceState = {
- serviceHierarchy: {},
- serviceInstance: {},
- lcpRegionsAndTenants: new LcpRegionsAndTenants(),
- subscribers: null,
- productFamilies: null,
- serviceTypes: {},
- aicZones: null,
- categoryParameters: new CategoryParams()
-};
-
-
-describe('service reducer', () => {
- const userId: string = 'userId';
- it('should handle initial state', () => {
- expect(ServiceReducer(undefined, <any>{})).toEqual(initialState);
- });
-
- it('#UPDATE_USER_ID : should update userId ', (done: DoneFn) => {
- expect(ServiceReducer(<any>{},
- <UpdateUserIdAction>{
- type: UPDATE_USER_ID,
- userId: userId
- }
- )['userId']).toEqual(userId);
- done();
- });
-
- it('#UPDATE_SERVICE_INSTANCE : should update service instance with service id ', (done: DoneFn) => {
- const serviceUuid:string = 'serviceUuid';
-
- let serviceInstanceObject : ServiceInstance = {
- instanceName: 'instanceName',
- isUserProvidedNaming: false,
- globalSubscriberId: 'globalSubscriberId',
- productFamilyId: 'productFamilyId',
- subscriptionServiceType: 'subscriptionServiceType',
- lcpCloudRegionId: 'lcpCloudRegionId',
- tenantId: 'tenantId',
- tenantName: 'tenantName',
- aicZoneId: 'aicZoneId',
- aicZoneName: 'aicZoneName',
- projectName: 'projectName',
- owningEntityId: 'owningEntityId',
- owningEntityName: 'owningEntityName',
- pause: false,
- bulkSize: 1,
- vnfs: {},
- instanceParams : {},
- rollbackOnFailure: false,
- subscriberName: 'subscriberName'
- };
-
- let serviceState = ServiceReducer(<any>{serviceInstance : {}},
- <UpdateServiceInstanceAction>{
- type: UPDATE_SERVICE_INSTANCE,
- serviceUuid: serviceUuid,
- serviceInstance : serviceInstanceObject
- }).serviceInstance['serviceUuid'];
-
- expect(serviceState.instanceName).toEqual(serviceInstanceObject.instanceName);
- expect(serviceState.isUserProvidedNaming).toEqual(serviceInstanceObject.isUserProvidedNaming);
- expect(serviceState.globalSubscriberId).toEqual(serviceInstanceObject.globalSubscriberId);
- expect(serviceState.productFamilyId).toEqual(serviceInstanceObject.productFamilyId);
- expect(serviceState.subscriptionServiceType).toEqual(serviceInstanceObject.subscriptionServiceType);
- expect(serviceState.lcpCloudRegionId).toEqual(serviceInstanceObject.lcpCloudRegionId);
- expect(serviceState.tenantId).toEqual(serviceInstanceObject.tenantId);
- expect(serviceState.tenantName).toEqual(serviceInstanceObject.tenantName);
- expect(serviceState.aicZoneId).toEqual(serviceInstanceObject.aicZoneId);
- expect(serviceState.aicZoneName).toEqual(serviceInstanceObject.aicZoneName);
- expect(serviceState.projectName).toEqual(serviceInstanceObject.projectName);
- expect(serviceState.owningEntityId).toEqual(serviceInstanceObject.owningEntityId);
- expect(serviceState.owningEntityName).toEqual(serviceInstanceObject.owningEntityName);
- expect(serviceState.pause).toEqual(serviceInstanceObject.pause);
- expect(serviceState.bulkSize).toEqual(serviceInstanceObject.bulkSize);
- expect(serviceState.vnfs).toEqual(serviceInstanceObject.vnfs);
- expect(serviceState.instanceParams).toEqual(serviceInstanceObject.instanceParams);
- expect(serviceState.rollbackOnFailure).toEqual(serviceInstanceObject.rollbackOnFailure);
- expect(serviceState.subscriberName).toEqual(serviceInstanceObject.subscriberName);
-
- done();
- });
-
- it('#UPDATE_VNF_INSTANCE : should update vnf instance with service id and vnfModelName ', (done: DoneFn) => {
- let vnfInstanceObj : VnfInstance = {
- instanceName: 'instanceName',
- isUserProvidedNaming: false,
- productFamilyId: 'productFamilyId',
- lcpCloudRegionId: 'lcpCloudRegionId',
- legacyRegion: 'legacyRegion',
- tenantId: 'tenantId',
- platformName: 'platformName',
- lineOfBusiness: 'lineOfBusiness',
- rollbackOnFailure: 'false',
- vfModules: {}
- };
-
- let vnfState = ServiceReducer(<any>{serviceInstance : {
- 'serviceUuid' : {
- vnfs : {}
- }
- }},
- <UpdateVnfInstanceAction>{
- type: UPDATE_VNF_INSTANCE,
- serviceUuid : 'serviceUuid',
- vnfInstance: vnfInstanceObj,
- vnfModelName : 'vnfModelName'
- }).serviceInstance['serviceUuid'].vnfs['vnfModelName'];
-
- expect(vnfState.instanceName).toEqual(vnfInstanceObj.instanceName);
- expect(vnfState.isUserProvidedNaming).toEqual(vnfInstanceObj.isUserProvidedNaming);
- expect(vnfState.productFamilyId).toEqual(vnfInstanceObj.productFamilyId);
- expect(vnfState.lcpCloudRegionId).toEqual(vnfInstanceObj.lcpCloudRegionId);
- expect(vnfState.legacyRegion).toEqual(vnfInstanceObj.legacyRegion);
- expect(vnfState.tenantId).toEqual(vnfInstanceObj.tenantId);
- expect(vnfState.platformName).toEqual(vnfInstanceObj.platformName);
- expect(vnfState.lineOfBusiness).toEqual(vnfInstanceObj.lineOfBusiness);
- expect(vnfState.vfModules).toEqual(vnfInstanceObj.vfModules);
- expect(vnfState.rollbackOnFailure).toEqual(vnfInstanceObj.rollbackOnFailure);
-
- done();
- });
-
- it('#UPDATE_LCP_REGIONS_AND_TENANTS : should update lcp region and tenants', (done: DoneFn) => {
- let lcpRegionsAndTenantsObj = [
- {
- lcpRegionList : [
- new LcpRegion({
- "cloudRegionID" : 'cloudRegionID',
- "is-permitted" : "is-permitted"
- })
- ],
- lcpRegionsTenantsMap : {
- "lcpRegion" : [new Tenant({
- "tenantID" : "tenantID",
- "tenantName" : "tenantName",
- "is-permitted" : true
- })]
- }
- }
- ];
- let lcpRegionsAndTenantsState = ServiceReducer(<any>{serviceInstance : {}},
- <any>{
- type: UPDATE_LCP_REGIONS_AND_TENANTS,
- lcpRegionsAndTenants : lcpRegionsAndTenantsObj
- })['lcpRegionsAndTenants'];
-
- expect(lcpRegionsAndTenantsState).toBeDefined();
- done();
- });
-
- it('#UPDATE_SUBSCRIBERS : should update subscribers', (done: DoneFn) => {
- let subscribersList = [
- new SelectOption({
- id : 'id',
- name : 'name',
- isPermitted : false
- })
- ];
- let subscribersState = ServiceReducer(<any>{serviceInstance : {}},
- <UpdateSubscribersAction>{
- type: UPDATE_SUBSCRIBERS,
- subscribers : subscribersList
- })['subscribers'];
-
- expect(subscribersState).toBeDefined();
- expect(subscribersState[0].id).toEqual(subscribersList[0].id);
- expect(subscribersState[0].isPermitted).toEqual(subscribersList[0].isPermitted);
- expect(subscribersState[0].name).toEqual(subscribersList[0].name);
-
- done();
- });
-
- it('#UpdateProductFamiliesAction : should update product families', (done: DoneFn) => {
- let productFamiliesObj = [
- new SelectOption({
- id : 'id',
- name : 'name',
- isPermitted : false
- })
- ];
- let productFamiliesState = ServiceReducer(<any>{serviceInstance : {}},
- <UpdateProductFamiliesAction>{
- type: UPDATE_PRODUCT_FAMILIES,
- productFamilies : productFamiliesObj
- })['productFamilies'];
-
- expect(productFamiliesState).toBeDefined();
- expect(productFamiliesState[0].id).toEqual(productFamiliesObj[0].id);
- expect(productFamiliesState[0].isPermitted).toEqual(productFamiliesObj[0].isPermitted);
- expect(productFamiliesState[0].name).toEqual(productFamiliesObj[0].name);
-
- done();
- });
-
- it('#UPDATE_AIC_ZONES : should update aic zones', (done: DoneFn) => {
- let aicZonesObj = [
- new SelectOption({
- id : 'id',
- name : 'name',
- isPermitted : false
- })
- ];
- let aicZonesState = ServiceReducer(<any>{serviceInstance : {}},
- <UpdateAicZonesAction>{
- type: UPDATE_AIC_ZONES,
- aicZones : aicZonesObj
- })['aicZones'];
-
- expect(aicZonesState).toBeDefined();
- expect(aicZonesState[0].id).toEqual(aicZonesObj[0].id);
- expect(aicZonesState[0].isPermitted).toEqual(aicZonesObj[0].isPermitted);
- expect(aicZonesState[0].name).toEqual(aicZonesObj[0].name);
-
- done();
- });
-
- it('#DELETE_VNF_INSTANCE : should delete existing vnf', (done: DoneFn) => {
- let state = ServiceReducer(<any>{serviceInstance : {
- 'serviceModelId' : {
- vnfs : {
- 'modelName' : {}
- }
- }
- }},
- <DeleteVnfInstanceAction>{
- type: DELETE_VNF_INSTANCE,
- modelName : 'modelName',
- serviceModelId : 'serviceModelId'
- });
-
- expect(state).toBeDefined();
- expect(state.serviceInstance[ 'serviceModelId'].vnfs['modelName']).not.toBeDefined();
- done();
- });
-
- it('#DELETE_VNF_MODULE_INSTANCE : should delete existing vnf module', (done: DoneFn) => {
- let state = ServiceReducer(<any>{serviceInstance : {
- 'serviceModelId' : {
- vnfs : {
- 'vfName' : {
- vfModules : {
- 'modelName' : {}
- }
- }
- }
- }
- }},
- <DeleteVfModuleInstanceAction>{
- type: DELETE_VNF_MODULE_INSTANCE,
- modelName : 'modelName',
- vfName : 'vfName',
- serviceModelId : 'serviceModelId'
- });
-
- expect(state).toBeDefined();
- expect(state.serviceInstance['serviceModelId'].vnfs['vfName'].vfModules['modelName']).not.toBeDefined();
- done();
- });
-
-});
diff --git a/vid-webpack-master/src/app/service.reducer.ts b/vid-webpack-master/src/app/service.reducer.ts
deleted file mode 100644
index a11f31e80..000000000
--- a/vid-webpack-master/src/app/service.reducer.ts
+++ /dev/null
@@ -1,214 +0,0 @@
-import { Action } from 'redux';
-import {
- CREATE_VF_MODULE,
- CreateVFModuleInstanceAction,
- DELETE_SERVICE_INSTANCE,
- DELETE_VNF_INSTANCE,
- DELETE_VNF_MODULE_INSTANCE,
- DeleteServiceInstanceAction,
- DeleteVfModuleInstanceAction,
- DeleteVnfInstanceAction,
- UPDATE_AIC_ZONES,
- UPDATE_CATEGORY_PARAMETERS,
- UPDATE_LCP_REGIONS_AND_TENANTS,
- UPDATE_MODEL,
- UPDATE_NETWORK_FUNCTION,
- UPDATE_PRODUCT_FAMILIES,
- UPDATE_SERVICE_INSTANCE,
- UPDATE_SERVICE_TYPES,
- UPDATE_SUBSCRIBERS,
- UPDATE_USER_ID,
- UPDATE_VF_MODULE,
- UPDATE_VNF_INSTANCE,
- UpdateAicZonesAction,
- UpdateCategoryParametersAction,
- UpdateLcpRegionsAndTenantsAction,
- UpdateNetworkCollectionFunction,
- UpdateProductFamiliesAction,
- UpdateServiceInstanceAction,
- UpdateServiceModelAction,
- UpdateServiceTypesAction,
- UpdateSubscribersAction,
- UpdateUserIdAction,
- UpdateVFModuleInstanceAction,
- UpdateVnfInstanceAction,
-} from './service.actions';
-import { LcpRegionsAndTenants } from './shared/models/lcpRegionsAndTenants';
-import * as _ from 'lodash';
-import { ServiceInstance } from './shared/models/serviceInstance';
-import { CategoryParams } from './shared/models/categoryParams';
-import { SelectOptionInterface } from './shared/models/selectOption';
-import { ServiceType } from './shared/models/serviceType';
-import { VnfInstance } from './shared/models/vnfInstance';
-import { VfModuleMap } from './shared/models/vfModulesMap';
-
-export interface ServiceState {
- serviceHierarchy: any;
- serviceInstance: { [uuid: string]: ServiceInstance; };
- lcpRegionsAndTenants: LcpRegionsAndTenants;
- subscribers: SelectOptionInterface[];
- productFamilies: any;
- serviceTypes: { [subscriberId: string]: ServiceType[]; };
- aicZones: SelectOptionInterface[];
- categoryParameters: CategoryParams;
-}
-
-const initialState: ServiceState = {
- serviceHierarchy: {},
- serviceInstance: {},
- lcpRegionsAndTenants: new LcpRegionsAndTenants(),
- subscribers: null,
- productFamilies: null,
- serviceTypes: {},
- aicZones: null,
- categoryParameters: new CategoryParams()
-};
-
-export const ServiceReducer =
- function (state: ServiceState = initialState, action: Action): ServiceState {
- switch (action.type) {
- case UPDATE_MODEL: {
- let uuid = (<UpdateServiceModelAction>action).serviceHierarchy.service.uuid;
- state.serviceHierarchy[uuid] = _.cloneDeep((<UpdateServiceModelAction>action).serviceHierarchy);
- return Object.assign({}, state);
- }
- case UPDATE_SERVICE_INSTANCE: {
- const updateServiceInstanceAction = <UpdateServiceInstanceAction>action;
- const uuid = updateServiceInstanceAction.serviceUuid;
- const newState = _.cloneDeep(state);
-
- const serviceInstance: ServiceInstance = newState.serviceInstance[uuid] || new ServiceInstance();
-
- newState.serviceInstance[uuid] = Object.assign(serviceInstance, updateServiceInstanceAction.serviceInstance);
- return newState;
- }
- case UPDATE_VNF_INSTANCE: {
- const updateVnfInstanceAction = <UpdateVnfInstanceAction>action;
- const serviceUuid = updateVnfInstanceAction.serviceUuid;
- const vnfModelName = updateVnfInstanceAction.vnfModelName;
-
- const newState = _.cloneDeep(state);
- const vnfInstance: VnfInstance = newState.serviceInstance[serviceUuid].vnfs[vnfModelName] || new VnfInstance();
-
- newState.serviceInstance[serviceUuid].vnfs[vnfModelName] = Object.assign(vnfInstance, updateVnfInstanceAction.vnfInstance);
- return newState;
- }
-
-
- case UPDATE_USER_ID: {
- const updateUserId : UpdateUserIdAction = <UpdateUserIdAction>action;
- // var newState2 = {...state,'userId':updateUserId.userId}
- var newState = _.cloneDeep(state);
- newState['userId'] = updateUserId.userId;
- return newState;
-
- // state = (... {userId:action["userId"]},state]}
- }
-
- case UPDATE_VF_MODULE: {
- const updateVFModuleInstanceAction = <UpdateVFModuleInstanceAction>action;
- const vfInstance = updateVFModuleInstanceAction.vfInstance;
- const serviceUuid = updateVFModuleInstanceAction.serviceUuid;
- const vfModuleId = updateVFModuleInstanceAction.vfId;
- const newState = _.cloneDeep(state);
- const vnfs = newState.serviceHierarchy[serviceUuid].vnfs;
- const vnfId = getVfModuleParentVnfId(vnfs, vfModuleId);
- let vfModulesMap = newState.serviceInstance[serviceUuid].vnfs[vnfId].vfModules[vfModuleId] || new VfModuleMap();
- vfModulesMap[vfModuleId] = vfInstance;
- newState.serviceInstance[serviceUuid].vnfs[vnfId].vfModules[vfModuleId] = vfModulesMap;
- return newState;
- }
-
- case CREATE_VF_MODULE: {
- const updateVFModuleInstanceAction = <CreateVFModuleInstanceAction>action;
- const vfInstance = updateVFModuleInstanceAction.vfInstance;
- const serviceUuid = updateVFModuleInstanceAction.serviceUuid;
- const vfModuleId = updateVFModuleInstanceAction.vfId;
- const index = updateVFModuleInstanceAction.index;
- let newState = Object.assign({}, state);
- const vnfs = newState.serviceHierarchy[serviceUuid].vnfs;
- const vnfId = getVfModuleParentVnfId(vnfs, vfModuleId);
- let vfModulesMap = newState.serviceInstance[serviceUuid].vnfs[vnfId].vfModules[vfModuleId] || new VfModuleMap();
- let randomId = generateId();
- vfModulesMap[vfModuleId + randomId] = vfInstance;
-
- newState.serviceInstance[serviceUuid].vnfs[vnfId].vfModules[vfModuleId] = vfModulesMap;
- return newState;
- }
-
-
- case UPDATE_LCP_REGIONS_AND_TENANTS: {
- Object.assign(state, (<UpdateLcpRegionsAndTenantsAction>action));
- return Object.assign({}, state);
- }
- case UPDATE_SUBSCRIBERS: {
- Object.assign(state, (<UpdateSubscribersAction>action));
- return Object.assign({}, state);
- }
- case UPDATE_AIC_ZONES: {
- Object.assign(state, (<UpdateAicZonesAction>action));
- return Object.assign({}, state);
- }
- case UPDATE_PRODUCT_FAMILIES: {
- Object.assign(state, (<UpdateProductFamiliesAction>action));
- return Object.assign({}, state);
- }
- case UPDATE_NETWORK_FUNCTION: {
- let networkFunctionReduxObj = state["networkFunctions"] == undefined ? {} : state["networkFunctions"];
- networkFunctionReduxObj[(<UpdateNetworkCollectionFunction>action).network_function] = (<UpdateNetworkCollectionFunction>action).networksAccordingToNetworkCollection;
- Object.assign(state, {"networkFunctions":networkFunctionReduxObj});
- return Object.assign({}, state);
- }
- case UPDATE_SERVICE_TYPES: {
- let subscriberId = (<UpdateServiceTypesAction>action).subscriberId;
- let serviceTypes = (<UpdateServiceTypesAction>action).serviceTypes;
- state.serviceTypes[subscriberId] = serviceTypes;
- return Object.assign({}, state);
- }
- case UPDATE_CATEGORY_PARAMETERS: {
- Object.assign(state, (<UpdateCategoryParametersAction>action));
- return Object.assign({}, state);
- }
- case DELETE_SERVICE_INSTANCE: {
- const uuid = (<DeleteServiceInstanceAction>action).serviceUuid;
- if (state.serviceHierarchy[uuid]) {
- let newState = _.omit(state, ['serviceInstance[' + uuid + ']']);
- return Object.assign({}, state, newState);
- }
- return Object.assign({}, state);
- }
- case DELETE_VNF_INSTANCE: {
- const actionData =(<DeleteVnfInstanceAction>action);
- if(state.serviceInstance[actionData.serviceModelId]){
- delete state.serviceInstance[actionData.serviceModelId].vnfs[actionData.modelName];
- }
- return Object.assign({}, state);
- }
-
- case DELETE_VNF_MODULE_INSTANCE: {
- const actionData =(<DeleteVfModuleInstanceAction>action);
- if(state.serviceInstance[actionData.serviceModelId]){
- delete state.serviceInstance[actionData.serviceModelId].vnfs[actionData.vfName].vfModules[actionData.modelName];
- }
- return Object.assign({}, state);
- }
- default:
- return Object.assign({}, state);
- }
- };
-
-const generateId = () => {
- return Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 5);
-};
-
-
-const getVfModuleParentVnfId = (vnfs: object, vfModuleId: string) => {
- let vnfId = undefined;
- _.forOwn(vnfs, (value, key) => {
- if (vnfs[key].vfModules && vnfs[key].vfModules[vfModuleId]) {
- vnfId = vnfs[key].modelCustomizationName;
- return false;
- }
- });
- return vnfId;
-};
diff --git a/vid-webpack-master/src/app/services/aaiService/aai.service.ts b/vid-webpack-master/src/app/services/aaiService/aai.service.ts
deleted file mode 100644
index dd9d9fb29..000000000
--- a/vid-webpack-master/src/app/services/aaiService/aai.service.ts
+++ /dev/null
@@ -1,189 +0,0 @@
-import {Injectable} from '@angular/core';
-import {HttpClient, HttpHeaders} from '@angular/common/http';
-import { Constants } from '../../shared/utils/constants';
-import { ServiceType } from "../../shared/models/serviceType";
-import {GetSubDetailsResponse} from "./responseInterfaces/getSubDetailsResponseInterface";
-import {Observable} from "rxjs/Observable";
-import * as _ from 'lodash';
-import {CategoryParams} from "../../shared/models/categoryParams";
-import {GetCategoryParamsResponseInterface} from "./responseInterfaces/getCategoryParamsResponseInterface";
-import {Project} from "../../shared/models/project";
-import {OwningEntity} from "../../shared/models/owningEntity";
-import {GetServicesResponseInterface} from "./responseInterfaces/getServicesResponseInterface";
-import {Subscriber} from "../../shared/models/subscriber";
-import {GetSubscribersResponse} from "./responseInterfaces/getSubscribersResponseInterface";
-import {AicZone} from "../../shared/models/aicZone";
-import {GetAicZonesResponse} from "./responseInterfaces/getAicZonesResponseInterface";
-import {LcpRegionsAndTenants} from "../../shared/models/lcpRegionsAndTenants";
-import {LcpRegion} from "../../shared/models/lcpRegion";
-import {Tenant} from "../../shared/models/tenant";
-import {ProductFamily} from "../../shared/models/productFamily"
-import {
- updateAicZones, updateCategoryParameters, updateLcpRegionsAndTenants, updateModel, updateProductFamilies,
- updateServiceTypes, updateSubscribers, updateUserId
-} from '../../service.actions';
-import {SelectOption} from '../../shared/models/selectOption';
-import {NgRedux} from "@angular-redux/store";
-import {AppState} from "../../store/reducers";
-import {ResponseContentType, ResponseType} from "@angular/http";
-import 'rxjs/add/operator/do';
-import 'rxjs/add/observable/of';
-import 'rxjs/add/operator/catch';
-
-@Injectable()
-export class AaiService {
-
- constructor (private http: HttpClient, private store: NgRedux<AppState>) {}
-
- public getServiceModelById(serviceModelId: string): Observable<any> {
- if (_.has(this.store.getState().service.serviceHierarchy,serviceModelId)){
- return Observable.of(<any> JSON.parse(JSON.stringify(this.store.getState().service.serviceHierarchy[serviceModelId])));
- }
- let pathQuery: string = Constants.Path.SERVICES_PATH + serviceModelId;
- return this.http.get(pathQuery).map(res => res )
- .do((res) => {
- this.store.dispatch(updateModel(res));
- });
- }
-
- public getUserId() : Observable<any>{
- return this.http.get("../../getuserID",{responseType: 'text'}).do((res)=>this.store.dispatch(updateUserId(res)));
- }
-
-
- public getCRAccordingToNetworkFunctionId(networkCollectionFunction,cloudOwner,cloudRegionId){
- return this.http.get('../../aai_get_instance_groups_by_cloudregion/'+cloudOwner+'/'+cloudRegionId+'/' + networkCollectionFunction)
- .map(res=>res).do((res)=>console.log(res));
- }
-
- public getCategoryParameters(familyName): Observable<CategoryParams> {
- familyName = familyName || Constants.Path.PARAMETER_STANDARDIZATION_FAMILY;
- let pathQuery: string = Constants.Path.GET_CATEGORY_PARAMETERS +"?familyName=" + familyName+ "&r=" + Math.random();
-
- return this.http.get<GetCategoryParamsResponseInterface>(pathQuery)
- .map(this.categoryParametersResponseToProductAndOwningEntity)
- .do(res => {
- this.store.dispatch(updateCategoryParameters(res))
- });
- }
-
-
-
- categoryParametersResponseToProductAndOwningEntity(res: GetCategoryParamsResponseInterface): CategoryParams {
- if (res && res.categoryParameters) {
- const owningEntityList = res.categoryParameters.owningEntity.map(owningEntity => new OwningEntity(owningEntity));
- const projectList = res.categoryParameters.project.map(project => new Project(project));
- const lineOfBusinessList = res.categoryParameters.lineOfBusiness.map(owningEntity => new SelectOption(owningEntity));
- const platformList = res.categoryParameters.platform.map(platform => new SelectOption(platform));
-
- return new CategoryParams(owningEntityList, projectList, lineOfBusinessList, platformList);
- } else {
- return new CategoryParams();
- }
- }
-
- public getProductFamilies(): Observable<ProductFamily[]> {
- return this.getServices().map(res => res.service.map(service => new ProductFamily(service)));
- }
-
- public getServices(): Observable<GetServicesResponseInterface> {
- let pathQuery: string = Constants.Path.AAI_GET_SERVICES + Constants.Path.ASSIGN + Math.random();
-
- return this.http.get<GetServicesResponseInterface>(pathQuery);
- }
-
- public getSubscribers(): Observable<Subscriber[]> {
- if (this.store.getState().service.subscribers){
- return Observable.of(<any> JSON.parse(JSON.stringify(this.store.getState().service.subscribers)));
- }
-
- let pathQuery: string = Constants.Path.AAI_GET_SUBSCRIBERS + Constants.Path.ASSIGN + Math.random();
-
- return this.http.get<GetSubscribersResponse>(pathQuery).map(res =>
- res.customer.map( subscriber => new Subscriber(subscriber))).do((res) => {
- this.store.dispatch(updateSubscribers(res));
- });
- }
-
- public getAicZones(): Observable<AicZone[]> {
- if (this.store.getState().service.aicZones){
- return Observable.of(<any> JSON.parse(JSON.stringify(this.store.getState().service.aicZones)));
- }
-
- let pathQuery: string = Constants.Path.AAI_GET_AIC_ZONES + Constants.Path.ASSIGN + Math.random();
-
- return this.http.get<GetAicZonesResponse>(pathQuery).map(res =>
- res.zone.map(aicZone => new AicZone(aicZone))).do((res) => {
- this.store.dispatch(updateAicZones(res));
- });
- }
-
- public getLcpRegionsAndTenants(globalCustomerId, serviceType): Observable<LcpRegionsAndTenants> {
- if (this.store.getState().service.lcpRegionsAndTenants.lcpRegionList.length !== 0){
- return Observable.of(<any> JSON.parse(JSON.stringify(this.store.getState().service.lcpRegionsAndTenants)));
- }
- let pathQuery: string = Constants.Path.AAI_GET_TENANTS
- + globalCustomerId + Constants.Path.FORWARD_SLASH + serviceType + Constants.Path.ASSIGN + Math.random();
-
- console.log("AaiService:getSubscriptionServiceTypeList: globalCustomerId: "
- + globalCustomerId);
- if (globalCustomerId != null) {
- return this.http.get(pathQuery)
- .map(this.tenantResponseToLcpRegionsAndTenants).do((res) => {
- this.store.dispatch(updateLcpRegionsAndTenants(res));
- });
- }
- }
-
- tenantResponseToLcpRegionsAndTenants(cloudRegionTenantList): LcpRegionsAndTenants {
-
- const lcpRegionsTenantsMap = {};
-
- const lcpRegionList = _.uniqBy(cloudRegionTenantList, 'cloudRegionID').map((cloudRegionTenant) => {
- return new LcpRegion(cloudRegionTenant)
- });
-
- lcpRegionList.forEach(region => {
- lcpRegionsTenantsMap[region.id] = _.filter(cloudRegionTenantList, {'cloudRegionID' : region.id})
- .map((cloudRegionTenant) => {
- return new Tenant(cloudRegionTenant)
- });
- const reducer = (accumulator, currentValue) => {
- accumulator.isPermitted = accumulator.isPermitted || currentValue.isPermitted;
-
- return accumulator;
- };
- region.isPermitted = lcpRegionsTenantsMap[region.id].reduce(reducer).isPermitted;
- });
-
- return new LcpRegionsAndTenants(lcpRegionList, lcpRegionsTenantsMap);
- }
-
- public getServiceTypes(subscriberId): Observable<ServiceType[]> {
- console.log("AaiService:getSubscriptionServiceTypeList: globalCustomerId: " + subscriberId);
- if (_.has(this.store.getState().service.serviceTypes, subscriberId)){
- return Observable.of(<any> JSON.parse(JSON.stringify(this.store.getState().service.serviceTypes[subscriberId])));
- }
-
- return this.getSubscriberDetails(subscriberId)
- .map(this.subDetailsResponseToServiceTypes)
- .do((res) => {this.store.dispatch(updateServiceTypes(res, subscriberId));});
- }
-
- public getSubscriberDetails(subscriberId): Observable<GetSubDetailsResponse> {
- let pathQuery: string = Constants.Path.AAI_SUB_DETAILS_PATH + subscriberId + Constants.Path.ASSIGN + Math.random();
-
- if (subscriberId != null) {
- return this.http.get<GetSubDetailsResponse>(pathQuery);
- }
- }
-
- subDetailsResponseToServiceTypes(res: GetSubDetailsResponse): ServiceType[] {
- if (res && res['service-subscriptions']) {
- const serviceSubscriptions = res['service-subscriptions']['service-subscription'];
- return serviceSubscriptions.map((subscription, index) => new ServiceType(String(index), subscription))
- } else {
- return [];
- }
- }
-}
diff --git a/vid-webpack-master/src/app/services/msoService/mso.service.ts b/vid-webpack-master/src/app/services/msoService/mso.service.ts
deleted file mode 100644
index 1402b50f7..000000000
--- a/vid-webpack-master/src/app/services/msoService/mso.service.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-import {Injectable} from "@angular/core";
-import {HttpClient} from "@angular/common/http";
-import {Observable} from "rxjs/Observable";
-import {Constants} from "../../shared/utils/constants";
-
-@Injectable()
-export class MsoService {
- httpClient: HttpClient;
-
- constructor(http: HttpClient) {
- this.httpClient = http;
- }
-
-
- public submitMsoTask(instanceFields): Observable<any> {
- let path = '../../asyncInstantiation/bulk';
- return this.httpClient.post(path, instanceFields);
- }
- public createVnf(requestDetails, serviceInstanceId): Observable<any> {
- let pathQuery: string = Constants.Path.MSO_CREATE_VNF_INSTANCE + serviceInstanceId;
-
- return this.httpClient.post( pathQuery, {
- requestDetails : requestDetails
- });
- }
-}
diff --git a/vid-webpack-master/src/app/services/sdc.service.ts b/vid-webpack-master/src/app/services/sdc.service.ts
deleted file mode 100644
index d4eba260a..000000000
--- a/vid-webpack-master/src/app/services/sdc.service.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import { Injectable } from '@angular/core';
-import { HttpClient } from '@angular/common/http';
-import 'rxjs/add/operator/map';
-import { Constants } from '../shared/utils/constants';
-import { VidConfiguration } from '../configuration/vid.configuration';
-
-@Injectable()
-export class SdcService {
-
-
- constructor (private http: HttpClient) {
- }
-
- public getServicesModels(): any {
- let pathQuery: string = Constants.Path.SERVICES_DIST_STATUS_PATH + VidConfiguration.ASDC_MODEL_STATUS;
-
- if ( VidConfiguration.ASDC_MODEL_STATUS === Constants.Status.ALL) {
- pathQuery = Constants.Path.SERVICES_PATH;
- }
-
- return this.http.get(pathQuery);
- }
-
- getService(uuid: string) {
- return this.http.get(Constants.Path.SERVICES_PATH + uuid);
- }
-
-}
diff --git a/vid-webpack-master/src/app/services/service-planning.service.spec.ts b/vid-webpack-master/src/app/services/service-planning.service.spec.ts
deleted file mode 100644
index 5d60e29f7..000000000
--- a/vid-webpack-master/src/app/services/service-planning.service.spec.ts
+++ /dev/null
@@ -1,467 +0,0 @@
-import {ServicePlanningService} from "./service-planning.service";
-import {ReflectiveInjector} from "@angular/core";
-import {NgRedux} from "@angular-redux/store";
-import {ServiceNodeTypes} from "../shared/models/ServiceNodeTypes";
-
-export class MockAppStore<T> {
-}
-
-describe('Service planning service', () => {
- let injector;
- let service: ServicePlanningService;
-
- beforeEach(() => {
-
- let injector = ReflectiveInjector.resolveAndCreate([
- ServicePlanningService,
- {provide: NgRedux, useClass: MockAppStore}
- ]);
-
- service = injector.get(ServicePlanningService);
- });
-
- describe('#updateDynamicInputsVnfDataFromModel', () => {
- it('get vfModule instance params', (done: DoneFn) => {
- //get vfModule instance params
- let dynamicInputs = service.updateDynamicInputsVnfDataFromModel(ServiceNodeTypes.VFmodule, generateVFModule());
- expect(dynamicInputs).toEqual([{
- id: '2017488_adiodvpe0_vnf_config_template_version',
- type: 'string',
- name: '2017488_adiodvpe0_vnf_config_template_version',
- value: '17.2',
- isRequired: true,
- description: 'VPE Software Version'
- }, {
- id: '2017488_adiodvpe0_AIC_CLLI',
- type: 'string',
- name: '2017488_adiodvpe0_AIC_CLLI',
- value: 'ATLMY8GA',
- isRequired: true,
- description: 'AIC Site CLLI'
- }]);
-
- //get vfModule with no instance params should return empty array
- dynamicInputs = service.updateDynamicInputsVnfDataFromModel(ServiceNodeTypes.VFmodule, generateVFModule2);
- expect(dynamicInputs).toEqual([]);
-
- //get vf instance params should be undefined
- dynamicInputs = service.updateDynamicInputsVnfDataFromModel(ServiceNodeTypes.VF, generateVNF());
- expect(dynamicInputs).toEqual([]);
- done();
- });
- });
-
- describe('#isUserProvidedNaming', () => {
- it('get vfModule with generate ecompNaming should return userProvided false', (done: DoneFn) => {
- //get vfModule with generate ecompNaming should return userProvided false
- let isUserProvidedNaming = service.isUserProvidedNaming(ServiceNodeTypes.VFmodule, generateVFModule(), generateVNF());
- expect(isUserProvidedNaming).toBeFalsy();
-
- //get vfModule without generate ecompNaming should return userProvided true
- isUserProvidedNaming = service.isUserProvidedNaming(ServiceNodeTypes.VFmodule, generateVFModule(), generateVNF_ecompNamingFalse());
- expect(isUserProvidedNaming).toBeTruthy();
-
- //get vnf with generate ecompNaming should return userProvided false
- isUserProvidedNaming = service.isUserProvidedNaming(ServiceNodeTypes.VF, generateVNF(), null);
- expect(isUserProvidedNaming).toBeFalsy();
-
- //get vnf without generate ecompNaming should return userProvided true
- isUserProvidedNaming = service.isUserProvidedNaming(ServiceNodeTypes.VF, generateVNF_ecompNamingFalse(), null);
- expect(isUserProvidedNaming).toBeTruthy();
- done();
- });
- });
-
- function generateVFModule() {
- return {
- 'uuid': '25284168-24bb-4698-8cb4-3f509146eca5',
- 'invariantUuid': '7253ff5c-97f0-4b8b-937c-77aeb4d79aa1',
- 'customizationUuid': 'f7e7c365-60cf-49a9-9ebf-a1aa11b9d401',
- 'description': null,
- 'name': '2017488AdiodVpe..ADIOD_vRE_BV..module-1',
- 'version': '6',
- 'modelCustomizationName': '2017488AdiodVpe..ADIOD_vRE_BV..module-1',
- 'properties': {'minCountInstances': 0, 'maxCountInstances': null, 'initialCount': 0},
- 'commands': {},
- 'volumeGroupAllowed': true,
- 'inputs': {
- '2017488_adiodvpe0_vnf_config_template_version': {
- 'type': 'string',
- 'description': 'VPE Software Version',
- 'entry_schema': null,
- 'constraints': [],
- 'required': true,
- 'default': '17.2'
- },
- '2017488_adiodvpe0_AIC_CLLI': {
- 'type': 'string',
- 'description': 'AIC Site CLLI',
- 'entry_schema': null,
- 'constraints': [],
- 'required': true,
- 'default': 'ATLMY8GA'
- }
- }
- };
- }
-
- function generateVFModule2() {
- return {
- 'uuid': '0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a',
- 'invariantUuid': 'eff8cc59-53a1-4101-aed7-8cf24ecf8339',
- 'customizationUuid': '3cd946bb-50e0-40d8-96d3-c9023520b557',
- 'description': null,
- 'name': '2017488AdiodVpe..ADIOD_vPFE_BV..module-2',
- 'version': '6',
- 'modelCustomizationName': '2017488AdiodVpe..ADIOD_vPFE_BV..module-2',
- 'properties': {'minCountInstances': 0, 'maxCountInstances': null, 'initialCount': 0},
- 'commands': {},
- 'volumeGroupAllowed': true,
- 'inputs': {}
- };
- }
-
- function generateVNF() {
- return {
- 'uuid': '0903e1c0-8e03-4936-b5c2-260653b96413',
- 'invariantUuid': '00beb8f9-6d39-452f-816d-c709b9cbb87d',
- 'description': 'Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM',
- 'name': '2017-388_ADIOD-vPE',
- 'version': '1.0',
- 'customizationUuid': '280dec31-f16d-488b-9668-4aae55d6648a',
- 'inputs': {
- 'vnf_config_template_version': {
- 'type': 'string',
- 'description': 'VPE Software Version',
- 'entry_schema': null,
- 'constraints': [],
- 'required': true,
- 'default': '17.2'
- },
- 'bandwidth_units': {
- 'type': 'string',
- 'description': 'Units of bandwidth',
- 'entry_schema': null,
- 'constraints': [],
- 'required': true,
- 'default': 'Gbps'
- },
- 'bandwidth': {
- 'type': 'string',
- 'description': 'Requested VPE bandwidth',
- 'entry_schema': null,
- 'constraints': [],
- 'required': true,
- 'default': '10'
- },
- 'AIC_CLLI': {
- 'type': 'string',
- 'description': 'AIC Site CLLI',
- 'entry_schema': null,
- 'constraints': [],
- 'required': true,
- 'default': 'ATLMY8GA'
- },
- 'ASN': {
- 'type': 'string',
- 'description': 'AV/PE',
- 'entry_schema': null,
- 'constraints': [],
- 'required': true,
- 'default': 'AV_vPE'
- },
- 'vnf_instance_name': {
- 'type': 'string',
- 'description': 'The hostname assigned to the vpe.',
- 'entry_schema': null,
- 'constraints': [],
- 'required': true,
- 'default': 'mtnj309me6'
- }
- },
- 'commands': {
- 'vnf_config_template_version': {
- 'displayName': 'vnf_config_template_version',
- 'command': 'get_input',
- 'inputName': '2017488_adiodvpe0_vnf_config_template_version'
- },
- 'bandwidth_units': {
- 'displayName': 'bandwidth_units',
- 'command': 'get_input',
- 'inputName': 'adiodvpe0_bandwidth_units'
- },
- 'bandwidth': {'displayName': 'bandwidth', 'command': 'get_input', 'inputName': 'adiodvpe0_bandwidth'},
- 'AIC_CLLI': {'displayName': 'AIC_CLLI', 'command': 'get_input', 'inputName': '2017488_adiodvpe0_AIC_CLLI'},
- 'ASN': {'displayName': 'ASN', 'command': 'get_input', 'inputName': '2017488_adiodvpe0_ASN'},
- 'vnf_instance_name': {
- 'displayName': 'vnf_instance_name',
- 'command': 'get_input',
- 'inputName': '2017488_adiodvpe0_vnf_instance_name'
- }
- },
- 'properties': {
- 'vmxvre_retype': 'RE-VMX',
- 'vnf_config_template_version': 'get_input:2017488_adiodvpe0_vnf_config_template_version',
- 'sriov44_net_id': '48d399b3-11ee-48a8-94d2-f0ea94d6be8d',
- 'int_ctl_net_id': '2f323477-6936-4d01-ac53-d849430281d9',
- 'vmxvpfe_sriov41_0_port_mac': '00:11:22:EF:AC:DF',
- 'int_ctl_net_name': 'VMX-INTXI',
- 'vmx_int_ctl_prefix': '128.0.0.0',
- 'sriov43_net_id': 'da349ca1-6de9-4548-be88-2d88e99bfef5',
- 'sriov42_net_id': '760669ba-013d-4d9b-b0e7-4151fe2e6279',
- 'sriov41_net_id': '25ad52d5-c165-40f8-b3b0-ddfc2373280a',
- 'nf_type': 'vPE',
- 'vmxvpfe_int_ctl_ip_1': '128.0.0.16',
- 'is_AVPN_service': 'false',
- 'vmx_RSG_name': 'vREXI-affinity',
- 'vmx_int_ctl_forwarding': 'l2',
- 'vmxvre_oam_ip_0': '10.40.123.5',
- 'vmxvpfe_sriov44_0_port_mac': '00:11:22:EF:AC:DF',
- 'vmxvpfe_sriov41_0_port_vlanstrip': 'false',
- 'vmxvpfe_sriov42_0_port_vlanfilter': '4001',
- 'vmxvpfe_sriov44_0_port_unknownunicastallow': 'true',
- 'vmxvre_image_name_0': 'VRE-ENGINE_17.2-S2.1.qcow2',
- 'vmxvre_instance': '0',
- 'vmxvpfe_sriov43_0_port_mac': '00:11:22:EF:AC:DF',
- 'vmxvre_flavor_name': 'ns.c1r16d32.v5',
- 'vmxvpfe_volume_size_0': '40.0',
- 'vmxvpfe_sriov43_0_port_vlanfilter': '4001',
- 'nf_naming': '{ecomp_generated_naming=true}',
- 'nf_naming_code': 'Navneet',
- 'vmxvre_name_0': 'vREXI',
- 'vmxvpfe_sriov42_0_port_vlanstrip': 'false',
- 'vmxvpfe_volume_name_0': 'vPFEXI_FBVolume',
- 'vmx_RSG_id': 'bd89a33c-13c3-4a04-8fde-1a57eb123141',
- 'vmxvpfe_image_name_0': 'VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2',
- 'vmxvpfe_sriov43_0_port_unknownunicastallow': 'true',
- 'vmxvpfe_sriov44_0_port_unknownmulticastallow': 'true',
- 'vmxvre_console': 'vidconsole',
- 'vmxvpfe_sriov44_0_port_vlanfilter': '4001',
- 'vmxvpfe_sriov42_0_port_mac': '00:11:22:EF:AC:DF',
- 'vmxvpfe_volume_id_0': '47cede15-da2f-4397-a101-aa683220aff3',
- 'vmxvpfe_sriov42_0_port_unknownmulticastallow': 'true',
- 'vmxvpfe_sriov44_0_port_vlanstrip': 'false',
- 'vf_module_id': '123',
- 'nf_function': 'JAI',
- 'vmxvpfe_sriov43_0_port_unknownmulticastallow': 'true',
- 'vmxvre_int_ctl_ip_0': '128.0.0.1',
- 'AIC_CLLI': 'get_input:2017488_adiodvpe0_AIC_CLLI',
- 'vnf_name': 'mtnj309me6vre',
- 'vmxvpfe_sriov41_0_port_unknownunicastallow': 'true',
- 'vmxvre_volume_type_1': 'HITACHI',
- 'vmxvpfe_sriov44_0_port_broadcastallow': 'true',
- 'vmxvre_volume_type_0': 'HITACHI',
- 'vmxvpfe_volume_type_0': 'HITACHI',
- 'vmxvpfe_sriov43_0_port_broadcastallow': 'true',
- 'bandwidth_units': 'get_input:adiodvpe0_bandwidth_units',
- 'vnf_id': '123',
- 'vmxvre_oam_prefix': '24',
- 'availability_zone_0': 'mtpocfo-kvm-az01',
- 'ASN': 'get_input:2017488_adiodvpe0_ASN',
- 'vmxvre_chassis_i2cid': '161',
- 'vmxvpfe_name_0': 'vPFEXI',
- 'bandwidth': 'get_input:adiodvpe0_bandwidth',
- 'availability_zone_max_count': '1',
- 'vmxvre_volume_size_0': '45.0',
- 'vmxvre_volume_size_1': '50.0',
- 'vmxvpfe_sriov42_0_port_broadcastallow': 'true',
- 'vmxvre_oam_gateway': '10.40.123.1',
- 'vmxvre_volume_name_1': 'vREXI_FAVolume',
- 'vmxvre_ore_present': '0',
- 'vmxvre_volume_name_0': 'vREXI_FBVolume',
- 'vmxvre_type': '0',
- 'vnf_instance_name': 'get_input:2017488_adiodvpe0_vnf_instance_name',
- 'vmxvpfe_sriov41_0_port_unknownmulticastallow': 'true',
- 'oam_net_id': 'b95eeb1d-d55d-4827-abb4-8ebb94941429',
- 'vmx_int_ctl_len': '24',
- 'vmxvpfe_sriov43_0_port_vlanstrip': 'false',
- 'vmxvpfe_sriov41_0_port_broadcastallow': 'true',
- 'vmxvre_volume_id_1': '6e86797e-03cd-4fdc-ba72-2957119c746d',
- 'vmxvpfe_sriov41_0_port_vlanfilter': '4001',
- 'nf_role': 'Testing',
- 'vmxvre_volume_id_0': 'f4eacb79-f687-4e9d-b760-21847c8bb15a',
- 'vmxvpfe_sriov42_0_port_unknownunicastallow': 'true',
- 'vmxvpfe_flavor_name': 'ns.c20r16d25.v5'
- },
- 'type': 'VF',
- 'modelCustomizationName': '2017-388_ADIOD-vPE 1',
- 'vfModules': {},
- 'volumeGroups': {}
- };
- }
-
- function generateVNF_ecompNamingFalse() {
- return {
- 'uuid': '0903e1c0-8e03-4936-b5c2-260653b96413',
- 'invariantUuid': '00beb8f9-6d39-452f-816d-c709b9cbb87d',
- 'description': 'Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM',
- 'name': '2017-388_ADIOD-vPE',
- 'version': '1.0',
- 'customizationUuid': '280dec31-f16d-488b-9668-4aae55d6648a',
- 'inputs': {
- 'vnf_config_template_version': {
- 'type': 'string',
- 'description': 'VPE Software Version',
- 'entry_schema': null,
- 'constraints': [],
- 'required': true,
- 'default': '17.2'
- },
- 'bandwidth_units': {
- 'type': 'string',
- 'description': 'Units of bandwidth',
- 'entry_schema': null,
- 'constraints': [],
- 'required': true,
- 'default': 'Gbps'
- },
- 'bandwidth': {
- 'type': 'string',
- 'description': 'Requested VPE bandwidth',
- 'entry_schema': null,
- 'constraints': [],
- 'required': true,
- 'default': '10'
- },
- 'AIC_CLLI': {
- 'type': 'string',
- 'description': 'AIC Site CLLI',
- 'entry_schema': null,
- 'constraints': [],
- 'required': true,
- 'default': 'ATLMY8GA'
- },
- 'ASN': {
- 'type': 'string',
- 'description': 'AV/PE',
- 'entry_schema': null,
- 'constraints': [],
- 'required': true,
- 'default': 'AV_vPE'
- },
- 'vnf_instance_name': {
- 'type': 'string',
- 'description': 'The hostname assigned to the vpe.',
- 'entry_schema': null,
- 'constraints': [],
- 'required': true,
- 'default': 'mtnj309me6'
- }
- },
- 'commands': {
- 'vnf_config_template_version': {
- 'displayName': 'vnf_config_template_version',
- 'command': 'get_input',
- 'inputName': '2017488_adiodvpe0_vnf_config_template_version'
- },
- 'bandwidth_units': {
- 'displayName': 'bandwidth_units',
- 'command': 'get_input',
- 'inputName': 'adiodvpe0_bandwidth_units'
- },
- 'bandwidth': {'displayName': 'bandwidth', 'command': 'get_input', 'inputName': 'adiodvpe0_bandwidth'},
- 'AIC_CLLI': {'displayName': 'AIC_CLLI', 'command': 'get_input', 'inputName': '2017488_adiodvpe0_AIC_CLLI'},
- 'ASN': {'displayName': 'ASN', 'command': 'get_input', 'inputName': '2017488_adiodvpe0_ASN'},
- 'vnf_instance_name': {
- 'displayName': 'vnf_instance_name',
- 'command': 'get_input',
- 'inputName': '2017488_adiodvpe0_vnf_instance_name'
- }
- },
- 'properties': {
- 'ecomp_generated_naming': "false",
- 'vmxvre_retype': 'RE-VMX',
- 'vnf_config_template_version': 'get_input:2017488_adiodvpe0_vnf_config_template_version',
- 'sriov44_net_id': '48d399b3-11ee-48a8-94d2-f0ea94d6be8d',
- 'int_ctl_net_id': '2f323477-6936-4d01-ac53-d849430281d9',
- 'vmxvpfe_sriov41_0_port_mac': '00:11:22:EF:AC:DF',
- 'int_ctl_net_name': 'VMX-INTXI',
- 'vmx_int_ctl_prefix': '128.0.0.0',
- 'sriov43_net_id': 'da349ca1-6de9-4548-be88-2d88e99bfef5',
- 'sriov42_net_id': '760669ba-013d-4d9b-b0e7-4151fe2e6279',
- 'sriov41_net_id': '25ad52d5-c165-40f8-b3b0-ddfc2373280a',
- 'nf_type': 'vPE',
- 'vmxvpfe_int_ctl_ip_1': '128.0.0.16',
- 'is_AVPN_service': 'false',
- 'vmx_RSG_name': 'vREXI-affinity',
- 'vmx_int_ctl_forwarding': 'l2',
- 'vmxvre_oam_ip_0': '10.40.123.5',
- 'vmxvpfe_sriov44_0_port_mac': '00:11:22:EF:AC:DF',
- 'vmxvpfe_sriov41_0_port_vlanstrip': 'false',
- 'vmxvpfe_sriov42_0_port_vlanfilter': '4001',
- 'vmxvpfe_sriov44_0_port_unknownunicastallow': 'true',
- 'vmxvre_image_name_0': 'VRE-ENGINE_17.2-S2.1.qcow2',
- 'vmxvre_instance': '0',
- 'vmxvpfe_sriov43_0_port_mac': '00:11:22:EF:AC:DF',
- 'vmxvre_flavor_name': 'ns.c1r16d32.v5',
- 'vmxvpfe_volume_size_0': '40.0',
- 'vmxvpfe_sriov43_0_port_vlanfilter': '4001',
- 'nf_naming': '{ecomp_generated_naming=false}',
- 'nf_naming_code': 'Navneet',
- 'vmxvre_name_0': 'vREXI',
- 'vmxvpfe_sriov42_0_port_vlanstrip': 'false',
- 'vmxvpfe_volume_name_0': 'vPFEXI_FBVolume',
- 'vmx_RSG_id': 'bd89a33c-13c3-4a04-8fde-1a57eb123141',
- 'vmxvpfe_image_name_0': 'VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2',
- 'vmxvpfe_sriov43_0_port_unknownunicastallow': 'true',
- 'vmxvpfe_sriov44_0_port_unknownmulticastallow': 'true',
- 'vmxvre_console': 'vidconsole',
- 'vmxvpfe_sriov44_0_port_vlanfilter': '4001',
- 'vmxvpfe_sriov42_0_port_mac': '00:11:22:EF:AC:DF',
- 'vmxvpfe_volume_id_0': '47cede15-da2f-4397-a101-aa683220aff3',
- 'vmxvpfe_sriov42_0_port_unknownmulticastallow': 'true',
- 'vmxvpfe_sriov44_0_port_vlanstrip': 'false',
- 'vf_module_id': '123',
- 'nf_function': 'JAI',
- 'vmxvpfe_sriov43_0_port_unknownmulticastallow': 'true',
- 'vmxvre_int_ctl_ip_0': '128.0.0.1',
- 'AIC_CLLI': 'get_input:2017488_adiodvpe0_AIC_CLLI',
- 'vnf_name': 'mtnj309me6vre',
- 'vmxvpfe_sriov41_0_port_unknownunicastallow': 'true',
- 'vmxvre_volume_type_1': 'HITACHI',
- 'vmxvpfe_sriov44_0_port_broadcastallow': 'true',
- 'vmxvre_volume_type_0': 'HITACHI',
- 'vmxvpfe_volume_type_0': 'HITACHI',
- 'vmxvpfe_sriov43_0_port_broadcastallow': 'true',
- 'bandwidth_units': 'get_input:adiodvpe0_bandwidth_units',
- 'vnf_id': '123',
- 'vmxvre_oam_prefix': '24',
- 'availability_zone_0': 'mtpocfo-kvm-az01',
- 'ASN': 'get_input:2017488_adiodvpe0_ASN',
- 'vmxvre_chassis_i2cid': '161',
- 'vmxvpfe_name_0': 'vPFEXI',
- 'bandwidth': 'get_input:adiodvpe0_bandwidth',
- 'availability_zone_max_count': '1',
- 'vmxvre_volume_size_0': '45.0',
- 'vmxvre_volume_size_1': '50.0',
- 'vmxvpfe_sriov42_0_port_broadcastallow': 'true',
- 'vmxvre_oam_gateway': '10.40.123.1',
- 'vmxvre_volume_name_1': 'vREXI_FAVolume',
- 'vmxvre_ore_present': '0',
- 'vmxvre_volume_name_0': 'vREXI_FBVolume',
- 'vmxvre_type': '0',
- 'vnf_instance_name': 'get_input:2017488_adiodvpe0_vnf_instance_name',
- 'vmxvpfe_sriov41_0_port_unknownmulticastallow': 'true',
- 'oam_net_id': 'b95eeb1d-d55d-4827-abb4-8ebb94941429',
- 'vmx_int_ctl_len': '24',
- 'vmxvpfe_sriov43_0_port_vlanstrip': 'false',
- 'vmxvpfe_sriov41_0_port_broadcastallow': 'true',
- 'vmxvre_volume_id_1': '6e86797e-03cd-4fdc-ba72-2957119c746d',
- 'vmxvpfe_sriov41_0_port_vlanfilter': '4001',
- 'nf_role': 'Testing',
- 'vmxvre_volume_id_0': 'f4eacb79-f687-4e9d-b760-21847c8bb15a',
- 'vmxvpfe_sriov42_0_port_unknownunicastallow': 'true',
- 'vmxvpfe_flavor_name': 'ns.c20r16d25.v5'
- },
- 'type': 'VF',
- 'modelCustomizationName': '2017-388_ADIOD-vPE 1',
- 'vfModules': {},
- 'volumeGroups': {}
- };
- }
-
-});
-
-
-
-
diff --git a/vid-webpack-master/src/app/services/service-planning.service.ts b/vid-webpack-master/src/app/services/service-planning.service.ts
deleted file mode 100644
index 75720c8a1..000000000
--- a/vid-webpack-master/src/app/services/service-planning.service.ts
+++ /dev/null
@@ -1,282 +0,0 @@
-import {Injectable} from '@angular/core';
-import {Constants} from "../shared/utils/constants";
-import {Utils} from "../utils/utils";
-import * as _ from 'lodash';
-import Parameter = Constants.Parameter;
-import {ITreeNode} from "angular-tree-component/dist/defs/api";
-import {ServiceInstance} from "../shared/models/serviceInstance";
-import {VNFModel} from "../shared/models/vnfModel";
-import {ServiceNodeTypes} from "../shared/models/ServiceNodeTypes";
-import {VfModuleMap} from "../shared/models/vfModulesMap";
-import {VnfInstance} from "../shared/models/vnfInstance";
-import {VfModuleTreeNode} from "../shared/models/vfModuleTreeNode";
-import {VfModule} from "../shared/models/vfModule";
-import {VnfTreeNode} from "../shared/models/vnfTreeNode";
-import {NgRedux} from "@angular-redux/store";
-import {AppState} from "../store/reducers";
-import {InputType} from "../shared/models/inputTypes";
-
-
-@Injectable()
-export class ServicePlanningService {
-
- modelDataTree: any[] = [];
- drawingDataTree: any[] = [];
- service: any = {name:'My Service'} ;
- public requiredFields = {
- VF: [InputType.LCP_REGION, InputType.TENANT, InputType.PLATFORM],
- VFmodule: []
- };
-
- constructor(private store: NgRedux<AppState>) {}
-
-
- public getServiceName() :string{
- return this.service.name;
- }
-
- public getServiceInstance(serviceModelId): ServiceInstance {
- return this.store.getState().service.serviceInstance[serviceModelId];
- }
-
- public getVnfInstance(serviceModelId, vnfModelName): VnfInstance {
- return this.getServiceInstance(serviceModelId).vnfs[vnfModelName];
- }
-
- public getVfModuleMap(serviceModelId, vnfModelName, vfModuleModelName): VfModuleMap {
- let vnfInstance = this.getVnfInstance(serviceModelId, vnfModelName);
- return _.get(vnfInstance, ['vfModules', vfModuleModelName]);
- }
-
- public convertServiceModelToTreeNodes(serviceModel) {
- let _this = this;
-
- _.forOwn(serviceModel.vnfs, function(item, key) {
- _this.addFirstLevelModel(key, item, item.type, serviceModel);
- });
-
- _.forOwn(serviceModel.configurations, function(item, key) {
- _this.addFirstLevelModel(key, item, ServiceNodeTypes.Configuration, serviceModel);
- });
-
- _.forOwn(serviceModel.networks, function(network, key) {
- _this.addFirstLevelModel(key, network, ServiceNodeTypes.Network, serviceModel);
- });
-
- return this.modelDataTree;
- }
-
- private addFirstLevelModel(key, value, valueType, serviceModel) {
-
- let node = this.convertItemToTreeNode(key, value, valueType, null, false);
- let vnfInstance = this.getVnfInstance(serviceModel.service.uuid, key);
- if(value.vfModules) {
- node.children = Object.keys(value.vfModules).map((vmKey) =>
- this.convertItemToTreeNode(vmKey, value.vfModules[vmKey], ServiceNodeTypes.VFmodule, value, !vnfInstance));
- }
- this.modelDataTree.push(node);
- }
-
- private convertItemToTreeNode(key, value, valueType, parentModel , disabled) {
-
- return {
- id: value.uuid,
- name: key,
- tooltip: valueType,
- type: valueType,
- count: value.count || 0,
- max: value.max || 1,
- children: [],
- disabled: disabled,
- dynamicInputs: this.updateDynamicInputsVnfDataFromModel(valueType, value),
- userProvidedNaming: this.isUserProvidedNaming(valueType, value, parentModel)
- }
- }
-
- public convertServiceInstanceToTreeData(serviceInstance: ServiceInstance, modelId: string): any {
- let drawingBoardData = [];
- let _this = this;
- _.forOwn(serviceInstance.vnfs, (vnfInstance, vnfModelName) => {
- let vnfModel: VNFModel = _this.store.getState().service.serviceHierarchy[modelId].vnfs[vnfModelName];
- let vnfNode = new VnfTreeNode(vnfInstance, vnfModel);
-
- let vfModuleNodes = [];
- _.forOwn(vnfInstance.vfModules, (vfModuleMap, vfModuleModelName) => {
- _.forOwn(vfModuleMap, (vfModuleInstance, vfModuleInstsanceName) => {
- let vfModule: VfModule = _this.store.getState().service.serviceHierarchy[modelId].vnfs[vnfModelName].vfModules[vfModuleModelName];
- let vfModuleNode: VfModuleTreeNode = new VfModuleTreeNode(vfModuleInstance, vfModule, vfModuleModelName);
- vfModuleNodes.push(vfModuleNode);
- });
- });
- vnfNode.children = vfModuleNodes;
- drawingBoardData.push(vnfNode);
- });
-
- return drawingBoardData;
- }
-
- public getArbitraryInputs(inputs) {
- let parameter;
- let parameterList = [];
- for (let key in inputs) {
- parameter = {
- id : key,
- type : Parameter.STRING,
- name : key,
- value : inputs[key][Parameter.DEFAULT],
- isRequired : inputs[key][Parameter.REQUIRED],
- description : inputs[key][Parameter.DESCRIPTION]
- };
- switch (inputs[key][Parameter.TYPE]) {
- case Parameter.INTEGER:
- parameter.type = Parameter.NUMBER;
- break;
- case Parameter.BOOLEAN:
- parameter.type = Parameter.BOOLEAN;
- break;
- case Parameter.RANGE:
- break;
- case Parameter.LIST:
- parameter.type = Parameter.LIST;
- break;
- case Parameter.MAP:
- parameter.type = Parameter.MAP;
- break;
- }
- if ( Utils.hasContents(inputs[key][Parameter.CONSTRAINTS])
- && ( inputs[key][Parameter.CONSTRAINTS].length > 0 ) ) {
- let constraintsArray = inputs[key][Parameter.CONSTRAINTS];
- this.addConstraintParameters (parameterList, constraintsArray, key, inputs, parameter);
- }
- else {
-
- parameterList.push(parameter);
- }
- }
- return parameterList;
- }
-
- private addConstraintParameters(parameterList, constraintsArray, key, inputs, parameter) {
- // If there are constraints and the operator is "valid_values",
- // use a select parameter type.
- let i:number = constraintsArray.length;
- let parameterPushed: boolean = false;
- if ( i > 0 ) {
- while ( (i--) && (!parameterPushed) ) {
- let keys = Object.keys(constraintsArray[i]);
- for ( let operator in keys ) {
- switch (keys[operator]) {
- case Parameter.VALID_VALUES:
- let j: number = constraintsArray[i][Parameter.VALID_VALUES].length;
- if ( j > 0 ) {
- let oList = [];
- let option;
- while (j--) {
- option = {
- name: constraintsArray[i][Parameter.VALID_VALUES][j],
- isDefault: false
- };
- if ( (Utils.hasContents (inputs[key][Parameter.DEFAULT]) )
- && (inputs[key][Parameter.DEFAULT] === constraintsArray[i][Parameter.VALID_VALUES][j] ) ) {
- option = {
- name: constraintsArray[i][Parameter.VALID_VALUES][j],
- isDefault: true
- }
- }
- oList.push(option);
- }
- parameter.type = Parameter.SELECT;
- parameter.optionList = oList;
- parameterList.push(parameter);
- parameterPushed = true;
- }
- break;
-
- case Parameter.EQUAL:
- if ( constraintsArray[i][Parameter.EQUAL] != null ) {
- //override parameter type
- parameter.type = Parameter.STRING;
- parameter.isReadOnly = true;
- parameter.value = constraintsArray[i][Parameter.EQUAL];
- parameterList.push(parameter);
- parameterPushed = true;
- }
- break;
-
- case Parameter.LENGTH:
- if ( constraintsArray[i][Parameter.LENGTH] != null ) {
- parameter.minLength = constraintsArray[i][Parameter.LENGTH];
- parameter.maxLength = constraintsArray[i][Parameter.LENGTH];
- parameterList.push(parameter);
- parameterPushed = true;
- }
- break;
- case Parameter.MAX_LENGTH:
- if ( constraintsArray[i][Parameter.MAX_LENGTH] != null ) {
- parameter.maxLength = constraintsArray[i][Parameter.MAX_LENGTH];
- parameterList.push(parameter);
- parameterPushed = true;
- }
- break;
- case Parameter.MIN_LENGTH:
- if ( constraintsArray[i][Parameter.MIN_LENGTH] != null ) {
- parameter.minLength = constraintsArray[i][Parameter.MIN_LENGTH];
- parameterList.push(parameter);
- parameterPushed = true;
- }
- break;
- case Parameter.IN_RANGE:
- if ( constraintsArray[i][Parameter.IN_RANGE] != null ) {
- if (constraintsArray[i][Parameter.IN_RANGE].length > 1 ) {
- parameter.min = constraintsArray[i][Parameter.IN_RANGE][0];
- parameter.max = constraintsArray[i][Parameter.IN_RANGE][1];
- parameter.type = Parameter.NUMBER;
- parameter.value = inputs[key][Parameter.DEFAULT];
- parameterList.push(parameter);
- parameterPushed = true;
- }
- }
- break;
- case Parameter.GREATER_THAN:
- if ( constraintsArray[i][Parameter.GREATER_THAN] != null ) {
- parameter.type = Parameter.NUMBER;
- parameter.min = constraintsArray[i][Parameter.GREATER_THAN];
- parameter.value = inputs[key][Parameter.DEFAULT];
- parameterList.push(parameter);
- parameterPushed = true;
- }
- break;
- }//switch
- }//for
- }//while
- }//if
- };
-
- public static isVfModule(node:ITreeNode): boolean {
- return node.data.type=='VFmodule';
- }
-
- public static isVnf(node:ITreeNode): boolean {
- return node.data.type == ServiceNodeTypes.VF;
- }
-
- updateDynamicInputsVnfDataFromModel(modelType: string, model: any): Array<any> {
- let displayInputs;
- if (modelType === ServiceNodeTypes.VFmodule) {
- displayInputs = model.inputs;
- }
- return _.isEmpty(displayInputs) ? [] : this.getArbitraryInputs(displayInputs);
- }
-
- isUserProvidedNaming(type: string, nodeModel: any, parentModel: any) : boolean {
- let model;
- if (type === ServiceNodeTypes.VFmodule) {
- model = parentModel;
- }
- else {
- model = nodeModel;
- }
- const ecompGeneratedNaming = model.properties.ecomp_generated_naming;
- return ecompGeneratedNaming !== undefined && ecompGeneratedNaming === "false";
- }
-}
diff --git a/vid-webpack-master/src/app/shared/api.service.ts b/vid-webpack-master/src/app/shared/api.service.ts
deleted file mode 100644
index a69d91ea4..000000000
--- a/vid-webpack-master/src/app/shared/api.service.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { Injectable } from '@angular/core';
-
-@Injectable()
-export class ApiService {
- title = 'Angular 2';
-}
diff --git a/vid-webpack-master/src/app/instantiationStatus/auditInfoModal/auditInfoModal.component.html b/vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.html
index 9386af347..1dad32376 100644
--- a/vid-webpack-master/src/app/instantiationStatus/auditInfoModal/auditInfoModal.component.html
+++ b/vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.html
@@ -8,14 +8,14 @@
</div>
<div class="modal-body row">
<div class="col-md-4 left-panel">
- <div id="service-model-name" class="row">SERVICE MODEL: {{serviceModelName}}</div>
+ <div id="service-model-name" class="row">{{type | uppercase}} MODEL: <span>{{serviceModelName}}</span></div>
<div class="row service-model">
<model-information [modelInformationItems]="modelInfoItems"></model-information>
</div>
</div>
<div class="col-md-8 right-panel">
- <div class="row"><span class="table-title">VID status</span></div>
- <div class="row">
+ <div class="row" *ngIf="showVidStatus"><span class="table-title">VID status</span></div>
+ <div class="row" *ngIf="showVidStatus">
<table id="service-instantiation-audit-info-vid" class="table table-bordered">
<thead class="thead-dark">
<tr class="row">
@@ -43,29 +43,36 @@
<div class="no-result" *ngIf="!isLoading && vidInfoData?.length == 0">There is no data.</div>
</div>
- <div class="row"><span class="table-title">MSO status</span></div>
+ <div class="row">
+ <div class="col-md-6 leftColumn"><span class="table-title">MSO status</span></div>
+ <div class="col-md-6 rightColumn"><span><a id="glossary_link" target="_blank" href="#" (click)="onNavigate()">Building Block (BB) glossary</a></span></div>
+ </div>
<table id="service-instantiation-audit-info-mso" class="table table-bordered">
<thead class="thead-dark row">
<tr class="row">
- <th class="col-md-3" scope="col">Request ID</th>
- <th class="col-md-3" scope="col">Status</th>
- <th class="col-md-3" scope="col">Status time</th>
- <th class="col-md-3" scope="col">Additional info</th>
+ <th scope="col" class="request-id">Request ID</th>
+ <th *ngIf="isAlaCarte&&isALaCarteFlagOn" id="instanceName" class="col-md-2" scope="col">Instance Name</th>
+ <th class="col-md-2" scope="col">Status</th>
+ <th class="col-md-2" scope="col">Status time</th>
+ <th class="col-md-2" scope="col">Additional info</th>
</tr>
</thead>
<tbody>
<tr class="row" *ngFor="let data of msoInfoData">
- <td class="col-md-3" id="msoRequestId">
+ <td id="msoRequestId" class="request-id">
<custom-ellipsis [id]="data?.requestId" [value]="data?.requestId"></custom-ellipsis>
</td>
- <td class="col-md-3" id="msoJobStatus">
+ <td *ngIf="isAlaCarte && isALaCarteFlagOn" class="msoInstanceName col-md-2">
+ <custom-ellipsis [id]="data?.instanceName" [value]="data?.instanceType + ': ' + data?.instanceName"></custom-ellipsis>
+ </td>
+ <td class="col-md-2" id="msoJobStatus">
<custom-ellipsis [id]="data?.jobStatus" [value]="data?.jobStatus | capitalizeAndFormat"></custom-ellipsis>
</td>
- <td class="col-md-3" id="msoStatusTime">
+ <td class="col-md-2" id="msoStatusTime">
<custom-ellipsis [id]="data?.vidCreated"
[value]="data?.createdDate | date:'MMM dd, yyyy HH:mm'"></custom-ellipsis>
</td>
- <td class="col-md-3" id="msoAdditionalInfo">
+ <td class="col-md-2" id="msoAdditionalInfo">
<custom-ellipsis [id]="data?.additionalInfo" [value]="data?.additionalInfo"></custom-ellipsis>
</td>
</tr>
@@ -73,9 +80,10 @@
</table>
<div class="no-result" *ngIf="!isLoading && msoInfoData?.length == 0">There is no data.</div>
</div>
+
</div>
<div class="modal-footer row">
- <button id="cancelButton" type="button" class="btn btn-default cancel" (click)="onCancelClick()">
+ <button style= "font-size: 12px" id="cancelButton" type="button" class="btn btn-default cancel" (click)="onCancelClick()">
Close
</button>
</div>
diff --git a/vid-webpack-master/src/app/instantiationStatus/auditInfoModal/auditInfoModal.component.scss b/vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.scss
index 27b271496..f36b8b41d 100644
--- a/vid-webpack-master/src/app/instantiationStatus/auditInfoModal/auditInfoModal.component.scss
+++ b/vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.scss
@@ -11,7 +11,14 @@
.modal{
#audit-info-modal {
+ .leftColumn {
+ padding-left: 0;
+ }
+ .rightColumn {
+ padding-right: 0;
+ text-align: right;
+ }
.modal-content{
border-radius: 0px;
border: none;
@@ -82,7 +89,9 @@
overflow-x: auto;
display: block;
color: #5A5A5A;
-
+ .request-id {
+ width: 85px;
+ }
thead {
position: sticky;
top: 0;
@@ -98,6 +107,9 @@
&:last-child{
border-right: none;
}
+ &.request-id {
+ flex-grow: 0;
+ }
}
}
}
@@ -116,9 +128,13 @@
td {
border: none;
border-right: 1px solid #d2d2d2;
+ flex-grow: 1;
&:last-child{
border-right: none;
}
+ &.request-id {
+ flex-grow: 0;
+ }
}
}
}
diff --git a/vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.service.spec.ts b/vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.service.spec.ts
new file mode 100644
index 000000000..35b5fbfe5
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.service.spec.ts
@@ -0,0 +1,274 @@
+
+import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing";
+import {getTestBed, TestBed} from "@angular/core/testing";
+import {NgRedux} from "@angular-redux/store";
+import {AuditInfoModalComponentService} from "./auditInfoModal.component.service";
+import {ModelInformationItem} from "../model-information/model-information.component";
+
+class MockAppStore<T> {
+ getState() {
+ return {
+ "service": {
+ "serviceInstance": {
+ "6e59c5de-f052-46fa-aa7e-2fca9d674c44": {
+ "instanceParams": [],
+ "bulkSize": 1,
+ "action": "None",
+ "instanceName": "PQijmEmzhVma4zujr",
+ "instanceId": "service-instance-id",
+ "orchStatus": "GARBAGE DATA",
+ "productFamilyId": null,
+ "lcpCloudRegionId": null,
+ "tenantId": null,
+ "modelInfo": {
+ "modelInvariantId": "d27e42cf-087e-4d31-88ac-6c4b7585f800",
+ "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ "modelName": "vf_vEPDG",
+ "modelType": "service",
+ "modelVersion": "5.0"
+ },
+ "globalSubscriberId": "global-customer-id",
+ "subscriptionServiceType": "service-instance-type",
+ "owningEntityId": null,
+ "owningEntityName": null,
+ "tenantName": null,
+ "aicZoneId": null,
+ "aicZoneName": null,
+ "projectName": null,
+ "rollbackOnFailure": null,
+ "isALaCarte": false
+ }
+ },
+ "subscribers": [
+ {
+ "id": "CAR_2020_ER",
+ "name": "CAR_2020_ER",
+ "isPermitted": true
+ },
+ {
+ "id": "21014aa2-526b-11e6-beb8-9e71128cae77",
+ "name": "JULIO ERICKSON",
+ "isPermitted": false
+ },
+ {
+ "id": "global-customer-id",
+ "name": "DALE BRIDGES",
+ "isPermitted": false
+ },
+ {
+ "id": "DHV1707-TestSubscriber-1",
+ "name": "LLOYD BRIDGES",
+ "isPermitted": false
+ },
+ {
+ "id": "jimmy-example",
+ "name": "JimmyExampleCust-20161102",
+ "isPermitted": false
+ },
+ {
+ "id": "jimmy-example2",
+ "name": "JimmyExampleCust-20161103",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-TestSub-PWT-102",
+ "name": "ERICA5779-TestSub-PWT-102",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-TestSub-PWT-101",
+ "name": "ERICA5779-TestSub-PWT-101",
+ "isPermitted": false
+ },
+ {
+ "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+ "name": "Emanuel",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-Subscriber-4",
+ "name": "ERICA5779-Subscriber-5",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-TestSub-PWT-103",
+ "name": "ERICA5779-TestSub-PWT-103",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-Subscriber-2",
+ "name": "ERICA5779-Subscriber-2",
+ "isPermitted": false
+ },
+ {
+ "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "name": "SILVIA ROBBINS",
+ "isPermitted": true
+ },
+ {
+ "id": "ERICA5779-Subscriber-3",
+ "name": "ERICA5779-Subscriber-3",
+ "isPermitted": false
+ },
+ {
+ "id": "31739f3e-526b-11e6-beb8-9e71128cae77",
+ "name": "CRAIG/ROBERTS",
+ "isPermitted": false
+ }
+ ]
+ }
+ }
+ }
+}
+
+describe("Audit info modal component service", () => {
+ let injector;
+ let httpMock: HttpTestingController;
+ let auditInfoModalComponentService: AuditInfoModalComponentService;
+
+
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+ imports: [HttpClientTestingModule],
+ providers: [
+ AuditInfoModalComponentService,
+ {provide: NgRedux, useClass: MockAppStore}
+ ]
+ });
+ await TestBed.compileComponents();
+
+ injector = getTestBed();
+ httpMock = injector.get(HttpTestingController);
+ auditInfoModalComponentService = injector.get(AuditInfoModalComponentService);
+
+ })().then(done).catch(done.fail));
+
+
+ test('auditInfoModalComponentService service should be defined', () => {
+ expect(auditInfoModalComponentService).toBeDefined();
+ });
+
+ test('getModelInfo: VNF information from existing instance with model', () => {
+ const model = getVNFModel();
+ const instance = getVNFInstance();
+ const results: ModelInformationItem[] = auditInfoModalComponentService.getModelInfo(model, instance, "6e59c5de-f052-46fa-aa7e-2fca9d674c44");
+ expect(results.find((item) => item.label === 'Model customization ID').values[0]).toEqual("91415b44-753d-494c-926a-456a9172bbb9");
+ expect(results.find((item) => item.label === 'Model version').values[0]).toEqual("2.0");
+ expect(results.find((item) => item.label === 'Model name').values[0]).toEqual("VF_vMee");
+ expect(results.find((item) => item.label === 'Instance name').values[0]).toEqual("4O61SmpFAdCm1oVEs");
+ expect(results.find((item) => item.label === 'Instance ID').values[0]).toEqual("66cbb3b5-c823-470c-9520-4e0b85112250");
+ expect(results.find((item) => item.label === 'Subscriber name').values[0]).toEqual("DALE BRIDGES"); // TODO should call subscriber
+ expect(results.find((item) => item.label === 'Service type').values[0]).toEqual("service-instance-type");
+ });
+
+ test('getModelInfo: Network information from existing instance without model', () => {
+ const model = getNetworkModel();
+ const instance = getNetworkInstance();
+ const results: ModelInformationItem[] = auditInfoModalComponentService.getModelInfo(model, instance, "6e59c5de-f052-46fa-aa7e-2fca9d674c44");
+ expect(results.find((item) => item.label === 'Instance name').values[0]).toEqual("KADmyK6e3sVWNfGbA");
+ expect(results.find((item) => item.label === 'Instance ID').values[0]).toEqual("712cad2d-fc1c-40c7-aaff-d2d6e17ac2b6");
+ expect(results.find((item) => item.label === 'Subscriber name').values[0]).toEqual("DALE BRIDGES"); // TODO should call subscriber
+ expect(results.find((item) => item.label === 'Service type').values[0]).toEqual("service-instance-type");
+ });
+
+ test('getModelInfo: VFModule information from existing instance with model', () => {
+ const model = getVFModule();
+ const instance = getVFModuleInstance();
+ const results: ModelInformationItem[] = auditInfoModalComponentService.getModelInfo(model, instance, "6e59c5de-f052-46fa-aa7e-2fca9d674c44");
+ expect(results.find((item) => item.label === 'Model customization ID').values[0]).toEqual("55b1be94-671a-403e-a26c-667e9c47d091");
+ expect(results.find((item) => item.label === 'Model version').values[0]).toEqual("2");
+ expect(results.find((item) => item.label === 'Model name').values[0]).toEqual("VfVmee..vmme_vlc..module-1");
+ expect(results.find((item) => item.label === 'Instance name').values[0]).toEqual("ss820f_0918_db");
+ expect(results.find((item) => item.label === 'Instance ID').values[0]).toEqual("2c1ca484-cbc2-408b-ab86-25a2c15ce280");
+ expect(results.find((item) => item.label === 'Subscriber name').values[0]).toEqual("DALE BRIDGES"); // TODO should call subscriber
+ expect(results.find((item) => item.label === 'Service type').values[0]).toEqual("service-instance-type");
+ });
+
+ test('getModelInfo: VNFGroup information from existing instance with model', () => {
+ const model = getVNFGroupModel();
+ const instance = getVNFGroupInstance();
+ const results: ModelInformationItem[] = auditInfoModalComponentService.getModelInfo(model, instance, "6e59c5de-f052-46fa-aa7e-2fca9d674c44");
+ expect(results.find((item) => item.label === 'Model version').values[0]).toEqual("1");
+ expect(results.find((item) => item.label === 'Model name').values[0]).toEqual("groupingservicefortest..ResourceInstanceGroup..0");
+ expect(results.find((item) => item.label === 'Instance name').values[0]).toEqual("VNF_GROUP1_INSTANCE_NAME");
+ expect(results.find((item) => item.label === 'Instance ID').values[0]).toEqual("VNF_GROUP1_INSTANCE_ID");
+ expect(results.find((item) => item.label === 'Subscriber name').values[0]).toEqual("DALE BRIDGES"); // TODO should call subscriber
+ expect(results.find((item) => item.label === 'Service type').values[0]).toEqual("service-instance-type");
+ });
+
+
+ test('setModalTitlesType: should return modal title', () => {
+ expect(AuditInfoModalComponentService.setModalTitle('VNF')).toEqual('VNF Instantiation Information');
+ expect(AuditInfoModalComponentService.setModalTitle('VFMODULE')).toEqual('VfModule Instantiation Information');
+ expect(AuditInfoModalComponentService.setModalTitle('NETWORK')).toEqual('Network Instantiation Information');
+ expect(AuditInfoModalComponentService.setModalTitle('VNFGROUP')).toEqual('Vnf Group Instantiation Information');
+ });
+
+ test('setModalTitlesType: should return modal title type', () => {
+ expect(AuditInfoModalComponentService.setModalTitlesType('VNF')).toEqual('VNF');
+ expect(AuditInfoModalComponentService.setModalTitlesType('VFMODULE')).toEqual('VfModule');
+ expect(AuditInfoModalComponentService.setModalTitlesType('NETWORK')).toEqual('Network');
+ expect(AuditInfoModalComponentService.setModalTitlesType('VNFGROUP')).toEqual('Vnf Group');
+ });
+
+ test('getInstanceModelName: should return model name if exist', () => {
+ expect(AuditInfoModalComponentService.getInstanceModelName({name : 'some name'})).toEqual('some name');
+ expect(AuditInfoModalComponentService.getInstanceModelName(null)).toEqual('');
+ });
+
+ test('createModelInformationItemsJob: should return job information', () => {
+ let service = {
+ "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ "invariantUuid": "cfef8302-d90f-475f-87cc-3f49a62ef14c",
+ "name": "ComplexService",
+ "version": "1.0",
+ "toscaModelURL": null,
+ "category": "Emanuel",
+ "serviceType": "",
+ "serviceRole": "",
+ "description": "ComplexService",
+ "serviceEcompNaming": "true",
+ "instantiationType": "Macro",
+ "inputs": {},
+ "vidNotions": {
+ "instantiationUI": "legacy",
+ "modelCategory": "other",
+ "viewEditUI": "legacy"
+ }
+ };
+ const results = AuditInfoModalComponentService.createModelInformationItemsJob(<any>service);
+ });
+
+
+ function getVNFModel(){
+ return {"name":"VF_vMee","version":"2.0","description":"VSP_vMee","uuid":"d6557200-ecf2-4641-8094-5393ae3aae60","invariantUuid":"4160458e-f648-4b30-a176-43881ffffe9e","max":1,"min":0,"customizationUuid":"91415b44-753d-494c-926a-456a9172bbb9","isEcompGeneratedNaming":true,"type":"VF","modelCustomizationName":"VF_vMee 0","vfcInstanceGroups":{},"properties":{"gpb2_Internal2_mac":"00:11:22:EF:AC:DF","sctp-a-ipv6-egress_rule_application":"any","sctp-b-ipv6-egress_src_start_port":"0","Internal2_allow_transit":"true","sctp-b-IPv6_ethertype":"IPv6","ncb2_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-ingress_rule_protocol":"icmp","sctp-b-ingress_action":"pass","sctp-a-egress_rule_application":"any","sctp-b-ipv6-ingress-src_start_port":"0.0","ncb1_Internal2_mac":"00:11:22:EF:AC:DF","sctp-b-egress_src_addresses":"local","fsb_volume_size_0":"320.0","sctp-a-ipv6-ingress-dst_start_port":"0","sctp-a-ipv6-ingress_ethertype":"IPv4","sctp-b-ipv6-ingress_rule_application":"any","domain_name":"default-domain","sctp-a-egress_src_addresses":"local","sctp-b-egress-src_start_port":"0.0","sctp-a-ingress_rule_protocol":"icmp","sctp-b-display_name":"epc-sctp-b-ipv4v6-sec-group","sctp-b-ipv6-ingress-dst_end_port":"65535","sctp-a-ingress_ethertype":"IPv4","sctp-a-egress-src_start_port":"0.0","sctp-b-dst_subnet_prefix_v6":"::","nf_naming":"{ecomp_generated_naming=true}","sctp-a-ipv6-ingress_src_subnet_prefix":"0.0.0.0","sctp-b-egress-dst_start_port":"0.0","ncb_flavor_name":"nv.c20r64d1","sctp-b-egress_dst_subnet_prefix_len":"0.0","gpb1_Internal1_mac":"00:11:22:EF:AC:DF","Internal2_net_cidr":"10.0.0.10","sctp-a-ingress-dst_start_port":"0.0","fsb1_Internal2_mac":"00:11:22:EF:AC:DF","sctp-a-egress-dst_start_port":"0.0","sctp-a-egress_ethertype":"IPv4","vlc_st_service_mode":"in-network-nat","sctp-a-ipv6-egress_ethertype":"IPv4","sctp-a-egress-src_end_port":"65535.0","sctp-b-egress_action":"pass","sctp-b-ipv6-egress_rule_application":"any","sctp-a-ingress-src_subnet_prefix_len":"0.0","sctp-b-ipv6-ingress-src_end_port":"65535.0","sctp-a-ipv6-ingress-src_start_port":"0.0","fsb2_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-name":"epc-sctp-b-ipv4v6-sec-group","sctp-b-ipv6-egress_ethertype":"IPv4","Internal1_net_cidr":"10.0.0.10","sctp-a-egress_dst_subnet_prefix":"0.0.0.0","fsb_flavor_name":"nv.c20r64d1","sctp_rule_protocol":"132","sctp-a-ipv6-ingress_rule_application":"any","sctp-b-ipv6-ingress_src_subnet_prefix_len":"0","ecomp_generated_naming":"true","sctp-a-IPv6_ethertype":"IPv6","vlc_st_virtualization_type":"virtual-machine","vlc2_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-ingress-dst_end_port":"65535.0","sctp-b-ingress-dst_start_port":"0.0","sctp-a-ipv6-ingress-src_end_port":"65535.0","sctp-a-display_name":"epc-sctp-a-ipv4v6-sec-group","sctp-b-ingress_rule_application":"any","vlc_flavor_name":"nd.c16r64d1","int2_sec_group_name":"int2-sec-group","sctp-b-ipv6-egress_src_addresses":"local","vlc_st_interface_type_int1":"other1","vlc_st_interface_type_int2":"other2","sctp-a-ipv6-egress-dst_start_port":"0","sctp-b-egress-src_end_port":"65535.0","sctp-a-ipv6-egress_dst_subnet_prefix_len":"0","Internal2_shared":"false","sctp-a-ipv6-egress_rule_protocol":"any","Internal2_rpf":"disable","vlc1_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-ipv6-egress_src_end_port":"65535","sctp-a-ipv6-egress_src_addresses":"local","sctp-a-ingress-dst_end_port":"65535.0","sctp-a-ipv6-egress_src_end_port":"65535","Internal1_forwarding_mode":"l2","Internal2_dhcp":"false","sctp-a-dst_subnet_prefix_v6":"::","pxe_image_name":"MME_PXE-Boot_16ACP04_GA.qcow2","vlc_st_interface_type_gtp":"other0","ncb1_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-src_subnet_prefix_v6":"::","sctp-a-egress_dst_subnet_prefix_len":"0.0","int1_sec_group_name":"int1-sec-group","Internal1_dhcp":"false","fsb2_Internal2_mac":"00:11:22:EF:AC:DF","Internal2_forwarding_mode":"l2","sctp-a-ipv6-egress_dst_end_port":"65535","sctp-b-egress_dst_subnet_prefix":"0.0.0.0","Internal1_net_cidr_len":"17","gpb2_Internal1_mac":"00:11:22:EF:AC:DF","sctp-a-ingress_dst_addresses":"local","sctp-b-ingress-src_subnet_prefix_len":"0.0","sctp-a-egress_action":"pass","fsb_volume_type_0":"SF-Default-SSD","ncb2_Internal2_mac":"00:11:22:EF:AC:DF","vlc_st_interface_type_sctp_a":"left","vlc_st_version":"2","sctp-a-src_subnet_prefix_v6":"::","vlc_st_interface_type_sctp_b":"right","sctp-a-ingress_rule_application":"any","sctp-b-egress_ethertype":"IPv4","sctp-a-ipv6-egress_src_start_port":"0","instance_ip_family_v6":"v6","gpb1_Internal2_mac":"00:11:22:EF:AC:DF","sctp-b-ingress-src_start_port":"0.0","fsb1_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-ingress_dst_addresses":"local","vlc_st_interface_type_oam":"management","multi_stage_design":"false","oam_sec_group_name":"oam-sec-group","Internal2_net_gateway":"10.0.0.10","sctp-a-ipv6-ingress-dst_end_port":"65535","Internal1_net_gateway":"10.0.0.10","sctp-b-ipv6-egress-dst_start_port":"0","sctp-b-ipv6-egress_rule_protocol":"any","gtp_sec_group_name":"gtp-sec-group","sctp-a-ipv6-egress_dst_subnet_prefix":"0.0.0.0","sctp-a-ipv6-ingress_dst_addresses":"local","sctp-b-ipv6-egress_dst_subnet_prefix_len":"0","sctp-b-ipv6-egress_action":"pass","sctp-a-egress_rule_protocol":"icmp","sctp-a-ipv6-egress_action":"pass","Internal1_shared":"false","sctp-b-ipv6-ingress_rule_protocol":"any","Internal2_net_cidr_len":"17","sctp-a-name":"epc-sctp-a-ipv4v6-sec-group","sctp-a-ingress-src_end_port":"65535.0","sctp-b-ipv6-ingress_src_subnet_prefix":"0.0.0.0","sctp-a-egress-dst_end_port":"65535.0","sctp-b-egress_rule_protocol":"icmp","sctp-a-ingress_action":"pass","sctp-b-ipv6-ingress_action":"pass","vlc_st_service_type":"firewall","sctp-b-ipv6-egress_dst_end_port":"65535","vlc2_Internal2_mac":"00:11:22:EF:AC:DF","sctp-b-ipv6-ingress-dst_start_port":"0","vlc_st_availability_zone":"true","sctp-b-ingress-src_subnet_prefix":"0.0.0.0","fsb_volume_image_name_1":"MME_FSB2_16ACP04_GA.qcow2","sctp-a-ipv6-ingress_src_subnet_prefix_len":"0","gpb_flavor_name":"nv.c20r64d1","Internal1_allow_transit":"true","availability_zone_max_count":"1","fsb_volume_image_name_0":"MME_FSB1_16ACP04_GA.qcow2","sctp-b-ipv6-ingress_dst_addresses":"local","sctp-b-ipv6-ingress_ethertype":"IPv4","sctp-b-ipv6-egress_dst_subnet_prefix":"0.0.0.0","sctp-a-ingress-src_subnet_prefix":"0.0.0.0","vlc1_Internal2_mac":"00:11:22:EF:AC:DF","sctp-a-ipv6-ingress_action":"pass","Internal1_rpf":"disable","sctp-b-ingress_ethertype":"IPv4","sctp-b-ingress-src_end_port":"65535.0","sctp-b-egress_rule_application":"any","sctp-a-ipv6-ingress_rule_protocol":"any","sctp-a-ingress-src_start_port":"0.0","sctp-b-egress-dst_end_port":"65535.0"}};
+ }
+
+ function getVNFInstance(){
+ return {"action":"None","instanceName":"4O61SmpFAdCm1oVEs","instanceId":"66cbb3b5-c823-470c-9520-4e0b85112250","orchStatus":null,"productFamilyId":null,"lcpCloudRegionId":null,"tenantId":null,"modelInfo":{"modelCustomizationName":"VF_vMee 0","modelInvariantId":"vnf-instance-model-invariant-id","modelVersionId":"d6557200-ecf2-4641-8094-5393ae3aae60","modelType":"vnf"},"instanceType":"7538ifdSoTccmbEkr","provStatus":null,"inMaint":true,"uuid":"d6557200-ecf2-4641-8094-5393ae3aae60","originalName":"VF_vMee 0","legacyRegion":null,"lineOfBusiness":null,"platformName":null,"trackById":"VF_vMee 0:004","vfModules":{"vf_vmee0..VfVmee..vmme_vlc..module-1":{"vf_vmee0..VfVmee..vmme_vlc..module-1:008":{"action":"None","instanceName":"ss820f_0918_db","instanceId":"2c1ca484-cbc2-408b-ab86-25a2c15ce280","orchStatus":"deleted","productFamilyId":null,"lcpCloudRegionId":null,"tenantId":null,"modelInfo":{"modelCustomizationName":"VfVmee..vmme_vlc..module-1","modelCustomizationId":"b200727a-1bf9-4e7c-bd06-b5f4c9d920b9","modelInvariantId":"09edc9ef-85d0-4b26-80de-1f569d49e750","modelVersionId":"522159d5-d6e0-4c2a-aa44-5a542a12a830","modelType":"vfModule"},"instanceType":null,"provStatus":null,"inMaint":true,"uuid":"522159d5-d6e0-4c2a-aa44-5a542a12a830","originalName":"VfVmee..vmme_vlc..module-1","legacyRegion":null,"lineOfBusiness":null,"platformName":null,"trackById":"vf_vmee0..VfVmee..vmme_vlc..module-1:008","isBase":false,"volumeGroupName":null}},"dc229cd8-c132-4455-8517-5c1787c18b14":{"dc229cd8-c132-4455-8517-5c1787c18b14:009":{"action":"None","instanceName":"ss820f_0918_base","instanceId":"3ef042c4-259f-45e0-9aba-0989bd8d1cc5","orchStatus":"Assigned","productFamilyId":null,"lcpCloudRegionId":null,"tenantId":null,"modelInfo":{"modelCustomizationId":"8ad8670b-0541-4499-8101-275bbd0e8b6a","modelInvariantId":"1e463c9c-404d-4056-ba56-28fd102608de","modelVersionId":"dc229cd8-c132-4455-8517-5c1787c18b14","modelType":"vfModule"},"instanceType":null,"provStatus":null,"inMaint":false,"uuid":"dc229cd8-c132-4455-8517-5c1787c18b14","originalName":null,"legacyRegion":null,"lineOfBusiness":null,"platformName":null,"trackById":"dc229cd8-c132-4455-8517-5c1787c18b14:009","isBase":true,"volumeGroupName":null}}},"networks":{}};
+ }
+
+ function getVFModule(){
+ return {"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","version":"2","modelCustomizationName":"VfVmee..vmme_vlc..module-1","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_vlc","baseModule":false},"inputs":{},"volumeGroupAllowed":false};
+ }
+
+ function getVFModuleInstance() {
+ return{"action":"None","instanceName":"ss820f_0918_db","instanceId":"2c1ca484-cbc2-408b-ab86-25a2c15ce280","orchStatus":"deleted","productFamilyId":null,"lcpCloudRegionId":null,"tenantId":null,"modelInfo":{"modelCustomizationName":"VfVmee..vmme_vlc..module-1","modelCustomizationId":"b200727a-1bf9-4e7c-bd06-b5f4c9d920b9","modelInvariantId":"09edc9ef-85d0-4b26-80de-1f569d49e750","modelVersionId":"522159d5-d6e0-4c2a-aa44-5a542a12a830","modelType":"vfModule"},"instanceType":null,"provStatus":null,"inMaint":true,"uuid":"522159d5-d6e0-4c2a-aa44-5a542a12a830","originalName":"VfVmee..vmme_vlc..module-1","legacyRegion":null,"lineOfBusiness":null,"platformName":null,"trackById":"vf_vmee0..VfVmee..vmme_vlc..module-1:008","isBase":false,"volumeGroupName":null};
+ }
+
+ function getNetworkModel(){
+ return null;
+ }
+
+ function getNetworkInstance(){
+ return {"action":"None","instanceName":"KADmyK6e3sVWNfGbA","instanceId":"712cad2d-fc1c-40c7-aaff-d2d6e17ac2b6","orchStatus":"Assigned","productFamilyId":null,"lcpCloudRegionId":null,"tenantId":null,"modelInfo":{"modelInvariantId":"network-instance-model-invariant-id","modelVersionId":"ddc3f20c-08b5-40fd-af72-c6d14636b986","modelType":"network"},"instanceType":"CONTRAIL30_BASIC","provStatus":"nvtprov","inMaint":false,"uuid":"ddc3f20c-08b5-40fd-af72-c6d14636b986","originalName":null,"legacyRegion":null,"lineOfBusiness":null,"platformName":null,"trackById":"ddc3f20c-08b5-40fd-af72-c6d14636b986:001"};
+ }
+
+ function getVNFGroupModel(){
+ return {"name":"groupingservicefortest..ResourceInstanceGroup..0","version":"1","uuid":"daeb6568-cef8-417f-9075-ed259ce59f48","invariantUuid":"4bb2e27e-ddab-4790-9c6d-1f731bc14a45","max":1,"min":0,"isEcompGeneratedNaming":true,"type":"VnfGroup","modelCustomizationName":"groupingservicefortest..ResourceInstanceGroup..0","properties":{"contained_resource_type":"VF","role":"SERVICE-ACCESS","function":"DATA","description":"DDD0","type":"LOAD-GROUP","ecomp_generated_naming":"true"},"members":{"vdbe_svc_vprs_proxy 0":{"uuid":"65fadfa8-a0d9-443f-95ad-836cd044e26c","invariantUuid":"f4baae0c-b3a5-4ca1-a777-afbffe7010bc","description":"A Proxy for Service vDBE_Svc_vPRS","name":"vDBE_Svc_vPRS Service Proxy","version":"1.0","customizationUuid":"bdb63d23-e132-4ce7-af2c-a493b4cafac9","inputs":{},"commands":{},"properties":{"ecomp_generated_naming":"false"},"type":"Service Proxy","sourceModelUuid":"da7827a2-366d-4be6-8c68-a69153c61274","sourceModelInvariant":"24632e6b-584b-4f45-80d4-fefd75fd9f14","sourceModelName":"vDBE_Svc_vPRS"}}};
+ }
+
+ function getVNFGroupInstance(){
+ return {"originalName":"groupingservicefortest..ResourceInstanceGroup..0","trackById":"groupingservicefortest..ResourceInstanceGroup..0:001","instanceName":"VNF_GROUP1_INSTANCE_NAME","action":"None","instanceId":"VNF_GROUP1_INSTANCE_ID","instanceType":"VNF_GROUP1_INSTANCE_TYPE","orchStatus":"Active","provStatus":null,"inMaint":false,"modelInfo":{"modelType":"instanceGroup","modelCustomizationName":"groupingservicefortest..ResourceInstanceGroup..0","modelInvariantId":"4bb2e27e-ddab-4790-9c6d-1f731bc14a45","modelVersionId":"daeb6568-cef8-417f-9075-ed259ce59f48"},"uuid":"daeb6568-cef8-417f-9075-ed259ce59f48","vnfs":{}};
+ }
+});
diff --git a/vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.service.ts b/vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.service.ts
new file mode 100644
index 000000000..cd36ece25
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.service.ts
@@ -0,0 +1,79 @@
+import {Injectable} from "@angular/core";
+import {ModelInformationItem} from "../model-information/model-information.component";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../store/reducers";
+import {Subscriber} from "../../models/subscriber";
+import {ServiceInfoModel} from "../../server/serviceInfo/serviceInfo.model";
+import * as _ from 'lodash';
+
+@Injectable()
+export class AuditInfoModalComponentService {
+ constructor(private _store: NgRedux<AppState>){}
+
+ getModelInfo(model, instance, serviceModelId: string): ModelInformationItem[] {
+ const serviceInstance = this._store.getState().service.serviceInstance[serviceModelId];
+ const modelInformation = !_.isNil(model) ? [
+ new ModelInformationItem('Model name', 'model_name', [model.name]),
+ new ModelInformationItem('Model version', 'model_version', [model.version]),
+ new ModelInformationItem('Model customization ID', 'model_customization_ID', [model.customizationUuid]),
+ new ModelInformationItem('Base module', 'base_module', [!_.isNil(model.properties) ? model.properties.baseModule : null])
+ ] : [];
+
+ const instanceInfo = !_.isNil(instance) ? [
+ new ModelInformationItem('Instance name', 'instance_name', [instance.instanceName]),
+ new ModelInformationItem('Instance ID', 'instance_ID', [instance.instanceId])
+ ] : [];
+
+ const serviceInfo = !_.isNil(serviceInstance) ? [
+ new ModelInformationItem("Subscriber name", "subscriberName", [this.extractSubscriberNameBySubscriberId(serviceInstance.globalSubscriberId, this._store)]),
+ new ModelInformationItem('Service type', 'service_type', [serviceInstance.subscriptionServiceType])
+ ] : [];
+
+ const result = [modelInformation, instanceInfo, serviceInfo];
+ return _.uniq(_.flatten(result));
+ }
+
+ static createModelInformationItemsJob(serviceModel: ServiceInfoModel): ModelInformationItem[] {
+ return [
+ new ModelInformationItem('Subscriber name', 'subscriberName', [serviceModel.subscriberName]),
+ new ModelInformationItem('Service type', 'serviceType', [serviceModel.serviceType]),
+ new ModelInformationItem('Service model version', 'serviceModelVersion', [serviceModel.serviceModelVersion]),
+ new ModelInformationItem('Service instance name', 'serviceInstanceName', [serviceModel.serviceInstanceName || 'Automatically generated'], '', true),
+ new ModelInformationItem('Service instance ID', 'serviceInstanceId', [serviceModel.serviceInstanceId]),
+ new ModelInformationItem('Requestor User ID', 'userId', [serviceModel.userId]),
+ ];
+ }
+
+ static getInstanceModelName(model) : string {
+ return !_.isNil(model) && model.name ? model.name : '';
+ }
+
+ static setModalTitlesType(type : string) : string {
+ return !_.isNil(type) ? AuditInfoModalComponentService.getTypeMap()[type] : 'Service' ;
+ }
+
+ static getTypeMap(){
+ return {
+ SERVICE : 'Service',
+ VNFGROUP : 'Vnf Group',
+ NETWORK : 'Network',
+ VFMODULE : 'VfModule',
+ VNF : 'VNF'
+ };
+ }
+
+ static setModalTitle(type : string) : string {
+ return !_.isNil(type) ? (AuditInfoModalComponentService.getTypeMap()[type] + " Instantiation Information") : 'Service Instantiation Information';
+ }
+
+ extractSubscriberNameBySubscriberId(subscriberId: string, store: NgRedux<AppState>) {
+ let result: string = null;
+ let filteredArray: any = _.filter(store.getState().service.subscribers, function (o: Subscriber) {
+ return o.id === subscriberId
+ });
+ if (filteredArray.length > 0) {
+ result = filteredArray[0].name;
+ }
+ return result;
+ }
+}
diff --git a/vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.spec.ts b/vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.spec.ts
new file mode 100644
index 000000000..ecce68daf
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.spec.ts
@@ -0,0 +1,203 @@
+import {ComponentFixture, TestBed} from '@angular/core/testing';
+import {ContextMenuModule, ContextMenuService} from 'ngx-contextmenu';
+import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
+import {AuditInfoModalComponent} from "./auditInfoModal.component";
+import {NgRedux} from "@angular-redux/store";
+import {FeatureFlagsService} from "../../services/featureFlag/feature-flags.service";
+import {AaiService} from "../../services/aaiService/aai.service";
+import {HttpClientTestingModule} from "@angular/common/http/testing";
+import {ScrollToModule} from "@nicky-lenaers/ngx-scroll-to";
+import {RouterTestingModule} from "@angular/router/testing";
+import {ModalModule} from "ngx-bootstrap";
+import {CapitalizeAndFormatPipe} from "../../pipes/capitalize/capitalize-and-format.pipe";
+import {ServiceInfoService} from "../../server/serviceInfo/serviceInfo.service";
+import {IframeService} from "../../utils/iframe.service";
+import {AuditInfoModalComponentService} from "./auditInfoModal.component.service";
+import {ServiceInfoModel} from "../../server/serviceInfo/serviceInfo.model";
+import {HttpClient} from '@angular/common/http';
+import {getTestBed} from "@angular/core/testing";
+import {of} from 'rxjs';
+
+class MockAppStore<T> {
+ getState() {
+ return {
+ global: {
+ flags: {
+ 'FLAG_1902_NEW_VIEW_EDIT': true
+ }
+ },
+ service: {
+ serviceInstance: {}
+ }
+ }
+ }
+
+ dispatch() {
+
+ }
+}
+
+
+describe('Audit Info Modal Component_serviceInfoService', () => {
+ let component: AuditInfoModalComponent;
+ let fixture: ComponentFixture<AuditInfoModalComponent>;
+ let _serviceInfoService: ServiceInfoService;
+ let injector;
+ beforeAll(done => (async () => {
+
+ TestBed.configureTestingModule({
+ imports: [
+ HttpClientTestingModule,
+ ContextMenuModule,
+ ScrollToModule.forRoot(),
+ RouterTestingModule,
+ ModalModule.forRoot()
+ ],
+ providers: [
+ ServiceInfoService,
+ AaiService,
+ IframeService,
+ AuditInfoModalComponentService,
+ ContextMenuService,
+ FeatureFlagsService,
+ {provide: NgRedux, useClass: MockAppStore}
+ ],
+ declarations: [AuditInfoModalComponent, CapitalizeAndFormatPipe],
+ schemas: [CUSTOM_ELEMENTS_SCHEMA]
+ });
+ await TestBed.compileComponents();
+
+ injector = getTestBed();
+ _serviceInfoService = injector.get(ServiceInfoService);
+ fixture = TestBed.createComponent(AuditInfoModalComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ })().then(done).catch(done.fail));
+
+
+ test('component should be defined', () => {
+ expect(component).toBeDefined();
+ });
+
+ test('setModalTitles should set modal title according to type', () => {
+ component.setModalTitles('VNF');
+ expect(component.type).toEqual('VNF');
+ expect(component.title).toEqual('VNF Instantiation Information');
+ });
+
+ test('initializeProperties should init some component properties', () => {
+ component.initializeProperties();
+ expect(component.modelInfoItems).toBeNull();
+ expect(component.vidInfoData).toEqual([]);
+ expect(component.msoInfoData).toEqual([]);
+ expect(component.isLoading).toEqual(true);
+ });
+
+ test('openAuditInfoModal', () => {
+ const jobData: ServiceInfoModel = new ServiceInfoModel();
+ spyOn(AuditInfoModalComponentService, 'createModelInformationItemsJob');
+ spyOn(component, 'initAuditInfoData');
+ spyOn(component.auditInfoModal, 'show');
+ component.openAuditInfoModal(jobData);
+
+ expect(AuditInfoModalComponentService.createModelInformationItemsJob).toHaveBeenCalledWith(jobData);
+ expect(component.initAuditInfoData).toHaveBeenCalledWith(jobData);
+ expect(component.auditInfoModal.show).toHaveBeenCalled();
+ });
+
+ test('onCancelClick', () => {
+ spyOn(component, 'initializeProperties');
+ spyOn(component.auditInfoModal, 'hide');
+ component.onCancelClick();
+
+ expect(component.initializeProperties).toHaveBeenCalledWith();
+ expect(component.auditInfoModal.hide).toHaveBeenCalled();
+ });
+
+ test('openInstanceAuditInfoModal calls to getAuditStatusForRetry function', () => {
+ spyOn(component.auditInfoModalComponentService, 'getModelInfo').and.returnValue([]);
+ spyOn(component, 'initializeProperties');
+ spyOn(component, 'setModalTitles');
+ spyOn(component.auditInfoModal, 'show');
+ spyOn(_serviceInfoService, 'getAuditStatusForRetry');
+ jest.spyOn(_serviceInfoService, 'getAuditStatusForRetry').mockReturnValue(of([]))
+
+ spyOn(AuditInfoModalComponentService, 'getInstanceModelName');
+ const instanceId: string = "instanceID";
+ const type: string = 'VNF';
+ const model = {};
+ const instance = {};
+ const isInstanceFailed: boolean = true;
+ const trackById = "trackById";
+
+ AuditInfoModalComponent.openInstanceAuditInfoModal.next({
+ instanceId: instanceId,
+ type: type,
+ model: model,
+ instance: instance,
+ isInstanceFailed: isInstanceFailed,
+ trackById: trackById
+ });
+
+ expect(component.showVidStatus).toEqual(false);
+ expect(component.initializeProperties).toHaveBeenCalled();
+ expect(component.setModalTitles).toHaveBeenCalled();
+ expect(_serviceInfoService.getAuditStatusForRetry).toHaveBeenCalledWith(trackById);
+ expect(component.auditInfoModal.show).toHaveBeenCalled();
+ expect(AuditInfoModalComponentService.getInstanceModelName).toHaveBeenCalledWith(model);
+ });
+
+ test('openInstanceAuditInfoModal calls to getInstanceAuditStatus function', () => {
+ spyOn(component.auditInfoModalComponentService, 'getModelInfo').and.returnValue([]);
+ spyOn(component, 'initializeProperties');
+ spyOn(component, 'setModalTitles');
+ spyOn(component.auditInfoModal, 'show');
+ spyOn(_serviceInfoService, 'getAuditStatusForRetry');
+ jest.spyOn(_serviceInfoService, 'getInstanceAuditStatus').mockReturnValue(of([]))
+
+ spyOn(AuditInfoModalComponentService, 'getInstanceModelName');
+ const instanceId: string = "instanceID";
+ const type: string = 'VNF';
+ const model = {};
+ const instance = {};
+ const isInstanceFailed: boolean = false;
+ const trackById = "trackById";
+
+ AuditInfoModalComponent.openInstanceAuditInfoModal.next({
+ instanceId: instanceId,
+ type: type,
+ model: model,
+ instance: instance,
+ isInstanceFailed: isInstanceFailed,
+ trackById: trackById
+ });
+
+ expect(component.showVidStatus).toEqual(false);
+ expect(component.initializeProperties).toHaveBeenCalled();
+ expect(component.setModalTitles).toHaveBeenCalled();
+ expect(_serviceInfoService.getInstanceAuditStatus).toHaveBeenCalledWith(instanceId, type);
+ expect(component.auditInfoModal.show).toHaveBeenCalled();
+ expect(AuditInfoModalComponentService.getInstanceModelName).toHaveBeenCalledWith(model);
+ });
+
+ test('openInstanceAuditInfoModal : openModal : with job data', () => {
+ spyOn(component.auditInfoModalComponentService, 'getModelInfo').and.returnValue([]);
+ spyOn(component, 'initializeProperties');
+ spyOn(component.auditInfoModal, 'show');
+ spyOn(AuditInfoModalComponentService, 'getInstanceModelName');
+ const jobData: ServiceInfoModel = new ServiceInfoModel();
+ jobData.aLaCarte = true;
+ AuditInfoModalComponent.openModal.next(jobData);
+
+ expect(component.showVidStatus).toEqual(true);
+ expect(component.initializeProperties).toHaveBeenCalled();
+ expect(component.auditInfoModal.show).toHaveBeenCalled();
+ });
+
+ test('openInstanceAuditInfoModal : openModal : without job data', () => {
+ spyOn(component.auditInfoModal, 'hide');
+ const jobData: ServiceInfoModel = null;
+ AuditInfoModalComponent.openModal.next(jobData);
+ expect(component.auditInfoModal.hide).toHaveBeenCalled();
+ });
+});
diff --git a/vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.ts b/vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.ts
new file mode 100644
index 000000000..cf385d767
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.ts
@@ -0,0 +1,122 @@
+import {Component, ViewChild} from '@angular/core';
+import {Subject} from 'rxjs/Subject';
+import {ModalDirective} from 'ngx-bootstrap'
+import {ModelInformationItem} from '../model-information/model-information.component';
+import {ServiceModel} from '../../models/serviceModel';
+import {ServiceInfoService} from '../../server/serviceInfo/serviceInfo.service';
+import {ServiceInfoModel} from '../../server/serviceInfo/serviceInfo.model';
+import {AuditStatus} from '../../server/serviceInfo/AuditStatus.model';
+import {IframeService} from "../../utils/iframe.service";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../store/reducers";
+import {AuditInfoModalComponentService} from "./auditInfoModal.component.service";
+
+@Component({
+ selector: 'audit-info-modal',
+ templateUrl: './auditInfoModal.component.html',
+ styleUrls: ['./auditInfoModal.component.scss']
+})
+export class AuditInfoModalComponent {
+ static openModal: Subject<ServiceInfoModel> = new Subject<ServiceInfoModel>();
+ static openInstanceAuditInfoModal: Subject<{instanceId , type, model, instance, isInstanceFailed?, trackById?}> = new Subject<{instanceId , type, model, instance, isInstanceFailed, trackById}>();
+ @ViewChild('auditInfoModal') public auditInfoModal: ModalDirective;
+ title: string = 'Service Instantiation Information';
+ modelInfoItems: ModelInformationItem[] = [];
+ serviceModel: ServiceModel;
+ serviceModelName: string;
+ vidInfoData: AuditStatus[] = [];
+ msoInfoData: AuditStatus[] = [];
+ isAlaCarte: boolean;
+ parentElementClassName = 'content';
+ isLoading = true;
+ model: any;
+ instanceId: string;
+ isALaCarteFlagOn: boolean;
+ type : string = "Service";
+ showVidStatus : boolean = true;
+ auditInfoModalComponentService : AuditInfoModalComponentService;
+ constructor(private _serviceInfoService: ServiceInfoService, private _iframeService : IframeService,
+ private _auditInfoModalComponentService : AuditInfoModalComponentService,
+ private store: NgRedux<AppState>) {
+ this.auditInfoModalComponentService = this._auditInfoModalComponentService;
+ AuditInfoModalComponent.openModal.subscribe((jobData: ServiceInfoModel) => {
+ this.isALaCarteFlagOn = this.store.getState().global.flags['FLAG_A_LA_CARTE_AUDIT_INFO'];
+ this.initializeProperties();
+ this.showVidStatus = true;
+ if (jobData) {
+ this.isAlaCarte = jobData.aLaCarte;
+ this.openAuditInfoModal(jobData);
+ _iframeService.addClassOpenModal(this.parentElementClassName);
+ this.serviceModelName = jobData.serviceModelName ? jobData.serviceModelName : '';
+ this.auditInfoModal.show();
+ } else {
+ _iframeService.removeClassCloseModal(this.parentElementClassName);
+ this.auditInfoModal.hide();
+ }
+ });
+
+ AuditInfoModalComponent.openInstanceAuditInfoModal.subscribe(({instanceId , type , model, instance, isInstanceFailed, trackById}) => {
+ this.showVidStatus = false;
+ this.initializeProperties();
+ this.setModalTitles(type);
+ this.serviceModelName = AuditInfoModalComponentService.getInstanceModelName(model);
+
+ if (isInstanceFailed) {
+ this._serviceInfoService.getAuditStatusForRetry(trackById).subscribe((res: AuditStatus) => {
+ this.msoInfoData = [res];
+ });
+ }else{
+ this._serviceInfoService.getInstanceAuditStatus(instanceId, type).subscribe((res : AuditStatus[]) =>{
+ this.msoInfoData = res;
+ });
+ }
+ this.modelInfoItems = this.auditInfoModalComponentService.getModelInfo(model, instance, instanceId);
+ _iframeService.addClassOpenModal(this.parentElementClassName);
+ this.auditInfoModal.show();
+ });
+ }
+
+
+ setModalTitles(type : string) : void{
+ this.type = AuditInfoModalComponentService.setModalTitlesType(type) ;
+ this.title = AuditInfoModalComponentService.setModalTitle(type);
+ }
+
+ initializeProperties() : void {
+ this.modelInfoItems = null;
+ this.vidInfoData = [];
+ this.msoInfoData = [];
+ this.isLoading = true;
+ }
+
+ openAuditInfoModal(jobData: ServiceInfoModel): void {
+ this.modelInfoItems = AuditInfoModalComponentService.createModelInformationItemsJob(jobData);
+ this.initAuditInfoData(jobData);
+ this.auditInfoModal.onHide.subscribe(()=>{
+ this._iframeService.removeClassCloseModal(this.parentElementClassName);
+ this.initializeProperties();
+ });
+ this.auditInfoModal.show();
+ }
+
+ initAuditInfoData(jobData: ServiceInfoModel) {
+ this._serviceInfoService.getJobAuditStatus(jobData)
+ .subscribe((res: AuditStatus[][]) => {
+ this.vidInfoData = res[0];
+ this.msoInfoData = res[1];
+ this.isLoading = false;
+ });
+ }
+
+ onCancelClick() {
+ this._iframeService.removeClassCloseModal(this.parentElementClassName);
+ this.initializeProperties();
+ this.auditInfoModal.hide();
+ }
+
+
+ onNavigate(){
+ window.open("https://wiki.onap.org/display/DW/SO+Building+blocks", "_blank");
+ }
+}
+
diff --git a/vid-webpack-master/src/app/shared/components/dynamic-inputs/dynamic-inputs.component.spec.ts b/vid-webpack-master/src/app/shared/components/dynamic-inputs/dynamic-inputs.component.spec.ts
new file mode 100644
index 000000000..6194aad5e
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/dynamic-inputs/dynamic-inputs.component.spec.ts
@@ -0,0 +1,157 @@
+import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing";
+import {DynamicInputsComponent} from "./dynamic-inputs.component";
+import {async, ComponentFixture, getTestBed, TestBed} from "@angular/core/testing";
+import {CUSTOM_ELEMENTS_SCHEMA} from "@angular/core";
+import {FormBuilder, FormGroup, FormsModule, ReactiveFormsModule, ValidatorFn} from "@angular/forms";
+import {BrowserModule} from "@angular/platform-browser";
+import {CommonModule} from "@angular/common";
+import {RouterTestingModule} from "@angular/router/testing";
+import {DynamicInputLabelPipe} from "../../pipes/dynamicInputLabel/dynamic-input-label.pipe";
+import {DynamicNumber} from "../../models/dynamicInput";
+
+
+describe('DynamicInputs Component', () => {
+ let component: DynamicInputsComponent;
+ let fixture: ComponentFixture<DynamicInputsComponent>;
+
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+ imports: [BrowserModule, CommonModule, FormsModule, HttpClientTestingModule, RouterTestingModule, ReactiveFormsModule],
+ declarations: [DynamicInputsComponent, DynamicInputLabelPipe],
+ providers : [FormBuilder],
+ schemas: [ CUSTOM_ELEMENTS_SCHEMA ]
+ });
+ await TestBed.compileComponents();
+
+ fixture = TestBed.createComponent(DynamicInputsComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ })().then(done).catch(done.fail));
+
+ test('should be defined', () => {
+ expect(component).toBeDefined();
+ });
+
+ test('isDynamicNumber should return item', () => {
+ let options = {
+ minLength : 10,
+ maxLength : 10
+ };
+
+ let dynamicNumber : DynamicNumber = new DynamicNumber(<any>options);
+ expect(component.isDynamicNumber(dynamicNumber)).toBeDefined();
+ });
+
+ test('buildValidators should return validator', () => {
+ let options = {
+ minLength : 10,
+ maxLength : 10,
+ max : 10,
+ min : 1
+ };
+
+ let dynamicNumber : DynamicNumber = new DynamicNumber(<any>options);
+ let validator : ValidatorFn = component.buildValidators(dynamicNumber);
+ expect(validator).toBeDefined();
+ });
+
+
+ test('ngOnInit', ()=>{
+ component.group = new FormGroup({
+
+ });
+ component.list = [
+ {
+ type : 'select',
+ value : 'optionName',
+ name : 'multiSelectControl',
+ optionList : [{
+ isDataLoading : true,
+ name : 'optionName',
+ id : 'id'
+ }]
+ },
+ {
+ type : 'select',
+ value : 'optionName',
+ name : 'multiSelectControl',
+ optionList : [{
+ isDataLoading : true,
+ name : 'optionName',
+ id : 'id'
+ }]
+ },
+ {
+ type : 'multi_select',
+ value : 'optionName',
+ name : 'selectControl',
+ optionList : [{
+ isDataLoading : true,
+ name : 'optionName',
+ id : 'id'
+ }]
+ },
+ {
+ type : 'multi_select',
+ value : 'optionName',
+ name : 'selectControl',
+ optionList : [{
+ isDataLoading : true,
+ name : 'optionName'
+ }]
+ },
+ {
+ type : 'boolean',
+ value : true,
+ name : 'booleanControl'
+ },
+ {
+ type : 'boolean',
+ name : 'booleanControl2'
+ },
+ {
+ type : 'number',
+ value : 100,
+ name : 'numberControl'
+ },
+ {
+ type : 'file',
+ value : 'someValue',
+ name : 'fileControl'
+ },
+ {
+ type : 'checkbox',
+ value : true,
+ name : 'checkboxControl'
+ },
+ {
+ type : 'map',
+ value : true,
+ name : 'mapControl'
+ },
+ {
+ type : 'list',
+ value : true,
+ name : 'listControl'
+ },
+ {
+ type : 'default',
+ value : true,
+ name : 'defaultControl'
+ }
+ ];
+
+ component.ngOnInit();
+ expect(component.group.controls['multiSelectControl'].value).toEqual('id');
+ expect(component.group.controls['selectControl'].value).toEqual('optionName');
+ expect(component.group.controls['booleanControl'].value).toEqual(true);
+ expect(component.group.controls['booleanControl2'].value).toEqual(false);
+ expect(component.group.controls['numberControl'].value).toEqual(100);
+ expect(component.group.controls['fileControl'].value).toEqual('someValue');
+ expect(component.group.controls['checkboxControl'].value).toEqual(true);
+ expect(component.group.controls['mapControl'].value).toEqual(true);
+ expect(component.group.controls['listControl'].value).toEqual(true);
+ expect(component.group.controls['defaultControl'].value).toEqual(true);
+ })
+
+});
diff --git a/vid-webpack-master/src/app/components/dynamic-inputs/dynamic-inputs.component.ts b/vid-webpack-master/src/app/shared/components/dynamic-inputs/dynamic-inputs.component.ts
index 921c923df..096a51eb7 100644
--- a/vid-webpack-master/src/app/components/dynamic-inputs/dynamic-inputs.component.ts
+++ b/vid-webpack-master/src/app/shared/components/dynamic-inputs/dynamic-inputs.component.ts
@@ -1,6 +1,6 @@
import {Component, Input, OnInit} from '@angular/core';
import {FormControl, FormGroup, Validators} from "@angular/forms";
-import {DynamicInput, DynamicMultiSelect, DynamicNumber, DynamicSelect} from "../../shared/models/dynamicInput";
+import {DynamicInput, DynamicMultiSelect, DynamicNumber, DynamicSelect} from "../../models/dynamicInput";
@Component({
selector: 'dynamic-inputs',
diff --git a/vid-webpack-master/src/app/components/dynamic-inputs/dynamic-inputs.html b/vid-webpack-master/src/app/shared/components/dynamic-inputs/dynamic-inputs.html
index a933364e2..740b798e4 100644
--- a/vid-webpack-master/src/app/components/dynamic-inputs/dynamic-inputs.html
+++ b/vid-webpack-master/src/app/shared/components/dynamic-inputs/dynamic-inputs.html
@@ -1,6 +1,6 @@
<div *ngFor="let item of dynamicList">
<div id="{{item.id}}" class="details-item" [ngSwitch]="item.type" [formGroup]="group" [hidden]="!item.isVisible">
- <label>{{item.name | dynamicInputLabel }}</label>
+ <label [ngClass]="{'required' : item.isRequired && item.isVisible}">{{item.name | dynamicInputLabel }}</label>
<select *ngSwitchCase="item.type === 'select'|| item.type === 'boolean'? item.type: ''" name="{{item.name}}" class="form-control input-text" [formControlName]="item.name" title="{{item.description}}" [required]="item.isRequired && item.isVisible" maxlength="{{item.maxLength}}" minlength="{{item.minLength}}">
<option value="null" [selected]="item.value == null || item.value == undefined" hidden disabled>{{item.prompt}}</option>
<option *ngFor="let option of item.optionList" [ngValue]="option.id || option.name" [disabled]="!option.isPermitted" [selected]="option.isDataLoading">{{option.name}}</option>
diff --git a/vid-webpack-master/src/app/components/dynamic-inputs/dynamic-inputs.scss b/vid-webpack-master/src/app/shared/components/dynamic-inputs/dynamic-inputs.scss
index 11a141420..11a141420 100644
--- a/vid-webpack-master/src/app/components/dynamic-inputs/dynamic-inputs.scss
+++ b/vid-webpack-master/src/app/shared/components/dynamic-inputs/dynamic-inputs.scss
diff --git a/vid-webpack-master/src/app/shared/components/ellipsis/ellipsis.component.ts b/vid-webpack-master/src/app/shared/components/ellipsis/ellipsis.component.ts
index fd58b6507..bce06953c 100644
--- a/vid-webpack-master/src/app/shared/components/ellipsis/ellipsis.component.ts
+++ b/vid-webpack-master/src/app/shared/components/ellipsis/ellipsis.component.ts
@@ -1,12 +1,17 @@
-import { Component, Input } from '@angular/core';
+import {Component, Input, OnChanges, SimpleChanges} from '@angular/core';
+import {HighlightPipe} from "../../pipes/highlight/highlight-filter.pipe";
+import * as _ from 'lodash';
@Component({
selector : 'custom-ellipsis',
template: `
- <span
+ <span
+ sdc-tooltip
class="ellipsis"
id="{{id}}"
- tooltip="{{value}}">{{value}}</span>`,
+ [innerHtml]="displayValue | safe : 'html'"
+ [tooltip-text]="value">
+ </span>`,
styles : [
`
.ellipsis {
@@ -18,10 +23,23 @@ import { Component, Input } from '@angular/core';
text-align: left;
}
`
- ]
+ ],
+ providers : [HighlightPipe]
})
-export class EllipsisComponent {
+export class EllipsisComponent implements OnChanges{
@Input() value : string;
@Input() id : string;
+ @Input() hightlight : string;
+ displayValue : string;
+ constructor(private _highlightPipe : HighlightPipe){
+ this.displayValue = this.value;
+ }
+
+ ngOnChanges(changes: SimpleChanges): void {
+ this.displayValue = this.value;
+ if(!_.isNil(this.hightlight)){
+ this.displayValue = this._highlightPipe.transform(this.value ,this.hightlight ? this.hightlight : '');
+ }
+ }
}
diff --git a/vid-webpack-master/src/app/shared/components/error-msg/error-msg.component.html b/vid-webpack-master/src/app/shared/components/error-msg/error-msg.component.html
new file mode 100644
index 000000000..6fb46c256
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/error-msg/error-msg.component.html
@@ -0,0 +1,5 @@
+<div [attr.data-tests-id]="'error-msg-wrapper'" class="error-msg-wrapper" *ngIf="errorMsgService?.errorMsgObject">
+ <div class="title" [attr.data-tests-id]="'error-msg-title'">{{errorMsgService?.errorMsgObject?.title}}</div>
+ <div class="sub-title" [attr.data-tests-id]="'error-msg-sub-title'">{{errorMsgService?.errorMsgObject?.subtitle}}</div>
+ <div *ngIf="errorMsgService?.errorMsgObject?.description" class="description" [attr.data-tests-id]="'error-msg-description'">{{errorMsgService?.errorMsgObject?.description}}</div>
+</div>
diff --git a/vid-webpack-master/src/app/shared/components/error-msg/error-msg.component.scss b/vid-webpack-master/src/app/shared/components/error-msg/error-msg.component.scss
new file mode 100644
index 000000000..98c7e8480
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/error-msg/error-msg.component.scss
@@ -0,0 +1,22 @@
+.error-msg-wrapper{
+ display: block;
+ border-top: 6px solid #CF2A2A;
+ border-bottom: 1px solid #D2D2D2;
+ padding: 20px 45px;
+ font-family: OpenSans-Regular;
+ font-size: 14px;
+ .title{
+ color: #CF2A2A;
+ margin-bottom: 10px;
+ font-family: OpenSans-SemiBold;
+ font-size: 16px;
+ }
+ .sub-title{
+ color: #CF2A2A;
+ margin-bottom: 5px;
+ }
+ .description{
+ color: #191919;
+ }
+}
+
diff --git a/vid-webpack-master/src/app/shared/components/error-msg/error-msg.component.spec.ts b/vid-webpack-master/src/app/shared/components/error-msg/error-msg.component.spec.ts
new file mode 100644
index 000000000..2ca72c533
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/error-msg/error-msg.component.spec.ts
@@ -0,0 +1,48 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+import {ComponentFixture, TestBed} from '@angular/core/testing';
+import { ErrorMsgComponent } from './error-msg.component';
+import {ErrorMsgService} from "./error-msg.service";
+import {ErrorMsgObject} from "./error-msg.model";
+
+describe('ErrorMsgComponent', () => {
+
+ let component: ErrorMsgComponent;
+ let fixture: ComponentFixture<ErrorMsgComponent>;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ErrorMsgComponent],
+ providers: [ErrorMsgService]
+ }).compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(ErrorMsgComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ test('should create', () => {
+ expect(component).toBeTruthy();
+ });
+
+ test('should triggerShowError fill error msg object', () => {
+ let errorMsgObj:ErrorMsgObject = new ErrorMsgObject("Title", "SubTitle", "Description")
+ component.errorMsgService.triggerShowError.next(errorMsgObj);
+ let errorMsg = component.errorMsgService.errorMsgObject;
+ expect(errorMsg).toBeDefined();
+ expect(errorMsg.title).toBe('Title');
+ expect(errorMsg.subtitle).toBe('SubTitle');
+ expect(errorMsg.description).toBe('Description');
+ });
+
+ test('should triggerClearError delete error msg object', () => {
+ let errorMsgObj:ErrorMsgObject = new ErrorMsgObject("Title", "SubTitle", "Description")
+ component.errorMsgService.triggerShowError.next(errorMsgObj);
+ let errorMsg = component.errorMsgService.errorMsgObject;
+ expect(errorMsg).toBeDefined();
+ component.errorMsgService.triggerClearError.next();
+ expect(component.errorMsgService.errorMsgObject).toBeNull();
+
+ });
+});
diff --git a/vid-webpack-master/src/app/shared/components/error-msg/error-msg.component.ts b/vid-webpack-master/src/app/shared/components/error-msg/error-msg.component.ts
new file mode 100644
index 000000000..e47a06ca6
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/error-msg/error-msg.component.ts
@@ -0,0 +1,28 @@
+import {Component, OnChanges, SimpleChanges} from '@angular/core';
+import {ErrorMsgService} from "./error-msg.service";
+import {ErrorMsgObject} from "./error-msg.model";
+
+@Component({
+ selector: 'error-msg',
+ templateUrl: './error-msg.component.html',
+ styleUrls: ['./error-msg.component.scss']
+})
+
+export class ErrorMsgComponent implements OnChanges {
+
+ errorMsgService: ErrorMsgService;
+ constructor(private _errorMsgService: ErrorMsgService) {
+ this.errorMsgService = _errorMsgService;
+ this._errorMsgService.triggerShowError.subscribe((error: ErrorMsgObject) => {
+ this.errorMsgService.errorMsgObject = error;
+ });
+
+ this._errorMsgService.triggerClearError.subscribe(() => {
+ this.errorMsgService.errorMsgObject = null;
+ });
+ }
+
+ ngOnChanges(changes: SimpleChanges): void {
+ }
+}
+
diff --git a/vid-webpack-master/src/app/shared/components/error-msg/error-msg.model.ts b/vid-webpack-master/src/app/shared/components/error-msg/error-msg.model.ts
new file mode 100644
index 000000000..0cdb74290
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/error-msg/error-msg.model.ts
@@ -0,0 +1,11 @@
+export class ErrorMsgObject {
+ title: string;
+ subtitle: string;
+ description: string;
+
+ constructor(title: string, subtitle: string, description: string) {
+ this.title = title;
+ this.subtitle = subtitle;
+ this.description = description;
+ }
+}
diff --git a/vid-webpack-master/src/app/shared/components/error-msg/error-msg.service.spec.ts b/vid-webpack-master/src/app/shared/components/error-msg/error-msg.service.spec.ts
new file mode 100644
index 000000000..faaef8d41
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/error-msg/error-msg.service.spec.ts
@@ -0,0 +1,38 @@
+import {TestBed, getTestBed } from '@angular/core/testing';
+import {ErrorMsgService} from "./error-msg.service";
+
+describe('Error msg Service', () => {
+ let injector;
+ let service: ErrorMsgService;
+
+ beforeAll(done => (async () => {
+
+ TestBed.configureTestingModule(
+ {
+ providers: [
+ ErrorMsgService
+ ]
+ });
+ await TestBed.compileComponents();
+ injector = getTestBed();
+ service = injector.get(ErrorMsgService);
+ })().then(done).catch(done.fail));
+
+ test('should return error msg object when call to getScalingErrorObject', () => {
+ let errorMsgObject = service.getScalingErrorObject();
+ expect(errorMsgObject).toBeDefined();
+ expect(errorMsgObject.title).toBe('Error : Too many members');
+ expect(errorMsgObject.subtitle).toBe('One or more VNF groups, marked below, exceeds the maximum allowed number of members to associate');
+ expect(errorMsgObject.description).toBe('Please make sure the total amount of VNF instances is less than that amount.');
+ });
+
+ test('should return error msg object when call to getRetryErrorObject', () => {
+ let errorMsgObject = service.getRetryErrorObject(1);
+ expect(errorMsgObject).toBeDefined();
+ expect(errorMsgObject.title).toBe('ERROR!');
+ expect(errorMsgObject.subtitle).toBe(`Attention: You are currently viewing instances from the MSO. \n 1 of the instances failed, please try again.`);
+ expect(errorMsgObject.description).toBe(null);
+ });
+
+});
+
diff --git a/vid-webpack-master/src/app/shared/components/error-msg/error-msg.service.ts b/vid-webpack-master/src/app/shared/components/error-msg/error-msg.service.ts
new file mode 100644
index 000000000..e1bcd423f
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/error-msg/error-msg.service.ts
@@ -0,0 +1,22 @@
+import {Injectable} from '@angular/core';
+import {Subject} from 'rxjs/Subject';
+import {ErrorMsgObject} from "./error-msg.model";
+
+@Injectable()
+export class ErrorMsgService {
+ triggerShowError: Subject<ErrorMsgObject> = new Subject<ErrorMsgObject>();
+ triggerClearError: Subject<boolean> = new Subject<boolean>();
+ errorMsgObject: ErrorMsgObject = null;
+
+ getScalingErrorObject(): ErrorMsgObject {
+ return new ErrorMsgObject("Error : Too many members",
+ "One or more VNF groups, marked below, exceeds the maximum allowed number of members to associate",
+ "Please make sure the total amount of VNF instances is less than that amount.");
+ }
+
+ getRetryErrorObject(numberOfFailed: number): ErrorMsgObject {
+ return new ErrorMsgObject("ERROR!",
+ `Attention: You are currently viewing instances from the MSO. \n ${numberOfFailed} of the instances failed, please try again.`,
+ null);
+ }
+}
diff --git a/vid-webpack-master/src/app/shared/components/error/error.component.service.ts b/vid-webpack-master/src/app/shared/components/error/error.component.service.ts
index 35b83f0b6..c573d16e9 100644
--- a/vid-webpack-master/src/app/shared/components/error/error.component.service.ts
+++ b/vid-webpack-master/src/app/shared/components/error/error.component.service.ts
@@ -1,18 +1,16 @@
import {Injectable} from "@angular/core";
-import {Subject} from "rxjs/Subject";
-import { MessageBoxService } from '../messageBox/messageBox.service';
-import { MessageBoxData, ModalSize, ModalType } from '../messageBox/messageBox.data';
-
+import {MessageBoxService } from '../messageBox/messageBox.service';
+import {MessageBoxData} from '../messageBox/messageBox.data';
+import { SdcUiCommon} from "onap-ui-angular";
@Injectable()
export class ErrorService {
static showErrorWithMessage(error : ErrorMessage) : void {
setTimeout(()=>{
let messageBoxData : MessageBoxData = new MessageBoxData(
- error.title, // modal title
+ error.title,
error.text,
-
- ModalType.error,
- ModalSize.medium,
+ SdcUiCommon.ModalType.error,
+ SdcUiCommon.ModalSize.medium,
[
{text:"Close", size:"large", closeModal:true}
]);
@@ -33,3 +31,4 @@ export class ErrorMessage {
this.errorNumber = errorNumber;
}
}
+
diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/checkbox/checkbox.formControl.component.html b/vid-webpack-master/src/app/shared/components/formControls/component/checkbox/checkbox.formControl.component.html
new file mode 100644
index 000000000..26362ebed
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/formControls/component/checkbox/checkbox.formControl.component.html
@@ -0,0 +1,11 @@
+<div class="details-item">
+ <input type="checkbox"
+ id="{{data?.dataTestId}}"
+ [attr.data-tests-id]="data?.dataTestId"
+ [checked]="data?.value"
+ name="{{data?.controlName}}"
+ [formControl]="form?.controls[data?.controlName]"
+ data-toggle="toggle">
+ <label class="checkbox-label"
+ for="{{data?.dataTestId}}">{{data?.displayName}}</label>
+</div>
diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/checkbox/checkbox.formControl.component.ts b/vid-webpack-master/src/app/shared/components/formControls/component/checkbox/checkbox.formControl.component.ts
new file mode 100644
index 000000000..f9ba48308
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/formControls/component/checkbox/checkbox.formControl.component.ts
@@ -0,0 +1,13 @@
+import {Component, Input} from "@angular/core";
+import {FormControlModel} from "../../../../models/formControlModels/formControl.model";
+import {FormGroup} from "@angular/forms";
+
+@Component({
+ selector: 'checkbox-form-control',
+ templateUrl: './checkbox.formControl.component.html'
+})
+export class CheckboxFormControlComponent{
+ @Input() data: FormControlModel;
+ @Input() form: FormGroup;
+
+}
diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/dropdown/dropdown.formControl.component.html b/vid-webpack-master/src/app/shared/components/formControls/component/dropdown/dropdown.formControl.component.html
new file mode 100644
index 000000000..6d13e52f8
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/formControls/component/dropdown/dropdown.formControl.component.html
@@ -0,0 +1,21 @@
+<div class="details-item" *ngIf="data != null && form != null">
+ <label [ngClass]="{'required': data.isRequired()}"
+ for="{{data?.dataTestId}}-select">{{data?.displayName}}:</label>
+ <select class="form-control input-text"
+ id="{{data?.dataTestId}}-select"
+ [attr.data-tests-id]="data?.dataTestId"
+ name="{{data?.name}}"
+ [formControl]="form.controls[data.controlName]"
+ [ngClass]="{'error-style' : (form?.controls[data?.controlName]?.touched && form?.controls[data?.controlName]?.errors) || data?.hasEmptyOptions ,
+ 'grayColor': form?.controls[data?.controlName]?.value == null || form?.controls[data?.controlName]?.value == undefined,
+ 'blackColor' : form?.controls[data?.controlName]?.value != null}"
+ (blur)="data.onBlur()">
+
+ <option [value]="null" hidden>{{data?.placeHolder}}</option>
+ <option *ngFor="let option of data?.options$ | orderBy : {property : 'name', direction : 1} ; let i = index" class="{{option?.id}} {{data?.dataTestId}}Option"
+ [value]="option[data.ngValue]" [disabled]="!option?.isPermitted && option?.isPermitted != undefined">{{option.name}}
+ </option>
+ </select>
+ <form-control-error *ngIf="data?.hasEmptyOptions" [message]="'No results for this request. Please change criteria.'"></form-control-error>
+</div>
+
diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/dropdown/dropdown.formControl.component.scss b/vid-webpack-master/src/app/shared/components/formControls/component/dropdown/dropdown.formControl.component.scss
new file mode 100644
index 000000000..9826332cc
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/formControls/component/dropdown/dropdown.formControl.component.scss
@@ -0,0 +1,7 @@
+.grayColor {
+ color: gray !important;
+}
+
+.blackColor {
+ color: black !important;
+}
diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/dropdown/dropdown.formControl.component.ts b/vid-webpack-master/src/app/shared/components/formControls/component/dropdown/dropdown.formControl.component.ts
new file mode 100644
index 000000000..550feca22
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/formControls/component/dropdown/dropdown.formControl.component.ts
@@ -0,0 +1,27 @@
+import {Component, Input, OnChanges, SimpleChanges} from "@angular/core";
+import {DropdownFormControl} from "../../../../models/formControlModels/dropdownFormControl.model";
+import {FormGroup} from "@angular/forms";
+
+@Component({
+ selector: 'dropdown-form-control',
+ templateUrl: './dropdown.formControl.component.html',
+ styleUrls : ['./dropdown.formControl.component.scss']
+})
+export class DropdownFormControlComponent implements OnChanges{
+ @Input() data: DropdownFormControl = null;
+ @Input() form: FormGroup = null;
+
+ ngOnChanges(changes: SimpleChanges): void {
+ if (changes["data"] !== undefined && changes["data"].currentValue !== changes["data"].previousValue && changes["data"].firstChange) {
+ if(this.data.onInit){
+ this.data.onInit(this.data, this.form);
+ }
+ }
+
+ if (changes["data"] !== undefined) {
+ this.form.controls[this.data.controlName].valueChanges.subscribe((value)=>{
+ this.data.onChange(value, this.form);
+ })
+ }
+ }
+}
diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/file/file.formControl.component.html b/vid-webpack-master/src/app/shared/components/formControls/component/file/file.formControl.component.html
new file mode 100644
index 000000000..bcbe91e5e
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/formControls/component/file/file.formControl.component.html
@@ -0,0 +1,22 @@
+<div class="details-item file-form-control">
+ <label [ngClass]="{'required': data.isRequired()}" for="{{data?.controlName}}">{{data?.displayName}}:</label>
+ <label for="{{data?.controlName}}" class="file-input-wrapper" [ngClass]="{'file-uploaded': fileUploader.files && fileUploader.files[0] || data.selectedFile != data.placeHolder}">
+ <span data-tests-id="file-name" class="file-name">
+ {{ fileUploader.files && fileUploader.files[0] ? fileUploader.files[0].name : data.selectedFile}}
+ </span>
+ <input id="{{data?.controlName}}"
+ name="{{data?.controlName}}"
+ class="form-control input-text"
+ [formControl]="form?.controls[data?.controlName]"
+ [ngClass]="{'error-style' : form?.controls[data?.controlName]?.touched && form?.controls[data?.controlName]?.errors}"
+ type="file"
+ #fileUploader
+ accept="{{data?.acceptedExtentions}}"
+ (change)="data?.onChange($event.target.files, form)">
+ <input *ngFor="let hiddenFile of data?.hiddenFile" type="hidden" id="{{hiddenFile.controlName}}" name="{{hiddenFile.controlName}}"
+ [formControl]="form?.controls[hiddenFile.controlName]"/>
+ <span class="delete" data-tests-id="remove-uploaded-file" (click)="onDelete($event, data, form)">X</span>
+ <span class="icon-browse"></span>
+ </label>
+</div>
+
diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/file/file.formControl.component.scss b/vid-webpack-master/src/app/shared/components/formControls/component/file/file.formControl.component.scss
new file mode 100644
index 000000000..98fae0249
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/formControls/component/file/file.formControl.component.scss
@@ -0,0 +1,87 @@
+.file-form-control{
+ label{
+ color: #191919;
+ }
+ input[type=file] {
+ opacity: 0;
+ flex: 0;
+ }
+ .file-input-wrapper{
+ display: flex;
+ background: #FFFFFF;
+ border: 1px solid #D2D2D2;
+ border-radius: 2px;
+ height: 38px;
+ &:hover{
+ cursor: pointer;
+ border: 1px solid #009FDB;
+ .icon-browse{
+ background: #E6F6FB;
+ border-left: 1px solid #009FDB;
+ &:before{
+ color: #009FDB;
+ }
+ }
+ }
+ &:active{
+ .icon-browse{
+ background: #1EB9F3;
+ border-left: 1px solid #009FDB;
+ &:before{
+ color: #ffffff;
+ }
+ }
+ }
+ .file-name {
+ font-family: OpenSans-Italic;
+ font-weight: normal;
+ font-size: 14px;
+ color: #959595;
+ margin: 9px;
+ width: 100%;
+ }
+ .icon-browse{
+ z-index: 1;
+ margin-left: auto;
+ margin-bottom: 0;
+ cursor: pointer;
+ content: "\e90d";
+ color: #5A5A5A;
+ font-size: 30px;
+ display: block;
+ text-align: center;
+ padding-top: 4px;
+ background: #F2F2F2;
+ border-left: 1px solid #D2D2D2;
+ width: 36px;
+ height:100%;
+ &:before{
+ content: "\e90d";
+ color: #5A5A5A;
+ }
+ }
+ .delete{
+ visibility: hidden;
+ cursor: pointer;
+ font-size: 14px;
+ margin-right: 10px;
+ margin-top: 9px;
+ color: #5a5a5a;
+ margin-left: 10px;
+ z-index: 1;
+ &:hover{
+ color: #000000;
+ }
+ }
+ &.file-uploaded{
+ .file-name{
+ font-family: OpenSans-Regular;
+ font-size: 14px;
+ color: #000000;
+ }
+ .delete{
+ visibility: visible;
+ }
+ }
+ }
+}
diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/file/file.formControl.component.spec.ts b/vid-webpack-master/src/app/shared/components/formControls/component/file/file.formControl.component.spec.ts
new file mode 100644
index 000000000..e27f5115a
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/formControls/component/file/file.formControl.component.spec.ts
@@ -0,0 +1,62 @@
+import {ComponentFixture, TestBed} from '@angular/core/testing';
+import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'
+import {FileFormControlComponent} from "./file.formControl.component";
+import {CommonModule} from "@angular/common";
+import {FormBuilder, FormControl, ReactiveFormsModule, Validators} from "@angular/forms";
+import {ValidatorModel, ValidatorOptions} from "../../../../models/formControlModels/formControl.model";
+import {FormControlMessageErrorComponent} from "../../errorMessage/formControlMessageError.component";
+import {BrowserModule} from "@angular/platform-browser";
+import {TooltipModule} from "ngx-tooltip";
+import {FileFormControl} from "../../../../models/formControlModels/fileFormControl.model";
+
+describe('File Form Control Component', () => {
+ let component: FileFormControlComponent;
+ let fixture: ComponentFixture<FileFormControlComponent>;
+ let fb: FormBuilder;
+
+
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+ imports: [CommonModule, BrowserModule, ReactiveFormsModule, TooltipModule],
+ providers: [FormBuilder],
+ declarations: [FileFormControlComponent, FormControlMessageErrorComponent],
+ schemas: [CUSTOM_ELEMENTS_SCHEMA]
+ });
+ await TestBed.compileComponents();
+
+ fixture = TestBed.createComponent(FileFormControlComponent);
+ component = fixture.componentInstance;
+ fb = TestBed.get(FormBuilder);
+
+ })().then(done).catch(done.fail));
+
+ test('file component should initialize basic parameters', () => {
+ component.data = new FileFormControl({
+ displayName: "display Name",
+ validations: [new ValidatorModel(ValidatorOptions.required, 'is required')],
+ dataTestId: "data-test-id",
+ placeHolder: "place holder",
+ controlName: 'testFile',
+ acceptedExtentions: "json"
+ });
+
+ component.form = fb.group({
+ 'testFile': new FormControl({
+ value: component.data.selectedFile,
+ disabled: false
+ },
+ Validators.compose(component.data.validations.map(item => item.validator))
+ ),
+ });
+
+ component.data.onDelete = function () {
+ component.form.controls['testFile'].setValue('onDelete');
+ };
+
+ expect(component.form.controls['testFile'].value).toEqual("place holder");
+ let event = new Event("onDelete", null);
+ component.data.onDelete(event, component.data, component.form);
+ expect(component.form.controls['testFile'].value).toEqual('onDelete');
+ })
+});
+
diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/file/file.formControl.component.ts b/vid-webpack-master/src/app/shared/components/formControls/component/file/file.formControl.component.ts
new file mode 100644
index 000000000..2c2172005
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/formControls/component/file/file.formControl.component.ts
@@ -0,0 +1,27 @@
+import {Component, ElementRef, Input, ViewChild} from "@angular/core";
+import {FormGroup} from "@angular/forms";
+import {FileFormControl} from "../../../../models/formControlModels/fileFormControl.model";
+
+@Component({
+ selector : 'file-form-control',
+ templateUrl : './file.formControl.component.html',
+ styleUrls : ['./file.formControl.component.scss']
+})
+
+export class FileFormControlComponent {
+ @Input() data: FileFormControl = null;
+ @Input() form: FormGroup;
+ @ViewChild('fileUploader')
+ fileUploader:ElementRef ;
+
+ onDelete(event, data, form) {
+ event.stopPropagation();
+ event.preventDefault();
+ form.value[data.controlName] = this.fileUploader.nativeElement.value = "";
+ data.selectedFile = data.placeHolder;
+ if (data.onDelete){
+ data.onDelete(form);
+ }
+
+ }
+}
diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/file/fileUnit.enum.ts b/vid-webpack-master/src/app/shared/components/formControls/component/file/fileUnit.enum.ts
new file mode 100644
index 000000000..d875e486c
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/formControls/component/file/fileUnit.enum.ts
@@ -0,0 +1,7 @@
+export enum FileUnit {
+ b,
+ B,
+ KB,
+ MB,
+ GB
+}
diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/input/input.formControl.component.html b/vid-webpack-master/src/app/shared/components/formControls/component/input/input.formControl.component.html
new file mode 100644
index 000000000..90ac7c698
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/formControls/component/input/input.formControl.component.html
@@ -0,0 +1,25 @@
+<div class="details-item" *ngIf="data?.isVisible">
+ <label
+ [tooltip]="data?.tooltip ? data.tooltip : null"
+ id="{{data?.dataTestId}}-label"
+ [ngClass]="{'required' : data?.isRequired()}">
+ {{data?.displayName}}: </label>
+ <input
+ #customInput
+
+ [disabled]="data?.isDisabled ? data.isDisabled : false"
+ [type]="data?.inputType ? data?.inputType : 'text'"
+ [attr.data-tests-id]="data?.dataTestId"
+ class="form-control input-text"
+ id="{{data?.dataTestId}}"
+ [placeholder]="data?.placeHolder ? data?.placeHolder : ''"
+ [formControl]="form?.controls[data?.controlName]"
+ [ngClass]="{'error-style' : form?.controls[data?.controlName]?.touched && form?.controls[data?.controlName]?.errors}"
+ minlength="{{data?.minLength}}"
+ maxlength="{{data?.maxLength}}"
+ (blur)="data.onBlur($event, form)"
+ (keypress)="data?.onKeypress($event)">
+</div>
+
+
+
diff --git a/vid-webpack-master/src/app/instantiationStatus/auditInfoModal/auditInfoModal.component.service.ts b/vid-webpack-master/src/app/shared/components/formControls/component/input/input.formControl.component.scss
index e69de29bb..e69de29bb 100644
--- a/vid-webpack-master/src/app/instantiationStatus/auditInfoModal/auditInfoModal.component.service.ts
+++ b/vid-webpack-master/src/app/shared/components/formControls/component/input/input.formControl.component.scss
diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/input/input.formControl.component.spec.ts b/vid-webpack-master/src/app/shared/components/formControls/component/input/input.formControl.component.spec.ts
new file mode 100644
index 000000000..84d379d1a
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/formControls/component/input/input.formControl.component.spec.ts
@@ -0,0 +1,68 @@
+import {async, ComponentFixture, TestBed} from '@angular/core/testing';
+import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'
+import {InputFormControlComponent} from "./input.formControl.component";
+import {CommonModule} from "@angular/common";
+import {FormBuilder, FormControl, ReactiveFormsModule, Validators} from "@angular/forms";
+import {InputFormControl} from "../../../../models/formControlModels/inputFormControl.model";
+import {ValidatorModel, ValidatorOptions} from "../../../../models/formControlModels/formControl.model";
+import {FormControlMessageErrorComponent} from "../../errorMessage/formControlMessageError.component";
+import {BrowserModule} from "@angular/platform-browser";
+import {TooltipModule} from "ngx-tooltip";
+
+describe('Input Form Control Component', () => {
+ let component: InputFormControlComponent;
+ let fixture: ComponentFixture<InputFormControlComponent>;
+ let fb: FormBuilder;
+
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+ imports: [CommonModule, BrowserModule, ReactiveFormsModule, TooltipModule],
+ providers: [FormBuilder],
+ declarations: [InputFormControlComponent, FormControlMessageErrorComponent],
+ schemas: [CUSTOM_ELEMENTS_SCHEMA]
+ });
+ await TestBed.compileComponents();
+
+ fixture = TestBed.createComponent(InputFormControlComponent);
+ component = fixture.componentInstance;
+ fb = TestBed.get(FormBuilder);
+
+ })().then(done).catch(done.fail));
+
+ test('component should initialize basic parameters', () => {
+ component.data = new InputFormControl({
+ value: "value",
+ displayName: "display Name",
+ validations: [new ValidatorModel(ValidatorOptions.required, 'is required')],
+ dataTestId: "data-test-id",
+ placeHolder: "place holder",
+ controlName: 'testInstanceName'
+ });
+
+ component.data.hasErrors = function () {
+ return this.formGroup.controls[this.controlName].touched && this.formGroup.controls[this.controlName].errors ? ['error-style'] : [];
+ };
+
+ component.data.onBlur = function () {
+ component.form.controls['testInstanceName'].setValue('onBlur');
+ };
+
+ component.form = fb.group({
+ 'testInstanceName': new FormControl({
+ value: component.data.value,
+ disabled: false
+ }, Validators.compose(component.data.validations.map(item => item.validator)))
+ });
+
+
+ component.form.controls['testInstanceName'].setValue('newValue');
+ expect(component.form.controls['testInstanceName'].errors).toBeFalsy();
+ component.form.controls['testInstanceName'].setValue('');
+ expect(component.form.controls['testInstanceName'].errors.required).toBeTruthy();
+ component.data.onBlur();
+ expect(component.form.controls['testInstanceName'].value).toEqual('onBlur');
+ expect(component.form.controls['testInstanceName'].errors).toBeFalsy();
+ }
+ )
+});
+
diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/input/input.formControl.component.ts b/vid-webpack-master/src/app/shared/components/formControls/component/input/input.formControl.component.ts
new file mode 100644
index 000000000..1e8c28104
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/formControls/component/input/input.formControl.component.ts
@@ -0,0 +1,18 @@
+import {Component, ElementRef, Input, ViewChild} from "@angular/core";
+import {InputFormControl} from "../../../../models/formControlModels/inputFormControl.model";
+import {FormGroup} from "@angular/forms";
+
+@Component({
+ selector : 'form-control-input',
+ templateUrl : './input.formControl.component.html',
+ styleUrls : ['./input.formControl.component.scss']
+})
+
+export class InputFormControlComponent{
+ @ViewChild('customInput') element:ElementRef;
+ @Input() data: InputFormControl = null;
+ @Input() form: FormGroup;
+
+
+
+}
diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/multiselect/multiselect.formControl.component.html b/vid-webpack-master/src/app/shared/components/formControls/component/multiselect/multiselect.formControl.component.html
new file mode 100644
index 000000000..f7c4894b2
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/formControls/component/multiselect/multiselect.formControl.component.html
@@ -0,0 +1,16 @@
+<div>
+ <div class="details-item" *ngIf="data != null && form != null">
+ <label [ngClass]="{'required': data.isRequired()}"
+ for="{{data?.dataTestId}}">{{data?.displayName}}:</label>
+ <angular2-multiselect id="{{data?.dataTestId}}"
+ [attr.data-tests-id]="data?.dataTestId"
+ [formControl]="form.controls[data.controlName]"
+ [(ngModel)]="data.selectedItems"
+ [data]="data?.options$"
+ [settings]="data?.settings"
+ title="{{data.tooltip}}"
+ [ngClass]="{'error-style' : form?.controls[data?.controlName]?.touched && form?.controls[data?.controlName]?.errors}">
+ </angular2-multiselect>
+ </div>
+</div>
+
diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/multiselect/multiselect.formControl.component.spec.ts b/vid-webpack-master/src/app/shared/components/formControls/component/multiselect/multiselect.formControl.component.spec.ts
new file mode 100644
index 000000000..81c8d4679
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/formControls/component/multiselect/multiselect.formControl.component.spec.ts
@@ -0,0 +1,74 @@
+import {ComponentFixture, TestBed} from '@angular/core/testing';
+import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'
+import {CommonModule} from "@angular/common";
+import {FormBuilder, FormControl, ReactiveFormsModule, Validators} from "@angular/forms";
+import {
+ ValidatorModel,
+ ValidatorOptions
+} from "../../../../models/formControlModels/formControl.model";
+import {FormControlMessageErrorComponent} from "../../errorMessage/formControlMessageError.component";
+import {BrowserModule} from "@angular/platform-browser";
+import {MultiselectFormControlComponent} from "./multiselect.formControl.component";
+import {MultiselectFormControl} from "../../../../models/formControlModels/multiselectFormControl.model";
+import { of } from "rxjs";
+describe('Dropdown Form Control Component', () => {
+ let component: MultiselectFormControlComponent;
+ let fixture: ComponentFixture<MultiselectFormControlComponent>;
+ let fb: FormBuilder;
+
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+ imports: [CommonModule, BrowserModule, ReactiveFormsModule],
+ providers: [FormBuilder],
+ declarations: [MultiselectFormControlComponent, FormControlMessageErrorComponent],
+ schemas: [CUSTOM_ELEMENTS_SCHEMA]
+ });
+ await TestBed.compileComponents();
+
+ fixture = TestBed.createComponent(MultiselectFormControlComponent);
+ component = fixture.componentInstance;
+ fb = TestBed.get(FormBuilder);
+
+ })().then(done).catch(done.fail));
+
+ test('component should initialize basic parameters', () => {
+ component.data = new MultiselectFormControl({
+ displayName: "display Name",
+ validations: [new ValidatorModel(ValidatorOptions.required, 'is required')],
+ dataTestId: "data-test-id",
+ placeHolder: "place holder",
+ controlName: 'testDropdown',
+ options: of([
+ 'option1',
+ 'option2',
+ 'option3',
+ 'onBlur'
+ ])
+ });
+
+ component.data.hasErrors = function () {
+ return this.formGroup.controls[this.controlName].touched && this.formGroup.controls[this.controlName].errors ? ['error-style'] : [];
+ };
+
+ component.data.onBlur = function () {
+ component.form.controls['testDropdown'].setValue('onBlur');
+ };
+
+ component.form = fb.group({
+ 'testDropdown': new FormControl({
+ value: component.data.value,
+ disabled: false
+ }, Validators.compose(component.data.validations.map(item => item.validator)))
+ });
+
+ component.form.controls['testDropdown'].setValue('');
+ expect(component.form.controls['testDropdown'].errors.required).toBeTruthy();
+ component.form.controls['testDropdown'].setValue('option2');
+ expect(component.form.controls['testDropdown'].errors).toBeFalsy();
+ component.data.onBlur();
+ expect(component.form.controls['testDropdown'].value).toEqual('onBlur');
+ expect(component.form.controls['testDropdown'].errors).toBeFalsy();
+ }
+ )
+});
+
diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/multiselect/multiselect.formControl.component.ts b/vid-webpack-master/src/app/shared/components/formControls/component/multiselect/multiselect.formControl.component.ts
new file mode 100644
index 000000000..4b98c7e26
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/formControls/component/multiselect/multiselect.formControl.component.ts
@@ -0,0 +1,20 @@
+import {Component, Input, OnChanges, SimpleChanges} from "@angular/core";
+import {FormGroup} from "@angular/forms";
+import {MultiselectFormControl} from "../../../../models/formControlModels/multiselectFormControl.model";
+
+@Component({
+ selector: 'multiselect-form-control',
+ templateUrl: './multiselect.formControl.component.html'
+})
+export class MultiselectFormControlComponent implements OnChanges{
+ @Input() data: MultiselectFormControl = null;
+ @Input() form: FormGroup = null;
+
+ ngOnChanges(changes: SimpleChanges): void {
+ if (changes["data"] !== undefined && changes["data"].currentValue !== changes["data"].previousValue && changes["data"].firstChange) {
+ if(this.data.onInit){
+ this.data.onInit(this.data, this.form);
+ }
+ }
+ }
+}
diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/number/number.formControl.component.html b/vid-webpack-master/src/app/shared/components/formControls/component/number/number.formControl.component.html
new file mode 100644
index 000000000..3763764d5
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/formControls/component/number/number.formControl.component.html
@@ -0,0 +1,13 @@
+<div>
+ <div class="details-item" *ngIf="data != null && form != null">
+ <label [ngClass]="{'required': data.isRequired()}"
+ for="{{data?.dataTestId}}">{{data?.displayName}}:</label>
+ <input id="{{data?.dataTestId}}" [attr.data-tests-id]="data?.dataTestId"
+ name="{{data?.controlName}}" class="form-control input-text"
+ [formControl]="form.controls[data.controlName]" type="number"
+ placeholder="{{data?.placeHolder}}" title="{{data?.tooltip}}"
+ [ngClass]="{'error-style' : form?.controls[data?.controlName]?.touched && form?.controls[data?.controlName]?.errors}"
+ min="{{data?.min}}" max="{{data?.max}}">
+ </div>
+</div>
+
diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/number/number.formControl.component.ts b/vid-webpack-master/src/app/shared/components/formControls/component/number/number.formControl.component.ts
new file mode 100644
index 000000000..bd25ded81
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/formControls/component/number/number.formControl.component.ts
@@ -0,0 +1,12 @@
+import {Component, Input} from "@angular/core";
+import {FormGroup} from "@angular/forms";
+import {NumberFormControl} from "../../../../models/formControlModels/numberFormControl.model";
+
+@Component({
+ selector: 'number-form-control',
+ templateUrl: './number.formControl.component.html'
+})
+export class NumberFormControlComponent {
+ @Input() data: NumberFormControl = null;
+ @Input() form: FormGroup = null;
+}
diff --git a/vid-webpack-master/src/app/shared/components/formControls/errorMessage/formControlMessageError.component.html b/vid-webpack-master/src/app/shared/components/formControls/errorMessage/formControlMessageError.component.html
new file mode 100644
index 000000000..4d89854d5
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/formControls/errorMessage/formControlMessageError.component.html
@@ -0,0 +1,5 @@
+<div *ngIf="form != null && formControl != null && form.controls[formControl.controlName]?.errors">
+ <div *ngFor="let validatorModel of formControl?.validations">
+ <form-control-error *ngIf="form.controls[formControl?.controlName]?.errors[validatorModel?.validatorName]" [message]="validatorModel?.errorMsg"></form-control-error>
+ </div>
+</div>
diff --git a/vid-webpack-master/src/app/shared/components/formControls/errorMessage/formControlMessageError.component.ts b/vid-webpack-master/src/app/shared/components/formControls/errorMessage/formControlMessageError.component.ts
new file mode 100644
index 000000000..02ec57e43
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/formControls/errorMessage/formControlMessageError.component.ts
@@ -0,0 +1,15 @@
+import {Component, Input, OnChanges, SimpleChanges} from "@angular/core";
+import {FormGroup} from "@angular/forms";
+import {FormControlModel} from "../../../models/formControlModels/formControl.model";
+
+@Component({
+ selector : 'form-control-message-error',
+ templateUrl : './formControlMessageError.component.html'
+})
+export class FormControlMessageErrorComponent implements OnChanges{
+ @Input() formControl: FormControlModel = null;
+ @Input() form: FormGroup = null;
+
+ ngOnChanges(changes: SimpleChanges): void {
+ }
+}
diff --git a/vid-webpack-master/src/app/shared/components/formGeneralErrors/formGeneralErrors.component.scss b/vid-webpack-master/src/app/shared/components/formGeneralErrors/formGeneralErrors.component.scss
index 5271cad49..988d12cd6 100644
--- a/vid-webpack-master/src/app/shared/components/formGeneralErrors/formGeneralErrors.component.scss
+++ b/vid-webpack-master/src/app/shared/components/formGeneralErrors/formGeneralErrors.component.scss
@@ -32,6 +32,7 @@
.parentbox {
padding-right: 0;
+ line-height: 67px;
}
.parentbox:before {
diff --git a/vid-webpack-master/src/app/shared/components/formGeneralErrors/formGeneralErrors.service.ts b/vid-webpack-master/src/app/shared/components/formGeneralErrors/formGeneralErrors.service.ts
new file mode 100644
index 000000000..1550e0820
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/formGeneralErrors/formGeneralErrors.service.ts
@@ -0,0 +1,7 @@
+import {Injectable} from "@angular/core";
+import {Subject} from "rxjs";
+
+@Injectable()
+export class FormGeneralErrorsService {
+ static checkForErrorTrigger : Subject<boolean> = new Subject<boolean>();
+}
diff --git a/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/basic.control.generator.spec.ts b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/basic.control.generator.spec.ts
new file mode 100644
index 000000000..4189fba05
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/basic.control.generator.spec.ts
@@ -0,0 +1,48 @@
+import {getTestBed, TestBed} from '@angular/core/testing';
+import {AaiService} from "../../../services/aaiService/aai.service";
+import {FormControlModel, ValidatorModel, ValidatorOptions} from "../../../models/formControlModels/formControl.model";
+import {FeatureFlagsService} from "../../../services/featureFlag/feature-flags.service";
+import {BasicControlGenerator} from "./basic.control.generator";
+import {NgRedux} from '@angular-redux/store';
+import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing';
+
+class MockAppStore<T> {}
+
+class MockFeatureFlagsService {}
+
+describe('Basic Control Generator', () => {
+ let injector;
+ let service: BasicControlGenerator;
+ let httpMock: HttpTestingController;
+
+
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+ imports: [HttpClientTestingModule],
+ providers: [BasicControlGenerator,
+ AaiService,
+ {provide:FeatureFlagsService, useClass: MockFeatureFlagsService},
+ {provide: NgRedux, useClass: MockAppStore}]
+ });
+ await TestBed.compileComponents();
+
+ injector = getTestBed();
+ service = injector.get(BasicControlGenerator);
+ httpMock = injector.get(HttpTestingController);
+
+ })().then(done).catch(done.fail));
+
+
+ test('getlegacyRegion with JANET25 - isVisible true', () => {
+ const instance = {lcpCloudRegionId : 'JANET25'};
+ const legacyRegionControl: FormControlModel = service.getLegacyRegion(instance);
+ expect(legacyRegionControl.isVisible).toBeTruthy();
+ });
+
+ test('getlegacyRegion without JANET25 - isVisible false', () => {
+ const instance = {lcpCloudRegionId : 'olson3'};
+ const legacyRegionControl: FormControlModel = service.getLegacyRegion(instance);
+ expect(legacyRegionControl.isVisible).toBeFalsy();
+ });
+});
+
diff --git a/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/basic.control.generator.ts b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/basic.control.generator.ts
new file mode 100644
index 000000000..cbbff3c39
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/basic.control.generator.ts
@@ -0,0 +1,240 @@
+import {Injectable} from "@angular/core";
+import {DropdownFormControl} from "../../../models/formControlModels/dropdownFormControl.model";
+import {FormGroup} from "@angular/forms";
+import {
+ CustomValidatorOptions,
+ FormControlModel,
+ ValidatorModel,
+ ValidatorOptions
+} from "../../../models/formControlModels/formControl.model";
+import {InputFormControl} from "../../../models/formControlModels/inputFormControl.model";
+import {AppState} from "../../../store/reducers";
+import {NgRedux} from "@angular-redux/store";
+import {NumberFormControl} from "../../../models/formControlModels/numberFormControl.model";
+import {FormControlType} from "../../../models/formControlModels/formControlTypes.enum";
+import {FileFormControl} from "../../../models/formControlModels/fileFormControl.model";
+import {SelectOption} from "../../../models/selectOption";
+import * as _ from 'lodash';
+import {DynamicInputLabelPipe} from "../../../pipes/dynamicInputLabel/dynamic-input-label.pipe";
+import {AaiService} from "../../../services/aaiService/aai.service";
+import {FormGeneralErrorsService} from "../../formGeneralErrors/formGeneralErrors.service";
+import {Observable, of} from "rxjs";
+import {NodeModel} from "../../../models/nodeModel";
+import {Constants} from "../../../utils/constants";
+
+
+@Injectable()
+export class BasicControlGenerator {
+
+ public static readonly INSTANCE_NAME_REG_EX:RegExp = /^[a-zA-Z0-9._-]*$/;
+ public static readonly GENERATED_NAME_REG_EX:RegExp = /[^a-zA-Z0-9._-]/g;
+
+ constructor(private _store : NgRedux<AppState>,
+ private _aaiService : AaiService){}
+ getSubscribeResult(subscribeFunction : Function, control : DropdownFormControl) : Observable<any>{
+ return subscribeFunction(this).subscribe((res) => {
+ control.options$ = res;
+ control.hasEmptyOptions = res.length === 0;
+ FormGeneralErrorsService.checkForErrorTrigger.next();
+ return of(res);
+ });
+ }
+
+ getSubscribeInitResult(subscribeFunction : Function, control : DropdownFormControl, form : FormGroup) : Observable<any>{
+ return subscribeFunction(this).subscribe((res) => {
+ if(!_.isNil(control['onInitSelectedField'])){
+ let result = res;
+ for(let key of control['onInitSelectedField']){
+ result = !_.isNil(result[key]) ? result[key] : [];
+ }
+ control.options$ = result;
+ control.hasEmptyOptions = _.isNil(result) || result.length === 0;
+ } else{
+ control.options$ = !_.isNil(res) ? res : [];
+ control.hasEmptyOptions = _.isNil(res) || res.length === 0;
+ }
+
+ FormGeneralErrorsService.checkForErrorTrigger.next();
+ return of(res);
+ });
+ }
+
+ getInstanceNameController(instance: any, serviceId: string, isEcompGeneratedNaming: boolean, model: NodeModel): FormControlModel {
+ let validations: ValidatorModel[] = this.createValidationsForInstanceName(instance, serviceId, isEcompGeneratedNaming);
+ return new InputFormControl({
+ controlName: 'instanceName',
+ displayName: 'Instance name',
+ dataTestId: 'instanceName',
+ placeHolder: (!isEcompGeneratedNaming) ? 'Instance name' : 'Automatically generated when not provided',
+ validations: validations,
+ isVisible : true,
+ value : (!isEcompGeneratedNaming || (!_.isNil(instance) && !_.isNil(instance.instanceName)))
+ ? this.getDefaultInstanceName(instance, model) : null,
+ onKeypress : (event) => {
+ const pattern:RegExp = BasicControlGenerator.INSTANCE_NAME_REG_EX;
+ if(pattern){
+ if(!pattern.test(event['key'])){
+ event.preventDefault();
+ }
+ }
+ return event;
+ }
+ });
+ }
+
+ getInstanceName(instance : any, serviceId : string, isEcompGeneratedNaming: boolean): FormControlModel {
+ let formControlModel:FormControlModel = this.getInstanceNameController(instance, serviceId, isEcompGeneratedNaming, new NodeModel());
+ formControlModel.value = instance ? instance.instanceName : null;
+ return formControlModel;
+ }
+
+ isLegacyRegionShouldBeVisible(instance : any) : boolean {
+ if(!_.isNil(instance) && !_.isNil(instance.lcpCloudRegionId)) {
+ return Constants.LegacyRegion.MEGA_REGION.indexOf(instance.lcpCloudRegionId) !== -1;
+ }
+ return false;
+ }
+
+ getLegacyRegion(instance: any): FormControlModel {
+ return new InputFormControl({
+ controlName: 'legacyRegion',
+ displayName: 'Legacy Region',
+ dataTestId: 'lcpRegionText',
+ placeHolder: 'Type Legacy Region',
+ validations: [],
+ isVisible: this.isLegacyRegionShouldBeVisible(instance),
+ isDisabled : _.isNil(instance) ? true : Constants.LegacyRegion.MEGA_REGION.indexOf(instance.lcpCloudRegionId),
+ value: instance ? instance.legacyRegion : null
+ });
+ }
+
+ private createValidationsForInstanceName(instance: any, serviceId: string, isEcompGeneratedNaming: boolean): ValidatorModel[] {
+ let validations: ValidatorModel[] = [
+ new ValidatorModel(ValidatorOptions.pattern, 'Instance name may include only alphanumeric characters and underscore.', BasicControlGenerator.INSTANCE_NAME_REG_EX),
+ new ValidatorModel(CustomValidatorOptions.uniqueInstanceNameValidator, 'some error', [this._store, serviceId, instance && instance.instanceName])
+ ];
+ if (!isEcompGeneratedNaming) {
+ validations.push(new ValidatorModel(ValidatorOptions.required, 'is required'));
+ }
+ return validations;
+ }
+
+ getInputsOptions = (options: any[]) : Observable<SelectOption[]> =>{
+ let optionList: SelectOption[] = [];
+ options.forEach((option) => {
+ optionList.push(new SelectOption({
+ id: option.id || option.name,
+ name: option.name
+ }));
+ });
+ return of(optionList);
+ };
+
+ getProductFamilyControl = (instance : any, controls : FormControlModel[], isMandatory?: boolean) : DropdownFormControl => {
+ return new DropdownFormControl({
+ type : FormControlType.DROPDOWN,
+ controlName : 'productFamilyId',
+ displayName : 'Product family',
+ dataTestId : 'productFamily',
+ placeHolder : 'Select Product Family',
+ isDisabled : false,
+ name : "product-family-select",
+ value : instance ? instance.productFamilyId : null,
+ validations : _.isNil(isMandatory) || isMandatory === true ? [new ValidatorModel(ValidatorOptions.required, 'is required')]: [],
+ onInit : this.getSubscribeResult.bind(this, this._aaiService.getProductFamilies),
+ })
+ };
+
+
+
+ getDynamicInputsByType(dynamicInputs : any, serviceModelId : string, storeKey : string, type: string ) : FormControlModel[] {
+ let result : FormControlModel[] = [];
+ if(dynamicInputs) {
+ let nodeInstance = null;
+ if (_.has(this._store.getState().service.serviceInstance[serviceModelId][type], storeKey)) {
+ nodeInstance = Object.assign({}, this._store.getState().service.serviceInstance[serviceModelId][type][storeKey]);
+ }
+ result = this.getDynamicInputs(dynamicInputs, nodeInstance);
+ }
+ return result;
+ }
+
+
+ getServiceDynamicInputs(dynamicInputs : any, serviceModelId : string) : FormControlModel[] {
+ let result: FormControlModel[] = [];
+ if (dynamicInputs) {
+ let serviceInstance = null;
+ if (_.has(this._store.getState().service.serviceInstance, serviceModelId)) {
+ serviceInstance = Object.assign({}, this._store.getState().service.serviceInstance[serviceModelId]);
+ }
+ result = this.getDynamicInputs(dynamicInputs, serviceInstance);
+ }
+ return result;
+ }
+
+ getDynamicInputs(dynamicInputs : any, instance :any) : FormControlModel[]{
+ let result : FormControlModel[] = [];
+ if(dynamicInputs) {
+ dynamicInputs.forEach((input)=> {
+ let validations: ValidatorModel[] = [];
+ if(input.isRequired) {
+ validations.push(new ValidatorModel(ValidatorOptions.required, 'is required'))
+ }
+ if(input.minLength) {
+ validations.push(new ValidatorModel(ValidatorOptions.minLength, '', input.minLength))
+ }
+ if(input.maxLength) {
+ validations.push(new ValidatorModel(ValidatorOptions.maxLength, '', input.maxLength))
+ }
+
+ let dynamicInputLabelPipe: DynamicInputLabelPipe = new DynamicInputLabelPipe();
+ let data:any = {
+ controlName: input.name,
+ displayName: dynamicInputLabelPipe.transform(input.name).slice(0, -1),
+ dataTestId: input.id,
+ placeHolder: input.prompt,
+ tooltip: input.description,
+ validations: validations,
+ isVisible: input.isVisible,
+ value: !_.isNil(instance) && !_.isNil(instance.instanceParams) && instance.instanceParams.length > 0 ? instance.instanceParams[0][input.name] : input.value
+ };
+
+ switch (input.type) {
+ case 'select' :
+ case 'boolean' :{
+ data.value = data.value || input.optionList.filter((option) => option.isDefault ? option.id || option.name: null);
+ data.onInit = this.getSubscribeInitResult.bind(null, this.getInputsOptions.bind(this, input.optionList));
+ result.push(new DropdownFormControl(data));
+ break;
+ }
+ case 'checkbox': {
+ data.type = FormControlType.CHECKBOX;
+ result.push(new FormControlModel(data));
+ break;
+ }
+ case 'number': {
+ data.min = input.min;
+ data.max = input.max;
+ result.push(new NumberFormControl(data));
+ break;
+ }
+ case 'file': {
+ result.push(new FileFormControl(data));
+ break;
+ }
+ default: {
+ result.push(new InputFormControl(data));
+ }
+ }
+ })
+ }
+
+ return result;
+ }
+
+ getDefaultInstanceName(instance: any, model: NodeModel) : string {
+ const initialInstanceName = (!_.isNil(instance) && instance.instanceName) || (!_.isNil(model.name) ? model.name.replace(BasicControlGenerator.GENERATED_NAME_REG_EX, "") : model.name);
+ return initialInstanceName;
+ }
+
+}
diff --git a/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/networkGenerator/network.control.generator.spec.ts b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/networkGenerator/network.control.generator.spec.ts
new file mode 100644
index 000000000..97c6ddf59
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/networkGenerator/network.control.generator.spec.ts
@@ -0,0 +1,1979 @@
+import {getTestBed, TestBed} from '@angular/core/testing';
+import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing';
+import {NgRedux} from '@angular-redux/store';
+import {BasicControlGenerator} from "../basic.control.generator";
+import {AaiService} from "../../../../services/aaiService/aai.service";
+import {GenericFormService} from "../../generic-form.service";
+import {FormBuilder} from "@angular/forms";
+import {LogService} from "../../../../utils/log/log.service";
+import {FormControlNames, NetworkControlGenerator} from "./network.control.generator";
+import {
+ FormControlModel,
+ ValidatorModel,
+ ValidatorOptions
+} from "../../../../models/formControlModels/formControl.model";
+import {FeatureFlagsService} from "../../../../services/featureFlag/feature-flags.service";
+
+class MockAppStore<T> {
+ getState(){
+ return {
+ "global": {
+ "name": null,
+ "flags": {
+ "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false,
+ "FLAG_SHOW_ASSIGNMENTS": true,
+ "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
+ "FLAG_UNASSIGN_SERVICE": true,
+ "FLAG_SHOW_VERIFY_SERVICE": false,
+ "FLAG_COLLECTION_RESOURCE_SUPPORT": true,
+ "FLAG_DUPLICATE_VNF": true,
+ "FLAG_SERVICE_MODEL_CACHE": true,
+ "CREATE_INSTANCE_TEST": false,
+ "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false,
+ "FLAG_ASYNC_INSTANTIATION": true,
+ "FLAG_ASYNC_JOBS": true,
+ "EMPTY_DRAWING_BOARD_TEST": false,
+ "FLAG_ADD_MSO_TESTAPI_FIELD": true
+ },
+ "type": "[FLAGS] Update"
+ },
+ "service": {
+ "serviceHierarchy": {
+ "6e59c5de-f052-46fa-aa7e-2fca9d674c44": {
+ "service": {
+ "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "name": "ComplexService",
+ "version": "1.0",
+ "toscaModelURL": null,
+ "category": "Emanuel",
+ "serviceType": "",
+ "serviceRole": "",
+ "description": "ComplexService",
+ "serviceEcompNaming": "false",
+ "instantiationType": "Macro",
+ "inputs": {}
+ },
+ "vnfs": {
+ "VF_vMee 0": {
+ "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60",
+ "invariantUuid": "4160458e-f648-4b30-a176-43881ffffe9e",
+ "description": "VSP_vMee",
+ "name": "VF_vMee",
+ "version": "2.0",
+ "customizationUuid": "91415b44-753d-494c-926a-456a9172bbb9",
+ "inputs": {},
+ "commands": {},
+ "properties": {
+ "max_instances": 10,
+ "min_instances": 1,
+ "gpb2_Internal2_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-ipv6-egress_src_start_port": "0",
+ "sctp-a-ipv6-egress_rule_application": "any",
+ "Internal2_allow_transit": "true",
+ "sctp-b-IPv6_ethertype": "IPv6",
+ "sctp-a-egress_rule_application": "any",
+ "sctp-b-ingress_action": "pass",
+ "sctp-b-ingress_rule_protocol": "icmp",
+ "ncb2_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-ipv6-ingress-src_start_port": "0.0",
+ "ncb1_Internal2_mac": "00:11:22:EF:AC:DF",
+ "fsb_volume_size_0": "320.0",
+ "sctp-b-egress_src_addresses": "local",
+ "sctp-a-ipv6-ingress_ethertype": "IPv4",
+ "sctp-a-ipv6-ingress-dst_start_port": "0",
+ "sctp-b-ipv6-ingress_rule_application": "any",
+ "domain_name": "default-domain",
+ "sctp-a-ingress_rule_protocol": "icmp",
+ "sctp-b-egress-src_start_port": "0.0",
+ "sctp-a-egress_src_addresses": "local",
+ "sctp-b-display_name": "epc-sctp-b-ipv4v6-sec-group",
+ "sctp-a-egress-src_start_port": "0.0",
+ "sctp-a-ingress_ethertype": "IPv4",
+ "sctp-b-ipv6-ingress-dst_end_port": "65535",
+ "sctp-b-dst_subnet_prefix_v6": "::",
+ "nf_naming": "{ecomp_generated_naming=true}",
+ "sctp-a-ipv6-ingress_src_subnet_prefix": "0.0.0.0",
+ "sctp-b-egress-dst_start_port": "0.0",
+ "ncb_flavor_name": "nv.c20r64d1",
+ "gpb1_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-egress_dst_subnet_prefix_len": "0.0",
+ "Internal2_net_cidr": "10.0.0.10",
+ "sctp-a-ingress-dst_start_port": "0.0",
+ "sctp-a-egress-dst_start_port": "0.0",
+ "fsb1_Internal2_mac": "00:11:22:EF:AC:DF",
+ "sctp-a-egress_ethertype": "IPv4",
+ "vlc_st_service_mode": "in-network-nat",
+ "sctp-a-ipv6-egress_ethertype": "IPv4",
+ "sctp-a-egress-src_end_port": "65535.0",
+ "sctp-b-ipv6-egress_rule_application": "any",
+ "sctp-b-egress_action": "pass",
+ "sctp-a-ingress-src_subnet_prefix_len": "0.0",
+ "sctp-b-ipv6-ingress-src_end_port": "65535.0",
+ "sctp-b-name": "epc-sctp-b-ipv4v6-sec-group",
+ "fsb2_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-a-ipv6-ingress-src_start_port": "0.0",
+ "sctp-b-ipv6-egress_ethertype": "IPv4",
+ "Internal1_net_cidr": "10.0.0.10",
+ "sctp-a-egress_dst_subnet_prefix": "0.0.0.0",
+ "fsb_flavor_name": "nv.c20r64d1",
+ "sctp_rule_protocol": "132",
+ "sctp-b-ipv6-ingress_src_subnet_prefix_len": "0",
+ "sctp-a-ipv6-ingress_rule_application": "any",
+ "ecomp_generated_naming": "false",
+ "sctp-a-IPv6_ethertype": "IPv6",
+ "vlc2_Internal1_mac": "00:11:22:EF:AC:DF",
+ "vlc_st_virtualization_type": "virtual-machine",
+ "sctp-b-ingress-dst_start_port": "0.0",
+ "sctp-b-ingress-dst_end_port": "65535.0",
+ "sctp-a-ipv6-ingress-src_end_port": "65535.0",
+ "sctp-a-display_name": "epc-sctp-a-ipv4v6-sec-group",
+ "sctp-b-ingress_rule_application": "any",
+ "int2_sec_group_name": "int2-sec-group",
+ "vlc_flavor_name": "nd.c16r64d1",
+ "sctp-b-ipv6-egress_src_addresses": "local",
+ "vlc_st_interface_type_int1": "other1",
+ "sctp-b-egress-src_end_port": "65535.0",
+ "sctp-a-ipv6-egress-dst_start_port": "0",
+ "vlc_st_interface_type_int2": "other2",
+ "sctp-a-ipv6-egress_rule_protocol": "any",
+ "Internal2_shared": "false",
+ "sctp-a-ipv6-egress_dst_subnet_prefix_len": "0",
+ "Internal2_rpf": "disable",
+ "vlc1_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-ipv6-egress_src_end_port": "65535",
+ "sctp-a-ipv6-egress_src_addresses": "local",
+ "sctp-a-ingress-dst_end_port": "65535.0",
+ "sctp-a-ipv6-egress_src_end_port": "65535",
+ "Internal1_forwarding_mode": "l2",
+ "Internal2_dhcp": "false",
+ "sctp-a-dst_subnet_prefix_v6": "::",
+ "pxe_image_name": "MME_PXE-Boot_16ACP04_GA.qcow2",
+ "vlc_st_interface_type_gtp": "other0",
+ "ncb1_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-src_subnet_prefix_v6": "::",
+ "sctp-a-egress_dst_subnet_prefix_len": "0.0",
+ "int1_sec_group_name": "int1-sec-group",
+ "Internal1_dhcp": "false",
+ "sctp-a-ipv6-egress_dst_end_port": "65535",
+ "Internal2_forwarding_mode": "l2",
+ "fsb2_Internal2_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-egress_dst_subnet_prefix": "0.0.0.0",
+ "Internal1_net_cidr_len": "17",
+ "gpb2_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-ingress-src_subnet_prefix_len": "0.0",
+ "sctp-a-ingress_dst_addresses": "local",
+ "sctp-a-egress_action": "pass",
+ "fsb_volume_type_0": "SF-Default-SSD",
+ "ncb2_Internal2_mac": "00:11:22:EF:AC:DF",
+ "vlc_st_interface_type_sctp_a": "left",
+ "vlc_st_interface_type_sctp_b": "right",
+ "sctp-a-src_subnet_prefix_v6": "::",
+ "vlc_st_version": "2",
+ "sctp-b-egress_ethertype": "IPv4",
+ "sctp-a-ingress_rule_application": "any",
+ "gpb1_Internal2_mac": "00:11:22:EF:AC:DF",
+ "instance_ip_family_v6": "v6",
+ "sctp-a-ipv6-egress_src_start_port": "0",
+ "sctp-b-ingress-src_start_port": "0.0",
+ "sctp-b-ingress_dst_addresses": "local",
+ "fsb1_Internal1_mac": "00:11:22:EF:AC:DF",
+ "vlc_st_interface_type_oam": "management",
+ "multi_stage_design": "true",
+ "oam_sec_group_name": "oam-sec-group",
+ "Internal2_net_gateway": "10.0.0.10",
+ "sctp-a-ipv6-ingress-dst_end_port": "65535",
+ "sctp-b-ipv6-egress-dst_start_port": "0",
+ "Internal1_net_gateway": "10.0.0.10",
+ "sctp-b-ipv6-egress_rule_protocol": "any",
+ "gtp_sec_group_name": "gtp-sec-group",
+ "sctp-a-ipv6-egress_dst_subnet_prefix": "0.0.0.0",
+ "sctp-b-ipv6-egress_dst_subnet_prefix_len": "0",
+ "sctp-a-ipv6-ingress_dst_addresses": "local",
+ "sctp-a-egress_rule_protocol": "icmp",
+ "sctp-b-ipv6-egress_action": "pass",
+ "sctp-a-ipv6-egress_action": "pass",
+ "Internal1_shared": "false",
+ "sctp-b-ipv6-ingress_rule_protocol": "any",
+ "Internal2_net_cidr_len": "17",
+ "sctp-a-name": "epc-sctp-a-ipv4v6-sec-group",
+ "sctp-a-ingress-src_end_port": "65535.0",
+ "sctp-b-ipv6-ingress_src_subnet_prefix": "0.0.0.0",
+ "sctp-a-egress-dst_end_port": "65535.0",
+ "sctp-a-ingress_action": "pass",
+ "sctp-b-egress_rule_protocol": "icmp",
+ "sctp-b-ipv6-ingress_action": "pass",
+ "vlc_st_service_type": "firewall",
+ "sctp-b-ipv6-egress_dst_end_port": "65535",
+ "sctp-b-ipv6-ingress-dst_start_port": "0",
+ "vlc2_Internal2_mac": "00:11:22:EF:AC:DF",
+ "vlc_st_availability_zone": "true",
+ "fsb_volume_image_name_1": "MME_FSB2_16ACP04_GA.qcow2",
+ "sctp-b-ingress-src_subnet_prefix": "0.0.0.0",
+ "sctp-a-ipv6-ingress_src_subnet_prefix_len": "0",
+ "Internal1_allow_transit": "true",
+ "gpb_flavor_name": "nv.c20r64d1",
+ "availability_zone_max_count": "1",
+ "fsb_volume_image_name_0": "MME_FSB1_16ACP04_GA.qcow2",
+ "sctp-b-ipv6-ingress_dst_addresses": "local",
+ "sctp-b-ipv6-egress_dst_subnet_prefix": "0.0.0.0",
+ "sctp-b-ipv6-ingress_ethertype": "IPv4",
+ "vlc1_Internal2_mac": "00:11:22:EF:AC:DF",
+ "sctp-a-ingress-src_subnet_prefix": "0.0.0.0",
+ "sctp-a-ipv6-ingress_action": "pass",
+ "Internal1_rpf": "disable",
+ "sctp-b-ingress_ethertype": "IPv4",
+ "sctp-b-egress_rule_application": "any",
+ "sctp-b-ingress-src_end_port": "65535.0",
+ "sctp-a-ipv6-ingress_rule_protocol": "any",
+ "sctp-a-ingress-src_start_port": "0.0",
+ "sctp-b-egress-dst_end_port": "65535.0"
+ },
+ "type": "VF",
+ "modelCustomizationName": "VF_vMee 0",
+ "vfModules": {
+ "vf_vmee0..VfVmee..vmme_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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..vmme_vlc..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "vmme_vlc"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ },
+ "vf_vmee0..VfVmee..vmme_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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..vmme_gpb..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "vmme_gpb"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "vf_vmee0..VfVmee..base_vmme..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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "base_vmme"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "vf_vmee0..VfVmee..base_vmme..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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "base_vmme"
+ },
+ "inputs": {}
+ }
+ },
+ "vfcInstanceGroups": {}
+ }
+ },
+ "networks": {
+ "ExtVL 0": {
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ "invariantUuid": "379f816b-a7aa-422f-be30-17114ff50b7c",
+ "description": "ECOMP generic virtual link (network) base type for all other service-level and global networks",
+ "name": "ExtVL",
+ "version": "37.0",
+ "customizationUuid": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+ "inputs": {},
+ "commands": {},
+ "properties": {
+ "ecomp_generated_naming" : "false",
+ "network_assignments": "{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}",
+ "exVL_naming": "{ecomp_generated_naming=true}",
+ "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}",
+ "network_homing": "{ecomp_selected_instance_node_target=false}"
+ },
+ "type": "VL",
+ "modelCustomizationName": "ExtVL 0"
+ },
+ "ExtVL 1": {
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b987",
+ "invariantUuid": "379f816b-a7aa-422f-be30-17114ff50b7c",
+ "description": "ECOMP generic virtual link (network) base type for all other service-level and global networks",
+ "name": "ExtVL1",
+ "version": "37.0",
+ "customizationUuid": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+ "inputs": {},
+ "commands": {},
+ "properties": {
+ "ecomp_generated_naming" : "true",
+ "network_assignments": "{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}",
+ "exVL_naming": "{ecomp_generated_naming=true}",
+ "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}",
+ "network_homing": "{ecomp_selected_instance_node_target=false}"
+ },
+ "type": "VL",
+ "modelCustomizationName": "ExtVL 0"
+ }
+ },
+ "collectionResource": {},
+ "configurations": {
+ "Port Mirroring Configuration By Policy 0": {
+ "uuid": "b4398538-e89d-4f13-b33d-ca323434ba50",
+ "invariantUuid": "6ef0ca40-f366-4897-951f-abd65d25f6f7",
+ "description": "A port mirroring configuration by policy object",
+ "name": "Port Mirroring Configuration By Policy",
+ "version": "27.0",
+ "customizationUuid": "3c3b7b8d-8669-4b3b-8664-61970041fad2",
+ "inputs": {},
+ "commands": {},
+ "properties": {},
+ "type": "Configuration",
+ "modelCustomizationName": "Port Mirroring Configuration By Policy 0",
+ "sourceNodes": [],
+ "collectorNodes": null,
+ "configurationByPolicy": false
+ }
+ },
+ "serviceProxies": {},
+ "vfModules": {
+ "vf_vmee0..VfVmee..vmme_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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..vmme_vlc..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "vmme_vlc"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ },
+ "vf_vmee0..VfVmee..vmme_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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..vmme_gpb..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "vmme_gpb"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "vf_vmee0..VfVmee..base_vmme..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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "base_vmme"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "vf_vmee0..VfVmee..base_vmme..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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "base_vmme"
+ },
+ "inputs": {}
+ }
+ },
+ "pnfs": {}
+ }
+ },
+ "serviceInstance": {
+ "6e59c5de-f052-46fa-aa7e-2fca9d674c44": {
+ "networks" : {},
+ "vnfs": {
+ "VF_vMee 0": {
+ "rollbackOnFailure": "true",
+ "vfModules": {
+ "vf_vmee0..VfVmee..base_vmme..module-0": {
+ "vf_vmee0..VfVmee..base_vmme..module-0vmvzo": {
+ "isMissingData": false,
+ "sdncPreReload": null,
+ "modelInfo": {
+ "modelType": "VFmodule",
+ "modelInvariantId": "a6f9e51a-2b35-416a-ae15-15e58d61f36d",
+ "modelVersionId": "a27f5cfc-7f12-4f99-af08-0af9c3885c87",
+ "modelName": "VfVmee..base_vmme..module-0",
+ "modelVersion": "2",
+ "modelCustomizationId": "f8c040f1-7e51-4a11-aca8-acf256cfd861",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0"
+ },
+ "instanceParams": [
+ {}
+ ],
+ "trackById": "wmtm6sy2uj"
+ }
+ }
+ },
+ "isMissingData": true,
+ "originalName": "VF_vMee 0",
+ "vnfStoreKey": "VF_vMee 0",
+ "trackById": "p3wk448m5do",
+ "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60",
+ "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+ "lcpCloudRegionId": null,
+ "tenantId": null,
+ "lineOfBusiness": null,
+ "platformName": null,
+ "modelInfo": {
+ "modelType": "VF",
+ "modelInvariantId": "4160458e-f648-4b30-a176-43881ffffe9e",
+ "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ "modelName": "VF_vMee",
+ "modelVersion": "2.0",
+ "modelCustomizationName": "VF_vMee 0"
+ }
+ }
+ },
+ "instanceParams": [
+ {}
+ ],
+ "validationCounter": 1,
+ "existingNames": {},
+ "existingVNFCounterMap": {
+ "d6557200-ecf2-4641-8094-5393ae3aae60": 1
+ },
+ "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "subscriptionServiceType": "TYLER SILVIA",
+ "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+ "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+ "lcpCloudRegionId": "hvf6",
+ "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+ "aicZoneId": "JAG1",
+ "projectName": "x1",
+ "rollbackOnFailure": "true",
+ "bulkSize": 1,
+ "modelInfo": {
+ "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ "modelName": "ComplexService",
+ "modelVersion": "1.0",
+ "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44"
+ },
+ "isALaCarte": false,
+ "name": "ComplexService",
+ "version": "1.0",
+ "description": "ComplexService",
+ "category": "Emanuel",
+ "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "serviceType": "",
+ "serviceRole": "",
+ "isMultiStepDesign": false
+ }
+ },
+ "lcpRegionsAndTenants": {
+ "lcpRegionList": [
+ {
+ "id": "JANET25",
+ "name": "JANET25",
+ "isPermitted": true
+ },
+ {
+ "id": "hvf6",
+ "name": "hvf6",
+ "isPermitted": true
+ }
+ ],
+ "lcpRegionsTenantsMap": {
+ "JANET25": [
+ {
+ "id": "092eb9e8e4b7412e8787dd091bc58e86",
+ "name": "USP-SIP-IC-24335-T-01",
+ "isPermitted": true
+ }
+ ],
+ "hvf6": [
+ {
+ "id": "bae71557c5bb4d5aac6743a4e5f1d054",
+ "name": "AIN Web Tool-15-D-testalexandria",
+ "isPermitted": true
+ },
+ {
+ "id": "229bcdc6eaeb4ca59d55221141d01f8e",
+ "name": "AIN Web Tool-15-D-STTest2",
+ "isPermitted": true
+ },
+ {
+ "id": "1178612d2b394be4834ad77f567c0af2",
+ "name": "AIN Web Tool-15-D-SSPtestcustome",
+ "isPermitted": true
+ },
+ {
+ "id": "19c5ade915eb461e8af52fb2fd8cd1f2",
+ "name": "AIN Web Tool-15-D-UncheckedEcopm",
+ "isPermitted": true
+ },
+ {
+ "id": "de007636e25249238447264a988a927b",
+ "name": "AIN Web Tool-15-D-dfsdf",
+ "isPermitted": true
+ },
+ {
+ "id": "62f29b3613634ca6a3065cbe0e020c44",
+ "name": "AIN/SMS-16-D-Multiservices1",
+ "isPermitted": true
+ },
+ {
+ "id": "649289e30d3244e0b48098114d63c2aa",
+ "name": "AIN Web Tool-15-D-SSPST66",
+ "isPermitted": true
+ },
+ {
+ "id": "3f21eeea6c2c486bba31dab816c05a32",
+ "name": "AIN Web Tool-15-D-ASSPST47",
+ "isPermitted": true
+ },
+ {
+ "id": "f60ce21d3ee6427586cff0d22b03b773",
+ "name": "CESAR-100-D-sspjg67246",
+ "isPermitted": true
+ },
+ {
+ "id": "8774659e425f479895ae091bb5d46560",
+ "name": "CESAR-100-D-sspjg68359",
+ "isPermitted": true
+ },
+ {
+ "id": "624eb554b0d147c19ff8885341760481",
+ "name": "AINWebTool-15-D-iftach",
+ "isPermitted": true
+ },
+ {
+ "id": "214f55f5fc414c678059c383b03e4962",
+ "name": "CESAR-100-D-sspjg612401",
+ "isPermitted": true
+ },
+ {
+ "id": "c90666c291664841bb98e4d981ff1db5",
+ "name": "CESAR-100-D-sspjg621340",
+ "isPermitted": true
+ },
+ {
+ "id": "ce5b6bc5c7b348e1bf4b91ac9a174278",
+ "name": "sspjg621351cloned",
+ "isPermitted": true
+ },
+ {
+ "id": "b386b768a3f24c8e953abbe0b3488c02",
+ "name": "AINWebTool-15-D-eteancomp",
+ "isPermitted": true
+ },
+ {
+ "id": "dc6c4dbfd225474e9deaadd34968646c",
+ "name": "AINWebTool-15-T-SPFET",
+ "isPermitted": true
+ },
+ {
+ "id": "02cb5030e9914aa4be120bd9ed1e19eb",
+ "name": "AINWebTool-15-X-eeweww",
+ "isPermitted": true
+ },
+ {
+ "id": "f2f3830e4c984d45bcd00e1a04158a79",
+ "name": "CESAR-100-D-spjg61909",
+ "isPermitted": true
+ },
+ {
+ "id": "05b91bd5137f4929878edd965755c06d",
+ "name": "CESAR-100-D-sspjg621512cloned",
+ "isPermitted": true
+ },
+ {
+ "id": "7002fbe8482d4a989ddf445b1ce336e0",
+ "name": "AINWebTool-15-X-vdr",
+ "isPermitted": true
+ },
+ {
+ "id": "4008522be43741dcb1f5422022a2aa0b",
+ "name": "AINWebTool-15-D-ssasa",
+ "isPermitted": true
+ },
+ {
+ "id": "f44e2e96a1b6476abfda2fa407b00169",
+ "name": "AINWebTool-15-D-PFNPT",
+ "isPermitted": true
+ },
+ {
+ "id": "b69a52bec8a84669a37a1e8b72708be7",
+ "name": "AINWebTool-15-X-vdre",
+ "isPermitted": true
+ },
+ {
+ "id": "fac7d9fd56154caeb9332202dcf2969f",
+ "name": "AINWebTool-15-X-NONPODECOMP",
+ "isPermitted": true
+ },
+ {
+ "id": "2d34d8396e194eb49969fd61ffbff961",
+ "name": "DN5242-Nov16-T5",
+ "isPermitted": true
+ },
+ {
+ "id": "cb42a77ff45b48a8b8deb83bb64acc74",
+ "name": "ro-T11",
+ "isPermitted": true
+ },
+ {
+ "id": "fa45ca53c80b492fa8be5477cd84fc2b",
+ "name": "ro-T112",
+ "isPermitted": true
+ },
+ {
+ "id": "4914ab0ab3a743e58f0eefdacc1dde77",
+ "name": "DN5242-Nov21-T1",
+ "isPermitted": true
+ },
+ {
+ "id": "d0a3e3f2964542259d155a81c41aadc3",
+ "name": "test-hvf6-09",
+ "isPermitted": true
+ },
+ {
+ "id": "cbb99fe4ada84631b7baf046b6fd2044",
+ "name": "DN5242-Nov16-T3",
+ "isPermitted": true
+ }
+ ]
+ }
+ },
+ "productFamilies": [
+ {
+ "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+ "name": "SCOTTIE",
+ "isPermitted": true
+ },
+ {
+ "id": "17cc1042-527b-11e6-beb8-9e71128cae77",
+ "name": "IGNACIO",
+ "isPermitted": true
+ },
+ {
+ "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+ "name": "Christie",
+ "isPermitted": true
+ },
+ {
+ "id": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7",
+ "name": "Enhanced Services",
+ "isPermitted": true
+ },
+ {
+ "id": "vTerrance",
+ "name": "vTerrance",
+ "isPermitted": true
+ },
+ {
+ "id": "323d69d9-2efe-4r45-ay0a-89ea7ard4e6f",
+ "name": "vSCP",
+ "isPermitted": true
+ },
+ {
+ "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+ "name": "Emanuel",
+ "isPermitted": true
+ },
+ {
+ "id": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+ "name": "BVOIP",
+ "isPermitted": true
+ },
+ {
+ "id": "db171b8f-115c-4992-a2e3-ee04cae357e0",
+ "name": "LINDSEY",
+ "isPermitted": true
+ },
+ {
+ "id": "LRSI-OSPF",
+ "name": "LRSI-OSPF",
+ "isPermitted": true
+ },
+ {
+ "id": "vRosemarie",
+ "name": "HNGATEWAY",
+ "isPermitted": true
+ },
+ {
+ "id": "vHNPaas",
+ "name": "WILKINS",
+ "isPermitted": true
+ },
+ {
+ "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "name": "TYLER SILVIA",
+ "isPermitted": true
+ },
+ {
+ "id": "b6a3f28c-eebf-494c-a900-055cc7c874ce",
+ "name": "VROUTER",
+ "isPermitted": true
+ },
+ {
+ "id": "Cisneros",
+ "name": "vMuriel",
+ "isPermitted": true
+ },
+ {
+ "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1",
+ "name": "CARA Griffin",
+ "isPermitted": true
+ },
+ {
+ "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d",
+ "name": "DARREN MCGEE",
+ "isPermitted": true
+ },
+ {
+ "id": "e30755dc-5673-4b6b-9dcf-9abdd96b93d1",
+ "name": "Transport",
+ "isPermitted": true
+ },
+ {
+ "id": "vSalvatore",
+ "name": "vSalvatore",
+ "isPermitted": true
+ },
+ {
+ "id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4",
+ "name": "Josefina",
+ "isPermitted": true
+ },
+ {
+ "id": "vHubbard",
+ "name": "vHubbard",
+ "isPermitted": true
+ },
+ {
+ "id": "12a96a9d-4b4c-4349-a950-fe1159602621",
+ "name": "DARREN MCGEE",
+ "isPermitted": true
+ }
+ ],
+ "serviceTypes": {
+ "e433710f-9217-458d-a79d-1c7aff376d89": [
+ {
+ "id": "0",
+ "name": "vRichardson",
+ "isPermitted": false
+ },
+ {
+ "id": "1",
+ "name": "TYLER SILVIA",
+ "isPermitted": true
+ },
+ {
+ "id": "2",
+ "name": "Emanuel",
+ "isPermitted": false
+ },
+ {
+ "id": "3",
+ "name": "vJamie",
+ "isPermitted": false
+ },
+ {
+ "id": "4",
+ "name": "vVoiceMail",
+ "isPermitted": false
+ },
+ {
+ "id": "5",
+ "name": "Kennedy",
+ "isPermitted": false
+ },
+ {
+ "id": "6",
+ "name": "vSEGW",
+ "isPermitted": false
+ },
+ {
+ "id": "7",
+ "name": "vVM",
+ "isPermitted": false
+ },
+ {
+ "id": "8",
+ "name": "vOTA",
+ "isPermitted": false
+ },
+ {
+ "id": "9",
+ "name": "vMME",
+ "isPermitted": false
+ },
+ {
+ "id": "10",
+ "name": "vMNS",
+ "isPermitted": false
+ },
+ {
+ "id": "11",
+ "name": "vSCP",
+ "isPermitted": false
+ },
+ {
+ "id": "12",
+ "name": "VPMS",
+ "isPermitted": false
+ },
+ {
+ "id": "13",
+ "name": "vMMSC",
+ "isPermitted": false
+ },
+ {
+ "id": "14",
+ "name": "SSD",
+ "isPermitted": false
+ },
+ {
+ "id": "15",
+ "name": "vMOG",
+ "isPermitted": false
+ },
+ {
+ "id": "16",
+ "name": "LINDSEY",
+ "isPermitted": false
+ },
+ {
+ "id": "17",
+ "name": "JOHANNA_SANTOS",
+ "isPermitted": false
+ },
+ {
+ "id": "18",
+ "name": "vCarroll",
+ "isPermitted": false
+ }
+ ]
+ },
+ "aicZones": [
+ {
+ "id": "NFT1",
+ "name": "NFTJSSSS-NFT1"
+ },
+ {
+ "id": "JAG1",
+ "name": "YUDFJULP-JAG1"
+ },
+ {
+ "id": "YYY1",
+ "name": "UUUAIAAI-YYY1"
+ },
+ {
+ "id": "BAN1",
+ "name": "VSDKYUTP-BAN1"
+ },
+ {
+ "id": "DKJ1",
+ "name": "DKJSJDKA-DKJ1"
+ },
+ {
+ "id": "MCS1",
+ "name": "ASACMAMS-MCS1"
+ },
+ {
+ "id": "UIO1",
+ "name": "uioclli1-UIO1"
+ },
+ {
+ "id": "RAJ1",
+ "name": "YGBIJNLQ-RAJ1"
+ },
+ {
+ "id": "OPA1",
+ "name": "opaclli1-OPA1"
+ },
+ {
+ "id": "SDE1",
+ "name": "ZXCVBNMA-SDE1"
+ },
+ {
+ "id": "VEN2",
+ "name": "FGHJUHIL-VEN2"
+ },
+ {
+ "id": "ORL1",
+ "name": "ORLDFLMA-ORL1"
+ },
+ {
+ "id": "JAD1",
+ "name": "JADECLLI-JAD1"
+ },
+ {
+ "id": "ZXL1",
+ "name": "LWLWCANN-ZXL1"
+ },
+ {
+ "id": "CKL1",
+ "name": "CLKSKCKK-CKL1"
+ },
+ {
+ "id": "SDF1",
+ "name": "sdfclli1-SDF1"
+ },
+ {
+ "id": "RAD1",
+ "name": "RADICAL1-RAD1"
+ },
+ {
+ "id": "KIT1",
+ "name": "BHYJFGLN-KIT1"
+ },
+ {
+ "id": "REL1",
+ "name": "INGERFGT-REL1"
+ },
+ {
+ "id": "JNL1",
+ "name": "CJALSDAC-JNL1"
+ },
+ {
+ "id": "OLK1",
+ "name": "OLKOLKLS-OLK1"
+ },
+ {
+ "id": "CHI1",
+ "name": "CHILLIWE-CHI1"
+ },
+ {
+ "id": "UUU4",
+ "name": "UUUAAAUU-UUU4"
+ },
+ {
+ "id": "TUF1",
+ "name": "TUFCLLI1-TUF1"
+ },
+ {
+ "id": "KJN1",
+ "name": "CKALDKSA-KJN1"
+ },
+ {
+ "id": "SAM1",
+ "name": "SNDGCA64-SAN1"
+ },
+ {
+ "id": "SCK1",
+ "name": "SCKSCKSK-SCK1"
+ },
+ {
+ "id": "HJH1",
+ "name": "AOEEQQQD-HJH1"
+ },
+ {
+ "id": "HGD1",
+ "name": "SDFQWHGD-HGD1"
+ },
+ {
+ "id": "KOR1",
+ "name": "HYFLNBVT-KOR1"
+ },
+ {
+ "id": "ATL43",
+ "name": "AICLOCID-ATL43"
+ },
+ {
+ "id": "ATL54",
+ "name": "AICFTAAI-ATL54"
+ },
+ {
+ "id": "ATL66",
+ "name": "CLLIAAII-ATL66"
+ },
+ {
+ "id": "VEL1",
+ "name": "BNMLKUIK-VEL1"
+ },
+ {
+ "id": "ICC1",
+ "name": "SANJITAT-ICC1"
+ },
+ {
+ "id": "MNT11",
+ "name": "WSXEFBTH-MNT11"
+ },
+ {
+ "id": "DEF2",
+ "name": "WSBHGTYL-DEF2"
+ },
+ {
+ "id": "MAD11",
+ "name": "SDFQWGKL-MAD11"
+ },
+ {
+ "id": "OLG1",
+ "name": "OLHOLHOL-OLG1"
+ },
+ {
+ "id": "GAR1",
+ "name": "NGFVSJKO-GAR1"
+ },
+ {
+ "id": "SAN22",
+ "name": "GNVLSCTL-SAN22"
+ },
+ {
+ "id": "HRG1",
+ "name": "HRGHRGGS-HRG1"
+ },
+ {
+ "id": "JCS1",
+ "name": "JCSJSCJS-JCS1"
+ },
+ {
+ "id": "DHA12",
+ "name": "WSXEDECF-DHA12"
+ },
+ {
+ "id": "HJE1",
+ "name": "AOEEWWWD-HJE1"
+ },
+ {
+ "id": "NCA1",
+ "name": "NCANCANN-NCA1"
+ },
+ {
+ "id": "IOP1",
+ "name": "iopclli1-IOP1"
+ },
+ {
+ "id": "RTY1",
+ "name": "rtyclli1-RTY1"
+ },
+ {
+ "id": "KAP1",
+ "name": "HIOUYTRQ-KAP1"
+ },
+ {
+ "id": "ZEN1",
+ "name": "ZENCLLI1-ZEN1"
+ },
+ {
+ "id": "HKA1",
+ "name": "JAKHLASS-HKA1"
+ },
+ {
+ "id": "CQK1",
+ "name": "CQKSCAKK-CQK1"
+ },
+ {
+ "id": "SAI1",
+ "name": "UBEKQLPD-SAI1"
+ },
+ {
+ "id": "ERT1",
+ "name": "ertclli1-ERT1"
+ },
+ {
+ "id": "IBB1",
+ "name": "PLMKOIJU-IBB1"
+ },
+ {
+ "id": "TIR2",
+ "name": "PLKINHYI-TIR2"
+ },
+ {
+ "id": "HSD1",
+ "name": "CHASKCDS-HSD1"
+ },
+ {
+ "id": "SLF78",
+ "name": "SDCTLFN1-SLF78"
+ },
+ {
+ "id": "SEE78",
+ "name": "SDCTEEE4-SEE78"
+ },
+ {
+ "id": "SAN13",
+ "name": "TOKYJPFA-SAN13"
+ },
+ {
+ "id": "SAA78",
+ "name": "SDCTAAA1-SAA78"
+ },
+ {
+ "id": "LUC1",
+ "name": "ATLDFGYC-LUC1"
+ },
+ {
+ "id": "AMD13",
+ "name": "MEMATLAN-AMD13"
+ },
+ {
+ "id": "TOR1",
+ "name": "TOROONXN-TOR1"
+ },
+ {
+ "id": "QWE1",
+ "name": "QWECLLI1-QWE1"
+ },
+ {
+ "id": "ZOG1",
+ "name": "ZOGASTRO-ZOG1"
+ },
+ {
+ "id": "CAL33",
+ "name": "CALIFORN-CAL33"
+ },
+ {
+ "id": "SHH78",
+ "name": "SDIT1HHH-SHH78"
+ },
+ {
+ "id": "DSA1",
+ "name": "LKJHGFDS-DSA1"
+ },
+ {
+ "id": "CLG1",
+ "name": "CLGRABAD-CLG1"
+ },
+ {
+ "id": "BNA1",
+ "name": "BNARAGBK-BNA1"
+ },
+ {
+ "id": "ATL84",
+ "name": "CANTTCOC-ATL84"
+ },
+ {
+ "id": "APP1",
+ "name": "WBHGTYUI-APP1"
+ },
+ {
+ "id": "RJN1",
+ "name": "RJNRBZAW-RJN1"
+ },
+ {
+ "id": "EHH78",
+ "name": "SDCSHHH5-EHH78"
+ },
+ {
+ "id": "mac10",
+ "name": "PKGTESTF-mac10"
+ },
+ {
+ "id": "SXB78",
+ "name": "SDCTGXB1-SXB78"
+ },
+ {
+ "id": "SAX78",
+ "name": "SDCTAXG1-SAX78"
+ },
+ {
+ "id": "SYD1",
+ "name": "SYDNAUBV-SYD1"
+ },
+ {
+ "id": "TOK1",
+ "name": "TOKYJPFA-TOK1"
+ },
+ {
+ "id": "KGM2",
+ "name": "KGMTNC20-KGM2"
+ },
+ {
+ "id": "DCC1b",
+ "name": "POIUYTGH-DCC1b"
+ },
+ {
+ "id": "SKK78",
+ "name": "SDCTKKK1-SKK78"
+ },
+ {
+ "id": "SGG78",
+ "name": "SDCTGGG1-SGG78"
+ },
+ {
+ "id": "SJJ78",
+ "name": "SDCTJJJ1-SJJ78"
+ },
+ {
+ "id": "SBX78",
+ "name": "SDCTBXG1-SBX78"
+ },
+ {
+ "id": "LAG1",
+ "name": "LARGIZON-LAG1"
+ },
+ {
+ "id": "IAA1",
+ "name": "QAZXSWED-IAA1"
+ },
+ {
+ "id": "POI1",
+ "name": "PLMNJKIU-POI1"
+ },
+ {
+ "id": "LAG1a",
+ "name": "LARGIZON-LAG1a"
+ },
+ {
+ "id": "PBL1",
+ "name": "PBLAPBAI-PBL1"
+ },
+ {
+ "id": "LAG45",
+ "name": "LARGIZON-LAG1a"
+ },
+ {
+ "id": "MAR1",
+ "name": "MNBVCXZM-MAR1"
+ },
+ {
+ "id": "HST70",
+ "name": "HSTNTX70-HST70"
+ },
+ {
+ "id": "DCC1a",
+ "name": "POIUYTGH-DCC1a"
+ },
+ {
+ "id": "TOL1",
+ "name": "TOLDOH21-TOL1"
+ },
+ {
+ "id": "LON1",
+ "name": "LONEENCO-LON1"
+ },
+ {
+ "id": "SJU78",
+ "name": "SDIT1JUB-SJU78"
+ },
+ {
+ "id": "STN27",
+ "name": "HSTNTX01-STN27"
+ },
+ {
+ "id": "SSW56",
+ "name": "ss8126GT-SSW56"
+ },
+ {
+ "id": "SBB78",
+ "name": "SDIT1BBB-SBB78"
+ },
+ {
+ "id": "DCC3",
+ "name": "POIUYTGH-DCC3"
+ },
+ {
+ "id": "GNV1",
+ "name": "GNVLSCTL-GNV1"
+ },
+ {
+ "id": "WAS1",
+ "name": "WASHDCSW-WAS1"
+ },
+ {
+ "id": "TOY1",
+ "name": "TORYONNZ-TOY1"
+ },
+ {
+ "id": "STT1",
+ "name": "STTLWA02-STT1"
+ },
+ {
+ "id": "STG1",
+ "name": "STTGGE62-STG1"
+ },
+ {
+ "id": "SLL78",
+ "name": "SDCTLLL1-SLL78"
+ },
+ {
+ "id": "SBU78",
+ "name": "SDIT1BUB-SBU78"
+ },
+ {
+ "id": "ATL2",
+ "name": "ATLNGANW-ATL2"
+ },
+ {
+ "id": "BOT1",
+ "name": "BOTHWAKY-BOT1"
+ },
+ {
+ "id": "SNG1",
+ "name": "SNGPSIAU-SNG1"
+ },
+ {
+ "id": "NYC1",
+ "name": "NYCMNY54-NYC1"
+ },
+ {
+ "id": "LAG1b",
+ "name": "LARGIZON-LAG1b"
+ },
+ {
+ "id": "AMD15",
+ "name": "AMDFAA01-AMD15"
+ },
+ {
+ "id": "SNA1",
+ "name": "SNANTXCA-SNA1"
+ },
+ {
+ "id": "PLT1",
+ "name": "PLTNCA60-PLT1"
+ },
+ {
+ "id": "TLP1",
+ "name": "TLPNXM18-TLP1"
+ },
+ {
+ "id": "SDD81",
+ "name": "SAIT1DD6-SDD81"
+ },
+ {
+ "id": "DCC1",
+ "name": "POIUYTGH-DCC1"
+ },
+ {
+ "id": "DCC2",
+ "name": "POIUYTGH-DCC2"
+ },
+ {
+ "id": "OKC1",
+ "name": "OKCBOK55-OKC1"
+ },
+ {
+ "id": "PAR1",
+ "name": "PARSFRCG-PAR1"
+ },
+ {
+ "id": "TES36",
+ "name": "ABCEETES-TES36"
+ },
+ {
+ "id": "COM1",
+ "name": "PLMKOPIU-COM1"
+ },
+ {
+ "id": "ANI1",
+ "name": "ATLNGTRE-ANI1"
+ },
+ {
+ "id": "SDG78",
+ "name": "SDIT1BDG-SDG78"
+ },
+ {
+ "id": "mac20",
+ "name": "PKGTESTF-mac20"
+ },
+ {
+ "id": "DSF45",
+ "name": "DSFBG123-DSF45"
+ },
+ {
+ "id": "HST25",
+ "name": "HSTNTX01-HST25"
+ },
+ {
+ "id": "AMD18",
+ "name": "AUDIMA01-AMD18"
+ },
+ {
+ "id": "SAA80",
+ "name": "SAIT9AA3-SAA80"
+ },
+ {
+ "id": "SSA56",
+ "name": "SSIT2AA7-SSA56"
+ },
+ {
+ "id": "SDD82",
+ "name": "SAIT1DD9-SDD82"
+ },
+ {
+ "id": "JCV1",
+ "name": "JCVLFLBW-JCV1"
+ },
+ {
+ "id": "SUL2",
+ "name": "WERTYUJK-SUL2"
+ },
+ {
+ "id": "PUR1",
+ "name": "purelyde-PUR1"
+ },
+ {
+ "id": "FDE55",
+ "name": "FDERT555-FDE55"
+ },
+ {
+ "id": "SITE",
+ "name": "LONEENCO-SITE"
+ },
+ {
+ "id": "ATL1",
+ "name": "ATLNGAMA-ATL1"
+ },
+ {
+ "id": "JUL1",
+ "name": "ZXCVBNMM-JUL1"
+ },
+ {
+ "id": "TAT34",
+ "name": "TESAAISB-TAT34"
+ },
+ {
+ "id": "XCP12",
+ "name": "CHKGH123-XCP12"
+ },
+ {
+ "id": "RAI1",
+ "name": "poiuytre-RAI1"
+ },
+ {
+ "id": "HPO1",
+ "name": "ATLNGAUP-HPO1"
+ },
+ {
+ "id": "KJF12",
+ "name": "KJFDH123-KJF12"
+ },
+ {
+ "id": "SCC80",
+ "name": "SAIT9CC3-SCC80"
+ },
+ {
+ "id": "SAA12",
+ "name": "SAIT9AF8-SAA12"
+ },
+ {
+ "id": "SAA14",
+ "name": "SAIT1AA9-SAA14"
+ },
+ {
+ "id": "ATL35",
+ "name": "TTESSAAI-ATL35"
+ },
+ {
+ "id": "CWY1",
+ "name": "CWYMOWBS-CWY1"
+ },
+ {
+ "id": "ATL76",
+ "name": "TELEPAAI-ATL76"
+ },
+ {
+ "id": "DSL12",
+ "name": "DSLFK242-DSL12"
+ },
+ {
+ "id": "ATL53",
+ "name": "AAIATLTE-ATL53"
+ },
+ {
+ "id": "SAA11",
+ "name": "SAIT9AA2-SAA11"
+ },
+ {
+ "id": "ATL62",
+ "name": "TESSASCH-ATL62"
+ },
+ {
+ "id": "AUG1",
+ "name": "ASDFGHJK-AUG1"
+ },
+ {
+ "id": "POI22",
+ "name": "POIUY123-POI22"
+ },
+ {
+ "id": "SAA13",
+ "name": "SAIT1AA9-SAA13"
+ },
+ {
+ "id": "BHY17",
+ "name": "BHYTFRF3-BHY17"
+ },
+ {
+ "id": "LIS1",
+ "name": "HOSTPROF-LIS1"
+ },
+ {
+ "id": "SIP1",
+ "name": "ZXCVBNMK-SIP1"
+ },
+ {
+ "id": "ATL99",
+ "name": "TEESTAAI-ATL43"
+ },
+ {
+ "id": "ATL64",
+ "name": "FORLOAAJ-ATL64"
+ },
+ {
+ "id": "TAT33",
+ "name": "TESAAISA-TAT33"
+ },
+ {
+ "id": "RAD10",
+ "name": "INDIPUNE-RAD10"
+ },
+ {
+ "id": "RTW5",
+ "name": "BHYTFRY4-RTW5"
+ },
+ {
+ "id": "JGS1",
+ "name": "KSJKKKKK-JGS1"
+ },
+ {
+ "id": "ATL98",
+ "name": "TEESTAAI-ATL43"
+ },
+ {
+ "id": "WAN1",
+ "name": "LEIWANGW-WAN1"
+ },
+ {
+ "id": "ATL44",
+ "name": "ATLSANAB-ATL44"
+ },
+ {
+ "id": "RTD2",
+ "name": "BHYTFRk4-RTD2"
+ },
+ {
+ "id": "NIR1",
+ "name": "ORFLMANA-NIR1"
+ },
+ {
+ "id": "ATL75",
+ "name": "SANAAIRE-ATL75"
+ },
+ {
+ "id": "NUM1",
+ "name": "QWERTYUI-NUM1"
+ },
+ {
+ "id": "MTN32",
+ "name": "MDTWNJ21-MTN32"
+ },
+ {
+ "id": "RTZ4",
+ "name": "BHYTFRZ6-RTZ4"
+ },
+ {
+ "id": "ATL56",
+ "name": "ATLSANAC-ATL56"
+ },
+ {
+ "id": "AMS1",
+ "name": "AMSTNLBW-AMS1"
+ },
+ {
+ "id": "RCT1",
+ "name": "AMSTERNL-RCT1"
+ },
+ {
+ "id": "JAN1",
+ "name": "ORFLMATT-JAN1"
+ },
+ {
+ "id": "ABC14",
+ "name": "TESAAISA-ABC14"
+ },
+ {
+ "id": "TAT37",
+ "name": "TESAAISD-TAT37"
+ },
+ {
+ "id": "MIC54",
+ "name": "MICHIGAN-MIC54"
+ },
+ {
+ "id": "ABC11",
+ "name": "ATLSANAI-ABC11"
+ },
+ {
+ "id": "AMF11",
+ "name": "AMDOCS01-AMF11"
+ },
+ {
+ "id": "ATL63",
+ "name": "ATLSANEW-ATL63"
+ },
+ {
+ "id": "ABC12",
+ "name": "ATLSECIA-ABC12"
+ },
+ {
+ "id": "MTN20",
+ "name": "MDTWNJ21-MTN20"
+ },
+ {
+ "id": "ABC15",
+ "name": "AAITESAN-ABC15"
+ },
+ {
+ "id": "AVT1",
+ "name": "AVTRFLHD-AVT1"
+ },
+ {
+ "id": "ATL34",
+ "name": "ATLSANAI-ATL34"
+ }
+ ],
+ "categoryParameters": {
+ "owningEntityList": [
+ {
+ "id": "aaa1",
+ "name": "aaa1"
+ },
+ {
+ "id": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+ "name": "WayneHolland"
+ },
+ {
+ "id": "Melissa",
+ "name": "Melissa"
+ }
+ ],
+ "projectList": [
+ {
+ "id": "WATKINS",
+ "name": "WATKINS"
+ },
+ {
+ "id": "x1",
+ "name": "x1"
+ },
+ {
+ "id": "yyy1",
+ "name": "yyy1"
+ }
+ ],
+ "lineOfBusinessList": [
+ {
+ "id": "ONAP",
+ "name": "ONAP"
+ },
+ {
+ "id": "zzz1",
+ "name": "zzz1"
+ }
+ ],
+ "platformList": [
+ {
+ "id": "platform",
+ "name": "platform"
+ },
+ {
+ "id": "xxx1",
+ "name": "xxx1"
+ }
+ ]
+ },
+ "type": "[LCP_REGIONS_AND_TENANTS] Update",
+ "subscribers": [
+ {
+ "id": "CAR_2020_ER",
+ "name": "CAR_2020_ER",
+ "isPermitted": true
+ },
+ {
+ "id": "21014aa2-526b-11e6-beb8-9e71128cae77",
+ "name": "JULIO ERICKSON",
+ "isPermitted": false
+ },
+ {
+ "id": "DHV1707-TestSubscriber-2",
+ "name": "DALE BRIDGES",
+ "isPermitted": false
+ },
+ {
+ "id": "DHV1707-TestSubscriber-1",
+ "name": "LLOYD BRIDGES",
+ "isPermitted": false
+ },
+ {
+ "id": "jimmy-example",
+ "name": "JimmyExampleCust-20161102",
+ "isPermitted": false
+ },
+ {
+ "id": "jimmy-example2",
+ "name": "JimmyExampleCust-20161103",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-TestSub-PWT-102",
+ "name": "ERICA5779-TestSub-PWT-102",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-TestSub-PWT-101",
+ "name": "ERICA5779-TestSub-PWT-101",
+ "isPermitted": false
+ },
+ {
+ "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+ "name": "Emanuel",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-Subscriber-4",
+ "name": "ERICA5779-Subscriber-5",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-TestSub-PWT-103",
+ "name": "ERICA5779-TestSub-PWT-103",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-Subscriber-2",
+ "name": "ERICA5779-Subscriber-2",
+ "isPermitted": false
+ },
+ {
+ "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "name": "SILVIA ROBBINS",
+ "isPermitted": true
+ },
+ {
+ "id": "ERICA5779-Subscriber-3",
+ "name": "ERICA5779-Subscriber-3",
+ "isPermitted": false
+ },
+ {
+ "id": "31739f3e-526b-11e6-beb8-9e71128cae77",
+ "name": "CRAIG/ROBERTS",
+ "isPermitted": false
+ }
+ ]
+ }
+}
+}
+}
+
+class MockFeatureFlagsService {}
+
+describe('Network Control Generator', () => {
+ let injector;
+ let service: NetworkControlGenerator;
+ let httpMock: HttpTestingController;
+
+ beforeEach(() => {
+ TestBed.configureTestingModule({
+ imports: [HttpClientTestingModule],
+ providers: [NetworkControlGenerator,
+ GenericFormService,
+ BasicControlGenerator,
+ AaiService,
+ FormBuilder,
+ LogService,
+ {provide:FeatureFlagsService, useClass: MockFeatureFlagsService},
+ {provide: NgRedux, useClass: MockAppStore}]
+ });
+
+ injector = getTestBed();
+ service = injector.get(NetworkControlGenerator);
+ httpMock = injector.get(HttpTestingController);
+ });
+
+ test('getMacroFormControls check for mandatory controls', () => {
+ const serviceId : string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44";
+ const networkName : string = "ExtVL 0";
+ const networkStoreKey : string = "ExtVL 0";
+ const controls :FormControlModel[] = service.getMacroFormControls(serviceId, networkStoreKey, networkName, false);
+
+ const mandatoryControls : string[] = [
+ FormControlNames.LCPCLOUD_REGION_ID,
+ 'tenantId',
+ 'platformName'
+ ];
+ for(let i = 0 ; i < mandatoryControls.length ; i++){
+ let requiredExist = controls.find(ctrl => ctrl.controlName === mandatoryControls[i]).validations.find(item => item.validatorName === 'required');
+ expect(requiredExist).toBeDefined();
+ }
+ });
+
+
+ test('getMacroFormControls should return instance name if isEcompName is true', () => {
+ const serviceId : string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44";
+ const networkName : string = "ExtVL 1";
+ const networkStoreKey : string = "ExtVL 1";
+ const controls :FormControlModel[] = service.getMacroFormControls(serviceId, networkStoreKey, networkName, false);
+
+ const controlsOrderNames = [
+ FormControlNames.INSTANCE_NAME,
+ FormControlNames.PRODUCT_FAMILY_ID,
+ FormControlNames.LCPCLOUD_REGION_ID ,
+ 'legacyRegion',
+ 'tenantId',
+ 'platformName',
+ 'lineOfBusiness'];
+
+
+
+ expect(controls.length).toEqual(7);
+ for(let i = 0 ; i < controls.length ; i++){
+ expect(controls[i].controlName).toEqual(controlsOrderNames[i]);
+ }
+ });
+
+ test('getMacroFormControls should return the correct order of controls', () => {
+ const serviceId : string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44";
+ const networkName : string = "ExtVL 0";
+ const networkStoreKey : string = "ExtVL 0";
+ const controls :FormControlModel[] = service.getMacroFormControls(serviceId, networkStoreKey, networkName, false);
+
+ const controlsOrderNames = [
+ FormControlNames.INSTANCE_NAME,
+ FormControlNames.PRODUCT_FAMILY_ID,
+ FormControlNames.LCPCLOUD_REGION_ID ,
+ 'legacyRegion',
+ 'tenantId',
+ 'platformName',
+ 'lineOfBusiness'];
+
+
+
+ expect(controls.length).toEqual(7);
+ for(let i = 0 ; i < controls.length ; i++){
+ expect(controls[i].controlName).toEqual(controlsOrderNames[i]);
+ }
+ });
+
+ test('getMacroFormControls should not return the rollback status', () => {
+ const serviceId : string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44";
+ const networkName : string = "ExtVL 0";
+ const networkStoreKey : string = "ExtVL 0";
+ const controls :FormControlModel[] = service.getMacroFormControls(serviceId, networkStoreKey, networkName, false);
+
+ const controlsOrderNames = [
+ FormControlNames.INSTANCE_NAME,
+ FormControlNames.PRODUCT_FAMILY_ID,
+ FormControlNames.LCPCLOUD_REGION_ID ,
+ 'legacyRegion',
+ 'tenantId',
+ 'platformName',
+ 'lineOfBusiness',
+ FormControlNames.ROLLBACK_ON_FAILURE
+ ];
+
+
+
+ expect(controls.length).toEqual(7);
+ for(let i = 0 ; i < controls.length ; i++){
+ expect(controls[i].controlName).toEqual(controlsOrderNames[i]);
+ }
+ });
+
+ test('getAlacartFormControls should return the correct order of controls', () => {
+ const controls:FormControlModel[] = getAlaCarteFormControls();
+
+ const controlsOrderNames = [
+ FormControlNames.INSTANCE_NAME,
+ FormControlNames.PRODUCT_FAMILY_ID,
+ FormControlNames.LCPCLOUD_REGION_ID,
+ 'legacyRegion',
+ 'tenantId',
+ 'platformName',
+ 'lineOfBusiness',
+ 'rollbackOnFailure'];
+ expect(controls.length).toEqual(8);
+ for(let i = 0 ; i < controls.length ; i++) {
+ expect(controls[i].controlName).toEqual(controlsOrderNames[i]);
+ }
+ });
+
+ function getAlaCarteFormControls(): FormControlModel[] {
+ const serviceId: string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44";
+ const networkName: string = "ExtVL 0";
+ const networkStoreKey: string = "ExtVL 0";
+ const controls: FormControlModel[] = service.getAlaCarteFormControls(serviceId, networkStoreKey, networkName, false);
+ return controls;
+ }
+
+ test('getAlacartFormControls instance name control validator shall have the expected regex', () => {
+ const controls:FormControlModel[] = getAlaCarteFormControls();
+
+ const instanceNameControl: FormControlModel = <FormControlModel>controls.find(item => item.controlName === FormControlNames.INSTANCE_NAME);
+ const instanceNameValidator: ValidatorModel = instanceNameControl.validations.find(val => val.validatorName === ValidatorOptions.pattern);
+ expect(instanceNameValidator.validatorArg).toEqual(/^[a-zA-Z0-9._-]*$/);
+ });
+
+ test('getAlacartFormControls check for mandatory controls', () => {
+ const controls:FormControlModel[] = getAlaCarteFormControls();
+
+ const mandatoryControls : string[] = [
+ FormControlNames.INSTANCE_NAME,
+ FormControlNames.LCPCLOUD_REGION_ID,
+ 'tenantId',
+ 'platformName',
+ 'rollbackOnFailure'
+ ];
+ for(let i = 0 ; i < mandatoryControls.length ; i++){
+ let requiredExist = controls.find(ctrl => ctrl.controlName === mandatoryControls[i]).validations.find(item => item.validatorName === 'required');
+ expect(requiredExist).toBeDefined();
+ }
+ });
+});
+
diff --git a/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/networkGenerator/network.control.generator.ts b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/networkGenerator/network.control.generator.ts
new file mode 100644
index 000000000..c3a622338
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/networkGenerator/network.control.generator.ts
@@ -0,0 +1,247 @@
+import {Injectable} from "@angular/core";
+import {GenericFormService} from "../../generic-form.service";
+import {AaiService} from "../../../../services/aaiService/aai.service";
+import {NgRedux} from "@angular-redux/store";
+import {HttpClient} from "@angular/common/http";
+import {BasicControlGenerator} from "../basic.control.generator";
+import * as _ from 'lodash';
+import {Observable, of} from "rxjs";
+
+import {
+ FormControlModel,
+ ValidatorModel,
+ ValidatorOptions
+} from "../../../../models/formControlModels/formControl.model";
+import {LogService} from "../../../../utils/log/log.service";
+import {AppState} from "../../../../store/reducers";
+import {FormGroup} from "@angular/forms";
+import {DropdownFormControl} from "../../../../models/formControlModels/dropdownFormControl.model";
+import {FormControlType} from "../../../../models/formControlModels/formControlTypes.enum";
+import {InputFormControl} from "../../../../models/formControlModels/inputFormControl.model";
+import {SelectOption} from "../../../../models/selectOption";
+import {NetworkInstance} from "../../../../models/networkInstance";
+import {NetworkModel} from "../../../../models/networkModel";
+import {Constants} from "../../../../utils/constants";
+
+export enum FormControlNames {
+ INSTANCE_NAME = 'instanceName',
+ GLOBAL_SUBSCRIBER_ID = 'globalSubscriberId',
+ PRODUCT_FAMILY_ID = 'productFamilyId',
+ LCPCLOUD_REGION_ID = 'lcpCloudRegionId',
+ TENANT_ID = 'tenantId',
+ AICZONE_ID = 'aicZoneId',
+ ROLLBACK_ON_FAILURE = 'rollbackOnFailure',
+ LEGACY_REGION = 'legacyRegion'
+}
+
+
+enum InputType {
+ LCP_REGION = "lcpCloudRegionId",
+ TENANT = "tenantId",
+ LOB = "lineOfBusiness",
+ PLATFORM = "platformName",
+ ROLLBACK = "rollbackOnFailure",
+ PRODUCT_FAMILY = "productFamilyId",
+ VG = "volumeGroupName"
+}
+
+@Injectable()
+export class NetworkControlGenerator {
+ aaiService: AaiService;
+
+ constructor(private genericFormService: GenericFormService,
+ private _basicControlGenerator: BasicControlGenerator,
+ private store: NgRedux<AppState>,
+ private http: HttpClient,
+ private _aaiService: AaiService,
+ private _logService: LogService) {
+ this.aaiService = _aaiService;
+ }
+
+ getNetworkInstance = (serviceId: string, networkName: string, isUpdateMode : boolean): NetworkInstance => {
+ let networkInstance : NetworkInstance = null;
+ if (isUpdateMode && this.store.getState().service.serviceInstance[serviceId] && _.has(this.store.getState().service.serviceInstance[serviceId].networks, networkName)) {
+ networkInstance = Object.assign({}, this.store.getState().service.serviceInstance[serviceId].networks[networkName]);
+ }
+ return networkInstance;
+ };
+
+
+ getMacroFormControls(serviceId: string, networkStoreKey: string, networkName: string, isUpdateMode : boolean): FormControlModel[] {
+ networkStoreKey = _.isNil(networkStoreKey) ? networkName : networkStoreKey;
+
+ if (_.isNil(serviceId) || _.isNil(networkStoreKey) || _.isNil(networkName)) {
+ this._logService.error('should provide serviceId, networkName, networkStoreKey', serviceId);
+ return [];
+ }
+
+ const networkInstance = this.getNetworkInstance(serviceId, networkStoreKey, isUpdateMode);
+ const networkModel = new NetworkModel(this.store.getState().service.serviceHierarchy[serviceId].networks[networkName]);
+ let result: FormControlModel[] = [];
+
+ if (!_.isNil(networkModel)) {
+ result.push(this.getInstanceName(networkInstance, serviceId, networkName, networkModel.isEcompGeneratedNaming));
+ result.push(this._basicControlGenerator.getProductFamilyControl(networkInstance, result, false));
+ result.push(this.getLcpRegionControl(serviceId, networkInstance, result));
+ result.push(this._basicControlGenerator.getLegacyRegion(networkInstance));
+ result.push(this.getTenantControl(serviceId, networkInstance, result));
+ result.push(this.getPlatformControl(networkInstance, result));
+ result.push(this.getLineOfBusinessControl(networkInstance, result));
+ }
+ return result;
+
+ }
+
+ getAlaCarteFormControls(serviceId: string, networkStoreKey: string, networkName: string, isUpdateMode : boolean): FormControlModel[] {
+ networkStoreKey = _.isNil(networkStoreKey) ? networkName : networkStoreKey;
+ if (_.isNil(serviceId) || _.isNil(networkStoreKey) || _.isNil(networkName)) {
+ this._logService.error('should provide serviceId, networkName, networkStoreKey', serviceId);
+ return [];
+ }
+
+ let result: FormControlModel[] = [];
+ const networkInstance = this.getNetworkInstance(serviceId, networkStoreKey, isUpdateMode);
+ const networkModel = new NetworkModel(this.store.getState().service.serviceHierarchy[serviceId].networks[networkName]);
+
+ if (!_.isNil(networkModel)) {
+ result.push(this.getInstanceName(networkInstance, serviceId, networkName, networkModel.isEcompGeneratedNaming));
+ result.push(this._basicControlGenerator.getProductFamilyControl(networkInstance, result, false));
+ result.push(this.getLcpRegionControl(serviceId, networkInstance, result));
+ result.push(this._basicControlGenerator.getLegacyRegion(networkInstance));
+ result.push(this.getTenantControl(serviceId, networkInstance, result));
+ result.push(this.getPlatformControl(networkInstance, result));
+ result.push(this.getLineOfBusinessControl(networkInstance, result));
+ result.push(this.getRollbackOnFailureControl(networkInstance, result));
+ }
+ return result;
+
+ }
+
+ isInputShouldBeShown = (inputType: any): boolean => {
+ let networkInputs = [InputType.LCP_REGION, InputType.LOB, InputType.TENANT, InputType.PRODUCT_FAMILY, InputType.PLATFORM, InputType.ROLLBACK];
+ return networkInputs.indexOf(inputType) > -1;
+ };
+
+ getInstanceName(instance : any, serviceId : string, networkName : string, isEcompGeneratedNaming: boolean): FormControlModel {
+ const networkModel : NetworkModel = this.store.getState().service.serviceHierarchy[serviceId].networks[networkName];
+ return this._basicControlGenerator.getInstanceNameController(instance, serviceId, isEcompGeneratedNaming, networkModel);
+ }
+
+ getLineOfBusinessControl = (instance: any, controls: FormControlModel[]): DropdownFormControl => {
+ return new DropdownFormControl({
+ type: FormControlType.DROPDOWN,
+ controlName: 'lineOfBusiness',
+ displayName: 'Line of business',
+ dataTestId: 'lineOfBusiness',
+ placeHolder: 'Select Line Of Business',
+ isDisabled: false,
+ name: "lineOfBusiness",
+ value: instance ? instance.lineOfBusiness : null,
+ validations: [],
+ onInitSelectedField: ['lineOfBusinessList'],
+ onInit: this._basicControlGenerator.getSubscribeInitResult.bind(null, this._aaiService.getCategoryParameters)
+ })
+ };
+
+ getPlatformControl = (instance: any, controls: FormControlModel[]): DropdownFormControl => {
+ return new DropdownFormControl({
+ type: FormControlType.DROPDOWN,
+ controlName: 'platformName',
+ displayName: 'Platform',
+ dataTestId: 'platform',
+ placeHolder: 'Select Platform',
+ isDisabled: false,
+ name: "platform",
+ value: instance ? instance.platformName : null,
+ validations: [new ValidatorModel(ValidatorOptions.required, 'is required')],
+ onInitSelectedField: ['platformList'],
+ onInit: this._basicControlGenerator.getSubscribeInitResult.bind(null, this._aaiService.getCategoryParameters)
+ })
+ };
+
+ getTenantControl = (serviceId: string, instance: any, controls: FormControlModel[]): DropdownFormControl => {
+ const service = this.store.getState().service.serviceInstance[serviceId];
+ const globalCustomerId: string = service.globalSubscriberId;
+ const serviceType: string = service.subscriptionServiceType;
+ return new DropdownFormControl({
+ type: FormControlType.DROPDOWN,
+ controlName: FormControlNames.TENANT_ID,
+ displayName: 'Tenant',
+ dataTestId: 'tenant',
+ placeHolder: 'Select Tenant',
+ name: "tenant",
+ isDisabled: _.isNil(instance) || _.isNil(instance.lcpCloudRegionId),
+ onInitSelectedField: instance ? ['lcpRegionsTenantsMap', instance.lcpCloudRegionId] : null,
+ value: instance ? instance.tenantId : null,
+ validations: [new ValidatorModel(ValidatorOptions.required, 'is required')],
+ onInit : instance ? this._basicControlGenerator.getSubscribeInitResult.bind(
+ this._aaiService,
+ this.aaiService.getLcpRegionsAndTenants.bind(this, globalCustomerId, serviceType)) : ()=>{},
+ })
+ };
+
+ getLcpRegionControl = (serviceId: string, instance: any, controls: FormControlModel[]): DropdownFormControl => {
+ const service = this.store.getState().service.serviceInstance[serviceId];
+ const globalCustomerId: string = service.globalSubscriberId;
+ const serviceType: string = service.subscriptionServiceType;
+ return new DropdownFormControl({
+ type: FormControlType.DROPDOWN,
+ controlName: 'lcpCloudRegionId',
+ displayName: 'LCP region',
+ dataTestId: 'lcpRegion',
+ placeHolder: 'Select LCP Region',
+ name: "lcpRegion",
+ isDisabled: false,
+ value: instance ? instance.lcpCloudRegionId : null,
+ validations: [new ValidatorModel(ValidatorOptions.required, 'is required')],
+ onInitSelectedField: ['lcpRegionList'],
+ onInit: this._basicControlGenerator.getSubscribeInitResult.bind(
+ this._aaiService,
+ this._aaiService.getLcpRegionsAndTenants.bind(this, globalCustomerId, serviceType)),
+ onChange: (param: string, form: FormGroup) => {
+ form.controls[FormControlNames.TENANT_ID].enable();
+ form.controls[FormControlNames.TENANT_ID].reset();
+ if (!_.isNil(globalCustomerId) && !_.isNil(serviceType)) {
+ this._basicControlGenerator.getSubscribeResult.bind(this, this._aaiService.getLcpRegionsAndTenants(globalCustomerId, serviceType).subscribe(res => {
+ controls.find(item => item.controlName === FormControlNames.TENANT_ID)['options$'] = res.lcpRegionsTenantsMap[param];
+ if(res.lcpRegionsTenantsMap[param]){
+ controls.find(item => item.controlName === FormControlNames.TENANT_ID)['hasEmptyOptions'] = res.lcpRegionsTenantsMap[param].length === 0;
+ }
+ }));
+ }
+
+ if (Constants.LegacyRegion.MEGA_REGION.indexOf(param) !== -1) {
+ form.controls['legacyRegion'].enable();
+ controls.find(item => item.controlName === 'legacyRegion').isVisible = true;
+
+ } else {
+ controls.find(item => item.controlName === 'legacyRegion').isVisible = false;
+ form.controls['legacyRegion'].setValue(null);
+ form.controls['legacyRegion'].reset();
+ form.controls['legacyRegion'].disable();
+ }
+ }
+ })
+ };
+
+ getRollbackOnFailureControl = (instance: any, controls: FormControlModel[]): DropdownFormControl => {
+ return new DropdownFormControl({
+ type: FormControlType.DROPDOWN,
+ controlName: FormControlNames.ROLLBACK_ON_FAILURE,
+ displayName: 'Rollback on failure',
+ dataTestId: 'rollback',
+ placeHolder: 'Rollback on failure',
+ isDisabled: false,
+ validations: [new ValidatorModel(ValidatorOptions.required, 'is required')],
+ value: instance ? instance.rollbackOnFailure : 'true',
+ onInit: this._basicControlGenerator.getSubscribeInitResult.bind(null, this.getRollBackOnFailureOptions)
+ })
+ };
+
+ getRollBackOnFailureOptions = (): Observable<SelectOption[]> => {
+ return of([
+ new SelectOption({id: 'true', name: 'Rollback'}),
+ new SelectOption({id: 'false', name: 'Don\'t Rollback'})
+ ]);
+ };
+}
diff --git a/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/service.control.generator.spec.ts b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/service.control.generator.spec.ts
new file mode 100644
index 000000000..b7a728c6d
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/service.control.generator.spec.ts
@@ -0,0 +1,1859 @@
+import {getTestBed, TestBed} from '@angular/core/testing';
+import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing';
+import {NgRedux} from '@angular-redux/store';
+import {FormControlNames, ServiceControlGenerator} from "./service.control.generator";
+import {BasicControlGenerator} from "./basic.control.generator";
+import {AaiService} from "../../../services/aaiService/aai.service";
+import {GenericFormService} from "../generic-form.service";
+import {FormBuilder} from "@angular/forms";
+import {FormControlModel, ValidatorModel, ValidatorOptions} from "../../../models/formControlModels/formControl.model";
+import {LogService} from "../../../utils/log/log.service";
+import {FormControlType} from "../../../models/formControlModels/formControlTypes.enum";
+import {DropdownFormControl} from "../../../models/formControlModels/dropdownFormControl.model";
+import {FeatureFlagsService} from "../../../services/featureFlag/feature-flags.service";
+
+class MockAppStore<T> {
+ getState(){
+ return {
+ "global": {
+ "name": null,
+ "flags": {
+ "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false,
+ "FLAG_SHOW_ASSIGNMENTS": true,
+ "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
+ "FLAG_UNASSIGN_SERVICE": true,
+ "FLAG_SHOW_VERIFY_SERVICE": false,
+ "FLAG_COLLECTION_RESOURCE_SUPPORT": true,
+ "FLAG_DUPLICATE_VNF": true,
+ "FLAG_SERVICE_MODEL_CACHE": true,
+ "CREATE_INSTANCE_TEST": false,
+ "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false,
+ "FLAG_ASYNC_INSTANTIATION": true,
+ "FLAG_ASYNC_JOBS": true,
+ "EMPTY_DRAWING_BOARD_TEST": false,
+ "FLAG_ADD_MSO_TESTAPI_FIELD": true
+ },
+ "type": "[FLAGS] Update"
+ },
+ "service": {
+ "serviceHierarchy": {
+ "6e59c5de-f052-46fa-aa7e-2fca9d674c44": {
+ "service": {
+ "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "name": "ComplexService",
+ "version": "1.0",
+ "toscaModelURL": null,
+ "category": "Emanuel",
+ "serviceType": "",
+ "serviceRole": "",
+ "description": "ComplexService",
+ "serviceEcompNaming": "false",
+ "instantiationType": "Macro",
+ "inputs": {}
+ },
+ "vnfs": {
+ "VF_vMee 0": {
+ "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60",
+ "invariantUuid": "4160458e-f648-4b30-a176-43881ffffe9e",
+ "description": "VSP_vMee",
+ "name": "VF_vMee",
+ "version": "2.0",
+ "customizationUuid": "91415b44-753d-494c-926a-456a9172bbb9",
+ "inputs": {},
+ "commands": {},
+ "properties": {
+ "max_instances": 10,
+ "min_instances": 1,
+ "gpb2_Internal2_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-ipv6-egress_src_start_port": "0",
+ "sctp-a-ipv6-egress_rule_application": "any",
+ "Internal2_allow_transit": "true",
+ "sctp-b-IPv6_ethertype": "IPv6",
+ "sctp-a-egress_rule_application": "any",
+ "sctp-b-ingress_action": "pass",
+ "sctp-b-ingress_rule_protocol": "icmp",
+ "ncb2_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-ipv6-ingress-src_start_port": "0.0",
+ "ncb1_Internal2_mac": "00:11:22:EF:AC:DF",
+ "fsb_volume_size_0": "320.0",
+ "sctp-b-egress_src_addresses": "local",
+ "sctp-a-ipv6-ingress_ethertype": "IPv4",
+ "sctp-a-ipv6-ingress-dst_start_port": "0",
+ "sctp-b-ipv6-ingress_rule_application": "any",
+ "domain_name": "default-domain",
+ "sctp-a-ingress_rule_protocol": "icmp",
+ "sctp-b-egress-src_start_port": "0.0",
+ "sctp-a-egress_src_addresses": "local",
+ "sctp-b-display_name": "epc-sctp-b-ipv4v6-sec-group",
+ "sctp-a-egress-src_start_port": "0.0",
+ "sctp-a-ingress_ethertype": "IPv4",
+ "sctp-b-ipv6-ingress-dst_end_port": "65535",
+ "sctp-b-dst_subnet_prefix_v6": "::",
+ "nf_naming": "{ecomp_generated_naming=true}",
+ "sctp-a-ipv6-ingress_src_subnet_prefix": "0.0.0.0",
+ "sctp-b-egress-dst_start_port": "0.0",
+ "ncb_flavor_name": "nv.c20r64d1",
+ "gpb1_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-egress_dst_subnet_prefix_len": "0.0",
+ "Internal2_net_cidr": "10.0.0.10",
+ "sctp-a-ingress-dst_start_port": "0.0",
+ "sctp-a-egress-dst_start_port": "0.0",
+ "fsb1_Internal2_mac": "00:11:22:EF:AC:DF",
+ "sctp-a-egress_ethertype": "IPv4",
+ "vlc_st_service_mode": "in-network-nat",
+ "sctp-a-ipv6-egress_ethertype": "IPv4",
+ "sctp-a-egress-src_end_port": "65535.0",
+ "sctp-b-ipv6-egress_rule_application": "any",
+ "sctp-b-egress_action": "pass",
+ "sctp-a-ingress-src_subnet_prefix_len": "0.0",
+ "sctp-b-ipv6-ingress-src_end_port": "65535.0",
+ "sctp-b-name": "epc-sctp-b-ipv4v6-sec-group",
+ "fsb2_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-a-ipv6-ingress-src_start_port": "0.0",
+ "sctp-b-ipv6-egress_ethertype": "IPv4",
+ "Internal1_net_cidr": "10.0.0.10",
+ "sctp-a-egress_dst_subnet_prefix": "0.0.0.0",
+ "fsb_flavor_name": "nv.c20r64d1",
+ "sctp_rule_protocol": "132",
+ "sctp-b-ipv6-ingress_src_subnet_prefix_len": "0",
+ "sctp-a-ipv6-ingress_rule_application": "any",
+ "ecomp_generated_naming": "false",
+ "sctp-a-IPv6_ethertype": "IPv6",
+ "vlc2_Internal1_mac": "00:11:22:EF:AC:DF",
+ "vlc_st_virtualization_type": "virtual-machine",
+ "sctp-b-ingress-dst_start_port": "0.0",
+ "sctp-b-ingress-dst_end_port": "65535.0",
+ "sctp-a-ipv6-ingress-src_end_port": "65535.0",
+ "sctp-a-display_name": "epc-sctp-a-ipv4v6-sec-group",
+ "sctp-b-ingress_rule_application": "any",
+ "int2_sec_group_name": "int2-sec-group",
+ "vlc_flavor_name": "nd.c16r64d1",
+ "sctp-b-ipv6-egress_src_addresses": "local",
+ "vlc_st_interface_type_int1": "other1",
+ "sctp-b-egress-src_end_port": "65535.0",
+ "sctp-a-ipv6-egress-dst_start_port": "0",
+ "vlc_st_interface_type_int2": "other2",
+ "sctp-a-ipv6-egress_rule_protocol": "any",
+ "Internal2_shared": "false",
+ "sctp-a-ipv6-egress_dst_subnet_prefix_len": "0",
+ "Internal2_rpf": "disable",
+ "vlc1_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-ipv6-egress_src_end_port": "65535",
+ "sctp-a-ipv6-egress_src_addresses": "local",
+ "sctp-a-ingress-dst_end_port": "65535.0",
+ "sctp-a-ipv6-egress_src_end_port": "65535",
+ "Internal1_forwarding_mode": "l2",
+ "Internal2_dhcp": "false",
+ "sctp-a-dst_subnet_prefix_v6": "::",
+ "pxe_image_name": "MME_PXE-Boot_16ACP04_GA.qcow2",
+ "vlc_st_interface_type_gtp": "other0",
+ "ncb1_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-src_subnet_prefix_v6": "::",
+ "sctp-a-egress_dst_subnet_prefix_len": "0.0",
+ "int1_sec_group_name": "int1-sec-group",
+ "Internal1_dhcp": "false",
+ "sctp-a-ipv6-egress_dst_end_port": "65535",
+ "Internal2_forwarding_mode": "l2",
+ "fsb2_Internal2_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-egress_dst_subnet_prefix": "0.0.0.0",
+ "Internal1_net_cidr_len": "17",
+ "gpb2_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-ingress-src_subnet_prefix_len": "0.0",
+ "sctp-a-ingress_dst_addresses": "local",
+ "sctp-a-egress_action": "pass",
+ "fsb_volume_type_0": "SF-Default-SSD",
+ "ncb2_Internal2_mac": "00:11:22:EF:AC:DF",
+ "vlc_st_interface_type_sctp_a": "left",
+ "vlc_st_interface_type_sctp_b": "right",
+ "sctp-a-src_subnet_prefix_v6": "::",
+ "vlc_st_version": "2",
+ "sctp-b-egress_ethertype": "IPv4",
+ "sctp-a-ingress_rule_application": "any",
+ "gpb1_Internal2_mac": "00:11:22:EF:AC:DF",
+ "instance_ip_family_v6": "v6",
+ "sctp-a-ipv6-egress_src_start_port": "0",
+ "sctp-b-ingress-src_start_port": "0.0",
+ "sctp-b-ingress_dst_addresses": "local",
+ "fsb1_Internal1_mac": "00:11:22:EF:AC:DF",
+ "vlc_st_interface_type_oam": "management",
+ "multi_stage_design": "true",
+ "oam_sec_group_name": "oam-sec-group",
+ "Internal2_net_gateway": "10.0.0.10",
+ "sctp-a-ipv6-ingress-dst_end_port": "65535",
+ "sctp-b-ipv6-egress-dst_start_port": "0",
+ "Internal1_net_gateway": "10.0.0.10",
+ "sctp-b-ipv6-egress_rule_protocol": "any",
+ "gtp_sec_group_name": "gtp-sec-group",
+ "sctp-a-ipv6-egress_dst_subnet_prefix": "0.0.0.0",
+ "sctp-b-ipv6-egress_dst_subnet_prefix_len": "0",
+ "sctp-a-ipv6-ingress_dst_addresses": "local",
+ "sctp-a-egress_rule_protocol": "icmp",
+ "sctp-b-ipv6-egress_action": "pass",
+ "sctp-a-ipv6-egress_action": "pass",
+ "Internal1_shared": "false",
+ "sctp-b-ipv6-ingress_rule_protocol": "any",
+ "Internal2_net_cidr_len": "17",
+ "sctp-a-name": "epc-sctp-a-ipv4v6-sec-group",
+ "sctp-a-ingress-src_end_port": "65535.0",
+ "sctp-b-ipv6-ingress_src_subnet_prefix": "0.0.0.0",
+ "sctp-a-egress-dst_end_port": "65535.0",
+ "sctp-a-ingress_action": "pass",
+ "sctp-b-egress_rule_protocol": "icmp",
+ "sctp-b-ipv6-ingress_action": "pass",
+ "vlc_st_service_type": "firewall",
+ "sctp-b-ipv6-egress_dst_end_port": "65535",
+ "sctp-b-ipv6-ingress-dst_start_port": "0",
+ "vlc2_Internal2_mac": "00:11:22:EF:AC:DF",
+ "vlc_st_availability_zone": "true",
+ "fsb_volume_image_name_1": "MME_FSB2_16ACP04_GA.qcow2",
+ "sctp-b-ingress-src_subnet_prefix": "0.0.0.0",
+ "sctp-a-ipv6-ingress_src_subnet_prefix_len": "0",
+ "Internal1_allow_transit": "true",
+ "gpb_flavor_name": "nv.c20r64d1",
+ "availability_zone_max_count": "1",
+ "fsb_volume_image_name_0": "MME_FSB1_16ACP04_GA.qcow2",
+ "sctp-b-ipv6-ingress_dst_addresses": "local",
+ "sctp-b-ipv6-egress_dst_subnet_prefix": "0.0.0.0",
+ "sctp-b-ipv6-ingress_ethertype": "IPv4",
+ "vlc1_Internal2_mac": "00:11:22:EF:AC:DF",
+ "sctp-a-ingress-src_subnet_prefix": "0.0.0.0",
+ "sctp-a-ipv6-ingress_action": "pass",
+ "Internal1_rpf": "disable",
+ "sctp-b-ingress_ethertype": "IPv4",
+ "sctp-b-egress_rule_application": "any",
+ "sctp-b-ingress-src_end_port": "65535.0",
+ "sctp-a-ipv6-ingress_rule_protocol": "any",
+ "sctp-a-ingress-src_start_port": "0.0",
+ "sctp-b-egress-dst_end_port": "65535.0"
+ },
+ "type": "VF",
+ "modelCustomizationName": "VF_vMee 0",
+ "vfModules": {
+ "vf_vmee0..VfVmee..vmme_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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..vmme_vlc..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "vmme_vlc"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ },
+ "vf_vmee0..VfVmee..vmme_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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..vmme_gpb..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "vmme_gpb"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "vf_vmee0..VfVmee..base_vmme..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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "base_vmme"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "vf_vmee0..VfVmee..base_vmme..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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "base_vmme"
+ },
+ "inputs": {}
+ }
+ },
+ "vfcInstanceGroups": {}
+ }
+ },
+ "networks": {
+ "ExtVL 0": {
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ "invariantUuid": "379f816b-a7aa-422f-be30-17114ff50b7c",
+ "description": "ECOMP generic virtual link (network) base type for all other service-level and global networks",
+ "name": "ExtVL",
+ "version": "37.0",
+ "customizationUuid": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+ "inputs": {},
+ "commands": {},
+ "properties": {
+ "network_assignments": "{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}",
+ "exVL_naming": "{ecomp_generated_naming=true}",
+ "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}",
+ "network_homing": "{ecomp_selected_instance_node_target=false}"
+ },
+ "type": "VL",
+ "modelCustomizationName": "ExtVL 0"
+ }
+ },
+ "collectionResource": {},
+ "configurations": {
+ "Port Mirroring Configuration By Policy 0": {
+ "uuid": "b4398538-e89d-4f13-b33d-ca323434ba50",
+ "invariantUuid": "6ef0ca40-f366-4897-951f-abd65d25f6f7",
+ "description": "A port mirroring configuration by policy object",
+ "name": "Port Mirroring Configuration By Policy",
+ "version": "27.0",
+ "customizationUuid": "3c3b7b8d-8669-4b3b-8664-61970041fad2",
+ "inputs": {},
+ "commands": {},
+ "properties": {},
+ "type": "Configuration",
+ "modelCustomizationName": "Port Mirroring Configuration By Policy 0",
+ "sourceNodes": [],
+ "collectorNodes": null,
+ "configurationByPolicy": false
+ }
+ },
+ "serviceProxies": {},
+ "vfModules": {
+ "vf_vmee0..VfVmee..vmme_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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..vmme_vlc..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "vmme_vlc"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ },
+ "vf_vmee0..VfVmee..vmme_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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..vmme_gpb..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "vmme_gpb"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "vf_vmee0..VfVmee..base_vmme..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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "base_vmme"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "vf_vmee0..VfVmee..base_vmme..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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "base_vmme"
+ },
+ "inputs": {}
+ }
+ },
+ "pnfs": {}
+ }
+ },
+ "serviceInstance": {},
+ "lcpRegionsAndTenants": {
+ "lcpRegionList": [
+ {
+ "id": "JANET25",
+ "name": "JANET25",
+ "isPermitted": true
+ },
+ {
+ "id": "hvf6",
+ "name": "hvf6",
+ "isPermitted": true
+ }
+ ],
+ "lcpRegionsTenantsMap": {
+ "JANET25": [
+ {
+ "id": "092eb9e8e4b7412e8787dd091bc58e86",
+ "name": "USP-SIP-IC-24335-T-01",
+ "isPermitted": true
+ }
+ ],
+ "hvf6": [
+ {
+ "id": "bae71557c5bb4d5aac6743a4e5f1d054",
+ "name": "AIN Web Tool-15-D-testalexandria",
+ "isPermitted": true
+ },
+ {
+ "id": "229bcdc6eaeb4ca59d55221141d01f8e",
+ "name": "AIN Web Tool-15-D-STTest2",
+ "isPermitted": true
+ },
+ {
+ "id": "1178612d2b394be4834ad77f567c0af2",
+ "name": "AIN Web Tool-15-D-SSPtestcustome",
+ "isPermitted": true
+ },
+ {
+ "id": "19c5ade915eb461e8af52fb2fd8cd1f2",
+ "name": "AIN Web Tool-15-D-UncheckedEcopm",
+ "isPermitted": true
+ },
+ {
+ "id": "de007636e25249238447264a988a927b",
+ "name": "AIN Web Tool-15-D-dfsdf",
+ "isPermitted": true
+ },
+ {
+ "id": "62f29b3613634ca6a3065cbe0e020c44",
+ "name": "AIN/SMS-16-D-Multiservices1",
+ "isPermitted": true
+ },
+ {
+ "id": "649289e30d3244e0b48098114d63c2aa",
+ "name": "AIN Web Tool-15-D-SSPST66",
+ "isPermitted": true
+ },
+ {
+ "id": "3f21eeea6c2c486bba31dab816c05a32",
+ "name": "AIN Web Tool-15-D-ASSPST47",
+ "isPermitted": true
+ },
+ {
+ "id": "f60ce21d3ee6427586cff0d22b03b773",
+ "name": "CESAR-100-D-sspjg67246",
+ "isPermitted": true
+ },
+ {
+ "id": "8774659e425f479895ae091bb5d46560",
+ "name": "CESAR-100-D-sspjg68359",
+ "isPermitted": true
+ },
+ {
+ "id": "624eb554b0d147c19ff8885341760481",
+ "name": "AINWebTool-15-D-iftach",
+ "isPermitted": true
+ },
+ {
+ "id": "214f55f5fc414c678059c383b03e4962",
+ "name": "CESAR-100-D-sspjg612401",
+ "isPermitted": true
+ },
+ {
+ "id": "c90666c291664841bb98e4d981ff1db5",
+ "name": "CESAR-100-D-sspjg621340",
+ "isPermitted": true
+ },
+ {
+ "id": "ce5b6bc5c7b348e1bf4b91ac9a174278",
+ "name": "sspjg621351cloned",
+ "isPermitted": true
+ },
+ {
+ "id": "b386b768a3f24c8e953abbe0b3488c02",
+ "name": "AINWebTool-15-D-eteancomp",
+ "isPermitted": true
+ },
+ {
+ "id": "dc6c4dbfd225474e9deaadd34968646c",
+ "name": "AINWebTool-15-T-SPFET",
+ "isPermitted": true
+ },
+ {
+ "id": "02cb5030e9914aa4be120bd9ed1e19eb",
+ "name": "AINWebTool-15-X-eeweww",
+ "isPermitted": true
+ },
+ {
+ "id": "f2f3830e4c984d45bcd00e1a04158a79",
+ "name": "CESAR-100-D-spjg61909",
+ "isPermitted": true
+ },
+ {
+ "id": "05b91bd5137f4929878edd965755c06d",
+ "name": "CESAR-100-D-sspjg621512cloned",
+ "isPermitted": true
+ },
+ {
+ "id": "7002fbe8482d4a989ddf445b1ce336e0",
+ "name": "AINWebTool-15-X-vdr",
+ "isPermitted": true
+ },
+ {
+ "id": "4008522be43741dcb1f5422022a2aa0b",
+ "name": "AINWebTool-15-D-ssasa",
+ "isPermitted": true
+ },
+ {
+ "id": "f44e2e96a1b6476abfda2fa407b00169",
+ "name": "AINWebTool-15-D-PFNPT",
+ "isPermitted": true
+ },
+ {
+ "id": "b69a52bec8a84669a37a1e8b72708be7",
+ "name": "AINWebTool-15-X-vdre",
+ "isPermitted": true
+ },
+ {
+ "id": "fac7d9fd56154caeb9332202dcf2969f",
+ "name": "AINWebTool-15-X-NONPODECOMP",
+ "isPermitted": true
+ },
+ {
+ "id": "2d34d8396e194eb49969fd61ffbff961",
+ "name": "DN5242-Nov16-T5",
+ "isPermitted": true
+ },
+ {
+ "id": "cb42a77ff45b48a8b8deb83bb64acc74",
+ "name": "ro-T11",
+ "isPermitted": true
+ },
+ {
+ "id": "fa45ca53c80b492fa8be5477cd84fc2b",
+ "name": "ro-T112",
+ "isPermitted": true
+ },
+ {
+ "id": "4914ab0ab3a743e58f0eefdacc1dde77",
+ "name": "DN5242-Nov21-T1",
+ "isPermitted": true
+ },
+ {
+ "id": "d0a3e3f2964542259d155a81c41aadc3",
+ "name": "test-hvf6-09",
+ "isPermitted": true
+ },
+ {
+ "id": "cbb99fe4ada84631b7baf046b6fd2044",
+ "name": "DN5242-Nov16-T3",
+ "isPermitted": true
+ }
+ ]
+ }
+ },
+ "productFamilies": [
+ {
+ "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+ "name": "SCOTTIE",
+ "isPermitted": true
+ },
+ {
+ "id": "17cc1042-527b-11e6-beb8-9e71128cae77",
+ "name": "IGNACIO",
+ "isPermitted": true
+ },
+ {
+ "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+ "name": "Christie",
+ "isPermitted": true
+ },
+ {
+ "id": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7",
+ "name": "Enhanced Services",
+ "isPermitted": true
+ },
+ {
+ "id": "vTerrance",
+ "name": "vTerrance",
+ "isPermitted": true
+ },
+ {
+ "id": "323d69d9-2efe-4r45-ay0a-89ea7ard4e6f",
+ "name": "vSCP",
+ "isPermitted": true
+ },
+ {
+ "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+ "name": "Emanuel",
+ "isPermitted": true
+ },
+ {
+ "id": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+ "name": "BVOIP",
+ "isPermitted": true
+ },
+ {
+ "id": "db171b8f-115c-4992-a2e3-ee04cae357e0",
+ "name": "LINDSEY",
+ "isPermitted": true
+ },
+ {
+ "id": "LRSI-OSPF",
+ "name": "LRSI-OSPF",
+ "isPermitted": true
+ },
+ {
+ "id": "vRosemarie",
+ "name": "HNGATEWAY",
+ "isPermitted": true
+ },
+ {
+ "id": "vHNPaas",
+ "name": "WILKINS",
+ "isPermitted": true
+ },
+ {
+ "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "name": "TYLER SILVIA",
+ "isPermitted": true
+ },
+ {
+ "id": "b6a3f28c-eebf-494c-a900-055cc7c874ce",
+ "name": "VROUTER",
+ "isPermitted": true
+ },
+ {
+ "id": "Cisneros",
+ "name": "vMuriel",
+ "isPermitted": true
+ },
+ {
+ "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1",
+ "name": "CARA Griffin",
+ "isPermitted": true
+ },
+ {
+ "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d",
+ "name": "DARREN MCGEE",
+ "isPermitted": true
+ },
+ {
+ "id": "e30755dc-5673-4b6b-9dcf-9abdd96b93d1",
+ "name": "Transport",
+ "isPermitted": true
+ },
+ {
+ "id": "vSalvatore",
+ "name": "vSalvatore",
+ "isPermitted": true
+ },
+ {
+ "id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4",
+ "name": "Josefina",
+ "isPermitted": true
+ },
+ {
+ "id": "vHubbard",
+ "name": "vHubbard",
+ "isPermitted": true
+ },
+ {
+ "id": "12a96a9d-4b4c-4349-a950-fe1159602621",
+ "name": "DARREN MCGEE",
+ "isPermitted": true
+ }
+ ],
+ "serviceTypes": {
+ "e433710f-9217-458d-a79d-1c7aff376d89": [
+ {
+ "id": "0",
+ "name": "vRichardson",
+ "isPermitted": false
+ },
+ {
+ "id": "1",
+ "name": "TYLER SILVIA",
+ "isPermitted": true
+ },
+ {
+ "id": "2",
+ "name": "Emanuel",
+ "isPermitted": false
+ },
+ {
+ "id": "3",
+ "name": "vJamie",
+ "isPermitted": false
+ },
+ {
+ "id": "4",
+ "name": "vVoiceMail",
+ "isPermitted": false
+ },
+ {
+ "id": "5",
+ "name": "Kennedy",
+ "isPermitted": false
+ },
+ {
+ "id": "6",
+ "name": "vSEGW",
+ "isPermitted": false
+ },
+ {
+ "id": "7",
+ "name": "vVM",
+ "isPermitted": false
+ },
+ {
+ "id": "8",
+ "name": "vOTA",
+ "isPermitted": false
+ },
+ {
+ "id": "9",
+ "name": "vMME",
+ "isPermitted": false
+ },
+ {
+ "id": "10",
+ "name": "vMNS",
+ "isPermitted": false
+ },
+ {
+ "id": "11",
+ "name": "vSCP",
+ "isPermitted": false
+ },
+ {
+ "id": "12",
+ "name": "VPMS",
+ "isPermitted": false
+ },
+ {
+ "id": "13",
+ "name": "vMMSC",
+ "isPermitted": false
+ },
+ {
+ "id": "14",
+ "name": "SSD",
+ "isPermitted": false
+ },
+ {
+ "id": "15",
+ "name": "vMOG",
+ "isPermitted": false
+ },
+ {
+ "id": "16",
+ "name": "LINDSEY",
+ "isPermitted": false
+ },
+ {
+ "id": "17",
+ "name": "JOHANNA_SANTOS",
+ "isPermitted": false
+ },
+ {
+ "id": "18",
+ "name": "vCarroll",
+ "isPermitted": false
+ }
+ ]
+ },
+ "aicZones": [
+ {
+ "id": "NFT1",
+ "name": "NFTJSSSS-NFT1"
+ },
+ {
+ "id": "JAG1",
+ "name": "YUDFJULP-JAG1"
+ },
+ {
+ "id": "YYY1",
+ "name": "UUUAIAAI-YYY1"
+ },
+ {
+ "id": "BAN1",
+ "name": "VSDKYUTP-BAN1"
+ },
+ {
+ "id": "DKJ1",
+ "name": "DKJSJDKA-DKJ1"
+ },
+ {
+ "id": "MCS1",
+ "name": "ASACMAMS-MCS1"
+ },
+ {
+ "id": "UIO1",
+ "name": "uioclli1-UIO1"
+ },
+ {
+ "id": "RAJ1",
+ "name": "YGBIJNLQ-RAJ1"
+ },
+ {
+ "id": "OPA1",
+ "name": "opaclli1-OPA1"
+ },
+ {
+ "id": "SDE1",
+ "name": "ZXCVBNMA-SDE1"
+ },
+ {
+ "id": "VEN2",
+ "name": "FGHJUHIL-VEN2"
+ },
+ {
+ "id": "ORL1",
+ "name": "ORLDFLMA-ORL1"
+ },
+ {
+ "id": "JAD1",
+ "name": "JADECLLI-JAD1"
+ },
+ {
+ "id": "ZXL1",
+ "name": "LWLWCANN-ZXL1"
+ },
+ {
+ "id": "CKL1",
+ "name": "CLKSKCKK-CKL1"
+ },
+ {
+ "id": "SDF1",
+ "name": "sdfclli1-SDF1"
+ },
+ {
+ "id": "RAD1",
+ "name": "RADICAL1-RAD1"
+ },
+ {
+ "id": "KIT1",
+ "name": "BHYJFGLN-KIT1"
+ },
+ {
+ "id": "REL1",
+ "name": "INGERFGT-REL1"
+ },
+ {
+ "id": "JNL1",
+ "name": "CJALSDAC-JNL1"
+ },
+ {
+ "id": "OLK1",
+ "name": "OLKOLKLS-OLK1"
+ },
+ {
+ "id": "CHI1",
+ "name": "CHILLIWE-CHI1"
+ },
+ {
+ "id": "UUU4",
+ "name": "UUUAAAUU-UUU4"
+ },
+ {
+ "id": "TUF1",
+ "name": "TUFCLLI1-TUF1"
+ },
+ {
+ "id": "KJN1",
+ "name": "CKALDKSA-KJN1"
+ },
+ {
+ "id": "SAM1",
+ "name": "SNDGCA64-SAN1"
+ },
+ {
+ "id": "SCK1",
+ "name": "SCKSCKSK-SCK1"
+ },
+ {
+ "id": "HJH1",
+ "name": "AOEEQQQD-HJH1"
+ },
+ {
+ "id": "HGD1",
+ "name": "SDFQWHGD-HGD1"
+ },
+ {
+ "id": "KOR1",
+ "name": "HYFLNBVT-KOR1"
+ },
+ {
+ "id": "ATL43",
+ "name": "AICLOCID-ATL43"
+ },
+ {
+ "id": "ATL54",
+ "name": "AICFTAAI-ATL54"
+ },
+ {
+ "id": "ATL66",
+ "name": "CLLIAAII-ATL66"
+ },
+ {
+ "id": "VEL1",
+ "name": "BNMLKUIK-VEL1"
+ },
+ {
+ "id": "ICC1",
+ "name": "SANJITAT-ICC1"
+ },
+ {
+ "id": "MNT11",
+ "name": "WSXEFBTH-MNT11"
+ },
+ {
+ "id": "DEF2",
+ "name": "WSBHGTYL-DEF2"
+ },
+ {
+ "id": "MAD11",
+ "name": "SDFQWGKL-MAD11"
+ },
+ {
+ "id": "OLG1",
+ "name": "OLHOLHOL-OLG1"
+ },
+ {
+ "id": "GAR1",
+ "name": "NGFVSJKO-GAR1"
+ },
+ {
+ "id": "SAN22",
+ "name": "GNVLSCTL-SAN22"
+ },
+ {
+ "id": "HRG1",
+ "name": "HRGHRGGS-HRG1"
+ },
+ {
+ "id": "JCS1",
+ "name": "JCSJSCJS-JCS1"
+ },
+ {
+ "id": "DHA12",
+ "name": "WSXEDECF-DHA12"
+ },
+ {
+ "id": "HJE1",
+ "name": "AOEEWWWD-HJE1"
+ },
+ {
+ "id": "NCA1",
+ "name": "NCANCANN-NCA1"
+ },
+ {
+ "id": "IOP1",
+ "name": "iopclli1-IOP1"
+ },
+ {
+ "id": "RTY1",
+ "name": "rtyclli1-RTY1"
+ },
+ {
+ "id": "KAP1",
+ "name": "HIOUYTRQ-KAP1"
+ },
+ {
+ "id": "ZEN1",
+ "name": "ZENCLLI1-ZEN1"
+ },
+ {
+ "id": "HKA1",
+ "name": "JAKHLASS-HKA1"
+ },
+ {
+ "id": "CQK1",
+ "name": "CQKSCAKK-CQK1"
+ },
+ {
+ "id": "SAI1",
+ "name": "UBEKQLPD-SAI1"
+ },
+ {
+ "id": "ERT1",
+ "name": "ertclli1-ERT1"
+ },
+ {
+ "id": "IBB1",
+ "name": "PLMKOIJU-IBB1"
+ },
+ {
+ "id": "TIR2",
+ "name": "PLKINHYI-TIR2"
+ },
+ {
+ "id": "HSD1",
+ "name": "CHASKCDS-HSD1"
+ },
+ {
+ "id": "SLF78",
+ "name": "SDCTLFN1-SLF78"
+ },
+ {
+ "id": "SEE78",
+ "name": "SDCTEEE4-SEE78"
+ },
+ {
+ "id": "SAN13",
+ "name": "TOKYJPFA-SAN13"
+ },
+ {
+ "id": "SAA78",
+ "name": "SDCTAAA1-SAA78"
+ },
+ {
+ "id": "LUC1",
+ "name": "ATLDFGYC-LUC1"
+ },
+ {
+ "id": "AMD13",
+ "name": "MEMATLAN-AMD13"
+ },
+ {
+ "id": "TOR1",
+ "name": "TOROONXN-TOR1"
+ },
+ {
+ "id": "QWE1",
+ "name": "QWECLLI1-QWE1"
+ },
+ {
+ "id": "ZOG1",
+ "name": "ZOGASTRO-ZOG1"
+ },
+ {
+ "id": "CAL33",
+ "name": "CALIFORN-CAL33"
+ },
+ {
+ "id": "SHH78",
+ "name": "SDIT1HHH-SHH78"
+ },
+ {
+ "id": "DSA1",
+ "name": "LKJHGFDS-DSA1"
+ },
+ {
+ "id": "CLG1",
+ "name": "CLGRABAD-CLG1"
+ },
+ {
+ "id": "BNA1",
+ "name": "BNARAGBK-BNA1"
+ },
+ {
+ "id": "ATL84",
+ "name": "CANTTCOC-ATL84"
+ },
+ {
+ "id": "APP1",
+ "name": "WBHGTYUI-APP1"
+ },
+ {
+ "id": "RJN1",
+ "name": "RJNRBZAW-RJN1"
+ },
+ {
+ "id": "EHH78",
+ "name": "SDCSHHH5-EHH78"
+ },
+ {
+ "id": "mac10",
+ "name": "PKGTESTF-mac10"
+ },
+ {
+ "id": "SXB78",
+ "name": "SDCTGXB1-SXB78"
+ },
+ {
+ "id": "SAX78",
+ "name": "SDCTAXG1-SAX78"
+ },
+ {
+ "id": "SYD1",
+ "name": "SYDNAUBV-SYD1"
+ },
+ {
+ "id": "TOK1",
+ "name": "TOKYJPFA-TOK1"
+ },
+ {
+ "id": "KGM2",
+ "name": "KGMTNC20-KGM2"
+ },
+ {
+ "id": "DCC1b",
+ "name": "POIUYTGH-DCC1b"
+ },
+ {
+ "id": "SKK78",
+ "name": "SDCTKKK1-SKK78"
+ },
+ {
+ "id": "SGG78",
+ "name": "SDCTGGG1-SGG78"
+ },
+ {
+ "id": "SJJ78",
+ "name": "SDCTJJJ1-SJJ78"
+ },
+ {
+ "id": "SBX78",
+ "name": "SDCTBXG1-SBX78"
+ },
+ {
+ "id": "LAG1",
+ "name": "LARGIZON-LAG1"
+ },
+ {
+ "id": "IAA1",
+ "name": "QAZXSWED-IAA1"
+ },
+ {
+ "id": "POI1",
+ "name": "PLMNJKIU-POI1"
+ },
+ {
+ "id": "LAG1a",
+ "name": "LARGIZON-LAG1a"
+ },
+ {
+ "id": "PBL1",
+ "name": "PBLAPBAI-PBL1"
+ },
+ {
+ "id": "LAG45",
+ "name": "LARGIZON-LAG1a"
+ },
+ {
+ "id": "MAR1",
+ "name": "MNBVCXZM-MAR1"
+ },
+ {
+ "id": "HST70",
+ "name": "HSTNTX70-HST70"
+ },
+ {
+ "id": "DCC1a",
+ "name": "POIUYTGH-DCC1a"
+ },
+ {
+ "id": "TOL1",
+ "name": "TOLDOH21-TOL1"
+ },
+ {
+ "id": "LON1",
+ "name": "LONEENCO-LON1"
+ },
+ {
+ "id": "SJU78",
+ "name": "SDIT1JUB-SJU78"
+ },
+ {
+ "id": "STN27",
+ "name": "HSTNTX01-STN27"
+ },
+ {
+ "id": "SSW56",
+ "name": "ss8126GT-SSW56"
+ },
+ {
+ "id": "SBB78",
+ "name": "SDIT1BBB-SBB78"
+ },
+ {
+ "id": "DCC3",
+ "name": "POIUYTGH-DCC3"
+ },
+ {
+ "id": "GNV1",
+ "name": "GNVLSCTL-GNV1"
+ },
+ {
+ "id": "WAS1",
+ "name": "WASHDCSW-WAS1"
+ },
+ {
+ "id": "TOY1",
+ "name": "TORYONNZ-TOY1"
+ },
+ {
+ "id": "STT1",
+ "name": "STTLWA02-STT1"
+ },
+ {
+ "id": "STG1",
+ "name": "STTGGE62-STG1"
+ },
+ {
+ "id": "SLL78",
+ "name": "SDCTLLL1-SLL78"
+ },
+ {
+ "id": "SBU78",
+ "name": "SDIT1BUB-SBU78"
+ },
+ {
+ "id": "ATL2",
+ "name": "ATLNGANW-ATL2"
+ },
+ {
+ "id": "BOT1",
+ "name": "BOTHWAKY-BOT1"
+ },
+ {
+ "id": "SNG1",
+ "name": "SNGPSIAU-SNG1"
+ },
+ {
+ "id": "NYC1",
+ "name": "NYCMNY54-NYC1"
+ },
+ {
+ "id": "LAG1b",
+ "name": "LARGIZON-LAG1b"
+ },
+ {
+ "id": "AMD15",
+ "name": "AMDFAA01-AMD15"
+ },
+ {
+ "id": "SNA1",
+ "name": "SNANTXCA-SNA1"
+ },
+ {
+ "id": "PLT1",
+ "name": "PLTNCA60-PLT1"
+ },
+ {
+ "id": "TLP1",
+ "name": "TLPNXM18-TLP1"
+ },
+ {
+ "id": "SDD81",
+ "name": "SAIT1DD6-SDD81"
+ },
+ {
+ "id": "DCC1",
+ "name": "POIUYTGH-DCC1"
+ },
+ {
+ "id": "DCC2",
+ "name": "POIUYTGH-DCC2"
+ },
+ {
+ "id": "OKC1",
+ "name": "OKCBOK55-OKC1"
+ },
+ {
+ "id": "PAR1",
+ "name": "PARSFRCG-PAR1"
+ },
+ {
+ "id": "TES36",
+ "name": "ABCEETES-TES36"
+ },
+ {
+ "id": "COM1",
+ "name": "PLMKOPIU-COM1"
+ },
+ {
+ "id": "ANI1",
+ "name": "ATLNGTRE-ANI1"
+ },
+ {
+ "id": "SDG78",
+ "name": "SDIT1BDG-SDG78"
+ },
+ {
+ "id": "mac20",
+ "name": "PKGTESTF-mac20"
+ },
+ {
+ "id": "DSF45",
+ "name": "DSFBG123-DSF45"
+ },
+ {
+ "id": "HST25",
+ "name": "HSTNTX01-HST25"
+ },
+ {
+ "id": "AMD18",
+ "name": "AUDIMA01-AMD18"
+ },
+ {
+ "id": "SAA80",
+ "name": "SAIT9AA3-SAA80"
+ },
+ {
+ "id": "SSA56",
+ "name": "SSIT2AA7-SSA56"
+ },
+ {
+ "id": "SDD82",
+ "name": "SAIT1DD9-SDD82"
+ },
+ {
+ "id": "JCV1",
+ "name": "JCVLFLBW-JCV1"
+ },
+ {
+ "id": "SUL2",
+ "name": "WERTYUJK-SUL2"
+ },
+ {
+ "id": "PUR1",
+ "name": "purelyde-PUR1"
+ },
+ {
+ "id": "FDE55",
+ "name": "FDERT555-FDE55"
+ },
+ {
+ "id": "SITE",
+ "name": "LONEENCO-SITE"
+ },
+ {
+ "id": "ATL1",
+ "name": "ATLNGAMA-ATL1"
+ },
+ {
+ "id": "JUL1",
+ "name": "ZXCVBNMM-JUL1"
+ },
+ {
+ "id": "TAT34",
+ "name": "TESAAISB-TAT34"
+ },
+ {
+ "id": "XCP12",
+ "name": "CHKGH123-XCP12"
+ },
+ {
+ "id": "RAI1",
+ "name": "poiuytre-RAI1"
+ },
+ {
+ "id": "HPO1",
+ "name": "ATLNGAUP-HPO1"
+ },
+ {
+ "id": "KJF12",
+ "name": "KJFDH123-KJF12"
+ },
+ {
+ "id": "SCC80",
+ "name": "SAIT9CC3-SCC80"
+ },
+ {
+ "id": "SAA12",
+ "name": "SAIT9AF8-SAA12"
+ },
+ {
+ "id": "SAA14",
+ "name": "SAIT1AA9-SAA14"
+ },
+ {
+ "id": "ATL35",
+ "name": "TTESSAAI-ATL35"
+ },
+ {
+ "id": "CWY1",
+ "name": "CWYMOWBS-CWY1"
+ },
+ {
+ "id": "ATL76",
+ "name": "TELEPAAI-ATL76"
+ },
+ {
+ "id": "DSL12",
+ "name": "DSLFK242-DSL12"
+ },
+ {
+ "id": "ATL53",
+ "name": "AAIATLTE-ATL53"
+ },
+ {
+ "id": "SAA11",
+ "name": "SAIT9AA2-SAA11"
+ },
+ {
+ "id": "ATL62",
+ "name": "TESSASCH-ATL62"
+ },
+ {
+ "id": "AUG1",
+ "name": "ASDFGHJK-AUG1"
+ },
+ {
+ "id": "POI22",
+ "name": "POIUY123-POI22"
+ },
+ {
+ "id": "SAA13",
+ "name": "SAIT1AA9-SAA13"
+ },
+ {
+ "id": "BHY17",
+ "name": "BHYTFRF3-BHY17"
+ },
+ {
+ "id": "LIS1",
+ "name": "HOSTPROF-LIS1"
+ },
+ {
+ "id": "SIP1",
+ "name": "ZXCVBNMK-SIP1"
+ },
+ {
+ "id": "ATL99",
+ "name": "TEESTAAI-ATL43"
+ },
+ {
+ "id": "ATL64",
+ "name": "FORLOAAJ-ATL64"
+ },
+ {
+ "id": "TAT33",
+ "name": "TESAAISA-TAT33"
+ },
+ {
+ "id": "RAD10",
+ "name": "INDIPUNE-RAD10"
+ },
+ {
+ "id": "RTW5",
+ "name": "BHYTFRY4-RTW5"
+ },
+ {
+ "id": "JGS1",
+ "name": "KSJKKKKK-JGS1"
+ },
+ {
+ "id": "ATL98",
+ "name": "TEESTAAI-ATL43"
+ },
+ {
+ "id": "WAN1",
+ "name": "LEIWANGW-WAN1"
+ },
+ {
+ "id": "ATL44",
+ "name": "ATLSANAB-ATL44"
+ },
+ {
+ "id": "RTD2",
+ "name": "BHYTFRk4-RTD2"
+ },
+ {
+ "id": "NIR1",
+ "name": "ORFLMANA-NIR1"
+ },
+ {
+ "id": "ATL75",
+ "name": "SANAAIRE-ATL75"
+ },
+ {
+ "id": "NUM1",
+ "name": "QWERTYUI-NUM1"
+ },
+ {
+ "id": "MTN32",
+ "name": "MDTWNJ21-MTN32"
+ },
+ {
+ "id": "RTZ4",
+ "name": "BHYTFRZ6-RTZ4"
+ },
+ {
+ "id": "ATL56",
+ "name": "ATLSANAC-ATL56"
+ },
+ {
+ "id": "AMS1",
+ "name": "AMSTNLBW-AMS1"
+ },
+ {
+ "id": "RCT1",
+ "name": "AMSTERNL-RCT1"
+ },
+ {
+ "id": "JAN1",
+ "name": "ORFLMATT-JAN1"
+ },
+ {
+ "id": "ABC14",
+ "name": "TESAAISA-ABC14"
+ },
+ {
+ "id": "TAT37",
+ "name": "TESAAISD-TAT37"
+ },
+ {
+ "id": "MIC54",
+ "name": "MICHIGAN-MIC54"
+ },
+ {
+ "id": "ABC11",
+ "name": "ATLSANAI-ABC11"
+ },
+ {
+ "id": "AMF11",
+ "name": "AMDOCS01-AMF11"
+ },
+ {
+ "id": "ATL63",
+ "name": "ATLSANEW-ATL63"
+ },
+ {
+ "id": "ABC12",
+ "name": "ATLSECIA-ABC12"
+ },
+ {
+ "id": "MTN20",
+ "name": "MDTWNJ21-MTN20"
+ },
+ {
+ "id": "ABC15",
+ "name": "AAITESAN-ABC15"
+ },
+ {
+ "id": "AVT1",
+ "name": "AVTRFLHD-AVT1"
+ },
+ {
+ "id": "ATL34",
+ "name": "ATLSANAI-ATL34"
+ }
+ ],
+ "categoryParameters": {
+ "owningEntityList": [
+ {
+ "id": "aaa1",
+ "name": "aaa1"
+ },
+ {
+ "id": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+ "name": "WayneHolland"
+ },
+ {
+ "id": "Melissa",
+ "name": "Melissa"
+ }
+ ],
+ "projectList": [
+ {
+ "id": "WATKINS",
+ "name": "WATKINS"
+ },
+ {
+ "id": "x1",
+ "name": "x1"
+ },
+ {
+ "id": "yyy1",
+ "name": "yyy1"
+ }
+ ],
+ "lineOfBusinessList": [
+ {
+ "id": "ONAP",
+ "name": "ONAP"
+ },
+ {
+ "id": "zzz1",
+ "name": "zzz1"
+ }
+ ],
+ "platformList": [
+ {
+ "id": "platform",
+ "name": "platform"
+ },
+ {
+ "id": "xxx1",
+ "name": "xxx1"
+ }
+ ]
+ },
+ "type": "[LCP_REGIONS_AND_TENANTS] Update",
+ "subscribers": [
+ {
+ "id": "CAR_2020_ER",
+ "name": "CAR_2020_ER",
+ "isPermitted": true
+ },
+ {
+ "id": "21014aa2-526b-11e6-beb8-9e71128cae77",
+ "name": "JULIO ERICKSON",
+ "isPermitted": false
+ },
+ {
+ "id": "DHV1707-TestSubscriber-2",
+ "name": "DALE BRIDGES",
+ "isPermitted": false
+ },
+ {
+ "id": "DHV1707-TestSubscriber-1",
+ "name": "LLOYD BRIDGES",
+ "isPermitted": false
+ },
+ {
+ "id": "jimmy-example",
+ "name": "JimmyExampleCust-20161102",
+ "isPermitted": false
+ },
+ {
+ "id": "jimmy-example2",
+ "name": "JimmyExampleCust-20161103",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-TestSub-PWT-102",
+ "name": "ERICA5779-TestSub-PWT-102",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-TestSub-PWT-101",
+ "name": "ERICA5779-TestSub-PWT-101",
+ "isPermitted": false
+ },
+ {
+ "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+ "name": "Emanuel",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-Subscriber-4",
+ "name": "ERICA5779-Subscriber-5",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-TestSub-PWT-103",
+ "name": "ERICA5779-TestSub-PWT-103",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-Subscriber-2",
+ "name": "ERICA5779-Subscriber-2",
+ "isPermitted": false
+ },
+ {
+ "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "name": "SILVIA ROBBINS",
+ "isPermitted": true
+ },
+ {
+ "id": "ERICA5779-Subscriber-3",
+ "name": "ERICA5779-Subscriber-3",
+ "isPermitted": false
+ },
+ {
+ "id": "31739f3e-526b-11e6-beb8-9e71128cae77",
+ "name": "CRAIG/ROBERTS",
+ "isPermitted": false
+ }
+ ]
+ }
+ }
+ }
+}
+
+class MockFeatureFlagsService {}
+
+describe('Service Control Generator', () => {
+ let injector;
+ let service: ServiceControlGenerator;
+ let httpMock: HttpTestingController;
+
+
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+ imports: [HttpClientTestingModule],
+ providers: [ServiceControlGenerator,
+ GenericFormService,
+ BasicControlGenerator,
+ AaiService,
+ FormBuilder,
+ LogService,
+ {provide:FeatureFlagsService, useClass: MockFeatureFlagsService},
+ {provide: NgRedux, useClass: MockAppStore}]
+ });
+ await TestBed.compileComponents();
+
+ injector = getTestBed();
+ service = injector.get(ServiceControlGenerator);
+ httpMock = injector.get(HttpTestingController);
+
+ })().then(done).catch(done.fail));
+
+
+ test('ServiceControlGenerator should return the correct controls with correct order', () => {
+ const serviceId : string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44";
+ const controls :FormControlModel[] = service.getMacroFormControls(serviceId);
+ const globalSubscriberIdControl : DropdownFormControl = <DropdownFormControl>controls.find(item => item.controlName === FormControlNames.GLOBAL_SUBSCRIBER_ID);
+
+ expect(globalSubscriberIdControl.validations.find(val => val.validatorName === ValidatorOptions.required)).toBeDefined();
+ expect(globalSubscriberIdControl.dataTestId).toEqual('subscriberName');
+ expect(globalSubscriberIdControl.type).toEqual(FormControlType.DROPDOWN);
+ expect(globalSubscriberIdControl.isDisabled).toBeFalsy();
+ expect(globalSubscriberIdControl.placeHolder).toEqual('Select Subscriber Name');
+ expect(globalSubscriberIdControl.displayName).toEqual('Subscriber name');
+ expect(globalSubscriberIdControl.onInit).toBeDefined();
+ expect(globalSubscriberIdControl.onChange).toBeDefined();
+
+ const serviceTypeControl : DropdownFormControl = <DropdownFormControl>controls.find(item => item.controlName === FormControlNames.SUBSCRIPTION_SERVICE_TYPE);
+ expect(serviceTypeControl.validations.find(val => val.validatorName === ValidatorOptions.required)).toBeDefined();
+ expect(serviceTypeControl.dataTestId).toEqual('serviceType');
+ expect(serviceTypeControl.type).toEqual(FormControlType.DROPDOWN);
+ expect(serviceTypeControl.isDisabled).toBeTruthy();
+ expect(serviceTypeControl.placeHolder).toEqual('Select Service Type');
+ expect(serviceTypeControl.displayName).toEqual('Service type');
+ expect(serviceTypeControl.onInit).toBeDefined();
+ expect(serviceTypeControl.onChange).toBeDefined();
+
+ const productFamilyControl : DropdownFormControl = <DropdownFormControl>controls.find(item => item.controlName === FormControlNames.PRODUCT_FAMILY_ID);
+ expect(productFamilyControl.validations.find(val => val.validatorName === ValidatorOptions.required)).toBeDefined();
+ expect(productFamilyControl.dataTestId).toEqual('productFamily');
+ expect(productFamilyControl.type).toEqual(FormControlType.DROPDOWN);
+ expect(productFamilyControl.isDisabled).toBeFalsy();
+ expect(productFamilyControl.placeHolder).toEqual('Select Product Family');
+ expect(productFamilyControl.displayName).toEqual('Product family');
+ expect(productFamilyControl.onInit).toBeDefined();
+
+ const lcpRegionControl : DropdownFormControl = <DropdownFormControl>controls.find(item => item.controlName === FormControlNames.LCPCLOUD_REGION_ID);
+ expect(lcpRegionControl.validations.find(val => val.validatorName === ValidatorOptions.required)).toBeDefined();
+ expect(lcpRegionControl.dataTestId).toEqual('lcpRegion');
+ expect(lcpRegionControl.type).toEqual(FormControlType.DROPDOWN);
+ expect(lcpRegionControl.isDisabled).toBeTruthy();
+ expect(lcpRegionControl.placeHolder).toEqual('Select LCP Region');
+ expect(lcpRegionControl.displayName).toEqual('LCP region');
+ expect(lcpRegionControl.onInit).toBeDefined();
+ expect(lcpRegionControl.onChange).toBeDefined();
+
+ const tenantControl : DropdownFormControl = <DropdownFormControl>controls.find(item => item.controlName === FormControlNames.TENANT_ID);
+ expect(tenantControl.validations.find(val => val.validatorName === ValidatorOptions.required)).toBeDefined();
+ expect(tenantControl.dataTestId).toEqual('tenant');
+ expect(tenantControl.type).toEqual(FormControlType.DROPDOWN);
+ expect(tenantControl.isDisabled).toBeTruthy();
+ expect(tenantControl.placeHolder).toEqual('Select Tenant');
+ expect(tenantControl.displayName).toEqual('Tenant');
+ expect(tenantControl.onInit).toBeDefined();
+ expect(tenantControl.onChange).toBeDefined();
+
+ const instanceNameControl: FormControlModel = <FormControlModel>controls.find(item => item.controlName === FormControlNames.INSTANCE_NAME);
+ const instanceNameValidator: ValidatorModel = instanceNameControl.validations.find(val => val.validatorName === ValidatorOptions.pattern);
+ expect(instanceNameValidator.validatorArg).toEqual(/^[a-zA-Z0-9._-]*$/);
+ });
+
+
+ test('getMacroFormControls should return the correct order of controls', () => {
+ // Order the fields
+ // 1. Instance name
+ // 2. Subscriber name
+ // 3. Service type
+ // 4. Owning entity (fix Entity to entity)
+ // 5. Product family
+ // 6. LCP region
+ // 7. Tenant
+ // 8. AIC zone (fix Zone to zone)
+ // 9. Pause on pause points
+ // 10. Project
+ // 11. Rollback on failure
+ const serviceId : string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44";
+ const controls :FormControlModel[] = service.getMacroFormControls(serviceId);
+
+
+
+ const controlsOrderNames = [
+ FormControlNames.INSTANCE_NAME,
+ FormControlNames.GLOBAL_SUBSCRIBER_ID,
+ FormControlNames.SUBSCRIPTION_SERVICE_TYPE ,
+ FormControlNames.OWNING_ENTITY_ID ,
+ FormControlNames.PRODUCT_FAMILY_ID ,
+ FormControlNames.LCPCLOUD_REGION_ID ,
+ FormControlNames.TENANT_ID ,
+ FormControlNames.AICZONE_ID ,
+ FormControlNames.PAUSE,
+ FormControlNames.PROJECT_NAME ,
+ FormControlNames.ROLLBACK_ON_FAILURE];
+ expect(controls.length).toEqual(11);
+ for(let i = 0 ; i < controls.length ; i++){
+ expect(controls[i].controlName).toEqual(controlsOrderNames[i]);
+ }
+ });
+
+ test('getAlacartFormControls should return the correct order of controls', () => {
+ // Order the fields
+ // 1. Instance name
+ // 2. Subscriber name
+ // 3. Service type
+ // 4. Owning entity (fix Entity to entity)
+ // 5. Project
+ // 6. Rollback on failure
+ const serviceId : string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44";
+ const controls :FormControlModel[] = service.getAlaCartControls(serviceId);
+ const controlsOrderNames = [
+ FormControlNames.INSTANCE_NAME,
+ FormControlNames.GLOBAL_SUBSCRIBER_ID,
+ FormControlNames.SUBSCRIPTION_SERVICE_TYPE ,
+ FormControlNames.OWNING_ENTITY_ID ,
+ FormControlNames.PROJECT_NAME ,
+ FormControlNames.ROLLBACK_ON_FAILURE];
+
+ expect(controls.length).toEqual(6);
+ for(let i = 0 ; i < controls.length ; i++){
+ expect(controls[i].controlName).toEqual(controlsOrderNames[i]);
+ }
+ });
+
+});
+
diff --git a/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/service.control.generator.ts b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/service.control.generator.ts
new file mode 100644
index 000000000..539f848d5
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/service.control.generator.ts
@@ -0,0 +1,331 @@
+import {Injectable} from "@angular/core";
+import {GenericFormService} from "../generic-form.service";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../../store/reducers";
+import {
+ FormControlModel,
+ ValidatorModel,
+ ValidatorOptions
+} from "../../../models/formControlModels/formControl.model";
+import {DropdownFormControl} from "../../../models/formControlModels/dropdownFormControl.model";
+import * as _ from 'lodash';
+import {BasicControlGenerator} from "./basic.control.generator";
+import {AaiService} from "../../../services/aaiService/aai.service";
+import {FormGroup} from "@angular/forms";
+import {FormControlType} from "../../../models/formControlModels/formControlTypes.enum";
+import {HttpClient} from "@angular/common/http";
+import {SelectOption} from "../../../models/selectOption";
+import {Observable} from "rxjs";
+import {LogService} from "../../../utils/log/log.service";
+import {ServiceModel} from "../../../models/serviceModel";
+import {of} from "rxjs";
+
+import {CheckboxFormControl} from "../../../models/formControlModels/checkboxFormControl.model";
+
+export enum FormControlNames {
+ INSTANCE_NAME = 'instanceName',
+ GLOBAL_SUBSCRIBER_ID = 'globalSubscriberId',
+ SUBSCRIPTION_SERVICE_TYPE = 'subscriptionServiceType',
+ PRODUCT_FAMILY_ID = 'productFamilyId',
+ LCPCLOUD_REGION_ID = 'lcpCloudRegionId',
+ TENANT_ID = 'tenantId',
+ AICZONE_ID = 'aicZoneId',
+ PROJECT_NAME = 'projectName',
+ OWNING_ENTITY_ID = 'owningEntityId',
+ ROLLBACK_ON_FAILURE = 'rollbackOnFailure',
+ PAUSE = 'pause'
+}
+
+@Injectable()
+export class ServiceControlGenerator {
+ aaiService : AaiService;
+ constructor(private genericFormService : GenericFormService,
+ private _basicControlGenerator : BasicControlGenerator,
+ private store: NgRedux<AppState>,
+ private http: HttpClient,
+ private _aaiService : AaiService,
+ private _logService : LogService){
+ this.aaiService = _aaiService;
+ }
+
+ getServiceInstance = (serviceId : string) : any => {
+ let serviceInstance = null;
+ if (_.has(this.store.getState().service.serviceInstance, serviceId)) {
+ serviceInstance = Object.assign({}, this.store.getState().service.serviceInstance[serviceId]);
+ }
+
+ return serviceInstance;
+ };
+
+ getAlaCartControls(serviceId: string, dynamicInputs?: any[]) : FormControlModel[] {
+ if(_.isNil(serviceId)){
+ this._logService.error('should provide serviceId', serviceId);
+ return [];
+ }
+ const serviceInstance = this.getServiceInstance(serviceId);
+
+ let result : FormControlModel[] = [];
+
+ const serviceModel = new ServiceModel(this.store.getState().service.serviceHierarchy[serviceId]);
+ if(!_.isNil(serviceModel)){
+ result.push(this._basicControlGenerator.getInstanceName(serviceInstance, serviceId, serviceModel.isEcompGeneratedNaming));
+ result.push(this.getGlobalSubscriberControl(serviceInstance, result));
+ result.push(this.getServiceTypeControl(serviceInstance, result, false));
+ result.push(this.getOwningEntityControl(serviceInstance, result));
+ result.push(this.getProjectControl(serviceInstance, result));
+ result.push(this.getRollbackOnFailureControl(serviceInstance, result));
+ }
+
+ this._logService.info('Generate dynamic service controls, is edit mode: ' + serviceInstance != null , result);
+ return result;
+ }
+
+ getMacroFormControls(serviceId: string, dynamicInputs?: any[]) : FormControlModel[] {
+ if(_.isNil(serviceId)){
+ this._logService.error('should provide serviceId', serviceId);
+ return [];
+ }
+
+ const serviceInstance = this.getServiceInstance(serviceId);
+
+ let result : FormControlModel[] = [];
+ const serviceModel = new ServiceModel(this.store.getState().service.serviceHierarchy[serviceId]);
+ if(!_.isNil(serviceModel)){
+ result.push(this._basicControlGenerator.getInstanceName(serviceInstance, serviceId, serviceModel.isEcompGeneratedNaming));
+ result.push(this.getGlobalSubscriberControl(serviceInstance, result));
+ result.push(this.getServiceTypeControl(serviceInstance, result, true));
+ result.push(this.getOwningEntityControl(serviceInstance, result));
+ result.push(this.getProductFamilyControl(serviceInstance, result));
+ result.push(this.getLcpRegionControl(serviceInstance, result));
+ result.push(this.getTenantControl(serviceInstance, result),);
+ result.push(this.getAICZoneControl(serviceInstance, result));
+
+ if(serviceModel.isMultiStepDesign){
+ result.push(new CheckboxFormControl({
+ controlName : FormControlNames.PAUSE,
+ displayName : 'Pause on pause points',
+ dataTestId : 'Pause',
+ isDisabled : false,
+ validations : [new ValidatorModel(ValidatorOptions.required, 'is required')],
+ value : serviceInstance ? serviceInstance.pause : null,
+ }));
+ }
+
+ result.push(this.getProjectControl(serviceInstance, result));
+ result.push(this.getRollbackOnFailureControl(serviceInstance, result));
+ }
+
+
+ this._logService.info('Generate dynamic service controls, is edit mode: ' + serviceInstance != null , result);
+ return result;
+ }
+
+ getRollBackOnFailureOptions = () : Observable<SelectOption[]> =>{
+ return of([
+ new SelectOption({id: 'true', name: 'Rollback'}),
+ new SelectOption({id: 'false', name: 'Don\'t Rollback'})
+ ]);
+ };
+
+ getGlobalSubscriberControl = (serviceInstance : any, controls : FormControlModel[]) : DropdownFormControl => {
+ return new DropdownFormControl({
+ type : FormControlType.DROPDOWN,
+ controlName : FormControlNames.GLOBAL_SUBSCRIBER_ID,
+ displayName : 'Subscriber name',
+ dataTestId : 'subscriberName',
+ placeHolder : 'Select Subscriber Name',
+ isDisabled : false,
+ name : "subscriber-name-select",
+ value : serviceInstance ? serviceInstance.globalSubscriberId : null,
+ validations : [new ValidatorModel(ValidatorOptions.required, 'is required')],
+ onInit : this._basicControlGenerator.getSubscribeInitResult.bind(this._aaiService, this.aaiService.getSubscribers),
+ onChange : (param: string, form : FormGroup) => {
+ form.controls[FormControlNames.SUBSCRIPTION_SERVICE_TYPE].reset();
+ if(!_.isNil(param)){
+ form.controls[FormControlNames.SUBSCRIPTION_SERVICE_TYPE].enable();
+ this._basicControlGenerator.getSubscribeResult.bind(this, this._aaiService.getServiceTypes(param).subscribe(res =>{
+ controls.find(item => item.controlName === FormControlNames.SUBSCRIPTION_SERVICE_TYPE)['options$'] = res;
+ }));
+ }
+ else {
+ form.controls[FormControlNames.SUBSCRIPTION_SERVICE_TYPE].disable();
+ }
+ }
+ })
+ };
+
+ getServiceTypeControl = (serviceInstance : any, controls : FormControlModel[], isMacro?: boolean) : DropdownFormControl => {
+ return new DropdownFormControl({
+ type : FormControlType.DROPDOWN,
+ controlName : FormControlNames.SUBSCRIPTION_SERVICE_TYPE,
+ displayName : 'Service type',
+ dataTestId : 'serviceType',
+ placeHolder : 'Select Service Type',
+ selectedField : 'name',
+ name : "service-type",
+ isDisabled : _.isNil(serviceInstance),
+ value : serviceInstance ? serviceInstance.subscriptionServiceType : null,
+ validations : [new ValidatorModel(ValidatorOptions.required, 'is required')],
+ onInit : serviceInstance ? this._basicControlGenerator.getSubscribeInitResult.bind(
+ this._aaiService,
+ this.aaiService.getServiceTypes.bind(this, serviceInstance.globalSubscriberId)) : ()=>{},
+ onChange : (param: string, form : FormGroup) => {
+ if(isMacro){
+ form.controls[FormControlNames.LCPCLOUD_REGION_ID].reset();
+ if(!_.isNil(param)) {
+ form.controls[FormControlNames.LCPCLOUD_REGION_ID].enable();
+ const globalCustomerId: string = form.controls[FormControlNames.GLOBAL_SUBSCRIBER_ID].value;
+ if (!_.isNil(globalCustomerId)) {
+ this._basicControlGenerator.getSubscribeResult.bind(this, this._aaiService.getLcpRegionsAndTenants(globalCustomerId, param).subscribe(res => {
+ controls.find(item => item.controlName === FormControlNames.LCPCLOUD_REGION_ID)['options$'] = res.lcpRegionList;
+ }));
+ }
+ }
+ else {
+ form.controls[FormControlNames.LCPCLOUD_REGION_ID].disable();
+ }
+ }
+
+ }
+ })
+ };
+
+ getOwningEntityControl = (serviceInstance : any, controls : FormControlModel[]) : DropdownFormControl => {
+ return new DropdownFormControl({
+ type : FormControlType.DROPDOWN,
+ controlName : FormControlNames.OWNING_ENTITY_ID,
+ displayName : 'Owning entity',
+ dataTestId : 'owningEntity',
+ placeHolder : 'Select Owning Entity',
+ name :"owningEntity",
+ isDisabled : false,
+ validations : [new ValidatorModel(ValidatorOptions.required, 'is required'),],
+ onInitSelectedField : ['owningEntityList'],
+ value : serviceInstance ? serviceInstance.owningEntityId : null,
+ onInit : this._basicControlGenerator.getSubscribeInitResult.bind(null, this._aaiService.getCategoryParameters)
+ })
+ };
+
+ getProductFamilyControl = (serviceInstance : any, controls : FormControlModel[]) : DropdownFormControl => {
+ return new DropdownFormControl({
+ type : FormControlType.DROPDOWN,
+ controlName : FormControlNames.PRODUCT_FAMILY_ID,
+ displayName : 'Product family',
+ dataTestId : 'productFamily',
+ placeHolder : 'Select Product Family',
+ isDisabled : false,
+ name : "product-family-select",
+ value : serviceInstance ? serviceInstance.productFamilyId : null,
+ validations : [new ValidatorModel(ValidatorOptions.required, 'is required')],
+ onInit : this._basicControlGenerator.getSubscribeResult.bind(this, this._aaiService.getProductFamilies),
+ })
+ };
+
+ getLcpRegionControl = (serviceInstance : any, controls : FormControlModel[]) : DropdownFormControl => {
+ return new DropdownFormControl({
+ type : FormControlType.DROPDOWN,
+ controlName : FormControlNames.LCPCLOUD_REGION_ID,
+ displayName : 'LCP region',
+ dataTestId : 'lcpRegion',
+ placeHolder : 'Select LCP Region',
+ name : "lcpRegion",
+ isDisabled : _.isNil(serviceInstance),
+ value : serviceInstance ? serviceInstance.lcpCloudRegionId : null,
+ validations : [new ValidatorModel(ValidatorOptions.required, 'is required')],
+ onInitSelectedField : ['lcpRegionList'],
+ onInit : serviceInstance ? this._basicControlGenerator.getSubscribeInitResult.bind(
+ this._aaiService,
+ this.aaiService.getLcpRegionsAndTenants.bind(this, serviceInstance.globalSubscriberId, serviceInstance.subscriptionServiceType)) : ()=>{},
+ onChange : (param: string, form : FormGroup) => {
+ form.controls[FormControlNames.TENANT_ID].reset();
+ if(param) {
+ form.controls[FormControlNames.TENANT_ID].enable();
+ }
+ else {
+ form.controls[FormControlNames.TENANT_ID].disable();
+ }
+ const globalCustomerId : string = form.controls[FormControlNames.GLOBAL_SUBSCRIBER_ID].value;
+ const serviceType : string = form.controls[FormControlNames.SUBSCRIPTION_SERVICE_TYPE].value;
+ if(!_.isNil(globalCustomerId) && !_.isNil(serviceType)){
+ this._basicControlGenerator.getSubscribeResult.bind(this, this._aaiService.getLcpRegionsAndTenants(globalCustomerId, serviceType).subscribe(res =>{
+ controls.find(item => item.controlName === FormControlNames.TENANT_ID)['options$'] = res.lcpRegionsTenantsMap[param];
+ }));
+ }
+ }
+ })
+ };
+
+ getTenantControl = (serviceInstance : any, controls : FormControlModel[]) : DropdownFormControl => {
+ return new DropdownFormControl({
+ type : FormControlType.DROPDOWN,
+ controlName : FormControlNames.TENANT_ID,
+ displayName : 'Tenant',
+ dataTestId : 'tenant',
+ placeHolder : 'Select Tenant',
+ name : "tenant",
+ isDisabled : _.isNil(serviceInstance),
+ onInitSelectedField :serviceInstance ? ['lcpRegionsTenantsMap', serviceInstance.lcpCloudRegionId] : null,
+ onInit : serviceInstance ? this._basicControlGenerator.getSubscribeInitResult.bind(
+ this._aaiService,
+ this.aaiService.getLcpRegionsAndTenants.bind(this, serviceInstance.globalSubscriberId, serviceInstance.subscriptionServiceType)) : ()=>{},
+ value : serviceInstance ? serviceInstance.tenantId : null,
+ validations : [new ValidatorModel(ValidatorOptions.required, 'is required')],
+ })
+ };
+
+ getAICZoneControl = (serviceInstance : any, controls : FormControlModel[]) : DropdownFormControl => {
+ return new DropdownFormControl({
+ type : FormControlType.DROPDOWN,
+ controlName : FormControlNames.AICZONE_ID,
+ displayName : 'AIC zone',
+ dataTestId : 'aic_zone',
+ placeHolder : 'Select AIC zone',
+ name : "aicZone",
+ value : serviceInstance ? serviceInstance.aicZoneId : null,
+ isDisabled : false,
+ validations : [],
+ onInit : this._basicControlGenerator.getSubscribeInitResult.bind(null, this._aaiService.getAicZones)
+ })
+ };
+
+ getPauseControl = (serviceInstance : any, controls : FormControlModel[]) :CheckboxFormControl => {
+ return new CheckboxFormControl({
+ controlName : FormControlNames.PAUSE,
+ displayName : 'Pause on pause points',
+ dataTestId : 'Pause',
+ isDisabled : false,
+ value : serviceInstance ? serviceInstance.pause : null,
+ })
+ };
+
+ getProjectControl = (serviceInstance : any, controls : FormControlModel[]) :DropdownFormControl =>{
+ return new DropdownFormControl({
+ type : FormControlType.DROPDOWN,
+ controlName : FormControlNames.PROJECT_NAME,
+ displayName : 'Project',
+ dataTestId : 'project',
+ placeHolder : 'Select Project',
+ name : "project",
+ isDisabled : false,
+ validations : [],
+ value : serviceInstance ? serviceInstance.projectName : null,
+ onInitSelectedField : ['projectList'],
+ onInit : this._basicControlGenerator.getSubscribeInitResult.bind(null, this._aaiService.getCategoryParameters)
+ })
+ };
+
+ getRollbackOnFailureControl = (serviceInstance : any, controls : FormControlModel[]) : DropdownFormControl => {
+ return new DropdownFormControl({
+ type : FormControlType.DROPDOWN,
+ controlName : FormControlNames.ROLLBACK_ON_FAILURE,
+ displayName : 'Rollback on failure',
+ dataTestId : 'rollback',
+ isDisabled : false,
+ validations : [new ValidatorModel(ValidatorOptions.required, 'is required')],
+ value : serviceInstance ? serviceInstance.rollbackOnFailure : 'true',
+ onInit : this._basicControlGenerator.getSubscribeInitResult.bind(null, this.getRollBackOnFailureOptions)
+ })
+ };
+}
+
+
diff --git a/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator.spec.ts b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator.spec.ts
new file mode 100644
index 000000000..36be1bdfa
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator.spec.ts
@@ -0,0 +1,2008 @@
+import {getTestBed, TestBed} from '@angular/core/testing';
+import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing';
+import {NgRedux} from '@angular-redux/store';
+import {BasicControlGenerator} from "../basic.control.generator";
+import {AaiService} from "../../../../services/aaiService/aai.service";
+import {GenericFormService} from "../../generic-form.service";
+import {FormBuilder} from "@angular/forms";
+import {LogService} from "../../../../utils/log/log.service";
+import {
+ FormControlModel,
+ ValidatorModel,
+ ValidatorOptions
+} from "../../../../models/formControlModels/formControl.model";
+import {FormControlNames, VfModuleControlGenerator} from "./vfModule.control.generator";
+import {FeatureFlagsService} from "../../../../services/featureFlag/feature-flags.service";
+
+class MockAppStore<T> {
+ getState() {
+ return {
+ "global": {
+ "name": null,
+ "flags": {
+ "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false,
+ "FLAG_SHOW_ASSIGNMENTS": true,
+ "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
+ "FLAG_UNASSIGN_SERVICE": true,
+ "FLAG_SHOW_VERIFY_SERVICE": false,
+ "FLAG_COLLECTION_RESOURCE_SUPPORT": true,
+ "FLAG_DUPLICATE_VNF": true,
+ "FLAG_SERVICE_MODEL_CACHE": true,
+ "CREATE_INSTANCE_TEST": false,
+ "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false,
+ "FLAG_ASYNC_INSTANTIATION": true,
+ "FLAG_ASYNC_JOBS": true,
+ "EMPTY_DRAWING_BOARD_TEST": false,
+ "FLAG_ADD_MSO_TESTAPI_FIELD": true
+ },
+ "type": "[FLAGS] Update"
+ },
+ "service": {
+ "serviceHierarchy": {
+ "6e59c5de-f052-46fa-aa7e-2fca9d674c44": {
+ "service": {
+ "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "name": "ComplexService",
+ "version": "1.0",
+ "toscaModelURL": null,
+ "category": "Emanuel",
+ "serviceType": "",
+ "serviceRole": "",
+ "description": "ComplexService",
+ "serviceEcompNaming": "false",
+ "instantiationType": "Macro",
+ "inputs": {}
+ },
+ "vnfs": {
+ "VF_vMee 0": {
+ "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60",
+ "invariantUuid": "4160458e-f648-4b30-a176-43881ffffe9e",
+ "description": "VSP_vMee",
+ "name": "VF_vMee",
+ "version": "2.0",
+ "customizationUuid": "91415b44-753d-494c-926a-456a9172bbb9",
+ "inputs": {},
+ "commands": {},
+ "serviceEcompNaming" : "true",
+ "properties": {
+ "ecomp_generated_naming": "false",
+ "max_instances": 10,
+ "min_instances": 1,
+ "gpb2_Internal2_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-ipv6-egress_src_start_port": "0",
+ "sctp-a-ipv6-egress_rule_application": "any",
+ "Internal2_allow_transit": "true",
+ "sctp-b-IPv6_ethertype": "IPv6",
+ "sctp-a-egress_rule_application": "any",
+ "sctp-b-ingress_action": "pass",
+ "sctp-b-ingress_rule_protocol": "icmp",
+ "ncb2_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-ipv6-ingress-src_start_port": "0.0",
+ "ncb1_Internal2_mac": "00:11:22:EF:AC:DF",
+ "fsb_volume_size_0": "320.0",
+ "sctp-b-egress_src_addresses": "local",
+ "sctp-a-ipv6-ingress_ethertype": "IPv4",
+ "sctp-a-ipv6-ingress-dst_start_port": "0",
+ "sctp-b-ipv6-ingress_rule_application": "any",
+ "domain_name": "default-domain",
+ "sctp-a-ingress_rule_protocol": "icmp",
+ "sctp-b-egress-src_start_port": "0.0",
+ "sctp-a-egress_src_addresses": "local",
+ "sctp-b-display_name": "epc-sctp-b-ipv4v6-sec-group",
+ "sctp-a-egress-src_start_port": "0.0",
+ "sctp-a-ingress_ethertype": "IPv4",
+ "sctp-b-ipv6-ingress-dst_end_port": "65535",
+ "sctp-b-dst_subnet_prefix_v6": "::",
+ "nf_naming": "{ecomp_generated_naming=true}",
+ "sctp-a-ipv6-ingress_src_subnet_prefix": "0.0.0.0",
+ "sctp-b-egress-dst_start_port": "0.0",
+ "ncb_flavor_name": "nv.c20r64d1",
+ "gpb1_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-egress_dst_subnet_prefix_len": "0.0",
+ "Internal2_net_cidr": "10.0.0.10",
+ "sctp-a-ingress-dst_start_port": "0.0",
+ "sctp-a-egress-dst_start_port": "0.0",
+ "fsb1_Internal2_mac": "00:11:22:EF:AC:DF",
+ "sctp-a-egress_ethertype": "IPv4",
+ "vlc_st_service_mode": "in-network-nat",
+ "sctp-a-ipv6-egress_ethertype": "IPv4",
+ "sctp-a-egress-src_end_port": "65535.0",
+ "sctp-b-ipv6-egress_rule_application": "any",
+ "sctp-b-egress_action": "pass",
+ "sctp-a-ingress-src_subnet_prefix_len": "0.0",
+ "sctp-b-ipv6-ingress-src_end_port": "65535.0",
+ "sctp-b-name": "epc-sctp-b-ipv4v6-sec-group",
+ "fsb2_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-a-ipv6-ingress-src_start_port": "0.0",
+ "sctp-b-ipv6-egress_ethertype": "IPv4",
+ "Internal1_net_cidr": "10.0.0.10",
+ "sctp-a-egress_dst_subnet_prefix": "0.0.0.0",
+ "fsb_flavor_name": "nv.c20r64d1",
+ "sctp_rule_protocol": "132",
+ "sctp-b-ipv6-ingress_src_subnet_prefix_len": "0",
+ "sctp-a-ipv6-ingress_rule_application": "any",
+ "sctp-a-IPv6_ethertype": "IPv6",
+ "vlc2_Internal1_mac": "00:11:22:EF:AC:DF",
+ "vlc_st_virtualization_type": "virtual-machine",
+ "sctp-b-ingress-dst_start_port": "0.0",
+ "sctp-b-ingress-dst_end_port": "65535.0",
+ "sctp-a-ipv6-ingress-src_end_port": "65535.0",
+ "sctp-a-display_name": "epc-sctp-a-ipv4v6-sec-group",
+ "sctp-b-ingress_rule_application": "any",
+ "int2_sec_group_name": "int2-sec-group",
+ "vlc_flavor_name": "nd.c16r64d1",
+ "sctp-b-ipv6-egress_src_addresses": "local",
+ "vlc_st_interface_type_int1": "other1",
+ "sctp-b-egress-src_end_port": "65535.0",
+ "sctp-a-ipv6-egress-dst_start_port": "0",
+ "vlc_st_interface_type_int2": "other2",
+ "sctp-a-ipv6-egress_rule_protocol": "any",
+ "Internal2_shared": "false",
+ "sctp-a-ipv6-egress_dst_subnet_prefix_len": "0",
+ "Internal2_rpf": "disable",
+ "vlc1_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-ipv6-egress_src_end_port": "65535",
+ "sctp-a-ipv6-egress_src_addresses": "local",
+ "sctp-a-ingress-dst_end_port": "65535.0",
+ "sctp-a-ipv6-egress_src_end_port": "65535",
+ "Internal1_forwarding_mode": "l2",
+ "Internal2_dhcp": "false",
+ "sctp-a-dst_subnet_prefix_v6": "::",
+ "pxe_image_name": "MME_PXE-Boot_16ACP04_GA.qcow2",
+ "vlc_st_interface_type_gtp": "other0",
+ "ncb1_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-src_subnet_prefix_v6": "::",
+ "sctp-a-egress_dst_subnet_prefix_len": "0.0",
+ "int1_sec_group_name": "int1-sec-group",
+ "Internal1_dhcp": "false",
+ "sctp-a-ipv6-egress_dst_end_port": "65535",
+ "Internal2_forwarding_mode": "l2",
+ "fsb2_Internal2_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-egress_dst_subnet_prefix": "0.0.0.0",
+ "Internal1_net_cidr_len": "17",
+ "gpb2_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-ingress-src_subnet_prefix_len": "0.0",
+ "sctp-a-ingress_dst_addresses": "local",
+ "sctp-a-egress_action": "pass",
+ "fsb_volume_type_0": "SF-Default-SSD",
+ "ncb2_Internal2_mac": "00:11:22:EF:AC:DF",
+ "vlc_st_interface_type_sctp_a": "left",
+ "vlc_st_interface_type_sctp_b": "right",
+ "sctp-a-src_subnet_prefix_v6": "::",
+ "vlc_st_version": "2",
+ "sctp-b-egress_ethertype": "IPv4",
+ "sctp-a-ingress_rule_application": "any",
+ "gpb1_Internal2_mac": "00:11:22:EF:AC:DF",
+ "instance_ip_family_v6": "v6",
+ "sctp-a-ipv6-egress_src_start_port": "0",
+ "sctp-b-ingress-src_start_port": "0.0",
+ "sctp-b-ingress_dst_addresses": "local",
+ "fsb1_Internal1_mac": "00:11:22:EF:AC:DF",
+ "vlc_st_interface_type_oam": "management",
+ "multi_stage_design": "true",
+ "oam_sec_group_name": "oam-sec-group",
+ "Internal2_net_gateway": "10.0.0.10",
+ "sctp-a-ipv6-ingress-dst_end_port": "65535",
+ "sctp-b-ipv6-egress-dst_start_port": "0",
+ "Internal1_net_gateway": "10.0.0.10",
+ "sctp-b-ipv6-egress_rule_protocol": "any",
+ "gtp_sec_group_name": "gtp-sec-group",
+ "sctp-a-ipv6-egress_dst_subnet_prefix": "0.0.0.0",
+ "sctp-b-ipv6-egress_dst_subnet_prefix_len": "0",
+ "sctp-a-ipv6-ingress_dst_addresses": "local",
+ "sctp-a-egress_rule_protocol": "icmp",
+ "sctp-b-ipv6-egress_action": "pass",
+ "sctp-a-ipv6-egress_action": "pass",
+ "Internal1_shared": "false",
+ "sctp-b-ipv6-ingress_rule_protocol": "any",
+ "Internal2_net_cidr_len": "17",
+ "sctp-a-name": "epc-sctp-a-ipv4v6-sec-group",
+ "sctp-a-ingress-src_end_port": "65535.0",
+ "sctp-b-ipv6-ingress_src_subnet_prefix": "0.0.0.0",
+ "sctp-a-egress-dst_end_port": "65535.0",
+ "sctp-a-ingress_action": "pass",
+ "sctp-b-egress_rule_protocol": "icmp",
+ "sctp-b-ipv6-ingress_action": "pass",
+ "vlc_st_service_type": "firewall",
+ "sctp-b-ipv6-egress_dst_end_port": "65535",
+ "sctp-b-ipv6-ingress-dst_start_port": "0",
+ "vlc2_Internal2_mac": "00:11:22:EF:AC:DF",
+ "vlc_st_availability_zone": "true",
+ "fsb_volume_image_name_1": "MME_FSB2_16ACP04_GA.qcow2",
+ "sctp-b-ingress-src_subnet_prefix": "0.0.0.0",
+ "sctp-a-ipv6-ingress_src_subnet_prefix_len": "0",
+ "Internal1_allow_transit": "true",
+ "gpb_flavor_name": "nv.c20r64d1",
+ "availability_zone_max_count": "1",
+ "fsb_volume_image_name_0": "MME_FSB1_16ACP04_GA.qcow2",
+ "sctp-b-ipv6-ingress_dst_addresses": "local",
+ "sctp-b-ipv6-egress_dst_subnet_prefix": "0.0.0.0",
+ "sctp-b-ipv6-ingress_ethertype": "IPv4",
+ "vlc1_Internal2_mac": "00:11:22:EF:AC:DF",
+ "sctp-a-ingress-src_subnet_prefix": "0.0.0.0",
+ "sctp-a-ipv6-ingress_action": "pass",
+ "Internal1_rpf": "disable",
+ "sctp-b-ingress_ethertype": "IPv4",
+ "sctp-b-egress_rule_application": "any",
+ "sctp-b-ingress-src_end_port": "65535.0",
+ "sctp-a-ipv6-ingress_rule_protocol": "any",
+ "sctp-a-ingress-src_start_port": "0.0",
+ "sctp-b-egress-dst_end_port": "65535.0"
+ },
+ "type": "VF",
+ "modelCustomizationName": "VF_vMee 0",
+ "vfModules": {
+ "vf_vmee0..VfVmee..vmme_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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..vmme_vlc..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "vmme_vlc"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ },
+ "vf_vmee0..VfVmee..vmme_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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..vmme_gpb..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "vmme_gpb"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "vf_vmee0..VfVmee..base_vmme..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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "base_vmme"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "vf_vmee0..VfVmee..base_vmme..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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "base_vmme"
+ },
+ "inputs": {}
+ }
+ },
+ "vfcInstanceGroups": {}
+ }
+ },
+ "networks": {
+ "ExtVL 0": {
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ "invariantUuid": "379f816b-a7aa-422f-be30-17114ff50b7c",
+ "description": "ECOMP generic virtual link (network) base type for all other service-level and global networks",
+ "name": "ExtVL",
+ "version": "37.0",
+ "customizationUuid": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+ "inputs": {},
+ "commands": {},
+ "properties": {
+ "ecomp_generated_naming": "false",
+ "network_assignments": "{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}",
+ "exVL_naming": "{ecomp_generated_naming=true}",
+ "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}",
+ "network_homing": "{ecomp_selected_instance_node_target=false}"
+ },
+ "type": "VL",
+ "modelCustomizationName": "ExtVL 0"
+ }
+ },
+ "collectionResource": {},
+ "configurations": {
+ "Port Mirroring Configuration By Policy 0": {
+ "uuid": "b4398538-e89d-4f13-b33d-ca323434ba50",
+ "invariantUuid": "6ef0ca40-f366-4897-951f-abd65d25f6f7",
+ "description": "A port mirroring configuration by policy object",
+ "name": "Port Mirroring Configuration By Policy",
+ "version": "27.0",
+ "customizationUuid": "3c3b7b8d-8669-4b3b-8664-61970041fad2",
+ "inputs": {},
+ "commands": {},
+ "properties": {},
+ "type": "Configuration",
+ "modelCustomizationName": "Port Mirroring Configuration By Policy 0",
+ "sourceNodes": [],
+ "collectorNodes": null,
+ "configurationByPolicy": false
+ }
+ },
+ "serviceProxies": {},
+ "vfModules": {
+ "vf_vmee0..VfVmee..vmme_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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..vmme_vlc..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "vmme_vlc"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ },
+ "vf_vmee0..VfVmee..vmme_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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..vmme_gpb..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "vmme_gpb"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "vf_vmee0..VfVmee..base_vmme..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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "base_vmme"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "vf_vmee0..VfVmee..base_vmme..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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "base_vmme"
+ },
+ "inputs": {}
+ }
+ },
+ "pnfs": {}
+ }
+ },
+ "serviceInstance": {
+ "6e59c5de-f052-46fa-aa7e-2fca9d674c44": {
+ "networks": {},
+ "vnfs": {
+ "VF_vMee 0": {
+ "rollbackOnFailure": "true",
+ "vfModules": {
+ "vf_vmee0..VfVmee..base_vmme..module-0": {
+ "vf_vmee0..VfVmee..base_vmme..module-0vmvzo": {
+ "isMissingData": false,
+ "sdncPreReload": null,
+ "modelInfo": {
+ "modelType": "VFmodule",
+ "modelInvariantId": "a6f9e51a-2b35-416a-ae15-15e58d61f36d",
+ "modelVersionId": "a27f5cfc-7f12-4f99-af08-0af9c3885c87",
+ "modelName": "VfVmee..base_vmme..module-0",
+ "modelVersion": "2",
+ "modelCustomizationId": "f8c040f1-7e51-4a11-aca8-acf256cfd861",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0"
+ },
+ "instanceParams": [
+ {}
+ ],
+ "trackById": "wmtm6sy2uj"
+ }
+ }
+ },
+ "isMissingData": true,
+ "originalName": "VF_vMee 0",
+ "vnfStoreKey": "VF_vMee 0",
+ "trackById": "p3wk448m5do",
+ "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60",
+ "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+ "lcpCloudRegionId": null,
+ "tenantId": null,
+ "lineOfBusiness": null,
+ "platformName": null,
+ "modelInfo": {
+ "modelType": "VF",
+ "modelInvariantId": "4160458e-f648-4b30-a176-43881ffffe9e",
+ "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ "modelName": "VF_vMee",
+ "modelVersion": "2.0",
+ "modelCustomizationName": "VF_vMee 0"
+ }
+ }
+ },
+ "instanceParams": [
+ {}
+ ],
+ "validationCounter": 1,
+ "existingNames": {},
+ "existingVNFCounterMap": {
+ "d6557200-ecf2-4641-8094-5393ae3aae60": 1
+ },
+ "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "subscriptionServiceType": "TYLER SILVIA",
+ "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+ "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+ "lcpCloudRegionId": "hvf6",
+ "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+ "aicZoneId": "JAG1",
+ "projectName": "x1",
+ "rollbackOnFailure": "true",
+ "bulkSize": 1,
+ "modelInfo": {
+ "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ "modelName": "ComplexService",
+ "modelVersion": "1.0",
+ "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44"
+ },
+ "isALaCarte": false,
+ "name": "ComplexService",
+ "version": "1.0",
+ "description": "ComplexService",
+ "category": "Emanuel",
+ "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "serviceType": "",
+ "serviceRole": "",
+ "isEcompGeneratedNaming": true,
+ "isMultiStepDesign": false
+ }
+ },
+ "lcpRegionsAndTenants": {
+ "lcpRegionList": [
+ {
+ "id": "JANET25",
+ "name": "JANET25",
+ "isPermitted": true
+ },
+ {
+ "id": "hvf6",
+ "name": "hvf6",
+ "isPermitted": true
+ }
+ ],
+ "lcpRegionsTenantsMap": {
+ "JANET25": [
+ {
+ "id": "092eb9e8e4b7412e8787dd091bc58e86",
+ "name": "USP-SIP-IC-24335-T-01",
+ "isPermitted": true
+ }
+ ],
+ "hvf6": [
+ {
+ "id": "bae71557c5bb4d5aac6743a4e5f1d054",
+ "name": "AIN Web Tool-15-D-testalexandria",
+ "isPermitted": true
+ },
+ {
+ "id": "229bcdc6eaeb4ca59d55221141d01f8e",
+ "name": "AIN Web Tool-15-D-STTest2",
+ "isPermitted": true
+ },
+ {
+ "id": "1178612d2b394be4834ad77f567c0af2",
+ "name": "AIN Web Tool-15-D-SSPtestcustome",
+ "isPermitted": true
+ },
+ {
+ "id": "19c5ade915eb461e8af52fb2fd8cd1f2",
+ "name": "AIN Web Tool-15-D-UncheckedEcopm",
+ "isPermitted": true
+ },
+ {
+ "id": "de007636e25249238447264a988a927b",
+ "name": "AIN Web Tool-15-D-dfsdf",
+ "isPermitted": true
+ },
+ {
+ "id": "62f29b3613634ca6a3065cbe0e020c44",
+ "name": "AIN/SMS-16-D-Multiservices1",
+ "isPermitted": true
+ },
+ {
+ "id": "649289e30d3244e0b48098114d63c2aa",
+ "name": "AIN Web Tool-15-D-SSPST66",
+ "isPermitted": true
+ },
+ {
+ "id": "3f21eeea6c2c486bba31dab816c05a32",
+ "name": "AIN Web Tool-15-D-ASSPST47",
+ "isPermitted": true
+ },
+ {
+ "id": "f60ce21d3ee6427586cff0d22b03b773",
+ "name": "CESAR-100-D-sspjg67246",
+ "isPermitted": true
+ },
+ {
+ "id": "8774659e425f479895ae091bb5d46560",
+ "name": "CESAR-100-D-sspjg68359",
+ "isPermitted": true
+ },
+ {
+ "id": "624eb554b0d147c19ff8885341760481",
+ "name": "AINWebTool-15-D-iftach",
+ "isPermitted": true
+ },
+ {
+ "id": "214f55f5fc414c678059c383b03e4962",
+ "name": "CESAR-100-D-sspjg612401",
+ "isPermitted": true
+ },
+ {
+ "id": "c90666c291664841bb98e4d981ff1db5",
+ "name": "CESAR-100-D-sspjg621340",
+ "isPermitted": true
+ },
+ {
+ "id": "ce5b6bc5c7b348e1bf4b91ac9a174278",
+ "name": "sspjg621351cloned",
+ "isPermitted": true
+ },
+ {
+ "id": "b386b768a3f24c8e953abbe0b3488c02",
+ "name": "AINWebTool-15-D-eteancomp",
+ "isPermitted": true
+ },
+ {
+ "id": "dc6c4dbfd225474e9deaadd34968646c",
+ "name": "AINWebTool-15-T-SPFET",
+ "isPermitted": true
+ },
+ {
+ "id": "02cb5030e9914aa4be120bd9ed1e19eb",
+ "name": "AINWebTool-15-X-eeweww",
+ "isPermitted": true
+ },
+ {
+ "id": "f2f3830e4c984d45bcd00e1a04158a79",
+ "name": "CESAR-100-D-spjg61909",
+ "isPermitted": true
+ },
+ {
+ "id": "05b91bd5137f4929878edd965755c06d",
+ "name": "CESAR-100-D-sspjg621512cloned",
+ "isPermitted": true
+ },
+ {
+ "id": "7002fbe8482d4a989ddf445b1ce336e0",
+ "name": "AINWebTool-15-X-vdr",
+ "isPermitted": true
+ },
+ {
+ "id": "4008522be43741dcb1f5422022a2aa0b",
+ "name": "AINWebTool-15-D-ssasa",
+ "isPermitted": true
+ },
+ {
+ "id": "f44e2e96a1b6476abfda2fa407b00169",
+ "name": "AINWebTool-15-D-PFNPT",
+ "isPermitted": true
+ },
+ {
+ "id": "b69a52bec8a84669a37a1e8b72708be7",
+ "name": "AINWebTool-15-X-vdre",
+ "isPermitted": true
+ },
+ {
+ "id": "fac7d9fd56154caeb9332202dcf2969f",
+ "name": "AINWebTool-15-X-NONPODECOMP",
+ "isPermitted": true
+ },
+ {
+ "id": "2d34d8396e194eb49969fd61ffbff961",
+ "name": "DN5242-Nov16-T5",
+ "isPermitted": true
+ },
+ {
+ "id": "cb42a77ff45b48a8b8deb83bb64acc74",
+ "name": "ro-T11",
+ "isPermitted": true
+ },
+ {
+ "id": "fa45ca53c80b492fa8be5477cd84fc2b",
+ "name": "ro-T112",
+ "isPermitted": true
+ },
+ {
+ "id": "4914ab0ab3a743e58f0eefdacc1dde77",
+ "name": "DN5242-Nov21-T1",
+ "isPermitted": true
+ },
+ {
+ "id": "d0a3e3f2964542259d155a81c41aadc3",
+ "name": "test-hvf6-09",
+ "isPermitted": true
+ },
+ {
+ "id": "cbb99fe4ada84631b7baf046b6fd2044",
+ "name": "DN5242-Nov16-T3",
+ "isPermitted": true
+ }
+ ]
+ }
+ },
+ "productFamilies": [
+ {
+ "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+ "name": "SCOTTIE",
+ "isPermitted": true
+ },
+ {
+ "id": "17cc1042-527b-11e6-beb8-9e71128cae77",
+ "name": "IGNACIO",
+ "isPermitted": true
+ },
+ {
+ "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+ "name": "Christie",
+ "isPermitted": true
+ },
+ {
+ "id": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7",
+ "name": "Enhanced Services",
+ "isPermitted": true
+ },
+ {
+ "id": "vTerrance",
+ "name": "vTerrance",
+ "isPermitted": true
+ },
+ {
+ "id": "323d69d9-2efe-4r45-ay0a-89ea7ard4e6f",
+ "name": "vSCP",
+ "isPermitted": true
+ },
+ {
+ "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+ "name": "Emanuel",
+ "isPermitted": true
+ },
+ {
+ "id": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+ "name": "BVOIP",
+ "isPermitted": true
+ },
+ {
+ "id": "db171b8f-115c-4992-a2e3-ee04cae357e0",
+ "name": "LINDSEY",
+ "isPermitted": true
+ },
+ {
+ "id": "LRSI-OSPF",
+ "name": "LRSI-OSPF",
+ "isPermitted": true
+ },
+ {
+ "id": "vRosemarie",
+ "name": "HNGATEWAY",
+ "isPermitted": true
+ },
+ {
+ "id": "vHNPaas",
+ "name": "WILKINS",
+ "isPermitted": true
+ },
+ {
+ "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "name": "TYLER SILVIA",
+ "isPermitted": true
+ },
+ {
+ "id": "b6a3f28c-eebf-494c-a900-055cc7c874ce",
+ "name": "VROUTER",
+ "isPermitted": true
+ },
+ {
+ "id": "Cisneros",
+ "name": "vMuriel",
+ "isPermitted": true
+ },
+ {
+ "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1",
+ "name": "CARA Griffin",
+ "isPermitted": true
+ },
+ {
+ "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d",
+ "name": "DARREN MCGEE",
+ "isPermitted": true
+ },
+ {
+ "id": "e30755dc-5673-4b6b-9dcf-9abdd96b93d1",
+ "name": "Transport",
+ "isPermitted": true
+ },
+ {
+ "id": "vSalvatore",
+ "name": "vSalvatore",
+ "isPermitted": true
+ },
+ {
+ "id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4",
+ "name": "Josefina",
+ "isPermitted": true
+ },
+ {
+ "id": "vHubbard",
+ "name": "vHubbard",
+ "isPermitted": true
+ },
+ {
+ "id": "12a96a9d-4b4c-4349-a950-fe1159602621",
+ "name": "DARREN MCGEE",
+ "isPermitted": true
+ }
+ ],
+ "serviceTypes": {
+ "e433710f-9217-458d-a79d-1c7aff376d89": [
+ {
+ "id": "0",
+ "name": "vRichardson",
+ "isPermitted": false
+ },
+ {
+ "id": "1",
+ "name": "TYLER SILVIA",
+ "isPermitted": true
+ },
+ {
+ "id": "2",
+ "name": "Emanuel",
+ "isPermitted": false
+ },
+ {
+ "id": "3",
+ "name": "vJamie",
+ "isPermitted": false
+ },
+ {
+ "id": "4",
+ "name": "vVoiceMail",
+ "isPermitted": false
+ },
+ {
+ "id": "5",
+ "name": "Kennedy",
+ "isPermitted": false
+ },
+ {
+ "id": "6",
+ "name": "vSEGW",
+ "isPermitted": false
+ },
+ {
+ "id": "7",
+ "name": "vVM",
+ "isPermitted": false
+ },
+ {
+ "id": "8",
+ "name": "vOTA",
+ "isPermitted": false
+ },
+ {
+ "id": "9",
+ "name": "vMME",
+ "isPermitted": false
+ },
+ {
+ "id": "10",
+ "name": "vMNS",
+ "isPermitted": false
+ },
+ {
+ "id": "11",
+ "name": "vSCP",
+ "isPermitted": false
+ },
+ {
+ "id": "12",
+ "name": "VPMS",
+ "isPermitted": false
+ },
+ {
+ "id": "13",
+ "name": "vMMSC",
+ "isPermitted": false
+ },
+ {
+ "id": "14",
+ "name": "SSD",
+ "isPermitted": false
+ },
+ {
+ "id": "15",
+ "name": "vMOG",
+ "isPermitted": false
+ },
+ {
+ "id": "16",
+ "name": "LINDSEY",
+ "isPermitted": false
+ },
+ {
+ "id": "17",
+ "name": "JOHANNA_SANTOS",
+ "isPermitted": false
+ },
+ {
+ "id": "18",
+ "name": "vCarroll",
+ "isPermitted": false
+ }
+ ]
+ },
+ "aicZones": [
+ {
+ "id": "NFT1",
+ "name": "NFTJSSSS-NFT1"
+ },
+ {
+ "id": "JAG1",
+ "name": "YUDFJULP-JAG1"
+ },
+ {
+ "id": "YYY1",
+ "name": "UUUAIAAI-YYY1"
+ },
+ {
+ "id": "BAN1",
+ "name": "VSDKYUTP-BAN1"
+ },
+ {
+ "id": "DKJ1",
+ "name": "DKJSJDKA-DKJ1"
+ },
+ {
+ "id": "MCS1",
+ "name": "ASACMAMS-MCS1"
+ },
+ {
+ "id": "UIO1",
+ "name": "uioclli1-UIO1"
+ },
+ {
+ "id": "RAJ1",
+ "name": "YGBIJNLQ-RAJ1"
+ },
+ {
+ "id": "OPA1",
+ "name": "opaclli1-OPA1"
+ },
+ {
+ "id": "SDE1",
+ "name": "ZXCVBNMA-SDE1"
+ },
+ {
+ "id": "VEN2",
+ "name": "FGHJUHIL-VEN2"
+ },
+ {
+ "id": "ORL1",
+ "name": "ORLDFLMA-ORL1"
+ },
+ {
+ "id": "JAD1",
+ "name": "JADECLLI-JAD1"
+ },
+ {
+ "id": "ZXL1",
+ "name": "LWLWCANN-ZXL1"
+ },
+ {
+ "id": "CKL1",
+ "name": "CLKSKCKK-CKL1"
+ },
+ {
+ "id": "SDF1",
+ "name": "sdfclli1-SDF1"
+ },
+ {
+ "id": "RAD1",
+ "name": "RADICAL1-RAD1"
+ },
+ {
+ "id": "KIT1",
+ "name": "BHYJFGLN-KIT1"
+ },
+ {
+ "id": "REL1",
+ "name": "INGERFGT-REL1"
+ },
+ {
+ "id": "JNL1",
+ "name": "CJALSDAC-JNL1"
+ },
+ {
+ "id": "OLK1",
+ "name": "OLKOLKLS-OLK1"
+ },
+ {
+ "id": "CHI1",
+ "name": "CHILLIWE-CHI1"
+ },
+ {
+ "id": "UUU4",
+ "name": "UUUAAAUU-UUU4"
+ },
+ {
+ "id": "TUF1",
+ "name": "TUFCLLI1-TUF1"
+ },
+ {
+ "id": "KJN1",
+ "name": "CKALDKSA-KJN1"
+ },
+ {
+ "id": "SAM1",
+ "name": "SNDGCA64-SAN1"
+ },
+ {
+ "id": "SCK1",
+ "name": "SCKSCKSK-SCK1"
+ },
+ {
+ "id": "HJH1",
+ "name": "AOEEQQQD-HJH1"
+ },
+ {
+ "id": "HGD1",
+ "name": "SDFQWHGD-HGD1"
+ },
+ {
+ "id": "KOR1",
+ "name": "HYFLNBVT-KOR1"
+ },
+ {
+ "id": "ATL43",
+ "name": "AICLOCID-ATL43"
+ },
+ {
+ "id": "ATL54",
+ "name": "AICFTAAI-ATL54"
+ },
+ {
+ "id": "ATL66",
+ "name": "CLLIAAII-ATL66"
+ },
+ {
+ "id": "VEL1",
+ "name": "BNMLKUIK-VEL1"
+ },
+ {
+ "id": "ICC1",
+ "name": "SANJITAT-ICC1"
+ },
+ {
+ "id": "MNT11",
+ "name": "WSXEFBTH-MNT11"
+ },
+ {
+ "id": "DEF2",
+ "name": "WSBHGTYL-DEF2"
+ },
+ {
+ "id": "MAD11",
+ "name": "SDFQWGKL-MAD11"
+ },
+ {
+ "id": "OLG1",
+ "name": "OLHOLHOL-OLG1"
+ },
+ {
+ "id": "GAR1",
+ "name": "NGFVSJKO-GAR1"
+ },
+ {
+ "id": "SAN22",
+ "name": "GNVLSCTL-SAN22"
+ },
+ {
+ "id": "HRG1",
+ "name": "HRGHRGGS-HRG1"
+ },
+ {
+ "id": "JCS1",
+ "name": "JCSJSCJS-JCS1"
+ },
+ {
+ "id": "DHA12",
+ "name": "WSXEDECF-DHA12"
+ },
+ {
+ "id": "HJE1",
+ "name": "AOEEWWWD-HJE1"
+ },
+ {
+ "id": "NCA1",
+ "name": "NCANCANN-NCA1"
+ },
+ {
+ "id": "IOP1",
+ "name": "iopclli1-IOP1"
+ },
+ {
+ "id": "RTY1",
+ "name": "rtyclli1-RTY1"
+ },
+ {
+ "id": "KAP1",
+ "name": "HIOUYTRQ-KAP1"
+ },
+ {
+ "id": "ZEN1",
+ "name": "ZENCLLI1-ZEN1"
+ },
+ {
+ "id": "HKA1",
+ "name": "JAKHLASS-HKA1"
+ },
+ {
+ "id": "CQK1",
+ "name": "CQKSCAKK-CQK1"
+ },
+ {
+ "id": "SAI1",
+ "name": "UBEKQLPD-SAI1"
+ },
+ {
+ "id": "ERT1",
+ "name": "ertclli1-ERT1"
+ },
+ {
+ "id": "IBB1",
+ "name": "PLMKOIJU-IBB1"
+ },
+ {
+ "id": "TIR2",
+ "name": "PLKINHYI-TIR2"
+ },
+ {
+ "id": "HSD1",
+ "name": "CHASKCDS-HSD1"
+ },
+ {
+ "id": "SLF78",
+ "name": "SDCTLFN1-SLF78"
+ },
+ {
+ "id": "SEE78",
+ "name": "SDCTEEE4-SEE78"
+ },
+ {
+ "id": "SAN13",
+ "name": "TOKYJPFA-SAN13"
+ },
+ {
+ "id": "SAA78",
+ "name": "SDCTAAA1-SAA78"
+ },
+ {
+ "id": "LUC1",
+ "name": "ATLDFGYC-LUC1"
+ },
+ {
+ "id": "AMD13",
+ "name": "MEMATLAN-AMD13"
+ },
+ {
+ "id": "TOR1",
+ "name": "TOROONXN-TOR1"
+ },
+ {
+ "id": "QWE1",
+ "name": "QWECLLI1-QWE1"
+ },
+ {
+ "id": "ZOG1",
+ "name": "ZOGASTRO-ZOG1"
+ },
+ {
+ "id": "CAL33",
+ "name": "CALIFORN-CAL33"
+ },
+ {
+ "id": "SHH78",
+ "name": "SDIT1HHH-SHH78"
+ },
+ {
+ "id": "DSA1",
+ "name": "LKJHGFDS-DSA1"
+ },
+ {
+ "id": "CLG1",
+ "name": "CLGRABAD-CLG1"
+ },
+ {
+ "id": "BNA1",
+ "name": "BNARAGBK-BNA1"
+ },
+ {
+ "id": "ATL84",
+ "name": "CANTTCOC-ATL84"
+ },
+ {
+ "id": "APP1",
+ "name": "WBHGTYUI-APP1"
+ },
+ {
+ "id": "RJN1",
+ "name": "RJNRBZAW-RJN1"
+ },
+ {
+ "id": "EHH78",
+ "name": "SDCSHHH5-EHH78"
+ },
+ {
+ "id": "mac10",
+ "name": "PKGTESTF-mac10"
+ },
+ {
+ "id": "SXB78",
+ "name": "SDCTGXB1-SXB78"
+ },
+ {
+ "id": "SAX78",
+ "name": "SDCTAXG1-SAX78"
+ },
+ {
+ "id": "SYD1",
+ "name": "SYDNAUBV-SYD1"
+ },
+ {
+ "id": "TOK1",
+ "name": "TOKYJPFA-TOK1"
+ },
+ {
+ "id": "KGM2",
+ "name": "KGMTNC20-KGM2"
+ },
+ {
+ "id": "DCC1b",
+ "name": "POIUYTGH-DCC1b"
+ },
+ {
+ "id": "SKK78",
+ "name": "SDCTKKK1-SKK78"
+ },
+ {
+ "id": "SGG78",
+ "name": "SDCTGGG1-SGG78"
+ },
+ {
+ "id": "SJJ78",
+ "name": "SDCTJJJ1-SJJ78"
+ },
+ {
+ "id": "SBX78",
+ "name": "SDCTBXG1-SBX78"
+ },
+ {
+ "id": "LAG1",
+ "name": "LARGIZON-LAG1"
+ },
+ {
+ "id": "IAA1",
+ "name": "QAZXSWED-IAA1"
+ },
+ {
+ "id": "POI1",
+ "name": "PLMNJKIU-POI1"
+ },
+ {
+ "id": "LAG1a",
+ "name": "LARGIZON-LAG1a"
+ },
+ {
+ "id": "PBL1",
+ "name": "PBLAPBAI-PBL1"
+ },
+ {
+ "id": "LAG45",
+ "name": "LARGIZON-LAG1a"
+ },
+ {
+ "id": "MAR1",
+ "name": "MNBVCXZM-MAR1"
+ },
+ {
+ "id": "HST70",
+ "name": "HSTNTX70-HST70"
+ },
+ {
+ "id": "DCC1a",
+ "name": "POIUYTGH-DCC1a"
+ },
+ {
+ "id": "TOL1",
+ "name": "TOLDOH21-TOL1"
+ },
+ {
+ "id": "LON1",
+ "name": "LONEENCO-LON1"
+ },
+ {
+ "id": "SJU78",
+ "name": "SDIT1JUB-SJU78"
+ },
+ {
+ "id": "STN27",
+ "name": "HSTNTX01-STN27"
+ },
+ {
+ "id": "SSW56",
+ "name": "ss8126GT-SSW56"
+ },
+ {
+ "id": "SBB78",
+ "name": "SDIT1BBB-SBB78"
+ },
+ {
+ "id": "DCC3",
+ "name": "POIUYTGH-DCC3"
+ },
+ {
+ "id": "GNV1",
+ "name": "GNVLSCTL-GNV1"
+ },
+ {
+ "id": "WAS1",
+ "name": "WASHDCSW-WAS1"
+ },
+ {
+ "id": "TOY1",
+ "name": "TORYONNZ-TOY1"
+ },
+ {
+ "id": "STT1",
+ "name": "STTLWA02-STT1"
+ },
+ {
+ "id": "STG1",
+ "name": "STTGGE62-STG1"
+ },
+ {
+ "id": "SLL78",
+ "name": "SDCTLLL1-SLL78"
+ },
+ {
+ "id": "SBU78",
+ "name": "SDIT1BUB-SBU78"
+ },
+ {
+ "id": "ATL2",
+ "name": "ATLNGANW-ATL2"
+ },
+ {
+ "id": "BOT1",
+ "name": "BOTHWAKY-BOT1"
+ },
+ {
+ "id": "SNG1",
+ "name": "SNGPSIAU-SNG1"
+ },
+ {
+ "id": "NYC1",
+ "name": "NYCMNY54-NYC1"
+ },
+ {
+ "id": "LAG1b",
+ "name": "LARGIZON-LAG1b"
+ },
+ {
+ "id": "AMD15",
+ "name": "AMDFAA01-AMD15"
+ },
+ {
+ "id": "SNA1",
+ "name": "SNANTXCA-SNA1"
+ },
+ {
+ "id": "PLT1",
+ "name": "PLTNCA60-PLT1"
+ },
+ {
+ "id": "TLP1",
+ "name": "TLPNXM18-TLP1"
+ },
+ {
+ "id": "SDD81",
+ "name": "SAIT1DD6-SDD81"
+ },
+ {
+ "id": "DCC1",
+ "name": "POIUYTGH-DCC1"
+ },
+ {
+ "id": "DCC2",
+ "name": "POIUYTGH-DCC2"
+ },
+ {
+ "id": "OKC1",
+ "name": "OKCBOK55-OKC1"
+ },
+ {
+ "id": "PAR1",
+ "name": "PARSFRCG-PAR1"
+ },
+ {
+ "id": "TES36",
+ "name": "ABCEETES-TES36"
+ },
+ {
+ "id": "COM1",
+ "name": "PLMKOPIU-COM1"
+ },
+ {
+ "id": "ANI1",
+ "name": "ATLNGTRE-ANI1"
+ },
+ {
+ "id": "SDG78",
+ "name": "SDIT1BDG-SDG78"
+ },
+ {
+ "id": "mac20",
+ "name": "PKGTESTF-mac20"
+ },
+ {
+ "id": "DSF45",
+ "name": "DSFBG123-DSF45"
+ },
+ {
+ "id": "HST25",
+ "name": "HSTNTX01-HST25"
+ },
+ {
+ "id": "AMD18",
+ "name": "AUDIMA01-AMD18"
+ },
+ {
+ "id": "SAA80",
+ "name": "SAIT9AA3-SAA80"
+ },
+ {
+ "id": "SSA56",
+ "name": "SSIT2AA7-SSA56"
+ },
+ {
+ "id": "SDD82",
+ "name": "SAIT1DD9-SDD82"
+ },
+ {
+ "id": "JCV1",
+ "name": "JCVLFLBW-JCV1"
+ },
+ {
+ "id": "SUL2",
+ "name": "WERTYUJK-SUL2"
+ },
+ {
+ "id": "PUR1",
+ "name": "purelyde-PUR1"
+ },
+ {
+ "id": "FDE55",
+ "name": "FDERT555-FDE55"
+ },
+ {
+ "id": "SITE",
+ "name": "LONEENCO-SITE"
+ },
+ {
+ "id": "ATL1",
+ "name": "ATLNGAMA-ATL1"
+ },
+ {
+ "id": "JUL1",
+ "name": "ZXCVBNMM-JUL1"
+ },
+ {
+ "id": "TAT34",
+ "name": "TESAAISB-TAT34"
+ },
+ {
+ "id": "XCP12",
+ "name": "CHKGH123-XCP12"
+ },
+ {
+ "id": "RAI1",
+ "name": "poiuytre-RAI1"
+ },
+ {
+ "id": "HPO1",
+ "name": "ATLNGAUP-HPO1"
+ },
+ {
+ "id": "KJF12",
+ "name": "KJFDH123-KJF12"
+ },
+ {
+ "id": "SCC80",
+ "name": "SAIT9CC3-SCC80"
+ },
+ {
+ "id": "SAA12",
+ "name": "SAIT9AF8-SAA12"
+ },
+ {
+ "id": "SAA14",
+ "name": "SAIT1AA9-SAA14"
+ },
+ {
+ "id": "ATL35",
+ "name": "TTESSAAI-ATL35"
+ },
+ {
+ "id": "CWY1",
+ "name": "CWYMOWBS-CWY1"
+ },
+ {
+ "id": "ATL76",
+ "name": "TELEPAAI-ATL76"
+ },
+ {
+ "id": "DSL12",
+ "name": "DSLFK242-DSL12"
+ },
+ {
+ "id": "ATL53",
+ "name": "AAIATLTE-ATL53"
+ },
+ {
+ "id": "SAA11",
+ "name": "SAIT9AA2-SAA11"
+ },
+ {
+ "id": "ATL62",
+ "name": "TESSASCH-ATL62"
+ },
+ {
+ "id": "AUG1",
+ "name": "ASDFGHJK-AUG1"
+ },
+ {
+ "id": "POI22",
+ "name": "POIUY123-POI22"
+ },
+ {
+ "id": "SAA13",
+ "name": "SAIT1AA9-SAA13"
+ },
+ {
+ "id": "BHY17",
+ "name": "BHYTFRF3-BHY17"
+ },
+ {
+ "id": "LIS1",
+ "name": "HOSTPROF-LIS1"
+ },
+ {
+ "id": "SIP1",
+ "name": "ZXCVBNMK-SIP1"
+ },
+ {
+ "id": "ATL99",
+ "name": "TEESTAAI-ATL43"
+ },
+ {
+ "id": "ATL64",
+ "name": "FORLOAAJ-ATL64"
+ },
+ {
+ "id": "TAT33",
+ "name": "TESAAISA-TAT33"
+ },
+ {
+ "id": "RAD10",
+ "name": "INDIPUNE-RAD10"
+ },
+ {
+ "id": "RTW5",
+ "name": "BHYTFRY4-RTW5"
+ },
+ {
+ "id": "JGS1",
+ "name": "KSJKKKKK-JGS1"
+ },
+ {
+ "id": "ATL98",
+ "name": "TEESTAAI-ATL43"
+ },
+ {
+ "id": "WAN1",
+ "name": "LEIWANGW-WAN1"
+ },
+ {
+ "id": "ATL44",
+ "name": "ATLSANAB-ATL44"
+ },
+ {
+ "id": "RTD2",
+ "name": "BHYTFRk4-RTD2"
+ },
+ {
+ "id": "NIR1",
+ "name": "ORFLMANA-NIR1"
+ },
+ {
+ "id": "ATL75",
+ "name": "SANAAIRE-ATL75"
+ },
+ {
+ "id": "NUM1",
+ "name": "QWERTYUI-NUM1"
+ },
+ {
+ "id": "MTN32",
+ "name": "MDTWNJ21-MTN32"
+ },
+ {
+ "id": "RTZ4",
+ "name": "BHYTFRZ6-RTZ4"
+ },
+ {
+ "id": "ATL56",
+ "name": "ATLSANAC-ATL56"
+ },
+ {
+ "id": "AMS1",
+ "name": "AMSTNLBW-AMS1"
+ },
+ {
+ "id": "RCT1",
+ "name": "AMSTERNL-RCT1"
+ },
+ {
+ "id": "JAN1",
+ "name": "ORFLMATT-JAN1"
+ },
+ {
+ "id": "ABC14",
+ "name": "TESAAISA-ABC14"
+ },
+ {
+ "id": "TAT37",
+ "name": "TESAAISD-TAT37"
+ },
+ {
+ "id": "MIC54",
+ "name": "MICHIGAN-MIC54"
+ },
+ {
+ "id": "ABC11",
+ "name": "ATLSANAI-ABC11"
+ },
+ {
+ "id": "AMF11",
+ "name": "AMDOCS01-AMF11"
+ },
+ {
+ "id": "ATL63",
+ "name": "ATLSANEW-ATL63"
+ },
+ {
+ "id": "ABC12",
+ "name": "ATLSECIA-ABC12"
+ },
+ {
+ "id": "MTN20",
+ "name": "MDTWNJ21-MTN20"
+ },
+ {
+ "id": "ABC15",
+ "name": "AAITESAN-ABC15"
+ },
+ {
+ "id": "AVT1",
+ "name": "AVTRFLHD-AVT1"
+ },
+ {
+ "id": "ATL34",
+ "name": "ATLSANAI-ATL34"
+ }
+ ],
+ "categoryParameters": {
+ "owningEntityList": [
+ {
+ "id": "aaa1",
+ "name": "aaa1"
+ },
+ {
+ "id": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+ "name": "WayneHolland"
+ },
+ {
+ "id": "Melissa",
+ "name": "Melissa"
+ }
+ ],
+ "projectList": [
+ {
+ "id": "WATKINS",
+ "name": "WATKINS"
+ },
+ {
+ "id": "x1",
+ "name": "x1"
+ },
+ {
+ "id": "yyy1",
+ "name": "yyy1"
+ }
+ ],
+ "lineOfBusinessList": [
+ {
+ "id": "ONAP",
+ "name": "ONAP"
+ },
+ {
+ "id": "zzz1",
+ "name": "zzz1"
+ }
+ ],
+ "platformList": [
+ {
+ "id": "platform",
+ "name": "platform"
+ },
+ {
+ "id": "xxx1",
+ "name": "xxx1"
+ }
+ ]
+ },
+ "type": "[LCP_REGIONS_AND_TENANTS] Update",
+ "subscribers": [
+ {
+ "id": "CAR_2020_ER",
+ "name": "CAR_2020_ER",
+ "isPermitted": true
+ },
+ {
+ "id": "21014aa2-526b-11e6-beb8-9e71128cae77",
+ "name": "JULIO ERICKSON",
+ "isPermitted": false
+ },
+ {
+ "id": "DHV1707-TestSubscriber-2",
+ "name": "DALE BRIDGES",
+ "isPermitted": false
+ },
+ {
+ "id": "DHV1707-TestSubscriber-1",
+ "name": "LLOYD BRIDGES",
+ "isPermitted": false
+ },
+ {
+ "id": "jimmy-example",
+ "name": "JimmyExampleCust-20161102",
+ "isPermitted": false
+ },
+ {
+ "id": "jimmy-example2",
+ "name": "JimmyExampleCust-20161103",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-TestSub-PWT-102",
+ "name": "ERICA5779-TestSub-PWT-102",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-TestSub-PWT-101",
+ "name": "ERICA5779-TestSub-PWT-101",
+ "isPermitted": false
+ },
+ {
+ "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+ "name": "Emanuel",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-Subscriber-4",
+ "name": "ERICA5779-Subscriber-5",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-TestSub-PWT-103",
+ "name": "ERICA5779-TestSub-PWT-103",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-Subscriber-2",
+ "name": "ERICA5779-Subscriber-2",
+ "isPermitted": false
+ },
+ {
+ "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "name": "SILVIA ROBBINS",
+ "isPermitted": true
+ },
+ {
+ "id": "ERICA5779-Subscriber-3",
+ "name": "ERICA5779-Subscriber-3",
+ "isPermitted": false
+ },
+ {
+ "id": "31739f3e-526b-11e6-beb8-9e71128cae77",
+ "name": "CRAIG/ROBERTS",
+ "isPermitted": false
+ }
+ ]
+ }
+ }
+ }
+}
+
+class MockFeatureFlagsService {}
+
+describe('VFModule Control Generator', () => {
+ let injector;
+ let service: VfModuleControlGenerator;
+ let httpMock: HttpTestingController;
+
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+ imports: [HttpClientTestingModule],
+ providers: [VfModuleControlGenerator,
+ GenericFormService,
+ BasicControlGenerator,
+ AaiService,
+ FormBuilder,
+ LogService,
+ {provide:FeatureFlagsService, useClass: MockFeatureFlagsService},
+ {provide: NgRedux, useClass: MockAppStore}]
+ });
+ await TestBed.compileComponents();
+
+ injector = getTestBed();
+ service = injector.get(VfModuleControlGenerator);
+ httpMock = injector.get(HttpTestingController);
+ jest.spyOn(console, 'error');
+
+ })().then(done).catch(done.fail));
+
+ test(' getMacroFormControls gets vnfStoreKey === null', () => {
+ const serviceId: string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44";
+ const vnfStoreKey: string = null;
+ const vfModuleStoreKey: string = 'vf_vmee0..VfVmee..base_vmme..module-0';
+ const vfModuleUUID: string = "522159d5-d6e0-4c2a-aa44-5a542a12a830";
+ const controls: FormControlModel[] = service.getMacroFormControls(serviceId, vnfStoreKey, vfModuleStoreKey, vfModuleUUID, true);
+
+ expect(controls).toEqual([]);
+ expect(console.error).toHaveBeenCalled();
+ });
+
+ test('getAlaCarteFormControls check for mandatory controls', () => {
+ const serviceId: string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44";
+ const vnfStoreKey: string = 'VF_vMee 0';
+ const vfModuleStoreKey: string = 'vf_vmee0..VfVmee..base_vmme..module-0';
+ const uuidData: Object = {
+ modelId : "522159d5-d6e0-4c2a-aa44-5a542a12a830",
+ modelName : "vf_vmee0..VfVmee..base_vmme..module-0",
+ serviceId : "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ type : "VFmodule",
+ vFModuleStoreKey : "vf_vmee0..VfVmee..base_vmme..module-0vmvzo",
+ vnfStoreKey : "VF_vMee 0"
+ };
+ const controls: FormControlModel[] = service.getAlaCarteFormControls(serviceId, vnfStoreKey, vfModuleStoreKey, uuidData, true);
+
+ const mandatoryControls : string[] = [
+ FormControlNames.INSTANCE_NAME,
+ FormControlNames.LCPCLOUD_REGION_ID,
+ FormControlNames.TENANT_ID,
+ FormControlNames.ROLLBACK_ON_FAILURE,
+ ];
+
+ for(let i = 0 ; i < mandatoryControls.length ; i++) {
+ let requiredExist = controls.find(ctrl => ctrl.controlName === mandatoryControls[i]).validations.find(item => item.validatorName === 'required');
+ expect(requiredExist).toBeDefined();
+ }
+ });
+
+ test('getMacroFormControls check for mandatory controls', () => {
+ const serviceId: string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44";
+ const vnfStoreKey: string = 'VF_vMee 0';
+ const uuidData: Object = {
+ modelId : "a27f5cfc-7f12-4f99-af08-0af9c3885c87",
+ modelName : "vf_vmee0..VfVmee..base_vmme..module-0",
+ serviceId : "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ type : "VFmodule",
+ vFModuleStoreKey : "vf_vmee0..VfVmee..base_vmme..module-0vmvzo",
+ vnfStoreKey : "VF_vMee 0"
+ };
+ const controls: FormControlModel[] = service.getMacroFormControls(serviceId, vnfStoreKey, vnfStoreKey, uuidData, true);
+
+ const mandatoryControls : string[] = [
+ 'instanceName'
+ ];
+
+ for(let i = 0 ; i < mandatoryControls.length ; i++) {
+ let requiredExist = controls.find(ctrl => ctrl.controlName === mandatoryControls[i]).validations.find(item => item.validatorName === 'required');
+ expect(requiredExist).toBeDefined();
+ }
+ });
+
+ test(' getMacroFormControls gets null vnfStoreKey', () => {
+ const serviceId: string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44";
+ const vnfStoreKey: string = null;
+ const vfModuleUUID: string = "522159d5-d6e0-4c2a-aa44-5a542a12a830";
+ const uuidData: Object = {};
+ const controls: FormControlModel[] = service.getMacroFormControls(serviceId, vnfStoreKey, vfModuleUUID, uuidData,true);
+
+ expect(controls).toEqual([]);
+ expect(console.error).toHaveBeenCalled();
+ });
+
+ test('getAlaCarteFormControls should return the correct order of controls', () => {
+ const controls:FormControlModel[] = getAlaCarteFormControls();
+
+ const orderedControls : string[] = [
+ FormControlNames.INSTANCE_NAME,
+ FormControlNames.VOLUME_GROUP_NAME,
+ FormControlNames.LCPCLOUD_REGION_ID,
+ FormControlNames.LEGACY_REGION,
+ FormControlNames.TENANT_ID,
+ FormControlNames.ROLLBACK_ON_FAILURE,
+ FormControlNames.SDN_C_PRE_LOAD
+ ];
+
+ expect(controls.length).toEqual(7);
+ for(let i = 0 ; i < orderedControls.length ; i++) {
+ expect(controls[i].controlName).toEqual(orderedControls[i]);
+ }
+ });
+
+ function getAlaCarteFormControls():FormControlModel[] {
+ const serviceId: string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44";
+ const vnfStoreKey: string = 'VF_vMee 0';
+ const vfModuleUUID: string = "522159d5-d6e0-4c2a-aa44-5a542a12a830";
+ const uuidData: Object = {
+ modelId: "a27f5cfc-7f12-4f99-af08-0af9c3885c87",
+ modelName: "vf_vmee0..VfVmee..base_vmme..module-0",
+ serviceId: "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ type: "VFmodule",
+ vFModuleStoreKey: "vf_vmee0..VfVmee..base_vmme..module-0vmvzo",
+ vnfStoreKey: "VF_vMee 0"
+ };
+ const controls: FormControlModel[] = service.getAlaCarteFormControls(serviceId, vnfStoreKey, vfModuleUUID, uuidData, true);
+ return controls;
+ }
+
+ test('getAlaCarteFormControls responce with wrong order of controls', () => {
+ const controls:FormControlModel[] = getAlaCarteFormControls();
+
+ const orderedControls : string[] = [
+ FormControlNames.INSTANCE_NAME,
+ FormControlNames.VOLUME_GROUP_NAME,
+ FormControlNames.LCPCLOUD_REGION_ID,
+ FormControlNames.TENANT_ID, // TENANT_ID must be after LEGACY_REGION
+ FormControlNames.LEGACY_REGION,
+ FormControlNames.ROLLBACK_ON_FAILURE,
+ FormControlNames.SDN_C_PRE_LOAD
+ ];
+
+ for(let i = 0 ; i < orderedControls.length ; i++) {
+ if (controls[i].controlName === 'legacyRegion') {
+ expect(orderedControls[i]).toEqual('tenantId');
+ }
+ }
+ });
+
+ test('getMacroFormControls should return the correct order of controls', () => {
+ const serviceId: string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44";
+ const vnfStoreKey: string = 'VF_vMee 0';
+ const vfModuleUUID: string = "522159d5-d6e0-4c2a-aa44-5a542a12a830";
+ const uuidData: Object = {
+ modelId : "a27f5cfc-7f12-4f99-af08-0af9c3885c87",
+ modelName : "vf_vmee0..VfVmee..base_vmme..module-0",
+ serviceId : "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ type : "VFmodule",
+ vFModuleStoreKey : "vf_vmee0..VfVmee..base_vmme..module-0vmvzo",
+ vnfStoreKey : "VF_vMee 0"
+ };
+ const controls: FormControlModel[] = service.getMacroFormControls(serviceId, vnfStoreKey, vfModuleUUID, uuidData, true);
+
+ const orderedControls : string[] = [
+ FormControlNames.INSTANCE_NAME,
+ FormControlNames.VOLUME_GROUP_NAME
+ ];
+
+ for(let i = 0 ; i < orderedControls.length ; i++) {
+ expect(controls[i].controlName).toEqual(orderedControls[i]);
+ }
+ });
+
+ test.each`
+ controllerName
+ ${'instanceName'}
+ ${'volumeGroupName'}
+ `('getAlacartFormControls $controllerName control validator shall have the expected regex', ({controllerName}) => {
+ const controls:FormControlModel[] = getAlaCarteFormControls();
+
+ const instanceNameControl: FormControlModel = <FormControlModel>controls.find(item => item.controlName == controllerName);
+ const instanceNameValidator: ValidatorModel = instanceNameControl.validations.find(val => val.validatorName === ValidatorOptions.pattern);
+ expect(instanceNameValidator.validatorArg).toEqual(/^[a-zA-Z0-9._-]*$/);
+ });
+
+ test(' getAlaCarteFormControls gets null service', () => {
+ const controls:FormControlModel[] = getAlaCarteFormControls();
+ expect(controls.length).toEqual(7);
+
+ const orderedControls : string[] = [
+ FormControlNames.INSTANCE_NAME,
+ FormControlNames.VOLUME_GROUP_NAME,
+ FormControlNames.LCPCLOUD_REGION_ID,
+ FormControlNames.LEGACY_REGION,
+ FormControlNames.TENANT_ID,
+ FormControlNames.ROLLBACK_ON_FAILURE,
+ FormControlNames.SDN_C_PRE_LOAD
+ ];
+
+ for(let i = 0 ; i < orderedControls.length ; i++) {
+ expect(controls[i].controlName).toEqual(orderedControls[i]);
+ }
+ });
+});
+
diff --git a/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator.ts b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator.ts
new file mode 100644
index 000000000..3012c139c
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator.ts
@@ -0,0 +1,349 @@
+import {Injectable} from "@angular/core";
+import {GenericFormService} from "../../generic-form.service";
+import {AaiService} from "../../../../services/aaiService/aai.service";
+import {NgRedux} from "@angular-redux/store";
+import {HttpClient} from "@angular/common/http";
+import {BasicControlGenerator} from "../basic.control.generator";
+import * as _ from 'lodash';
+import {Observable, of} from "rxjs";
+
+import {
+ CustomValidatorOptions,
+ FormControlModel,
+ ValidatorModel,
+ ValidatorOptions
+} from "../../../../models/formControlModels/formControl.model";
+import {LogService} from "../../../../utils/log/log.service";
+import {AppState} from "../../../../store/reducers";
+import {FormGroup} from "@angular/forms";
+import {DropdownFormControl} from "../../../../models/formControlModels/dropdownFormControl.model";
+import {FormControlType} from "../../../../models/formControlModels/formControlTypes.enum";
+import {InputFormControl} from "../../../../models/formControlModels/inputFormControl.model";
+import {SelectOption} from "../../../../models/selectOption";
+import {VfModuleInstance} from "../../../../models/vfModuleInstance";
+import {VfModule} from "../../../../models/vfModule";
+import {VNFModel} from "../../../../models/vnfModel";
+import {VnfInstance} from "../../../../models/vnfInstance";
+import {FileFormControl} from "../../../../models/formControlModels/fileFormControl.model";
+import {CheckboxFormControl} from "../../../../models/formControlModels/checkboxFormControl.model";
+import {FileUnit} from "../../../formControls/component/file/fileUnit.enum";
+import {Constants} from "../../../../utils/constants";
+
+
+export enum FormControlNames {
+ INSTANCE_NAME = 'instanceName',
+ VOLUME_GROUP_NAME = 'volumeGroupName',
+ LCPCLOUD_REGION_ID = 'lcpCloudRegionId',
+ LEGACY_REGION = 'legacyRegion',
+ TENANT_ID = 'tenantId',
+ ROLLBACK_ON_FAILURE = 'rollbackOnFailure',
+ SDN_C_PRE_LOAD = 'sdncPreLoad',
+ SUPPLEMENTARY_FILE = 'supplementaryFile'
+}
+
+
+@Injectable()
+export class VfModuleControlGenerator {
+ aaiService: AaiService;
+ vfModuleModel: VfModule;
+ vfModuleName : string;
+ isUpdateMode : boolean;
+
+ constructor(private genericFormService: GenericFormService,
+ private _basicControlGenerator: BasicControlGenerator,
+ private store: NgRedux<AppState>,
+ private http: HttpClient,
+ private _aaiService: AaiService,
+ private _logService: LogService) {
+ this.aaiService = _aaiService;
+ }
+
+ setVFModuleStoreKey = (serviceId: string, vfModuleUuid: string) => {
+ const vfModules = this.store.getState().service.serviceHierarchy[serviceId].vfModules;
+ const vfModulesKeys = Object.keys(vfModules);
+ for(let key of vfModulesKeys){
+ if(vfModules[key].uuid === vfModuleUuid){
+ this.vfModuleName = key;
+ return;
+ }
+ }
+ };
+
+
+ getVfModuleInstance = (serviceId: string, vnfStoreKey: string, UUIDData: Object, isUpdateMode: boolean): VfModuleInstance => {
+ let vfModuleInstance: VfModuleInstance = null;
+ if (isUpdateMode && this.store.getState().service.serviceInstance[serviceId] &&
+ _.has(this.store.getState().service.serviceInstance[serviceId].vnfs, vnfStoreKey) &&
+ _.has(this.store.getState().service.serviceInstance[serviceId].vnfs[vnfStoreKey].vfModules, UUIDData['modelName'])) {
+ vfModuleInstance = Object.assign({},this.store.getState().service.serviceInstance[serviceId].vnfs[vnfStoreKey].vfModules[UUIDData['modelName']][UUIDData['vFModuleStoreKey']]);
+ }
+ return vfModuleInstance;
+ };
+
+ extractVfAccordingToVfModuleUuid(serviceId: string, UUIDData: Object): VfModule {
+ const vfModule = this.store.getState().service.serviceHierarchy[serviceId].vfModules[UUIDData['modelName']];
+ this.vfModuleModel = vfModule;
+ return vfModule;
+ }
+
+ getMacroFormControls(serviceId: string, vnfStoreKey: string, vfModuleStoreKey: string, uuidData : Object, isUpdateMode: boolean): FormControlModel[] {
+ this.isUpdateMode = isUpdateMode;
+ this.extractVfAccordingToVfModuleUuid(serviceId, uuidData);
+ if (_.isNil(serviceId) || _.isNil(vnfStoreKey) || _.isNil(vfModuleStoreKey)) {
+ if(isUpdateMode){
+ this._logService.error('should provide serviceId, vfModuleStoreKey, vnfStoreKey', serviceId);
+ return [];
+ }
+ }
+
+ const vfModuleInstance = this.getVfModuleInstance(serviceId, vnfStoreKey, uuidData, isUpdateMode);
+ const vfModuleModel = this.vfModuleModel;
+ const vnf: VnfInstance = this.store.getState().service.serviceInstance[serviceId].vnfs[vnfStoreKey];
+ const vnfModelName: string = vnf.originalName;
+ const vnfModel = new VNFModel(this.store.getState().service.serviceHierarchy[serviceId].vnfs[vnfModelName]);
+
+ let result: FormControlModel[] = [];
+
+ if (!_.isNil(vfModuleModel)) {
+ result.push(this.getInstanceName(vfModuleInstance, serviceId, vnfModel.isEcompGeneratedNaming));
+ if (this.vfModuleModel.volumeGroupAllowed) {
+ result.push(this.getVolumeGroupName(vfModuleInstance, serviceId, vnfStoreKey, vfModuleInstance && vfModuleInstance.volumeGroupName, vnfModel.isEcompGeneratedNaming));
+ }
+ }
+ if(this.store.getState().global.flags['FLAG_SUPPLEMENTARY_FILE']) {
+ let suppFileInput:FileFormControl = <FileFormControl>(this.getSupplementaryFile(vfModuleInstance));
+ result.push(suppFileInput);
+ result = result.concat(suppFileInput.hiddenFile);
+ }
+ return result;
+ }
+
+ getAlaCarteFormControls(serviceId: string, vnfStoreKey: string, vfModuleStoreKey: string, uuidData : Object, isUpdateMode: boolean): FormControlModel[] {
+ this.isUpdateMode = isUpdateMode;
+ this.extractVfAccordingToVfModuleUuid(serviceId, uuidData);
+ if (_.isNil(serviceId) || _.isNil(vnfStoreKey) || _.isNil(vfModuleStoreKey)) {
+ if(isUpdateMode){
+ this._logService.error('should provide serviceId, vfModuleStoreKey, vnfStoreKey', serviceId);
+ return [];
+ }
+ }
+ const vnf: VnfInstance = this.store.getState().service.serviceInstance[serviceId].vnfs[vnfStoreKey];
+ const vnfModelName: string = vnf.originalName;
+ const vnfModel = new VNFModel(this.store.getState().service.serviceHierarchy[serviceId].vnfs[vnfModelName]);
+
+ const vfModuleInstance = this.getVfModuleInstance(serviceId, vnfStoreKey, uuidData, isUpdateMode);
+ let result: FormControlModel[] = [];
+ result.push(this.getInstanceName(vfModuleInstance, serviceId, vnfModel.isEcompGeneratedNaming));
+
+ if (this.vfModuleModel.volumeGroupAllowed) {
+ result.push(this.getVolumeGroupName(vfModuleInstance, serviceId, vnfStoreKey, this.vfModuleName, vnfModel.isEcompGeneratedNaming));
+ }
+ result.push(this.getLcpRegionControl(serviceId, vfModuleInstance, result));
+ result.push(this._basicControlGenerator.getLegacyRegion(vfModuleInstance));
+ result.push(this.getTenantControl(serviceId, vfModuleInstance, result));
+ result.push(this.getRollbackOnFailureControl(vfModuleInstance, result));
+ result.push(this.getSDNCControl(vfModuleInstance, result));
+ if(this.store.getState().global.flags['FLAG_SUPPLEMENTARY_FILE']) {
+ let suppFileInput:FileFormControl = <FileFormControl>(this.getSupplementaryFile(vfModuleInstance));
+ result.push(suppFileInput);
+ result = result.concat(suppFileInput.hiddenFile);
+ }
+ return result;
+
+ }
+
+ getInstanceName(instance: any, serviceId: string, isEcompGeneratedNaming: boolean): FormControlModel {
+ let formControlModel:FormControlModel = this._basicControlGenerator.getInstanceNameController(instance, serviceId, isEcompGeneratedNaming, this.vfModuleModel);
+ formControlModel.onBlur = (event, form : FormGroup) => {
+ if(!_.isNil(form.controls['volumeGroupName'])&& event.target.value.length > 0){
+ form.controls['volumeGroupName'].setValue(event.target.value + "_vol");
+ }
+ };
+
+ return formControlModel;
+ }
+
+ getDefaultVolumeGroupName(instance: any, vfModuleName: string, isEcompGeneratedNaming: boolean): string {
+ if ((!_.isNil(instance) && instance.volumeGroupName)) {
+ return instance.volumeGroupName;
+ }
+ if (isEcompGeneratedNaming) {
+ return null;
+ }
+ return this._basicControlGenerator.getDefaultInstanceName(instance, this.vfModuleModel) + "_vol";
+ }
+
+ getVolumeGroupName(instance: any, serviceId: string, vnfStoreKey: string, vfModuleName: string, isEcompGeneratedNaming: boolean): FormControlModel {
+ let validations: ValidatorModel[] = [
+ new ValidatorModel(ValidatorOptions.pattern, 'Instance name may include only alphanumeric characters and underscore.', BasicControlGenerator.INSTANCE_NAME_REG_EX),
+ new ValidatorModel(CustomValidatorOptions.uniqueInstanceNameValidator, 'Volume Group instance name is already in use, please pick another name', [this.store, serviceId, instance && instance.volumeGroupName])
+ ];
+ // comment out because if not provided vid won't create VG
+ // if (!isEcompGeneratedNaming) {
+ // validations.push(new ValidatorModel(ValidatorOptions.required, 'is required'));
+ // }
+ return new InputFormControl({
+ controlName: 'volumeGroupName',
+ displayName: 'Volume Group Name',
+ dataTestId: 'volumeGroupName',
+ // placeHolder: (!isEcompGeneratedNaming) ? 'Volume Group Name' : 'Automatically generated when not provided',
+ validations: validations,
+ tooltip : 'When filled, VID will create a Volume Group by this name and associate with this module.\n' +
+ 'When empty, the module is created without a Volume Group.',
+ isVisible: true,
+ value: this.getDefaultVolumeGroupName(instance, vfModuleName, isEcompGeneratedNaming),
+ onKeypress: (event) => {
+ const pattern:RegExp = BasicControlGenerator.INSTANCE_NAME_REG_EX;
+ if (pattern) {
+ if (!pattern.test(event['key'])) {
+ event.preventDefault();
+ }
+ }
+ return event;
+ }
+ });
+ }
+
+ getSupplementaryFile(instance: any): FormControlModel {
+ return new FileFormControl({
+ controlName: FormControlNames.SUPPLEMENTARY_FILE,
+ displayName: 'Supplementary Data File (JSON format)',
+ dataTestId: 'SupplementaryFile',
+ placeHolder: 'Choose file',
+ selectedFile: !_.isNil(instance) ? instance.supplementaryFileName: null,
+ isVisible: true,
+ acceptedExtentions: "application/json",
+ hiddenFile : [new InputFormControl({
+ controlName: FormControlNames.SUPPLEMENTARY_FILE + "_hidden",
+ isVisible: false,
+ validations: [new ValidatorModel(CustomValidatorOptions.isFileTooBig, "File size exceeds 5MB.", [FileUnit.MB, 5])]
+ }),
+ new InputFormControl({
+ controlName: FormControlNames.SUPPLEMENTARY_FILE + "_hidden_content",
+ isVisible: false,
+ validations: [new ValidatorModel(CustomValidatorOptions.isValidJson,
+ "File is invalid, please make sure a legal JSON file is uploaded using name:value pairs.",[]),
+ new ValidatorModel(CustomValidatorOptions.isStringContainTags,
+ "File is invalid, please remove tags <>.",[])],
+ value: !_.isNil(instance) ? (instance.supplementaryFile_hidden_content): null,
+ })
+ ],
+ onDelete : (form : FormGroup) => {
+ form.controls[FormControlNames.SUPPLEMENTARY_FILE + "_hidden"].setValue(null);
+ form.controls[FormControlNames.SUPPLEMENTARY_FILE + "_hidden_content"].setValue(null);
+ },
+ onChange : (files: FileList, form : FormGroup) => {
+ if (files.length > 0) {
+ const file = files.item(0);
+ let reader = new FileReader();
+ reader.onload = function(event) {
+ form.controls[FormControlNames.SUPPLEMENTARY_FILE + "_hidden_content"].setValue(reader.result);
+ form.controls[FormControlNames.SUPPLEMENTARY_FILE + "_hidden"].setValue(file);
+ };
+ reader.readAsText(file);
+ }
+ else {
+ form.controls[FormControlNames.SUPPLEMENTARY_FILE + "_hidden"].setValue(null);
+ form.controls[FormControlNames.SUPPLEMENTARY_FILE + "_hidden_content"].setValue(null);
+ }
+ }
+ })
+ };
+
+ getTenantControl = (serviceId: string, instance: any, controls: FormControlModel[]): DropdownFormControl => {
+ const service = this.store.getState().service.serviceInstance[serviceId];
+ const globalCustomerId: string = service.globalSubscriberId;
+ const serviceType: string = service.subscriptionServiceType;
+ return new DropdownFormControl({
+ type: FormControlType.DROPDOWN,
+ controlName: FormControlNames.TENANT_ID,
+ displayName: 'Tenant',
+ dataTestId: 'tenant',
+ placeHolder: 'Select Tenant',
+ name: "tenant",
+ isDisabled: _.isNil(instance) || _.isNil(instance.lcpCloudRegionId),
+ onInitSelectedField: instance ? ['lcpRegionsTenantsMap', instance.lcpCloudRegionId] : null,
+ value: instance ? instance.tenantId : null,
+ validations: [new ValidatorModel(ValidatorOptions.required, 'is required')],
+ onInit: instance ? this._basicControlGenerator.getSubscribeInitResult.bind(
+ this._aaiService,
+ this.aaiService.getLcpRegionsAndTenants.bind(this, globalCustomerId, serviceType)) : () => {
+ },
+ })
+ };
+
+ getLcpRegionControl = (serviceId: string, instance: any, controls: FormControlModel[]): DropdownFormControl => {
+ const service = this.store.getState().service.serviceInstance[serviceId];
+ const globalCustomerId: string = service.globalSubscriberId;
+ const serviceType: string = service.subscriptionServiceType;
+ return new DropdownFormControl({
+ type: FormControlType.DROPDOWN,
+ controlName: 'lcpCloudRegionId',
+ displayName: 'LCP region',
+ dataTestId: 'lcpRegion',
+ placeHolder: 'Select LCP Region',
+ name: "lcpRegion",
+ isDisabled: false,
+ value: instance ? instance.lcpCloudRegionId : null,
+ validations: [new ValidatorModel(ValidatorOptions.required, 'is required')],
+ onInitSelectedField: ['lcpRegionList'],
+ onInit: this._basicControlGenerator.getSubscribeInitResult.bind(
+ this._aaiService,
+ this._aaiService.getLcpRegionsAndTenants.bind(this, globalCustomerId, serviceType)),
+ onChange: (param: string, form: FormGroup) => {
+ form.controls[FormControlNames.TENANT_ID].enable();
+ form.controls[FormControlNames.TENANT_ID].reset();
+ if (!_.isNil(globalCustomerId) && !_.isNil(serviceType)) {
+ this._basicControlGenerator.getSubscribeResult.bind(this, this._aaiService.getLcpRegionsAndTenants(globalCustomerId, serviceType).subscribe(res => {
+ controls.find(item => item.controlName === FormControlNames.TENANT_ID)['options$'] = res.lcpRegionsTenantsMap[param];
+ if (res.lcpRegionsTenantsMap[param]) {
+ controls.find(item => item.controlName === FormControlNames.TENANT_ID)['hasEmptyOptions'] = res.lcpRegionsTenantsMap[param].length === 0;
+ }
+ }));
+ }
+
+ if (Constants.LegacyRegion.MEGA_REGION.indexOf(param) !== -1) {
+ form.controls['legacyRegion'].enable();
+ controls.find(item => item.controlName === 'legacyRegion').isVisible = true;
+
+ } else {
+ controls.find(item => item.controlName === 'legacyRegion').isVisible = false;
+ form.controls['legacyRegion'].setValue(null);
+ form.controls['legacyRegion'].reset();
+ form.controls['legacyRegion'].disable();
+ }
+ }
+ })
+ };
+
+ getSDNCControl = (instance: any, controls: FormControlModel[]): CheckboxFormControl => {
+ return new CheckboxFormControl({
+ type: FormControlType.CHECKBOX,
+ controlName: 'sdncPreLoad',
+ displayName: 'SDN-C pre-load',
+ dataTestId: 'sdncPreLoad',
+ value: instance ? instance.sdncPreLoad : false,
+ validations: [new ValidatorModel(ValidatorOptions.required, 'is required')]
+ })
+ };
+
+ getRollbackOnFailureControl = (instance: any, controls: FormControlModel[]): DropdownFormControl => {
+ return new DropdownFormControl({
+ type: FormControlType.DROPDOWN,
+ controlName: FormControlNames.ROLLBACK_ON_FAILURE,
+ displayName: 'Rollback on failure',
+ dataTestId: 'rollback',
+ isDisabled: false,
+ validations: [new ValidatorModel(ValidatorOptions.required, 'is required')],
+ value: instance ? instance.rollbackOnFailure : 'true',
+ onInit: this._basicControlGenerator.getSubscribeInitResult.bind(null, this.getRollBackOnFailureOptions)
+ })
+ };
+
+ getRollBackOnFailureOptions = (): Observable<SelectOption[]> => {
+ return of([
+ new SelectOption({id: 'true', name: 'Rollback'}),
+ new SelectOption({id: 'false', name: 'Don\'t Rollback'})
+ ]);
+ };
+}
diff --git a/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vnfGenerator/vnf.control.generator.spec.ts b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vnfGenerator/vnf.control.generator.spec.ts
new file mode 100644
index 000000000..d15a57bcf
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vnfGenerator/vnf.control.generator.spec.ts
@@ -0,0 +1,1943 @@
+import {getTestBed, TestBed} from '@angular/core/testing';
+import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing';
+import {NgRedux} from '@angular-redux/store';
+import {FormControlNames} from "../service.control.generator";
+import {BasicControlGenerator} from "../basic.control.generator";
+import {AaiService} from "../../../../services/aaiService/aai.service";
+import {GenericFormService} from "../../generic-form.service";
+import {FormBuilder} from "@angular/forms";
+import {
+ FormControlModel,
+ ValidatorModel,
+ ValidatorOptions
+} from "../../../../models/formControlModels/formControl.model";
+import {LogService} from "../../../../utils/log/log.service";
+import {VnfControlGenerator} from "./vnf.control.generator";
+import {Observable} from "rxjs";
+import {SelectOption} from "../../../../models/selectOption";
+import {FeatureFlagsService} from "../../../../services/featureFlag/feature-flags.service";
+
+class MockAppStore<T> {
+ getState(){
+ return {
+ "global": {
+ "name": null,
+ "flags": {
+ "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false,
+ "FLAG_SHOW_ASSIGNMENTS": true,
+ "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
+ "FLAG_UNASSIGN_SERVICE": true,
+ "FLAG_SHOW_VERIFY_SERVICE": false,
+ "FLAG_COLLECTION_RESOURCE_SUPPORT": true,
+ "FLAG_DUPLICATE_VNF": true,
+ "FLAG_SERVICE_MODEL_CACHE": true,
+ "CREATE_INSTANCE_TEST": false,
+ "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false,
+ "FLAG_ASYNC_INSTANTIATION": true,
+ "FLAG_ASYNC_JOBS": true,
+ "EMPTY_DRAWING_BOARD_TEST": false,
+ "FLAG_ADD_MSO_TESTAPI_FIELD": true
+ },
+ "type": "[FLAGS] Update"
+ },
+ "service": {
+ "serviceHierarchy": {
+ "6e59c5de-f052-46fa-aa7e-2fca9d674c44": {
+ "service": {
+ "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "name": "ComplexService",
+ "version": "1.0",
+ "toscaModelURL": null,
+ "category": "Emanuel",
+ "serviceType": "",
+ "serviceRole": "",
+ "description": "ComplexService",
+ "serviceEcompNaming": "false",
+ "instantiationType": "Macro",
+ "inputs": {}
+ },
+ "vnfs": {
+ "VF_vMee 0": {
+ "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60",
+ "invariantUuid": "4160458e-f648-4b30-a176-43881ffffe9e",
+ "description": "VSP_vMee",
+ "name": "VF_vMee",
+ "version": "2.0",
+ "customizationUuid": "91415b44-753d-494c-926a-456a9172bbb9",
+ "inputs": {},
+ "commands": {},
+ "properties": {
+ "max_instances": 10,
+ "min_instances": 1,
+ "gpb2_Internal2_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-ipv6-egress_src_start_port": "0",
+ "sctp-a-ipv6-egress_rule_application": "any",
+ "Internal2_allow_transit": "true",
+ "sctp-b-IPv6_ethertype": "IPv6",
+ "sctp-a-egress_rule_application": "any",
+ "sctp-b-ingress_action": "pass",
+ "sctp-b-ingress_rule_protocol": "icmp",
+ "ncb2_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-ipv6-ingress-src_start_port": "0.0",
+ "ncb1_Internal2_mac": "00:11:22:EF:AC:DF",
+ "fsb_volume_size_0": "320.0",
+ "sctp-b-egress_src_addresses": "local",
+ "sctp-a-ipv6-ingress_ethertype": "IPv4",
+ "sctp-a-ipv6-ingress-dst_start_port": "0",
+ "sctp-b-ipv6-ingress_rule_application": "any",
+ "domain_name": "default-domain",
+ "sctp-a-ingress_rule_protocol": "icmp",
+ "sctp-b-egress-src_start_port": "0.0",
+ "sctp-a-egress_src_addresses": "local",
+ "sctp-b-display_name": "epc-sctp-b-ipv4v6-sec-group",
+ "sctp-a-egress-src_start_port": "0.0",
+ "sctp-a-ingress_ethertype": "IPv4",
+ "sctp-b-ipv6-ingress-dst_end_port": "65535",
+ "sctp-b-dst_subnet_prefix_v6": "::",
+ "nf_naming": "{ecomp_generated_naming=true}",
+ "sctp-a-ipv6-ingress_src_subnet_prefix": "0.0.0.0",
+ "sctp-b-egress-dst_start_port": "0.0",
+ "ncb_flavor_name": "nv.c20r64d1",
+ "gpb1_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-egress_dst_subnet_prefix_len": "0.0",
+ "Internal2_net_cidr": "10.0.0.10",
+ "sctp-a-ingress-dst_start_port": "0.0",
+ "sctp-a-egress-dst_start_port": "0.0",
+ "fsb1_Internal2_mac": "00:11:22:EF:AC:DF",
+ "sctp-a-egress_ethertype": "IPv4",
+ "vlc_st_service_mode": "in-network-nat",
+ "sctp-a-ipv6-egress_ethertype": "IPv4",
+ "sctp-a-egress-src_end_port": "65535.0",
+ "sctp-b-ipv6-egress_rule_application": "any",
+ "sctp-b-egress_action": "pass",
+ "sctp-a-ingress-src_subnet_prefix_len": "0.0",
+ "sctp-b-ipv6-ingress-src_end_port": "65535.0",
+ "sctp-b-name": "epc-sctp-b-ipv4v6-sec-group",
+ "fsb2_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-a-ipv6-ingress-src_start_port": "0.0",
+ "sctp-b-ipv6-egress_ethertype": "IPv4",
+ "Internal1_net_cidr": "10.0.0.10",
+ "sctp-a-egress_dst_subnet_prefix": "0.0.0.0",
+ "fsb_flavor_name": "nv.c20r64d1",
+ "sctp_rule_protocol": "132",
+ "sctp-b-ipv6-ingress_src_subnet_prefix_len": "0",
+ "sctp-a-ipv6-ingress_rule_application": "any",
+ "ecomp_generated_naming": "false",
+ "sctp-a-IPv6_ethertype": "IPv6",
+ "vlc2_Internal1_mac": "00:11:22:EF:AC:DF",
+ "vlc_st_virtualization_type": "virtual-machine",
+ "sctp-b-ingress-dst_start_port": "0.0",
+ "sctp-b-ingress-dst_end_port": "65535.0",
+ "sctp-a-ipv6-ingress-src_end_port": "65535.0",
+ "sctp-a-display_name": "epc-sctp-a-ipv4v6-sec-group",
+ "sctp-b-ingress_rule_application": "any",
+ "int2_sec_group_name": "int2-sec-group",
+ "vlc_flavor_name": "nd.c16r64d1",
+ "sctp-b-ipv6-egress_src_addresses": "local",
+ "vlc_st_interface_type_int1": "other1",
+ "sctp-b-egress-src_end_port": "65535.0",
+ "sctp-a-ipv6-egress-dst_start_port": "0",
+ "vlc_st_interface_type_int2": "other2",
+ "sctp-a-ipv6-egress_rule_protocol": "any",
+ "Internal2_shared": "false",
+ "sctp-a-ipv6-egress_dst_subnet_prefix_len": "0",
+ "Internal2_rpf": "disable",
+ "vlc1_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-ipv6-egress_src_end_port": "65535",
+ "sctp-a-ipv6-egress_src_addresses": "local",
+ "sctp-a-ingress-dst_end_port": "65535.0",
+ "sctp-a-ipv6-egress_src_end_port": "65535",
+ "Internal1_forwarding_mode": "l2",
+ "Internal2_dhcp": "false",
+ "sctp-a-dst_subnet_prefix_v6": "::",
+ "pxe_image_name": "MME_PXE-Boot_16ACP04_GA.qcow2",
+ "vlc_st_interface_type_gtp": "other0",
+ "ncb1_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-src_subnet_prefix_v6": "::",
+ "sctp-a-egress_dst_subnet_prefix_len": "0.0",
+ "int1_sec_group_name": "int1-sec-group",
+ "Internal1_dhcp": "false",
+ "sctp-a-ipv6-egress_dst_end_port": "65535",
+ "Internal2_forwarding_mode": "l2",
+ "fsb2_Internal2_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-egress_dst_subnet_prefix": "0.0.0.0",
+ "Internal1_net_cidr_len": "17",
+ "gpb2_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-ingress-src_subnet_prefix_len": "0.0",
+ "sctp-a-ingress_dst_addresses": "local",
+ "sctp-a-egress_action": "pass",
+ "fsb_volume_type_0": "SF-Default-SSD",
+ "ncb2_Internal2_mac": "00:11:22:EF:AC:DF",
+ "vlc_st_interface_type_sctp_a": "left",
+ "vlc_st_interface_type_sctp_b": "right",
+ "sctp-a-src_subnet_prefix_v6": "::",
+ "vlc_st_version": "2",
+ "sctp-b-egress_ethertype": "IPv4",
+ "sctp-a-ingress_rule_application": "any",
+ "gpb1_Internal2_mac": "00:11:22:EF:AC:DF",
+ "instance_ip_family_v6": "v6",
+ "sctp-a-ipv6-egress_src_start_port": "0",
+ "sctp-b-ingress-src_start_port": "0.0",
+ "sctp-b-ingress_dst_addresses": "local",
+ "fsb1_Internal1_mac": "00:11:22:EF:AC:DF",
+ "vlc_st_interface_type_oam": "management",
+ "multi_stage_design": "true",
+ "oam_sec_group_name": "oam-sec-group",
+ "Internal2_net_gateway": "10.0.0.10",
+ "sctp-a-ipv6-ingress-dst_end_port": "65535",
+ "sctp-b-ipv6-egress-dst_start_port": "0",
+ "Internal1_net_gateway": "10.0.0.10",
+ "sctp-b-ipv6-egress_rule_protocol": "any",
+ "gtp_sec_group_name": "gtp-sec-group",
+ "sctp-a-ipv6-egress_dst_subnet_prefix": "0.0.0.0",
+ "sctp-b-ipv6-egress_dst_subnet_prefix_len": "0",
+ "sctp-a-ipv6-ingress_dst_addresses": "local",
+ "sctp-a-egress_rule_protocol": "icmp",
+ "sctp-b-ipv6-egress_action": "pass",
+ "sctp-a-ipv6-egress_action": "pass",
+ "Internal1_shared": "false",
+ "sctp-b-ipv6-ingress_rule_protocol": "any",
+ "Internal2_net_cidr_len": "17",
+ "sctp-a-name": "epc-sctp-a-ipv4v6-sec-group",
+ "sctp-a-ingress-src_end_port": "65535.0",
+ "sctp-b-ipv6-ingress_src_subnet_prefix": "0.0.0.0",
+ "sctp-a-egress-dst_end_port": "65535.0",
+ "sctp-a-ingress_action": "pass",
+ "sctp-b-egress_rule_protocol": "icmp",
+ "sctp-b-ipv6-ingress_action": "pass",
+ "vlc_st_service_type": "firewall",
+ "sctp-b-ipv6-egress_dst_end_port": "65535",
+ "sctp-b-ipv6-ingress-dst_start_port": "0",
+ "vlc2_Internal2_mac": "00:11:22:EF:AC:DF",
+ "vlc_st_availability_zone": "true",
+ "fsb_volume_image_name_1": "MME_FSB2_16ACP04_GA.qcow2",
+ "sctp-b-ingress-src_subnet_prefix": "0.0.0.0",
+ "sctp-a-ipv6-ingress_src_subnet_prefix_len": "0",
+ "Internal1_allow_transit": "true",
+ "gpb_flavor_name": "nv.c20r64d1",
+ "availability_zone_max_count": "1",
+ "fsb_volume_image_name_0": "MME_FSB1_16ACP04_GA.qcow2",
+ "sctp-b-ipv6-ingress_dst_addresses": "local",
+ "sctp-b-ipv6-egress_dst_subnet_prefix": "0.0.0.0",
+ "sctp-b-ipv6-ingress_ethertype": "IPv4",
+ "vlc1_Internal2_mac": "00:11:22:EF:AC:DF",
+ "sctp-a-ingress-src_subnet_prefix": "0.0.0.0",
+ "sctp-a-ipv6-ingress_action": "pass",
+ "Internal1_rpf": "disable",
+ "sctp-b-ingress_ethertype": "IPv4",
+ "sctp-b-egress_rule_application": "any",
+ "sctp-b-ingress-src_end_port": "65535.0",
+ "sctp-a-ipv6-ingress_rule_protocol": "any",
+ "sctp-a-ingress-src_start_port": "0.0",
+ "sctp-b-egress-dst_end_port": "65535.0"
+ },
+ "type": "VF",
+ "modelCustomizationName": "VF_vMee 0",
+ "vfModules": {
+ "vf_vmee0..VfVmee..vmme_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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..vmme_vlc..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "vmme_vlc"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ },
+ "vf_vmee0..VfVmee..vmme_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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..vmme_gpb..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "vmme_gpb"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "vf_vmee0..VfVmee..base_vmme..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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "base_vmme"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "vf_vmee0..VfVmee..base_vmme..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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "base_vmme"
+ },
+ "inputs": {}
+ }
+ },
+ "vfcInstanceGroups": {}
+ }
+ },
+ "networks": {
+ "ExtVL 0": {
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ "invariantUuid": "379f816b-a7aa-422f-be30-17114ff50b7c",
+ "description": "ECOMP generic virtual link (network) base type for all other service-level and global networks",
+ "name": "ExtVL",
+ "version": "37.0",
+ "customizationUuid": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+ "inputs": {},
+ "commands": {},
+ "properties": {
+ "network_assignments": "{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}",
+ "exVL_naming": "{ecomp_generated_naming=true}",
+ "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}",
+ "network_homing": "{ecomp_selected_instance_node_target=false}"
+ },
+ "type": "VL",
+ "modelCustomizationName": "ExtVL 0"
+ }
+ },
+ "collectionResource": {},
+ "configurations": {
+ "Port Mirroring Configuration By Policy 0": {
+ "uuid": "b4398538-e89d-4f13-b33d-ca323434ba50",
+ "invariantUuid": "6ef0ca40-f366-4897-951f-abd65d25f6f7",
+ "description": "A port mirroring configuration by policy object",
+ "name": "Port Mirroring Configuration By Policy",
+ "version": "27.0",
+ "customizationUuid": "3c3b7b8d-8669-4b3b-8664-61970041fad2",
+ "inputs": {},
+ "commands": {},
+ "properties": {},
+ "type": "Configuration",
+ "modelCustomizationName": "Port Mirroring Configuration By Policy 0",
+ "sourceNodes": [],
+ "collectorNodes": null,
+ "configurationByPolicy": false
+ }
+ },
+ "serviceProxies": {},
+ "vfModules": {
+ "vf_vmee0..VfVmee..vmme_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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..vmme_vlc..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "vmme_vlc"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ },
+ "vf_vmee0..VfVmee..vmme_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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..vmme_gpb..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "vmme_gpb"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "vf_vmee0..VfVmee..base_vmme..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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "base_vmme"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "vf_vmee0..VfVmee..base_vmme..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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "base_vmme"
+ },
+ "inputs": {}
+ }
+ },
+ "pnfs": {}
+ }
+ },
+ "serviceInstance": {
+ "6e59c5de-f052-46fa-aa7e-2fca9d674c44": {
+ "vnfs": {
+ "VF_vMee 0": {
+ "rollbackOnFailure": "true",
+ "vfModules": {
+ "vf_vmee0..VfVmee..base_vmme..module-0": {
+ "vf_vmee0..VfVmee..base_vmme..module-0vmvzo": {
+ "isMissingData": false,
+ "sdncPreReload": null,
+ "modelInfo": {
+ "modelType": "VFmodule",
+ "modelInvariantId": "a6f9e51a-2b35-416a-ae15-15e58d61f36d",
+ "modelVersionId": "a27f5cfc-7f12-4f99-af08-0af9c3885c87",
+ "modelName": "VfVmee..base_vmme..module-0",
+ "modelVersion": "2",
+ "modelCustomizationId": "f8c040f1-7e51-4a11-aca8-acf256cfd861",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0"
+ },
+ "instanceParams": [
+ {}
+ ],
+ "trackById": "wmtm6sy2uj"
+ }
+ }
+ },
+ "isMissingData": true,
+ "originalName": "VF_vMee 0",
+ "vnfStoreKey": "VF_vMee 0",
+ "trackById": "p3wk448m5do",
+ "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60",
+ "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+ "lcpCloudRegionId": null,
+ "tenantId": null,
+ "lineOfBusiness": null,
+ "platformName": null,
+ "modelInfo": {
+ "modelType": "VF",
+ "modelInvariantId": "4160458e-f648-4b30-a176-43881ffffe9e",
+ "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ "modelName": "VF_vMee",
+ "modelVersion": "2.0",
+ "modelCustomizationName": "VF_vMee 0"
+ }
+ }
+ },
+ "instanceParams": [
+ {}
+ ],
+ "validationCounter": 1,
+ "existingNames": {},
+ "existingVNFCounterMap": {
+ "d6557200-ecf2-4641-8094-5393ae3aae60": 1
+ },
+ "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "subscriptionServiceType": "TYLER SILVIA",
+ "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+ "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+ "lcpCloudRegionId": "hvf6",
+ "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+ "aicZoneId": "JAG1",
+ "projectName": "x1",
+ "rollbackOnFailure": "true",
+ "bulkSize": 1,
+ "modelInfo": {
+ "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ "modelName": "ComplexService",
+ "modelVersion": "1.0",
+ "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44"
+ },
+ "isALaCarte": false,
+ "name": "ComplexService",
+ "version": "1.0",
+ "description": "ComplexService",
+ "category": "Emanuel",
+ "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "serviceType": "",
+ "serviceRole": "",
+ "isMultiStepDesign": false
+ }
+ },
+ "lcpRegionsAndTenants": {
+ "lcpRegionList": [
+ {
+ "id": "JANET25",
+ "name": "JANET25",
+ "isPermitted": true
+ },
+ {
+ "id": "hvf6",
+ "name": "hvf6",
+ "isPermitted": true
+ }
+ ],
+ "lcpRegionsTenantsMap": {
+ "JANET25": [
+ {
+ "id": "092eb9e8e4b7412e8787dd091bc58e86",
+ "name": "USP-SIP-IC-24335-T-01",
+ "isPermitted": true
+ }
+ ],
+ "hvf6": [
+ {
+ "id": "bae71557c5bb4d5aac6743a4e5f1d054",
+ "name": "AIN Web Tool-15-D-testalexandria",
+ "isPermitted": true
+ },
+ {
+ "id": "229bcdc6eaeb4ca59d55221141d01f8e",
+ "name": "AIN Web Tool-15-D-STTest2",
+ "isPermitted": true
+ },
+ {
+ "id": "1178612d2b394be4834ad77f567c0af2",
+ "name": "AIN Web Tool-15-D-SSPtestcustome",
+ "isPermitted": true
+ },
+ {
+ "id": "19c5ade915eb461e8af52fb2fd8cd1f2",
+ "name": "AIN Web Tool-15-D-UncheckedEcopm",
+ "isPermitted": true
+ },
+ {
+ "id": "de007636e25249238447264a988a927b",
+ "name": "AIN Web Tool-15-D-dfsdf",
+ "isPermitted": true
+ },
+ {
+ "id": "62f29b3613634ca6a3065cbe0e020c44",
+ "name": "AIN/SMS-16-D-Multiservices1",
+ "isPermitted": true
+ },
+ {
+ "id": "649289e30d3244e0b48098114d63c2aa",
+ "name": "AIN Web Tool-15-D-SSPST66",
+ "isPermitted": true
+ },
+ {
+ "id": "3f21eeea6c2c486bba31dab816c05a32",
+ "name": "AIN Web Tool-15-D-ASSPST47",
+ "isPermitted": true
+ },
+ {
+ "id": "f60ce21d3ee6427586cff0d22b03b773",
+ "name": "CESAR-100-D-sspjg67246",
+ "isPermitted": true
+ },
+ {
+ "id": "8774659e425f479895ae091bb5d46560",
+ "name": "CESAR-100-D-sspjg68359",
+ "isPermitted": true
+ },
+ {
+ "id": "624eb554b0d147c19ff8885341760481",
+ "name": "AINWebTool-15-D-iftach",
+ "isPermitted": true
+ },
+ {
+ "id": "214f55f5fc414c678059c383b03e4962",
+ "name": "CESAR-100-D-sspjg612401",
+ "isPermitted": true
+ },
+ {
+ "id": "c90666c291664841bb98e4d981ff1db5",
+ "name": "CESAR-100-D-sspjg621340",
+ "isPermitted": true
+ },
+ {
+ "id": "ce5b6bc5c7b348e1bf4b91ac9a174278",
+ "name": "sspjg621351cloned",
+ "isPermitted": true
+ },
+ {
+ "id": "b386b768a3f24c8e953abbe0b3488c02",
+ "name": "AINWebTool-15-D-eteancomp",
+ "isPermitted": true
+ },
+ {
+ "id": "dc6c4dbfd225474e9deaadd34968646c",
+ "name": "AINWebTool-15-T-SPFET",
+ "isPermitted": true
+ },
+ {
+ "id": "02cb5030e9914aa4be120bd9ed1e19eb",
+ "name": "AINWebTool-15-X-eeweww",
+ "isPermitted": true
+ },
+ {
+ "id": "f2f3830e4c984d45bcd00e1a04158a79",
+ "name": "CESAR-100-D-spjg61909",
+ "isPermitted": true
+ },
+ {
+ "id": "05b91bd5137f4929878edd965755c06d",
+ "name": "CESAR-100-D-sspjg621512cloned",
+ "isPermitted": true
+ },
+ {
+ "id": "7002fbe8482d4a989ddf445b1ce336e0",
+ "name": "AINWebTool-15-X-vdr",
+ "isPermitted": true
+ },
+ {
+ "id": "4008522be43741dcb1f5422022a2aa0b",
+ "name": "AINWebTool-15-D-ssasa",
+ "isPermitted": true
+ },
+ {
+ "id": "f44e2e96a1b6476abfda2fa407b00169",
+ "name": "AINWebTool-15-D-PFNPT",
+ "isPermitted": true
+ },
+ {
+ "id": "b69a52bec8a84669a37a1e8b72708be7",
+ "name": "AINWebTool-15-X-vdre",
+ "isPermitted": true
+ },
+ {
+ "id": "fac7d9fd56154caeb9332202dcf2969f",
+ "name": "AINWebTool-15-X-NONPODECOMP",
+ "isPermitted": true
+ },
+ {
+ "id": "2d34d8396e194eb49969fd61ffbff961",
+ "name": "DN5242-Nov16-T5",
+ "isPermitted": true
+ },
+ {
+ "id": "cb42a77ff45b48a8b8deb83bb64acc74",
+ "name": "ro-T11",
+ "isPermitted": true
+ },
+ {
+ "id": "fa45ca53c80b492fa8be5477cd84fc2b",
+ "name": "ro-T112",
+ "isPermitted": true
+ },
+ {
+ "id": "4914ab0ab3a743e58f0eefdacc1dde77",
+ "name": "DN5242-Nov21-T1",
+ "isPermitted": true
+ },
+ {
+ "id": "d0a3e3f2964542259d155a81c41aadc3",
+ "name": "test-hvf6-09",
+ "isPermitted": true
+ },
+ {
+ "id": "cbb99fe4ada84631b7baf046b6fd2044",
+ "name": "DN5242-Nov16-T3",
+ "isPermitted": true
+ }
+ ]
+ }
+ },
+ "productFamilies": [
+ {
+ "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+ "name": "SCOTTIE",
+ "isPermitted": true
+ },
+ {
+ "id": "17cc1042-527b-11e6-beb8-9e71128cae77",
+ "name": "IGNACIO",
+ "isPermitted": true
+ },
+ {
+ "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+ "name": "Christie",
+ "isPermitted": true
+ },
+ {
+ "id": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7",
+ "name": "Enhanced Services",
+ "isPermitted": true
+ },
+ {
+ "id": "vTerrance",
+ "name": "vTerrance",
+ "isPermitted": true
+ },
+ {
+ "id": "323d69d9-2efe-4r45-ay0a-89ea7ard4e6f",
+ "name": "vSCP",
+ "isPermitted": true
+ },
+ {
+ "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+ "name": "Emanuel",
+ "isPermitted": true
+ },
+ {
+ "id": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+ "name": "BVOIP",
+ "isPermitted": true
+ },
+ {
+ "id": "db171b8f-115c-4992-a2e3-ee04cae357e0",
+ "name": "LINDSEY",
+ "isPermitted": true
+ },
+ {
+ "id": "LRSI-OSPF",
+ "name": "LRSI-OSPF",
+ "isPermitted": true
+ },
+ {
+ "id": "vRosemarie",
+ "name": "HNGATEWAY",
+ "isPermitted": true
+ },
+ {
+ "id": "vHNPaas",
+ "name": "WILKINS",
+ "isPermitted": true
+ },
+ {
+ "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "name": "TYLER SILVIA",
+ "isPermitted": true
+ },
+ {
+ "id": "b6a3f28c-eebf-494c-a900-055cc7c874ce",
+ "name": "VROUTER",
+ "isPermitted": true
+ },
+ {
+ "id": "Cisneros",
+ "name": "vMuriel",
+ "isPermitted": true
+ },
+ {
+ "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1",
+ "name": "CARA Griffin",
+ "isPermitted": true
+ },
+ {
+ "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d",
+ "name": "DARREN MCGEE",
+ "isPermitted": true
+ },
+ {
+ "id": "e30755dc-5673-4b6b-9dcf-9abdd96b93d1",
+ "name": "Transport",
+ "isPermitted": true
+ },
+ {
+ "id": "vSalvatore",
+ "name": "vSalvatore",
+ "isPermitted": true
+ },
+ {
+ "id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4",
+ "name": "Josefina",
+ "isPermitted": true
+ },
+ {
+ "id": "vHubbard",
+ "name": "vHubbard",
+ "isPermitted": true
+ },
+ {
+ "id": "12a96a9d-4b4c-4349-a950-fe1159602621",
+ "name": "DARREN MCGEE",
+ "isPermitted": true
+ }
+ ],
+ "serviceTypes": {
+ "e433710f-9217-458d-a79d-1c7aff376d89": [
+ {
+ "id": "0",
+ "name": "vRichardson",
+ "isPermitted": false
+ },
+ {
+ "id": "1",
+ "name": "TYLER SILVIA",
+ "isPermitted": true
+ },
+ {
+ "id": "2",
+ "name": "Emanuel",
+ "isPermitted": false
+ },
+ {
+ "id": "3",
+ "name": "vJamie",
+ "isPermitted": false
+ },
+ {
+ "id": "4",
+ "name": "vVoiceMail",
+ "isPermitted": false
+ },
+ {
+ "id": "5",
+ "name": "Kennedy",
+ "isPermitted": false
+ },
+ {
+ "id": "6",
+ "name": "vSEGW",
+ "isPermitted": false
+ },
+ {
+ "id": "7",
+ "name": "vVM",
+ "isPermitted": false
+ },
+ {
+ "id": "8",
+ "name": "vOTA",
+ "isPermitted": false
+ },
+ {
+ "id": "9",
+ "name": "vMME",
+ "isPermitted": false
+ },
+ {
+ "id": "10",
+ "name": "vMNS",
+ "isPermitted": false
+ },
+ {
+ "id": "11",
+ "name": "vSCP",
+ "isPermitted": false
+ },
+ {
+ "id": "12",
+ "name": "VPMS",
+ "isPermitted": false
+ },
+ {
+ "id": "13",
+ "name": "vMMSC",
+ "isPermitted": false
+ },
+ {
+ "id": "14",
+ "name": "SSD",
+ "isPermitted": false
+ },
+ {
+ "id": "15",
+ "name": "vMOG",
+ "isPermitted": false
+ },
+ {
+ "id": "16",
+ "name": "LINDSEY",
+ "isPermitted": false
+ },
+ {
+ "id": "17",
+ "name": "JOHANNA_SANTOS",
+ "isPermitted": false
+ },
+ {
+ "id": "18",
+ "name": "vCarroll",
+ "isPermitted": false
+ }
+ ]
+ },
+ "aicZones": [
+ {
+ "id": "NFT1",
+ "name": "NFTJSSSS-NFT1"
+ },
+ {
+ "id": "JAG1",
+ "name": "YUDFJULP-JAG1"
+ },
+ {
+ "id": "YYY1",
+ "name": "UUUAIAAI-YYY1"
+ },
+ {
+ "id": "BAN1",
+ "name": "VSDKYUTP-BAN1"
+ },
+ {
+ "id": "DKJ1",
+ "name": "DKJSJDKA-DKJ1"
+ },
+ {
+ "id": "MCS1",
+ "name": "ASACMAMS-MCS1"
+ },
+ {
+ "id": "UIO1",
+ "name": "uioclli1-UIO1"
+ },
+ {
+ "id": "RAJ1",
+ "name": "YGBIJNLQ-RAJ1"
+ },
+ {
+ "id": "OPA1",
+ "name": "opaclli1-OPA1"
+ },
+ {
+ "id": "SDE1",
+ "name": "ZXCVBNMA-SDE1"
+ },
+ {
+ "id": "VEN2",
+ "name": "FGHJUHIL-VEN2"
+ },
+ {
+ "id": "ORL1",
+ "name": "ORLDFLMA-ORL1"
+ },
+ {
+ "id": "JAD1",
+ "name": "JADECLLI-JAD1"
+ },
+ {
+ "id": "ZXL1",
+ "name": "LWLWCANN-ZXL1"
+ },
+ {
+ "id": "CKL1",
+ "name": "CLKSKCKK-CKL1"
+ },
+ {
+ "id": "SDF1",
+ "name": "sdfclli1-SDF1"
+ },
+ {
+ "id": "RAD1",
+ "name": "RADICAL1-RAD1"
+ },
+ {
+ "id": "KIT1",
+ "name": "BHYJFGLN-KIT1"
+ },
+ {
+ "id": "REL1",
+ "name": "INGERFGT-REL1"
+ },
+ {
+ "id": "JNL1",
+ "name": "CJALSDAC-JNL1"
+ },
+ {
+ "id": "OLK1",
+ "name": "OLKOLKLS-OLK1"
+ },
+ {
+ "id": "CHI1",
+ "name": "CHILLIWE-CHI1"
+ },
+ {
+ "id": "UUU4",
+ "name": "UUUAAAUU-UUU4"
+ },
+ {
+ "id": "TUF1",
+ "name": "TUFCLLI1-TUF1"
+ },
+ {
+ "id": "KJN1",
+ "name": "CKALDKSA-KJN1"
+ },
+ {
+ "id": "SAM1",
+ "name": "SNDGCA64-SAN1"
+ },
+ {
+ "id": "SCK1",
+ "name": "SCKSCKSK-SCK1"
+ },
+ {
+ "id": "HJH1",
+ "name": "AOEEQQQD-HJH1"
+ },
+ {
+ "id": "HGD1",
+ "name": "SDFQWHGD-HGD1"
+ },
+ {
+ "id": "KOR1",
+ "name": "HYFLNBVT-KOR1"
+ },
+ {
+ "id": "ATL43",
+ "name": "AICLOCID-ATL43"
+ },
+ {
+ "id": "ATL54",
+ "name": "AICFTAAI-ATL54"
+ },
+ {
+ "id": "ATL66",
+ "name": "CLLIAAII-ATL66"
+ },
+ {
+ "id": "VEL1",
+ "name": "BNMLKUIK-VEL1"
+ },
+ {
+ "id": "ICC1",
+ "name": "SANJITAT-ICC1"
+ },
+ {
+ "id": "MNT11",
+ "name": "WSXEFBTH-MNT11"
+ },
+ {
+ "id": "DEF2",
+ "name": "WSBHGTYL-DEF2"
+ },
+ {
+ "id": "MAD11",
+ "name": "SDFQWGKL-MAD11"
+ },
+ {
+ "id": "OLG1",
+ "name": "OLHOLHOL-OLG1"
+ },
+ {
+ "id": "GAR1",
+ "name": "NGFVSJKO-GAR1"
+ },
+ {
+ "id": "SAN22",
+ "name": "GNVLSCTL-SAN22"
+ },
+ {
+ "id": "HRG1",
+ "name": "HRGHRGGS-HRG1"
+ },
+ {
+ "id": "JCS1",
+ "name": "JCSJSCJS-JCS1"
+ },
+ {
+ "id": "DHA12",
+ "name": "WSXEDECF-DHA12"
+ },
+ {
+ "id": "HJE1",
+ "name": "AOEEWWWD-HJE1"
+ },
+ {
+ "id": "NCA1",
+ "name": "NCANCANN-NCA1"
+ },
+ {
+ "id": "IOP1",
+ "name": "iopclli1-IOP1"
+ },
+ {
+ "id": "RTY1",
+ "name": "rtyclli1-RTY1"
+ },
+ {
+ "id": "KAP1",
+ "name": "HIOUYTRQ-KAP1"
+ },
+ {
+ "id": "ZEN1",
+ "name": "ZENCLLI1-ZEN1"
+ },
+ {
+ "id": "HKA1",
+ "name": "JAKHLASS-HKA1"
+ },
+ {
+ "id": "CQK1",
+ "name": "CQKSCAKK-CQK1"
+ },
+ {
+ "id": "SAI1",
+ "name": "UBEKQLPD-SAI1"
+ },
+ {
+ "id": "ERT1",
+ "name": "ertclli1-ERT1"
+ },
+ {
+ "id": "IBB1",
+ "name": "PLMKOIJU-IBB1"
+ },
+ {
+ "id": "TIR2",
+ "name": "PLKINHYI-TIR2"
+ },
+ {
+ "id": "HSD1",
+ "name": "CHASKCDS-HSD1"
+ },
+ {
+ "id": "SLF78",
+ "name": "SDCTLFN1-SLF78"
+ },
+ {
+ "id": "SEE78",
+ "name": "SDCTEEE4-SEE78"
+ },
+ {
+ "id": "SAN13",
+ "name": "TOKYJPFA-SAN13"
+ },
+ {
+ "id": "SAA78",
+ "name": "SDCTAAA1-SAA78"
+ },
+ {
+ "id": "LUC1",
+ "name": "ATLDFGYC-LUC1"
+ },
+ {
+ "id": "AMD13",
+ "name": "MEMATLAN-AMD13"
+ },
+ {
+ "id": "TOR1",
+ "name": "TOROONXN-TOR1"
+ },
+ {
+ "id": "QWE1",
+ "name": "QWECLLI1-QWE1"
+ },
+ {
+ "id": "ZOG1",
+ "name": "ZOGASTRO-ZOG1"
+ },
+ {
+ "id": "CAL33",
+ "name": "CALIFORN-CAL33"
+ },
+ {
+ "id": "SHH78",
+ "name": "SDIT1HHH-SHH78"
+ },
+ {
+ "id": "DSA1",
+ "name": "LKJHGFDS-DSA1"
+ },
+ {
+ "id": "CLG1",
+ "name": "CLGRABAD-CLG1"
+ },
+ {
+ "id": "BNA1",
+ "name": "BNARAGBK-BNA1"
+ },
+ {
+ "id": "ATL84",
+ "name": "CANTTCOC-ATL84"
+ },
+ {
+ "id": "APP1",
+ "name": "WBHGTYUI-APP1"
+ },
+ {
+ "id": "RJN1",
+ "name": "RJNRBZAW-RJN1"
+ },
+ {
+ "id": "EHH78",
+ "name": "SDCSHHH5-EHH78"
+ },
+ {
+ "id": "mac10",
+ "name": "PKGTESTF-mac10"
+ },
+ {
+ "id": "SXB78",
+ "name": "SDCTGXB1-SXB78"
+ },
+ {
+ "id": "SAX78",
+ "name": "SDCTAXG1-SAX78"
+ },
+ {
+ "id": "SYD1",
+ "name": "SYDNAUBV-SYD1"
+ },
+ {
+ "id": "TOK1",
+ "name": "TOKYJPFA-TOK1"
+ },
+ {
+ "id": "KGM2",
+ "name": "KGMTNC20-KGM2"
+ },
+ {
+ "id": "DCC1b",
+ "name": "POIUYTGH-DCC1b"
+ },
+ {
+ "id": "SKK78",
+ "name": "SDCTKKK1-SKK78"
+ },
+ {
+ "id": "SGG78",
+ "name": "SDCTGGG1-SGG78"
+ },
+ {
+ "id": "SJJ78",
+ "name": "SDCTJJJ1-SJJ78"
+ },
+ {
+ "id": "SBX78",
+ "name": "SDCTBXG1-SBX78"
+ },
+ {
+ "id": "LAG1",
+ "name": "LARGIZON-LAG1"
+ },
+ {
+ "id": "IAA1",
+ "name": "QAZXSWED-IAA1"
+ },
+ {
+ "id": "POI1",
+ "name": "PLMNJKIU-POI1"
+ },
+ {
+ "id": "LAG1a",
+ "name": "LARGIZON-LAG1a"
+ },
+ {
+ "id": "PBL1",
+ "name": "PBLAPBAI-PBL1"
+ },
+ {
+ "id": "LAG45",
+ "name": "LARGIZON-LAG1a"
+ },
+ {
+ "id": "MAR1",
+ "name": "MNBVCXZM-MAR1"
+ },
+ {
+ "id": "HST70",
+ "name": "HSTNTX70-HST70"
+ },
+ {
+ "id": "DCC1a",
+ "name": "POIUYTGH-DCC1a"
+ },
+ {
+ "id": "TOL1",
+ "name": "TOLDOH21-TOL1"
+ },
+ {
+ "id": "LON1",
+ "name": "LONEENCO-LON1"
+ },
+ {
+ "id": "SJU78",
+ "name": "SDIT1JUB-SJU78"
+ },
+ {
+ "id": "STN27",
+ "name": "HSTNTX01-STN27"
+ },
+ {
+ "id": "SSW56",
+ "name": "ss8126GT-SSW56"
+ },
+ {
+ "id": "SBB78",
+ "name": "SDIT1BBB-SBB78"
+ },
+ {
+ "id": "DCC3",
+ "name": "POIUYTGH-DCC3"
+ },
+ {
+ "id": "GNV1",
+ "name": "GNVLSCTL-GNV1"
+ },
+ {
+ "id": "WAS1",
+ "name": "WASHDCSW-WAS1"
+ },
+ {
+ "id": "TOY1",
+ "name": "TORYONNZ-TOY1"
+ },
+ {
+ "id": "STT1",
+ "name": "STTLWA02-STT1"
+ },
+ {
+ "id": "STG1",
+ "name": "STTGGE62-STG1"
+ },
+ {
+ "id": "SLL78",
+ "name": "SDCTLLL1-SLL78"
+ },
+ {
+ "id": "SBU78",
+ "name": "SDIT1BUB-SBU78"
+ },
+ {
+ "id": "ATL2",
+ "name": "ATLNGANW-ATL2"
+ },
+ {
+ "id": "BOT1",
+ "name": "BOTHWAKY-BOT1"
+ },
+ {
+ "id": "SNG1",
+ "name": "SNGPSIAU-SNG1"
+ },
+ {
+ "id": "NYC1",
+ "name": "NYCMNY54-NYC1"
+ },
+ {
+ "id": "LAG1b",
+ "name": "LARGIZON-LAG1b"
+ },
+ {
+ "id": "AMD15",
+ "name": "AMDFAA01-AMD15"
+ },
+ {
+ "id": "SNA1",
+ "name": "SNANTXCA-SNA1"
+ },
+ {
+ "id": "PLT1",
+ "name": "PLTNCA60-PLT1"
+ },
+ {
+ "id": "TLP1",
+ "name": "TLPNXM18-TLP1"
+ },
+ {
+ "id": "SDD81",
+ "name": "SAIT1DD6-SDD81"
+ },
+ {
+ "id": "DCC1",
+ "name": "POIUYTGH-DCC1"
+ },
+ {
+ "id": "DCC2",
+ "name": "POIUYTGH-DCC2"
+ },
+ {
+ "id": "OKC1",
+ "name": "OKCBOK55-OKC1"
+ },
+ {
+ "id": "PAR1",
+ "name": "PARSFRCG-PAR1"
+ },
+ {
+ "id": "TES36",
+ "name": "ABCEETES-TES36"
+ },
+ {
+ "id": "COM1",
+ "name": "PLMKOPIU-COM1"
+ },
+ {
+ "id": "ANI1",
+ "name": "ATLNGTRE-ANI1"
+ },
+ {
+ "id": "SDG78",
+ "name": "SDIT1BDG-SDG78"
+ },
+ {
+ "id": "mac20",
+ "name": "PKGTESTF-mac20"
+ },
+ {
+ "id": "DSF45",
+ "name": "DSFBG123-DSF45"
+ },
+ {
+ "id": "HST25",
+ "name": "HSTNTX01-HST25"
+ },
+ {
+ "id": "AMD18",
+ "name": "AUDIMA01-AMD18"
+ },
+ {
+ "id": "SAA80",
+ "name": "SAIT9AA3-SAA80"
+ },
+ {
+ "id": "SSA56",
+ "name": "SSIT2AA7-SSA56"
+ },
+ {
+ "id": "SDD82",
+ "name": "SAIT1DD9-SDD82"
+ },
+ {
+ "id": "JCV1",
+ "name": "JCVLFLBW-JCV1"
+ },
+ {
+ "id": "SUL2",
+ "name": "WERTYUJK-SUL2"
+ },
+ {
+ "id": "PUR1",
+ "name": "purelyde-PUR1"
+ },
+ {
+ "id": "FDE55",
+ "name": "FDERT555-FDE55"
+ },
+ {
+ "id": "SITE",
+ "name": "LONEENCO-SITE"
+ },
+ {
+ "id": "ATL1",
+ "name": "ATLNGAMA-ATL1"
+ },
+ {
+ "id": "JUL1",
+ "name": "ZXCVBNMM-JUL1"
+ },
+ {
+ "id": "TAT34",
+ "name": "TESAAISB-TAT34"
+ },
+ {
+ "id": "XCP12",
+ "name": "CHKGH123-XCP12"
+ },
+ {
+ "id": "RAI1",
+ "name": "poiuytre-RAI1"
+ },
+ {
+ "id": "HPO1",
+ "name": "ATLNGAUP-HPO1"
+ },
+ {
+ "id": "KJF12",
+ "name": "KJFDH123-KJF12"
+ },
+ {
+ "id": "SCC80",
+ "name": "SAIT9CC3-SCC80"
+ },
+ {
+ "id": "SAA12",
+ "name": "SAIT9AF8-SAA12"
+ },
+ {
+ "id": "SAA14",
+ "name": "SAIT1AA9-SAA14"
+ },
+ {
+ "id": "ATL35",
+ "name": "TTESSAAI-ATL35"
+ },
+ {
+ "id": "CWY1",
+ "name": "CWYMOWBS-CWY1"
+ },
+ {
+ "id": "ATL76",
+ "name": "TELEPAAI-ATL76"
+ },
+ {
+ "id": "DSL12",
+ "name": "DSLFK242-DSL12"
+ },
+ {
+ "id": "ATL53",
+ "name": "AAIATLTE-ATL53"
+ },
+ {
+ "id": "SAA11",
+ "name": "SAIT9AA2-SAA11"
+ },
+ {
+ "id": "ATL62",
+ "name": "TESSASCH-ATL62"
+ },
+ {
+ "id": "AUG1",
+ "name": "ASDFGHJK-AUG1"
+ },
+ {
+ "id": "POI22",
+ "name": "POIUY123-POI22"
+ },
+ {
+ "id": "SAA13",
+ "name": "SAIT1AA9-SAA13"
+ },
+ {
+ "id": "BHY17",
+ "name": "BHYTFRF3-BHY17"
+ },
+ {
+ "id": "LIS1",
+ "name": "HOSTPROF-LIS1"
+ },
+ {
+ "id": "SIP1",
+ "name": "ZXCVBNMK-SIP1"
+ },
+ {
+ "id": "ATL99",
+ "name": "TEESTAAI-ATL43"
+ },
+ {
+ "id": "ATL64",
+ "name": "FORLOAAJ-ATL64"
+ },
+ {
+ "id": "TAT33",
+ "name": "TESAAISA-TAT33"
+ },
+ {
+ "id": "RAD10",
+ "name": "INDIPUNE-RAD10"
+ },
+ {
+ "id": "RTW5",
+ "name": "BHYTFRY4-RTW5"
+ },
+ {
+ "id": "JGS1",
+ "name": "KSJKKKKK-JGS1"
+ },
+ {
+ "id": "ATL98",
+ "name": "TEESTAAI-ATL43"
+ },
+ {
+ "id": "WAN1",
+ "name": "LEIWANGW-WAN1"
+ },
+ {
+ "id": "ATL44",
+ "name": "ATLSANAB-ATL44"
+ },
+ {
+ "id": "RTD2",
+ "name": "BHYTFRk4-RTD2"
+ },
+ {
+ "id": "NIR1",
+ "name": "ORFLMANA-NIR1"
+ },
+ {
+ "id": "ATL75",
+ "name": "SANAAIRE-ATL75"
+ },
+ {
+ "id": "NUM1",
+ "name": "QWERTYUI-NUM1"
+ },
+ {
+ "id": "MTN32",
+ "name": "MDTWNJ21-MTN32"
+ },
+ {
+ "id": "RTZ4",
+ "name": "BHYTFRZ6-RTZ4"
+ },
+ {
+ "id": "ATL56",
+ "name": "ATLSANAC-ATL56"
+ },
+ {
+ "id": "AMS1",
+ "name": "AMSTNLBW-AMS1"
+ },
+ {
+ "id": "RCT1",
+ "name": "AMSTERNL-RCT1"
+ },
+ {
+ "id": "JAN1",
+ "name": "ORFLMATT-JAN1"
+ },
+ {
+ "id": "ABC14",
+ "name": "TESAAISA-ABC14"
+ },
+ {
+ "id": "TAT37",
+ "name": "TESAAISD-TAT37"
+ },
+ {
+ "id": "MIC54",
+ "name": "MICHIGAN-MIC54"
+ },
+ {
+ "id": "ABC11",
+ "name": "ATLSANAI-ABC11"
+ },
+ {
+ "id": "AMF11",
+ "name": "AMDOCS01-AMF11"
+ },
+ {
+ "id": "ATL63",
+ "name": "ATLSANEW-ATL63"
+ },
+ {
+ "id": "ABC12",
+ "name": "ATLSECIA-ABC12"
+ },
+ {
+ "id": "MTN20",
+ "name": "MDTWNJ21-MTN20"
+ },
+ {
+ "id": "ABC15",
+ "name": "AAITESAN-ABC15"
+ },
+ {
+ "id": "AVT1",
+ "name": "AVTRFLHD-AVT1"
+ },
+ {
+ "id": "ATL34",
+ "name": "ATLSANAI-ATL34"
+ }
+ ],
+ "categoryParameters": {
+ "owningEntityList": [
+ {
+ "id": "aaa1",
+ "name": "aaa1"
+ },
+ {
+ "id": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+ "name": "WayneHolland"
+ },
+ {
+ "id": "Melissa",
+ "name": "Melissa"
+ }
+ ],
+ "projectList": [
+ {
+ "id": "WATKINS",
+ "name": "WATKINS"
+ },
+ {
+ "id": "x1",
+ "name": "x1"
+ },
+ {
+ "id": "yyy1",
+ "name": "yyy1"
+ }
+ ],
+ "lineOfBusinessList": [
+ {
+ "id": "ONAP",
+ "name": "ONAP"
+ },
+ {
+ "id": "zzz1",
+ "name": "zzz1"
+ }
+ ],
+ "platformList": [
+ {
+ "id": "platform",
+ "name": "platform"
+ },
+ {
+ "id": "xxx1",
+ "name": "xxx1"
+ }
+ ]
+ },
+ "type": "[LCP_REGIONS_AND_TENANTS] Update",
+ "subscribers": [
+ {
+ "id": "CAR_2020_ER",
+ "name": "CAR_2020_ER",
+ "isPermitted": true
+ },
+ {
+ "id": "21014aa2-526b-11e6-beb8-9e71128cae77",
+ "name": "JULIO ERICKSON",
+ "isPermitted": false
+ },
+ {
+ "id": "DHV1707-TestSubscriber-2",
+ "name": "DALE BRIDGES",
+ "isPermitted": false
+ },
+ {
+ "id": "DHV1707-TestSubscriber-1",
+ "name": "LLOYD BRIDGES",
+ "isPermitted": false
+ },
+ {
+ "id": "jimmy-example",
+ "name": "JimmyExampleCust-20161102",
+ "isPermitted": false
+ },
+ {
+ "id": "jimmy-example2",
+ "name": "JimmyExampleCust-20161103",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-TestSub-PWT-102",
+ "name": "ERICA5779-TestSub-PWT-102",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-TestSub-PWT-101",
+ "name": "ERICA5779-TestSub-PWT-101",
+ "isPermitted": false
+ },
+ {
+ "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+ "name": "Emanuel",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-Subscriber-4",
+ "name": "ERICA5779-Subscriber-5",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-TestSub-PWT-103",
+ "name": "ERICA5779-TestSub-PWT-103",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-Subscriber-2",
+ "name": "ERICA5779-Subscriber-2",
+ "isPermitted": false
+ },
+ {
+ "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "name": "SILVIA ROBBINS",
+ "isPermitted": true
+ },
+ {
+ "id": "ERICA5779-Subscriber-3",
+ "name": "ERICA5779-Subscriber-3",
+ "isPermitted": false
+ },
+ {
+ "id": "31739f3e-526b-11e6-beb8-9e71128cae77",
+ "name": "CRAIG/ROBERTS",
+ "isPermitted": false
+ }
+ ]
+ }
+ }
+ }
+}
+
+class MockFeatureFlagsService {}
+
+describe('VNF Control Generator', () => {
+ let injector;
+ let service: VnfControlGenerator;
+ let httpMock: HttpTestingController;
+
+
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+ imports: [HttpClientTestingModule],
+ providers: [VnfControlGenerator,
+ GenericFormService,
+ BasicControlGenerator,
+ AaiService,
+ FormBuilder,
+ LogService,
+ {provide:FeatureFlagsService, useClass: MockFeatureFlagsService},
+ {provide: NgRedux, useClass: MockAppStore}]
+ });
+ await TestBed.compileComponents();
+
+
+ injector = getTestBed();
+ service = injector.get(VnfControlGenerator);
+ httpMock = injector.get(HttpTestingController);
+
+ })().then(done).catch(done.fail));
+
+
+ test('getMacroFormControls check for mandatory controls', () => {
+ const serviceId : string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44";
+ const vnfName : string = "VF_vMee 0";
+ const vnfStoreKey : string = "VF_vMee 0";
+ const controls :FormControlModel[] = service.getMacroFormControls(serviceId, vnfStoreKey, vnfName, []);
+
+ const mandatoryControls : string[] = [
+ FormControlNames.INSTANCE_NAME,
+ FormControlNames.LCPCLOUD_REGION_ID,
+ FormControlNames.TENANT_ID,
+ 'platformName'
+ ];
+
+ for(let i = 0 ; i < mandatoryControls.length ; i++){
+ let requiredExist = controls.find(ctrl => ctrl.controlName === mandatoryControls[i]).validations.find(item => item.validatorName === 'required');
+ expect(requiredExist).toBeDefined();
+ }
+ });
+
+ test('should provide empty array on getMacroFormControls when serviceId, vnfName and vnfStoreKey equals to null', () => {
+
+ let vnfStoreKey = null;
+ const serviceId = null;
+ const vnfName : string = null;
+ const result:FormControlModel[] = service.getMacroFormControls(serviceId, vnfStoreKey, vnfName, []);
+ expect(result).toEqual([]);
+ });
+
+ test('should provide empty array on getAlaCarteFormControls when serviceId, vnfName and vnfStoreKey equals to null', () => {
+ let vnfStoreKey = null;
+ const serviceId = null;
+ const vnfName : string = null;
+ const result:FormControlModel[] = service.getAlaCarteFormControls(serviceId, vnfStoreKey, vnfName, []);
+ expect(result).toEqual([]);
+ });
+
+ function getALaCarteFormControls(vnfStoreKey: string): FormControlModel[] {
+ const serviceId: string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44";
+ const vnfName: string = "VF_vMee 0";
+ const controls: FormControlModel[] = service.getAlaCarteFormControls(serviceId, vnfStoreKey, vnfName, []);
+ return controls;
+ }
+
+ test('getMacroFormControls should return the correct order of controls', () => {
+ const serviceId : string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44";
+ const vnfName : string = "VF_vMee 0";
+ const vnfStoreKey : string = null;
+ const controls :FormControlModel[] = service.getMacroFormControls(serviceId, vnfStoreKey, vnfName, []);
+
+ const controlsOrderNames = [
+ FormControlNames.INSTANCE_NAME,
+ FormControlNames.PRODUCT_FAMILY_ID,
+ FormControlNames.LCPCLOUD_REGION_ID ,
+ 'legacyRegion',
+ 'tenantId',
+ 'platformName',
+ 'lineOfBusiness'];
+
+ expect(controls.length).toEqual(7);
+ for(let i = 0 ; i < controls.length ; i++){
+ expect(controls[i].controlName).toEqual(controlsOrderNames[i]);
+ }
+ });
+
+ test('getAlacartFormControls should return the correct order of controls', () => {
+ const controls = getALaCarteFormControls(null);
+
+ const controlsOrderNames = [
+ FormControlNames.INSTANCE_NAME,
+ FormControlNames.PRODUCT_FAMILY_ID,
+ FormControlNames.LCPCLOUD_REGION_ID,
+ 'legacyRegion',
+ 'tenantId',
+ 'platformName',
+ 'lineOfBusiness',
+ 'rollbackOnFailure'];
+ expect(controls.length).toEqual(8);
+ for(let i = 0 ; i < controls.length ; i++) {
+ expect(controls[i].controlName).toEqual(controlsOrderNames[i]);
+ }
+ });
+
+
+ test('getAlacartFormControls check for mandatory controls', () => {
+ const controls = getALaCarteFormControls("VF_vMee 0");
+ const mandatoryControls : string[] = [
+ FormControlNames.INSTANCE_NAME,
+ FormControlNames.LCPCLOUD_REGION_ID,
+ 'tenantId',
+ 'platformName',
+ 'rollbackOnFailure'
+ ];
+ for(let i = 0 ; i < mandatoryControls.length ; i++){
+ let requiredExist = controls.find(ctrl => ctrl.controlName === mandatoryControls[i]).validations.find(item => item.validatorName === 'required');
+ expect(requiredExist).toBeDefined();
+ }
+ });
+
+ test('getAlacartFormControls instance name control validator shall have the expected regex', () => {
+ const controls:FormControlModel[] = getALaCarteFormControls("VF_vMee 0");
+
+ const instanceNameControl: FormControlModel = <FormControlModel>controls.find(item => item.controlName === FormControlNames.INSTANCE_NAME);
+ const instanceNameValidator: ValidatorModel = instanceNameControl.validations.find(val => val.validatorName === ValidatorOptions.pattern);
+ expect(instanceNameValidator.validatorArg).toEqual(/^[a-zA-Z0-9._-]*$/);
+ });
+
+ test('rollback should return observable of true, false', () => {
+ let result : Observable<SelectOption[]> = service.getRollBackOnFailureOptions();
+ result.subscribe((val)=>{
+ expect(val).toEqual([
+ new SelectOption({id: 'true', name: 'Rollback'}),
+ new SelectOption({id: 'false', name: 'Don\'t Rollback'})
+ ]);
+ });
+ });
+});
+
diff --git a/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vnfGenerator/vnf.control.generator.ts b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vnfGenerator/vnf.control.generator.ts
new file mode 100644
index 000000000..3484038b1
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vnfGenerator/vnf.control.generator.ts
@@ -0,0 +1,243 @@
+import {Injectable} from "@angular/core";
+import {GenericFormService} from "../../generic-form.service";
+import {AaiService} from "../../../../services/aaiService/aai.service";
+import {NgRedux} from "@angular-redux/store";
+import {HttpClient} from "@angular/common/http";
+import {BasicControlGenerator} from "../basic.control.generator";
+import {
+ FormControlModel,
+ ValidatorModel,
+ ValidatorOptions
+} from "../../../../models/formControlModels/formControl.model";
+import {LogService} from "../../../../utils/log/log.service";
+import {VNFModel} from "../../../../models/vnfModel";
+import {AppState} from "../../../../store/reducers";
+import {FormGroup} from "@angular/forms";
+import {DropdownFormControl} from "../../../../models/formControlModels/dropdownFormControl.model";
+import {FormControlType} from "../../../../models/formControlModels/formControlTypes.enum";
+import {InputFormControl} from "../../../../models/formControlModels/inputFormControl.model";
+import {Observable, of} from "rxjs";
+import {SelectOption} from "../../../../models/selectOption";
+import * as _ from 'lodash';
+import {Constants} from "../../../../utils/constants";
+
+export enum FormControlNames {
+ INSTANCE_NAME = 'instanceName',
+ GLOBAL_SUBSCRIBER_ID = 'globalSubscriberId',
+ SUBSCRIPTION_SERVICE_TYPE = 'subscriptionServiceType',
+ PRODUCT_FAMILY_ID = 'productFamilyId',
+ LCPCLOUD_REGION_ID = 'lcpCloudRegionId',
+ TENANT_ID = 'tenantId',
+ AICZONE_ID = 'aicZoneId',
+ PROJECT_NAME = 'projectName',
+ OWNING_ENTITY_ID = 'owningEntityId',
+ ROLLBACK_ON_FAILURE = 'rollbackOnFailure',
+ PAUSE = 'pause'
+}
+
+enum InputType {
+ LCP_REGION = "lcpCloudRegionId",
+ TENANT = "tenantId",
+ LOB = "lineOfBusiness",
+ PLATFORM = "platformName",
+ ROLLBACK = "rollbackOnFailure",
+ PRODUCT_FAMILY = "productFamilyId",
+ VG = "volumeGroupName"
+}
+
+@Injectable()
+export class VnfControlGenerator {
+ aaiService: AaiService;
+ constructor(private genericFormService: GenericFormService,
+ private _basicControlGenerator: BasicControlGenerator,
+ private store: NgRedux<AppState>,
+ private http: HttpClient,
+ private _aaiService: AaiService,
+ private _logService: LogService) {
+ this.aaiService = _aaiService;
+ }
+
+ getVnfInstance = (serviceId: string, vnfStoreKey: string): any => {
+ let vnfInstance = null;
+ if (this.store.getState().service.serviceInstance[serviceId] && _.has(this.store.getState().service.serviceInstance[serviceId].vnfs, vnfStoreKey)) {
+ vnfInstance = Object.assign({}, this.store.getState().service.serviceInstance[serviceId].vnfs[vnfStoreKey]);
+ }
+ return vnfInstance;
+ };
+
+ getMacroFormControls(serviceId: string, vnfStoreKey: string, vnfName: string, dynamicInputs?: any[]): FormControlModel[] {
+ vnfStoreKey = _.isNil(vnfStoreKey) ? vnfName : vnfStoreKey;
+
+ if (_.isNil(serviceId) || _.isNil(vnfStoreKey) || _.isNil(vnfName)) {
+ this._logService.error('should provide serviceId, vnfName, vnfStoreKey', serviceId);
+ return [];
+ }
+
+ const vnfInstance = this.getVnfInstance(serviceId, vnfStoreKey);
+ const vnfModel = new VNFModel(this.store.getState().service.serviceHierarchy[serviceId].vnfs[vnfName]);
+ let result: FormControlModel[] = [];
+
+ if (!_.isNil(vnfModel)) {
+ result.push(this.getInstanceName(vnfInstance, serviceId, vnfName, vnfModel.isEcompGeneratedNaming));
+ result.push(this._basicControlGenerator.getProductFamilyControl(vnfInstance, result, false));
+ result.push(this.getLcpRegionControl(serviceId, vnfInstance, result));
+ result.push(this._basicControlGenerator.getLegacyRegion(vnfInstance));
+ result.push(this.getTenantControl(serviceId, vnfInstance, result));
+ result.push(this.getPlatformControl(vnfInstance, result));
+ result.push(this.getLineOfBusinessControl(vnfInstance, result));
+ }
+ return result;
+ }
+
+ getAlaCarteFormControls(serviceId: string, vnfStoreKey: string, vnfName: string, dynamicInputs?: any[]): FormControlModel[] {
+ vnfStoreKey = _.isNil(vnfStoreKey) ? vnfName : vnfStoreKey;
+ if (_.isNil(serviceId) || _.isNil(vnfStoreKey) || _.isNil(vnfName)) {
+ this._logService.error('should provide serviceId, vnfName, vnfStoreKey', serviceId);
+ return [];
+ }
+
+ let result: FormControlModel[] = [];
+ const vnfInstance = this.getVnfInstance(serviceId, vnfStoreKey);
+ const vnfModel = new VNFModel(this.store.getState().service.serviceHierarchy[serviceId].vnfs[vnfName]);
+
+ if (!_.isNil(vnfModel)) {
+ result.push(this.getInstanceName(vnfInstance, serviceId, vnfName, vnfModel.isEcompGeneratedNaming));
+ result.push(this._basicControlGenerator.getProductFamilyControl(vnfInstance, result, false));
+ result.push(this.getLcpRegionControl(serviceId, vnfInstance, result));
+ result.push(this._basicControlGenerator.getLegacyRegion(vnfInstance));
+ result.push(this.getTenantControl(serviceId, vnfInstance, result));
+ result.push(this.getPlatformControl(vnfInstance, result));
+ result.push(this.getLineOfBusinessControl(vnfInstance, result));
+ result.push(this.getRollbackOnFailureControl(vnfInstance, result));
+ }
+ return result;
+ }
+
+ isInputShouldBeShown = (inputType: any): boolean => {
+ let vnfInputs = [InputType.LCP_REGION, InputType.LOB, InputType.TENANT, InputType.PRODUCT_FAMILY, InputType.PLATFORM, InputType.ROLLBACK];
+ return vnfInputs.indexOf(inputType) > -1;
+ };
+
+ getInstanceName(instance : any, serviceId : string, vnfName : string, isEcompGeneratedNaming: boolean): FormControlModel {
+ const vnfModel : VNFModel = this.store.getState().service.serviceHierarchy[serviceId].vnfs[vnfName];
+ return this._basicControlGenerator.getInstanceNameController(instance, serviceId, isEcompGeneratedNaming, vnfModel);
+ }
+
+ getLineOfBusinessControl = (instance: any, controls: FormControlModel[]): DropdownFormControl => {
+ return new DropdownFormControl({
+ type: FormControlType.DROPDOWN,
+ controlName: 'lineOfBusiness',
+ displayName: 'Line of business',
+ dataTestId: 'lineOfBusiness',
+ placeHolder: 'Select Line Of Business',
+ isDisabled: false,
+ name: "lineOfBusiness",
+ value: instance ? instance.lineOfBusiness : null,
+ validations: [],
+ onInitSelectedField: ['lineOfBusinessList'],
+ onInit: this._basicControlGenerator.getSubscribeInitResult.bind(null, this._aaiService.getCategoryParameters)
+ })
+ };
+
+ getPlatformControl = (instance: any, controls: FormControlModel[]): DropdownFormControl => {
+ return new DropdownFormControl({
+ type: FormControlType.DROPDOWN,
+ controlName: 'platformName',
+ displayName: 'Platform',
+ dataTestId: 'platform',
+ placeHolder: 'Select Platform',
+ isDisabled: false,
+ name: "platform",
+ value: instance ? instance.platformName : null,
+ validations: [new ValidatorModel(ValidatorOptions.required, 'is required')],
+ onInitSelectedField: ['platformList'],
+ onInit: this._basicControlGenerator.getSubscribeInitResult.bind(null, this._aaiService.getCategoryParameters)
+ })
+ };
+
+ getTenantControl = (serviceId: string, instance: any, controls: FormControlModel[]): DropdownFormControl => {
+ const service = this.store.getState().service.serviceInstance[serviceId];
+ const globalCustomerId: string = service.globalSubscriberId;
+ const serviceType: string = service.subscriptionServiceType;
+ return new DropdownFormControl({
+ type: FormControlType.DROPDOWN,
+ controlName: FormControlNames.TENANT_ID,
+ displayName: 'Tenant',
+ dataTestId: 'tenant',
+ placeHolder: 'Select Tenant',
+ name: "tenant",
+ isDisabled: _.isNil(instance) || _.isNil(instance.lcpCloudRegionId),
+ onInitSelectedField: instance ? ['lcpRegionsTenantsMap', instance.lcpCloudRegionId] : null,
+ value: instance ? instance.tenantId : null,
+ validations: [new ValidatorModel(ValidatorOptions.required, 'is required')],
+ onInit : instance ? this._basicControlGenerator.getSubscribeInitResult.bind(
+ this._aaiService,
+ this.aaiService.getLcpRegionsAndTenants.bind(this, globalCustomerId, serviceType)) : ()=>{},
+ })
+ };
+
+ getLcpRegionControl = (serviceId: string, instance: any, controls: FormControlModel[]): DropdownFormControl => {
+ const service = this.store.getState().service.serviceInstance[serviceId];
+ const globalCustomerId: string = service.globalSubscriberId;
+ const serviceType: string = service.subscriptionServiceType;
+ return new DropdownFormControl({
+ type: FormControlType.DROPDOWN,
+ controlName: 'lcpCloudRegionId',
+ displayName: 'LCP region',
+ dataTestId: 'lcpRegion',
+ placeHolder: 'Select LCP Region',
+ name: "lcpRegion",
+ isDisabled: false,
+ value: instance ? instance.lcpCloudRegionId : null,
+ validations: [new ValidatorModel(ValidatorOptions.required, 'is required')],
+ onInitSelectedField: ['lcpRegionList'],
+ onInit: this._basicControlGenerator.getSubscribeInitResult.bind(
+ this._aaiService,
+ this._aaiService.getLcpRegionsAndTenants.bind(this, globalCustomerId, serviceType)),
+ onChange: (param: string, form: FormGroup) => {
+ form.controls[FormControlNames.TENANT_ID].enable();
+ form.controls[FormControlNames.TENANT_ID].reset();
+ if (!_.isNil(globalCustomerId) && !_.isNil(serviceType)) {
+ this._basicControlGenerator.getSubscribeResult.bind(this, this._aaiService.getLcpRegionsAndTenants(globalCustomerId, serviceType).subscribe(res => {
+ controls.find(item => item.controlName === FormControlNames.TENANT_ID)['options$'] = res.lcpRegionsTenantsMap[param];
+ if(res.lcpRegionsTenantsMap[param]){
+ controls.find(item => item.controlName === FormControlNames.TENANT_ID)['hasEmptyOptions'] = res.lcpRegionsTenantsMap[param].length === 0;
+ }
+ }));
+ }
+
+ if (Constants.LegacyRegion.MEGA_REGION.indexOf(param) !== -1) {
+ form.controls['legacyRegion'].enable();
+ controls.find(item => item.controlName === 'legacyRegion').isVisible = true;
+
+ } else {
+ controls.find(item => item.controlName === 'legacyRegion').isVisible = false;
+ form.controls['legacyRegion'].setValue(null);
+ form.controls['legacyRegion'].reset();
+ form.controls['legacyRegion'].disable();
+ }
+ }
+ })
+ };
+
+ getRollbackOnFailureControl = (instance: any, controls: FormControlModel[]): DropdownFormControl => {
+ return new DropdownFormControl({
+ type: FormControlType.DROPDOWN,
+ controlName: FormControlNames.ROLLBACK_ON_FAILURE,
+ displayName: 'Rollback on failure',
+ dataTestId: 'rollback',
+ placeHolder: 'Rollback on failure',
+ isDisabled: false,
+ validations: [new ValidatorModel(ValidatorOptions.required, 'is required')],
+ value: instance ? instance.rollbackOnFailure : 'true',
+ onInit: this._basicControlGenerator.getSubscribeInitResult.bind(null, this.getRollBackOnFailureOptions)
+ })
+ };
+
+ getRollBackOnFailureOptions = (): Observable<SelectOption[]> => {
+ return of([
+ new SelectOption({id: 'true', name: 'Rollback'}),
+ new SelectOption({id: 'false', name: 'Don\'t Rollback'})
+ ]);
+ };
+}
diff --git a/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vnfGroupGenerator/vnfGroup.control.generator.spec.ts b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vnfGroupGenerator/vnfGroup.control.generator.spec.ts
new file mode 100644
index 000000000..6dcaa8235
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vnfGroupGenerator/vnfGroup.control.generator.spec.ts
@@ -0,0 +1,364 @@
+import {getTestBed, TestBed} from '@angular/core/testing';
+import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing';
+import {NgRedux} from '@angular-redux/store';
+import {FormControlNames} from "../service.control.generator";
+import {BasicControlGenerator} from "../basic.control.generator";
+import {AaiService} from "../../../../services/aaiService/aai.service";
+import {GenericFormService} from "../../generic-form.service";
+import {FormBuilder} from "@angular/forms";
+import {
+ FormControlModel,
+ ValidatorModel,
+ ValidatorOptions
+} from "../../../../models/formControlModels/formControl.model";
+import {LogService} from "../../../../utils/log/log.service";
+import {VnfGroupControlGenerator} from "./vnfGroup.control.generator";
+import {Observable} from "rxjs";
+import {SelectOption} from "../../../../models/selectOption";
+import {FeatureFlagsService} from "../../../../services/featureFlag/feature-flags.service";
+
+class MockAppStore<T> {
+ getState(){
+ return {
+ "global": {
+ "name": null,
+ "type": "UPDATE_DRAWING_BOARD_STATUS",
+ "drawingBoardStatus": "CREATE",
+ "flags": {
+ "CREATE_INSTANCE_TEST": false,
+ "EMPTY_DRAWING_BOARD_TEST": false,
+ "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false,
+ "FLAG_ASYNC_INSTANTIATION": true,
+ "FLAG_ASYNC_JOBS": true,
+ "FLAG_ADD_MSO_TESTAPI_FIELD": true,
+ "FLAG_UNASSIGN_SERVICE": false,
+ "FLAG_SERVICE_MODEL_CACHE": false,
+ "FLAG_COLLECTION_RESOURCE_SUPPORT": true,
+ "FLAG_SHOW_ASSIGNMENTS": true,
+ "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
+ "FLAG_DUPLICATE_VNF": true,
+ "FLAG_DEFAULT_VNF": true,
+ "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": true,
+ "FLAG_A_LA_CARTE_AUDIT_INFO": true,
+ "FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST": true,
+ "FLAG_PRESENT_PROVIDER_NETWORKS_ASSOCIATIONS": true,
+ "FLAG_1810_CR_SOFT_DELETE_ALACARTE_VF_MODULE": true,
+ "FLAG_1902_NEW_VIEW_EDIT": true
+ }
+ },
+ "service": {
+ "serviceHierarchy": {
+ "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc": {
+ "service": {
+ "vidNotions": {
+ "instantiationUI": "serviceWithVnfGrouping",
+ "modelCategory": "other",
+ "viewEditUI": "serviceWithVnfGrouping"
+ },
+ "uuid": "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc",
+ "invariantUuid": "7ee41ce4-4827-44b0-a48e-2707a59905d2",
+ "name": "Grouping Service for Test",
+ "version": "1.0",
+ "toscaModelURL": null,
+ "category": "Network L4+",
+ "serviceType": "INFRASTRUCTURE",
+ "serviceRole": "GROUPING",
+ "description": "xxx",
+ "serviceEcompNaming": "false",
+ "instantiationType": "A-La-Carte",
+ "inputs": {}
+ },
+ "vnfs": {},
+ "networks": {},
+ "collectionResource": {},
+ "configurations": {},
+ "fabricConfigurations": {},
+ "serviceProxies": {
+ "vdbe_svc_vprs_proxy 0": {
+ "uuid": "65fadfa8-a0d9-443f-95ad-836cd044e26c",
+ "invariantUuid": "f4baae0c-b3a5-4ca1-a777-afbffe7010bc",
+ "description": "A Proxy for Service vDBE_Svc_vPRS",
+ "name": "vDBE_Svc_vPRS Service Proxy",
+ "version": "1.0",
+ "customizationUuid": "bdb63d23-e132-4ce7-af2c-a493b4cafac9",
+ "inputs": {},
+ "commands": {},
+ "properties": {},
+ "type": "Service Proxy",
+ "sourceModelUuid": "da7827a2-366d-4be6-8c68-a69153c61274",
+ "sourceModelInvariant": "24632e6b-584b-4f45-80d4-fefd75fd9f14",
+ "sourceModelName": "vDBE_Svc_vPRS"
+ },
+ "tsbc0001vm001_svc_proxy 0": {
+ "uuid": "65fadfa8-a0d9-443f-95ad-836cd044e26c",
+ "invariantUuid": "f4baae0c-b3a5-4ca1-a777-afbffe7010bc",
+ "description": "A Proxy for Service tsbc0001vm001_Svc",
+ "name": "tsbc0001vm001_Svc Service Proxy",
+ "version": "1.0",
+ "customizationUuid": "3d814462-30fb-4c62-b997-9aa360d27ead",
+ "inputs": {},
+ "commands": {},
+ "properties": {},
+ "type": "Service Proxy",
+ "sourceModelUuid": "28aeb8f6-5620-4148-8bfb-a5fb406f0309",
+ "sourceModelInvariant": "c989ab9a-33c7-46ec-b521-1b2daef5f047",
+ "sourceModelName": "tsbc0001vm001_Svc"
+ }
+ },
+ "vfModules": {},
+ "volumeGroups": {},
+ "pnfs": {},
+ "vnfGroups": {
+ "groupingservicefortest..ResourceInstanceGroup..0": {
+ "type": "VnfGroup",
+ "invariantUuid": "4bb2e27e-ddab-4790-9c6d-1f731bc14a45",
+ "uuid": "daeb6568-cef8-417f-9075-ed259ce59f48",
+ "version": "1",
+ "name": "groupingservicefortest..ResourceInstanceGroup..0",
+ "modelCustomizationName": "groupingservicefortest..ResourceInstanceGroup..0",
+ "properties": {
+ "ecomp_generated_naming": "false",
+ "contained_resource_type": "VF",
+ "role": "SERVICE-ACCESS",
+ "function": "DATA",
+ "description": "DDD0",
+ "type": "LOAD-GROUP"
+ },
+ "members": {
+ "vdbe_svc_vprs_proxy 0": {
+ "uuid": "65fadfa8-a0d9-443f-95ad-836cd044e26c",
+ "invariantUuid": "f4baae0c-b3a5-4ca1-a777-afbffe7010bc",
+ "description": "A Proxy for Service vDBE_Svc_vPRS",
+ "name": "vDBE_Svc_vPRS Service Proxy",
+ "version": "1.0",
+ "customizationUuid": "bdb63d23-e132-4ce7-af2c-a493b4cafac9",
+ "inputs": {},
+ "commands": {},
+ "properties": {},
+ "type": "Service Proxy",
+ "sourceModelUuid": "da7827a2-366d-4be6-8c68-a69153c61274",
+ "sourceModelInvariant": "24632e6b-584b-4f45-80d4-fefd75fd9f14",
+ "sourceModelName": "vDBE_Svc_vPRS"
+ }
+ }
+ },
+ "groupingservicefortest..ResourceInstanceGroup..1": {
+ "type": "VnfGroup",
+ "invariantUuid": "a704112d-dbc6-4e56-8d4e-aec57e95ef9a",
+ "uuid": "c2b300e6-45de-4e5e-abda-3032bee2de56",
+ "version": "1",
+ "name": "groupingservicefortest..ResourceInstanceGroup..1",
+ "modelCustomizationName": "groupingservicefortest..ResourceInstanceGroup..1",
+ "properties": {
+ "ecomp_generated_naming": "true",
+ "contained_resource_type": "VF",
+ "role": "SERVICE-ACCESS",
+ "function": "SIGNALING",
+ "description": "DDD1",
+ "type": "LOAD-GROUP"
+ },
+ "members": {
+ "tsbc0001vm001_svc_proxy 0": {
+ "uuid": "65fadfa8-a0d9-443f-95ad-836cd044e26c",
+ "invariantUuid": "f4baae0c-b3a5-4ca1-a777-afbffe7010bc",
+ "description": "A Proxy for Service tsbc0001vm001_Svc",
+ "name": "tsbc0001vm001_Svc Service Proxy",
+ "version": "1.0",
+ "customizationUuid": "3d814462-30fb-4c62-b997-9aa360d27ead",
+ "inputs": {},
+ "commands": {},
+ "properties": {},
+ "type": "Service Proxy",
+ "sourceModelUuid": "28aeb8f6-5620-4148-8bfb-a5fb406f0309",
+ "sourceModelInvariant": "c989ab9a-33c7-46ec-b521-1b2daef5f047",
+ "sourceModelName": "tsbc0001vm001_Svc"
+ }
+ }
+ }
+ }
+ }
+ },
+ "serviceInstance": {
+ "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc": {
+ "existingVNFCounterMap": {},
+ "existingVnfGroupCounterMap": {
+ "daeb6568-cef8-417f-9075-ed259ce59f48": 1,
+ "c2b300e6-45de-4e5e-abda-3032bee2de56": 0
+ },
+ "existingNetworksCounterMap": {},
+ "vnfs": {},
+ "vnfGroups": {
+ "groupingservicefortest..ResourceInstanceGroup..0": {
+ "inMaint": false,
+ "rollbackOnFailure": "true",
+ "originalName": "groupingservicefortest..ResourceInstanceGroup..0",
+ "isMissingData": false,
+ "trackById": "johjmxpmrlk",
+ "vnfGroupStoreKey": "groupingservicefortest..ResourceInstanceGroup..0",
+ "instanceName": "groupingservicefortestResourceInstanceGroup0",
+ "instanceParams": [
+ {}
+ ],
+ "modelInfo": {
+ "modelInvariantId": "4bb2e27e-ddab-4790-9c6d-1f731bc14a45",
+ "modelVersionId": "daeb6568-cef8-417f-9075-ed259ce59f48",
+ "modelName": "groupingservicefortest..ResourceInstanceGroup..0",
+ "modelVersion": "1",
+ "modelCustomizationName": "groupingservicefortest..ResourceInstanceGroup..0",
+ "uuid": "daeb6568-cef8-417f-9075-ed259ce59f48"
+ },
+ "uuid": "daeb6568-cef8-417f-9075-ed259ce59f48"
+ }
+ },
+ "isEcompGeneratedNaming": false,
+ "existingNames": {}
+ }
+ }
+ }
+ }
+ }
+}
+
+class MockFeatureFlagsService {}
+
+describe('VNF Group Control Generator', () => {
+ let injector;
+ let service: VnfGroupControlGenerator;
+ let httpMock: HttpTestingController;
+
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+ imports: [HttpClientTestingModule],
+ providers: [VnfGroupControlGenerator,
+ GenericFormService,
+ BasicControlGenerator,
+ AaiService,
+ FormBuilder,
+ LogService,
+ {provide:FeatureFlagsService, useClass: MockFeatureFlagsService},
+ {provide: NgRedux, useClass: MockAppStore}]
+ });
+ await TestBed.compileComponents();
+
+ injector = getTestBed();
+ service = injector.get(VnfGroupControlGenerator);
+ httpMock = injector.get(HttpTestingController);
+
+ })().then(done).catch(done.fail));
+
+
+
+ test('getMacroFormControls check for mandatory controls', () => {
+ const serviceId : string = "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc";
+ const vnfGroupName : string = "groupingservicefortest..ResourceInstanceGroup..0";
+ const vnfGroupStoreKey : string = "groupingservicefortest..ResourceInstanceGroup..0";
+ const controls :FormControlModel[] = service.getMacroFormControls(serviceId, vnfGroupStoreKey, vnfGroupName, []);
+
+ const mandatoryControls : string[] = [
+ FormControlNames.INSTANCE_NAME
+ ];
+
+ for(let i = 0 ; i < mandatoryControls.length ; i++){
+ let requiredExist = controls.find(ctrl => ctrl.controlName === mandatoryControls[i]).validations.find(item => item.validatorName === 'required');
+ expect(requiredExist).toBeDefined();
+ }
+ });
+
+ test('getMacroFormControls should return the correct order of controls', () => {
+ const serviceId : string = "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc";
+ const vnfGroupName : string = "groupingservicefortest..ResourceInstanceGroup..0";
+ const vnfGroupStoreKey : string = "groupingservicefortest..ResourceInstanceGroup..0";
+ const controls :FormControlModel[] = service.getMacroFormControls(serviceId, vnfGroupStoreKey, vnfGroupName, []);
+
+ const controlsOrderNames = [
+ FormControlNames.INSTANCE_NAME,
+ 'rollbackOnFailure'];
+
+ expect(controls.length).toEqual(1);
+ for(let i = 0 ; i < controls.length ; i++){
+ expect(controls[i].controlName).toEqual(controlsOrderNames[i]);
+ }
+ });
+
+ test('getMacroFormControls check for mandatory controls when ecomp naming = true', () => {
+ const serviceId : string = "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc";
+ const vnfGroupName : string = "groupingservicefortest..ResourceInstanceGroup..1";
+ const vnfGroupStoreKey : string = "groupingservicefortest..ResourceInstanceGroup..1";
+ const controls :FormControlModel[] = service.getMacroFormControls(serviceId, vnfGroupStoreKey, vnfGroupName, []);
+
+ let isOptional = controls.find(ctrl => ctrl.controlName === 'instanceName').validations.find(item => item.validatorName !== 'required');
+ expect(isOptional).toBeTruthy();
+ });
+
+ test('getAlacartFormControls should return the correct order of controls', () => {
+ const controls:FormControlModel[] = getALaCarteFormControls();
+
+ const controlsOrderNames = [
+ FormControlNames.INSTANCE_NAME,
+ 'rollbackOnFailure'];
+ expect(controls.length).toEqual(2);
+ for(let i = 0 ; i < controls.length ; i++) {
+ expect(controls[i].controlName).toEqual(controlsOrderNames[i]);
+ }
+ });
+
+
+ test('getAlacartFormControls check for mandatory controls', () => {
+ const controls:FormControlModel[] = getALaCarteFormControls();
+
+ const mandatoryControls : string[] = [
+ FormControlNames.INSTANCE_NAME,
+ 'rollbackOnFailure'
+ ];
+ for(let i = 0 ; i < mandatoryControls.length ; i++){
+ let requiredExist = controls.find(ctrl => ctrl.controlName === mandatoryControls[i]).validations.find(item => item.validatorName === 'required');
+ expect(requiredExist).toBeDefined();
+ }
+ });
+
+ test('getAlacartFormControls with ecomp_naming true check for mandatory controls', () => {
+ const controls:FormControlModel[] = getALaCarteFormControls();
+
+ const mandatoryControls : string[] = [
+ 'rollbackOnFailure'
+ ];
+ for(let i = 0 ; i < mandatoryControls.length ; i++){
+ let requiredExist = controls.find(ctrl => ctrl.controlName === mandatoryControls[i]).validations.find(item => item.validatorName === 'required');
+ expect(requiredExist).toBeDefined();
+ }
+ });
+
+ test('default instanceName', () => {
+ const serviceId : string = "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc";
+ const vnfGroupName : string = "groupingservicefortest..ResourceInstanceGroup..0";
+ let result:FormControlModel = service.getInstanceName(null, serviceId, vnfGroupName, false);
+ expect(result.value).toEqual("groupingservicefortest..ResourceInstanceGroup..0");
+ });
+
+ test('rollbackOnFailure', () => {
+ let result : Observable<SelectOption[]> = service.getRollBackOnFailureOptions();
+ result.subscribe((val)=>{
+ expect(val).toEqual([
+ new SelectOption({id: 'true', name: 'Rollback'}),
+ new SelectOption({id: 'false', name: 'Don\'t Rollback'})
+ ]);
+ });
+ });
+
+ test('getAlacartFormControls instance name control validator shall have the expected regex', () => {
+ const controls:FormControlModel[] = getALaCarteFormControls();
+
+ const instanceNameControl: FormControlModel = <FormControlModel>controls.find(item => item.controlName === FormControlNames.INSTANCE_NAME);
+ const instanceNameValidator: ValidatorModel = instanceNameControl.validations.find(val => val.validatorName === ValidatorOptions.pattern);
+ expect(instanceNameValidator.validatorArg).toEqual(/^[a-zA-Z0-9._-]*$/);
+ });
+
+ function getALaCarteFormControls():FormControlModel[] {
+ const serviceId: string = "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc";
+ const vnfGroupName: string = "groupingservicefortest..ResourceInstanceGroup..0";
+ const vnfGroupStoreKey: string = "groupingservicefortest..ResourceInstanceGroup..0";
+ const controls: FormControlModel[] = service.getAlaCarteFormControls(serviceId, vnfGroupStoreKey, vnfGroupName, []);
+ return controls;
+ }
+});
+
diff --git a/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vnfGroupGenerator/vnfGroup.control.generator.ts b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vnfGroupGenerator/vnfGroup.control.generator.ts
new file mode 100644
index 000000000..e503f4d2a
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vnfGroupGenerator/vnfGroup.control.generator.ts
@@ -0,0 +1,118 @@
+import {Injectable} from "@angular/core";
+import {AaiService} from "../../../../services/aaiService/aai.service";
+import {NgRedux} from "@angular-redux/store";
+import {BasicControlGenerator} from "../basic.control.generator";
+import {
+ FormControlModel,
+ ValidatorModel,
+ ValidatorOptions
+} from "../../../../models/formControlModels/formControl.model";
+import {LogService} from "../../../../utils/log/log.service";
+import {AppState} from "../../../../store/reducers";
+import {DropdownFormControl} from "../../../../models/formControlModels/dropdownFormControl.model";
+import {FormControlType} from "../../../../models/formControlModels/formControlTypes.enum";
+import {SelectOption} from "../../../../models/selectOption";
+import {VnfGroupModel} from "../../../../models/vnfGroupModel";
+import * as _ from 'lodash';
+import {Observable, of} from "rxjs";
+
+
+export enum FormControlNames {
+ INSTANCE_NAME = 'instanceName',
+ ROLLBACK_ON_FAILURE = 'rollbackOnFailure',
+}
+
+enum InputType {
+ ROLLBACK = "rollbackOnFailure"
+}
+
+@Injectable()
+export class VnfGroupControlGenerator {
+ aaiService: AaiService;
+ constructor(private _basicControlGenerator: BasicControlGenerator,
+ private store: NgRedux<AppState>,
+ private _aaiService: AaiService,
+ private _logService: LogService) {
+ this.aaiService = _aaiService;
+ }
+
+ getVnfGroupInstance = (serviceId: string, vnfGroupStoreKey: string): any => {
+ let vnfGroupInstance = null;
+ if (this.store.getState().service.serviceInstance[serviceId] && _.has(this.store.getState().service.serviceInstance[serviceId].vnfGroups, vnfGroupStoreKey)) {
+ vnfGroupInstance = Object.assign({}, this.store.getState().service.serviceInstance[serviceId].vnfGroups[vnfGroupStoreKey]);
+ }
+ return vnfGroupInstance;
+ };
+
+ getMacroFormControls(serviceId: string, vnfGroupStoreKey: string, vnfGroupName: string, dynamicInputs?: Array<any>): Array<FormControlModel> {
+ vnfGroupStoreKey = _.isNil(vnfGroupStoreKey) ? vnfGroupName : vnfGroupStoreKey;
+
+ if (_.isNil(serviceId) || _.isNil(vnfGroupStoreKey) || _.isNil(vnfGroupName)) {
+ this._logService.error('should provide serviceId, vnfGroupName, vnfGroupStoreKey', serviceId);
+ return [];
+ }
+
+ const vnfGroupInstance = this.getVnfGroupInstance(serviceId, vnfGroupStoreKey);
+ const vnfGroupModel = new VnfGroupModel(this.store.getState().service.serviceHierarchy[serviceId].vnfGroups[vnfGroupName]);
+ let result: FormControlModel[] = [];
+
+ if (!_.isNil(vnfGroupModel)) {
+ result.push(this.getInstanceName(vnfGroupInstance, serviceId, vnfGroupName, vnfGroupModel.isEcompGeneratedNaming));
+ }
+ return result;
+ }
+
+ getAlaCarteFormControls(serviceId: string, vnfGroupStoreKey: string, vnfGroupName: string, dynamicInputs?: any[]): FormControlModel[] {
+ vnfGroupStoreKey = _.isNil(vnfGroupStoreKey) ? vnfGroupName : vnfGroupStoreKey;
+ if (_.isNil(serviceId) || _.isNil(vnfGroupStoreKey) || _.isNil(vnfGroupName)) {
+ this._logService.error('should provide serviceId, vnfGroupName, vnfGroupStoreKey', serviceId);
+ return [];
+ }
+
+ let result: FormControlModel[] = [];
+ const vnfGroupInstance = this.getVnfGroupInstance(serviceId, vnfGroupStoreKey);
+ const vnfGroupModel = new VnfGroupModel(this.store.getState().service.serviceHierarchy[serviceId].vnfGroups[vnfGroupName]);
+
+ if (!_.isNil(vnfGroupModel)) {
+ result.push(this.getInstanceName(vnfGroupInstance, serviceId, vnfGroupName, vnfGroupModel.isEcompGeneratedNaming));
+ result.push(this.getRollbackOnFailureControl(vnfGroupInstance, result));
+ }
+ return result;
+ }
+
+ isInputShouldBeShown = (inputType: any): boolean => {
+ let vnfGroupInputs = [InputType.ROLLBACK];
+ return vnfGroupInputs.indexOf(inputType) > -1;
+ };
+
+ getDefaultInstanceName(instance : any, serviceId : string, vnfGroupName : string) : string {
+ const vnfGroupModel: VnfGroupModel = this.store.getState().service.serviceHierarchy[serviceId].vnfGroups[vnfGroupName];
+ return this._basicControlGenerator.getDefaultInstanceName(instance, vnfGroupModel);
+ }
+
+ getInstanceName(instance : any, serviceId : string, vnfGroupName : string, isEcompGeneratedNaming: boolean): FormControlModel {
+ const vnfGroupModel : VnfGroupModel = this.store.getState().service.serviceHierarchy[serviceId].vnfGroups[vnfGroupName];
+ return this._basicControlGenerator.getInstanceNameController(instance, serviceId, isEcompGeneratedNaming, vnfGroupModel);
+ }
+
+ getRollbackOnFailureControl = (instance: any, controls: FormControlModel[]): DropdownFormControl => {
+ return new DropdownFormControl({
+ type: FormControlType.DROPDOWN,
+ controlName: FormControlNames.ROLLBACK_ON_FAILURE,
+ displayName: 'Rollback on failure',
+ dataTestId: 'rollback',
+ placeHolder: 'Rollback on failure',
+ isDisabled: false,
+ validations: [new ValidatorModel(ValidatorOptions.required, 'is required')],
+ value: instance ? instance.rollbackOnFailure : 'true',
+ onInit: this._basicControlGenerator.getSubscribeInitResult.bind(null, this.getRollBackOnFailureOptions)
+ })
+ };
+
+ getRollBackOnFailureOptions = (): Observable<SelectOption[]> => {
+ return of([
+ new SelectOption({id: 'true', name: 'Rollback'}),
+ new SelectOption({id: 'false', name: 'Don\'t Rollback'})
+ ]);
+ };
+}
diff --git a/vid-webpack-master/src/app/shared/components/genericForm/generic-form.component.html b/vid-webpack-master/src/app/shared/components/genericForm/generic-form.component.html
new file mode 100644
index 000000000..d4c5118b3
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/genericForm/generic-form.component.html
@@ -0,0 +1,29 @@
+<div id="form-details" *ngIf="formControls != null && dynamicFormGroup != null">
+ <form [formGroup]="dynamicFormGroup">
+ <div *ngFor="let formControl of formControls" class="form-conrtols">
+ <div [ngSwitch]="formControl.type">
+ <form-control-input *ngSwitchCase="'INPUT'" [data]="formControl" [form]="dynamicFormGroup"></form-control-input>
+ <checkbox-form-control *ngSwitchCase="'CHECKBOX'" [data]="formControl" [form]="dynamicFormGroup" ></checkbox-form-control>
+ <dropdown-form-control *ngSwitchCase="'DROPDOWN'" [data]="formControl" [form]="dynamicFormGroup" ></dropdown-form-control>
+ <file-form-control *ngSwitchCase="'FILE'" [data]="formControl" [form]="dynamicFormGroup"></file-form-control>
+ </div>
+ <div *ngIf="dynamicFormGroup != null && formControl != null && dynamicFormGroup.controls[formControl.controlName]?.errors">
+ <div *ngFor="let validatorModel of formControl?.validations">
+ <form-control-error *ngIf="validatorModel?.validatorName != 'required' && dynamicFormGroup.controls[formControl?.controlName]?.errors[validatorModel?.validatorName]" [message]="validatorModel?.errorMsg"></form-control-error>
+ </div>
+ </div>
+ </div>
+ <div *ngFor="let dynamicInputs of dynamicInputs" class="form-conrtols">
+ <div [ngSwitch]="dynamicInputs.type">
+ <form-control-input *ngSwitchCase="'INPUT'" [data]="dynamicInputs" [form]="dynamicFormGroup.controls['instanceParams']"></form-control-input>
+ <checkbox-form-control *ngSwitchCase="'CHECKBOX'" [data]="dynamicInputs" [form]="dynamicFormGroup.controls['instanceParams']" ></checkbox-form-control>
+ <dropdown-form-control *ngSwitchCase="'DROPDOWN'" [data]="dynamicInputs" [form]="dynamicFormGroup.controls['instanceParams']" ></dropdown-form-control>
+ </div>
+ <div *ngIf="dynamicFormGroup?.controls['instanceParams'] != null && dynamicInputs != null && dynamicFormGroup.controls['instanceParams'].controls[dynamicInputs.controlName]?.errors">
+ <div *ngFor="let validatorModel of dynamicInputs?.validations">
+ <form-control-error *ngIf="validatorModel?.validatorName != 'required' && dynamicFormGroup.controls['instanceParams'].controls[dynamicInputs?.controlName]?.errors[validatorModel?.validatorName]" [message]="validatorModel?.errorMsg"></form-control-error>
+ </div>
+ </div>
+ </div>
+ </form>
+</div>
diff --git a/vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.scss b/vid-webpack-master/src/app/shared/components/genericForm/generic-form.component.scss
index 928343d43..b8f26d8b3 100644
--- a/vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.scss
+++ b/vid-webpack-master/src/app/shared/components/genericForm/generic-form.component.scss
@@ -1,4 +1,4 @@
-#service-instance-details {
+#form-details {
position: relative;
#notification-area {
@@ -51,14 +51,18 @@
.input-text {
border: 1px solid #D2D2D2;
border-radius: 2px;
+ color: black;
}
- .details-item {
- margin-bottom: 20px;
+ .form-conrtols {
+ margin-top: 20px;
+ &:first-child{
+ margin-top: 0px;
+ }
}
}
- .checkbox-label {
- font-family: OpenSans-Regular;
- }
+ .checkbox-label {
+ font-family: OpenSans-Regular;
+ }
}
diff --git a/vid-webpack-master/src/app/shared/components/genericForm/generic-form.component.ts b/vid-webpack-master/src/app/shared/components/genericForm/generic-form.component.ts
new file mode 100644
index 000000000..6febd66d6
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/genericForm/generic-form.component.ts
@@ -0,0 +1,45 @@
+import {Component, EventEmitter, Input, OnChanges, Output, SimpleChanges} from '@angular/core';
+import {GenericFormService} from "./generic-form.service";
+import {FormControlModel} from "../../models/formControlModels/formControl.model";
+import {FormGroup} from "@angular/forms";
+import * as _ from 'lodash';
+
+@Component({
+ selector : 'generic-form',
+ templateUrl : './generic-form.component.html',
+ styleUrls : ['./generic-form.component.scss']
+})
+
+export class GenericFormComponent implements OnChanges{
+ genericFormService: GenericFormService = null;
+ dynamicFormGroup: FormGroup = null;
+
+ @Input() formControls : FormControlModel[] = null;
+ @Input() dynamicInputs : FormControlModel[] = null;
+ @Input() isValidForm : boolean = false;
+ @Output() onFormChanged = new EventEmitter();
+
+ constructor(private _genericFormService: GenericFormService){
+ this.genericFormService = _genericFormService;
+ }
+
+ ngOnChanges(changes: SimpleChanges): void {
+ if (changes["formControls"] !== undefined && changes["formControls"].currentValue !== changes["formControls"].previousValue) {
+ this.dynamicFormGroup = this._genericFormService.generateFormBuilder(this.formControls, this.dynamicInputs);
+ this.onFormChanged.next(this.dynamicFormGroup);
+ this.dynamicFormGroup.valueChanges.subscribe(() => {
+ this.onFormChanged.next(this.dynamicFormGroup);
+ })
+ }
+ }
+
+ hasApiError(controlName: string, data: any[], form: FormGroup) {
+ if (!_.isNil(data)) {
+ if (!form.controls[controlName].disabled && data.length === 0) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
+
diff --git a/vid-webpack-master/src/app/shared/components/genericForm/generic-form.service.spec.ts b/vid-webpack-master/src/app/shared/components/genericForm/generic-form.service.spec.ts
new file mode 100644
index 000000000..7a993cfa1
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/genericForm/generic-form.service.spec.ts
@@ -0,0 +1,140 @@
+
+import { TestBed, getTestBed} from '@angular/core/testing';
+import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing';
+import {GenericFormService} from './generic-form.service';
+import {FormBuilder, FormGroup} from '@angular/forms';
+import {FormControlModel, ValidatorModel, ValidatorOptions} from "../../models/formControlModels/formControl.model";
+import {FormControlType} from "../../models/formControlModels/formControlTypes.enum";
+
+describe('Generic Form Service', () => {
+
+ let injector;
+ let service: GenericFormService;
+ let httpMock: HttpTestingController;
+ let form : FormGroup;
+ let fb : FormBuilder;
+
+
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+ imports: [HttpClientTestingModule],
+ providers: [GenericFormService, FormBuilder]
+ });
+ await TestBed.compileComponents();
+
+ injector = getTestBed();
+ service = injector.get(GenericFormService);
+ httpMock = injector.get(HttpTestingController);
+ fb = injector.get(FormBuilder);
+
+ })().then(done).catch(done.fail));
+
+ let controls : FormControlModel[] = [
+ generateFormControlModel(FormControlType.INPUT, 'InputControlName','Test Value', false, generateFormValidators([ValidatorOptions.required])),
+ generateFormControlModel(FormControlType.INPUT, 'InputControlName_1', 'Test InputControlName_1', true, generateFormValidators([ValidatorOptions.required])),
+ generateFormControlModel(FormControlType.INPUT, 'InputControlName_2', 'Test InputControlName_2', false, [generateFormValidatorWithArg(ValidatorOptions.minLength, 4)]),
+ generateFormControlModel(FormControlType.INPUT, 'InputControlName_3', 'Exact 14 chars', false, [generateFormValidatorWithArg(ValidatorOptions.maxLength, 14)]),
+ generateFormControlModel(FormControlType.INPUT, 'InputControlName_4', 'Test pattern', false, [generateFormValidatorWithArg(ValidatorOptions.pattern, '^[a-zA-Z]+$')])
+ ];
+
+ describe('generateFormBuilder', ()=> {
+ test('validators should work correct', () => {
+ const controlName: string = 'InputControlName';
+ let form : FormGroup = service.generateFormBuilder(controls, []);
+
+ expect(form instanceof FormGroup).toBeTruthy();
+ expect(form.controls[controlName]).toBeDefined();
+ expect(form.controls[controlName].value).toEqual('Test Value');
+ expect(form.controls[controlName].disabled).toBeFalsy();
+ expect(form.controls[controlName].valid).toBeTruthy();
+ expect(form.controls[controlName].errors).toBeNull();
+
+ form.controls[controlName].setValue('');
+ expect(form.controls[controlName].valid).toBeFalsy();
+ expect(form.controls[controlName].errors.required).toBeTruthy();
+ });
+
+ test('validators should prevent the value to appear', () => {
+ const controlName: string = 'InputControlName_1';
+ let form : FormGroup = service.generateFormBuilder(controls, []);
+
+ expect(form instanceof FormGroup).toBeTruthy();
+ expect(form.controls[controlName]).toBeDefined();
+ expect(form.controls[controlName].disabled).toBeTruthy();
+ expect(form.controls[controlName].value).toEqual('Test InputControlName_1');
+ expect(form.controls[controlName].errors).toBeNull();
+ });
+
+ test('validators with minimum length args', () => {
+ const controlName: string = 'InputControlName_2';
+ let form : FormGroup = service.generateFormBuilder(controls, []);
+
+ expect(form instanceof FormGroup).toBeTruthy();
+ expect(form.controls[controlName]).toBeDefined();
+ expect(form.controls[controlName].disabled).toBeFalsy();
+ expect(form.controls[controlName].value).toEqual('Test InputControlName_2');
+ expect(form.controls[controlName].errors).toBeNull();
+
+ form.controls[controlName].setValue('123'); // less then 4 characters. -> error
+ expect(form.controls[controlName].errors.minlength).toBeDefined();
+ form.controls[controlName].setValue('1234');
+ expect(form.controls[controlName].errors).toBeNull();
+ });
+
+ test('validators with maximum length args', () => {
+ const controlName: string = 'InputControlName_3';
+ let form : FormGroup = service.generateFormBuilder(controls, []);
+
+ expect(form instanceof FormGroup).toBeTruthy();
+ expect(form.controls[controlName]).toBeDefined();
+ expect(form.controls[controlName].disabled).toBeFalsy();
+ expect(form.controls[controlName].value).toEqual('Exact 14 chars');
+ expect(form.controls[controlName].errors).toBeNull();
+
+ form.controls[controlName].setValue('More than max length'); // more than max characters. -> error
+ expect(form.controls[controlName].errors.maxlength).toBeDefined();
+ form.controls[controlName].setValue('Exact 14 chars');
+ expect(form.controls[controlName].errors).toBeNull();
+ });
+
+ test('pattern validator letters only', () => {
+ const controlName: string = 'InputControlName_4';
+ let form : FormGroup = service.generateFormBuilder(controls, []);
+
+
+ expect(form.controls[controlName].errors.pattern).toBeDefined();
+ form.controls[controlName].setValue('AAAAAAAA');
+ expect(form.controls[controlName].errors).toBeNull();
+ });
+ });
+
+
+
+ function generateFormValidators(validatorsNames :ValidatorOptions[]){
+ let validators : ValidatorModel[] = [];
+ for(let validatorName of validatorsNames){
+ validators.push(new ValidatorModel(validatorName, 'error ' + validatorName));
+ }
+ return validators;
+ }
+
+ function generateFormValidatorWithArg(validatorName :ValidatorOptions, arg : any){
+ return new ValidatorModel(validatorName, 'error ' + validatorName, arg);
+ }
+
+ function generateFormControlModel(type : FormControlType,
+ controlName: string,
+ value: any,
+ isDisabled: boolean,
+ validations: ValidatorModel[]){
+ let data : any = {
+ type : type,
+ isDisabled : isDisabled,
+ validations : validations,
+ value : value,
+ controlName :controlName
+ };
+
+ return new FormControlModel(data);
+ }
+});
diff --git a/vid-webpack-master/src/app/shared/components/genericForm/generic-form.service.ts b/vid-webpack-master/src/app/shared/components/genericForm/generic-form.service.ts
new file mode 100644
index 000000000..15089cafe
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/genericForm/generic-form.service.ts
@@ -0,0 +1,54 @@
+import {Injectable} from '@angular/core';
+import {FormBuilder, FormControl, FormGroup, Validators} from '@angular/forms';
+import {FormControlModel} from "../../models/formControlModels/formControl.model";
+import * as _ from 'lodash';
+
+@Injectable()
+export class GenericFormService {
+ constructor(private _formBuilder: FormBuilder){}
+
+ generateFormBuilder(controls : FormControlModel[], dynamicInputs : FormControlModel[]) : FormGroup {
+ let controlsList = {};
+ if(!_.isNil(controls)){
+ for(let control of controls){
+ controlsList[control.controlName] = new FormControl(
+ {
+ value: _.isNil(control.value) ? null :control.value,
+ disabled: control.isDisabled
+ }, Validators.compose(control.validations.map(item => item.validator)));
+ }
+ }
+
+ if(!_.isNil(dynamicInputs)){
+ let dynamicControlsList = {};
+ if(!_.isNil(dynamicInputs)){
+ for(let control of dynamicInputs){
+ dynamicControlsList[control.controlName] = new FormControl(
+ {
+ value: control.value ? control.value : null,
+ disabled: control.isDisabled
+ }, Validators.compose(control.validations.map(item => item.validator)));
+ }
+ }
+ controlsList['instanceParams'] = this._formBuilder.group(dynamicControlsList);
+ }
+
+
+ return this._formBuilder.group(controlsList);
+ }
+
+ shouldDisplayValidationError(form: FormGroup, controlName : string): boolean{
+ if(!_.isNil(form) && !_.isNil(form.controls[controlName])){
+ if(!form.controls[controlName].touched){
+ return false;
+ } else if(form.controls[controlName].disabled) {
+ return false
+ }else if(_.isNil(form.controls[controlName].errors)){
+ return false;
+ }else {
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.component.html b/vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.component.html
new file mode 100644
index 000000000..57064f658
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.component.html
@@ -0,0 +1,70 @@
+<div id="instance-popup" class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button"
+ class="close"
+ (click)="formPopupDetails?.onCancel(formPopupDetails.that,dynamicForm)" >&times;
+ </button>
+ <span [attr.data-tests-id]="'create-modal-title'"
+ class="modal-title">{{formPopupDetails?.title}}
+ </span>
+ </div>
+ <div class="modal-body popup-content">
+
+ <div class="header-left">
+ <div>MODEL: <span>"{{formPopupDetails?.leftSubTitle}}"</span></div>
+ </div>
+
+ <div class="header-right">
+ {{formPopupDetails?.rightSubTitle}}
+ </div>
+
+
+ <label class="quantity-label" *ngIf="formPopupDetails?.UUIDData['type'] == 'service'">Qty:</label>
+ <div class="quantity" *ngIf="formPopupDetails?.UUIDData['type'] == 'service'">
+ <select [disabled]="formPopupDetails?.UUIDData['isMacro'] !== true"
+ class="quantity-select"
+ [(ngModel)]="formPopupDetails.UUIDData['bulkSize']"
+ name="quantity"
+ id="quantity-select"
+ required>
+ <option *ngFor="let qty of quantityOptions" [value]="qty">{{qty}}</option>
+ </select>
+ </div>
+
+ <div class="model-information">
+ <model-information [modelInformationItems]="formPopupDetails?.modelInformationItems"></model-information>
+ </div>
+
+ <div class="instance-form">
+ <div style="position: relative;height: 100%;overflow: auto;">
+ <label id="notification-area" *ngIf="shouldShowNotification() == true" style="color: #959595;font-size: 12px;left: 30px;margin-left: 30px;">Data entered will apply to all service instances</label>
+ <generic-form [formControls]="formPopupDetails?.formControlList"
+ [dynamicInputs]="formPopupDetails?.dynamicInputsControlList"
+ (onFormChanged)="dynamicForm = $event" ></generic-form>
+ </div>
+ </div>
+
+ </div>
+ <div class="modal-footer row" style="padding: 0">
+ <div class="col-md-6">
+ <div *ngIf="hasSomeError(formPopupDetails, dynamicForm) == true">
+ <form-general-error [message]="errorMsg"></form-general-error>
+ </div>
+ </div>
+ <div class="col-md-6" style="padding: 15px;padding-right: 35px;">
+ <button
+ [attr.data-tests-id]="'cancelButton'"
+ type="button" class="btn btn-default cancel"
+ (click)="formPopupDetails.onCancel(formPopupDetails.that, dynamicForm)"><span>Cancel</span></button>
+
+ <input type="submit"
+ value="Set"
+ data-tests-id="form-set"
+ class="btn btn-success submit"
+ [disabled]="!dynamicForm?.valid"
+ (click)="formPopupDetails.onSubmit(formPopupDetails.that, dynamicForm, servicesQty)">
+ </div>
+ </div>
+ </div>
+</div>
diff --git a/vid-webpack-master/src/app/components/vnf-popup/vnf-popup.scss b/vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.component.scss
index 6e606dbb9..5057b44a5 100644
--- a/vid-webpack-master/src/app/components/vnf-popup/vnf-popup.scss
+++ b/vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.component.scss
@@ -37,54 +37,51 @@ $grid-border: 1px #d2d2d2 solid;
grid-area: header-right;
@extend .header-text;
- border-bottom: $grid-border;
}
.quantity-label {
grid-area: quantity-label;
@extend .header-common;
- border-bottom: $grid-border;
height: 100%;
font-family: OpenSans-Regular;
}
-
.quantity {
grid-area: quantity;
border-left: $grid-border;
- border-bottom: $grid-border;
border-top-style: none;
font-family: OpenSans-Semibold;
text-align: start;
text-indent: 10px;
+ .quantity-select {
+ width: 78px;
+ height: 100%;
+ border: 0;
+ background: white;
+ outline: none;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ background: url('../../../../assets/img/chevron.svg') 0 0 no-repeat;
+ background-size: 24px;
+ background-position-x: right;
+ background-position-y: center;
+ }
}
- .quantity-select {
- width: 78px;
- height: 100%;
- border: 0;
- background: white;
- outline: none;
- -webkit-appearance: none;
- -moz-appearance: none;
- appearance: none;
- background: url('../../../assets/img/chevron.svg') 0 0 no-repeat;
- background-size: 24px;
- background-position-x: right;
- background-position-y: center;
- }
input[type="number"]:hover::-webkit-inner-spin-button {
height: 20px;
}
.model-information {
grid-area: model-information;
-
+ border-top: $grid-border;
padding: 30px;
overflow: auto;
@extend .left-panel;
}
.instance-form {
+ border-top: $grid-border;
grid-area: instance-form;
}
@@ -93,7 +90,7 @@ $grid-border: 1px #d2d2d2 solid;
grid-template-columns: 400px auto 30px 93px;
grid-template-rows: 50px calc(100vh - 180px);
grid-template-areas:
- "header-left header-right header-right header-right"
+ "header-left header-right quantity-label quantity"
"model-information instance-form instance-form instance-form";
padding: 0;
}
diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.component.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.component.ts
new file mode 100644
index 000000000..2b6417e33
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.component.ts
@@ -0,0 +1,145 @@
+import {Component, OnChanges, OnDestroy, OnInit} from '@angular/core';
+import {FormPopupDetails} from "../../models/formControlModels/formPopupDetails.model";
+import {DialogComponent, DialogService} from "ng2-bootstrap-modal";
+import {FormGroup} from "@angular/forms";
+import {IframeService} from "../../utils/iframe.service";
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import * as _ from "lodash";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../store/reducers";
+import {ServicePopupService} from "./genericFormServices/service/service.popup.service";
+import {ActivatedRoute} from "@angular/router";
+import {AaiService} from "../../services/aaiService/aai.service";
+import {GenericFormPopupService} from "./generic-form-popup.service";
+import {FormControlModel} from "../../models/formControlModels/formControl.model";
+import {FormGeneralErrorsService} from "../formGeneralErrors/formGeneralErrors.service";
+
+
+export interface PopupModel {
+ type : PopupType;
+ uuidData : UUIDData;
+ node : ITreeNode;
+ isUpdateMode : boolean;
+}
+
+export enum PopupType{
+ SERVICE = 'service',
+ VNF = 'vnf',
+ NETWORK = 'network',
+ VF_MODULE = 'vf_module',
+ VNF_GROUP = 'vnf_group'
+}
+
+
+@Component({
+ selector : 'generic-form-popup',
+ templateUrl : 'generic-form-popup.component.html',
+ styleUrls : ['generic-form-popup.component.scss']
+})
+
+export class GenericFormPopupComponent extends DialogComponent<PopupModel, boolean> implements OnInit, OnDestroy{
+ formPopupDetails : FormPopupDetails = null;
+ dynamicForm : FormGroup;
+ type : PopupType;
+ uuidData : UUIDData;
+ isUpdateMode : boolean;
+ node : ITreeNode = null;
+ hasGeneralApiError : boolean = false;
+ parentElementClassName = 'content';
+ errorMsg = 'Page contains errors. Please see details next to the relevant fields.';
+
+ servicesQty = 1;
+ quantityOptions = _.range(1, 51)
+ constructor(dialogService: DialogService ,
+ private _iframeService : IframeService,
+ private _store: NgRedux<AppState>,
+ private _servicePopupService : ServicePopupService,
+ private _activatedRoute : ActivatedRoute,
+ private _aaiService : AaiService,
+ private _route: ActivatedRoute,
+ private _genericFormPopupService : GenericFormPopupService){
+ super(dialogService);
+ }
+
+ closeDialog(that) : void{
+ this._iframeService.removeClassCloseModal(that.parentElementClassName);
+ this.dialogService.removeDialog(this);
+ setTimeout(() => {
+ window.parent.postMessage("closeIframe", "*");
+ }, 15);
+ }
+
+ shouldShowNotification() : boolean {
+ return this.formPopupDetails && this.formPopupDetails.UUIDData['bulkSize'] > 1
+ }
+
+ ngOnInit(): void {
+ this._route
+ .queryParams
+ .subscribe(params => {
+ console.log('changed');
+ if(params['serviceModelId'] && params['isCreate']=="true"){
+ this._genericFormPopupService.initReduxOnCreateNewService().then((serviceModelId : string)=>{
+ this.uuidData = <any>{
+ bulkSize : 1,
+ isMacro : this._store.getState().service.serviceHierarchy[serviceModelId].service.instantiationType === 'Macro',
+ type : PopupType.SERVICE,
+ serviceId: serviceModelId,
+ popupService: this._servicePopupService,
+ };
+
+ this.uuidData.popupService.closeDialogEvent.subscribe((that)=>{
+ this.closeDialog(that);
+ });
+
+ this.formPopupDetails = this.uuidData.popupService.getGenericFormPopupDetails(
+ this.uuidData['serviceId'],
+ null,
+ null,
+ this.node,
+ this.uuidData,
+ false
+ );
+ });
+ }
+ });
+
+ FormGeneralErrorsService.checkForErrorTrigger.subscribe(()=>{
+ this.hasSomeError(this.formPopupDetails, this.dynamicForm);
+ });
+
+ if(!_.isNil(this.uuidData)){
+ this.uuidData.popupService.closeDialogEvent.subscribe((that)=>{
+ this.closeDialog(that);
+ });
+
+ this.uuidData['isMacro'] = this._store.getState().service.serviceHierarchy[this.uuidData['serviceId']].service.instantiationType === 'Macro';
+ this.formPopupDetails = this._genericFormPopupService.getGenericFormDetails(this.uuidData, this.node, this.isUpdateMode);
+ }
+ }
+
+ hasSomeError(formPopupDetails : FormPopupDetails, form : FormGroup) : boolean{
+ if(_.isNil(formPopupDetails)) return false;
+ else {
+ for(let controlName in form.controls){
+ if(form.controls[controlName].errors){
+ let error: string[] = Object.keys(form.controls[controlName].errors);
+ if(error.length === 1 && error[0] === 'required'){
+ continue;
+ }else if(Object.keys(form.controls[controlName].errors).length > 0 ){
+ return true;
+ }
+ }
+ }
+ }
+
+ return formPopupDetails.formControlList.filter((item : FormControlModel) =>item.type === 'DROPDOWN' && item['hasEmptyOptions']).length > 0
+ }
+}
+
+
+export class UUIDData extends Object{
+ type : string;
+ popupService : any;
+}
+
diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.service.spec.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.service.spec.ts
new file mode 100644
index 000000000..02e545569
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.service.spec.ts
@@ -0,0 +1,1938 @@
+import {getTestBed, TestBed} from '@angular/core/testing';
+import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing';
+import {FormBuilder, FormGroup} from '@angular/forms';
+import {GenericFormPopupService} from "./generic-form-popup.service";
+import {IframeService} from "../../utils/iframe.service";
+import {NgRedux} from "@angular-redux/store";
+import {ServicePopupService} from "./genericFormServices/service/service.popup.service";
+import {BasicControlGenerator} from "../genericForm/formControlsServices/basic.control.generator";
+import {AaiService} from "../../services/aaiService/aai.service";
+import {ServiceControlGenerator} from "../genericForm/formControlsServices/service.control.generator";
+import {GenericFormService} from "../genericForm/generic-form.service";
+import {LogService} from "../../utils/log/log.service";
+import {DefaultDataGeneratorService} from "../../services/defaultDataServiceGenerator/default.data.generator.service";
+import {BasicPopupService} from "./genericFormServices/basic.popup.service";
+import {ActivatedRoute} from "@angular/router";
+import {UUIDData} from "./generic-form-popup.component";
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import {NetworkPopupService} from "./genericFormServices/network/network.popup.service";
+import {NetworkControlGenerator} from "../genericForm/formControlsServices/networkGenerator/network.control.generator";
+import {VfModulePopuopService} from "./genericFormServices/vfModule/vfModule.popuop.service";
+import {VfModuleControlGenerator} from "../genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator";
+import {FeatureFlagsService} from "../../services/featureFlag/feature-flags.service";
+
+class MockAppStore<T>{
+ getState() {
+ return {
+ "global": {
+ "name": null,
+ "flags": {
+ "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false,
+ "FLAG_SHOW_ASSIGNMENTS": true,
+ "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
+ "FLAG_UNASSIGN_SERVICE": true,
+ "FLAG_SHOW_VERIFY_SERVICE": false,
+ "FLAG_COLLECTION_RESOURCE_SUPPORT": true,
+ "FLAG_DUPLICATE_VNF": true,
+ "FLAG_SERVICE_MODEL_CACHE": true,
+ "CREATE_INSTANCE_TEST": false,
+ "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false,
+ "FLAG_ASYNC_INSTANTIATION": true,
+ "FLAG_ASYNC_JOBS": true,
+ "EMPTY_DRAWING_BOARD_TEST": false,
+ "FLAG_ADD_MSO_TESTAPI_FIELD": true
+ },
+ "type": "[FLAGS] Update"
+ },
+ "service": {
+ "serviceHierarchy": {
+ "6e59c5de-f052-46fa-aa7e-2fca9d674c44": {
+ "service": {
+ "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "name": "ComplexService",
+ "version": "1.0",
+ "toscaModelURL": null,
+ "category": "Emanuel",
+ "serviceType": "",
+ "serviceRole": "",
+ "description": "ComplexService",
+ "serviceEcompNaming": "false",
+ "instantiationType": "Macro",
+ "inputs": {}
+ },
+ "vnfs": {
+ "VF_vMee 0": {
+ "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60",
+ "invariantUuid": "4160458e-f648-4b30-a176-43881ffffe9e",
+ "description": "VSP_vMee",
+ "name": "VF_vMee",
+ "version": "2.0",
+ "customizationUuid": "91415b44-753d-494c-926a-456a9172bbb9",
+ "inputs": {},
+ "commands": {},
+ "serviceEcompNaming" : "true",
+ "properties": {
+ "ecomp_generated_naming": "false",
+ "max_instances": 10,
+ "min_instances": 1,
+ "gpb2_Internal2_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-ipv6-egress_src_start_port": "0",
+ "sctp-a-ipv6-egress_rule_application": "any",
+ "Internal2_allow_transit": "true",
+ "sctp-b-IPv6_ethertype": "IPv6",
+ "sctp-a-egress_rule_application": "any",
+ "sctp-b-ingress_action": "pass",
+ "sctp-b-ingress_rule_protocol": "icmp",
+ "ncb2_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-ipv6-ingress-src_start_port": "0.0",
+ "ncb1_Internal2_mac": "00:11:22:EF:AC:DF",
+ "fsb_volume_size_0": "320.0",
+ "sctp-b-egress_src_addresses": "local",
+ "sctp-a-ipv6-ingress_ethertype": "IPv4",
+ "sctp-a-ipv6-ingress-dst_start_port": "0",
+ "sctp-b-ipv6-ingress_rule_application": "any",
+ "domain_name": "default-domain",
+ "sctp-a-ingress_rule_protocol": "icmp",
+ "sctp-b-egress-src_start_port": "0.0",
+ "sctp-a-egress_src_addresses": "local",
+ "sctp-b-display_name": "epc-sctp-b-ipv4v6-sec-group",
+ "sctp-a-egress-src_start_port": "0.0",
+ "sctp-a-ingress_ethertype": "IPv4",
+ "sctp-b-ipv6-ingress-dst_end_port": "65535",
+ "sctp-b-dst_subnet_prefix_v6": "::",
+ "nf_naming": "{ecomp_generated_naming=true}",
+ "sctp-a-ipv6-ingress_src_subnet_prefix": "0.0.0.0",
+ "sctp-b-egress-dst_start_port": "0.0",
+ "ncb_flavor_name": "nv.c20r64d1",
+ "gpb1_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-egress_dst_subnet_prefix_len": "0.0",
+ "Internal2_net_cidr": "10.0.0.10",
+ "sctp-a-ingress-dst_start_port": "0.0",
+ "sctp-a-egress-dst_start_port": "0.0",
+ "fsb1_Internal2_mac": "00:11:22:EF:AC:DF",
+ "sctp-a-egress_ethertype": "IPv4",
+ "vlc_st_service_mode": "in-network-nat",
+ "sctp-a-ipv6-egress_ethertype": "IPv4",
+ "sctp-a-egress-src_end_port": "65535.0",
+ "sctp-b-ipv6-egress_rule_application": "any",
+ "sctp-b-egress_action": "pass",
+ "sctp-a-ingress-src_subnet_prefix_len": "0.0",
+ "sctp-b-ipv6-ingress-src_end_port": "65535.0",
+ "sctp-b-name": "epc-sctp-b-ipv4v6-sec-group",
+ "fsb2_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-a-ipv6-ingress-src_start_port": "0.0",
+ "sctp-b-ipv6-egress_ethertype": "IPv4",
+ "Internal1_net_cidr": "10.0.0.10",
+ "sctp-a-egress_dst_subnet_prefix": "0.0.0.0",
+ "fsb_flavor_name": "nv.c20r64d1",
+ "sctp_rule_protocol": "132",
+ "sctp-b-ipv6-ingress_src_subnet_prefix_len": "0",
+ "sctp-a-ipv6-ingress_rule_application": "any",
+ "sctp-a-IPv6_ethertype": "IPv6",
+ "vlc2_Internal1_mac": "00:11:22:EF:AC:DF",
+ "vlc_st_virtualization_type": "virtual-machine",
+ "sctp-b-ingress-dst_start_port": "0.0",
+ "sctp-b-ingress-dst_end_port": "65535.0",
+ "sctp-a-ipv6-ingress-src_end_port": "65535.0",
+ "sctp-a-display_name": "epc-sctp-a-ipv4v6-sec-group",
+ "sctp-b-ingress_rule_application": "any",
+ "int2_sec_group_name": "int2-sec-group",
+ "vlc_flavor_name": "nd.c16r64d1",
+ "sctp-b-ipv6-egress_src_addresses": "local",
+ "vlc_st_interface_type_int1": "other1",
+ "sctp-b-egress-src_end_port": "65535.0",
+ "sctp-a-ipv6-egress-dst_start_port": "0",
+ "vlc_st_interface_type_int2": "other2",
+ "sctp-a-ipv6-egress_rule_protocol": "any",
+ "Internal2_shared": "false",
+ "sctp-a-ipv6-egress_dst_subnet_prefix_len": "0",
+ "Internal2_rpf": "disable",
+ "vlc1_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-ipv6-egress_src_end_port": "65535",
+ "sctp-a-ipv6-egress_src_addresses": "local",
+ "sctp-a-ingress-dst_end_port": "65535.0",
+ "sctp-a-ipv6-egress_src_end_port": "65535",
+ "Internal1_forwarding_mode": "l2",
+ "Internal2_dhcp": "false",
+ "sctp-a-dst_subnet_prefix_v6": "::",
+ "pxe_image_name": "MME_PXE-Boot_16ACP04_GA.qcow2",
+ "vlc_st_interface_type_gtp": "other0",
+ "ncb1_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-src_subnet_prefix_v6": "::",
+ "sctp-a-egress_dst_subnet_prefix_len": "0.0",
+ "int1_sec_group_name": "int1-sec-group",
+ "Internal1_dhcp": "false",
+ "sctp-a-ipv6-egress_dst_end_port": "65535",
+ "Internal2_forwarding_mode": "l2",
+ "fsb2_Internal2_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-egress_dst_subnet_prefix": "0.0.0.0",
+ "Internal1_net_cidr_len": "17",
+ "gpb2_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-ingress-src_subnet_prefix_len": "0.0",
+ "sctp-a-ingress_dst_addresses": "local",
+ "sctp-a-egress_action": "pass",
+ "fsb_volume_type_0": "SF-Default-SSD",
+ "ncb2_Internal2_mac": "00:11:22:EF:AC:DF",
+ "vlc_st_interface_type_sctp_a": "left",
+ "vlc_st_interface_type_sctp_b": "right",
+ "sctp-a-src_subnet_prefix_v6": "::",
+ "vlc_st_version": "2",
+ "sctp-b-egress_ethertype": "IPv4",
+ "sctp-a-ingress_rule_application": "any",
+ "gpb1_Internal2_mac": "00:11:22:EF:AC:DF",
+ "instance_ip_family_v6": "v6",
+ "sctp-a-ipv6-egress_src_start_port": "0",
+ "sctp-b-ingress-src_start_port": "0.0",
+ "sctp-b-ingress_dst_addresses": "local",
+ "fsb1_Internal1_mac": "00:11:22:EF:AC:DF",
+ "vlc_st_interface_type_oam": "management",
+ "multi_stage_design": "true",
+ "oam_sec_group_name": "oam-sec-group",
+ "Internal2_net_gateway": "10.0.0.10",
+ "sctp-a-ipv6-ingress-dst_end_port": "65535",
+ "sctp-b-ipv6-egress-dst_start_port": "0",
+ "Internal1_net_gateway": "10.0.0.10",
+ "sctp-b-ipv6-egress_rule_protocol": "any",
+ "gtp_sec_group_name": "gtp-sec-group",
+ "sctp-a-ipv6-egress_dst_subnet_prefix": "0.0.0.0",
+ "sctp-b-ipv6-egress_dst_subnet_prefix_len": "0",
+ "sctp-a-ipv6-ingress_dst_addresses": "local",
+ "sctp-a-egress_rule_protocol": "icmp",
+ "sctp-b-ipv6-egress_action": "pass",
+ "sctp-a-ipv6-egress_action": "pass",
+ "Internal1_shared": "false",
+ "sctp-b-ipv6-ingress_rule_protocol": "any",
+ "Internal2_net_cidr_len": "17",
+ "sctp-a-name": "epc-sctp-a-ipv4v6-sec-group",
+ "sctp-a-ingress-src_end_port": "65535.0",
+ "sctp-b-ipv6-ingress_src_subnet_prefix": "0.0.0.0",
+ "sctp-a-egress-dst_end_port": "65535.0",
+ "sctp-a-ingress_action": "pass",
+ "sctp-b-egress_rule_protocol": "icmp",
+ "sctp-b-ipv6-ingress_action": "pass",
+ "vlc_st_service_type": "firewall",
+ "sctp-b-ipv6-egress_dst_end_port": "65535",
+ "sctp-b-ipv6-ingress-dst_start_port": "0",
+ "vlc2_Internal2_mac": "00:11:22:EF:AC:DF",
+ "vlc_st_availability_zone": "true",
+ "fsb_volume_image_name_1": "MME_FSB2_16ACP04_GA.qcow2",
+ "sctp-b-ingress-src_subnet_prefix": "0.0.0.0",
+ "sctp-a-ipv6-ingress_src_subnet_prefix_len": "0",
+ "Internal1_allow_transit": "true",
+ "gpb_flavor_name": "nv.c20r64d1",
+ "availability_zone_max_count": "1",
+ "fsb_volume_image_name_0": "MME_FSB1_16ACP04_GA.qcow2",
+ "sctp-b-ipv6-ingress_dst_addresses": "local",
+ "sctp-b-ipv6-egress_dst_subnet_prefix": "0.0.0.0",
+ "sctp-b-ipv6-ingress_ethertype": "IPv4",
+ "vlc1_Internal2_mac": "00:11:22:EF:AC:DF",
+ "sctp-a-ingress-src_subnet_prefix": "0.0.0.0",
+ "sctp-a-ipv6-ingress_action": "pass",
+ "Internal1_rpf": "disable",
+ "sctp-b-ingress_ethertype": "IPv4",
+ "sctp-b-egress_rule_application": "any",
+ "sctp-b-ingress-src_end_port": "65535.0",
+ "sctp-a-ipv6-ingress_rule_protocol": "any",
+ "sctp-a-ingress-src_start_port": "0.0",
+ "sctp-b-egress-dst_end_port": "65535.0"
+ },
+ "type": "VF",
+ "modelCustomizationName": "VF_vMee 0",
+ "vfModules": {
+ "vf_vmee0..VfVmee..vmme_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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..vmme_vlc..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "vmme_vlc"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ },
+ "vf_vmee0..VfVmee..vmme_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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..vmme_gpb..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "vmme_gpb"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "vf_vmee0..VfVmee..base_vmme..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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "base_vmme"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "vf_vmee0..VfVmee..base_vmme..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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "base_vmme"
+ },
+ "inputs": {}
+ }
+ },
+ "vfcInstanceGroups": {}
+ }
+ },
+ "networks": {
+ "ExtVL 0": {
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ "invariantUuid": "379f816b-a7aa-422f-be30-17114ff50b7c",
+ "description": "ECOMP generic virtual link (network) base type for all other service-level and global networks",
+ "name": "ExtVL",
+ "version": "37.0",
+ "customizationUuid": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+ "inputs": {},
+ "commands": {},
+ "properties": {
+ "ecomp_generated_naming": "false",
+ "network_assignments": "{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}",
+ "exVL_naming": "{ecomp_generated_naming=true}",
+ "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}",
+ "network_homing": "{ecomp_selected_instance_node_target=false}"
+ },
+ "type": "VL",
+ "modelCustomizationName": "ExtVL 0"
+ }
+ },
+ "collectionResource": {},
+ "configurations": {
+ "Port Mirroring Configuration By Policy 0": {
+ "uuid": "b4398538-e89d-4f13-b33d-ca323434ba50",
+ "invariantUuid": "6ef0ca40-f366-4897-951f-abd65d25f6f7",
+ "description": "A port mirroring configuration by policy object",
+ "name": "Port Mirroring Configuration By Policy",
+ "version": "27.0",
+ "customizationUuid": "3c3b7b8d-8669-4b3b-8664-61970041fad2",
+ "inputs": {},
+ "commands": {},
+ "properties": {},
+ "type": "Configuration",
+ "modelCustomizationName": "Port Mirroring Configuration By Policy 0",
+ "sourceNodes": [],
+ "collectorNodes": null,
+ "configurationByPolicy": false
+ }
+ },
+ "serviceProxies": {},
+ "vfModules": {
+ "vf_vmee0..VfVmee..vmme_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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..vmme_vlc..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "vmme_vlc"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ },
+ "vf_vmee0..VfVmee..vmme_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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..vmme_gpb..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "vmme_gpb"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "vf_vmee0..VfVmee..base_vmme..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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "base_vmme"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "vf_vmee0..VfVmee..base_vmme..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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "base_vmme"
+ },
+ "inputs": {}
+ }
+ },
+ "pnfs": {}
+ }
+ },
+ "serviceInstance": {
+ "6e59c5de-f052-46fa-aa7e-2fca9d674c44": {
+ "networks": {},
+ "vnfs": {
+ "VF_vMee 0": {
+ "rollbackOnFailure": "true",
+ "vfModules": {
+ "vf_vmee0..VfVmee..base_vmme..module-0": {
+ "vf_vmee0..VfVmee..base_vmme..module-0vmvzo": {
+ "isMissingData": false,
+ "sdncPreReload": null,
+ "modelInfo": {
+ "modelType": "VFmodule",
+ "modelInvariantId": "a6f9e51a-2b35-416a-ae15-15e58d61f36d",
+ "modelVersionId": "a27f5cfc-7f12-4f99-af08-0af9c3885c87",
+ "modelName": "VfVmee..base_vmme..module-0",
+ "modelVersion": "2",
+ "modelCustomizationId": "f8c040f1-7e51-4a11-aca8-acf256cfd861",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0"
+ },
+ "instanceParams": [
+ {}
+ ],
+ "trackById": "wmtm6sy2uj"
+ }
+ }
+ },
+ "isMissingData": true,
+ "originalName": "VF_vMee 0",
+ "vnfStoreKey": "VF_vMee 0",
+ "trackById": "p3wk448m5do",
+ "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60",
+ "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+ "lcpCloudRegionId": null,
+ "tenantId": null,
+ "lineOfBusiness": null,
+ "platformName": null,
+ "modelInfo": {
+ "modelType": "VF",
+ "modelInvariantId": "4160458e-f648-4b30-a176-43881ffffe9e",
+ "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ "modelName": "VF_vMee",
+ "modelVersion": "2.0",
+ "modelCustomizationName": "VF_vMee 0"
+ }
+ }
+ },
+ "instanceParams": [
+ {}
+ ],
+ "validationCounter": 1,
+ "existingNames": {},
+ "existingVNFCounterMap": {
+ "d6557200-ecf2-4641-8094-5393ae3aae60": 1
+ },
+ "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "subscriptionServiceType": "TYLER SILVIA",
+ "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+ "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+ "lcpCloudRegionId": "hvf6",
+ "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+ "aicZoneId": "JAG1",
+ "projectName": "x1",
+ "rollbackOnFailure": "true",
+ "bulkSize": 1,
+ "modelInfo": {
+ "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ "modelName": "ComplexService",
+ "modelVersion": "1.0",
+ "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44"
+ },
+ "isALaCarte": false,
+ "name": "ComplexService",
+ "version": "1.0",
+ "description": "ComplexService",
+ "category": "Emanuel",
+ "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "serviceType": "",
+ "serviceRole": "",
+ "isEcompGeneratedNaming": true,
+ "isMultiStepDesign": false
+ }
+ },
+ "lcpRegionsAndTenants": {
+ "lcpRegionList": [
+ {
+ "id": "JANET25",
+ "name": "JANET25",
+ "isPermitted": true
+ },
+ {
+ "id": "hvf6",
+ "name": "hvf6",
+ "isPermitted": true
+ }
+ ],
+ "lcpRegionsTenantsMap": {
+ "JANET25": [
+ {
+ "id": "092eb9e8e4b7412e8787dd091bc58e86",
+ "name": "USP-SIP-IC-24335-T-01",
+ "isPermitted": true
+ }
+ ],
+ "hvf6": [
+ {
+ "id": "bae71557c5bb4d5aac6743a4e5f1d054",
+ "name": "AIN Web Tool-15-D-testalexandria",
+ "isPermitted": true
+ },
+ {
+ "id": "229bcdc6eaeb4ca59d55221141d01f8e",
+ "name": "AIN Web Tool-15-D-STTest2",
+ "isPermitted": true
+ },
+ {
+ "id": "1178612d2b394be4834ad77f567c0af2",
+ "name": "AIN Web Tool-15-D-SSPtestcustome",
+ "isPermitted": true
+ },
+ {
+ "id": "19c5ade915eb461e8af52fb2fd8cd1f2",
+ "name": "AIN Web Tool-15-D-UncheckedEcopm",
+ "isPermitted": true
+ },
+ {
+ "id": "de007636e25249238447264a988a927b",
+ "name": "AIN Web Tool-15-D-dfsdf",
+ "isPermitted": true
+ },
+ {
+ "id": "62f29b3613634ca6a3065cbe0e020c44",
+ "name": "AIN/SMS-16-D-Multiservices1",
+ "isPermitted": true
+ },
+ {
+ "id": "649289e30d3244e0b48098114d63c2aa",
+ "name": "AIN Web Tool-15-D-SSPST66",
+ "isPermitted": true
+ },
+ {
+ "id": "3f21eeea6c2c486bba31dab816c05a32",
+ "name": "AIN Web Tool-15-D-ASSPST47",
+ "isPermitted": true
+ },
+ {
+ "id": "f60ce21d3ee6427586cff0d22b03b773",
+ "name": "CESAR-100-D-sspjg67246",
+ "isPermitted": true
+ },
+ {
+ "id": "8774659e425f479895ae091bb5d46560",
+ "name": "CESAR-100-D-sspjg68359",
+ "isPermitted": true
+ },
+ {
+ "id": "624eb554b0d147c19ff8885341760481",
+ "name": "AINWebTool-15-D-iftach",
+ "isPermitted": true
+ },
+ {
+ "id": "214f55f5fc414c678059c383b03e4962",
+ "name": "CESAR-100-D-sspjg612401",
+ "isPermitted": true
+ },
+ {
+ "id": "c90666c291664841bb98e4d981ff1db5",
+ "name": "CESAR-100-D-sspjg621340",
+ "isPermitted": true
+ },
+ {
+ "id": "ce5b6bc5c7b348e1bf4b91ac9a174278",
+ "name": "sspjg621351cloned",
+ "isPermitted": true
+ },
+ {
+ "id": "b386b768a3f24c8e953abbe0b3488c02",
+ "name": "AINWebTool-15-D-eteancomp",
+ "isPermitted": true
+ },
+ {
+ "id": "dc6c4dbfd225474e9deaadd34968646c",
+ "name": "AINWebTool-15-T-SPFET",
+ "isPermitted": true
+ },
+ {
+ "id": "02cb5030e9914aa4be120bd9ed1e19eb",
+ "name": "AINWebTool-15-X-eeweww",
+ "isPermitted": true
+ },
+ {
+ "id": "f2f3830e4c984d45bcd00e1a04158a79",
+ "name": "CESAR-100-D-spjg61909",
+ "isPermitted": true
+ },
+ {
+ "id": "05b91bd5137f4929878edd965755c06d",
+ "name": "CESAR-100-D-sspjg621512cloned",
+ "isPermitted": true
+ },
+ {
+ "id": "7002fbe8482d4a989ddf445b1ce336e0",
+ "name": "AINWebTool-15-X-vdr",
+ "isPermitted": true
+ },
+ {
+ "id": "4008522be43741dcb1f5422022a2aa0b",
+ "name": "AINWebTool-15-D-ssasa",
+ "isPermitted": true
+ },
+ {
+ "id": "f44e2e96a1b6476abfda2fa407b00169",
+ "name": "AINWebTool-15-D-PFNPT",
+ "isPermitted": true
+ },
+ {
+ "id": "b69a52bec8a84669a37a1e8b72708be7",
+ "name": "AINWebTool-15-X-vdre",
+ "isPermitted": true
+ },
+ {
+ "id": "fac7d9fd56154caeb9332202dcf2969f",
+ "name": "AINWebTool-15-X-NONPODECOMP",
+ "isPermitted": true
+ },
+ {
+ "id": "2d34d8396e194eb49969fd61ffbff961",
+ "name": "DN5242-Nov16-T5",
+ "isPermitted": true
+ },
+ {
+ "id": "cb42a77ff45b48a8b8deb83bb64acc74",
+ "name": "ro-T11",
+ "isPermitted": true
+ },
+ {
+ "id": "fa45ca53c80b492fa8be5477cd84fc2b",
+ "name": "ro-T112",
+ "isPermitted": true
+ },
+ {
+ "id": "4914ab0ab3a743e58f0eefdacc1dde77",
+ "name": "DN5242-Nov21-T1",
+ "isPermitted": true
+ },
+ {
+ "id": "d0a3e3f2964542259d155a81c41aadc3",
+ "name": "test-hvf6-09",
+ "isPermitted": true
+ },
+ {
+ "id": "cbb99fe4ada84631b7baf046b6fd2044",
+ "name": "DN5242-Nov16-T3",
+ "isPermitted": true
+ }
+ ]
+ }
+ },
+ "productFamilies": [
+ {
+ "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+ "name": "SCOTTIE",
+ "isPermitted": true
+ },
+ {
+ "id": "17cc1042-527b-11e6-beb8-9e71128cae77",
+ "name": "IGNACIO",
+ "isPermitted": true
+ },
+ {
+ "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+ "name": "Christie",
+ "isPermitted": true
+ },
+ {
+ "id": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7",
+ "name": "Enhanced Services",
+ "isPermitted": true
+ },
+ {
+ "id": "vTerrance",
+ "name": "vTerrance",
+ "isPermitted": true
+ },
+ {
+ "id": "323d69d9-2efe-4r45-ay0a-89ea7ard4e6f",
+ "name": "vSCP",
+ "isPermitted": true
+ },
+ {
+ "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+ "name": "Emanuel",
+ "isPermitted": true
+ },
+ {
+ "id": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+ "name": "BVOIP",
+ "isPermitted": true
+ },
+ {
+ "id": "db171b8f-115c-4992-a2e3-ee04cae357e0",
+ "name": "LINDSEY",
+ "isPermitted": true
+ },
+ {
+ "id": "LRSI-OSPF",
+ "name": "LRSI-OSPF",
+ "isPermitted": true
+ },
+ {
+ "id": "vRosemarie",
+ "name": "HNGATEWAY",
+ "isPermitted": true
+ },
+ {
+ "id": "vHNPaas",
+ "name": "WILKINS",
+ "isPermitted": true
+ },
+ {
+ "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "name": "TYLER SILVIA",
+ "isPermitted": true
+ },
+ {
+ "id": "b6a3f28c-eebf-494c-a900-055cc7c874ce",
+ "name": "VROUTER",
+ "isPermitted": true
+ },
+ {
+ "id": "Cisneros",
+ "name": "vMuriel",
+ "isPermitted": true
+ },
+ {
+ "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1",
+ "name": "CARA Griffin",
+ "isPermitted": true
+ },
+ {
+ "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d",
+ "name": "DARREN MCGEE",
+ "isPermitted": true
+ },
+ {
+ "id": "e30755dc-5673-4b6b-9dcf-9abdd96b93d1",
+ "name": "Transport",
+ "isPermitted": true
+ },
+ {
+ "id": "vSalvatore",
+ "name": "vSalvatore",
+ "isPermitted": true
+ },
+ {
+ "id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4",
+ "name": "Josefina",
+ "isPermitted": true
+ },
+ {
+ "id": "vHubbard",
+ "name": "vHubbard",
+ "isPermitted": true
+ },
+ {
+ "id": "12a96a9d-4b4c-4349-a950-fe1159602621",
+ "name": "DARREN MCGEE",
+ "isPermitted": true
+ }
+ ],
+ "serviceTypes": {
+ "e433710f-9217-458d-a79d-1c7aff376d89": [
+ {
+ "id": "0",
+ "name": "vRichardson",
+ "isPermitted": false
+ },
+ {
+ "id": "1",
+ "name": "TYLER SILVIA",
+ "isPermitted": true
+ },
+ {
+ "id": "2",
+ "name": "Emanuel",
+ "isPermitted": false
+ },
+ {
+ "id": "3",
+ "name": "vJamie",
+ "isPermitted": false
+ },
+ {
+ "id": "4",
+ "name": "vVoiceMail",
+ "isPermitted": false
+ },
+ {
+ "id": "5",
+ "name": "Kennedy",
+ "isPermitted": false
+ },
+ {
+ "id": "6",
+ "name": "vSEGW",
+ "isPermitted": false
+ },
+ {
+ "id": "7",
+ "name": "vVM",
+ "isPermitted": false
+ },
+ {
+ "id": "8",
+ "name": "vOTA",
+ "isPermitted": false
+ },
+ {
+ "id": "9",
+ "name": "vMME",
+ "isPermitted": false
+ },
+ {
+ "id": "10",
+ "name": "vMNS",
+ "isPermitted": false
+ },
+ {
+ "id": "11",
+ "name": "vSCP",
+ "isPermitted": false
+ },
+ {
+ "id": "12",
+ "name": "VPMS",
+ "isPermitted": false
+ },
+ {
+ "id": "13",
+ "name": "vMMSC",
+ "isPermitted": false
+ },
+ {
+ "id": "14",
+ "name": "SSD",
+ "isPermitted": false
+ },
+ {
+ "id": "15",
+ "name": "vMOG",
+ "isPermitted": false
+ },
+ {
+ "id": "16",
+ "name": "LINDSEY",
+ "isPermitted": false
+ },
+ {
+ "id": "17",
+ "name": "JOHANNA_SANTOS",
+ "isPermitted": false
+ },
+ {
+ "id": "18",
+ "name": "vCarroll",
+ "isPermitted": false
+ }
+ ]
+ },
+ "aicZones": [
+ {
+ "id": "NFT1",
+ "name": "NFTJSSSS-NFT1"
+ },
+ {
+ "id": "JAG1",
+ "name": "YUDFJULP-JAG1"
+ },
+ {
+ "id": "YYY1",
+ "name": "UUUAIAAI-YYY1"
+ },
+ {
+ "id": "BAN1",
+ "name": "VSDKYUTP-BAN1"
+ },
+ {
+ "id": "DKJ1",
+ "name": "DKJSJDKA-DKJ1"
+ },
+ {
+ "id": "MCS1",
+ "name": "ASACMAMS-MCS1"
+ },
+ {
+ "id": "UIO1",
+ "name": "uioclli1-UIO1"
+ },
+ {
+ "id": "RAJ1",
+ "name": "YGBIJNLQ-RAJ1"
+ },
+ {
+ "id": "OPA1",
+ "name": "opaclli1-OPA1"
+ },
+ {
+ "id": "SDE1",
+ "name": "ZXCVBNMA-SDE1"
+ },
+ {
+ "id": "VEN2",
+ "name": "FGHJUHIL-VEN2"
+ },
+ {
+ "id": "ORL1",
+ "name": "ORLDFLMA-ORL1"
+ },
+ {
+ "id": "JAD1",
+ "name": "JADECLLI-JAD1"
+ },
+ {
+ "id": "ZXL1",
+ "name": "LWLWCANN-ZXL1"
+ },
+ {
+ "id": "CKL1",
+ "name": "CLKSKCKK-CKL1"
+ },
+ {
+ "id": "SDF1",
+ "name": "sdfclli1-SDF1"
+ },
+ {
+ "id": "RAD1",
+ "name": "RADICAL1-RAD1"
+ },
+ {
+ "id": "KIT1",
+ "name": "BHYJFGLN-KIT1"
+ },
+ {
+ "id": "REL1",
+ "name": "INGERFGT-REL1"
+ },
+ {
+ "id": "JNL1",
+ "name": "CJALSDAC-JNL1"
+ },
+ {
+ "id": "OLK1",
+ "name": "OLKOLKLS-OLK1"
+ },
+ {
+ "id": "CHI1",
+ "name": "CHILLIWE-CHI1"
+ },
+ {
+ "id": "UUU4",
+ "name": "UUUAAAUU-UUU4"
+ },
+ {
+ "id": "TUF1",
+ "name": "TUFCLLI1-TUF1"
+ },
+ {
+ "id": "KJN1",
+ "name": "CKALDKSA-KJN1"
+ },
+ {
+ "id": "SAM1",
+ "name": "SNDGCA64-SAN1"
+ },
+ {
+ "id": "SCK1",
+ "name": "SCKSCKSK-SCK1"
+ },
+ {
+ "id": "HJH1",
+ "name": "AOEEQQQD-HJH1"
+ },
+ {
+ "id": "HGD1",
+ "name": "SDFQWHGD-HGD1"
+ },
+ {
+ "id": "KOR1",
+ "name": "HYFLNBVT-KOR1"
+ },
+ {
+ "id": "ATL43",
+ "name": "AICLOCID-ATL43"
+ },
+ {
+ "id": "ATL54",
+ "name": "AICFTAAI-ATL54"
+ },
+ {
+ "id": "ATL66",
+ "name": "CLLIAAII-ATL66"
+ },
+ {
+ "id": "VEL1",
+ "name": "BNMLKUIK-VEL1"
+ },
+ {
+ "id": "ICC1",
+ "name": "SANJITAT-ICC1"
+ },
+ {
+ "id": "MNT11",
+ "name": "WSXEFBTH-MNT11"
+ },
+ {
+ "id": "DEF2",
+ "name": "WSBHGTYL-DEF2"
+ },
+ {
+ "id": "MAD11",
+ "name": "SDFQWGKL-MAD11"
+ },
+ {
+ "id": "OLG1",
+ "name": "OLHOLHOL-OLG1"
+ },
+ {
+ "id": "GAR1",
+ "name": "NGFVSJKO-GAR1"
+ },
+ {
+ "id": "SAN22",
+ "name": "GNVLSCTL-SAN22"
+ },
+ {
+ "id": "HRG1",
+ "name": "HRGHRGGS-HRG1"
+ },
+ {
+ "id": "JCS1",
+ "name": "JCSJSCJS-JCS1"
+ },
+ {
+ "id": "DHA12",
+ "name": "WSXEDECF-DHA12"
+ },
+ {
+ "id": "HJE1",
+ "name": "AOEEWWWD-HJE1"
+ },
+ {
+ "id": "NCA1",
+ "name": "NCANCANN-NCA1"
+ },
+ {
+ "id": "IOP1",
+ "name": "iopclli1-IOP1"
+ },
+ {
+ "id": "RTY1",
+ "name": "rtyclli1-RTY1"
+ },
+ {
+ "id": "KAP1",
+ "name": "HIOUYTRQ-KAP1"
+ },
+ {
+ "id": "ZEN1",
+ "name": "ZENCLLI1-ZEN1"
+ },
+ {
+ "id": "HKA1",
+ "name": "JAKHLASS-HKA1"
+ },
+ {
+ "id": "CQK1",
+ "name": "CQKSCAKK-CQK1"
+ },
+ {
+ "id": "SAI1",
+ "name": "UBEKQLPD-SAI1"
+ },
+ {
+ "id": "ERT1",
+ "name": "ertclli1-ERT1"
+ },
+ {
+ "id": "IBB1",
+ "name": "PLMKOIJU-IBB1"
+ },
+ {
+ "id": "TIR2",
+ "name": "PLKINHYI-TIR2"
+ },
+ {
+ "id": "HSD1",
+ "name": "CHASKCDS-HSD1"
+ },
+ {
+ "id": "SLF78",
+ "name": "SDCTLFN1-SLF78"
+ },
+ {
+ "id": "SEE78",
+ "name": "SDCTEEE4-SEE78"
+ },
+ {
+ "id": "SAN13",
+ "name": "TOKYJPFA-SAN13"
+ },
+ {
+ "id": "SAA78",
+ "name": "SDCTAAA1-SAA78"
+ },
+ {
+ "id": "LUC1",
+ "name": "ATLDFGYC-LUC1"
+ },
+ {
+ "id": "AMD13",
+ "name": "MEMATLAN-AMD13"
+ },
+ {
+ "id": "TOR1",
+ "name": "TOROONXN-TOR1"
+ },
+ {
+ "id": "QWE1",
+ "name": "QWECLLI1-QWE1"
+ },
+ {
+ "id": "ZOG1",
+ "name": "ZOGASTRO-ZOG1"
+ },
+ {
+ "id": "CAL33",
+ "name": "CALIFORN-CAL33"
+ },
+ {
+ "id": "SHH78",
+ "name": "SDIT1HHH-SHH78"
+ },
+ {
+ "id": "DSA1",
+ "name": "LKJHGFDS-DSA1"
+ },
+ {
+ "id": "CLG1",
+ "name": "CLGRABAD-CLG1"
+ },
+ {
+ "id": "BNA1",
+ "name": "BNARAGBK-BNA1"
+ },
+ {
+ "id": "ATL84",
+ "name": "CANTTCOC-ATL84"
+ },
+ {
+ "id": "APP1",
+ "name": "WBHGTYUI-APP1"
+ },
+ {
+ "id": "RJN1",
+ "name": "RJNRBZAW-RJN1"
+ },
+ {
+ "id": "EHH78",
+ "name": "SDCSHHH5-EHH78"
+ },
+ {
+ "id": "mac10",
+ "name": "PKGTESTF-mac10"
+ },
+ {
+ "id": "SXB78",
+ "name": "SDCTGXB1-SXB78"
+ },
+ {
+ "id": "SAX78",
+ "name": "SDCTAXG1-SAX78"
+ },
+ {
+ "id": "SYD1",
+ "name": "SYDNAUBV-SYD1"
+ },
+ {
+ "id": "TOK1",
+ "name": "TOKYJPFA-TOK1"
+ },
+ {
+ "id": "KGM2",
+ "name": "KGMTNC20-KGM2"
+ },
+ {
+ "id": "DCC1b",
+ "name": "POIUYTGH-DCC1b"
+ },
+ {
+ "id": "SKK78",
+ "name": "SDCTKKK1-SKK78"
+ },
+ {
+ "id": "SGG78",
+ "name": "SDCTGGG1-SGG78"
+ },
+ {
+ "id": "SJJ78",
+ "name": "SDCTJJJ1-SJJ78"
+ },
+ {
+ "id": "SBX78",
+ "name": "SDCTBXG1-SBX78"
+ },
+ {
+ "id": "LAG1",
+ "name": "LARGIZON-LAG1"
+ },
+ {
+ "id": "IAA1",
+ "name": "QAZXSWED-IAA1"
+ },
+ {
+ "id": "POI1",
+ "name": "PLMNJKIU-POI1"
+ },
+ {
+ "id": "LAG1a",
+ "name": "LARGIZON-LAG1a"
+ },
+ {
+ "id": "PBL1",
+ "name": "PBLAPBAI-PBL1"
+ },
+ {
+ "id": "LAG45",
+ "name": "LARGIZON-LAG1a"
+ },
+ {
+ "id": "MAR1",
+ "name": "MNBVCXZM-MAR1"
+ },
+ {
+ "id": "HST70",
+ "name": "HSTNTX70-HST70"
+ },
+ {
+ "id": "DCC1a",
+ "name": "POIUYTGH-DCC1a"
+ },
+ {
+ "id": "TOL1",
+ "name": "TOLDOH21-TOL1"
+ },
+ {
+ "id": "LON1",
+ "name": "LONEENCO-LON1"
+ },
+ {
+ "id": "SJU78",
+ "name": "SDIT1JUB-SJU78"
+ },
+ {
+ "id": "STN27",
+ "name": "HSTNTX01-STN27"
+ },
+ {
+ "id": "SSW56",
+ "name": "ss8126GT-SSW56"
+ },
+ {
+ "id": "SBB78",
+ "name": "SDIT1BBB-SBB78"
+ },
+ {
+ "id": "DCC3",
+ "name": "POIUYTGH-DCC3"
+ },
+ {
+ "id": "GNV1",
+ "name": "GNVLSCTL-GNV1"
+ },
+ {
+ "id": "WAS1",
+ "name": "WASHDCSW-WAS1"
+ },
+ {
+ "id": "TOY1",
+ "name": "TORYONNZ-TOY1"
+ },
+ {
+ "id": "STT1",
+ "name": "STTLWA02-STT1"
+ },
+ {
+ "id": "STG1",
+ "name": "STTGGE62-STG1"
+ },
+ {
+ "id": "SLL78",
+ "name": "SDCTLLL1-SLL78"
+ },
+ {
+ "id": "SBU78",
+ "name": "SDIT1BUB-SBU78"
+ },
+ {
+ "id": "ATL2",
+ "name": "ATLNGANW-ATL2"
+ },
+ {
+ "id": "BOT1",
+ "name": "BOTHWAKY-BOT1"
+ },
+ {
+ "id": "SNG1",
+ "name": "SNGPSIAU-SNG1"
+ },
+ {
+ "id": "NYC1",
+ "name": "NYCMNY54-NYC1"
+ },
+ {
+ "id": "LAG1b",
+ "name": "LARGIZON-LAG1b"
+ },
+ {
+ "id": "AMD15",
+ "name": "AMDFAA01-AMD15"
+ },
+ {
+ "id": "SNA1",
+ "name": "SNANTXCA-SNA1"
+ },
+ {
+ "id": "PLT1",
+ "name": "PLTNCA60-PLT1"
+ },
+ {
+ "id": "TLP1",
+ "name": "TLPNXM18-TLP1"
+ },
+ {
+ "id": "SDD81",
+ "name": "SAIT1DD6-SDD81"
+ },
+ {
+ "id": "DCC1",
+ "name": "POIUYTGH-DCC1"
+ },
+ {
+ "id": "DCC2",
+ "name": "POIUYTGH-DCC2"
+ },
+ {
+ "id": "OKC1",
+ "name": "OKCBOK55-OKC1"
+ },
+ {
+ "id": "PAR1",
+ "name": "PARSFRCG-PAR1"
+ },
+ {
+ "id": "TES36",
+ "name": "ABCEETES-TES36"
+ },
+ {
+ "id": "COM1",
+ "name": "PLMKOPIU-COM1"
+ },
+ {
+ "id": "ANI1",
+ "name": "ATLNGTRE-ANI1"
+ },
+ {
+ "id": "SDG78",
+ "name": "SDIT1BDG-SDG78"
+ },
+ {
+ "id": "mac20",
+ "name": "PKGTESTF-mac20"
+ },
+ {
+ "id": "DSF45",
+ "name": "DSFBG123-DSF45"
+ },
+ {
+ "id": "HST25",
+ "name": "HSTNTX01-HST25"
+ },
+ {
+ "id": "AMD18",
+ "name": "AUDIMA01-AMD18"
+ },
+ {
+ "id": "SAA80",
+ "name": "SAIT9AA3-SAA80"
+ },
+ {
+ "id": "SSA56",
+ "name": "SSIT2AA7-SSA56"
+ },
+ {
+ "id": "SDD82",
+ "name": "SAIT1DD9-SDD82"
+ },
+ {
+ "id": "JCV1",
+ "name": "JCVLFLBW-JCV1"
+ },
+ {
+ "id": "SUL2",
+ "name": "WERTYUJK-SUL2"
+ },
+ {
+ "id": "PUR1",
+ "name": "purelyde-PUR1"
+ },
+ {
+ "id": "FDE55",
+ "name": "FDERT555-FDE55"
+ },
+ {
+ "id": "SITE",
+ "name": "LONEENCO-SITE"
+ },
+ {
+ "id": "ATL1",
+ "name": "ATLNGAMA-ATL1"
+ },
+ {
+ "id": "JUL1",
+ "name": "ZXCVBNMM-JUL1"
+ },
+ {
+ "id": "TAT34",
+ "name": "TESAAISB-TAT34"
+ },
+ {
+ "id": "XCP12",
+ "name": "CHKGH123-XCP12"
+ },
+ {
+ "id": "RAI1",
+ "name": "poiuytre-RAI1"
+ },
+ {
+ "id": "HPO1",
+ "name": "ATLNGAUP-HPO1"
+ },
+ {
+ "id": "KJF12",
+ "name": "KJFDH123-KJF12"
+ },
+ {
+ "id": "SCC80",
+ "name": "SAIT9CC3-SCC80"
+ },
+ {
+ "id": "SAA12",
+ "name": "SAIT9AF8-SAA12"
+ },
+ {
+ "id": "SAA14",
+ "name": "SAIT1AA9-SAA14"
+ },
+ {
+ "id": "ATL35",
+ "name": "TTESSAAI-ATL35"
+ },
+ {
+ "id": "CWY1",
+ "name": "CWYMOWBS-CWY1"
+ },
+ {
+ "id": "ATL76",
+ "name": "TELEPAAI-ATL76"
+ },
+ {
+ "id": "DSL12",
+ "name": "DSLFK242-DSL12"
+ },
+ {
+ "id": "ATL53",
+ "name": "AAIATLTE-ATL53"
+ },
+ {
+ "id": "SAA11",
+ "name": "SAIT9AA2-SAA11"
+ },
+ {
+ "id": "ATL62",
+ "name": "TESSASCH-ATL62"
+ },
+ {
+ "id": "AUG1",
+ "name": "ASDFGHJK-AUG1"
+ },
+ {
+ "id": "POI22",
+ "name": "POIUY123-POI22"
+ },
+ {
+ "id": "SAA13",
+ "name": "SAIT1AA9-SAA13"
+ },
+ {
+ "id": "BHY17",
+ "name": "BHYTFRF3-BHY17"
+ },
+ {
+ "id": "LIS1",
+ "name": "HOSTPROF-LIS1"
+ },
+ {
+ "id": "SIP1",
+ "name": "ZXCVBNMK-SIP1"
+ },
+ {
+ "id": "ATL99",
+ "name": "TEESTAAI-ATL43"
+ },
+ {
+ "id": "ATL64",
+ "name": "FORLOAAJ-ATL64"
+ },
+ {
+ "id": "TAT33",
+ "name": "TESAAISA-TAT33"
+ },
+ {
+ "id": "RAD10",
+ "name": "INDIPUNE-RAD10"
+ },
+ {
+ "id": "RTW5",
+ "name": "BHYTFRY4-RTW5"
+ },
+ {
+ "id": "JGS1",
+ "name": "KSJKKKKK-JGS1"
+ },
+ {
+ "id": "ATL98",
+ "name": "TEESTAAI-ATL43"
+ },
+ {
+ "id": "WAN1",
+ "name": "LEIWANGW-WAN1"
+ },
+ {
+ "id": "ATL44",
+ "name": "ATLSANAB-ATL44"
+ },
+ {
+ "id": "RTD2",
+ "name": "BHYTFRk4-RTD2"
+ },
+ {
+ "id": "NIR1",
+ "name": "ORFLMANA-NIR1"
+ },
+ {
+ "id": "ATL75",
+ "name": "SANAAIRE-ATL75"
+ },
+ {
+ "id": "NUM1",
+ "name": "QWERTYUI-NUM1"
+ },
+ {
+ "id": "MTN32",
+ "name": "MDTWNJ21-MTN32"
+ },
+ {
+ "id": "RTZ4",
+ "name": "BHYTFRZ6-RTZ4"
+ },
+ {
+ "id": "ATL56",
+ "name": "ATLSANAC-ATL56"
+ },
+ {
+ "id": "AMS1",
+ "name": "AMSTNLBW-AMS1"
+ },
+ {
+ "id": "RCT1",
+ "name": "AMSTERNL-RCT1"
+ },
+ {
+ "id": "JAN1",
+ "name": "ORFLMATT-JAN1"
+ },
+ {
+ "id": "ABC14",
+ "name": "TESAAISA-ABC14"
+ },
+ {
+ "id": "TAT37",
+ "name": "TESAAISD-TAT37"
+ },
+ {
+ "id": "MIC54",
+ "name": "MICHIGAN-MIC54"
+ },
+ {
+ "id": "ABC11",
+ "name": "ATLSANAI-ABC11"
+ },
+ {
+ "id": "AMF11",
+ "name": "AMDOCS01-AMF11"
+ },
+ {
+ "id": "ATL63",
+ "name": "ATLSANEW-ATL63"
+ },
+ {
+ "id": "ABC12",
+ "name": "ATLSECIA-ABC12"
+ },
+ {
+ "id": "MTN20",
+ "name": "MDTWNJ21-MTN20"
+ },
+ {
+ "id": "ABC15",
+ "name": "AAITESAN-ABC15"
+ },
+ {
+ "id": "AVT1",
+ "name": "AVTRFLHD-AVT1"
+ },
+ {
+ "id": "ATL34",
+ "name": "ATLSANAI-ATL34"
+ }
+ ],
+ "categoryParameters": {
+ "owningEntityList": [
+ {
+ "id": "aaa1",
+ "name": "aaa1"
+ },
+ {
+ "id": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+ "name": "WayneHolland"
+ },
+ {
+ "id": "Melissa",
+ "name": "Melissa"
+ }
+ ],
+ "projectList": [
+ {
+ "id": "WATKINS",
+ "name": "WATKINS"
+ },
+ {
+ "id": "x1",
+ "name": "x1"
+ },
+ {
+ "id": "yyy1",
+ "name": "yyy1"
+ }
+ ],
+ "lineOfBusinessList": [
+ {
+ "id": "ONAP",
+ "name": "ONAP"
+ },
+ {
+ "id": "zzz1",
+ "name": "zzz1"
+ }
+ ],
+ "platformList": [
+ {
+ "id": "platform",
+ "name": "platform"
+ },
+ {
+ "id": "xxx1",
+ "name": "xxx1"
+ }
+ ]
+ },
+ "type": "[LCP_REGIONS_AND_TENANTS] Update",
+ "subscribers": [
+ {
+ "id": "CAR_2020_ER",
+ "name": "CAR_2020_ER",
+ "isPermitted": true
+ },
+ {
+ "id": "21014aa2-526b-11e6-beb8-9e71128cae77",
+ "name": "JULIO ERICKSON",
+ "isPermitted": false
+ },
+ {
+ "id": "DHV1707-TestSubscriber-2",
+ "name": "DALE BRIDGES",
+ "isPermitted": false
+ },
+ {
+ "id": "DHV1707-TestSubscriber-1",
+ "name": "LLOYD BRIDGES",
+ "isPermitted": false
+ },
+ {
+ "id": "jimmy-example",
+ "name": "JimmyExampleCust-20161102",
+ "isPermitted": false
+ },
+ {
+ "id": "jimmy-example2",
+ "name": "JimmyExampleCust-20161103",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-TestSub-PWT-102",
+ "name": "ERICA5779-TestSub-PWT-102",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-TestSub-PWT-101",
+ "name": "ERICA5779-TestSub-PWT-101",
+ "isPermitted": false
+ },
+ {
+ "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+ "name": "Emanuel",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-Subscriber-4",
+ "name": "ERICA5779-Subscriber-5",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-TestSub-PWT-103",
+ "name": "ERICA5779-TestSub-PWT-103",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-Subscriber-2",
+ "name": "ERICA5779-Subscriber-2",
+ "isPermitted": false
+ },
+ {
+ "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "name": "SILVIA ROBBINS",
+ "isPermitted": true
+ },
+ {
+ "id": "ERICA5779-Subscriber-3",
+ "name": "ERICA5779-Subscriber-3",
+ "isPermitted": false
+ },
+ {
+ "id": "31739f3e-526b-11e6-beb8-9e71128cae77",
+ "name": "CRAIG/ROBERTS",
+ "isPermitted": false
+ }
+ ]
+ }
+ }
+ }
+}
+class ActivatedRouteMock<T>{
+ queryParams() {
+ return {
+ serviceModelId : '6e59c5de-f052-46fa-aa7e-2fca9d674c44'
+ }
+ }
+}
+
+class MockFeatureFlagsService {}
+
+describe('Generic Form popup Service', () => {
+ let injector;
+ let service: GenericFormPopupService;
+ let httpMock: HttpTestingController;
+ let form : FormGroup;
+ let fb : FormBuilder;
+ let netwokPopupService : NetworkPopupService;
+ let vfModulePopupService : VfModulePopuopService;
+ let servicePopupService : ServicePopupService;
+ let _aaiService : AaiService;
+ let _activatedRoute : ActivatedRoute;
+
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+ imports: [HttpClientTestingModule],
+ providers: [GenericFormPopupService,
+ FormBuilder,
+ IframeService,
+ ServicePopupService,
+ BasicControlGenerator,
+ ServiceControlGenerator,
+ GenericFormService,
+ LogService,
+ DefaultDataGeneratorService,
+ BasicPopupService,
+ AaiService,
+ NetworkPopupService,
+ NetworkControlGenerator,
+ VfModulePopuopService,
+ VfModuleControlGenerator,
+ {provide:FeatureFlagsService, useClass: MockFeatureFlagsService},
+ {provide: ActivatedRoute, useClass: ActivatedRouteMock},
+ {provide: NgRedux, useClass: MockAppStore}]
+ });
+ await TestBed.compileComponents();
+
+ injector = getTestBed();
+ service = injector.get(GenericFormPopupService);
+ httpMock = injector.get(HttpTestingController);
+ fb = injector.get(FormBuilder);
+ netwokPopupService = injector.get(NetworkPopupService);
+ vfModulePopupService = injector.get(VfModulePopuopService);
+ servicePopupService = injector.get(ServicePopupService);
+ _aaiService = injector.get(AaiService);
+ _activatedRoute = injector.get(ActivatedRoute);
+
+ })().then(done).catch(done.fail));
+
+
+ test('VL: getGenericFormDetails should return FormPopupDetails', () => {
+ let uuidData : UUIDData = <any>{
+ type : 'VL',
+ serviceId : '6e59c5de-f052-46fa-aa7e-2fca9d674c44',
+ networkId : 'ExtVL 0',
+ networkStoreKey : 'ExtVL 0',
+ popupService : netwokPopupService
+ };
+ let node : ITreeNode = <any>{data : {} };
+
+ jest.spyOn(uuidData.popupService ,'getGenericFormPopupDetails');
+ service.getGenericFormDetails(uuidData, node,true);
+
+ expect(uuidData.popupService.getGenericFormPopupDetails).toHaveBeenCalledTimes(1);
+ expect(uuidData.popupService.getGenericFormPopupDetails).toHaveBeenCalledWith(uuidData['serviceId'],
+ uuidData['networkId'],
+ uuidData['networkStoreKey'],
+ node,
+ uuidData,
+ true
+ );
+ });
+
+ test('VFmodule: getGenericFormDetails should return FormPopupDetails', () => {
+ let uuidData : UUIDData = <any>{
+ type : 'VFmodule',
+ serviceId : '6e59c5de-f052-46fa-aa7e-2fca9d674c44',
+ vnfStoreKey : 'VF_vMee 0',
+ vFModuleStoreKey : 'vf_vmee0..VfVmee..vmme_vlc..module-1',
+ popupService : vfModulePopupService
+ };
+ let node : ITreeNode = <any>{data : {}};
+
+ spyOn(uuidData.popupService ,'getGenericFormPopupDetails');
+ service.getGenericFormDetails(uuidData, node,true);
+
+ expect(uuidData.popupService.getGenericFormPopupDetails).toHaveBeenCalledTimes(1)
+ expect(uuidData.popupService.getGenericFormPopupDetails).toHaveBeenCalledWith(
+ uuidData['serviceId'],
+ uuidData['vnfStoreKey'],
+ uuidData['vFModuleStoreKey'],
+ node,
+ uuidData,
+ true
+ );
+ });
+
+
+ test('service: getGenericFormDetails should return FormPopupDetails', () => {
+ let uuidData : UUIDData = <any>{
+ type : 'service',
+ serviceId : '6e59c5de-f052-46fa-aa7e-2fca9d674c44',
+ popupService : servicePopupService
+ };
+ let node : ITreeNode = <any>{data : {}};
+
+ jest.spyOn(uuidData.popupService ,'getGenericFormPopupDetails');
+ service.getGenericFormDetails(uuidData, node,true);
+
+ expect(uuidData.popupService.getGenericFormPopupDetails).toHaveBeenCalledTimes(1);
+ expect(uuidData.popupService.getGenericFormPopupDetails).toHaveBeenCalledWith(
+ uuidData['serviceId'],
+ null,
+ null,
+ node,
+ uuidData,
+ true
+ );
+ });
+
+
+ test('initReduxOnCreateNewService',() => {
+ jest.spyOn(_aaiService, 'getServiceModelById');
+ service.initReduxOnCreateNewService();
+ })
+});
diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.service.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.service.ts
new file mode 100644
index 000000000..6636a54f2
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.service.ts
@@ -0,0 +1,93 @@
+import {Injectable} from "@angular/core";
+import {IframeService} from "../../utils/iframe.service";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../store/reducers";
+import {ServicePopupService} from "./genericFormServices/service/service.popup.service";
+import {ActivatedRoute} from "@angular/router";
+import {AaiService} from "../../services/aaiService/aai.service";
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import {UUIDData} from "./generic-form-popup.component";
+import {FormPopupDetails} from "../../models/formControlModels/formPopupDetails.model";
+import {Subject} from "rxjs";
+import {deleteAllServiceInstances} from "../../storeUtil/utils/service/service.actions";
+
+@Injectable()
+export class GenericFormPopupService {
+ constructor(private _iframeService : IframeService,
+ private _store: NgRedux<AppState>,
+ private _servicePopupService : ServicePopupService,
+ public _activatedRoute : ActivatedRoute,
+ private _aaiService : AaiService){
+
+ }
+ getGenericFormDetails(uuidData : UUIDData, node : ITreeNode, isUpdateMode : boolean) : FormPopupDetails {
+ switch (uuidData.type){
+ case 'VL' : {
+ return uuidData.popupService.getGenericFormPopupDetails(
+ uuidData['serviceId'],
+ uuidData['networkId'],
+ uuidData['networkStoreKey'],
+ node,
+ uuidData,
+ isUpdateMode
+ );
+ }
+ case 'VFmodule' : {
+ return uuidData.popupService.getGenericFormPopupDetails(
+ uuidData['serviceId'],
+ uuidData['vnfStoreKey'],
+ uuidData['vFModuleStoreKey'],
+ node,
+ uuidData,
+ isUpdateMode
+ );
+ }
+ case 'VF' : {
+ return uuidData.popupService.getGenericFormPopupDetails(
+ uuidData['serviceId'],
+ uuidData['modelName'],
+ uuidData['vnfStoreKey'],
+ node,
+ uuidData,
+ isUpdateMode
+ );
+ }
+ case 'VnfGroup' : {
+ return uuidData.popupService.getGenericFormPopupDetails(
+ uuidData['serviceId'],
+ uuidData['modelName'],
+ uuidData['vnfGroupStoreKey'],
+ node,
+ uuidData,
+ isUpdateMode
+ );
+ }
+ case 'service' : {
+ uuidData['bulkSize'] = this._store.getState().service.serviceInstance[uuidData['serviceId']].bulkSize || 1;
+ return uuidData.popupService.getGenericFormPopupDetails(
+ uuidData['serviceId'],
+ null,
+ null,
+ node,
+ uuidData,
+ isUpdateMode
+ );
+ }
+ }
+ }
+
+ initReduxOnCreateNewService() : Promise<string> {
+ return new Promise((resolve, reject) => {
+ this._activatedRoute
+ .queryParams
+ .subscribe(params => {
+ this._store.dispatch(deleteAllServiceInstances());
+ this._aaiService.getServiceModelById(params.serviceModelId).subscribe(()=>{
+ resolve(params.serviceModelId);
+ });
+ });
+ });
+ }
+
+ refreshModalCheckForGeneralErrorTrigger : Subject<boolean> = new Subject<boolean>();
+}
diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/basic.popup.service.spec.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/basic.popup.service.spec.ts
new file mode 100644
index 000000000..521e5fb59
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/basic.popup.service.spec.ts
@@ -0,0 +1,92 @@
+import {NetworkPopupService} from "./network/network.popup.service";
+import {LogService} from "../../../utils/log/log.service";
+import {ReflectiveInjector} from "@angular/core";
+import {NgRedux} from "@angular-redux/store";
+import {BasicControlGenerator} from "../../genericForm/formControlsServices/basic.control.generator";
+import {AaiService} from "../../../services/aaiService/aai.service";
+import {HttpClient} from "@angular/common/http";
+import {NetworkControlGenerator} from "../../genericForm/formControlsServices/networkGenerator/network.control.generator";
+import {GenericFormService} from "../../genericForm/generic-form.service";
+import {FormBuilder} from "@angular/forms";
+import {IframeService} from "../../../utils/iframe.service";
+import {DefaultDataGeneratorService} from "../../../services/defaultDataServiceGenerator/default.data.generator.service";
+import {FormControlModel} from "../../../models/formControlModels/formControl.model";
+import {BasicPopupService} from "./basic.popup.service";
+import {SdcUiServices} from "onap-ui-angular";
+import {FeatureFlagsService} from "../../../services/featureFlag/feature-flags.service";
+import {getTestBed, TestBed} from "@angular/core/testing";
+
+class MockAppStore<T> {}
+
+class MockModalService<T> {}
+
+class MockFeatureFlagsService {}
+
+class MockReduxStore<T> {
+ getState() {
+ return {"global":{"name":null,"flags":{"FLAG_NETWORK_TO_ASYNC_INSTANTIATION":false,"FLAG_SHOW_ASSIGNMENTS":true,"FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS":true,"FLAG_UNASSIGN_SERVICE":true,"FLAG_SHOW_VERIFY_SERVICE":false,"FLAG_COLLECTION_RESOURCE_SUPPORT":true,"FLAG_DUPLICATE_VNF":true,"FLAG_SERVICE_MODEL_CACHE":true,"FLAG_ADVANCED_PORTS_FILTER":true,"CREATE_INSTANCE_TEST":false,"FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD":false,"FLAG_REGION_ID_FROM_REMOTE":true,"FLAG_ASYNC_INSTANTIATION":true,"FLAG_ASYNC_JOBS":true,"EMPTY_DRAWING_BOARD_TEST":false,"FLAG_ADD_MSO_TESTAPI_FIELD":true},"type":"[FLAGS] Update"},"service":{"serviceHierarchy":{"6e59c5de-f052-46fa-aa7e-2fca9d674c44":{"service":{"uuid":"6e59c5de-f052-46fa-aa7e-2fca9d674c44","invariantUuid":"e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0","name":"ComplexService","version":"1.0","toscaModelURL":null,"category":"Emanuel","serviceType":"","serviceRole":"","description":"ComplexService","serviceEcompNaming":"false","instantiationType":"Macro","inputs":{}},"vnfs":{"VF_vMee 0":{"uuid":"d6557200-ecf2-4641-8094-5393ae3aae60","invariantUuid":"4160458e-f648-4b30-a176-43881ffffe9e","description":"VSP_vMee","name":"VF_vMee","version":"2.0","customizationUuid":"91415b44-753d-494c-926a-456a9172bbb9","inputs":{},"commands":{},"properties":{"max_instances":10,"min_instances":1,"gpb2_Internal2_mac":"00:11:22:EF:AC:DF","sctp-b-ipv6-egress_src_start_port":"0","sctp-a-ipv6-egress_rule_application":"any","Internal2_allow_transit":"true","sctp-b-IPv6_ethertype":"IPv6","sctp-a-egress_rule_application":"any","sctp-b-ingress_action":"pass","sctp-b-ingress_rule_protocol":"icmp","ncb2_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-ipv6-ingress-src_start_port":"0.0","ncb1_Internal2_mac":"00:11:22:EF:AC:DF","fsb_volume_size_0":"320.0","sctp-b-egress_src_addresses":"local","sctp-a-ipv6-ingress_ethertype":"IPv4","sctp-a-ipv6-ingress-dst_start_port":"0","sctp-b-ipv6-ingress_rule_application":"any","domain_name":"default-domain","sctp-a-ingress_rule_protocol":"icmp","sctp-b-egress-src_start_port":"0.0","sctp-a-egress_src_addresses":"local","sctp-b-display_name":"epc-sctp-b-ipv4v6-sec-group","sctp-a-egress-src_start_port":"0.0","sctp-a-ingress_ethertype":"IPv4","sctp-b-ipv6-ingress-dst_end_port":"65535","sctp-b-dst_subnet_prefix_v6":"::","nf_naming":"{ecomp_generated_naming=true}","sctp-a-ipv6-ingress_src_subnet_prefix":"0.0.0.0","sctp-b-egress-dst_start_port":"0.0","ncb_flavor_name":"nv.c20r64d1","gpb1_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-egress_dst_subnet_prefix_len":"0.0","Internal2_net_cidr":"10.0.0.10","sctp-a-ingress-dst_start_port":"0.0","sctp-a-egress-dst_start_port":"0.0","fsb1_Internal2_mac":"00:11:22:EF:AC:DF","sctp-a-egress_ethertype":"IPv4","vlc_st_service_mode":"in-network-nat","sctp-a-ipv6-egress_ethertype":"IPv4","sctp-a-egress-src_end_port":"65535.0","sctp-b-ipv6-egress_rule_application":"any","sctp-b-egress_action":"pass","sctp-a-ingress-src_subnet_prefix_len":"0.0","sctp-b-ipv6-ingress-src_end_port":"65535.0","sctp-b-name":"epc-sctp-b-ipv4v6-sec-group","fsb2_Internal1_mac":"00:11:22:EF:AC:DF","sctp-a-ipv6-ingress-src_start_port":"0.0","sctp-b-ipv6-egress_ethertype":"IPv4","Internal1_net_cidr":"10.0.0.10","sctp-a-egress_dst_subnet_prefix":"0.0.0.0","fsb_flavor_name":"nv.c20r64d1","sctp_rule_protocol":"132","sctp-b-ipv6-ingress_src_subnet_prefix_len":"0","sctp-a-ipv6-ingress_rule_application":"any","ecomp_generated_naming":"false","sctp-a-IPv6_ethertype":"IPv6","vlc2_Internal1_mac":"00:11:22:EF:AC:DF","vlc_st_virtualization_type":"virtual-machine","sctp-b-ingress-dst_start_port":"0.0","sctp-b-ingress-dst_end_port":"65535.0","sctp-a-ipv6-ingress-src_end_port":"65535.0","sctp-a-display_name":"epc-sctp-a-ipv4v6-sec-group","sctp-b-ingress_rule_application":"any","int2_sec_group_name":"int2-sec-group","vlc_flavor_name":"nd.c16r64d1","sctp-b-ipv6-egress_src_addresses":"local","vlc_st_interface_type_int1":"other1","sctp-b-egress-src_end_port":"65535.0","sctp-a-ipv6-egress-dst_start_port":"0","vlc_st_interface_type_int2":"other2","sctp-a-ipv6-egress_rule_protocol":"any","Internal2_shared":"false","sctp-a-ipv6-egress_dst_subnet_prefix_len":"0","Internal2_rpf":"disable","vlc1_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-ipv6-egress_src_end_port":"65535","sctp-a-ipv6-egress_src_addresses":"local","sctp-a-ingress-dst_end_port":"65535.0","sctp-a-ipv6-egress_src_end_port":"65535","Internal1_forwarding_mode":"l2","Internal2_dhcp":"false","sctp-a-dst_subnet_prefix_v6":"::","pxe_image_name":"MME_PXE-Boot_16ACP04_GA.qcow2","vlc_st_interface_type_gtp":"other0","ncb1_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-src_subnet_prefix_v6":"::","sctp-a-egress_dst_subnet_prefix_len":"0.0","int1_sec_group_name":"int1-sec-group","Internal1_dhcp":"false","sctp-a-ipv6-egress_dst_end_port":"65535","Internal2_forwarding_mode":"l2","fsb2_Internal2_mac":"00:11:22:EF:AC:DF","sctp-b-egress_dst_subnet_prefix":"0.0.0.0","Internal1_net_cidr_len":"17","gpb2_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-ingress-src_subnet_prefix_len":"0.0","sctp-a-ingress_dst_addresses":"local","sctp-a-egress_action":"pass","fsb_volume_type_0":"SF-Default-SSD","ncb2_Internal2_mac":"00:11:22:EF:AC:DF","vlc_st_interface_type_sctp_a":"left","vlc_st_interface_type_sctp_b":"right","sctp-a-src_subnet_prefix_v6":"::","vlc_st_version":"2","sctp-b-egress_ethertype":"IPv4","sctp-a-ingress_rule_application":"any","gpb1_Internal2_mac":"00:11:22:EF:AC:DF","instance_ip_family_v6":"v6","sctp-a-ipv6-egress_src_start_port":"0","sctp-b-ingress-src_start_port":"0.0","sctp-b-ingress_dst_addresses":"local","fsb1_Internal1_mac":"00:11:22:EF:AC:DF","vlc_st_interface_type_oam":"management","multi_stage_design":"true","oam_sec_group_name":"oam-sec-group","Internal2_net_gateway":"10.0.0.10","sctp-a-ipv6-ingress-dst_end_port":"65535","sctp-b-ipv6-egress-dst_start_port":"0","Internal1_net_gateway":"10.0.0.10","sctp-b-ipv6-egress_rule_protocol":"any","gtp_sec_group_name":"gtp-sec-group","sctp-a-ipv6-egress_dst_subnet_prefix":"0.0.0.0","sctp-b-ipv6-egress_dst_subnet_prefix_len":"0","sctp-a-ipv6-ingress_dst_addresses":"local","sctp-a-egress_rule_protocol":"icmp","sctp-b-ipv6-egress_action":"pass","sctp-a-ipv6-egress_action":"pass","Internal1_shared":"false","sctp-b-ipv6-ingress_rule_protocol":"any","Internal2_net_cidr_len":"17","sctp-a-name":"epc-sctp-a-ipv4v6-sec-group","sctp-a-ingress-src_end_port":"65535.0","sctp-b-ipv6-ingress_src_subnet_prefix":"0.0.0.0","sctp-a-egress-dst_end_port":"65535.0","sctp-a-ingress_action":"pass","sctp-b-egress_rule_protocol":"icmp","sctp-b-ipv6-ingress_action":"pass","vlc_st_service_type":"firewall","sctp-b-ipv6-egress_dst_end_port":"65535","sctp-b-ipv6-ingress-dst_start_port":"0","vlc2_Internal2_mac":"00:11:22:EF:AC:DF","vlc_st_availability_zone":"true","fsb_volume_image_name_1":"MME_FSB2_16ACP04_GA.qcow2","sctp-b-ingress-src_subnet_prefix":"0.0.0.0","sctp-a-ipv6-ingress_src_subnet_prefix_len":"0","Internal1_allow_transit":"true","gpb_flavor_name":"nv.c20r64d1","availability_zone_max_count":"1","fsb_volume_image_name_0":"MME_FSB1_16ACP04_GA.qcow2","sctp-b-ipv6-ingress_dst_addresses":"local","sctp-b-ipv6-egress_dst_subnet_prefix":"0.0.0.0","sctp-b-ipv6-ingress_ethertype":"IPv4","vlc1_Internal2_mac":"00:11:22:EF:AC:DF","sctp-a-ingress-src_subnet_prefix":"0.0.0.0","sctp-a-ipv6-ingress_action":"pass","Internal1_rpf":"disable","sctp-b-ingress_ethertype":"IPv4","sctp-b-egress_rule_application":"any","sctp-b-ingress-src_end_port":"65535.0","sctp-a-ipv6-ingress_rule_protocol":"any","sctp-a-ingress-src_start_port":"0.0","sctp-b-egress-dst_end_port":"65535.0"},"type":"VF","modelCustomizationName":"VF_vMee 0","vfModules":{"vf_vmee0..VfVmee..vmme_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","version":"2","modelCustomizationName":"VfVmee..vmme_vlc..module-1","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_vlc"},"inputs":{},"volumeGroupAllowed":true},"vf_vmee0..VfVmee..vmme_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","version":"2","modelCustomizationName":"VfVmee..vmme_gpb..module-2","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_gpb"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..base_vmme..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","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{},"volumeGroupAllowed":true}},"volumeGroups":{"vf_vmee0..VfVmee..base_vmme..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","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{}}},"vfcInstanceGroups":{}}},"networks":{"ExtVL 0":{"uuid":"ddc3f20c-08b5-40fd-af72-c6d14636b986","invariantUuid":"379f816b-a7aa-422f-be30-17114ff50b7c","description":"ECOMP generic virtual link (network) base type for all other service-level and global networks","name":"ExtVL","version":"37.0","customizationUuid":"94fdd893-4a36-4d70-b16a-ec29c54c184f","inputs":{},"commands":{},"properties":{"network_assignments":"{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}","exVL_naming":"{ecomp_generated_naming=true}","network_flows":"{is_network_policy=false, is_bound_to_vpn=false}","network_homing":"{ecomp_selected_instance_node_target=false}"},"type":"VL","modelCustomizationName":"ExtVL 0"}},"collectionResource":{},"configurations":{"Port Mirroring Configuration By Policy 0":{"uuid":"b4398538-e89d-4f13-b33d-ca323434ba50","invariantUuid":"6ef0ca40-f366-4897-951f-abd65d25f6f7","description":"A port mirroring configuration by policy object","name":"Port Mirroring Configuration By Policy","version":"27.0","customizationUuid":"3c3b7b8d-8669-4b3b-8664-61970041fad2","inputs":{},"commands":{},"properties":{},"type":"Configuration","modelCustomizationName":"Port Mirroring Configuration By Policy 0","sourceNodes":[],"collectorNodes":null,"configurationByPolicy":false}},"serviceProxies":{},"vfModules":{"vf_vmee0..VfVmee..vmme_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","version":"2","modelCustomizationName":"VfVmee..vmme_vlc..module-1","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_vlc"},"inputs":{},"volumeGroupAllowed":true},"vf_vmee0..VfVmee..vmme_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","version":"2","modelCustomizationName":"VfVmee..vmme_gpb..module-2","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_gpb"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..base_vmme..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","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{},"volumeGroupAllowed":true}},"volumeGroups":{"vf_vmee0..VfVmee..base_vmme..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","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{}}},"pnfs":{}},"6b528779-44a3-4472-bdff-9cd15ec93450":{"service":{"uuid":"6b528779-44a3-4472-bdff-9cd15ec93450","invariantUuid":"e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0","name":"action-data","version":"1.0","toscaModelURL":null,"category":"","serviceType":"","serviceRole":"","description":"","serviceEcompNaming":"false","instantiationType":"A-La-Carte","inputs":{"2017488_adiodvpe0_ASN":{"type":"string","description":"AV/PE","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"AV_vPE"}}},"vnfs":{"2017-388_ADIOD-vPE 1":{"uuid":"0903e1c0-8e03-4936-b5c2-260653b96413","invariantUuid":"00beb8f9-6d39-452f-816d-c709b9cbb87d","description":"Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM","name":"2017-388_ADIOD-vPE","version":"1.0","customizationUuid":"280dec31-f16d-488b-9668-4aae55d6648a","inputs":{"vnf_config_template_version":{"type":"string","description":"VPE Software Version","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"17.2"},"bandwidth_units":{"type":"string","description":"Units of bandwidth","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"Gbps"},"bandwidth":{"type":"string","description":"Requested VPE bandwidth","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"10"},"AIC_CLLI":{"type":"string","description":"AIC Site CLLI","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"ATLMY8GA"},"ASN":{"type":"string","description":"AV/PE","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"AV_vPE"},"vnf_instance_name":{"type":"string","description":"The hostname assigned to the vpe.","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"mtnj309me6"}},"commands":{"vnf_config_template_version":{"displayName":"vnf_config_template_version","command":"get_input","inputName":"2017488_adiodvpe0_vnf_config_template_version"},"bandwidth_units":{"displayName":"bandwidth_units","command":"get_input","inputName":"adiodvpe0_bandwidth_units"},"bandwidth":{"displayName":"bandwidth","command":"get_input","inputName":"adiodvpe0_bandwidth"},"AIC_CLLI":{"displayName":"AIC_CLLI","command":"get_input","inputName":"2017488_adiodvpe0_AIC_CLLI"},"ASN":{"displayName":"ASN","command":"get_input","inputName":"2017488_adiodvpe0_ASN"},"vnf_instance_name":{"displayName":"vnf_instance_name","command":"get_input","inputName":"2017488_adiodvpe0_vnf_instance_name"}},"properties":{"vmxvre_retype":"RE-VMX","vnf_config_template_version":"get_input:2017488_adiodvpe0_vnf_config_template_version","sriov44_net_id":"48d399b3-11ee-48a8-94d2-f0ea94d6be8d","int_ctl_net_id":"2f323477-6936-4d01-ac53-d849430281d9","vmxvpfe_sriov41_0_port_mac":"00:11:22:EF:AC:DF","int_ctl_net_name":"VMX-INTXI","vmx_int_ctl_prefix":"10.0.0.10","sriov43_net_id":"da349ca1-6de9-4548-be88-2d88e99bfef5","sriov42_net_id":"760669ba-013d-4d9b-b0e7-4151fe2e6279","sriov41_net_id":"25ad52d5-c165-40f8-b3b0-ddfc2373280a","nf_type":"vPE","vmxvpfe_int_ctl_ip_1":"10.0.0.10","is_AVPN_service":"false","vmx_RSG_name":"vREXI-affinity","vmx_int_ctl_forwarding":"l2","vmxvre_oam_ip_0":"10.0.0.10","vmxvpfe_sriov44_0_port_mac":"00:11:22:EF:AC:DF","vmxvpfe_sriov41_0_port_vlanstrip":"false","vmxvpfe_sriov42_0_port_vlanfilter":"4001","vmxvpfe_sriov44_0_port_unknownunicastallow":"true","vmxvre_image_name_0":"VRE-ENGINE_17.2-S2.1.qcow2","vmxvre_instance":"0","vmxvpfe_sriov43_0_port_mac":"00:11:22:EF:AC:DF","vmxvre_flavor_name":"ns.c1r16d32.v5","vmxvpfe_volume_size_0":"40.0","vmxvpfe_sriov43_0_port_vlanfilter":"4001","nf_naming":"{ecomp_generated_naming=false}","nf_naming_code":"Navneet","vmxvre_name_0":"vREXI","vmxvpfe_sriov42_0_port_vlanstrip":"false","vmxvpfe_volume_name_0":"vPFEXI_FBVolume","vmx_RSG_id":"bd89a33c-13c3-4a04-8fde-1a57eb123141","vmxvpfe_image_name_0":"VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2","vmxvpfe_sriov43_0_port_unknownunicastallow":"true","vmxvpfe_sriov44_0_port_unknownmulticastallow":"true","vmxvre_console":"vidconsole","vmxvpfe_sriov44_0_port_vlanfilter":"4001","vmxvpfe_sriov42_0_port_mac":"00:11:22:EF:AC:DF","vmxvpfe_volume_id_0":"47cede15-da2f-4397-a101-aa683220aff3","vmxvpfe_sriov42_0_port_unknownmulticastallow":"true","vmxvpfe_sriov44_0_port_vlanstrip":"false","vf_module_id":"123","nf_function":"JAI","vmxvpfe_sriov43_0_port_unknownmulticastallow":"true","vmxvre_int_ctl_ip_0":"10.0.0.10","ecomp_generated_naming":"false","AIC_CLLI":"get_input:2017488_adiodvpe0_AIC_CLLI","vnf_name":"mtnj309me6vre","vmxvpfe_sriov41_0_port_unknownunicastallow":"true","vmxvre_volume_type_1":"HITACHI","vmxvpfe_sriov44_0_port_broadcastallow":"true","vmxvre_volume_type_0":"HITACHI","vmxvpfe_volume_type_0":"HITACHI","vmxvpfe_sriov43_0_port_broadcastallow":"true","bandwidth_units":"get_input:adiodvpe0_bandwidth_units","vnf_id":"123","vmxvre_oam_prefix":"24","availability_zone_0":"mtpocfo-kvm-az01","ASN":"get_input:2017488_adiodvpe0_ASN","vmxvre_chassis_i2cid":"161","vmxvpfe_name_0":"vPFEXI","bandwidth":"get_input:adiodvpe0_bandwidth","availability_zone_max_count":"1","vmxvre_volume_size_0":"45.0","vmxvre_volume_size_1":"50.0","vmxvpfe_sriov42_0_port_broadcastallow":"true","vmxvre_oam_gateway":"10.0.0.10","vmxvre_volume_name_1":"vREXI_FAVolume","vmxvre_ore_present":"0","vmxvre_volume_name_0":"vREXI_FBVolume","vmxvre_type":"0","vnf_instance_name":"get_input:2017488_adiodvpe0_vnf_instance_name","vmxvpfe_sriov41_0_port_unknownmulticastallow":"true","oam_net_id":"b95eeb1d-d55d-4827-abb4-8ebb94941429","vmx_int_ctl_len":"24","vmxvpfe_sriov43_0_port_vlanstrip":"false","vmxvpfe_sriov41_0_port_broadcastallow":"true","vmxvre_volume_id_1":"6e86797e-03cd-4fdc-ba72-2957119c746d","vmxvpfe_sriov41_0_port_vlanfilter":"4001","nf_role":"Testing","vmxvre_volume_id_0":"f4eacb79-f687-4e9d-b760-21847c8bb15a","vmxvpfe_sriov42_0_port_unknownunicastallow":"true","vmxvpfe_flavor_name":"ns.c20r16d25.v5"},"type":"VF","modelCustomizationName":"2017-388_ADIOD-vPE 1","vfModules":{},"volumeGroups":{},"vfcInstanceGroups":{}},"2017-388_ADIOD-vPE 0":{"uuid":"afacccf6-397d-45d6-b5ae-94c39734b168","invariantUuid":"72e465fe-71b1-4e7b-b5ed-9496118ff7a8","description":"Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM","name":"2017-388_ADIOD-vPE","version":"4.0","customizationUuid":"b3c76f73-eeb5-4fb6-9d31-72a889f1811c","inputs":{"vnf_config_template_version":{"type":"string","description":"VPE Software Version","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"17.2"},"bandwidth_units":{"type":"string","description":"Units of bandwidth","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"Gbps"},"bandwidth":{"type":"string","description":"Requested VPE bandwidth","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"10"},"AIC_CLLI":{"type":"string","description":"AIC Site CLLI","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"ATLMY8GA"},"ASN":{"type":"string","description":"AV/PE","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"AV_vPE"},"vnf_instance_name":{"type":"string","description":"The hostname assigned to the vpe.","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"mtnj309me6"}},"commands":{"vnf_config_template_version":{"displayName":"vnf_config_template_version","command":"get_input","inputName":"2017488_adiodvpe0_vnf_config_template_version"},"bandwidth_units":{"displayName":"bandwidth_units","command":"get_input","inputName":"adiodvpe0_bandwidth_units"},"bandwidth":{"displayName":"bandwidth","command":"get_input","inputName":"adiodvpe0_bandwidth"},"AIC_CLLI":{"displayName":"AIC_CLLI","command":"get_input","inputName":"2017488_adiodvpe0_AIC_CLLI"},"ASN":{"displayName":"ASN","command":"get_input","inputName":"2017488_adiodvpe0_ASN"},"vnf_instance_name":{"displayName":"vnf_instance_name","command":"get_input","inputName":"2017488_adiodvpe0_vnf_instance_name"}},"properties":{"vmxvre_retype":"RE-VMX","vnf_config_template_version":"get_input:2017488_adiodvpe0_vnf_config_template_version","sriov44_net_id":"48d399b3-11ee-48a8-94d2-f0ea94d6be8d","int_ctl_net_id":"2f323477-6936-4d01-ac53-d849430281d9","vmxvpfe_sriov41_0_port_mac":"00:11:22:EF:AC:DF","int_ctl_net_name":"VMX-INTXI","vmx_int_ctl_prefix":"10.0.0.10","sriov43_net_id":"da349ca1-6de9-4548-be88-2d88e99bfef5","sriov42_net_id":"760669ba-013d-4d9b-b0e7-4151fe2e6279","sriov41_net_id":"25ad52d5-c165-40f8-b3b0-ddfc2373280a","nf_type":"vPE","vmxvpfe_int_ctl_ip_1":"10.0.0.10","is_AVPN_service":"false","vmx_RSG_name":"vREXI-affinity","vmx_int_ctl_forwarding":"l2","vmxvre_oam_ip_0":"10.0.0.10","vmxvpfe_sriov44_0_port_mac":"00:11:22:EF:AC:DF","vmxvpfe_sriov41_0_port_vlanstrip":"false","vmxvpfe_sriov42_0_port_vlanfilter":"4001","vmxvpfe_sriov44_0_port_unknownunicastallow":"true","vmxvre_image_name_0":"VRE-ENGINE_17.2-S2.1.qcow2","vmxvre_instance":"0","vmxvpfe_sriov43_0_port_mac":"00:11:22:EF:AC:DF","vmxvre_flavor_name":"ns.c1r16d32.v5","vmxvpfe_volume_size_0":"40.0","vmxvpfe_sriov43_0_port_vlanfilter":"4001","nf_naming":"{ecomp_generated_naming=false}","nf_naming_code":"Navneet","vmxvre_name_0":"vREXI","vmxvpfe_sriov42_0_port_vlanstrip":"false","vmxvpfe_volume_name_0":"vPFEXI_FBVolume","vmx_RSG_id":"bd89a33c-13c3-4a04-8fde-1a57eb123141","vmxvpfe_image_name_0":"VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2","vmxvpfe_sriov43_0_port_unknownunicastallow":"true","vmxvpfe_sriov44_0_port_unknownmulticastallow":"true","vmxvre_console":"vidconsole","vmxvpfe_sriov44_0_port_vlanfilter":"4001","vmxvpfe_sriov42_0_port_mac":"00:11:22:EF:AC:DF","vmxvpfe_volume_id_0":"47cede15-da2f-4397-a101-aa683220aff3","vmxvpfe_sriov42_0_port_unknownmulticastallow":"true","min_instances":"1","vmxvpfe_sriov44_0_port_vlanstrip":"false","vf_module_id":"123","nf_function":"JAI","vmxvpfe_sriov43_0_port_unknownmulticastallow":"true","vmxvre_int_ctl_ip_0":"10.0.0.10","ecomp_generated_naming":"false","AIC_CLLI":"get_input:2017488_adiodvpe0_AIC_CLLI","vnf_name":"mtnj309me6vre","vmxvpfe_sriov41_0_port_unknownunicastallow":"true","vmxvre_volume_type_1":"HITACHI","vmxvpfe_sriov44_0_port_broadcastallow":"true","vmxvre_volume_type_0":"HITACHI","vmxvpfe_volume_type_0":"HITACHI","vmxvpfe_sriov43_0_port_broadcastallow":"true","bandwidth_units":"get_input:adiodvpe0_bandwidth_units","vnf_id":"123","vmxvre_oam_prefix":"24","availability_zone_0":"mtpocfo-kvm-az01","ASN":"get_input:2017488_adiodvpe0_ASN","vmxvre_chassis_i2cid":"161","vmxvpfe_name_0":"vPFEXI","bandwidth":"get_input:adiodvpe0_bandwidth","availability_zone_max_count":"1","vmxvre_volume_size_0":"45.0","vmxvre_volume_size_1":"50.0","vmxvpfe_sriov42_0_port_broadcastallow":"true","vmxvre_oam_gateway":"10.0.0.10","vmxvre_volume_name_1":"vREXI_FAVolume","vmxvre_ore_present":"0","vmxvre_volume_name_0":"vREXI_FBVolume","vmxvre_type":"0","vnf_instance_name":"get_input:2017488_adiodvpe0_vnf_instance_name","vmxvpfe_sriov41_0_port_unknownmulticastallow":"true","oam_net_id":"b95eeb1d-d55d-4827-abb4-8ebb94941429","vmx_int_ctl_len":"24","vmxvpfe_sriov43_0_port_vlanstrip":"false","vmxvpfe_sriov41_0_port_broadcastallow":"true","vmxvre_volume_id_1":"6e86797e-03cd-4fdc-ba72-2957119c746d","vmxvpfe_sriov41_0_port_vlanfilter":"4001","nf_role":"Testing","vmxvre_volume_id_0":"f4eacb79-f687-4e9d-b760-21847c8bb15a","vmxvpfe_sriov42_0_port_unknownunicastallow":"true","vmxvpfe_flavor_name":"ns.c20r16d25.v5"},"type":"VF","modelCustomizationName":"2017-388_ADIOD-vPE 0","vfModules":{},"volumeGroups":{},"vfcInstanceGroups":{}},"2017-488_ADIOD-vPE 0":{"uuid":"69e09f68-8b63-4cc9-b9ff-860960b5db09","invariantUuid":"72e465fe-71b1-4e7b-b5ed-9496118ff7a8","description":"Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM","name":"2017-488_ADIOD-vPE","version":"5.0","customizationUuid":"1da7b585-5e61-4993-b95e-8e6606c81e45","inputs":{"vnf_config_template_version":{"type":"string","description":"VPE Software Version","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"17.2"},"bandwidth_units":{"type":"string","description":"Units of bandwidth","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"Gbps"},"bandwidth":{"type":"string","description":"Requested VPE bandwidth","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"10"},"AIC_CLLI":{"type":"string","description":"AIC Site CLLI","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"ATLMY8GA"},"ASN":{"type":"string","description":"AV/PE","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"AV_vPE"},"vnf_instance_name":{"type":"string","description":"The hostname assigned to the vpe.","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"mtnj309me6"}},"commands":{"vnf_config_template_version":{"displayName":"vnf_config_template_version","command":"get_input","inputName":"2017488_adiodvpe0_vnf_config_template_version"},"bandwidth_units":{"displayName":"bandwidth_units","command":"get_input","inputName":"adiodvpe0_bandwidth_units"},"bandwidth":{"displayName":"bandwidth","command":"get_input","inputName":"adiodvpe0_bandwidth"},"AIC_CLLI":{"displayName":"AIC_CLLI","command":"get_input","inputName":"2017488_adiodvpe0_AIC_CLLI"},"ASN":{"displayName":"ASN","command":"get_input","inputName":"2017488_adiodvpe0_ASN"},"vnf_instance_name":{"displayName":"vnf_instance_name","command":"get_input","inputName":"2017488_adiodvpe0_vnf_instance_name"}},"properties":{"vmxvre_retype":"RE-VMX","vnf_config_template_version":"get_input:2017488_adiodvpe0_vnf_config_template_version","sriov44_net_id":"48d399b3-11ee-48a8-94d2-f0ea94d6be8d","int_ctl_net_id":"2f323477-6936-4d01-ac53-d849430281d9","vmxvpfe_sriov41_0_port_mac":"00:11:22:EF:AC:DF","int_ctl_net_name":"VMX-INTXI","vmx_int_ctl_prefix":"10.0.0.10","sriov43_net_id":"da349ca1-6de9-4548-be88-2d88e99bfef5","sriov42_net_id":"760669ba-013d-4d9b-b0e7-4151fe2e6279","sriov41_net_id":"25ad52d5-c165-40f8-b3b0-ddfc2373280a","nf_type":"vPE","vmxvpfe_int_ctl_ip_1":"10.0.0.10","is_AVPN_service":"false","vmx_RSG_name":"vREXI-affinity","vmx_int_ctl_forwarding":"l2","vmxvre_oam_ip_0":"10.0.0.10","vmxvpfe_sriov44_0_port_mac":"00:11:22:EF:AC:DF","vmxvpfe_sriov41_0_port_vlanstrip":"false","vmxvpfe_sriov42_0_port_vlanfilter":"4001","vmxvpfe_sriov44_0_port_unknownunicastallow":"true","vmxvre_image_name_0":"VRE-ENGINE_17.2-S2.1.qcow2","vmxvre_instance":"0","vmxvpfe_sriov43_0_port_mac":"00:11:22:EF:AC:DF","vmxvre_flavor_name":"ns.c1r16d32.v5","vmxvpfe_volume_size_0":"40.0","vmxvpfe_sriov43_0_port_vlanfilter":"4001","nf_naming":"{ecomp_generated_naming=false}","nf_naming_code":"Navneet","vmxvre_name_0":"vREXI","vmxvpfe_sriov42_0_port_vlanstrip":"false","vmxvpfe_volume_name_0":"vPFEXI_FBVolume","max_instances":"3","vmx_RSG_id":"bd89a33c-13c3-4a04-8fde-1a57eb123141","vmxvpfe_image_name_0":"VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2","vmxvpfe_sriov43_0_port_unknownunicastallow":"true","vmxvpfe_sriov44_0_port_unknownmulticastallow":"true","vmxvre_console":"vidconsole","vmxvpfe_sriov44_0_port_vlanfilter":"4001","vmxvpfe_sriov42_0_port_mac":"00:11:22:EF:AC:DF","vmxvpfe_volume_id_0":"47cede15-da2f-4397-a101-aa683220aff3","vmxvpfe_sriov42_0_port_unknownmulticastallow":"true","min_instances":"1","vmxvpfe_sriov44_0_port_vlanstrip":"false","vf_module_id":"123","nf_function":"JAI","vmxvpfe_sriov43_0_port_unknownmulticastallow":"true","vmxvre_int_ctl_ip_0":"10.0.0.10","ecomp_generated_naming":"false","AIC_CLLI":"get_input:2017488_adiodvpe0_AIC_CLLI","vnf_name":"mtnj309me6vre","vmxvpfe_sriov41_0_port_unknownunicastallow":"true","vmxvre_volume_type_1":"HITACHI","vmxvpfe_sriov44_0_port_broadcastallow":"true","vmxvre_volume_type_0":"HITACHI","vmxvpfe_volume_type_0":"HITACHI","vmxvpfe_sriov43_0_port_broadcastallow":"true","bandwidth_units":"get_input:adiodvpe0_bandwidth_units","vnf_id":"123","vmxvre_oam_prefix":"24","availability_zone_0":"mtpocfo-kvm-az01","ASN":"get_input:2017488_adiodvpe0_ASN","vmxvre_chassis_i2cid":"161","vmxvpfe_name_0":"vPFEXI","bandwidth":"get_input:adiodvpe0_bandwidth","availability_zone_max_count":"1","vmxvre_volume_size_0":"45.0","vmxvre_volume_size_1":"50.0","vmxvpfe_sriov42_0_port_broadcastallow":"true","vmxvre_oam_gateway":"10.0.0.10","vmxvre_volume_name_1":"vREXI_FAVolume","vmxvre_ore_present":"0","vmxvre_volume_name_0":"vREXI_FBVolume","vmxvre_type":"0","vnf_instance_name":"get_input:2017488_adiodvpe0_vnf_instance_name","vmxvpfe_sriov41_0_port_unknownmulticastallow":"true","oam_net_id":"b95eeb1d-d55d-4827-abb4-8ebb94941429","vmx_int_ctl_len":"24","vmxvpfe_sriov43_0_port_vlanstrip":"false","vmxvpfe_sriov41_0_port_broadcastallow":"true","vmxvre_volume_id_1":"6e86797e-03cd-4fdc-ba72-2957119c746d","vmxvpfe_sriov41_0_port_vlanfilter":"4001","nf_role":"Testing","vmxvre_volume_id_0":"f4eacb79-f687-4e9d-b760-21847c8bb15a","vmxvpfe_sriov42_0_port_unknownunicastallow":"true","vmxvpfe_flavor_name":"ns.c20r16d25.v5"},"type":"VF","modelCustomizationName":"2017-488_ADIOD-vPE 0","vfModules":{"2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1":{"uuid":"25284168-24bb-4698-8cb4-3f509146eca5","invariantUuid":"7253ff5c-97f0-4b8b-937c-77aeb4d79aa1","customizationUuid":"f7e7c365-60cf-49a9-9ebf-a1aa11b9d401","description":null,"name":"2017488AdiodVpe..ADIOD_vRE_BV..module-1","version":"6","modelCustomizationName":"2017488AdiodVpe..ADIOD_vRE_BV..module-1","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"ADIOD_vRE_BV"},"inputs":{"adiodvpe0_bandwidth":{"type":"string","description":"Requested VPE bandwidth","entry_schema":null,"inputProperties":{"sourceType":"HEAT","vfModuleLabel":"ADIOD_vRE_BV","paramName":"bandwidth"},"constraints":null,"required":true,"default":"10"},"2017488_adiodvpe0_vnf_instance_name":{"type":"string","description":"The hostname assigned to the vpe.","entry_schema":null,"inputProperties":{"sourceType":"HEAT","vfModuleLabel":"ADIOD_vRE_BV","paramName":"vnf_instance_name"},"constraints":null,"required":true,"default":"mtnj309me6"},"2017488_adiodvpe0_vnf_config_template_version":{"type":"string","description":"VPE Software Version","entry_schema":null,"inputProperties":{"sourceType":"HEAT","vfModuleLabel":"ADIOD_vRE_BV","paramName":"vnf_config_template_version"},"constraints":null,"required":true,"default":"17.2"},"2017488_adiodvpe0_AIC_CLLI":{"type":"string","description":"AIC Site CLLI","entry_schema":null,"inputProperties":{"sourceType":"HEAT","vfModuleLabel":"ADIOD_vRE_BV","paramName":"AIC_CLLI"},"constraints":null,"required":true,"default":"ATLMY8GA"},"adiodvpe0_bandwidth_units":{"type":"string","description":"Units of bandwidth","entry_schema":null,"inputProperties":{"sourceType":"HEAT","vfModuleLabel":"ADIOD_vRE_BV","paramName":"bandwidth_units"},"constraints":null,"required":true,"default":"Gbps"}},"volumeGroupAllowed":true},"2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0":{"uuid":"f8360508-3f17-4414-a2ed-6bc71161e8db","invariantUuid":"b34833bb-6aa9-4ad6-a831-70b06367a091","customizationUuid":"a55961b2-2065-4ab0-a5b7-2fcee1c227e3","description":null,"name":"2017488AdiodVpe..ADIOD_base_vPE_BV..module-0","version":"5","modelCustomizationName":"2017488AdiodVpe..ADIOD_base_vPE_BV..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"ADIOD_base_vPE_BV"},"inputs":{},"volumeGroupAllowed":false},"2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2":{"uuid":"0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a","invariantUuid":"eff8cc59-53a1-4101-aed7-8cf24ecf8339","customizationUuid":"3cd946bb-50e0-40d8-96d3-c9023520b557","description":null,"name":"2017488AdiodVpe..ADIOD_vPFE_BV..module-2","version":"6","modelCustomizationName":"2017488AdiodVpe..ADIOD_vPFE_BV..module-2","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"ADIOD_vPFE_BV"},"inputs":{},"volumeGroupAllowed":true}},"volumeGroups":{"2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1":{"uuid":"25284168-24bb-4698-8cb4-3f509146eca5","invariantUuid":"7253ff5c-97f0-4b8b-937c-77aeb4d79aa1","customizationUuid":"f7e7c365-60cf-49a9-9ebf-a1aa11b9d401","description":null,"name":"2017488AdiodVpe..ADIOD_vRE_BV..module-1","version":"6","modelCustomizationName":"2017488AdiodVpe..ADIOD_vRE_BV..module-1","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"ADIOD_vRE_BV"},"inputs":{"adiodvpe0_bandwidth":{"type":"string","description":"Requested VPE bandwidth","entry_schema":null,"inputProperties":{"sourceType":"HEAT","vfModuleLabel":"ADIOD_vRE_BV","paramName":"bandwidth"},"constraints":null,"required":true,"default":"10"},"2017488_adiodvpe0_vnf_instance_name":{"type":"string","description":"The hostname assigned to the vpe.","entry_schema":null,"inputProperties":{"sourceType":"HEAT","vfModuleLabel":"ADIOD_vRE_BV","paramName":"vnf_instance_name"},"constraints":null,"required":true,"default":"mtnj309me6"},"2017488_adiodvpe0_vnf_config_template_version":{"type":"string","description":"VPE Software Version","entry_schema":null,"inputProperties":{"sourceType":"HEAT","vfModuleLabel":"ADIOD_vRE_BV","paramName":"vnf_config_template_version"},"constraints":null,"required":true,"default":"17.2"},"2017488_adiodvpe0_AIC_CLLI":{"type":"string","description":"AIC Site CLLI","entry_schema":null,"inputProperties":{"sourceType":"HEAT","vfModuleLabel":"ADIOD_vRE_BV","paramName":"AIC_CLLI"},"constraints":null,"required":true,"default":"ATLMY8GA"},"adiodvpe0_bandwidth_units":{"type":"string","description":"Units of bandwidth","entry_schema":null,"inputProperties":{"sourceType":"HEAT","vfModuleLabel":"ADIOD_vRE_BV","paramName":"bandwidth_units"},"constraints":null,"required":true,"default":"Gbps"}}},"2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2":{"uuid":"0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a","invariantUuid":"eff8cc59-53a1-4101-aed7-8cf24ecf8339","customizationUuid":"3cd946bb-50e0-40d8-96d3-c9023520b557","description":null,"name":"2017488AdiodVpe..ADIOD_vPFE_BV..module-2","version":"6","modelCustomizationName":"2017488AdiodVpe..ADIOD_vPFE_BV..module-2","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"ADIOD_vPFE_BV"},"inputs":{}}},"vfcInstanceGroups":{}}},"networks":{"ExtVL 0":{"uuid":"ddc3f20c-08b5-40fd-af72-c6d14636b986","invariantUuid":"379f816b-a7aa-422f-be30-17114ff50b7c","description":"ECOMP generic virtual link (network) base type for all other service-level and global networks","name":"ExtVL","version":"37.0","customizationUuid":"94fdd893-4a36-4d70-b16a-ec29c54c184f","inputs":{"vnf_config_template_version":{"type":"string","description":"VPE Software Version","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"17.2"},"bandwidth_units":{"type":"string","description":"Units of bandwidth","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"Gbps"},"bandwidth":{"type":"string","description":"Requested VPE bandwidth","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"10"},"AIC_CLLI":{"type":"string","description":"AIC Site CLLI","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"ATLMY8GA"},"ASN":{"type":"string","description":"AV/PE","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"AV_vPE"},"vnf_instance_name":{"type":"string","description":"The hostname assigned to the vpe.","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"mtnj309me6"}},"commands":{},"properties":{"min_instances":1,"max_instances":10,"network_assignments":"{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}","exVL_naming":"{ecomp_generated_naming=true}","network_flows":"{is_network_policy=false, is_bound_to_vpn=false}","network_homing":"{ecomp_selected_instance_node_target=false}"},"type":"VL","modelCustomizationName":"ExtVL 0"}},"collectionResource":{},"configurations":{},"fabricConfigurations":{},"serviceProxies":{},"vfModules":{"2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1":{"uuid":"25284168-24bb-4698-8cb4-3f509146eca5","invariantUuid":"7253ff5c-97f0-4b8b-937c-77aeb4d79aa1","customizationUuid":"f7e7c365-60cf-49a9-9ebf-a1aa11b9d401","description":null,"name":"2017488AdiodVpe..ADIOD_vRE_BV..module-1","version":"6","modelCustomizationName":"2017488AdiodVpe..ADIOD_vRE_BV..module-1","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"ADIOD_vRE_BV"},"inputs":{"adiodvpe0_bandwidth":{"type":"string","description":"Requested VPE bandwidth","entry_schema":null,"inputProperties":{"sourceType":"HEAT","vfModuleLabel":"ADIOD_vRE_BV","paramName":"bandwidth"},"constraints":null,"required":true,"default":"10"},"2017488_adiodvpe0_vnf_instance_name":{"type":"string","description":"The hostname assigned to the vpe.","entry_schema":null,"inputProperties":{"sourceType":"HEAT","vfModuleLabel":"ADIOD_vRE_BV","paramName":"vnf_instance_name"},"constraints":null,"required":true,"default":"mtnj309me6"},"2017488_adiodvpe0_vnf_config_template_version":{"type":"string","description":"VPE Software Version","entry_schema":null,"inputProperties":{"sourceType":"HEAT","vfModuleLabel":"ADIOD_vRE_BV","paramName":"vnf_config_template_version"},"constraints":null,"required":true,"default":"17.2"},"2017488_adiodvpe0_AIC_CLLI":{"type":"string","description":"AIC Site CLLI","entry_schema":null,"inputProperties":{"sourceType":"HEAT","vfModuleLabel":"ADIOD_vRE_BV","paramName":"AIC_CLLI"},"constraints":null,"required":true,"default":"ATLMY8GA"},"adiodvpe0_bandwidth_units":{"type":"string","description":"Units of bandwidth","entry_schema":null,"inputProperties":{"sourceType":"HEAT","vfModuleLabel":"ADIOD_vRE_BV","paramName":"bandwidth_units"},"constraints":null,"required":true,"default":"Gbps"}},"volumeGroupAllowed":true},"2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0":{"uuid":"f8360508-3f17-4414-a2ed-6bc71161e8db","invariantUuid":"b34833bb-6aa9-4ad6-a831-70b06367a091","customizationUuid":"a55961b2-2065-4ab0-a5b7-2fcee1c227e3","description":null,"name":"2017488AdiodVpe..ADIOD_base_vPE_BV..module-0","version":"5","modelCustomizationName":"2017488AdiodVpe..ADIOD_base_vPE_BV..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"ADIOD_base_vPE_BV"},"inputs":{},"volumeGroupAllowed":false},"2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2":{"uuid":"0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a","invariantUuid":"eff8cc59-53a1-4101-aed7-8cf24ecf8339","customizationUuid":"3cd946bb-50e0-40d8-96d3-c9023520b557","description":null,"name":"2017488AdiodVpe..ADIOD_vPFE_BV..module-2","version":"6","modelCustomizationName":"2017488AdiodVpe..ADIOD_vPFE_BV..module-2","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"ADIOD_vPFE_BV"},"inputs":{},"volumeGroupAllowed":true}},"volumeGroups":{"2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1":{"uuid":"25284168-24bb-4698-8cb4-3f509146eca5","invariantUuid":"7253ff5c-97f0-4b8b-937c-77aeb4d79aa1","customizationUuid":"f7e7c365-60cf-49a9-9ebf-a1aa11b9d401","description":null,"name":"2017488AdiodVpe..ADIOD_vRE_BV..module-1","version":"6","modelCustomizationName":"2017488AdiodVpe..ADIOD_vRE_BV..module-1","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"ADIOD_vRE_BV"},"inputs":{"adiodvpe0_bandwidth":{"type":"string","description":"Requested VPE bandwidth","entry_schema":null,"inputProperties":{"sourceType":"HEAT","vfModuleLabel":"ADIOD_vRE_BV","paramName":"bandwidth"},"constraints":null,"required":true,"default":"10"},"2017488_adiodvpe0_vnf_instance_name":{"type":"string","description":"The hostname assigned to the vpe.","entry_schema":null,"inputProperties":{"sourceType":"HEAT","vfModuleLabel":"ADIOD_vRE_BV","paramName":"vnf_instance_name"},"constraints":null,"required":true,"default":"mtnj309me6"},"2017488_adiodvpe0_vnf_config_template_version":{"type":"string","description":"VPE Software Version","entry_schema":null,"inputProperties":{"sourceType":"HEAT","vfModuleLabel":"ADIOD_vRE_BV","paramName":"vnf_config_template_version"},"constraints":null,"required":true,"default":"17.2"},"2017488_adiodvpe0_AIC_CLLI":{"type":"string","description":"AIC Site CLLI","entry_schema":null,"inputProperties":{"sourceType":"HEAT","vfModuleLabel":"ADIOD_vRE_BV","paramName":"AIC_CLLI"},"constraints":null,"required":true,"default":"ATLMY8GA"},"adiodvpe0_bandwidth_units":{"type":"string","description":"Units of bandwidth","entry_schema":null,"inputProperties":{"sourceType":"HEAT","vfModuleLabel":"ADIOD_vRE_BV","paramName":"bandwidth_units"},"constraints":null,"required":true,"default":"Gbps"}}},"2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2":{"uuid":"0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a","invariantUuid":"eff8cc59-53a1-4101-aed7-8cf24ecf8339","customizationUuid":"3cd946bb-50e0-40d8-96d3-c9023520b557","description":null,"name":"2017488AdiodVpe..ADIOD_vPFE_BV..module-2","version":"6","modelCustomizationName":"2017488AdiodVpe..ADIOD_vPFE_BV..module-2","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"ADIOD_vPFE_BV"},"inputs":{}}},"pnfs":{}}},"serviceInstance":{"6e59c5de-f052-46fa-aa7e-2fca9d674c44":{"vnfs":{"VF_vMee 0":{"rollbackOnFailure":"true","vfModules":{"vf_vmee0..VfVmee..base_vmme..module-0":{"vf_vmee0..VfVmee..base_vmme..module-0vmvzo":{"isMissingData":false,"sdncPreReload":null,"modelInfo":{"modelType":"VFmodule","modelInvariantId":"a6f9e51a-2b35-416a-ae15-15e58d61f36d","modelVersionId":"a27f5cfc-7f12-4f99-af08-0af9c3885c87","modelName":"VfVmee..base_vmme..module-0","modelVersion":"2","modelCustomizationId":"f8c040f1-7e51-4a11-aca8-acf256cfd861","modelCustomizationName":"VfVmee..base_vmme..module-0"},"instanceParams":[{}],"trackById":"wmtm6sy2uj"}}},"isMissingData":true,"originalName":"VF_vMee 0","vnfStoreKey":"VF_vMee 0","trackById":"p3wk448m5do","uuid":"d6557200-ecf2-4641-8094-5393ae3aae60","productFamilyId":"36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e","lcpCloudRegionId":null,"tenantId":null,"lineOfBusiness":null,"platformName":null,"modelInfo":{"modelType":"VF","modelInvariantId":"4160458e-f648-4b30-a176-43881ffffe9e","modelVersionId":"6e59c5de-f052-46fa-aa7e-2fca9d674c44","modelName":"VF_vMee","modelVersion":"2.0","modelCustomizationName":"VF_vMee 0"}}},"networks":{},"instanceParams":[{}],"validationCounter":1,"existingNames":{},"existingVNFCounterMap":{"d6557200-ecf2-4641-8094-5393ae3aae60":1},"globalSubscriberId":"e433710f-9217-458d-a79d-1c7aff376d89","subscriptionServiceType":"TYLER SILVIA","owningEntityId":"d61e6f2d-12fa-4cc2-91df-7c244011d6fc","productFamilyId":"36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e","lcpCloudRegionId":"hvf6","tenantId":"229bcdc6eaeb4ca59d55221141d01f8e","aicZoneId":"JAG1","projectName":"x1","rollbackOnFailure":"true","bulkSize":1,"modelInfo":{"modelInvariantId":"e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0","modelVersionId":"6e59c5de-f052-46fa-aa7e-2fca9d674c44","modelName":"ComplexService","modelVersion":"1.0","uuid":"6e59c5de-f052-46fa-aa7e-2fca9d674c44"},"isALaCarte":false,"name":"ComplexService","version":"1.0","description":"ComplexService","category":"Emanuel","uuid":"6e59c5de-f052-46fa-aa7e-2fca9d674c44","invariantUuid":"e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0","serviceType":"","serviceRole":"","isEcompGeneratedNaming":true,"isMultiStepDesign":false},"6b528779-44a3-4472-bdff-9cd15ec93450":{"networks":{"ExtVL 0":{"rollbackOnFailure":"true","isMissingData":false,"originalName":"ExtVL 0","networkStoreKey":"ExtVL 0","trackById":"sf3zth68xjf","productFamilyId":"ebc3bc3d-62fd-4a3f-a037-f619df4ff034","lcpCloudRegionId":"hvf6","tenantId":"229bcdc6eaeb4ca59d55221141d01f8e","platformName":"xxx1","lineOfBusiness":"ONAP","instanceParams":[{}],"modelInfo":{"modelInvariantId":"379f816b-a7aa-422f-be30-17114ff50b7c","modelVersionId":"ddc3f20c-08b5-40fd-af72-c6d14636b986","modelName":"ExtVL","modelVersion":"37.0","modelCustomizationId":"94fdd893-4a36-4d70-b16a-ec29c54c184f","modelCustomizationName":"ExtVL 0","uuid":"ddc3f20c-08b5-40fd-af72-c6d14636b986"},"uuid":"ddc3f20c-08b5-40fd-af72-c6d14636b986"},"ExtVL 0:0001":{"rollbackOnFailure":"true","isMissingData":false,"originalName":"ExtVL 0","networkStoreKey":"ExtVL 0","trackById":"2mdxioxca9h","productFamilyId":"ebc3bc3d-62fd-4a3f-a037-f619df4ff034","lcpCloudRegionId":"hvf6","tenantId":"229bcdc6eaeb4ca59d55221141d01f8e","platformName":"xxx1","lineOfBusiness":"ONAP","instanceParams":[{}],"modelInfo":{"modelInvariantId":"379f816b-a7aa-422f-be30-17114ff50b7c","modelVersionId":"ddc3f20c-08b5-40fd-af72-c6d14636b986","modelName":"ExtVL","modelVersion":"37.0","modelCustomizationId":"94fdd893-4a36-4d70-b16a-ec29c54c184f","modelCustomizationName":"ExtVL 0","uuid":"ddc3f20c-08b5-40fd-af72-c6d14636b986"},"uuid":"ddc3f20c-08b5-40fd-af72-c6d14636b986"},"ExtVL 0_1":{"rollbackOnFailure":"true","isMissingData":false,"originalName":"ExtVL 0","networkStoreKey":"ExtVL 0_1","trackById":"z7vd1gmpbs","instanceName":"ExtVL","productFamilyId":"17cc1042-527b-11e6-beb8-9e71128cae77","lcpCloudRegionId":"hvf6","tenantId":"229bcdc6eaeb4ca59d55221141d01f8e","platformName":"xxx1","lineOfBusiness":"zzz1","instanceParams":[{"vnf_config_template_version":"17.2","bandwidth_units":"Gbps","bandwidth":"10","AIC_CLLI":"ATLMY8GA","ASN":"AV_vPE","vnf_instance_name":"yoav"}],"modelInfo":{"modelInvariantId":"379f816b-a7aa-422f-be30-17114ff50b7c","modelVersionId":"ddc3f20c-08b5-40fd-af72-c6d14636b986","modelName":"ExtVL","modelVersion":"37.0","modelCustomizationId":"94fdd893-4a36-4d70-b16a-ec29c54c184f","modelCustomizationName":"ExtVL 0","uuid":"ddc3f20c-08b5-40fd-af72-c6d14636b986"},"uuid":"ddc3f20c-08b5-40fd-af72-c6d14636b986"}},"vnfs":{"2017-488_ADIOD-vPE 0":{"rollbackOnFailure":"true","vfModules":{"2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1":{"2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1sgoqi":{"instanceName":"yoav","volumeGroupName":"123","modelInfo":{"modelInvariantId":"7253ff5c-97f0-4b8b-937c-77aeb4d79aa1","modelVersionId":"25284168-24bb-4698-8cb4-3f509146eca5","modelName":"2017488AdiodVpe..ADIOD_vRE_BV..module-1","modelVersion":"6","modelCustomizationId":"f7e7c365-60cf-49a9-9ebf-a1aa11b9d401","modelCustomizationName":"2017488AdiodVpe..ADIOD_vRE_BV..module-1","uuid":"25284168-24bb-4698-8cb4-3f509146eca5"},"uuid":"25284168-24bb-4698-8cb4-3f509146eca5","isMissingData":false,"instanceParams":[{"adiodvpe0_bandwidth":"10","2017488_adiodvpe0_vnf_instance_name":"mtnj309me6","2017488_adiodvpe0_vnf_config_template_version":"17.2","2017488_adiodvpe0_AIC_CLLI":"ATLMY8GA","adiodvpe0_bandwidth_units":"Gbps"}]}}},"isMissingData":false,"originalName":"2017-488_ADIOD-vPE 0","vnfStoreKey":"2017-488_ADIOD-vPE 0","trackById":"o65b26t2thj","instanceName":"2017488_ADIODvPE","productFamilyId":"ebc3bc3d-62fd-4a3f-a037-f619df4ff034","lcpCloudRegionId":"hvf6","tenantId":"bae71557c5bb4d5aac6743a4e5f1d054","platformName":"platform","lineOfBusiness":"ONAP","instanceParams":[{}],"modelInfo":{"modelInvariantId":"72e465fe-71b1-4e7b-b5ed-9496118ff7a8","modelVersionId":"69e09f68-8b63-4cc9-b9ff-860960b5db09","modelName":"2017-488_ADIOD-vPE","modelVersion":"5.0","modelCustomizationId":"1da7b585-5e61-4993-b95e-8e6606c81e45","modelCustomizationName":"2017-488_ADIOD-vPE 0","uuid":"69e09f68-8b63-4cc9-b9ff-860960b5db09"},"uuid":"69e09f68-8b63-4cc9-b9ff-860960b5db09"}},"instanceParams":[{"2017488_adiodvpe0_ASN":"AV_vPE"}],"validationCounter":0,"existingNames":{"123":"","instancename":"","yoav":"","extvl":""},"existingVNFCounterMap":{"69e09f68-8b63-4cc9-b9ff-860960b5db09":1},"existingNetworksCounterMap":{"ddc3f20c-08b5-40fd-af72-c6d14636b986":3},"instanceName":"InstanceName","globalSubscriberId":"e433710f-9217-458d-a79d-1c7aff376d89","subscriptionServiceType":"TYLER SILVIA","owningEntityId":"d61e6f2d-12fa-4cc2-91df-7c244011d6fc","productFamilyId":"17cc1042-527b-11e6-beb8-9e71128cae77","lcpCloudRegionId":"JANET25","tenantId":"092eb9e8e4b7412e8787dd091bc58e86","aicZoneId":"JAG1","projectName":null,"rollbackOnFailure":"true","aicZoneName":"YUDFJULP-JAG1","owningEntityName":"WayneHolland","testApi":"GR_API","isEcompGeneratedNaming":false,"tenantName":"USP-SIP-IC-24335-T-01","bulkSize":1,"modelInfo":{"modelInvariantId":"e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0","modelVersionId":"6b528779-44a3-4472-bdff-9cd15ec93450","modelName":"action-data","modelVersion":"1.0","uuid":"6b528779-44a3-4472-bdff-9cd15ec93450"},"isALaCarte":false,"name":"action-data","version":"1.0","description":"","category":"","uuid":"6b528779-44a3-4472-bdff-9cd15ec93450","invariantUuid":"e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0","serviceType":"","serviceRole":"","isMultiStepDesign":false}},"lcpRegionsAndTenants":{"lcpRegionList":[{"id":"JANET25","name":"JANET25","isPermitted":true},{"id":"hvf6","name":"hvf6","isPermitted":true}],"lcpRegionsTenantsMap":{"JANET25":[{"id":"092eb9e8e4b7412e8787dd091bc58e86","name":"USP-SIP-IC-24335-T-01","isPermitted":true}],"hvf6":[{"id":"bae71557c5bb4d5aac6743a4e5f1d054","name":"AIN Web Tool-15-D-testalexandria","isPermitted":true},{"id":"229bcdc6eaeb4ca59d55221141d01f8e","name":"AIN Web Tool-15-D-STTest2","isPermitted":true},{"id":"1178612d2b394be4834ad77f567c0af2","name":"AIN Web Tool-15-D-SSPtestcustome","isPermitted":true},{"id":"19c5ade915eb461e8af52fb2fd8cd1f2","name":"AIN Web Tool-15-D-UncheckedEcopm","isPermitted":true},{"id":"de007636e25249238447264a988a927b","name":"AIN Web Tool-15-D-dfsdf","isPermitted":true},{"id":"62f29b3613634ca6a3065cbe0e020c44","name":"AIN/SMS-16-D-Multiservices1","isPermitted":true},{"id":"649289e30d3244e0b48098114d63c2aa","name":"AIN Web Tool-15-D-SSPST66","isPermitted":true},{"id":"3f21eeea6c2c486bba31dab816c05a32","name":"AIN Web Tool-15-D-ASSPST47","isPermitted":true},{"id":"f60ce21d3ee6427586cff0d22b03b773","name":"CESAR-100-D-sspjg67246","isPermitted":true},{"id":"8774659e425f479895ae091bb5d46560","name":"CESAR-100-D-sspjg68359","isPermitted":true},{"id":"624eb554b0d147c19ff8885341760481","name":"AINWebTool-15-D-iftach","isPermitted":true},{"id":"214f55f5fc414c678059c383b03e4962","name":"CESAR-100-D-sspjg612401","isPermitted":true},{"id":"c90666c291664841bb98e4d981ff1db5","name":"CESAR-100-D-sspjg621340","isPermitted":true},{"id":"ce5b6bc5c7b348e1bf4b91ac9a174278","name":"sspjg621351cloned","isPermitted":true},{"id":"b386b768a3f24c8e953abbe0b3488c02","name":"AINWebTool-15-D-eteancomp","isPermitted":true},{"id":"dc6c4dbfd225474e9deaadd34968646c","name":"AINWebTool-15-T-SPFET","isPermitted":true},{"id":"02cb5030e9914aa4be120bd9ed1e19eb","name":"AINWebTool-15-X-eeweww","isPermitted":true},{"id":"f2f3830e4c984d45bcd00e1a04158a79","name":"CESAR-100-D-spjg61909","isPermitted":true},{"id":"05b91bd5137f4929878edd965755c06d","name":"CESAR-100-D-sspjg621512cloned","isPermitted":true},{"id":"7002fbe8482d4a989ddf445b1ce336e0","name":"AINWebTool-15-X-vdr","isPermitted":true},{"id":"4008522be43741dcb1f5422022a2aa0b","name":"AINWebTool-15-D-ssasa","isPermitted":true},{"id":"f44e2e96a1b6476abfda2fa407b00169","name":"AINWebTool-15-D-PFNPT","isPermitted":true},{"id":"b69a52bec8a84669a37a1e8b72708be7","name":"AINWebTool-15-X-vdre","isPermitted":true},{"id":"fac7d9fd56154caeb9332202dcf2969f","name":"AINWebTool-15-X-NONPODECOMP","isPermitted":true},{"id":"2d34d8396e194eb49969fd61ffbff961","name":"DN5242-Nov16-T5","isPermitted":true},{"id":"cb42a77ff45b48a8b8deb83bb64acc74","name":"ro-T11","isPermitted":true},{"id":"fa45ca53c80b492fa8be5477cd84fc2b","name":"ro-T112","isPermitted":true},{"id":"4914ab0ab3a743e58f0eefdacc1dde77","name":"DN5242-Nov21-T1","isPermitted":true},{"id":"d0a3e3f2964542259d155a81c41aadc3","name":"test-hvf6-09","isPermitted":true},{"id":"cbb99fe4ada84631b7baf046b6fd2044","name":"DN5242-Nov16-T3","isPermitted":true}]}},"productFamilies":[{"id":"ebc3bc3d-62fd-4a3f-a037-f619df4ff034","name":"SCOTTIE","isPermitted":true},{"id":"17cc1042-527b-11e6-beb8-9e71128cae77","name":"IGNACIO","isPermitted":true},{"id":"36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e","name":"Christie","isPermitted":true},{"id":"a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7","name":"Enhanced Services","isPermitted":true},{"id":"vTerrance","name":"vTerrance","isPermitted":true},{"id":"323d69d9-2efe-4r45-ay0a-89ea7ard4e6f","name":"vSCP","isPermitted":true},{"id":"a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb","name":"Emanuel","isPermitted":true},{"id":"d8a6ed93-251c-47ca-adc9-86671fd19f4c","name":"BVOIP","isPermitted":true},{"id":"db171b8f-115c-4992-a2e3-ee04cae357e0","name":"LINDSEY","isPermitted":true},{"id":"LRSI-OSPF","name":"LRSI-OSPF","isPermitted":true},{"id":"vRosemarie","name":"HNGATEWAY","isPermitted":true},{"id":"vHNPaas","name":"WILKINS","isPermitted":true},{"id":"e433710f-9217-458d-a79d-1c7aff376d89","name":"TYLER SILVIA","isPermitted":true},{"id":"b6a3f28c-eebf-494c-a900-055cc7c874ce","name":"VROUTER","isPermitted":true},{"id":"Cisneros","name":"vMuriel","isPermitted":true},{"id":"0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1","name":"CARA Griffin","isPermitted":true},{"id":"c7611ebe-c324-48f1-8085-94aef0c6ef3d","name":"DARREN MCGEE","isPermitted":true},{"id":"e30755dc-5673-4b6b-9dcf-9abdd96b93d1","name":"Transport","isPermitted":true},{"id":"vSalvatore","name":"vSalvatore","isPermitted":true},{"id":"d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4","name":"Josefina","isPermitted":true},{"id":"vHubbard","name":"vHubbard","isPermitted":true},{"id":"12a96a9d-4b4c-4349-a950-fe1159602621","name":"DARREN MCGEE","isPermitted":true}],"serviceTypes":{"e433710f-9217-458d-a79d-1c7aff376d89":[{"id":"0","name":"vRichardson","isPermitted":false},{"id":"1","name":"TYLER SILVIA","isPermitted":true},{"id":"2","name":"Emanuel","isPermitted":false},{"id":"3","name":"vJamie","isPermitted":false},{"id":"4","name":"vVoiceMail","isPermitted":false},{"id":"5","name":"Kennedy","isPermitted":false},{"id":"6","name":"vSEGW","isPermitted":false},{"id":"7","name":"vVM","isPermitted":false},{"id":"8","name":"vOTA","isPermitted":false},{"id":"9","name":"vMME","isPermitted":false},{"id":"10","name":"vMNS","isPermitted":false},{"id":"11","name":"vSCP","isPermitted":false},{"id":"12","name":"VPMS","isPermitted":false},{"id":"13","name":"vMMSC","isPermitted":false},{"id":"14","name":"SSD","isPermitted":false},{"id":"15","name":"vMOG","isPermitted":false},{"id":"16","name":"LINDSEY","isPermitted":false},{"id":"17","name":"JOHANNA_SANTOS","isPermitted":false},{"id":"18","name":"vCarroll","isPermitted":false}]},"aicZones":[{"id":"NFT1","name":"NFTJSSSS-NFT1"},{"id":"JAG1","name":"YUDFJULP-JAG1"},{"id":"YYY1","name":"UUUAIAAI-YYY1"},{"id":"BAN1","name":"VSDKYUTP-BAN1"},{"id":"DKJ1","name":"DKJSJDKA-DKJ1"},{"id":"MCS1","name":"ASACMAMS-MCS1"},{"id":"UIO1","name":"uioclli1-UIO1"},{"id":"RAJ1","name":"YGBIJNLQ-RAJ1"},{"id":"OPA1","name":"opaclli1-OPA1"},{"id":"SDE1","name":"ZXCVBNMA-SDE1"},{"id":"VEN2","name":"FGHJUHIL-VEN2"},{"id":"ORL1","name":"ORLDFLMA-ORL1"},{"id":"JAD1","name":"JADECLLI-JAD1"},{"id":"ZXL1","name":"LWLWCANN-ZXL1"},{"id":"CKL1","name":"CLKSKCKK-CKL1"},{"id":"SDF1","name":"sdfclli1-SDF1"},{"id":"RAD1","name":"RADICAL1-RAD1"},{"id":"KIT1","name":"BHYJFGLN-KIT1"},{"id":"REL1","name":"INGERFGT-REL1"},{"id":"JNL1","name":"CJALSDAC-JNL1"},{"id":"OLK1","name":"OLKOLKLS-OLK1"},{"id":"CHI1","name":"CHILLIWE-CHI1"},{"id":"UUU4","name":"UUUAAAUU-UUU4"},{"id":"TUF1","name":"TUFCLLI1-TUF1"},{"id":"KJN1","name":"CKALDKSA-KJN1"},{"id":"SAM1","name":"SNDGCA64-SAN1"},{"id":"SCK1","name":"SCKSCKSK-SCK1"},{"id":"HJH1","name":"AOEEQQQD-HJH1"},{"id":"HGD1","name":"SDFQWHGD-HGD1"},{"id":"KOR1","name":"HYFLNBVT-KOR1"},{"id":"ATL43","name":"AICLOCID-ATL43"},{"id":"ATL54","name":"AICFTAAI-ATL54"},{"id":"ATL66","name":"CLLIAAII-ATL66"},{"id":"VEL1","name":"BNMLKUIK-VEL1"},{"id":"ICC1","name":"SANJITAT-ICC1"},{"id":"MNT11","name":"WSXEFBTH-MNT11"},{"id":"DEF2","name":"WSBHGTYL-DEF2"},{"id":"MAD11","name":"SDFQWGKL-MAD11"},{"id":"OLG1","name":"OLHOLHOL-OLG1"},{"id":"GAR1","name":"NGFVSJKO-GAR1"},{"id":"SAN22","name":"GNVLSCTL-SAN22"},{"id":"HRG1","name":"HRGHRGGS-HRG1"},{"id":"JCS1","name":"JCSJSCJS-JCS1"},{"id":"DHA12","name":"WSXEDECF-DHA12"},{"id":"HJE1","name":"AOEEWWWD-HJE1"},{"id":"NCA1","name":"NCANCANN-NCA1"},{"id":"IOP1","name":"iopclli1-IOP1"},{"id":"RTY1","name":"rtyclli1-RTY1"},{"id":"KAP1","name":"HIOUYTRQ-KAP1"},{"id":"ZEN1","name":"ZENCLLI1-ZEN1"},{"id":"HKA1","name":"JAKHLASS-HKA1"},{"id":"CQK1","name":"CQKSCAKK-CQK1"},{"id":"SAI1","name":"UBEKQLPD-SAI1"},{"id":"ERT1","name":"ertclli1-ERT1"},{"id":"IBB1","name":"PLMKOIJU-IBB1"},{"id":"TIR2","name":"PLKINHYI-TIR2"},{"id":"HSD1","name":"CHASKCDS-HSD1"},{"id":"SLF78","name":"SDCTLFN1-SLF78"},{"id":"SEE78","name":"SDCTEEE4-SEE78"},{"id":"SAN13","name":"TOKYJPFA-SAN13"},{"id":"SAA78","name":"SDCTAAA1-SAA78"},{"id":"LUC1","name":"ATLDFGYC-LUC1"},{"id":"AMD13","name":"MEMATLAN-AMD13"},{"id":"TOR1","name":"TOROONXN-TOR1"},{"id":"QWE1","name":"QWECLLI1-QWE1"},{"id":"ZOG1","name":"ZOGASTRO-ZOG1"},{"id":"CAL33","name":"CALIFORN-CAL33"},{"id":"SHH78","name":"SDIT1HHH-SHH78"},{"id":"DSA1","name":"LKJHGFDS-DSA1"},{"id":"CLG1","name":"CLGRABAD-CLG1"},{"id":"BNA1","name":"BNARAGBK-BNA1"},{"id":"ATL84","name":"CANTTCOC-ATL84"},{"id":"APP1","name":"WBHGTYUI-APP1"},{"id":"RJN1","name":"RJNRBZAW-RJN1"},{"id":"EHH78","name":"SDCSHHH5-EHH78"},{"id":"mac10","name":"PKGTESTF-mac10"},{"id":"SXB78","name":"SDCTGXB1-SXB78"},{"id":"SAX78","name":"SDCTAXG1-SAX78"},{"id":"SYD1","name":"SYDNAUBV-SYD1"},{"id":"TOK1","name":"TOKYJPFA-TOK1"},{"id":"KGM2","name":"KGMTNC20-KGM2"},{"id":"DCC1b","name":"POIUYTGH-DCC1b"},{"id":"SKK78","name":"SDCTKKK1-SKK78"},{"id":"SGG78","name":"SDCTGGG1-SGG78"},{"id":"SJJ78","name":"SDCTJJJ1-SJJ78"},{"id":"SBX78","name":"SDCTBXG1-SBX78"},{"id":"LAG1","name":"LARGIZON-LAG1"},{"id":"IAA1","name":"QAZXSWED-IAA1"},{"id":"POI1","name":"PLMNJKIU-POI1"},{"id":"LAG1a","name":"LARGIZON-LAG1a"},{"id":"PBL1","name":"PBLAPBAI-PBL1"},{"id":"LAG45","name":"LARGIZON-LAG1a"},{"id":"MAR1","name":"MNBVCXZM-MAR1"},{"id":"HST70","name":"HSTNTX70-HST70"},{"id":"DCC1a","name":"POIUYTGH-DCC1a"},{"id":"TOL1","name":"TOLDOH21-TOL1"},{"id":"LON1","name":"LONEENCO-LON1"},{"id":"SJU78","name":"SDIT1JUB-SJU78"},{"id":"STN27","name":"HSTNTX01-STN27"},{"id":"SSW56","name":"ss8126GT-SSW56"},{"id":"SBB78","name":"SDIT1BBB-SBB78"},{"id":"DCC3","name":"POIUYTGH-DCC3"},{"id":"GNV1","name":"GNVLSCTL-GNV1"},{"id":"WAS1","name":"WASHDCSW-WAS1"},{"id":"TOY1","name":"TORYONNZ-TOY1"},{"id":"STT1","name":"STTLWA02-STT1"},{"id":"STG1","name":"STTGGE62-STG1"},{"id":"SLL78","name":"SDCTLLL1-SLL78"},{"id":"SBU78","name":"SDIT1BUB-SBU78"},{"id":"ATL2","name":"ATLNGANW-ATL2"},{"id":"BOT1","name":"BOTHWAKY-BOT1"},{"id":"SNG1","name":"SNGPSIAU-SNG1"},{"id":"NYC1","name":"NYCMNY54-NYC1"},{"id":"LAG1b","name":"LARGIZON-LAG1b"},{"id":"AMD15","name":"AMDFAA01-AMD15"},{"id":"SNA1","name":"SNANTXCA-SNA1"},{"id":"PLT1","name":"PLTNCA60-PLT1"},{"id":"TLP1","name":"TLPNXM18-TLP1"},{"id":"SDD81","name":"SAIT1DD6-SDD81"},{"id":"DCC1","name":"POIUYTGH-DCC1"},{"id":"DCC2","name":"POIUYTGH-DCC2"},{"id":"OKC1","name":"OKCBOK55-OKC1"},{"id":"PAR1","name":"PARSFRCG-PAR1"},{"id":"TES36","name":"ABCEETES-TES36"},{"id":"COM1","name":"PLMKOPIU-COM1"},{"id":"ANI1","name":"ATLNGTRE-ANI1"},{"id":"SDG78","name":"SDIT1BDG-SDG78"},{"id":"mac20","name":"PKGTESTF-mac20"},{"id":"DSF45","name":"DSFBG123-DSF45"},{"id":"HST25","name":"HSTNTX01-HST25"},{"id":"AMD18","name":"AUDIMA01-AMD18"},{"id":"SAA80","name":"SAIT9AA3-SAA80"},{"id":"SSA56","name":"SSIT2AA7-SSA56"},{"id":"SDD82","name":"SAIT1DD9-SDD82"},{"id":"JCV1","name":"JCVLFLBW-JCV1"},{"id":"SUL2","name":"WERTYUJK-SUL2"},{"id":"PUR1","name":"purelyde-PUR1"},{"id":"FDE55","name":"FDERT555-FDE55"},{"id":"SITE","name":"LONEENCO-SITE"},{"id":"ATL1","name":"ATLNGAMA-ATL1"},{"id":"JUL1","name":"ZXCVBNMM-JUL1"},{"id":"TAT34","name":"TESAAISB-TAT34"},{"id":"XCP12","name":"CHKGH123-XCP12"},{"id":"RAI1","name":"poiuytre-RAI1"},{"id":"HPO1","name":"ATLNGAUP-HPO1"},{"id":"KJF12","name":"KJFDH123-KJF12"},{"id":"SCC80","name":"SAIT9CC3-SCC80"},{"id":"SAA12","name":"SAIT9AF8-SAA12"},{"id":"SAA14","name":"SAIT1AA9-SAA14"},{"id":"ATL35","name":"TTESSAAI-ATL35"},{"id":"CWY1","name":"CWYMOWBS-CWY1"},{"id":"ATL76","name":"TELEPAAI-ATL76"},{"id":"DSL12","name":"DSLFK242-DSL12"},{"id":"ATL53","name":"AAIATLTE-ATL53"},{"id":"SAA11","name":"SAIT9AA2-SAA11"},{"id":"ATL62","name":"TESSASCH-ATL62"},{"id":"AUG1","name":"ASDFGHJK-AUG1"},{"id":"POI22","name":"POIUY123-POI22"},{"id":"SAA13","name":"SAIT1AA9-SAA13"},{"id":"BHY17","name":"BHYTFRF3-BHY17"},{"id":"LIS1","name":"HOSTPROF-LIS1"},{"id":"SIP1","name":"ZXCVBNMK-SIP1"},{"id":"ATL99","name":"TEESTAAI-ATL43"},{"id":"ATL64","name":"FORLOAAJ-ATL64"},{"id":"TAT33","name":"TESAAISA-TAT33"},{"id":"RAD10","name":"INDIPUNE-RAD10"},{"id":"RTW5","name":"BHYTFRY4-RTW5"},{"id":"JGS1","name":"KSJKKKKK-JGS1"},{"id":"ATL98","name":"TEESTAAI-ATL43"},{"id":"WAN1","name":"LEIWANGW-WAN1"},{"id":"ATL44","name":"ATLSANAB-ATL44"},{"id":"RTD2","name":"BHYTFRk4-RTD2"},{"id":"NIR1","name":"ORFLMANA-NIR1"},{"id":"ATL75","name":"SANAAIRE-ATL75"},{"id":"NUM1","name":"QWERTYUI-NUM1"},{"id":"MTN32","name":"MDTWNJ21-MTN32"},{"id":"RTZ4","name":"BHYTFRZ6-RTZ4"},{"id":"ATL56","name":"ATLSANAC-ATL56"},{"id":"AMS1","name":"AMSTNLBW-AMS1"},{"id":"RCT1","name":"AMSTERNL-RCT1"},{"id":"JAN1","name":"ORFLMATT-JAN1"},{"id":"ABC14","name":"TESAAISA-ABC14"},{"id":"TAT37","name":"TESAAISD-TAT37"},{"id":"MIC54","name":"MICHIGAN-MIC54"},{"id":"ABC11","name":"ATLSANAI-ABC11"},{"id":"AMF11","name":"AMDOCS01-AMF11"},{"id":"ATL63","name":"ATLSANEW-ATL63"},{"id":"ABC12","name":"ATLSECIA-ABC12"},{"id":"MTN20","name":"MDTWNJ21-MTN20"},{"id":"ABC15","name":"AAITESAN-ABC15"},{"id":"AVT1","name":"AVTRFLHD-AVT1"},{"id":"ATL34","name":"ATLSANAI-ATL34"}],"categoryParameters":{"owningEntityList":[{"id":"aaa1","name":"aaa1"},{"id":"d61e6f2d-12fa-4cc2-91df-7c244011d6fc","name":"WayneHolland"},{"id":"Melissa","name":"Melissa"}],"projectList":[{"id":"WATKINS","name":"WATKINS"},{"id":"x1","name":"x1"},{"id":"yyy1","name":"yyy1"}],"lineOfBusinessList":[{"id":"ONAP","name":"ONAP"},{"id":"zzz1","name":"zzz1"}],"platformList":[{"id":"platform","name":"platform"},{"id":"xxx1","name":"xxx1"}]},"type":"[LCP_REGIONS_AND_TENANTS] Update","subscribers":[{"id":"CAR_2020_ER","name":"CAR_2020_ER","isPermitted":true},{"id":"21014aa2-526b-11e6-beb8-9e71128cae77","name":"JULIO ERICKSON","isPermitted":false},{"id":"DHV1707-TestSubscriber-2","name":"DALE BRIDGES","isPermitted":false},{"id":"DHV1707-TestSubscriber-1","name":"LLOYD BRIDGES","isPermitted":false},{"id":"jimmy-example","name":"JimmyExampleCust-20161102","isPermitted":false},{"id":"jimmy-example2","name":"JimmyExampleCust-20161103","isPermitted":false},{"id":"ERICA5779-TestSub-PWT-102","name":"ERICA5779-TestSub-PWT-102","isPermitted":false},{"id":"ERICA5779-TestSub-PWT-101","name":"ERICA5779-TestSub-PWT-101","isPermitted":false},{"id":"a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb","name":"Emanuel","isPermitted":false},{"id":"ERICA5779-Subscriber-4","name":"ERICA5779-Subscriber-5","isPermitted":false},{"id":"ERICA5779-TestSub-PWT-103","name":"ERICA5779-TestSub-PWT-103","isPermitted":false},{"id":"ERICA5779-Subscriber-2","name":"ERICA5779-Subscriber-2","isPermitted":false},{"id":"e433710f-9217-458d-a79d-1c7aff376d89","name":"SILVIA ROBBINS","isPermitted":true},{"id":"ERICA5779-Subscriber-3","name":"ERICA5779-Subscriber-3","isPermitted":false},{"id":"31739f3e-526b-11e6-beb8-9e71128cae77","name":"CRAIG/ROBERTS","isPermitted":false}]}};
+ }
+}
+
+describe('Basic popup service', () => {
+ let injector;
+ let service: BasicPopupService;
+ let genericFormService : GenericFormService;
+ let defaultDataGeneratorService : DefaultDataGeneratorService;
+ let fb : FormBuilder;
+ let iframeService : IframeService;
+
+
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+ providers : [
+ NetworkPopupService,
+ BasicControlGenerator,
+ NetworkControlGenerator,
+ DefaultDataGeneratorService,
+ GenericFormService,
+ FormBuilder,
+ IframeService,
+ AaiService,
+ LogService,
+ BasicPopupService,
+ {provide:FeatureFlagsService, useClass: MockFeatureFlagsService},
+ {provide: NgRedux, useClass: MockReduxStore},
+ {provide: HttpClient, useClass: MockAppStore},
+ {provide: SdcUiServices.ModalService, useClass: MockModalService}
+ ]
+ });
+ await TestBed.compileComponents();
+ injector = getTestBed();
+ service = injector.get(BasicPopupService);
+ genericFormService = injector.get(GenericFormService);
+ defaultDataGeneratorService = injector.get(DefaultDataGeneratorService);
+ fb = injector.get(FormBuilder);
+ iframeService = injector.get(IframeService);
+
+ })().then(done).catch(done.fail));
+
+
+
+
+ test('getDynamicInputs should list of formControl model', () => {
+ const serviceId: string = '6b528779-44a3-4472-bdff-9cd15ec93450';
+ const networkModel : string = 'ExtVL 0';
+ const networkStoreKey : string = null;
+ const controls : FormControlModel[] = service.getDynamicInputs(serviceId, networkModel, networkStoreKey, 'networks');
+ expect(controls.length).toEqual(6);
+ for(let i = 0 ; i < controls.length ; i++){
+ expect(controls[i].type).toEqual('INPUT');
+ expect(controls[i].isVisible).toBeTruthy();
+ }
+ });
+
+ test('getModelFromResponse should return undefined if raw model not exist', () => {
+ const result= service.getModelFromResponse({
+ "modelType" : {
+ "modelName" : null
+ }
+ }, 'modelType', 'modelName');
+ expect(result).toBeUndefined();
+ });
+});
diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/basic.popup.service.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/basic.popup.service.ts
new file mode 100644
index 000000000..5d4d16567
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/basic.popup.service.ts
@@ -0,0 +1,54 @@
+import {Injectable} from "@angular/core";
+import {Subscriber} from "../../../models/subscriber";
+import {NetworkModel} from "../../../models/networkModel";
+import {AppState} from "../../../store/reducers";
+import {NgRedux} from "@angular-redux/store";
+import {FormControlModel} from "../../../models/formControlModels/formControl.model";
+import {DefaultDataGeneratorService} from "../../../services/defaultDataServiceGenerator/default.data.generator.service";
+import {BasicControlGenerator} from "../../genericForm/formControlsServices/basic.control.generator";
+import * as _ from 'lodash';
+import {VfModule} from "../../../models/vfModule";
+import {VNFModel} from "../../../models/vnfModel";
+import {VnfGroupModel} from "../../../models/vnfGroupModel";
+
+@Injectable()
+export class BasicPopupService {
+ constructor(private _store: NgRedux<AppState>,
+ private _defaultDataGeneratorService : DefaultDataGeneratorService,
+ private _basicControlGenerator : BasicControlGenerator){}
+
+ extractSubscriberNameBySubscriberId(subsriberId: string) {
+ let result: string = null;
+ let filteredArray: any = _.filter(this._store.getState().service.subscribers, function (o: Subscriber) {
+ return o.id === subsriberId
+ });
+ if (filteredArray.length > 0) {
+ result = filteredArray[0].name;
+ }
+ return result;
+ }
+
+ getModelFromResponse(result: any, modelType: string, modelName: string) {
+ let rawModel = result[modelType][modelName];
+ if (!rawModel) return;
+ switch (modelType){
+ case 'vnfs' : {
+ return new VNFModel(rawModel);
+ }
+ case 'vfModules' : {
+ return new VfModule(rawModel);
+ }
+ case 'networks' : {
+ return new NetworkModel(rawModel);
+ }
+ case 'vnfGroups' : {
+ return new VnfGroupModel(rawModel);
+ }
+ }
+ }
+
+ getDynamicInputs(serviceId : string, modelName : string, storeKey : string, type : string) : FormControlModel[]{
+ let dynamic = this._defaultDataGeneratorService.getArbitraryInputs(this._store.getState().service.serviceHierarchy[serviceId][type][modelName].inputs);
+ return this._basicControlGenerator.getDynamicInputsByType(dynamic, serviceId, storeKey, type );
+ }
+}
diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/generic-popup.interface.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/generic-popup.interface.ts
new file mode 100644
index 000000000..7324c64a7
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/generic-popup.interface.ts
@@ -0,0 +1,25 @@
+/***********************************************************
+ onSubmit : action when set button is clicked
+ onCancel : action when cancel/X button is clicked
+ getModelInformation : should generate the model information
+ getGenericFormPopupDetails : returns list of controls
+ getInstance : returns exists instance (if exist)
+ getTitle : returns generic popup title
+ getSubLeftTitle : returns generic popup left sub title
+ getSubRightTitle : returns generic popup right sub title
+ ***********************************************************/
+
+import {FormGroup} from "@angular/forms";
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import {FormPopupDetails} from "../../../models/formControlModels/formPopupDetails.model";
+
+export interface GenericPopupInterface {
+ onSubmit(that, form: FormGroup, ...args) : void;
+ onCancel(that, form) : void;
+ getModelInformation(serviceId : string, modelName : string) : void;
+ getGenericFormPopupDetails(serviceId : string, modelName : string , storeKey : string, node : ITreeNode, uuidData : Object, isUpdateMode : boolean) : FormPopupDetails;
+ getInstance(serviceId : string, modelName : string , storeKey : string) : any;
+ getTitle(isUpdateMode : boolean) : string;
+ getSubLeftTitle() : string;
+ getSubRightTitle() : string;
+}
diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/network/network.popup.service.spec.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/network/network.popup.service.spec.ts
new file mode 100644
index 000000000..30164b8b6
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/network/network.popup.service.spec.ts
@@ -0,0 +1,2395 @@
+import {NetworkPopupService} from "./network.popup.service";
+import {LogService} from "../../../../utils/log/log.service";
+import {SdcUiServices} from "onap-ui-angular";
+import {ReflectiveInjector} from "@angular/core";
+import {NgRedux} from "@angular-redux/store";
+import {BasicControlGenerator} from "../../../genericForm/formControlsServices/basic.control.generator";
+import {AaiService} from "../../../../services/aaiService/aai.service";
+import {HttpClient} from "@angular/common/http";
+import {NetworkControlGenerator} from "../../../genericForm/formControlsServices/networkGenerator/network.control.generator";
+import {GenericFormService} from "../../../genericForm/generic-form.service";
+import {FormBuilder} from "@angular/forms";
+import {IframeService} from "../../../../utils/iframe.service";
+import {DefaultDataGeneratorService} from "../../../../services/defaultDataServiceGenerator/default.data.generator.service";
+import {BasicPopupService} from "../basic.popup.service";
+import {FeatureFlagsService} from "../../../../services/featureFlag/feature-flags.service";
+import {getTestBed, TestBed} from "@angular/core/testing";
+
+class MockAppStore<T> {}
+
+class MockModalService<T> {}
+
+class MockReduxStore<T> {
+ getState() {
+ return {
+ "global": {
+ "name": null,
+ "flags": {
+ "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false,
+ "FLAG_SHOW_ASSIGNMENTS": true,
+ "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
+ "FLAG_UNASSIGN_SERVICE": true,
+ "FLAG_SHOW_VERIFY_SERVICE": false,
+ "FLAG_COLLECTION_RESOURCE_SUPPORT": true,
+ "FLAG_DUPLICATE_VNF": true,
+ "FLAG_SERVICE_MODEL_CACHE": true,
+ "FLAG_ADVANCED_PORTS_FILTER": true,
+ "CREATE_INSTANCE_TEST": false,
+ "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false,
+ "FLAG_REGION_ID_FROM_REMOTE": true,
+ "FLAG_ASYNC_INSTANTIATION": true,
+ "FLAG_ASYNC_JOBS": true,
+ "EMPTY_DRAWING_BOARD_TEST": false,
+ "FLAG_ADD_MSO_TESTAPI_FIELD": true
+ },
+ "type": "[FLAGS] Update"
+ },
+ "service": {
+ "serviceHierarchy": {
+ "6e59c5de-f052-46fa-aa7e-2fca9d674c44": {
+ "service": {
+ "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "name": "ComplexService",
+ "version": "1.0",
+ "toscaModelURL": null,
+ "category": "Emanuel",
+ "serviceType": "",
+ "serviceRole": "",
+ "description": "ComplexService",
+ "serviceEcompNaming": "false",
+ "instantiationType": "Macro",
+ "inputs": {}
+ },
+ "vnfs": {
+ "VF_vMee 0": {
+ "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60",
+ "invariantUuid": "4160458e-f648-4b30-a176-43881ffffe9e",
+ "description": "VSP_vMee",
+ "name": "VF_vMee",
+ "version": "2.0",
+ "customizationUuid": "91415b44-753d-494c-926a-456a9172bbb9",
+ "inputs": {},
+ "commands": {},
+ "properties": {
+ "max_instances": 10,
+ "min_instances": 1,
+ "gpb2_Internal2_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-ipv6-egress_src_start_port": "0",
+ "sctp-a-ipv6-egress_rule_application": "any",
+ "Internal2_allow_transit": "true",
+ "sctp-b-IPv6_ethertype": "IPv6",
+ "sctp-a-egress_rule_application": "any",
+ "sctp-b-ingress_action": "pass",
+ "sctp-b-ingress_rule_protocol": "icmp",
+ "ncb2_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-ipv6-ingress-src_start_port": "0.0",
+ "ncb1_Internal2_mac": "00:11:22:EF:AC:DF",
+ "fsb_volume_size_0": "320.0",
+ "sctp-b-egress_src_addresses": "local",
+ "sctp-a-ipv6-ingress_ethertype": "IPv4",
+ "sctp-a-ipv6-ingress-dst_start_port": "0",
+ "sctp-b-ipv6-ingress_rule_application": "any",
+ "domain_name": "default-domain",
+ "sctp-a-ingress_rule_protocol": "icmp",
+ "sctp-b-egress-src_start_port": "0.0",
+ "sctp-a-egress_src_addresses": "local",
+ "sctp-b-display_name": "epc-sctp-b-ipv4v6-sec-group",
+ "sctp-a-egress-src_start_port": "0.0",
+ "sctp-a-ingress_ethertype": "IPv4",
+ "sctp-b-ipv6-ingress-dst_end_port": "65535",
+ "sctp-b-dst_subnet_prefix_v6": "::",
+ "nf_naming": "{ecomp_generated_naming=true}",
+ "sctp-a-ipv6-ingress_src_subnet_prefix": "0.0.0.0",
+ "sctp-b-egress-dst_start_port": "0.0",
+ "ncb_flavor_name": "nv.c20r64d1",
+ "gpb1_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-egress_dst_subnet_prefix_len": "0.0",
+ "Internal2_net_cidr": "10.0.0.10",
+ "sctp-a-ingress-dst_start_port": "0.0",
+ "sctp-a-egress-dst_start_port": "0.0",
+ "fsb1_Internal2_mac": "00:11:22:EF:AC:DF",
+ "sctp-a-egress_ethertype": "IPv4",
+ "vlc_st_service_mode": "in-network-nat",
+ "sctp-a-ipv6-egress_ethertype": "IPv4",
+ "sctp-a-egress-src_end_port": "65535.0",
+ "sctp-b-ipv6-egress_rule_application": "any",
+ "sctp-b-egress_action": "pass",
+ "sctp-a-ingress-src_subnet_prefix_len": "0.0",
+ "sctp-b-ipv6-ingress-src_end_port": "65535.0",
+ "sctp-b-name": "epc-sctp-b-ipv4v6-sec-group",
+ "fsb2_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-a-ipv6-ingress-src_start_port": "0.0",
+ "sctp-b-ipv6-egress_ethertype": "IPv4",
+ "Internal1_net_cidr": "10.0.0.10",
+ "sctp-a-egress_dst_subnet_prefix": "0.0.0.0",
+ "fsb_flavor_name": "nv.c20r64d1",
+ "sctp_rule_protocol": "132",
+ "sctp-b-ipv6-ingress_src_subnet_prefix_len": "0",
+ "sctp-a-ipv6-ingress_rule_application": "any",
+ "ecomp_generated_naming": "false",
+ "sctp-a-IPv6_ethertype": "IPv6",
+ "vlc2_Internal1_mac": "00:11:22:EF:AC:DF",
+ "vlc_st_virtualization_type": "virtual-machine",
+ "sctp-b-ingress-dst_start_port": "0.0",
+ "sctp-b-ingress-dst_end_port": "65535.0",
+ "sctp-a-ipv6-ingress-src_end_port": "65535.0",
+ "sctp-a-display_name": "epc-sctp-a-ipv4v6-sec-group",
+ "sctp-b-ingress_rule_application": "any",
+ "int2_sec_group_name": "int2-sec-group",
+ "vlc_flavor_name": "nd.c16r64d1",
+ "sctp-b-ipv6-egress_src_addresses": "local",
+ "vlc_st_interface_type_int1": "other1",
+ "sctp-b-egress-src_end_port": "65535.0",
+ "sctp-a-ipv6-egress-dst_start_port": "0",
+ "vlc_st_interface_type_int2": "other2",
+ "sctp-a-ipv6-egress_rule_protocol": "any",
+ "Internal2_shared": "false",
+ "sctp-a-ipv6-egress_dst_subnet_prefix_len": "0",
+ "Internal2_rpf": "disable",
+ "vlc1_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-ipv6-egress_src_end_port": "65535",
+ "sctp-a-ipv6-egress_src_addresses": "local",
+ "sctp-a-ingress-dst_end_port": "65535.0",
+ "sctp-a-ipv6-egress_src_end_port": "65535",
+ "Internal1_forwarding_mode": "l2",
+ "Internal2_dhcp": "false",
+ "sctp-a-dst_subnet_prefix_v6": "::",
+ "pxe_image_name": "MME_PXE-Boot_16ACP04_GA.qcow2",
+ "vlc_st_interface_type_gtp": "other0",
+ "ncb1_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-src_subnet_prefix_v6": "::",
+ "sctp-a-egress_dst_subnet_prefix_len": "0.0",
+ "int1_sec_group_name": "int1-sec-group",
+ "Internal1_dhcp": "false",
+ "sctp-a-ipv6-egress_dst_end_port": "65535",
+ "Internal2_forwarding_mode": "l2",
+ "fsb2_Internal2_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-egress_dst_subnet_prefix": "0.0.0.0",
+ "Internal1_net_cidr_len": "17",
+ "gpb2_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-ingress-src_subnet_prefix_len": "0.0",
+ "sctp-a-ingress_dst_addresses": "local",
+ "sctp-a-egress_action": "pass",
+ "fsb_volume_type_0": "SF-Default-SSD",
+ "ncb2_Internal2_mac": "00:11:22:EF:AC:DF",
+ "vlc_st_interface_type_sctp_a": "left",
+ "vlc_st_interface_type_sctp_b": "right",
+ "sctp-a-src_subnet_prefix_v6": "::",
+ "vlc_st_version": "2",
+ "sctp-b-egress_ethertype": "IPv4",
+ "sctp-a-ingress_rule_application": "any",
+ "gpb1_Internal2_mac": "00:11:22:EF:AC:DF",
+ "instance_ip_family_v6": "v6",
+ "sctp-a-ipv6-egress_src_start_port": "0",
+ "sctp-b-ingress-src_start_port": "0.0",
+ "sctp-b-ingress_dst_addresses": "local",
+ "fsb1_Internal1_mac": "00:11:22:EF:AC:DF",
+ "vlc_st_interface_type_oam": "management",
+ "multi_stage_design": "true",
+ "oam_sec_group_name": "oam-sec-group",
+ "Internal2_net_gateway": "10.0.0.10",
+ "sctp-a-ipv6-ingress-dst_end_port": "65535",
+ "sctp-b-ipv6-egress-dst_start_port": "0",
+ "Internal1_net_gateway": "10.0.0.10",
+ "sctp-b-ipv6-egress_rule_protocol": "any",
+ "gtp_sec_group_name": "gtp-sec-group",
+ "sctp-a-ipv6-egress_dst_subnet_prefix": "0.0.0.0",
+ "sctp-b-ipv6-egress_dst_subnet_prefix_len": "0",
+ "sctp-a-ipv6-ingress_dst_addresses": "local",
+ "sctp-a-egress_rule_protocol": "icmp",
+ "sctp-b-ipv6-egress_action": "pass",
+ "sctp-a-ipv6-egress_action": "pass",
+ "Internal1_shared": "false",
+ "sctp-b-ipv6-ingress_rule_protocol": "any",
+ "Internal2_net_cidr_len": "17",
+ "sctp-a-name": "epc-sctp-a-ipv4v6-sec-group",
+ "sctp-a-ingress-src_end_port": "65535.0",
+ "sctp-b-ipv6-ingress_src_subnet_prefix": "0.0.0.0",
+ "sctp-a-egress-dst_end_port": "65535.0",
+ "sctp-a-ingress_action": "pass",
+ "sctp-b-egress_rule_protocol": "icmp",
+ "sctp-b-ipv6-ingress_action": "pass",
+ "vlc_st_service_type": "firewall",
+ "sctp-b-ipv6-egress_dst_end_port": "65535",
+ "sctp-b-ipv6-ingress-dst_start_port": "0",
+ "vlc2_Internal2_mac": "00:11:22:EF:AC:DF",
+ "vlc_st_availability_zone": "true",
+ "fsb_volume_image_name_1": "MME_FSB2_16ACP04_GA.qcow2",
+ "sctp-b-ingress-src_subnet_prefix": "0.0.0.0",
+ "sctp-a-ipv6-ingress_src_subnet_prefix_len": "0",
+ "Internal1_allow_transit": "true",
+ "gpb_flavor_name": "nv.c20r64d1",
+ "availability_zone_max_count": "1",
+ "fsb_volume_image_name_0": "MME_FSB1_16ACP04_GA.qcow2",
+ "sctp-b-ipv6-ingress_dst_addresses": "local",
+ "sctp-b-ipv6-egress_dst_subnet_prefix": "0.0.0.0",
+ "sctp-b-ipv6-ingress_ethertype": "IPv4",
+ "vlc1_Internal2_mac": "00:11:22:EF:AC:DF",
+ "sctp-a-ingress-src_subnet_prefix": "0.0.0.0",
+ "sctp-a-ipv6-ingress_action": "pass",
+ "Internal1_rpf": "disable",
+ "sctp-b-ingress_ethertype": "IPv4",
+ "sctp-b-egress_rule_application": "any",
+ "sctp-b-ingress-src_end_port": "65535.0",
+ "sctp-a-ipv6-ingress_rule_protocol": "any",
+ "sctp-a-ingress-src_start_port": "0.0",
+ "sctp-b-egress-dst_end_port": "65535.0"
+ },
+ "type": "VF",
+ "modelCustomizationName": "VF_vMee 0",
+ "vfModules": {
+ "vf_vmee0..VfVmee..vmme_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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..vmme_vlc..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "vmme_vlc"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ },
+ "vf_vmee0..VfVmee..vmme_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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..vmme_gpb..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "vmme_gpb"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "vf_vmee0..VfVmee..base_vmme..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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "base_vmme"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "vf_vmee0..VfVmee..base_vmme..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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "base_vmme"
+ },
+ "inputs": {}
+ }
+ },
+ "vfcInstanceGroups": {}
+ }
+ },
+ "networks": {
+ "ExtVL 0": {
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ "invariantUuid": "379f816b-a7aa-422f-be30-17114ff50b7c",
+ "description": "ECOMP generic virtual link (network) base type for all other service-level and global networks",
+ "name": "ExtVL",
+ "version": "37.0",
+ "customizationUuid": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+ "inputs": {},
+ "commands": {},
+ "properties": {
+ "netowrk_role": "role 1, role 2, role 3",
+ "network_assignments": "{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}",
+ "exVL_naming": "{ecomp_generated_naming=true}",
+ "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}",
+ "network_homing": "{ecomp_selected_instance_node_target=false}"
+ },
+ "type": "VL",
+ "modelCustomizationName": "ExtVL 0"
+ }
+ },
+ "collectionResource": {},
+ "configurations": {
+ "Port Mirroring Configuration By Policy 0": {
+ "uuid": "b4398538-e89d-4f13-b33d-ca323434ba50",
+ "invariantUuid": "6ef0ca40-f366-4897-951f-abd65d25f6f7",
+ "description": "A port mirroring configuration by policy object",
+ "name": "Port Mirroring Configuration By Policy",
+ "version": "27.0",
+ "customizationUuid": "3c3b7b8d-8669-4b3b-8664-61970041fad2",
+ "inputs": {},
+ "commands": {},
+ "properties": {},
+ "type": "Configuration",
+ "modelCustomizationName": "Port Mirroring Configuration By Policy 0",
+ "sourceNodes": [],
+ "collectorNodes": null,
+ "configurationByPolicy": false
+ }
+ },
+ "serviceProxies": {},
+ "vfModules": {
+ "vf_vmee0..VfVmee..vmme_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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..vmme_vlc..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "vmme_vlc"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ },
+ "vf_vmee0..VfVmee..vmme_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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..vmme_gpb..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "vmme_gpb"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "vf_vmee0..VfVmee..base_vmme..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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "base_vmme"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "vf_vmee0..VfVmee..base_vmme..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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "base_vmme"
+ },
+ "inputs": {}
+ }
+ },
+ "pnfs": {}
+ },
+ "6b528779-44a3-4472-bdff-9cd15ec93450": {
+ "service": {
+ "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+ "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "name": "action-data",
+ "version": "1.0",
+ "toscaModelURL": null,
+ "category": "",
+ "serviceType": "",
+ "serviceRole": "",
+ "description": "",
+ "serviceEcompNaming": "false",
+ "instantiationType": "A-La-Carte",
+ "inputs": {
+ "2017488_adiodvpe0_ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ }
+ }
+ },
+ "vnfs": {
+ "2017-388_ADIOD-vPE 1": {
+ "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413",
+ "invariantUuid": "00beb8f9-6d39-452f-816d-c709b9cbb87d",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-388_ADIOD-vPE",
+ "version": "1.0",
+ "customizationUuid": "280dec31-f16d-488b-9668-4aae55d6648a",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {
+ "vnf_config_template_version": {
+ "displayName": "vnf_config_template_version",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_config_template_version"
+ },
+ "bandwidth_units": {
+ "displayName": "bandwidth_units",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth_units"
+ },
+ "bandwidth": {"displayName": "bandwidth", "command": "get_input", "inputName": "adiodvpe0_bandwidth"},
+ "AIC_CLLI": {
+ "displayName": "AIC_CLLI",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_AIC_CLLI"
+ },
+ "ASN": {"displayName": "ASN", "command": "get_input", "inputName": "2017488_adiodvpe0_ASN"},
+ "vnf_instance_name": {
+ "displayName": "vnf_instance_name",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_instance_name"
+ }
+ },
+ "properties": {
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=false}",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "false",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VF",
+ "modelCustomizationName": "2017-388_ADIOD-vPE 1",
+ "vfModules": {},
+ "volumeGroups": {},
+ "vfcInstanceGroups": {}
+ },
+ "2017-388_ADIOD-vPE 0": {
+ "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168",
+ "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-388_ADIOD-vPE",
+ "version": "4.0",
+ "customizationUuid": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {
+ "vnf_config_template_version": {
+ "displayName": "vnf_config_template_version",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_config_template_version"
+ },
+ "bandwidth_units": {
+ "displayName": "bandwidth_units",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth_units"
+ },
+ "bandwidth": {"displayName": "bandwidth", "command": "get_input", "inputName": "adiodvpe0_bandwidth"},
+ "AIC_CLLI": {
+ "displayName": "AIC_CLLI",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_AIC_CLLI"
+ },
+ "ASN": {"displayName": "ASN", "command": "get_input", "inputName": "2017488_adiodvpe0_ASN"},
+ "vnf_instance_name": {
+ "displayName": "vnf_instance_name",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_instance_name"
+ }
+ },
+ "properties": {
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=false}",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "min_instances": "1",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "false",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VF",
+ "modelCustomizationName": "2017-388_ADIOD-vPE 0",
+ "vfModules": {},
+ "volumeGroups": {},
+ "vfcInstanceGroups": {}
+ },
+ "2017-488_ADIOD-vPE 0": {
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-488_ADIOD-vPE",
+ "version": "5.0",
+ "customizationUuid": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {
+ "vnf_config_template_version": {
+ "displayName": "vnf_config_template_version",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_config_template_version"
+ },
+ "bandwidth_units": {
+ "displayName": "bandwidth_units",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth_units"
+ },
+ "bandwidth": {"displayName": "bandwidth", "command": "get_input", "inputName": "adiodvpe0_bandwidth"},
+ "AIC_CLLI": {
+ "displayName": "AIC_CLLI",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_AIC_CLLI"
+ },
+ "ASN": {"displayName": "ASN", "command": "get_input", "inputName": "2017488_adiodvpe0_ASN"},
+ "vnf_instance_name": {
+ "displayName": "vnf_instance_name",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_instance_name"
+ }
+ },
+ "properties": {
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=false}",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "max_instances": "3",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "min_instances": "1",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "false",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VF",
+ "modelCustomizationName": "2017-488_ADIOD-vPE 0",
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV"
+ },
+ "inputs": {
+ "adiodvpe0_bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "2017488_adiodvpe0_vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ },
+ "2017488_adiodvpe0_vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "2017488_adiodvpe0_AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "AIC_CLLI"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "adiodvpe0_bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ }
+ },
+ "volumeGroupAllowed": true
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+ "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+ "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+ "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "version": "5",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "ADIOD_base_vPE_BV"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV"
+ },
+ "inputs": {
+ "adiodvpe0_bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "2017488_adiodvpe0_vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ },
+ "2017488_adiodvpe0_vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "2017488_adiodvpe0_AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "AIC_CLLI"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "adiodvpe0_bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ }
+ }
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV"
+ },
+ "inputs": {}
+ }
+ },
+ "vfcInstanceGroups": {}
+ }
+ },
+ "networks": {
+ "ExtVL 0": {
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ "invariantUuid": "379f816b-a7aa-422f-be30-17114ff50b7c",
+ "description": "ECOMP generic virtual link (network) base type for all other service-level and global networks",
+ "name": "ExtVL",
+ "version": "37.0",
+ "customizationUuid": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {},
+ "properties": {
+ "network_role" : "network role 1, network role 2",
+ "network_assignments": "{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}",
+ "exVL_naming": "{ecomp_generated_naming=true}",
+ "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}",
+ "network_homing": "{ecomp_selected_instance_node_target=false}"
+ },
+ "type": "VL",
+ "modelCustomizationName": "ExtVL 0"
+ }
+ },
+ "collectionResource": {},
+ "configurations": {},
+ "fabricConfigurations": {},
+ "serviceProxies": {},
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV"
+ },
+ "inputs": {
+ "adiodvpe0_bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "2017488_adiodvpe0_vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ },
+ "2017488_adiodvpe0_vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "2017488_adiodvpe0_AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {"sourceType": "HEAT", "vfModuleLabel": "ADIOD_vRE_BV", "paramName": "AIC_CLLI"},
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "adiodvpe0_bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ }
+ },
+ "volumeGroupAllowed": true
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+ "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+ "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+ "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "version": "5",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "ADIOD_base_vPE_BV"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV"
+ },
+ "inputs": {
+ "adiodvpe0_bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "2017488_adiodvpe0_vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ },
+ "2017488_adiodvpe0_vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "2017488_adiodvpe0_AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {"sourceType": "HEAT", "vfModuleLabel": "ADIOD_vRE_BV", "paramName": "AIC_CLLI"},
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "adiodvpe0_bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ }
+ }
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV"
+ },
+ "inputs": {}
+ }
+ },
+ "pnfs": {}
+ }
+ },
+ "serviceInstance": {
+ "6e59c5de-f052-46fa-aa7e-2fca9d674c44": {
+ "vnfs": {
+ "VF_vMee 0": {
+ "rollbackOnFailure": "true",
+ "vfModules": {
+ "vf_vmee0..VfVmee..base_vmme..module-0": {
+ "vf_vmee0..VfVmee..base_vmme..module-0vmvzo": {
+ "isMissingData": false,
+ "sdncPreReload": null,
+ "modelInfo": {
+ "modelType": "VFmodule",
+ "modelInvariantId": "a6f9e51a-2b35-416a-ae15-15e58d61f36d",
+ "modelVersionId": "a27f5cfc-7f12-4f99-af08-0af9c3885c87",
+ "modelName": "VfVmee..base_vmme..module-0",
+ "modelVersion": "2",
+ "modelCustomizationId": "f8c040f1-7e51-4a11-aca8-acf256cfd861",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0"
+ },
+ "instanceParams": [{}],
+ "trackById": "wmtm6sy2uj"
+ }
+ }
+ },
+ "isMissingData": true,
+ "originalName": "VF_vMee 0",
+ "vnfStoreKey": "VF_vMee 0",
+ "trackById": "p3wk448m5do",
+ "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60",
+ "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+ "lcpCloudRegionId": null,
+ "tenantId": null,
+ "lineOfBusiness": null,
+ "platformName": null,
+ "modelInfo": {
+ "modelType": "VF",
+ "modelInvariantId": "4160458e-f648-4b30-a176-43881ffffe9e",
+ "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ "modelName": "VF_vMee",
+ "modelVersion": "2.0",
+ "modelCustomizationName": "VF_vMee 0"
+ }
+ }
+ },
+ "networks": {},
+ "instanceParams": [{}],
+ "validationCounter": 1,
+ "existingNames": {},
+ "existingVNFCounterMap": {"d6557200-ecf2-4641-8094-5393ae3aae60": 1},
+ "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "subscriptionServiceType": "TYLER SILVIA",
+ "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+ "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+ "lcpCloudRegionId": "hvf6",
+ "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+ "aicZoneId": "JAG1",
+ "projectName": "x1",
+ "rollbackOnFailure": "true",
+ "bulkSize": 1,
+ "modelInfo": {
+ "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ "modelName": "ComplexService",
+ "modelVersion": "1.0",
+ "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44"
+ },
+ "isALaCarte": false,
+ "name": "ComplexService",
+ "version": "1.0",
+ "description": "ComplexService",
+ "category": "Emanuel",
+ "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "serviceType": "",
+ "serviceRole": "",
+ "isMultiStepDesign": false
+ },
+ "6b528779-44a3-4472-bdff-9cd15ec93450": {
+ "networks": {
+ "ExtVL 0": {
+ "rollbackOnFailure": "true",
+ "isMissingData": false,
+ "originalName": "ExtVL 0",
+ "networkStoreKey": "ExtVL 0",
+ "trackById": "sf3zth68xjf",
+ "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+ "lcpCloudRegionId": "hvf6",
+ "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+ "platformName": "xxx1",
+ "lineOfBusiness": "ONAP",
+ "instanceParams": [{}],
+ "modelInfo": {
+ "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c",
+ "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ "modelName": "ExtVL",
+ "modelVersion": "37.0",
+ "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+ "modelCustomizationName": "ExtVL 0",
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+ },
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+ },
+ "ExtVL 0:0001": {
+ "rollbackOnFailure": "true",
+ "isMissingData": false,
+ "originalName": "ExtVL 0",
+ "networkStoreKey": "ExtVL 0",
+ "trackById": "2mdxioxca9h",
+ "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+ "lcpCloudRegionId": "hvf6",
+ "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+ "platformName": "xxx1",
+ "lineOfBusiness": "ONAP",
+ "instanceParams": [{}],
+ "modelInfo": {
+ "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c",
+ "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ "modelName": "ExtVL",
+ "modelVersion": "37.0",
+ "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+ "modelCustomizationName": "ExtVL 0",
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+ },
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+ },
+ "ExtVL 0_1": {
+ "rollbackOnFailure": "true",
+ "isMissingData": false,
+ "originalName": "ExtVL 0",
+ "networkStoreKey": "ExtVL 0_1",
+ "trackById": "z7vd1gmpbs",
+ "instanceName": "ExtVL",
+ "productFamilyId": "17cc1042-527b-11e6-beb8-9e71128cae77",
+ "lcpCloudRegionId": "hvf6",
+ "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+ "platformName": "xxx1",
+ "lineOfBusiness": "zzz1",
+ "instanceParams": [{
+ "vnf_config_template_version": "17.2",
+ "bandwidth_units": "Gbps",
+ "bandwidth": "10",
+ "AIC_CLLI": "ATLMY8GA",
+ "ASN": "AV_vPE",
+ "vnf_instance_name": "yoav"
+ }],
+ "modelInfo": {
+ "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c",
+ "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ "modelName": "ExtVL",
+ "modelVersion": "37.0",
+ "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+ "modelCustomizationName": "ExtVL 0",
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+ },
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+ }
+ },
+ "vnfs": {
+ "2017-488_ADIOD-vPE 0": {
+ "rollbackOnFailure": "true",
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1sgoqi": {
+ "instanceName": "yoav",
+ "volumeGroupName": "123",
+ "modelInfo": {
+ "modelInvariantId": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "modelName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "modelVersion": "6",
+ "modelCustomizationId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5"
+ },
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "isMissingData": false,
+ "instanceParams": [{
+ "adiodvpe0_bandwidth": "10",
+ "2017488_adiodvpe0_vnf_instance_name": "mtnj309me6",
+ "2017488_adiodvpe0_vnf_config_template_version": "17.2",
+ "2017488_adiodvpe0_AIC_CLLI": "ATLMY8GA",
+ "adiodvpe0_bandwidth_units": "Gbps"
+ }]
+ }
+ }
+ },
+ "isMissingData": false,
+ "originalName": "2017-488_ADIOD-vPE 0",
+ "vnfStoreKey": "2017-488_ADIOD-vPE 0",
+ "trackById": "o65b26t2thj",
+ "instanceName": "2017488_ADIODvPE",
+ "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+ "lcpCloudRegionId": "hvf6",
+ "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054",
+ "platformName": "platform",
+ "lineOfBusiness": "ONAP",
+ "instanceParams": [{}],
+ "modelInfo": {
+ "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "modelVersionId": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "modelName": "2017-488_ADIOD-vPE",
+ "modelVersion": "5.0",
+ "modelCustomizationId": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+ "modelCustomizationName": "2017-488_ADIOD-vPE 0",
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09"
+ },
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09"
+ }
+ },
+ "instanceParams": [{"2017488_adiodvpe0_ASN": "AV_vPE"}],
+ "validationCounter": 0,
+ "existingNames": {"123": "", "instancename": "", "yoav": "", "extvl": ""},
+ "existingVNFCounterMap": {"69e09f68-8b63-4cc9-b9ff-860960b5db09": 1},
+ "existingNetworksCounterMap": {"ddc3f20c-08b5-40fd-af72-c6d14636b986": 3},
+ "instanceName": "InstanceName",
+ "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "subscriptionServiceType": "TYLER SILVIA",
+ "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+ "productFamilyId": "17cc1042-527b-11e6-beb8-9e71128cae77",
+ "lcpCloudRegionId": "JANET25",
+ "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+ "aicZoneId": "JAG1",
+ "projectName": null,
+ "rollbackOnFailure": "true",
+ "aicZoneName": "YUDFJULP-JAG1",
+ "owningEntityName": "WayneHolland",
+ "testApi": "GR_API",
+ "tenantName": "USP-SIP-IC-24335-T-01",
+ "bulkSize": 1,
+ "modelInfo": {
+ "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "modelVersionId": "6b528779-44a3-4472-bdff-9cd15ec93450",
+ "modelName": "action-data",
+ "modelVersion": "1.0",
+ "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450"
+ },
+ "isALaCarte": false,
+ "name": "action-data",
+ "version": "1.0",
+ "description": "",
+ "category": "",
+ "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+ "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "serviceType": "",
+ "serviceRole": "",
+ "isMultiStepDesign": false
+ }
+ },
+ "lcpRegionsAndTenants": {
+ "lcpRegionList": [{
+ "id": "JANET25",
+ "name": "JANET25",
+ "isPermitted": true
+ }, {"id": "hvf6", "name": "hvf6", "isPermitted": true}],
+ "lcpRegionsTenantsMap": {
+ "JANET25": [{
+ "id": "092eb9e8e4b7412e8787dd091bc58e86",
+ "name": "USP-SIP-IC-24335-T-01",
+ "isPermitted": true
+ }],
+ "hvf6": [{
+ "id": "bae71557c5bb4d5aac6743a4e5f1d054",
+ "name": "AIN Web Tool-15-D-testalexandria",
+ "isPermitted": true
+ }, {
+ "id": "229bcdc6eaeb4ca59d55221141d01f8e",
+ "name": "AIN Web Tool-15-D-STTest2",
+ "isPermitted": true
+ }, {
+ "id": "1178612d2b394be4834ad77f567c0af2",
+ "name": "AIN Web Tool-15-D-SSPtestcustome",
+ "isPermitted": true
+ }, {
+ "id": "19c5ade915eb461e8af52fb2fd8cd1f2",
+ "name": "AIN Web Tool-15-D-UncheckedEcopm",
+ "isPermitted": true
+ }, {
+ "id": "de007636e25249238447264a988a927b",
+ "name": "AIN Web Tool-15-D-dfsdf",
+ "isPermitted": true
+ }, {
+ "id": "62f29b3613634ca6a3065cbe0e020c44",
+ "name": "AIN/SMS-16-D-Multiservices1",
+ "isPermitted": true
+ }, {
+ "id": "649289e30d3244e0b48098114d63c2aa",
+ "name": "AIN Web Tool-15-D-SSPST66",
+ "isPermitted": true
+ }, {
+ "id": "3f21eeea6c2c486bba31dab816c05a32",
+ "name": "AIN Web Tool-15-D-ASSPST47",
+ "isPermitted": true
+ }, {
+ "id": "f60ce21d3ee6427586cff0d22b03b773",
+ "name": "CESAR-100-D-sspjg67246",
+ "isPermitted": true
+ }, {
+ "id": "8774659e425f479895ae091bb5d46560",
+ "name": "CESAR-100-D-sspjg68359",
+ "isPermitted": true
+ }, {
+ "id": "624eb554b0d147c19ff8885341760481",
+ "name": "AINWebTool-15-D-iftach",
+ "isPermitted": true
+ }, {
+ "id": "214f55f5fc414c678059c383b03e4962",
+ "name": "CESAR-100-D-sspjg612401",
+ "isPermitted": true
+ }, {
+ "id": "c90666c291664841bb98e4d981ff1db5",
+ "name": "CESAR-100-D-sspjg621340",
+ "isPermitted": true
+ }, {
+ "id": "ce5b6bc5c7b348e1bf4b91ac9a174278",
+ "name": "sspjg621351cloned",
+ "isPermitted": true
+ }, {
+ "id": "b386b768a3f24c8e953abbe0b3488c02",
+ "name": "AINWebTool-15-D-eteancomp",
+ "isPermitted": true
+ }, {
+ "id": "dc6c4dbfd225474e9deaadd34968646c",
+ "name": "AINWebTool-15-T-SPFET",
+ "isPermitted": true
+ }, {
+ "id": "02cb5030e9914aa4be120bd9ed1e19eb",
+ "name": "AINWebTool-15-X-eeweww",
+ "isPermitted": true
+ }, {
+ "id": "f2f3830e4c984d45bcd00e1a04158a79",
+ "name": "CESAR-100-D-spjg61909",
+ "isPermitted": true
+ }, {
+ "id": "05b91bd5137f4929878edd965755c06d",
+ "name": "CESAR-100-D-sspjg621512cloned",
+ "isPermitted": true
+ }, {
+ "id": "7002fbe8482d4a989ddf445b1ce336e0",
+ "name": "AINWebTool-15-X-vdr",
+ "isPermitted": true
+ }, {
+ "id": "4008522be43741dcb1f5422022a2aa0b",
+ "name": "AINWebTool-15-D-ssasa",
+ "isPermitted": true
+ }, {
+ "id": "f44e2e96a1b6476abfda2fa407b00169",
+ "name": "AINWebTool-15-D-PFNPT",
+ "isPermitted": true
+ }, {
+ "id": "b69a52bec8a84669a37a1e8b72708be7",
+ "name": "AINWebTool-15-X-vdre",
+ "isPermitted": true
+ }, {
+ "id": "fac7d9fd56154caeb9332202dcf2969f",
+ "name": "AINWebTool-15-X-NONPODECOMP",
+ "isPermitted": true
+ }, {
+ "id": "2d34d8396e194eb49969fd61ffbff961",
+ "name": "DN5242-Nov16-T5",
+ "isPermitted": true
+ }, {
+ "id": "cb42a77ff45b48a8b8deb83bb64acc74",
+ "name": "ro-T11",
+ "isPermitted": true
+ }, {
+ "id": "fa45ca53c80b492fa8be5477cd84fc2b",
+ "name": "ro-T112",
+ "isPermitted": true
+ }, {
+ "id": "4914ab0ab3a743e58f0eefdacc1dde77",
+ "name": "DN5242-Nov21-T1",
+ "isPermitted": true
+ }, {
+ "id": "d0a3e3f2964542259d155a81c41aadc3",
+ "name": "test-hvf6-09",
+ "isPermitted": true
+ }, {"id": "cbb99fe4ada84631b7baf046b6fd2044", "name": "DN5242-Nov16-T3", "isPermitted": true}]
+ }
+ },
+ "productFamilies": [{
+ "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+ "name": "SCOTTIE",
+ "isPermitted": true
+ }, {
+ "id": "17cc1042-527b-11e6-beb8-9e71128cae77",
+ "name": "IGNACIO",
+ "isPermitted": true
+ }, {
+ "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+ "name": "Christie",
+ "isPermitted": true
+ }, {
+ "id": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7",
+ "name": "Enhanced Services",
+ "isPermitted": true
+ }, {"id": "vTerrance", "name": "vTerrance", "isPermitted": true}, {
+ "id": "323d69d9-2efe-4r45-ay0a-89ea7ard4e6f",
+ "name": "vSCP",
+ "isPermitted": true
+ }, {
+ "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+ "name": "Emanuel",
+ "isPermitted": true
+ }, {
+ "id": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+ "name": "BVOIP",
+ "isPermitted": true
+ }, {"id": "db171b8f-115c-4992-a2e3-ee04cae357e0", "name": "LINDSEY", "isPermitted": true}, {
+ "id": "LRSI-OSPF",
+ "name": "LRSI-OSPF",
+ "isPermitted": true
+ }, {"id": "vRosemarie", "name": "HNGATEWAY", "isPermitted": true}, {
+ "id": "vHNPaas",
+ "name": "WILKINS",
+ "isPermitted": true
+ }, {
+ "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "name": "TYLER SILVIA",
+ "isPermitted": true
+ }, {"id": "b6a3f28c-eebf-494c-a900-055cc7c874ce", "name": "VROUTER", "isPermitted": true}, {
+ "id": "Cisneros",
+ "name": "vMuriel",
+ "isPermitted": true
+ }, {
+ "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1",
+ "name": "CARA Griffin",
+ "isPermitted": true
+ }, {
+ "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d",
+ "name": "DARREN MCGEE",
+ "isPermitted": true
+ }, {"id": "e30755dc-5673-4b6b-9dcf-9abdd96b93d1", "name": "Transport", "isPermitted": true}, {
+ "id": "vSalvatore",
+ "name": "vSalvatore",
+ "isPermitted": true
+ }, {"id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4", "name": "Josefina", "isPermitted": true}, {
+ "id": "vHubbard",
+ "name": "vHubbard",
+ "isPermitted": true
+ }, {"id": "12a96a9d-4b4c-4349-a950-fe1159602621", "name": "DARREN MCGEE", "isPermitted": true}],
+ "serviceTypes": {
+ "e433710f-9217-458d-a79d-1c7aff376d89": [{
+ "id": "0",
+ "name": "vRichardson",
+ "isPermitted": false
+ }, {"id": "1", "name": "TYLER SILVIA", "isPermitted": true}, {
+ "id": "2",
+ "name": "Emanuel",
+ "isPermitted": false
+ }, {"id": "3", "name": "vJamie", "isPermitted": false}, {
+ "id": "4",
+ "name": "vVoiceMail",
+ "isPermitted": false
+ }, {"id": "5", "name": "Kennedy", "isPermitted": false}, {
+ "id": "6",
+ "name": "vSEGW",
+ "isPermitted": false
+ }, {"id": "7", "name": "vVM", "isPermitted": false}, {
+ "id": "8",
+ "name": "vOTA",
+ "isPermitted": false
+ }, {"id": "9", "name": "vMME", "isPermitted": false}, {
+ "id": "10",
+ "name": "vMNS",
+ "isPermitted": false
+ }, {"id": "11", "name": "vSCP", "isPermitted": false}, {
+ "id": "12",
+ "name": "VPMS",
+ "isPermitted": false
+ }, {"id": "13", "name": "vMMSC", "isPermitted": false}, {
+ "id": "14",
+ "name": "SSD",
+ "isPermitted": false
+ }, {"id": "15", "name": "vMOG", "isPermitted": false}, {
+ "id": "16",
+ "name": "LINDSEY",
+ "isPermitted": false
+ }, {"id": "17", "name": "JOHANNA_SANTOS", "isPermitted": false}, {
+ "id": "18",
+ "name": "vCarroll",
+ "isPermitted": false
+ }]
+ },
+ "aicZones": [{"id": "NFT1", "name": "NFTJSSSS-NFT1"}, {"id": "JAG1", "name": "YUDFJULP-JAG1"}, {
+ "id": "YYY1",
+ "name": "UUUAIAAI-YYY1"
+ }, {"id": "BAN1", "name": "VSDKYUTP-BAN1"}, {"id": "DKJ1", "name": "DKJSJDKA-DKJ1"}, {
+ "id": "MCS1",
+ "name": "ASACMAMS-MCS1"
+ }, {"id": "UIO1", "name": "uioclli1-UIO1"}, {"id": "RAJ1", "name": "YGBIJNLQ-RAJ1"}, {
+ "id": "OPA1",
+ "name": "opaclli1-OPA1"
+ }, {"id": "SDE1", "name": "ZXCVBNMA-SDE1"}, {"id": "VEN2", "name": "FGHJUHIL-VEN2"}, {
+ "id": "ORL1",
+ "name": "ORLDFLMA-ORL1"
+ }, {"id": "JAD1", "name": "JADECLLI-JAD1"}, {"id": "ZXL1", "name": "LWLWCANN-ZXL1"}, {
+ "id": "CKL1",
+ "name": "CLKSKCKK-CKL1"
+ }, {"id": "SDF1", "name": "sdfclli1-SDF1"}, {"id": "RAD1", "name": "RADICAL1-RAD1"}, {
+ "id": "KIT1",
+ "name": "BHYJFGLN-KIT1"
+ }, {"id": "REL1", "name": "INGERFGT-REL1"}, {"id": "JNL1", "name": "CJALSDAC-JNL1"}, {
+ "id": "OLK1",
+ "name": "OLKOLKLS-OLK1"
+ }, {"id": "CHI1", "name": "CHILLIWE-CHI1"}, {"id": "UUU4", "name": "UUUAAAUU-UUU4"}, {
+ "id": "TUF1",
+ "name": "TUFCLLI1-TUF1"
+ }, {"id": "KJN1", "name": "CKALDKSA-KJN1"}, {"id": "SAM1", "name": "SNDGCA64-SAN1"}, {
+ "id": "SCK1",
+ "name": "SCKSCKSK-SCK1"
+ }, {"id": "HJH1", "name": "AOEEQQQD-HJH1"}, {"id": "HGD1", "name": "SDFQWHGD-HGD1"}, {
+ "id": "KOR1",
+ "name": "HYFLNBVT-KOR1"
+ }, {"id": "ATL43", "name": "AICLOCID-ATL43"}, {"id": "ATL54", "name": "AICFTAAI-ATL54"}, {
+ "id": "ATL66",
+ "name": "CLLIAAII-ATL66"
+ }, {"id": "VEL1", "name": "BNMLKUIK-VEL1"}, {"id": "ICC1", "name": "SANJITAT-ICC1"}, {
+ "id": "MNT11",
+ "name": "WSXEFBTH-MNT11"
+ }, {"id": "DEF2", "name": "WSBHGTYL-DEF2"}, {"id": "MAD11", "name": "SDFQWGKL-MAD11"}, {
+ "id": "OLG1",
+ "name": "OLHOLHOL-OLG1"
+ }, {"id": "GAR1", "name": "NGFVSJKO-GAR1"}, {"id": "SAN22", "name": "GNVLSCTL-SAN22"}, {
+ "id": "HRG1",
+ "name": "HRGHRGGS-HRG1"
+ }, {"id": "JCS1", "name": "JCSJSCJS-JCS1"}, {"id": "DHA12", "name": "WSXEDECF-DHA12"}, {
+ "id": "HJE1",
+ "name": "AOEEWWWD-HJE1"
+ }, {"id": "NCA1", "name": "NCANCANN-NCA1"}, {"id": "IOP1", "name": "iopclli1-IOP1"}, {
+ "id": "RTY1",
+ "name": "rtyclli1-RTY1"
+ }, {"id": "KAP1", "name": "HIOUYTRQ-KAP1"}, {"id": "ZEN1", "name": "ZENCLLI1-ZEN1"}, {
+ "id": "HKA1",
+ "name": "JAKHLASS-HKA1"
+ }, {"id": "CQK1", "name": "CQKSCAKK-CQK1"}, {"id": "SAI1", "name": "UBEKQLPD-SAI1"}, {
+ "id": "ERT1",
+ "name": "ertclli1-ERT1"
+ }, {"id": "IBB1", "name": "PLMKOIJU-IBB1"}, {"id": "TIR2", "name": "PLKINHYI-TIR2"}, {
+ "id": "HSD1",
+ "name": "CHASKCDS-HSD1"
+ }, {"id": "SLF78", "name": "SDCTLFN1-SLF78"}, {"id": "SEE78", "name": "SDCTEEE4-SEE78"}, {
+ "id": "SAN13",
+ "name": "TOKYJPFA-SAN13"
+ }, {"id": "SAA78", "name": "SDCTAAA1-SAA78"}, {"id": "LUC1", "name": "ATLDFGYC-LUC1"}, {
+ "id": "AMD13",
+ "name": "MEMATLAN-AMD13"
+ }, {"id": "TOR1", "name": "TOROONXN-TOR1"}, {"id": "QWE1", "name": "QWECLLI1-QWE1"}, {
+ "id": "ZOG1",
+ "name": "ZOGASTRO-ZOG1"
+ }, {"id": "CAL33", "name": "CALIFORN-CAL33"}, {"id": "SHH78", "name": "SDIT1HHH-SHH78"}, {
+ "id": "DSA1",
+ "name": "LKJHGFDS-DSA1"
+ }, {"id": "CLG1", "name": "CLGRABAD-CLG1"}, {"id": "BNA1", "name": "BNARAGBK-BNA1"}, {
+ "id": "ATL84",
+ "name": "CANTTCOC-ATL84"
+ }, {"id": "APP1", "name": "WBHGTYUI-APP1"}, {"id": "RJN1", "name": "RJNRBZAW-RJN1"}, {
+ "id": "EHH78",
+ "name": "SDCSHHH5-EHH78"
+ }, {"id": "mac10", "name": "PKGTESTF-mac10"}, {"id": "SXB78", "name": "SDCTGXB1-SXB78"}, {
+ "id": "SAX78",
+ "name": "SDCTAXG1-SAX78"
+ }, {"id": "SYD1", "name": "SYDNAUBV-SYD1"}, {"id": "TOK1", "name": "TOKYJPFA-TOK1"}, {
+ "id": "KGM2",
+ "name": "KGMTNC20-KGM2"
+ }, {"id": "DCC1b", "name": "POIUYTGH-DCC1b"}, {"id": "SKK78", "name": "SDCTKKK1-SKK78"}, {
+ "id": "SGG78",
+ "name": "SDCTGGG1-SGG78"
+ }, {"id": "SJJ78", "name": "SDCTJJJ1-SJJ78"}, {"id": "SBX78", "name": "SDCTBXG1-SBX78"}, {
+ "id": "LAG1",
+ "name": "LARGIZON-LAG1"
+ }, {"id": "IAA1", "name": "QAZXSWED-IAA1"}, {"id": "POI1", "name": "PLMNJKIU-POI1"}, {
+ "id": "LAG1a",
+ "name": "LARGIZON-LAG1a"
+ }, {"id": "PBL1", "name": "PBLAPBAI-PBL1"}, {"id": "LAG45", "name": "LARGIZON-LAG1a"}, {
+ "id": "MAR1",
+ "name": "MNBVCXZM-MAR1"
+ }, {"id": "HST70", "name": "HSTNTX70-HST70"}, {"id": "DCC1a", "name": "POIUYTGH-DCC1a"}, {
+ "id": "TOL1",
+ "name": "TOLDOH21-TOL1"
+ }, {"id": "LON1", "name": "LONEENCO-LON1"}, {"id": "SJU78", "name": "SDIT1JUB-SJU78"}, {
+ "id": "STN27",
+ "name": "HSTNTX01-STN27"
+ }, {"id": "SSW56", "name": "ss8126GT-SSW56"}, {"id": "SBB78", "name": "SDIT1BBB-SBB78"}, {
+ "id": "DCC3",
+ "name": "POIUYTGH-DCC3"
+ }, {"id": "GNV1", "name": "GNVLSCTL-GNV1"}, {"id": "WAS1", "name": "WASHDCSW-WAS1"}, {
+ "id": "TOY1",
+ "name": "TORYONNZ-TOY1"
+ }, {"id": "STT1", "name": "STTLWA02-STT1"}, {"id": "STG1", "name": "STTGGE62-STG1"}, {
+ "id": "SLL78",
+ "name": "SDCTLLL1-SLL78"
+ }, {"id": "SBU78", "name": "SDIT1BUB-SBU78"}, {"id": "ATL2", "name": "ATLNGANW-ATL2"}, {
+ "id": "BOT1",
+ "name": "BOTHWAKY-BOT1"
+ }, {"id": "SNG1", "name": "SNGPSIAU-SNG1"}, {"id": "NYC1", "name": "NYCMNY54-NYC1"}, {
+ "id": "LAG1b",
+ "name": "LARGIZON-LAG1b"
+ }, {"id": "AMD15", "name": "AMDFAA01-AMD15"}, {"id": "SNA1", "name": "SNANTXCA-SNA1"}, {
+ "id": "PLT1",
+ "name": "PLTNCA60-PLT1"
+ }, {"id": "TLP1", "name": "TLPNXM18-TLP1"}, {"id": "SDD81", "name": "SAIT1DD6-SDD81"}, {
+ "id": "DCC1",
+ "name": "POIUYTGH-DCC1"
+ }, {"id": "DCC2", "name": "POIUYTGH-DCC2"}, {"id": "OKC1", "name": "OKCBOK55-OKC1"}, {
+ "id": "PAR1",
+ "name": "PARSFRCG-PAR1"
+ }, {"id": "TES36", "name": "ABCEETES-TES36"}, {"id": "COM1", "name": "PLMKOPIU-COM1"}, {
+ "id": "ANI1",
+ "name": "ATLNGTRE-ANI1"
+ }, {"id": "SDG78", "name": "SDIT1BDG-SDG78"}, {"id": "mac20", "name": "PKGTESTF-mac20"}, {
+ "id": "DSF45",
+ "name": "DSFBG123-DSF45"
+ }, {"id": "HST25", "name": "HSTNTX01-HST25"}, {"id": "AMD18", "name": "AUDIMA01-AMD18"}, {
+ "id": "SAA80",
+ "name": "SAIT9AA3-SAA80"
+ }, {"id": "SSA56", "name": "SSIT2AA7-SSA56"}, {"id": "SDD82", "name": "SAIT1DD9-SDD82"}, {
+ "id": "JCV1",
+ "name": "JCVLFLBW-JCV1"
+ }, {"id": "SUL2", "name": "WERTYUJK-SUL2"}, {"id": "PUR1", "name": "purelyde-PUR1"}, {
+ "id": "FDE55",
+ "name": "FDERT555-FDE55"
+ }, {"id": "SITE", "name": "LONEENCO-SITE"}, {"id": "ATL1", "name": "ATLNGAMA-ATL1"}, {
+ "id": "JUL1",
+ "name": "ZXCVBNMM-JUL1"
+ }, {"id": "TAT34", "name": "TESAAISB-TAT34"}, {"id": "XCP12", "name": "CHKGH123-XCP12"}, {
+ "id": "RAI1",
+ "name": "poiuytre-RAI1"
+ }, {"id": "HPO1", "name": "ATLNGAUP-HPO1"}, {"id": "KJF12", "name": "KJFDH123-KJF12"}, {
+ "id": "SCC80",
+ "name": "SAIT9CC3-SCC80"
+ }, {"id": "SAA12", "name": "SAIT9AF8-SAA12"}, {"id": "SAA14", "name": "SAIT1AA9-SAA14"}, {
+ "id": "ATL35",
+ "name": "TTESSAAI-ATL35"
+ }, {"id": "CWY1", "name": "CWYMOWBS-CWY1"}, {"id": "ATL76", "name": "TELEPAAI-ATL76"}, {
+ "id": "DSL12",
+ "name": "DSLFK242-DSL12"
+ }, {"id": "ATL53", "name": "AAIATLTE-ATL53"}, {"id": "SAA11", "name": "SAIT9AA2-SAA11"}, {
+ "id": "ATL62",
+ "name": "TESSASCH-ATL62"
+ }, {"id": "AUG1", "name": "ASDFGHJK-AUG1"}, {"id": "POI22", "name": "POIUY123-POI22"}, {
+ "id": "SAA13",
+ "name": "SAIT1AA9-SAA13"
+ }, {"id": "BHY17", "name": "BHYTFRF3-BHY17"}, {"id": "LIS1", "name": "HOSTPROF-LIS1"}, {
+ "id": "SIP1",
+ "name": "ZXCVBNMK-SIP1"
+ }, {"id": "ATL99", "name": "TEESTAAI-ATL43"}, {"id": "ATL64", "name": "FORLOAAJ-ATL64"}, {
+ "id": "TAT33",
+ "name": "TESAAISA-TAT33"
+ }, {"id": "RAD10", "name": "INDIPUNE-RAD10"}, {"id": "RTW5", "name": "BHYTFRY4-RTW5"}, {
+ "id": "JGS1",
+ "name": "KSJKKKKK-JGS1"
+ }, {"id": "ATL98", "name": "TEESTAAI-ATL43"}, {"id": "WAN1", "name": "LEIWANGW-WAN1"}, {
+ "id": "ATL44",
+ "name": "ATLSANAB-ATL44"
+ }, {"id": "RTD2", "name": "BHYTFRk4-RTD2"}, {"id": "NIR1", "name": "ORFLMANA-NIR1"}, {
+ "id": "ATL75",
+ "name": "SANAAIRE-ATL75"
+ }, {"id": "NUM1", "name": "QWERTYUI-NUM1"}, {"id": "MTN32", "name": "MDTWNJ21-MTN32"}, {
+ "id": "RTZ4",
+ "name": "BHYTFRZ6-RTZ4"
+ }, {"id": "ATL56", "name": "ATLSANAC-ATL56"}, {"id": "AMS1", "name": "AMSTNLBW-AMS1"}, {
+ "id": "RCT1",
+ "name": "AMSTERNL-RCT1"
+ }, {"id": "JAN1", "name": "ORFLMATT-JAN1"}, {"id": "ABC14", "name": "TESAAISA-ABC14"}, {
+ "id": "TAT37",
+ "name": "TESAAISD-TAT37"
+ }, {"id": "MIC54", "name": "MICHIGAN-MIC54"}, {"id": "ABC11", "name": "ATLSANAI-ABC11"}, {
+ "id": "AMF11",
+ "name": "AMDOCS01-AMF11"
+ }, {"id": "ATL63", "name": "ATLSANEW-ATL63"}, {"id": "ABC12", "name": "ATLSECIA-ABC12"}, {
+ "id": "MTN20",
+ "name": "MDTWNJ21-MTN20"
+ }, {"id": "ABC15", "name": "AAITESAN-ABC15"}, {"id": "AVT1", "name": "AVTRFLHD-AVT1"}, {
+ "id": "ATL34",
+ "name": "ATLSANAI-ATL34"
+ }],
+ "categoryParameters": {
+ "owningEntityList": [{
+ "id": "aaa1",
+ "name": "aaa1"
+ }, {"id": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", "name": "WayneHolland"}, {
+ "id": "Melissa",
+ "name": "Melissa"
+ }],
+ "projectList": [{"id": "WATKINS", "name": "WATKINS"}, {"id": "x1", "name": "x1"}, {"id": "yyy1", "name": "yyy1"}],
+ "lineOfBusinessList": [{"id": "ONAP", "name": "ONAP"}, {"id": "zzz1", "name": "zzz1"}],
+ "platformList": [{"id": "platform", "name": "platform"}, {"id": "xxx1", "name": "xxx1"}]
+ },
+ "type": "[LCP_REGIONS_AND_TENANTS] Update",
+ "subscribers": [{
+ "id": "CAR_2020_ER",
+ "name": "CAR_2020_ER",
+ "isPermitted": true
+ }, {
+ "id": "21014aa2-526b-11e6-beb8-9e71128cae77",
+ "name": "JULIO ERICKSON",
+ "isPermitted": false
+ }, {
+ "id": "DHV1707-TestSubscriber-2",
+ "name": "DALE BRIDGES",
+ "isPermitted": false
+ }, {"id": "DHV1707-TestSubscriber-1", "name": "LLOYD BRIDGES", "isPermitted": false}, {
+ "id": "jimmy-example",
+ "name": "JimmyExampleCust-20161102",
+ "isPermitted": false
+ }, {
+ "id": "jimmy-example2",
+ "name": "JimmyExampleCust-20161103",
+ "isPermitted": false
+ }, {
+ "id": "ERICA5779-TestSub-PWT-102",
+ "name": "ERICA5779-TestSub-PWT-102",
+ "isPermitted": false
+ }, {
+ "id": "ERICA5779-TestSub-PWT-101",
+ "name": "ERICA5779-TestSub-PWT-101",
+ "isPermitted": false
+ }, {
+ "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+ "name": "Emanuel",
+ "isPermitted": false
+ }, {
+ "id": "ERICA5779-Subscriber-4",
+ "name": "ERICA5779-Subscriber-5",
+ "isPermitted": false
+ }, {
+ "id": "ERICA5779-TestSub-PWT-103",
+ "name": "ERICA5779-TestSub-PWT-103",
+ "isPermitted": false
+ }, {
+ "id": "ERICA5779-Subscriber-2",
+ "name": "ERICA5779-Subscriber-2",
+ "isPermitted": false
+ }, {
+ "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "name": "SILVIA ROBBINS",
+ "isPermitted": true
+ }, {
+ "id": "ERICA5779-Subscriber-3",
+ "name": "ERICA5779-Subscriber-3",
+ "isPermitted": false
+ }, {"id": "31739f3e-526b-11e6-beb8-9e71128cae77", "name": "CRAIG/ROBERTS", "isPermitted": false}]
+ }
+ };
+ }
+}
+
+class MockFeatureFlagsService {}
+
+describe('Network popup service', () => {
+ let injector;
+ let service: NetworkPopupService;
+ let genericFormService: GenericFormService
+ let defaultDataGeneratorService: DefaultDataGeneratorService;
+ let fb: FormBuilder;
+ let iframeService: IframeService;
+
+
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+ providers : [
+ NetworkPopupService,
+ BasicControlGenerator,
+ NetworkControlGenerator,
+ DefaultDataGeneratorService,
+ GenericFormService,
+ FormBuilder,
+ IframeService,
+ AaiService,
+ LogService,
+ BasicPopupService,
+ {provide:FeatureFlagsService, useClass: MockFeatureFlagsService},
+ {provide: NgRedux, useClass: MockReduxStore},
+ {provide: HttpClient, useClass: MockAppStore},
+ {provide: SdcUiServices.ModalService, useClass: MockModalService}
+ ]
+ });
+ await TestBed.compileComponents();
+
+ injector = getTestBed();
+ service = injector.get(NetworkPopupService);
+ genericFormService = injector.get(GenericFormService);
+ defaultDataGeneratorService = injector.get(DefaultDataGeneratorService);
+ fb = injector.get(FormBuilder);
+ iframeService = injector.get(IframeService);
+
+ })().then(done).catch(done.fail));
+
+ test('getTitle should return the correct title for edit and create mode', () => {
+ expect(service.getTitle(true)).toBe('Edit Network');
+ expect(service.getTitle(false)).toBe('Set new Network');
+ });
+
+ test('getSubLeftTitle should return network model name', () => {
+ service.uuidData = {
+ 'networkId': 'Model name'
+ };
+ expect(service.getSubLeftTitle()).toBe('Model name');
+ });
+
+ test('getSubRightTitle should return popup type', () => {
+ expect(service.getSubRightTitle()).toBe('Network Instance Details');
+ });
+
+ test('getModelInformation should update modelInformations', () => {
+ const serviceId: string = '6b528779-44a3-4472-bdff-9cd15ec93450';
+ const networkModel: string = 'ExtVL 0';
+
+ service.getModelInformation(serviceId, networkModel);
+ expect(service.modelInformations.length).toEqual(13);
+ expect(service.modelInformations[0].label).toEqual("Subscriber Name");
+ expect(service.modelInformations[0].values).toEqual(['SILVIA ROBBINS']);
+
+ expect(service.modelInformations[1].label).toEqual("Service Name");
+ expect(service.modelInformations[1].values).toEqual(['action-data']);
+
+ expect(service.modelInformations[2].label).toEqual("Service Instance Name");
+ expect(service.modelInformations[2].values).toEqual(['InstanceName']);
+
+ expect(service.modelInformations[3].label).toEqual("Model Name");
+ expect(service.modelInformations[3].values).toEqual(['ExtVL']);
+
+ expect(service.modelInformations[4].label).toEqual("Model version");
+ expect(service.modelInformations[4].values).toEqual(['37.0']);
+
+ expect(service.modelInformations[5].label).toEqual("Description");
+ expect(service.modelInformations[5].values).toEqual(['ECOMP generic virtual link (network) base type for all other service-level and global networks']);
+
+ expect(service.modelInformations[6].label).toEqual("Category");
+ expect(service.modelInformations[6].values).toEqual([undefined]);
+
+ expect(service.modelInformations[7].label).toEqual("Sub Category");
+ expect(service.modelInformations[7].values).toEqual([undefined]);
+
+ expect(service.modelInformations[8].label).toEqual("UUID");
+ expect(service.modelInformations[8].values).toEqual(['ddc3f20c-08b5-40fd-af72-c6d14636b986']);
+
+ expect(service.modelInformations[9].label).toEqual("Invariant UUID");
+ expect(service.modelInformations[9].values).toEqual(['379f816b-a7aa-422f-be30-17114ff50b7c']);
+
+ expect(service.modelInformations[10].label).toEqual("Service type");
+ expect(service.modelInformations[10].values).toEqual(['']);
+
+ expect(service.modelInformations[11].label).toEqual("Service role");
+ expect(service.modelInformations[11].values).toEqual(['']);
+
+ expect(service.modelInformations[12].label).toEqual('Network roles');
+ expect(service.modelInformations[12].values).toEqual( ['network role 1', ' network role 2']);
+ });
+
+
+ test('onCancel should trigger closeDialogEvent and iframe', () => {
+ let that = <any>{
+ parentElementClassName: 'content',
+ _iframeService: iframeService
+ };
+ jest.spyOn(iframeService, 'removeClassCloseModal');
+ jest.spyOn(service.closeDialogEvent, 'next');
+
+ service.onCancel(that, fb.group({}));
+
+ expect(that._iframeService.removeClassCloseModal).toHaveBeenCalledWith(that.parentElementClassName)
+ expect(service.closeDialogEvent.next).toHaveBeenCalledWith(that);
+ });
+
+ test('onSubmit should trigger onCancel', () => {
+ let that = <any>{
+ parentElementClassName: 'content',
+ _iframeService: iframeService,
+ storeNetwork: () => {
+ },
+ serviceModel: {
+ uuid: 'someUUID'
+ }
+ };
+ let form = fb.group({});
+ jest.spyOn(service, 'onCancel');
+ jest.spyOn(that, 'storeNetwork');
+ jest.spyOn(window.parent, 'postMessage');
+
+ service.onSubmit(that, form);
+
+ expect(service.onCancel).toHaveBeenCalledWith(that, form);
+ expect(that.storeNetwork).toHaveBeenCalledWith(that, form.value);
+ expect(window.parent.postMessage).toHaveBeenCalledWith({
+ eventId: 'submitIframe',
+ data: {
+ serviceModelId: 'someUUID'
+ }
+ }, "*");
+ });
+});
diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/network/network.popup.service.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/network/network.popup.service.ts
new file mode 100644
index 000000000..7f32360f5
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/network/network.popup.service.ts
@@ -0,0 +1,150 @@
+import {Injectable} from "@angular/core";
+import {FormPopupDetails, PopupType} from "../../../../models/formControlModels/formPopupDetails.model";
+import {BasicControlGenerator} from "../../../genericForm/formControlsServices/basic.control.generator";
+import {NetworkInstance} from "../../../../models/networkInstance";
+import {AppState} from "../../../../store/reducers";
+import {NgRedux} from "@angular-redux/store";
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import {NetworkControlGenerator} from "../../../genericForm/formControlsServices/networkGenerator/network.control.generator";
+import {ModelInformationItem} from "../../../model-information/model-information.component";
+import {Constants} from "../../../../utils/constants";
+import {AaiService} from "../../../../services/aaiService/aai.service";
+import {ServiceModel} from "../../../../models/serviceModel";
+import {FormGroup} from "@angular/forms";
+import {ModelInfo} from "../../../../models/modelInfo";
+import {IframeService} from "../../../../utils/iframe.service";
+import {GenericPopupInterface} from "../generic-popup.interface";
+import {Subject} from "rxjs/Subject";
+import {DefaultDataGeneratorService} from "../../../../services/defaultDataServiceGenerator/default.data.generator.service";
+import * as _ from 'lodash';
+import {BasicPopupService} from "../basic.popup.service";
+import {changeInstanceCounter} from "../../../../storeUtil/utils/general/general.actions";
+import {createNetworkInstance, updateNetworkInstance} from "../../../../storeUtil/utils/network/network.actions";
+
+@Injectable()
+export class NetworkPopupService implements GenericPopupInterface {
+ dynamicInputs: any;
+ instance: any;
+ model: any;
+ serviceModel: ServiceModel;
+ modelInformations: ModelInformationItem[] = [];
+ uuidData: Object;
+ closeDialogEvent: Subject<any> = new Subject<any>();
+ isUpdateMode: boolean;
+
+
+ constructor(private _basicControlGenerator: BasicControlGenerator,
+ private _networkControlGenerator: NetworkControlGenerator,
+ private _iframeService: IframeService,
+ private _defaultDataGeneratorService: DefaultDataGeneratorService,
+ private _aaiService: AaiService,
+ private _basicPopupService : BasicPopupService,
+ private _store: NgRedux<AppState>) {
+ }
+
+ getInstance(serviceId: string, networkName: string, networkStoreKey: string): any {
+ if (_.isNil(networkStoreKey)) {
+ return new NetworkInstance();
+ }
+ return this._store.getState().service.serviceInstance[serviceId].networks[networkStoreKey];
+ }
+
+ getGenericFormPopupDetails(serviceId: string, networkName: string, networkStoreKey: string, node: ITreeNode, uuidData: Object, isUpdateMode: boolean): FormPopupDetails {
+ this.uuidData = uuidData;
+ this.instance = this.getInstance(serviceId, networkName, networkStoreKey);
+
+
+ this.getModelInformation(serviceId, networkName);
+
+ return new FormPopupDetails(this,
+ PopupType.NETWORK_MACRO,
+ uuidData,
+ this.getTitle(isUpdateMode),
+ this.getSubLeftTitle(),
+ this.getSubRightTitle(),
+ this.getControls(serviceId, networkName, networkStoreKey, isUpdateMode),
+ this._basicPopupService.getDynamicInputs(serviceId,networkName, networkStoreKey, 'networks'),
+ this.modelInformations,
+ (that, form: FormGroup) => {that.onSubmit(that, form);},
+ (that: any, form: FormGroup) => {that.onCancel(that, form); }
+ );
+ }
+
+ getModelInformation(serviceId: string, networkName: string) {
+ this._aaiService.getServiceModelById(serviceId).subscribe((result: any) => {
+ this.serviceModel = new ServiceModel(result);
+ this.model = this._basicPopupService.getModelFromResponse(result, 'networks', networkName);
+
+ const serviceInstance = this._store.getState().service.serviceInstance[serviceId];
+ this.modelInformations = [
+ new ModelInformationItem("Subscriber Name", "subscriberName", [this._basicPopupService.extractSubscriberNameBySubscriberId(serviceInstance.globalSubscriberId)], "", true),
+ new ModelInformationItem("Service Name", "serviceModelName", [this.serviceModel.name], "", true),
+ new ModelInformationItem("Service Instance Name", "serviceName", [serviceInstance.instanceName], "", false),
+ new ModelInformationItem("Model Name", "modelName", [this.model.name], "", true),
+ new ModelInformationItem("Model version", "modelVersion", [this.model.version], "", true),
+ new ModelInformationItem("Description", "description", [this.model.description]),
+ new ModelInformationItem("Category", "category", [this.model.category]),
+ new ModelInformationItem("Sub Category", "subCategory", [this.model.subCategory]),
+ new ModelInformationItem("UUID", "uuid", [this.model.uuid], Constants.ServicePopup.TOOLTIP_UUID, true),
+ new ModelInformationItem("Invariant UUID", "invariantUuid", [this.model.invariantUuid], Constants.ServicePopup.TOOLTIP_INVARIANT_UUID, true),
+ new ModelInformationItem("Service type", "serviceType", [this.serviceModel.serviceType]),
+ new ModelInformationItem("Service role", "serviceRole", [this.serviceModel.serviceRole]),
+ new ModelInformationItem("Network roles", "network-role", this.model.roles, "", false)
+ ];
+ });
+ }
+
+ getControls(serviceId: string, networkName: string, networkStoreKey: string, isUpdateMode: boolean) {
+ if (this._store.getState().service.serviceHierarchy[serviceId].service.instantiationType === 'Macro') {
+ return this._networkControlGenerator.getMacroFormControls(serviceId, networkStoreKey, networkName, isUpdateMode);
+ } else {
+ return this._networkControlGenerator.getAlaCarteFormControls(serviceId, networkStoreKey, networkName, isUpdateMode);
+ }
+ }
+
+
+ onSubmit(that, form: FormGroup) {
+ form.value['instanceParams'] = form.value['instanceParams'] && [form.value['instanceParams']];
+ that.storeNetwork(that, form.value);
+ window.parent.postMessage({
+ eventId: 'submitIframe',
+ data: {
+ serviceModelId: that.serviceModel.uuid
+ }
+ }, "*");
+ this.onCancel(that, form);
+ }
+
+
+ onCancel(that, form) {
+ form.reset();
+ that._iframeService.removeClassCloseModal('content');
+ this.closeDialogEvent.next(that);
+ }
+
+ storeNetwork = (that, formValues: any): void => {
+ formValues.modelInfo = new ModelInfo(that.model);
+ formValues.uuid = formValues.modelInfo.uuid;
+ formValues.isMissingData = false;
+
+ if (!that.uuidData.networkStoreKey) {
+ this._store.dispatch(changeInstanceCounter(formValues.modelInfo.modelUniqueId , that.uuidData.serviceId, 1, <any>{data: {type: 'Network'}}));
+ this._store.dispatch(createNetworkInstance(formValues, that.uuidData.networkId, that.uuidData.serviceId, that.uuidData.networkId));
+ } else {
+ this._store.dispatch(updateNetworkInstance(formValues, that.uuidData.networkId, that.uuidData.serviceId, that.uuidData.networkStoreKey));
+ }
+ };
+
+
+ getTitle(isUpdateMode : boolean) : string {
+ return isUpdateMode ? 'Edit Network' : 'Set new Network';
+ }
+
+ getSubLeftTitle(): string {
+ return this.uuidData['networkId'];
+ }
+
+ getSubRightTitle(): string {
+ return "Network Instance Details";
+ }
+}
diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/service/service.popup.service.spec.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/service/service.popup.service.spec.ts
new file mode 100644
index 000000000..64f47a3fc
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/service/service.popup.service.spec.ts
@@ -0,0 +1,2439 @@
+import {LogService} from "../../../../utils/log/log.service";
+import {ReflectiveInjector} from "@angular/core";
+import {NgRedux} from "@angular-redux/store";
+import {BasicControlGenerator} from "../../../genericForm/formControlsServices/basic.control.generator";
+import {AaiService} from "../../../../services/aaiService/aai.service";
+import {HttpClient} from "@angular/common/http";
+import {GenericFormService} from "../../../genericForm/generic-form.service";
+import {FormBuilder} from "@angular/forms";
+import {IframeService} from "../../../../utils/iframe.service";
+import {DefaultDataGeneratorService} from "../../../../services/defaultDataServiceGenerator/default.data.generator.service";
+import {BasicPopupService} from "../basic.popup.service";
+import {ServicePopupService} from "./service.popup.service";
+import {ServiceControlGenerator} from "../../../genericForm/formControlsServices/service.control.generator";
+import {FormControlModel} from "../../../../models/formControlModels/formControl.model";
+import {SdcUiServices} from "onap-ui-angular";
+import {FeatureFlagsService} from "../../../../services/featureFlag/feature-flags.service";
+import {getTestBed, TestBed} from "@angular/core/testing";
+
+class MockModalService<T> {}
+
+class MockAppStore<T> {}
+
+class MockReduxStore<T> {
+ getState() {
+ return {
+ "global": {
+ "name": null,
+ "flags": {
+ "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false,
+ "FLAG_SHOW_ASSIGNMENTS": true,
+ "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
+ "FLAG_UNASSIGN_SERVICE": true,
+ "FLAG_SHOW_VERIFY_SERVICE": false,
+ "FLAG_COLLECTION_RESOURCE_SUPPORT": true,
+ "FLAG_DUPLICATE_VNF": true,
+ "FLAG_SERVICE_MODEL_CACHE": true,
+ "FLAG_ADVANCED_PORTS_FILTER": true,
+ "CREATE_INSTANCE_TEST": false,
+ "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false,
+ "FLAG_REGION_ID_FROM_REMOTE": true,
+ "FLAG_ASYNC_INSTANTIATION": true,
+ "FLAG_ASYNC_JOBS": true,
+ "EMPTY_DRAWING_BOARD_TEST": false,
+ "FLAG_ADD_MSO_TESTAPI_FIELD": true
+ },
+ "type": "[FLAGS] Update"
+ },
+ "service": {
+ "serviceHierarchy": {
+ "6e59c5de-f052-46fa-aa7e-2fca9d674c44": {
+ "service": {
+ "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "name": "ComplexService",
+ "version": "1.0",
+ "toscaModelURL": null,
+ "category": "Emanuel",
+ "serviceType": "",
+ "serviceRole": "",
+ "description": "ComplexService",
+ "serviceEcompNaming": "false",
+ "instantiationType": "Macro",
+ "inputs": {
+ "2017488_adiodvpe0_ASN_1": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "2017488_adiodvpe0_ASN_2": {
+ "type": "number",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": 2
+ },
+ "2017488_adiodvpe0_ASN_3": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": false,
+ "default": "AV_vPE"
+ },
+ "2017488_adiodvpe0_ASN_4": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE_123"
+ }
+ }
+ },
+ "vnfs": {
+ "VF_vMee 0": {
+ "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60",
+ "invariantUuid": "4160458e-f648-4b30-a176-43881ffffe9e",
+ "description": "VSP_vMee",
+ "name": "VF_vMee",
+ "version": "2.0",
+ "customizationUuid": "91415b44-753d-494c-926a-456a9172bbb9",
+ "inputs": {},
+ "commands": {},
+ "properties": {
+ "max_instances": 10,
+ "min_instances": 1,
+ "gpb2_Internal2_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-ipv6-egress_src_start_port": "0",
+ "sctp-a-ipv6-egress_rule_application": "any",
+ "Internal2_allow_transit": "true",
+ "sctp-b-IPv6_ethertype": "IPv6",
+ "sctp-a-egress_rule_application": "any",
+ "sctp-b-ingress_action": "pass",
+ "sctp-b-ingress_rule_protocol": "icmp",
+ "ncb2_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-ipv6-ingress-src_start_port": "0.0",
+ "ncb1_Internal2_mac": "00:11:22:EF:AC:DF",
+ "fsb_volume_size_0": "320.0",
+ "sctp-b-egress_src_addresses": "local",
+ "sctp-a-ipv6-ingress_ethertype": "IPv4",
+ "sctp-a-ipv6-ingress-dst_start_port": "0",
+ "sctp-b-ipv6-ingress_rule_application": "any",
+ "domain_name": "default-domain",
+ "sctp-a-ingress_rule_protocol": "icmp",
+ "sctp-b-egress-src_start_port": "0.0",
+ "sctp-a-egress_src_addresses": "local",
+ "sctp-b-display_name": "epc-sctp-b-ipv4v6-sec-group",
+ "sctp-a-egress-src_start_port": "0.0",
+ "sctp-a-ingress_ethertype": "IPv4",
+ "sctp-b-ipv6-ingress-dst_end_port": "65535",
+ "sctp-b-dst_subnet_prefix_v6": "::",
+ "nf_naming": "{ecomp_generated_naming=true}",
+ "sctp-a-ipv6-ingress_src_subnet_prefix": "0.0.0.0",
+ "sctp-b-egress-dst_start_port": "0.0",
+ "ncb_flavor_name": "nv.c20r64d1",
+ "gpb1_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-egress_dst_subnet_prefix_len": "0.0",
+ "Internal2_net_cidr": "10.0.0.10",
+ "sctp-a-ingress-dst_start_port": "0.0",
+ "sctp-a-egress-dst_start_port": "0.0",
+ "fsb1_Internal2_mac": "00:11:22:EF:AC:DF",
+ "sctp-a-egress_ethertype": "IPv4",
+ "vlc_st_service_mode": "in-network-nat",
+ "sctp-a-ipv6-egress_ethertype": "IPv4",
+ "sctp-a-egress-src_end_port": "65535.0",
+ "sctp-b-ipv6-egress_rule_application": "any",
+ "sctp-b-egress_action": "pass",
+ "sctp-a-ingress-src_subnet_prefix_len": "0.0",
+ "sctp-b-ipv6-ingress-src_end_port": "65535.0",
+ "sctp-b-name": "epc-sctp-b-ipv4v6-sec-group",
+ "fsb2_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-a-ipv6-ingress-src_start_port": "0.0",
+ "sctp-b-ipv6-egress_ethertype": "IPv4",
+ "Internal1_net_cidr": "10.0.0.10",
+ "sctp-a-egress_dst_subnet_prefix": "0.0.0.0",
+ "fsb_flavor_name": "nv.c20r64d1",
+ "sctp_rule_protocol": "132",
+ "sctp-b-ipv6-ingress_src_subnet_prefix_len": "0",
+ "sctp-a-ipv6-ingress_rule_application": "any",
+ "ecomp_generated_naming": "false",
+ "sctp-a-IPv6_ethertype": "IPv6",
+ "vlc2_Internal1_mac": "00:11:22:EF:AC:DF",
+ "vlc_st_virtualization_type": "virtual-machine",
+ "sctp-b-ingress-dst_start_port": "0.0",
+ "sctp-b-ingress-dst_end_port": "65535.0",
+ "sctp-a-ipv6-ingress-src_end_port": "65535.0",
+ "sctp-a-display_name": "epc-sctp-a-ipv4v6-sec-group",
+ "sctp-b-ingress_rule_application": "any",
+ "int2_sec_group_name": "int2-sec-group",
+ "vlc_flavor_name": "nd.c16r64d1",
+ "sctp-b-ipv6-egress_src_addresses": "local",
+ "vlc_st_interface_type_int1": "other1",
+ "sctp-b-egress-src_end_port": "65535.0",
+ "sctp-a-ipv6-egress-dst_start_port": "0",
+ "vlc_st_interface_type_int2": "other2",
+ "sctp-a-ipv6-egress_rule_protocol": "any",
+ "Internal2_shared": "false",
+ "sctp-a-ipv6-egress_dst_subnet_prefix_len": "0",
+ "Internal2_rpf": "disable",
+ "vlc1_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-ipv6-egress_src_end_port": "65535",
+ "sctp-a-ipv6-egress_src_addresses": "local",
+ "sctp-a-ingress-dst_end_port": "65535.0",
+ "sctp-a-ipv6-egress_src_end_port": "65535",
+ "Internal1_forwarding_mode": "l2",
+ "Internal2_dhcp": "false",
+ "sctp-a-dst_subnet_prefix_v6": "::",
+ "pxe_image_name": "MME_PXE-Boot_16ACP04_GA.qcow2",
+ "vlc_st_interface_type_gtp": "other0",
+ "ncb1_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-src_subnet_prefix_v6": "::",
+ "sctp-a-egress_dst_subnet_prefix_len": "0.0",
+ "int1_sec_group_name": "int1-sec-group",
+ "Internal1_dhcp": "false",
+ "sctp-a-ipv6-egress_dst_end_port": "65535",
+ "Internal2_forwarding_mode": "l2",
+ "fsb2_Internal2_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-egress_dst_subnet_prefix": "0.0.0.0",
+ "Internal1_net_cidr_len": "17",
+ "gpb2_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-ingress-src_subnet_prefix_len": "0.0",
+ "sctp-a-ingress_dst_addresses": "local",
+ "sctp-a-egress_action": "pass",
+ "fsb_volume_type_0": "SF-Default-SSD",
+ "ncb2_Internal2_mac": "00:11:22:EF:AC:DF",
+ "vlc_st_interface_type_sctp_a": "left",
+ "vlc_st_interface_type_sctp_b": "right",
+ "sctp-a-src_subnet_prefix_v6": "::",
+ "vlc_st_version": "2",
+ "sctp-b-egress_ethertype": "IPv4",
+ "sctp-a-ingress_rule_application": "any",
+ "gpb1_Internal2_mac": "00:11:22:EF:AC:DF",
+ "instance_ip_family_v6": "v6",
+ "sctp-a-ipv6-egress_src_start_port": "0",
+ "sctp-b-ingress-src_start_port": "0.0",
+ "sctp-b-ingress_dst_addresses": "local",
+ "fsb1_Internal1_mac": "00:11:22:EF:AC:DF",
+ "vlc_st_interface_type_oam": "management",
+ "multi_stage_design": "true",
+ "oam_sec_group_name": "oam-sec-group",
+ "Internal2_net_gateway": "10.0.0.10",
+ "sctp-a-ipv6-ingress-dst_end_port": "65535",
+ "sctp-b-ipv6-egress-dst_start_port": "0",
+ "Internal1_net_gateway": "10.0.0.10",
+ "sctp-b-ipv6-egress_rule_protocol": "any",
+ "gtp_sec_group_name": "gtp-sec-group",
+ "sctp-a-ipv6-egress_dst_subnet_prefix": "0.0.0.0",
+ "sctp-b-ipv6-egress_dst_subnet_prefix_len": "0",
+ "sctp-a-ipv6-ingress_dst_addresses": "local",
+ "sctp-a-egress_rule_protocol": "icmp",
+ "sctp-b-ipv6-egress_action": "pass",
+ "sctp-a-ipv6-egress_action": "pass",
+ "Internal1_shared": "false",
+ "sctp-b-ipv6-ingress_rule_protocol": "any",
+ "Internal2_net_cidr_len": "17",
+ "sctp-a-name": "epc-sctp-a-ipv4v6-sec-group",
+ "sctp-a-ingress-src_end_port": "65535.0",
+ "sctp-b-ipv6-ingress_src_subnet_prefix": "0.0.0.0",
+ "sctp-a-egress-dst_end_port": "65535.0",
+ "sctp-a-ingress_action": "pass",
+ "sctp-b-egress_rule_protocol": "icmp",
+ "sctp-b-ipv6-ingress_action": "pass",
+ "vlc_st_service_type": "firewall",
+ "sctp-b-ipv6-egress_dst_end_port": "65535",
+ "sctp-b-ipv6-ingress-dst_start_port": "0",
+ "vlc2_Internal2_mac": "00:11:22:EF:AC:DF",
+ "vlc_st_availability_zone": "true",
+ "fsb_volume_image_name_1": "MME_FSB2_16ACP04_GA.qcow2",
+ "sctp-b-ingress-src_subnet_prefix": "0.0.0.0",
+ "sctp-a-ipv6-ingress_src_subnet_prefix_len": "0",
+ "Internal1_allow_transit": "true",
+ "gpb_flavor_name": "nv.c20r64d1",
+ "availability_zone_max_count": "1",
+ "fsb_volume_image_name_0": "MME_FSB1_16ACP04_GA.qcow2",
+ "sctp-b-ipv6-ingress_dst_addresses": "local",
+ "sctp-b-ipv6-egress_dst_subnet_prefix": "0.0.0.0",
+ "sctp-b-ipv6-ingress_ethertype": "IPv4",
+ "vlc1_Internal2_mac": "00:11:22:EF:AC:DF",
+ "sctp-a-ingress-src_subnet_prefix": "0.0.0.0",
+ "sctp-a-ipv6-ingress_action": "pass",
+ "Internal1_rpf": "disable",
+ "sctp-b-ingress_ethertype": "IPv4",
+ "sctp-b-egress_rule_application": "any",
+ "sctp-b-ingress-src_end_port": "65535.0",
+ "sctp-a-ipv6-ingress_rule_protocol": "any",
+ "sctp-a-ingress-src_start_port": "0.0",
+ "sctp-b-egress-dst_end_port": "65535.0"
+ },
+ "type": "VF",
+ "modelCustomizationName": "VF_vMee 0",
+ "vfModules": {
+ "vf_vmee0..VfVmee..vmme_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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..vmme_vlc..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "vmme_vlc"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ },
+ "vf_vmee0..VfVmee..vmme_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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..vmme_gpb..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "vmme_gpb"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "vf_vmee0..VfVmee..base_vmme..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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "base_vmme"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "vf_vmee0..VfVmee..base_vmme..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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "base_vmme"
+ },
+ "inputs": {}
+ }
+ },
+ "vfcInstanceGroups": {}
+ }
+ },
+ "networks": {
+ "ExtVL 0": {
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ "invariantUuid": "379f816b-a7aa-422f-be30-17114ff50b7c",
+ "description": "ECOMP generic virtual link (network) base type for all other service-level and global networks",
+ "name": "ExtVL",
+ "version": "37.0",
+ "customizationUuid": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+ "inputs": {},
+ "commands": {},
+ "properties": {
+ "netowrk_role": "role 1, role 2, role 3",
+ "network_assignments": "{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}",
+ "exVL_naming": "{ecomp_generated_naming=true}",
+ "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}",
+ "network_homing": "{ecomp_selected_instance_node_target=false}"
+ },
+ "type": "VL",
+ "modelCustomizationName": "ExtVL 0"
+ }
+ },
+ "collectionResource": {},
+ "configurations": {
+ "Port Mirroring Configuration By Policy 0": {
+ "uuid": "b4398538-e89d-4f13-b33d-ca323434ba50",
+ "invariantUuid": "6ef0ca40-f366-4897-951f-abd65d25f6f7",
+ "description": "A port mirroring configuration by policy object",
+ "name": "Port Mirroring Configuration By Policy",
+ "version": "27.0",
+ "customizationUuid": "3c3b7b8d-8669-4b3b-8664-61970041fad2",
+ "inputs": {},
+ "commands": {},
+ "properties": {},
+ "type": "Configuration",
+ "modelCustomizationName": "Port Mirroring Configuration By Policy 0",
+ "sourceNodes": [],
+ "collectorNodes": null,
+ "configurationByPolicy": false
+ }
+ },
+ "serviceProxies": {},
+ "vfModules": {
+ "vf_vmee0..VfVmee..vmme_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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..vmme_vlc..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "vmme_vlc"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ },
+ "vf_vmee0..VfVmee..vmme_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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..vmme_gpb..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "vmme_gpb"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "vf_vmee0..VfVmee..base_vmme..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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "base_vmme"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "vf_vmee0..VfVmee..base_vmme..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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "base_vmme"
+ },
+ "inputs": {}
+ }
+ },
+ "pnfs": {}
+ },
+ "6b528779-44a3-4472-bdff-9cd15ec93450": {
+ "service": {
+ "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+ "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "name": "action-data",
+ "version": "1.0",
+ "toscaModelURL": null,
+ "category": "some category",
+ "serviceType": "some service type",
+ "serviceRole": "some service role",
+ "description": "some description",
+ "serviceEcompNaming": "false",
+ "instantiationType": "A-La-Carte",
+ "inputs": {
+ "2017488_adiodvpe0_ASN_1": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "2017488_adiodvpe0_ASN_2": {
+ "type": "number",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": 2
+ },
+ "2017488_adiodvpe0_ASN_3": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": false,
+ "default": "AV_vPE"
+ },
+ "2017488_adiodvpe0_ASN_4": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE_123"
+ }
+ }
+ },
+ "vnfs": {
+ "2017-388_ADIOD-vPE 1": {
+ "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413",
+ "invariantUuid": "00beb8f9-6d39-452f-816d-c709b9cbb87d",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-388_ADIOD-vPE",
+ "version": "1.0",
+ "customizationUuid": "280dec31-f16d-488b-9668-4aae55d6648a",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {
+ "vnf_config_template_version": {
+ "displayName": "vnf_config_template_version",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_config_template_version"
+ },
+ "bandwidth_units": {
+ "displayName": "bandwidth_units",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth_units"
+ },
+ "bandwidth": {"displayName": "bandwidth", "command": "get_input", "inputName": "adiodvpe0_bandwidth"},
+ "AIC_CLLI": {
+ "displayName": "AIC_CLLI",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_AIC_CLLI"
+ },
+ "ASN": {"displayName": "ASN", "command": "get_input", "inputName": "2017488_adiodvpe0_ASN"},
+ "vnf_instance_name": {
+ "displayName": "vnf_instance_name",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_instance_name"
+ }
+ },
+ "properties": {
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=false}",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "false",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VF",
+ "modelCustomizationName": "2017-388_ADIOD-vPE 1",
+ "vfModules": {},
+ "volumeGroups": {},
+ "vfcInstanceGroups": {}
+ },
+ "2017-388_ADIOD-vPE 0": {
+ "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168",
+ "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-388_ADIOD-vPE",
+ "version": "4.0",
+ "customizationUuid": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {
+ "vnf_config_template_version": {
+ "displayName": "vnf_config_template_version",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_config_template_version"
+ },
+ "bandwidth_units": {
+ "displayName": "bandwidth_units",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth_units"
+ },
+ "bandwidth": {"displayName": "bandwidth", "command": "get_input", "inputName": "adiodvpe0_bandwidth"},
+ "AIC_CLLI": {
+ "displayName": "AIC_CLLI",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_AIC_CLLI"
+ },
+ "ASN": {"displayName": "ASN", "command": "get_input", "inputName": "2017488_adiodvpe0_ASN"},
+ "vnf_instance_name": {
+ "displayName": "vnf_instance_name",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_instance_name"
+ }
+ },
+ "properties": {
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=false}",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "min_instances": "1",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "false",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VF",
+ "modelCustomizationName": "2017-388_ADIOD-vPE 0",
+ "vfModules": {},
+ "volumeGroups": {},
+ "vfcInstanceGroups": {}
+ },
+ "2017-488_ADIOD-vPE 0": {
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-488_ADIOD-vPE",
+ "version": "5.0",
+ "customizationUuid": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {
+ "vnf_config_template_version": {
+ "displayName": "vnf_config_template_version",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_config_template_version"
+ },
+ "bandwidth_units": {
+ "displayName": "bandwidth_units",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth_units"
+ },
+ "bandwidth": {"displayName": "bandwidth", "command": "get_input", "inputName": "adiodvpe0_bandwidth"},
+ "AIC_CLLI": {
+ "displayName": "AIC_CLLI",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_AIC_CLLI"
+ },
+ "ASN": {"displayName": "ASN", "command": "get_input", "inputName": "2017488_adiodvpe0_ASN"},
+ "vnf_instance_name": {
+ "displayName": "vnf_instance_name",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_instance_name"
+ }
+ },
+ "properties": {
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=false}",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "max_instances": "3",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "min_instances": "1",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "false",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VF",
+ "modelCustomizationName": "2017-488_ADIOD-vPE 0",
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV"
+ },
+ "inputs": {
+ "adiodvpe0_bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "2017488_adiodvpe0_vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ },
+ "2017488_adiodvpe0_vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "2017488_adiodvpe0_AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "AIC_CLLI"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "adiodvpe0_bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ }
+ },
+ "volumeGroupAllowed": true
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+ "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+ "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+ "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "version": "5",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "ADIOD_base_vPE_BV"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV"
+ },
+ "inputs": {
+ "adiodvpe0_bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "2017488_adiodvpe0_vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ },
+ "2017488_adiodvpe0_vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "2017488_adiodvpe0_AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "AIC_CLLI"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "adiodvpe0_bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ }
+ }
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV"
+ },
+ "inputs": {}
+ }
+ },
+ "vfcInstanceGroups": {}
+ }
+ },
+ "networks": {
+ "ExtVL 0": {
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ "invariantUuid": "379f816b-a7aa-422f-be30-17114ff50b7c",
+ "description": "ECOMP generic virtual link (network) base type for all other service-level and global networks",
+ "name": "ExtVL",
+ "version": "37.0",
+ "customizationUuid": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {},
+ "properties": {
+ "network_role" : "network role 1, network role 2",
+ "min_instances": 1,
+ "max_instances": 10,
+ "network_assignments": "{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}",
+ "exVL_naming": "{ecomp_generated_naming=true}",
+ "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}",
+ "network_homing": "{ecomp_selected_instance_node_target=false}"
+ },
+ "type": "VL",
+ "modelCustomizationName": "ExtVL 0"
+ }
+ },
+ "collectionResource": {},
+ "configurations": {},
+ "fabricConfigurations": {},
+ "serviceProxies": {},
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV"
+ },
+ "inputs": {
+ "adiodvpe0_bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "2017488_adiodvpe0_vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ },
+ "2017488_adiodvpe0_vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "2017488_adiodvpe0_AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {"sourceType": "HEAT", "vfModuleLabel": "ADIOD_vRE_BV", "paramName": "AIC_CLLI"},
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "adiodvpe0_bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ }
+ },
+ "volumeGroupAllowed": true
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+ "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+ "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+ "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "version": "5",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "ADIOD_base_vPE_BV"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV"
+ },
+ "inputs": {
+ "adiodvpe0_bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "2017488_adiodvpe0_vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ },
+ "2017488_adiodvpe0_vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "2017488_adiodvpe0_AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {"sourceType": "HEAT", "vfModuleLabel": "ADIOD_vRE_BV", "paramName": "AIC_CLLI"},
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "adiodvpe0_bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ }
+ }
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV"
+ },
+ "inputs": {}
+ }
+ },
+ "pnfs": {}
+ }
+ },
+ "serviceInstance": {
+ "6e59c5de-f052-46fa-aa7e-2fca9d674c44": {
+ "vnfs": {
+ "VF_vMee 0": {
+ "rollbackOnFailure": "true",
+ "vfModules": {
+ "vf_vmee0..VfVmee..base_vmme..module-0": {
+ "vf_vmee0..VfVmee..base_vmme..module-0vmvzo": {
+ "isMissingData": false,
+ "sdncPreReload": null,
+ "modelInfo": {
+ "modelType": "VFmodule",
+ "modelInvariantId": "a6f9e51a-2b35-416a-ae15-15e58d61f36d",
+ "modelVersionId": "a27f5cfc-7f12-4f99-af08-0af9c3885c87",
+ "modelName": "VfVmee..base_vmme..module-0",
+ "modelVersion": "2",
+ "modelCustomizationId": "f8c040f1-7e51-4a11-aca8-acf256cfd861",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0"
+ },
+ "instanceParams": [{}],
+ "trackById": "wmtm6sy2uj"
+ }
+ }
+ },
+ "isMissingData": true,
+ "originalName": "VF_vMee 0",
+ "vnfStoreKey": "VF_vMee 0",
+ "trackById": "p3wk448m5do",
+ "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60",
+ "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+ "lcpCloudRegionId": null,
+ "tenantId": null,
+ "lineOfBusiness": null,
+ "platformName": null,
+ "modelInfo": {
+ "modelType": "VF",
+ "modelInvariantId": "4160458e-f648-4b30-a176-43881ffffe9e",
+ "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ "modelName": "VF_vMee",
+ "modelVersion": "2.0",
+ "modelCustomizationName": "VF_vMee 0"
+ }
+ }
+ },
+ "networks": {},
+ "instanceParams": [{}],
+ "validationCounter": 1,
+ "existingNames": {},
+ "existingVNFCounterMap": {"d6557200-ecf2-4641-8094-5393ae3aae60": 1},
+ "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "subscriptionServiceType": "TYLER SILVIA",
+ "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+ "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+ "lcpCloudRegionId": "hvf6",
+ "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+ "aicZoneId": "JAG1",
+ "projectName": "x1",
+ "rollbackOnFailure": "true",
+ "bulkSize": 1,
+ "modelInfo": {
+ "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ "modelName": "ComplexService",
+ "modelVersion": "1.0",
+ "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44"
+ },
+ "isALaCarte": false,
+ "name": "ComplexService",
+ "version": "1.0",
+ "description": "ComplexService",
+ "category": "Emanuel",
+ "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "serviceType": "",
+ "serviceRole": "",
+ "isMultiStepDesign": false
+ },
+ "6b528779-44a3-4472-bdff-9cd15ec93450": {
+ "networks": {
+ "ExtVL 0": {
+ "rollbackOnFailure": "true",
+ "isMissingData": false,
+ "originalName": "ExtVL 0",
+ "networkStoreKey": "ExtVL 0",
+ "trackById": "sf3zth68xjf",
+ "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+ "lcpCloudRegionId": "hvf6",
+ "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+ "platformName": "xxx1",
+ "lineOfBusiness": "ONAP",
+ "instanceParams": [{}],
+ "modelInfo": {
+ "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c",
+ "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ "modelName": "ExtVL",
+ "modelVersion": "37.0",
+ "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+ "modelCustomizationName": "ExtVL 0",
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+ },
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+ },
+ "ExtVL 0:0001": {
+ "rollbackOnFailure": "true",
+ "isMissingData": false,
+ "originalName": "ExtVL 0",
+ "networkStoreKey": "ExtVL 0",
+ "trackById": "2mdxioxca9h",
+ "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+ "lcpCloudRegionId": "hvf6",
+ "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+ "platformName": "xxx1",
+ "lineOfBusiness": "ONAP",
+ "instanceParams": [{}],
+ "modelInfo": {
+ "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c",
+ "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ "modelName": "ExtVL",
+ "modelVersion": "37.0",
+ "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+ "modelCustomizationName": "ExtVL 0",
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+ },
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+ },
+ "ExtVL 0_1": {
+ "rollbackOnFailure": "true",
+ "isMissingData": false,
+ "originalName": "ExtVL 0",
+ "networkStoreKey": "ExtVL 0_1",
+ "trackById": "z7vd1gmpbs",
+ "instanceName": "ExtVL",
+ "productFamilyId": "17cc1042-527b-11e6-beb8-9e71128cae77",
+ "lcpCloudRegionId": "hvf6",
+ "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+ "platformName": "xxx1",
+ "lineOfBusiness": "zzz1",
+ "instanceParams": [{
+ "vnf_config_template_version": "17.2",
+ "bandwidth_units": "Gbps",
+ "bandwidth": "10",
+ "AIC_CLLI": "ATLMY8GA",
+ "ASN": "AV_vPE",
+ "vnf_instance_name": "yoav"
+ }],
+ "modelInfo": {
+ "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c",
+ "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ "modelName": "ExtVL",
+ "modelVersion": "37.0",
+ "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+ "modelCustomizationName": "ExtVL 0",
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+ },
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+ }
+ },
+ "vnfs": {
+ "2017-488_ADIOD-vPE 0": {
+ "rollbackOnFailure": "true",
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1sgoqi": {
+ "instanceName": "yoav",
+ "volumeGroupName": "123",
+ "modelInfo": {
+ "modelInvariantId": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "modelName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "modelVersion": "6",
+ "modelCustomizationId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5"
+ },
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "isMissingData": false,
+ "instanceParams": [{
+ "adiodvpe0_bandwidth": "10",
+ "2017488_adiodvpe0_vnf_instance_name": "mtnj309me6",
+ "2017488_adiodvpe0_vnf_config_template_version": "17.2",
+ "2017488_adiodvpe0_AIC_CLLI": "ATLMY8GA",
+ "adiodvpe0_bandwidth_units": "Gbps"
+ }]
+ }
+ }
+ },
+ "isMissingData": false,
+ "originalName": "2017-488_ADIOD-vPE 0",
+ "vnfStoreKey": "2017-488_ADIOD-vPE 0",
+ "trackById": "o65b26t2thj",
+ "instanceName": "2017488_ADIODvPE",
+ "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+ "lcpCloudRegionId": "hvf6",
+ "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054",
+ "platformName": "platform",
+ "lineOfBusiness": "ONAP",
+ "instanceParams": [{}],
+ "modelInfo": {
+ "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "modelVersionId": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "modelName": "2017-488_ADIOD-vPE",
+ "modelVersion": "5.0",
+ "modelCustomizationId": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+ "modelCustomizationName": "2017-488_ADIOD-vPE 0",
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09"
+ },
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09"
+ }
+ },
+ "instanceParams": [{"2017488_adiodvpe0_ASN": "AV_vPE"}],
+ "validationCounter": 0,
+ "existingNames": {"123": "", "instancename": "", "yoav": "", "extvl": ""},
+ "existingVNFCounterMap": {"69e09f68-8b63-4cc9-b9ff-860960b5db09": 1},
+ "existingNetworksCounterMap": {"ddc3f20c-08b5-40fd-af72-c6d14636b986": 3},
+ "instanceName": "InstanceName",
+ "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "subscriptionServiceType": "TYLER SILVIA",
+ "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+ "productFamilyId": "17cc1042-527b-11e6-beb8-9e71128cae77",
+ "lcpCloudRegionId": "JANET25",
+ "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+ "aicZoneId": "JAG1",
+ "projectName": null,
+ "rollbackOnFailure": "true",
+ "aicZoneName": "YUDFJULP-JAG1",
+ "owningEntityName": "WayneHolland",
+ "testApi": "GR_API",
+ "tenantName": "USP-SIP-IC-24335-T-01",
+ "bulkSize": 1,
+ "modelInfo": {
+ "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "modelVersionId": "6b528779-44a3-4472-bdff-9cd15ec93450",
+ "modelName": "action-data",
+ "modelVersion": "1.0",
+ "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450"
+ },
+ "isALaCarte": false,
+ "name": "action-data",
+ "version": "1.0",
+ "description": "",
+ "category": "",
+ "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+ "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "serviceType": "",
+ "serviceRole": "",
+ "isMultiStepDesign": false
+ }
+ },
+ "lcpRegionsAndTenants": {
+ "lcpRegionList": [{
+ "id": "JANET25",
+ "name": "JANET25",
+ "isPermitted": true
+ }, {"id": "hvf6", "name": "hvf6", "isPermitted": true}],
+ "lcpRegionsTenantsMap": {
+ "JANET25": [{
+ "id": "092eb9e8e4b7412e8787dd091bc58e86",
+ "name": "USP-SIP-IC-24335-T-01",
+ "isPermitted": true
+ }],
+ "hvf6": [{
+ "id": "bae71557c5bb4d5aac6743a4e5f1d054",
+ "name": "AIN Web Tool-15-D-testalexandria",
+ "isPermitted": true
+ }, {
+ "id": "229bcdc6eaeb4ca59d55221141d01f8e",
+ "name": "AIN Web Tool-15-D-STTest2",
+ "isPermitted": true
+ }, {
+ "id": "1178612d2b394be4834ad77f567c0af2",
+ "name": "AIN Web Tool-15-D-SSPtestcustome",
+ "isPermitted": true
+ }, {
+ "id": "19c5ade915eb461e8af52fb2fd8cd1f2",
+ "name": "AIN Web Tool-15-D-UncheckedEcopm",
+ "isPermitted": true
+ }, {
+ "id": "de007636e25249238447264a988a927b",
+ "name": "AIN Web Tool-15-D-dfsdf",
+ "isPermitted": true
+ }, {
+ "id": "62f29b3613634ca6a3065cbe0e020c44",
+ "name": "AIN/SMS-16-D-Multiservices1",
+ "isPermitted": true
+ }, {
+ "id": "649289e30d3244e0b48098114d63c2aa",
+ "name": "AIN Web Tool-15-D-SSPST66",
+ "isPermitted": true
+ }, {
+ "id": "3f21eeea6c2c486bba31dab816c05a32",
+ "name": "AIN Web Tool-15-D-ASSPST47",
+ "isPermitted": true
+ }, {
+ "id": "f60ce21d3ee6427586cff0d22b03b773",
+ "name": "CESAR-100-D-sspjg67246",
+ "isPermitted": true
+ }, {
+ "id": "8774659e425f479895ae091bb5d46560",
+ "name": "CESAR-100-D-sspjg68359",
+ "isPermitted": true
+ }, {
+ "id": "624eb554b0d147c19ff8885341760481",
+ "name": "AINWebTool-15-D-iftach",
+ "isPermitted": true
+ }, {
+ "id": "214f55f5fc414c678059c383b03e4962",
+ "name": "CESAR-100-D-sspjg612401",
+ "isPermitted": true
+ }, {
+ "id": "c90666c291664841bb98e4d981ff1db5",
+ "name": "CESAR-100-D-sspjg621340",
+ "isPermitted": true
+ }, {
+ "id": "ce5b6bc5c7b348e1bf4b91ac9a174278",
+ "name": "sspjg621351cloned",
+ "isPermitted": true
+ }, {
+ "id": "b386b768a3f24c8e953abbe0b3488c02",
+ "name": "AINWebTool-15-D-eteancomp",
+ "isPermitted": true
+ }, {
+ "id": "dc6c4dbfd225474e9deaadd34968646c",
+ "name": "AINWebTool-15-T-SPFET",
+ "isPermitted": true
+ }, {
+ "id": "02cb5030e9914aa4be120bd9ed1e19eb",
+ "name": "AINWebTool-15-X-eeweww",
+ "isPermitted": true
+ }, {
+ "id": "f2f3830e4c984d45bcd00e1a04158a79",
+ "name": "CESAR-100-D-spjg61909",
+ "isPermitted": true
+ }, {
+ "id": "05b91bd5137f4929878edd965755c06d",
+ "name": "CESAR-100-D-sspjg621512cloned",
+ "isPermitted": true
+ }, {
+ "id": "7002fbe8482d4a989ddf445b1ce336e0",
+ "name": "AINWebTool-15-X-vdr",
+ "isPermitted": true
+ }, {
+ "id": "4008522be43741dcb1f5422022a2aa0b",
+ "name": "AINWebTool-15-D-ssasa",
+ "isPermitted": true
+ }, {
+ "id": "f44e2e96a1b6476abfda2fa407b00169",
+ "name": "AINWebTool-15-D-PFNPT",
+ "isPermitted": true
+ }, {
+ "id": "b69a52bec8a84669a37a1e8b72708be7",
+ "name": "AINWebTool-15-X-vdre",
+ "isPermitted": true
+ }, {
+ "id": "fac7d9fd56154caeb9332202dcf2969f",
+ "name": "AINWebTool-15-X-NONPODECOMP",
+ "isPermitted": true
+ }, {
+ "id": "2d34d8396e194eb49969fd61ffbff961",
+ "name": "DN5242-Nov16-T5",
+ "isPermitted": true
+ }, {
+ "id": "cb42a77ff45b48a8b8deb83bb64acc74",
+ "name": "ro-T11",
+ "isPermitted": true
+ }, {
+ "id": "fa45ca53c80b492fa8be5477cd84fc2b",
+ "name": "ro-T112",
+ "isPermitted": true
+ }, {
+ "id": "4914ab0ab3a743e58f0eefdacc1dde77",
+ "name": "DN5242-Nov21-T1",
+ "isPermitted": true
+ }, {
+ "id": "d0a3e3f2964542259d155a81c41aadc3",
+ "name": "test-hvf6-09",
+ "isPermitted": true
+ }, {"id": "cbb99fe4ada84631b7baf046b6fd2044", "name": "DN5242-Nov16-T3", "isPermitted": true}]
+ }
+ },
+ "productFamilies": [{
+ "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+ "name": "SCOTTIE",
+ "isPermitted": true
+ }, {
+ "id": "17cc1042-527b-11e6-beb8-9e71128cae77",
+ "name": "IGNACIO",
+ "isPermitted": true
+ }, {
+ "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+ "name": "Christie",
+ "isPermitted": true
+ }, {
+ "id": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7",
+ "name": "Enhanced Services",
+ "isPermitted": true
+ }, {"id": "vTerrance", "name": "vTerrance", "isPermitted": true}, {
+ "id": "323d69d9-2efe-4r45-ay0a-89ea7ard4e6f",
+ "name": "vSCP",
+ "isPermitted": true
+ }, {
+ "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+ "name": "Emanuel",
+ "isPermitted": true
+ }, {
+ "id": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+ "name": "BVOIP",
+ "isPermitted": true
+ }, {"id": "db171b8f-115c-4992-a2e3-ee04cae357e0", "name": "LINDSEY", "isPermitted": true}, {
+ "id": "LRSI-OSPF",
+ "name": "LRSI-OSPF",
+ "isPermitted": true
+ }, {"id": "vRosemarie", "name": "HNGATEWAY", "isPermitted": true}, {
+ "id": "vHNPaas",
+ "name": "WILKINS",
+ "isPermitted": true
+ }, {
+ "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "name": "TYLER SILVIA",
+ "isPermitted": true
+ }, {"id": "b6a3f28c-eebf-494c-a900-055cc7c874ce", "name": "VROUTER", "isPermitted": true}, {
+ "id": "Cisneros",
+ "name": "vMuriel",
+ "isPermitted": true
+ }, {
+ "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1",
+ "name": "CARA Griffin",
+ "isPermitted": true
+ }, {
+ "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d",
+ "name": "DARREN MCGEE",
+ "isPermitted": true
+ }, {"id": "e30755dc-5673-4b6b-9dcf-9abdd96b93d1", "name": "Transport", "isPermitted": true}, {
+ "id": "vSalvatore",
+ "name": "vSalvatore",
+ "isPermitted": true
+ }, {"id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4", "name": "Josefina", "isPermitted": true}, {
+ "id": "vHubbard",
+ "name": "vHubbard",
+ "isPermitted": true
+ }, {"id": "12a96a9d-4b4c-4349-a950-fe1159602621", "name": "DARREN MCGEE", "isPermitted": true}],
+ "serviceTypes": {
+ "e433710f-9217-458d-a79d-1c7aff376d89": [{
+ "id": "0",
+ "name": "vRichardson",
+ "isPermitted": false
+ }, {"id": "1", "name": "TYLER SILVIA", "isPermitted": true}, {
+ "id": "2",
+ "name": "Emanuel",
+ "isPermitted": false
+ }, {"id": "3", "name": "vJamie", "isPermitted": false}, {
+ "id": "4",
+ "name": "vVoiceMail",
+ "isPermitted": false
+ }, {"id": "5", "name": "Kennedy", "isPermitted": false}, {
+ "id": "6",
+ "name": "vSEGW",
+ "isPermitted": false
+ }, {"id": "7", "name": "vVM", "isPermitted": false}, {
+ "id": "8",
+ "name": "vOTA",
+ "isPermitted": false
+ }, {"id": "9", "name": "vMME", "isPermitted": false}, {
+ "id": "10",
+ "name": "vMNS",
+ "isPermitted": false
+ }, {"id": "11", "name": "vSCP", "isPermitted": false}, {
+ "id": "12",
+ "name": "VPMS",
+ "isPermitted": false
+ }, {"id": "13", "name": "vMMSC", "isPermitted": false}, {
+ "id": "14",
+ "name": "SSD",
+ "isPermitted": false
+ }, {"id": "15", "name": "vMOG", "isPermitted": false}, {
+ "id": "16",
+ "name": "LINDSEY",
+ "isPermitted": false
+ }, {"id": "17", "name": "JOHANNA_SANTOS", "isPermitted": false}, {
+ "id": "18",
+ "name": "vCarroll",
+ "isPermitted": false
+ }]
+ },
+ "aicZones": [{"id": "NFT1", "name": "NFTJSSSS-NFT1"}, {"id": "JAG1", "name": "YUDFJULP-JAG1"}, {
+ "id": "YYY1",
+ "name": "UUUAIAAI-YYY1"
+ }, {"id": "BAN1", "name": "VSDKYUTP-BAN1"}, {"id": "DKJ1", "name": "DKJSJDKA-DKJ1"}, {
+ "id": "MCS1",
+ "name": "ASACMAMS-MCS1"
+ }, {"id": "UIO1", "name": "uioclli1-UIO1"}, {"id": "RAJ1", "name": "YGBIJNLQ-RAJ1"}, {
+ "id": "OPA1",
+ "name": "opaclli1-OPA1"
+ }, {"id": "SDE1", "name": "ZXCVBNMA-SDE1"}, {"id": "VEN2", "name": "FGHJUHIL-VEN2"}, {
+ "id": "ORL1",
+ "name": "ORLDFLMA-ORL1"
+ }, {"id": "JAD1", "name": "JADECLLI-JAD1"}, {"id": "ZXL1", "name": "LWLWCANN-ZXL1"}, {
+ "id": "CKL1",
+ "name": "CLKSKCKK-CKL1"
+ }, {"id": "SDF1", "name": "sdfclli1-SDF1"}, {"id": "RAD1", "name": "RADICAL1-RAD1"}, {
+ "id": "KIT1",
+ "name": "BHYJFGLN-KIT1"
+ }, {"id": "REL1", "name": "INGERFGT-REL1"}, {"id": "JNL1", "name": "CJALSDAC-JNL1"}, {
+ "id": "OLK1",
+ "name": "OLKOLKLS-OLK1"
+ }, {"id": "CHI1", "name": "CHILLIWE-CHI1"}, {"id": "UUU4", "name": "UUUAAAUU-UUU4"}, {
+ "id": "TUF1",
+ "name": "TUFCLLI1-TUF1"
+ }, {"id": "KJN1", "name": "CKALDKSA-KJN1"}, {"id": "SAM1", "name": "SNDGCA64-SAN1"}, {
+ "id": "SCK1",
+ "name": "SCKSCKSK-SCK1"
+ }, {"id": "HJH1", "name": "AOEEQQQD-HJH1"}, {"id": "HGD1", "name": "SDFQWHGD-HGD1"}, {
+ "id": "KOR1",
+ "name": "HYFLNBVT-KOR1"
+ }, {"id": "ATL43", "name": "AICLOCID-ATL43"}, {"id": "ATL54", "name": "AICFTAAI-ATL54"}, {
+ "id": "ATL66",
+ "name": "CLLIAAII-ATL66"
+ }, {"id": "VEL1", "name": "BNMLKUIK-VEL1"}, {"id": "ICC1", "name": "SANJITAT-ICC1"}, {
+ "id": "MNT11",
+ "name": "WSXEFBTH-MNT11"
+ }, {"id": "DEF2", "name": "WSBHGTYL-DEF2"}, {"id": "MAD11", "name": "SDFQWGKL-MAD11"}, {
+ "id": "OLG1",
+ "name": "OLHOLHOL-OLG1"
+ }, {"id": "GAR1", "name": "NGFVSJKO-GAR1"}, {"id": "SAN22", "name": "GNVLSCTL-SAN22"}, {
+ "id": "HRG1",
+ "name": "HRGHRGGS-HRG1"
+ }, {"id": "JCS1", "name": "JCSJSCJS-JCS1"}, {"id": "DHA12", "name": "WSXEDECF-DHA12"}, {
+ "id": "HJE1",
+ "name": "AOEEWWWD-HJE1"
+ }, {"id": "NCA1", "name": "NCANCANN-NCA1"}, {"id": "IOP1", "name": "iopclli1-IOP1"}, {
+ "id": "RTY1",
+ "name": "rtyclli1-RTY1"
+ }, {"id": "KAP1", "name": "HIOUYTRQ-KAP1"}, {"id": "ZEN1", "name": "ZENCLLI1-ZEN1"}, {
+ "id": "HKA1",
+ "name": "JAKHLASS-HKA1"
+ }, {"id": "CQK1", "name": "CQKSCAKK-CQK1"}, {"id": "SAI1", "name": "UBEKQLPD-SAI1"}, {
+ "id": "ERT1",
+ "name": "ertclli1-ERT1"
+ }, {"id": "IBB1", "name": "PLMKOIJU-IBB1"}, {"id": "TIR2", "name": "PLKINHYI-TIR2"}, {
+ "id": "HSD1",
+ "name": "CHASKCDS-HSD1"
+ }, {"id": "SLF78", "name": "SDCTLFN1-SLF78"}, {"id": "SEE78", "name": "SDCTEEE4-SEE78"}, {
+ "id": "SAN13",
+ "name": "TOKYJPFA-SAN13"
+ }, {"id": "SAA78", "name": "SDCTAAA1-SAA78"}, {"id": "LUC1", "name": "ATLDFGYC-LUC1"}, {
+ "id": "AMD13",
+ "name": "MEMATLAN-AMD13"
+ }, {"id": "TOR1", "name": "TOROONXN-TOR1"}, {"id": "QWE1", "name": "QWECLLI1-QWE1"}, {
+ "id": "ZOG1",
+ "name": "ZOGASTRO-ZOG1"
+ }, {"id": "CAL33", "name": "CALIFORN-CAL33"}, {"id": "SHH78", "name": "SDIT1HHH-SHH78"}, {
+ "id": "DSA1",
+ "name": "LKJHGFDS-DSA1"
+ }, {"id": "CLG1", "name": "CLGRABAD-CLG1"}, {"id": "BNA1", "name": "BNARAGBK-BNA1"}, {
+ "id": "ATL84",
+ "name": "CANTTCOC-ATL84"
+ }, {"id": "APP1", "name": "WBHGTYUI-APP1"}, {"id": "RJN1", "name": "RJNRBZAW-RJN1"}, {
+ "id": "EHH78",
+ "name": "SDCSHHH5-EHH78"
+ }, {"id": "mac10", "name": "PKGTESTF-mac10"}, {"id": "SXB78", "name": "SDCTGXB1-SXB78"}, {
+ "id": "SAX78",
+ "name": "SDCTAXG1-SAX78"
+ }, {"id": "SYD1", "name": "SYDNAUBV-SYD1"}, {"id": "TOK1", "name": "TOKYJPFA-TOK1"}, {
+ "id": "KGM2",
+ "name": "KGMTNC20-KGM2"
+ }, {"id": "DCC1b", "name": "POIUYTGH-DCC1b"}, {"id": "SKK78", "name": "SDCTKKK1-SKK78"}, {
+ "id": "SGG78",
+ "name": "SDCTGGG1-SGG78"
+ }, {"id": "SJJ78", "name": "SDCTJJJ1-SJJ78"}, {"id": "SBX78", "name": "SDCTBXG1-SBX78"}, {
+ "id": "LAG1",
+ "name": "LARGIZON-LAG1"
+ }, {"id": "IAA1", "name": "QAZXSWED-IAA1"}, {"id": "POI1", "name": "PLMNJKIU-POI1"}, {
+ "id": "LAG1a",
+ "name": "LARGIZON-LAG1a"
+ }, {"id": "PBL1", "name": "PBLAPBAI-PBL1"}, {"id": "LAG45", "name": "LARGIZON-LAG1a"}, {
+ "id": "MAR1",
+ "name": "MNBVCXZM-MAR1"
+ }, {"id": "HST70", "name": "HSTNTX70-HST70"}, {"id": "DCC1a", "name": "POIUYTGH-DCC1a"}, {
+ "id": "TOL1",
+ "name": "TOLDOH21-TOL1"
+ }, {"id": "LON1", "name": "LONEENCO-LON1"}, {"id": "SJU78", "name": "SDIT1JUB-SJU78"}, {
+ "id": "STN27",
+ "name": "HSTNTX01-STN27"
+ }, {"id": "SSW56", "name": "ss8126GT-SSW56"}, {"id": "SBB78", "name": "SDIT1BBB-SBB78"}, {
+ "id": "DCC3",
+ "name": "POIUYTGH-DCC3"
+ }, {"id": "GNV1", "name": "GNVLSCTL-GNV1"}, {"id": "WAS1", "name": "WASHDCSW-WAS1"}, {
+ "id": "TOY1",
+ "name": "TORYONNZ-TOY1"
+ }, {"id": "STT1", "name": "STTLWA02-STT1"}, {"id": "STG1", "name": "STTGGE62-STG1"}, {
+ "id": "SLL78",
+ "name": "SDCTLLL1-SLL78"
+ }, {"id": "SBU78", "name": "SDIT1BUB-SBU78"}, {"id": "ATL2", "name": "ATLNGANW-ATL2"}, {
+ "id": "BOT1",
+ "name": "BOTHWAKY-BOT1"
+ }, {"id": "SNG1", "name": "SNGPSIAU-SNG1"}, {"id": "NYC1", "name": "NYCMNY54-NYC1"}, {
+ "id": "LAG1b",
+ "name": "LARGIZON-LAG1b"
+ }, {"id": "AMD15", "name": "AMDFAA01-AMD15"}, {"id": "SNA1", "name": "SNANTXCA-SNA1"}, {
+ "id": "PLT1",
+ "name": "PLTNCA60-PLT1"
+ }, {"id": "TLP1", "name": "TLPNXM18-TLP1"}, {"id": "SDD81", "name": "SAIT1DD6-SDD81"}, {
+ "id": "DCC1",
+ "name": "POIUYTGH-DCC1"
+ }, {"id": "DCC2", "name": "POIUYTGH-DCC2"}, {"id": "OKC1", "name": "OKCBOK55-OKC1"}, {
+ "id": "PAR1",
+ "name": "PARSFRCG-PAR1"
+ }, {"id": "TES36", "name": "ABCEETES-TES36"}, {"id": "COM1", "name": "PLMKOPIU-COM1"}, {
+ "id": "ANI1",
+ "name": "ATLNGTRE-ANI1"
+ }, {"id": "SDG78", "name": "SDIT1BDG-SDG78"}, {"id": "mac20", "name": "PKGTESTF-mac20"}, {
+ "id": "DSF45",
+ "name": "DSFBG123-DSF45"
+ }, {"id": "HST25", "name": "HSTNTX01-HST25"}, {"id": "AMD18", "name": "AUDIMA01-AMD18"}, {
+ "id": "SAA80",
+ "name": "SAIT9AA3-SAA80"
+ }, {"id": "SSA56", "name": "SSIT2AA7-SSA56"}, {"id": "SDD82", "name": "SAIT1DD9-SDD82"}, {
+ "id": "JCV1",
+ "name": "JCVLFLBW-JCV1"
+ }, {"id": "SUL2", "name": "WERTYUJK-SUL2"}, {"id": "PUR1", "name": "purelyde-PUR1"}, {
+ "id": "FDE55",
+ "name": "FDERT555-FDE55"
+ }, {"id": "SITE", "name": "LONEENCO-SITE"}, {"id": "ATL1", "name": "ATLNGAMA-ATL1"}, {
+ "id": "JUL1",
+ "name": "ZXCVBNMM-JUL1"
+ }, {"id": "TAT34", "name": "TESAAISB-TAT34"}, {"id": "XCP12", "name": "CHKGH123-XCP12"}, {
+ "id": "RAI1",
+ "name": "poiuytre-RAI1"
+ }, {"id": "HPO1", "name": "ATLNGAUP-HPO1"}, {"id": "KJF12", "name": "KJFDH123-KJF12"}, {
+ "id": "SCC80",
+ "name": "SAIT9CC3-SCC80"
+ }, {"id": "SAA12", "name": "SAIT9AF8-SAA12"}, {"id": "SAA14", "name": "SAIT1AA9-SAA14"}, {
+ "id": "ATL35",
+ "name": "TTESSAAI-ATL35"
+ }, {"id": "CWY1", "name": "CWYMOWBS-CWY1"}, {"id": "ATL76", "name": "TELEPAAI-ATL76"}, {
+ "id": "DSL12",
+ "name": "DSLFK242-DSL12"
+ }, {"id": "ATL53", "name": "AAIATLTE-ATL53"}, {"id": "SAA11", "name": "SAIT9AA2-SAA11"}, {
+ "id": "ATL62",
+ "name": "TESSASCH-ATL62"
+ }, {"id": "AUG1", "name": "ASDFGHJK-AUG1"}, {"id": "POI22", "name": "POIUY123-POI22"}, {
+ "id": "SAA13",
+ "name": "SAIT1AA9-SAA13"
+ }, {"id": "BHY17", "name": "BHYTFRF3-BHY17"}, {"id": "LIS1", "name": "HOSTPROF-LIS1"}, {
+ "id": "SIP1",
+ "name": "ZXCVBNMK-SIP1"
+ }, {"id": "ATL99", "name": "TEESTAAI-ATL43"}, {"id": "ATL64", "name": "FORLOAAJ-ATL64"}, {
+ "id": "TAT33",
+ "name": "TESAAISA-TAT33"
+ }, {"id": "RAD10", "name": "INDIPUNE-RAD10"}, {"id": "RTW5", "name": "BHYTFRY4-RTW5"}, {
+ "id": "JGS1",
+ "name": "KSJKKKKK-JGS1"
+ }, {"id": "ATL98", "name": "TEESTAAI-ATL43"}, {"id": "WAN1", "name": "LEIWANGW-WAN1"}, {
+ "id": "ATL44",
+ "name": "ATLSANAB-ATL44"
+ }, {"id": "RTD2", "name": "BHYTFRk4-RTD2"}, {"id": "NIR1", "name": "ORFLMANA-NIR1"}, {
+ "id": "ATL75",
+ "name": "SANAAIRE-ATL75"
+ }, {"id": "NUM1", "name": "QWERTYUI-NUM1"}, {"id": "MTN32", "name": "MDTWNJ21-MTN32"}, {
+ "id": "RTZ4",
+ "name": "BHYTFRZ6-RTZ4"
+ }, {"id": "ATL56", "name": "ATLSANAC-ATL56"}, {"id": "AMS1", "name": "AMSTNLBW-AMS1"}, {
+ "id": "RCT1",
+ "name": "AMSTERNL-RCT1"
+ }, {"id": "JAN1", "name": "ORFLMATT-JAN1"}, {"id": "ABC14", "name": "TESAAISA-ABC14"}, {
+ "id": "TAT37",
+ "name": "TESAAISD-TAT37"
+ }, {"id": "MIC54", "name": "MICHIGAN-MIC54"}, {"id": "ABC11", "name": "ATLSANAI-ABC11"}, {
+ "id": "AMF11",
+ "name": "AMDOCS01-AMF11"
+ }, {"id": "ATL63", "name": "ATLSANEW-ATL63"}, {"id": "ABC12", "name": "ATLSECIA-ABC12"}, {
+ "id": "MTN20",
+ "name": "MDTWNJ21-MTN20"
+ }, {"id": "ABC15", "name": "AAITESAN-ABC15"}, {"id": "AVT1", "name": "AVTRFLHD-AVT1"}, {
+ "id": "ATL34",
+ "name": "ATLSANAI-ATL34"
+ }],
+ "categoryParameters": {
+ "owningEntityList": [{
+ "id": "aaa1",
+ "name": "aaa1"
+ }, {"id": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", "name": "WayneHolland"}, {
+ "id": "Melissa",
+ "name": "Melissa"
+ }],
+ "projectList": [{"id": "WATKINS", "name": "WATKINS"}, {"id": "x1", "name": "x1"}, {"id": "yyy1", "name": "yyy1"}],
+ "lineOfBusinessList": [{"id": "ONAP", "name": "ONAP"}, {"id": "zzz1", "name": "zzz1"}],
+ "platformList": [{"id": "platform", "name": "platform"}, {"id": "xxx1", "name": "xxx1"}]
+ },
+ "type": "[LCP_REGIONS_AND_TENANTS] Update",
+ "subscribers": [{
+ "id": "CAR_2020_ER",
+ "name": "CAR_2020_ER",
+ "isPermitted": true
+ }, {
+ "id": "21014aa2-526b-11e6-beb8-9e71128cae77",
+ "name": "JULIO ERICKSON",
+ "isPermitted": false
+ }, {
+ "id": "DHV1707-TestSubscriber-2",
+ "name": "DALE BRIDGES",
+ "isPermitted": false
+ }, {"id": "DHV1707-TestSubscriber-1", "name": "LLOYD BRIDGES", "isPermitted": false}, {
+ "id": "jimmy-example",
+ "name": "JimmyExampleCust-20161102",
+ "isPermitted": false
+ }, {
+ "id": "jimmy-example2",
+ "name": "JimmyExampleCust-20161103",
+ "isPermitted": false
+ }, {
+ "id": "ERICA5779-TestSub-PWT-102",
+ "name": "ERICA5779-TestSub-PWT-102",
+ "isPermitted": false
+ }, {
+ "id": "ERICA5779-TestSub-PWT-101",
+ "name": "ERICA5779-TestSub-PWT-101",
+ "isPermitted": false
+ }, {
+ "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+ "name": "Emanuel",
+ "isPermitted": false
+ }, {
+ "id": "ERICA5779-Subscriber-4",
+ "name": "ERICA5779-Subscriber-5",
+ "isPermitted": false
+ }, {
+ "id": "ERICA5779-TestSub-PWT-103",
+ "name": "ERICA5779-TestSub-PWT-103",
+ "isPermitted": false
+ }, {
+ "id": "ERICA5779-Subscriber-2",
+ "name": "ERICA5779-Subscriber-2",
+ "isPermitted": false
+ }, {
+ "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "name": "SILVIA ROBBINS",
+ "isPermitted": true
+ }, {
+ "id": "ERICA5779-Subscriber-3",
+ "name": "ERICA5779-Subscriber-3",
+ "isPermitted": false
+ }, {"id": "31739f3e-526b-11e6-beb8-9e71128cae77", "name": "CRAIG/ROBERTS", "isPermitted": false}]
+ }
+ };
+ }
+}
+
+class MockFeatureFlagsService {}
+
+describe('Service popup service', () => {
+ let injector;
+ let service: ServicePopupService;
+ let genericFormService: GenericFormService;
+ let defaultDataGeneratorService: DefaultDataGeneratorService;
+ let fb: FormBuilder;
+ let iframeService: IframeService;
+
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+ providers : [
+ ServicePopupService,
+ BasicControlGenerator,
+ ServiceControlGenerator,
+ DefaultDataGeneratorService,
+ GenericFormService,
+ FormBuilder,
+ IframeService,
+ AaiService,
+ LogService,
+ BasicPopupService,
+ {provide:FeatureFlagsService, useClass: MockFeatureFlagsService},
+ {provide: NgRedux, useClass: MockReduxStore},
+ {provide: HttpClient, useClass: MockAppStore},
+ {provide: SdcUiServices.ModalService, useClass: MockModalService}
+ ]
+ });
+ await TestBed.compileComponents();
+
+ injector = getTestBed();
+ service = injector.get(ServicePopupService);
+ genericFormService = injector.get(GenericFormService);
+ defaultDataGeneratorService = injector.get(DefaultDataGeneratorService);
+ fb = injector.get(FormBuilder);
+ iframeService = injector.get(IframeService);
+
+ })().then(done).catch(done.fail));
+
+ test('getTitle should return the correct title for edit and create mode', () => {
+ expect(service.getTitle(true)).toBe('Edit service instance');
+ expect(service.getTitle(false)).toBe('Set a new service instance');
+ });
+
+ test('getSubLeftTitle should return service model name', () => {
+ service.uuidData = {
+ serviceId : '6b528779-44a3-4472-bdff-9cd15ec93450'
+ };
+ expect(service.getSubLeftTitle()).toBe('action-data');
+ });
+
+ test('getSubRightTitle should return popup type', () => {
+ expect(service.getSubRightTitle()).toBe('Service Instance Details');
+ });
+
+ test('getModelInformation should update modelInformations', () => {
+ const serviceId: string = '6b528779-44a3-4472-bdff-9cd15ec93450';
+
+ service.getModelInformation(serviceId);
+ expect(service.modelInformations.length).toEqual(7);
+
+ expect(service.modelInformations[0].label).toEqual("Model version");
+ expect(service.modelInformations[0].values).toEqual(['1.0']);
+
+ expect(service.modelInformations[1].label).toEqual("Description");
+ expect(service.modelInformations[1].values).toEqual(['some description']);
+
+ expect(service.modelInformations[2].label).toEqual("Category");
+ expect(service.modelInformations[2].values).toEqual(['some category']);
+
+ expect(service.modelInformations[3].label).toEqual("UUID");
+ expect(service.modelInformations[3].values).toEqual(['6b528779-44a3-4472-bdff-9cd15ec93450']);
+
+ expect(service.modelInformations[4].label).toEqual("Invariant UUID");
+ expect(service.modelInformations[4].values).toEqual(['e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0']);
+
+ expect(service.modelInformations[5].label).toEqual("Service type");
+ expect(service.modelInformations[5].values).toEqual(['some service type']);
+
+ expect(service.modelInformations[6].label).toEqual("Service role");
+ expect(service.modelInformations[6].values).toEqual(['some service role']);
+ });
+
+
+ test('onCancel should trigger closeDialogEvent and iframe', () => {
+ let that = <any>{
+ parentElementClassName: 'content',
+ _iframeService: iframeService,
+ resetPopupData : () =>{
+
+ }
+ };
+ jest.spyOn(iframeService, 'removeClassCloseModal');
+ jest.spyOn(service.closeDialogEvent, 'next');
+ service.onCancel(that, fb.group({}));
+
+ expect(that._iframeService.removeClassCloseModal).toHaveBeenCalledWith(that.parentElementClassName)
+ expect(service.closeDialogEvent.next).toHaveBeenCalledWith(that);
+ });
+
+
+ test('getDynamicInputs should return list of controls' ,() => {
+ const result: FormControlModel[] = service.getDynamicInputs('6b528779-44a3-4472-bdff-9cd15ec93450');
+ console.log(result);
+ expect(result.length).toEqual(4);
+ expect(result[0].controlName).toEqual('2017488_adiodvpe0_ASN_1');
+ expect(result[1].controlName).toEqual('2017488_adiodvpe0_ASN_2');
+ expect(result[2].controlName).toEqual('2017488_adiodvpe0_ASN_3');
+ expect(result[3].controlName).toEqual('2017488_adiodvpe0_ASN_4');
+
+ expect(result[0].dataTestId).toEqual('2017488_adiodvpe0_ASN_1');
+ expect(result[1].dataTestId).toEqual('2017488_adiodvpe0_ASN_2');
+ expect(result[2].dataTestId).toEqual('2017488_adiodvpe0_ASN_3');
+ expect(result[3].dataTestId).toEqual('2017488_adiodvpe0_ASN_4');
+
+ expect(result[0].validations.length).toEqual(1);
+ expect(result[1].validations.length).toEqual(1);
+ expect(result[2].validations.length).toEqual(0);
+ expect(result[3].validations.length).toEqual(1);
+ });
+});
diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/service/service.popup.service.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/service/service.popup.service.ts
new file mode 100644
index 000000000..dc83083cb
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/service/service.popup.service.ts
@@ -0,0 +1,184 @@
+import {Injectable} from "@angular/core";
+import {GenericPopupInterface} from "../generic-popup.interface";
+import {ServiceModel} from "../../../../models/serviceModel";
+import {ModelInformationItem} from "../../../model-information/model-information.component";
+import {Subject} from "rxjs";
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import {FormPopupDetails, PopupType} from "../../../../models/formControlModels/formPopupDetails.model";
+import {BasicControlGenerator} from "../../../genericForm/formControlsServices/basic.control.generator";
+import {IframeService} from "../../../../utils/iframe.service";
+import {DefaultDataGeneratorService} from "../../../../services/defaultDataServiceGenerator/default.data.generator.service";
+import {AaiService} from "../../../../services/aaiService/aai.service";
+import {BasicPopupService} from "../basic.popup.service";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../../../store/reducers";
+import {ServiceControlGenerator} from "../../../genericForm/formControlsServices/service.control.generator";
+import {FormGroup} from "@angular/forms";
+import {Constants} from "../../../../utils/constants";
+import {ServiceInstance} from "../../../../models/serviceInstance";
+import {ModelInfo} from "../../../../models/modelInfo";
+import {FormControlModel} from "../../../../models/formControlModels/formControl.model";
+import {
+ ServiceActions,
+ createServiceInstance,
+ updateServiceInstance
+} from "../../../../storeUtil/utils/service/service.actions";
+import {ServiceInstanceActions} from "../../../../models/serviceInstanceActions";
+import * as _ from 'lodash';
+@Injectable()
+export class ServicePopupService implements GenericPopupInterface {
+ dynamicInputs: any;
+ instance: any;
+ model: any;
+ serviceModel: ServiceModel;
+ modelInformations: ModelInformationItem[] = [];
+ uuidData: Object;
+ closeDialogEvent: Subject<any> = new Subject<any>();
+ isUpdateMode: boolean;
+
+
+
+ constructor(private _basicControlGenerator: BasicControlGenerator,
+ private _serviceControlGenerator: ServiceControlGenerator,
+ private _iframeService: IframeService,
+ private _defaultDataGeneratorService: DefaultDataGeneratorService,
+ private _aaiService: AaiService,
+ private _basicPopupService : BasicPopupService,
+ private _store: NgRedux<AppState>) {
+
+ }
+
+ getGenericFormPopupDetails(serviceId: string, modelName: string, storeKey: string, node: ITreeNode, uuidData: Object, isUpdateMode: boolean): FormPopupDetails {
+ this.uuidData = uuidData;
+ this.instance = this.getInstance(serviceId);
+ this.getModelInformation(serviceId);
+ return new FormPopupDetails(this,
+ PopupType.SERVICE,
+ uuidData,
+ this.getTitle(isUpdateMode),
+ this.getSubLeftTitle(),
+ this.getSubRightTitle(),
+ this.getControls(serviceId),
+ this.getDynamicInputs(serviceId),
+ this.modelInformations,
+ (that, form: FormGroup) => {that.onSubmit(that, form);},
+ (that: any, form: FormGroup) => {that.onCancel(that, form); }
+ );
+ }
+
+ getDynamicInputs(serviceId) : FormControlModel[]{
+ let dynamic = this._defaultDataGeneratorService.getArbitraryInputs(this._store.getState().service.serviceHierarchy[serviceId].service.inputs);
+ return this._basicControlGenerator.getServiceDynamicInputs(dynamic, serviceId);
+ }
+
+
+ getControls(serviceId: string) {
+ if(this._store.getState().service.serviceHierarchy[serviceId].service.instantiationType === 'Macro') {
+ return this._serviceControlGenerator.getMacroFormControls(serviceId, this.dynamicInputs);
+ }else {
+ return this._serviceControlGenerator.getAlaCartControls(serviceId, this.dynamicInputs);
+ }
+ }
+
+ getInstance(serviceId): ServiceInstance {
+ let result: ServiceInstance = null;
+ if(!_.isNil(this._store.getState().service.serviceInstance[serviceId])){
+ result = this._store.getState().service.serviceInstance[serviceId];
+ }
+ return result;
+ }
+
+ getModelInformation(serviceId: string): void {
+ this._aaiService.getServiceModelById(serviceId).subscribe((result: any) => {
+ this.serviceModel = new ServiceModel(result);
+
+ this.model = this._store.getState().service.serviceHierarchy[serviceId];
+ this.modelInformations = [
+ new ModelInformationItem("Model version", "modelVersion", [this.serviceModel.version], "", true),
+ new ModelInformationItem("Description", "description", [this.serviceModel.description]),
+ new ModelInformationItem("Category", "category", [this.serviceModel.category]),
+ new ModelInformationItem("UUID", "uuid", [this.serviceModel.uuid], Constants.ServicePopup.TOOLTIP_UUID, true),
+ new ModelInformationItem("Invariant UUID", "invariantUuid", [this.serviceModel.invariantUuid], Constants.ServicePopup.TOOLTIP_INVARIANT_UUID, true),
+ new ModelInformationItem("Service type", "serviceType", [this.serviceModel.serviceType]),
+ new ModelInformationItem("Service role", "serviceRole", [this.serviceModel.serviceRole])
+ ];
+ });
+ }
+
+ getSubLeftTitle(): string {
+ return this._store.getState().service.serviceHierarchy[this.uuidData['serviceId']].service.name;
+ }
+
+ getSubRightTitle(): string {
+ return "Service Instance Details";
+ }
+
+ getTitle(isUpdateMode: boolean): string {
+ return isUpdateMode ? "Edit service instance" : "Set a new service instance";
+ }
+
+ onCancel(that, form): void {
+ form.reset();
+ that._iframeService.removeClassCloseModal('content');
+ this.closeDialogEvent.next(that);
+ }
+
+ onSubmit(that, form: FormGroup, ...args): void {
+ form = that.updateExtraValues(that, form);
+ that.storeServiceInstance(form.value, args[0], [], new ModelInfo(that.serviceModel), that.serviceModel);
+ window.parent.postMessage( {
+ eventId: 'submitIframe',
+ data: {
+ serviceModelId: that.serviceModel.uuid
+ }
+ }, "*");
+ this.onCancel(that, form);
+ }
+
+ updateExtraValues = (that, form) : any => {
+ const service = that._store.getState().service;
+ form.value['bulkSize'] = that.uuidData['bulkSize'];
+ form.value['instanceParams'] = form.value['instanceParams'] && [form.value['instanceParams']];
+ form.value['aicZoneName'] = !_.isNil(form.value['aicZoneId']) ?this.getNameFromListById(service.aicZones, form.value['aicZoneId']) : null;
+ form.value['owningEntityName'] = !_.isNil(form.value['owningEntityId']) ?this.getNameFromListById(service.categoryParameters.owningEntityList, form.value['owningEntityId']) : null;
+ form.value['testApi'] = sessionStorage.getItem("msoRequestParametersTestApiValue");
+ form.value['tenantName'] = this.getNameFromListById(service.lcpRegionsAndTenants.lcpRegionsTenantsMap[form.value['lcpCloudRegionId']], form.value['tenantId']);
+ return form;
+ };
+
+ getNameFromListById(list, id) {
+ if(list && id) {
+ return list.find(item => item.id === id).name;
+ }
+ return null;
+ }
+
+ storeServiceInstance = (formValues:any, servicesQty:number, dynamicInputs:any, serviceModel:ModelInfo, serviceDetails: any ) => {
+ formValues.bulkSize = this.uuidData['bulkSize'];
+ formValues.modelInfo = serviceModel;
+ let instantiationType = this._store.getState().service.serviceHierarchy[serviceModel.modelVersionId].service.instantiationType;
+ this.setIsALaCarte(formValues, instantiationType);
+ this.setTestApi(formValues);
+ Object.assign(formValues, serviceDetails);
+ let isCreateMode: boolean = this._store.getState().service.serviceInstance[serviceModel.modelVersionId] == null;
+ if(isCreateMode){
+ this._store.dispatch(createServiceInstance(formValues, serviceModel.modelVersionId));
+ }else {
+ this._store.dispatch(updateServiceInstance(formValues, serviceModel.modelVersionId));
+ }
+
+ if (this._store.getState().global.flags['FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD'] && isCreateMode) {
+ this._defaultDataGeneratorService.updateReduxOnFirstSet(serviceModel.modelVersionId, formValues);
+ }
+ };
+
+ setIsALaCarte = (formValues: any, instantiationType) => {
+ formValues.isALaCarte = instantiationType === 'A-La-Carte';
+ };
+
+ setTestApi = (formValues: any) =>{
+ if (this._store.getState().global.flags['FLAG_ADD_MSO_TESTAPI_FIELD'] && formValues.isAlaCarte) {
+ formValues.testApi = sessionStorage.getItem("msoRequestParametersTestApiValue");
+ }
+ };
+}
diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service.spec.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service.spec.ts
new file mode 100644
index 000000000..3794707ab
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service.spec.ts
@@ -0,0 +1,2407 @@
+import {LogService} from "../../../../utils/log/log.service";
+import {NgRedux} from "@angular-redux/store";
+import {BasicControlGenerator} from "../../../genericForm/formControlsServices/basic.control.generator";
+import {AaiService} from "../../../../services/aaiService/aai.service";
+import {HttpClient} from "@angular/common/http";
+import {GenericFormService} from "../../../genericForm/generic-form.service";
+import {FormBuilder} from "@angular/forms";
+import {IframeService} from "../../../../utils/iframe.service";
+import {DefaultDataGeneratorService} from "../../../../services/defaultDataServiceGenerator/default.data.generator.service";
+import {BasicPopupService} from "../basic.popup.service";
+import {VfModulePopuopService} from "./vfModule.popuop.service";
+import {VfModuleControlGenerator} from "../../../genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator";
+import {SdcUiServices} from "onap-ui-angular";
+import {FeatureFlagsService} from "../../../../services/featureFlag/feature-flags.service";
+import {getTestBed, TestBed} from "@angular/core/testing";
+
+class MockModalService<T> {}
+
+class MockAppStore<T> {}
+
+class MockReduxStore<T> {
+ getState() {
+ return {
+ "global": {
+ "name": null,
+ "flags": {
+ "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false,
+ "FLAG_SHOW_ASSIGNMENTS": true,
+ "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
+ "FLAG_UNASSIGN_SERVICE": true,
+ "FLAG_SHOW_VERIFY_SERVICE": false,
+ "FLAG_COLLECTION_RESOURCE_SUPPORT": true,
+ "FLAG_DUPLICATE_VNF": true,
+ "FLAG_SERVICE_MODEL_CACHE": true,
+ "FLAG_ADVANCED_PORTS_FILTER": true,
+ "CREATE_INSTANCE_TEST": false,
+ "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false,
+ "FLAG_REGION_ID_FROM_REMOTE": true,
+ "FLAG_ASYNC_INSTANTIATION": true,
+ "FLAG_ASYNC_JOBS": true,
+ "EMPTY_DRAWING_BOARD_TEST": false,
+ "FLAG_ADD_MSO_TESTAPI_FIELD": true
+ },
+ "type": "[FLAGS] Update"
+ },
+ "service": {
+ "serviceHierarchy": {
+ "6e59c5de-f052-46fa-aa7e-2fca9d674c44": {
+ "service": {
+ "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "name": "ComplexService",
+ "version": "1.0",
+ "toscaModelURL": null,
+ "category": "Emanuel",
+ "serviceType": "",
+ "serviceRole": "",
+ "description": "ComplexService",
+ "serviceEcompNaming": "false",
+ "instantiationType": "Macro",
+ "inputs": {}
+ },
+ "vnfs": {
+ "VF_vMee 0": {
+ "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60",
+ "invariantUuid": "4160458e-f648-4b30-a176-43881ffffe9e",
+ "description": "VSP_vMee",
+ "name": "VF_vMee",
+ "version": "2.0",
+ "customizationUuid": "91415b44-753d-494c-926a-456a9172bbb9",
+ "inputs": {},
+ "commands": {},
+ "properties": {
+ "max_instances": 10,
+ "min_instances": 1,
+ "gpb2_Internal2_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-ipv6-egress_src_start_port": "0",
+ "sctp-a-ipv6-egress_rule_application": "any",
+ "Internal2_allow_transit": "true",
+ "sctp-b-IPv6_ethertype": "IPv6",
+ "sctp-a-egress_rule_application": "any",
+ "sctp-b-ingress_action": "pass",
+ "sctp-b-ingress_rule_protocol": "icmp",
+ "ncb2_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-ipv6-ingress-src_start_port": "0.0",
+ "ncb1_Internal2_mac": "00:11:22:EF:AC:DF",
+ "fsb_volume_size_0": "320.0",
+ "sctp-b-egress_src_addresses": "local",
+ "sctp-a-ipv6-ingress_ethertype": "IPv4",
+ "sctp-a-ipv6-ingress-dst_start_port": "0",
+ "sctp-b-ipv6-ingress_rule_application": "any",
+ "domain_name": "default-domain",
+ "sctp-a-ingress_rule_protocol": "icmp",
+ "sctp-b-egress-src_start_port": "0.0",
+ "sctp-a-egress_src_addresses": "local",
+ "sctp-b-display_name": "epc-sctp-b-ipv4v6-sec-group",
+ "sctp-a-egress-src_start_port": "0.0",
+ "sctp-a-ingress_ethertype": "IPv4",
+ "sctp-b-ipv6-ingress-dst_end_port": "65535",
+ "sctp-b-dst_subnet_prefix_v6": "::",
+ "nf_naming": "{ecomp_generated_naming=true}",
+ "sctp-a-ipv6-ingress_src_subnet_prefix": "0.0.0.0",
+ "sctp-b-egress-dst_start_port": "0.0",
+ "ncb_flavor_name": "nv.c20r64d1",
+ "gpb1_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-egress_dst_subnet_prefix_len": "0.0",
+ "Internal2_net_cidr": "10.0.0.10",
+ "sctp-a-ingress-dst_start_port": "0.0",
+ "sctp-a-egress-dst_start_port": "0.0",
+ "fsb1_Internal2_mac": "00:11:22:EF:AC:DF",
+ "sctp-a-egress_ethertype": "IPv4",
+ "vlc_st_service_mode": "in-network-nat",
+ "sctp-a-ipv6-egress_ethertype": "IPv4",
+ "sctp-a-egress-src_end_port": "65535.0",
+ "sctp-b-ipv6-egress_rule_application": "any",
+ "sctp-b-egress_action": "pass",
+ "sctp-a-ingress-src_subnet_prefix_len": "0.0",
+ "sctp-b-ipv6-ingress-src_end_port": "65535.0",
+ "sctp-b-name": "epc-sctp-b-ipv4v6-sec-group",
+ "fsb2_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-a-ipv6-ingress-src_start_port": "0.0",
+ "sctp-b-ipv6-egress_ethertype": "IPv4",
+ "Internal1_net_cidr": "10.0.0.10",
+ "sctp-a-egress_dst_subnet_prefix": "0.0.0.0",
+ "fsb_flavor_name": "nv.c20r64d1",
+ "sctp_rule_protocol": "132",
+ "sctp-b-ipv6-ingress_src_subnet_prefix_len": "0",
+ "sctp-a-ipv6-ingress_rule_application": "any",
+ "ecomp_generated_naming": "false",
+ "sctp-a-IPv6_ethertype": "IPv6",
+ "vlc2_Internal1_mac": "00:11:22:EF:AC:DF",
+ "vlc_st_virtualization_type": "virtual-machine",
+ "sctp-b-ingress-dst_start_port": "0.0",
+ "sctp-b-ingress-dst_end_port": "65535.0",
+ "sctp-a-ipv6-ingress-src_end_port": "65535.0",
+ "sctp-a-display_name": "epc-sctp-a-ipv4v6-sec-group",
+ "sctp-b-ingress_rule_application": "any",
+ "int2_sec_group_name": "int2-sec-group",
+ "vlc_flavor_name": "nd.c16r64d1",
+ "sctp-b-ipv6-egress_src_addresses": "local",
+ "vlc_st_interface_type_int1": "other1",
+ "sctp-b-egress-src_end_port": "65535.0",
+ "sctp-a-ipv6-egress-dst_start_port": "0",
+ "vlc_st_interface_type_int2": "other2",
+ "sctp-a-ipv6-egress_rule_protocol": "any",
+ "Internal2_shared": "false",
+ "sctp-a-ipv6-egress_dst_subnet_prefix_len": "0",
+ "Internal2_rpf": "disable",
+ "vlc1_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-ipv6-egress_src_end_port": "65535",
+ "sctp-a-ipv6-egress_src_addresses": "local",
+ "sctp-a-ingress-dst_end_port": "65535.0",
+ "sctp-a-ipv6-egress_src_end_port": "65535",
+ "Internal1_forwarding_mode": "l2",
+ "Internal2_dhcp": "false",
+ "sctp-a-dst_subnet_prefix_v6": "::",
+ "pxe_image_name": "MME_PXE-Boot_16ACP04_GA.qcow2",
+ "vlc_st_interface_type_gtp": "other0",
+ "ncb1_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-src_subnet_prefix_v6": "::",
+ "sctp-a-egress_dst_subnet_prefix_len": "0.0",
+ "int1_sec_group_name": "int1-sec-group",
+ "Internal1_dhcp": "false",
+ "sctp-a-ipv6-egress_dst_end_port": "65535",
+ "Internal2_forwarding_mode": "l2",
+ "fsb2_Internal2_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-egress_dst_subnet_prefix": "0.0.0.0",
+ "Internal1_net_cidr_len": "17",
+ "gpb2_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-ingress-src_subnet_prefix_len": "0.0",
+ "sctp-a-ingress_dst_addresses": "local",
+ "sctp-a-egress_action": "pass",
+ "fsb_volume_type_0": "SF-Default-SSD",
+ "ncb2_Internal2_mac": "00:11:22:EF:AC:DF",
+ "vlc_st_interface_type_sctp_a": "left",
+ "vlc_st_interface_type_sctp_b": "right",
+ "sctp-a-src_subnet_prefix_v6": "::",
+ "vlc_st_version": "2",
+ "sctp-b-egress_ethertype": "IPv4",
+ "sctp-a-ingress_rule_application": "any",
+ "gpb1_Internal2_mac": "00:11:22:EF:AC:DF",
+ "instance_ip_family_v6": "v6",
+ "sctp-a-ipv6-egress_src_start_port": "0",
+ "sctp-b-ingress-src_start_port": "0.0",
+ "sctp-b-ingress_dst_addresses": "local",
+ "fsb1_Internal1_mac": "00:11:22:EF:AC:DF",
+ "vlc_st_interface_type_oam": "management",
+ "multi_stage_design": "true",
+ "oam_sec_group_name": "oam-sec-group",
+ "Internal2_net_gateway": "10.0.0.10",
+ "sctp-a-ipv6-ingress-dst_end_port": "65535",
+ "sctp-b-ipv6-egress-dst_start_port": "0",
+ "Internal1_net_gateway": "10.0.0.10",
+ "sctp-b-ipv6-egress_rule_protocol": "any",
+ "gtp_sec_group_name": "gtp-sec-group",
+ "sctp-a-ipv6-egress_dst_subnet_prefix": "0.0.0.0",
+ "sctp-b-ipv6-egress_dst_subnet_prefix_len": "0",
+ "sctp-a-ipv6-ingress_dst_addresses": "local",
+ "sctp-a-egress_rule_protocol": "icmp",
+ "sctp-b-ipv6-egress_action": "pass",
+ "sctp-a-ipv6-egress_action": "pass",
+ "Internal1_shared": "false",
+ "sctp-b-ipv6-ingress_rule_protocol": "any",
+ "Internal2_net_cidr_len": "17",
+ "sctp-a-name": "epc-sctp-a-ipv4v6-sec-group",
+ "sctp-a-ingress-src_end_port": "65535.0",
+ "sctp-b-ipv6-ingress_src_subnet_prefix": "0.0.0.0",
+ "sctp-a-egress-dst_end_port": "65535.0",
+ "sctp-a-ingress_action": "pass",
+ "sctp-b-egress_rule_protocol": "icmp",
+ "sctp-b-ipv6-ingress_action": "pass",
+ "vlc_st_service_type": "firewall",
+ "sctp-b-ipv6-egress_dst_end_port": "65535",
+ "sctp-b-ipv6-ingress-dst_start_port": "0",
+ "vlc2_Internal2_mac": "00:11:22:EF:AC:DF",
+ "vlc_st_availability_zone": "true",
+ "fsb_volume_image_name_1": "MME_FSB2_16ACP04_GA.qcow2",
+ "sctp-b-ingress-src_subnet_prefix": "0.0.0.0",
+ "sctp-a-ipv6-ingress_src_subnet_prefix_len": "0",
+ "Internal1_allow_transit": "true",
+ "gpb_flavor_name": "nv.c20r64d1",
+ "availability_zone_max_count": "1",
+ "fsb_volume_image_name_0": "MME_FSB1_16ACP04_GA.qcow2",
+ "sctp-b-ipv6-ingress_dst_addresses": "local",
+ "sctp-b-ipv6-egress_dst_subnet_prefix": "0.0.0.0",
+ "sctp-b-ipv6-ingress_ethertype": "IPv4",
+ "vlc1_Internal2_mac": "00:11:22:EF:AC:DF",
+ "sctp-a-ingress-src_subnet_prefix": "0.0.0.0",
+ "sctp-a-ipv6-ingress_action": "pass",
+ "Internal1_rpf": "disable",
+ "sctp-b-ingress_ethertype": "IPv4",
+ "sctp-b-egress_rule_application": "any",
+ "sctp-b-ingress-src_end_port": "65535.0",
+ "sctp-a-ipv6-ingress_rule_protocol": "any",
+ "sctp-a-ingress-src_start_port": "0.0",
+ "sctp-b-egress-dst_end_port": "65535.0"
+ },
+ "type": "VF",
+ "modelCustomizationName": "VF_vMee 0",
+ "vfModules": {
+ "vf_vmee0..VfVmee..vmme_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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..vmme_vlc..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "vmme_vlc"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ },
+ "vf_vmee0..VfVmee..vmme_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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..vmme_gpb..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "vmme_gpb"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "vf_vmee0..VfVmee..base_vmme..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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "base_vmme"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "vf_vmee0..VfVmee..base_vmme..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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "base_vmme"
+ },
+ "inputs": {}
+ }
+ },
+ "vfcInstanceGroups": {}
+ }
+ },
+ "networks": {
+ "ExtVL 0": {
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ "invariantUuid": "379f816b-a7aa-422f-be30-17114ff50b7c",
+ "description": "ECOMP generic virtual link (network) base type for all other service-level and global networks",
+ "name": "ExtVL",
+ "version": "37.0",
+ "customizationUuid": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+ "inputs": {},
+ "commands": {},
+ "properties": {
+ "netowrk_role": "role 1, role 2, role 3",
+ "network_assignments": "{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}",
+ "exVL_naming": "{ecomp_generated_naming=true}",
+ "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}",
+ "network_homing": "{ecomp_selected_instance_node_target=false}"
+ },
+ "type": "VL",
+ "modelCustomizationName": "ExtVL 0"
+ }
+ },
+ "collectionResource": {},
+ "configurations": {
+ "Port Mirroring Configuration By Policy 0": {
+ "uuid": "b4398538-e89d-4f13-b33d-ca323434ba50",
+ "invariantUuid": "6ef0ca40-f366-4897-951f-abd65d25f6f7",
+ "description": "A port mirroring configuration by policy object",
+ "name": "Port Mirroring Configuration By Policy",
+ "version": "27.0",
+ "customizationUuid": "3c3b7b8d-8669-4b3b-8664-61970041fad2",
+ "inputs": {},
+ "commands": {},
+ "properties": {},
+ "type": "Configuration",
+ "modelCustomizationName": "Port Mirroring Configuration By Policy 0",
+ "sourceNodes": [],
+ "collectorNodes": null,
+ "configurationByPolicy": false
+ }
+ },
+ "serviceProxies": {},
+ "vfModules": {
+ "vf_vmee0..VfVmee..vmme_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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..vmme_vlc..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "vmme_vlc"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ },
+ "vf_vmee0..VfVmee..vmme_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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..vmme_gpb..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "vmme_gpb"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "vf_vmee0..VfVmee..base_vmme..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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "base_vmme"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "vf_vmee0..VfVmee..base_vmme..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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "base_vmme"
+ },
+ "inputs": {}
+ }
+ },
+ "pnfs": {}
+ },
+ "6b528779-44a3-4472-bdff-9cd15ec93450": {
+ "service": {
+ "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+ "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "name": "action-data",
+ "version": "1.0",
+ "toscaModelURL": null,
+ "category": "",
+ "serviceType": "",
+ "serviceRole": "",
+ "description": "",
+ "serviceEcompNaming": "false",
+ "instantiationType": "A-La-Carte",
+ "inputs": {
+ "2017488_adiodvpe0_ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ }
+ }
+ },
+ "vnfs": {
+ "2017-388_ADIOD-vPE 1": {
+ "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413",
+ "invariantUuid": "00beb8f9-6d39-452f-816d-c709b9cbb87d",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-388_ADIOD-vPE",
+ "version": "1.0",
+ "customizationUuid": "280dec31-f16d-488b-9668-4aae55d6648a",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {
+ "vnf_config_template_version": {
+ "displayName": "vnf_config_template_version",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_config_template_version"
+ },
+ "bandwidth_units": {
+ "displayName": "bandwidth_units",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth_units"
+ },
+ "bandwidth": {"displayName": "bandwidth", "command": "get_input", "inputName": "adiodvpe0_bandwidth"},
+ "AIC_CLLI": {
+ "displayName": "AIC_CLLI",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_AIC_CLLI"
+ },
+ "ASN": {"displayName": "ASN", "command": "get_input", "inputName": "2017488_adiodvpe0_ASN"},
+ "vnf_instance_name": {
+ "displayName": "vnf_instance_name",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_instance_name"
+ }
+ },
+ "properties": {
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=false}",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "false",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VF",
+ "modelCustomizationName": "2017-388_ADIOD-vPE 1",
+ "vfModules": {},
+ "volumeGroups": {},
+ "vfcInstanceGroups": {}
+ },
+ "2017-388_ADIOD-vPE 0": {
+ "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168",
+ "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-388_ADIOD-vPE",
+ "version": "4.0",
+ "customizationUuid": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {
+ "vnf_config_template_version": {
+ "displayName": "vnf_config_template_version",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_config_template_version"
+ },
+ "bandwidth_units": {
+ "displayName": "bandwidth_units",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth_units"
+ },
+ "bandwidth": {"displayName": "bandwidth", "command": "get_input", "inputName": "adiodvpe0_bandwidth"},
+ "AIC_CLLI": {
+ "displayName": "AIC_CLLI",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_AIC_CLLI"
+ },
+ "ASN": {"displayName": "ASN", "command": "get_input", "inputName": "2017488_adiodvpe0_ASN"},
+ "vnf_instance_name": {
+ "displayName": "vnf_instance_name",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_instance_name"
+ }
+ },
+ "properties": {
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=false}",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "min_instances": "1",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "false",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VF",
+ "modelCustomizationName": "2017-388_ADIOD-vPE 0",
+ "vfModules": {},
+ "volumeGroups": {},
+ "vfcInstanceGroups": {}
+ },
+ "2017-488_ADIOD-vPE 0": {
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-488_ADIOD-vPE",
+ "version": "5.0",
+ "customizationUuid": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {
+ "vnf_config_template_version": {
+ "displayName": "vnf_config_template_version",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_config_template_version"
+ },
+ "bandwidth_units": {
+ "displayName": "bandwidth_units",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth_units"
+ },
+ "bandwidth": {"displayName": "bandwidth", "command": "get_input", "inputName": "adiodvpe0_bandwidth"},
+ "AIC_CLLI": {
+ "displayName": "AIC_CLLI",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_AIC_CLLI"
+ },
+ "ASN": {"displayName": "ASN", "command": "get_input", "inputName": "2017488_adiodvpe0_ASN"},
+ "vnf_instance_name": {
+ "displayName": "vnf_instance_name",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_instance_name"
+ }
+ },
+ "properties": {
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=false}",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "max_instances": "3",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "min_instances": "1",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "false",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VF",
+ "modelCustomizationName": "2017-488_ADIOD-vPE 0",
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV"
+ },
+ "inputs": {
+ "adiodvpe0_bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "2017488_adiodvpe0_vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ },
+ "2017488_adiodvpe0_vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "2017488_adiodvpe0_AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "AIC_CLLI"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "adiodvpe0_bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ }
+ },
+ "volumeGroupAllowed": true
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+ "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+ "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+ "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "version": "5",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "ADIOD_base_vPE_BV"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV"
+ },
+ "inputs": {
+ "adiodvpe0_bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "2017488_adiodvpe0_vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ },
+ "2017488_adiodvpe0_vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "2017488_adiodvpe0_AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "AIC_CLLI"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "adiodvpe0_bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ }
+ }
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV"
+ },
+ "inputs": {}
+ }
+ },
+ "vfcInstanceGroups": {}
+ }
+ },
+ "networks": {
+ "ExtVL 0": {
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ "invariantUuid": "379f816b-a7aa-422f-be30-17114ff50b7c",
+ "description": "ECOMP generic virtual link (network) base type for all other service-level and global networks",
+ "name": "ExtVL",
+ "version": "37.0",
+ "customizationUuid": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {},
+ "properties": {
+ "network_role" : "network role 1, network role 2",
+ "min_instances": 1,
+ "max_instances": 10,
+ "network_assignments": "{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}",
+ "exVL_naming": "{ecomp_generated_naming=true}",
+ "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}",
+ "network_homing": "{ecomp_selected_instance_node_target=false}"
+ },
+ "type": "VL",
+ "modelCustomizationName": "ExtVL 0"
+ }
+ },
+ "collectionResource": {},
+ "configurations": {},
+ "fabricConfigurations": {},
+ "serviceProxies": {},
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV"
+ },
+ "inputs": {
+ "adiodvpe0_bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "2017488_adiodvpe0_vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ },
+ "2017488_adiodvpe0_vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "2017488_adiodvpe0_AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {"sourceType": "HEAT", "vfModuleLabel": "ADIOD_vRE_BV", "paramName": "AIC_CLLI"},
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "adiodvpe0_bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ }
+ },
+ "volumeGroupAllowed": true
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+ "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+ "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+ "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "version": "5",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "ADIOD_base_vPE_BV"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV"
+ },
+ "inputs": {
+ "adiodvpe0_bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "2017488_adiodvpe0_vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ },
+ "2017488_adiodvpe0_vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "2017488_adiodvpe0_AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {"sourceType": "HEAT", "vfModuleLabel": "ADIOD_vRE_BV", "paramName": "AIC_CLLI"},
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "adiodvpe0_bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ }
+ }
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV"
+ },
+ "inputs": {}
+ }
+ },
+ "pnfs": {}
+ }
+ },
+ "serviceInstance": {
+ "6e59c5de-f052-46fa-aa7e-2fca9d674c44": {
+ "vnfs": {
+ "VF_vMee 0": {
+ "rollbackOnFailure": "true",
+ "vfModules": {
+ "vf_vmee0..VfVmee..base_vmme..module-0": {
+ "vf_vmee0..VfVmee..base_vmme..module-0vmvzo": {
+ "isMissingData": false,
+ "sdncPreReload": null,
+ "modelInfo": {
+ "modelType": "VFmodule",
+ "modelInvariantId": "a6f9e51a-2b35-416a-ae15-15e58d61f36d",
+ "modelVersionId": "a27f5cfc-7f12-4f99-af08-0af9c3885c87",
+ "modelName": "VfVmee..base_vmme..module-0",
+ "modelVersion": "2",
+ "modelCustomizationId": "f8c040f1-7e51-4a11-aca8-acf256cfd861",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0"
+ },
+ "instanceParams": [{}],
+ "trackById": "wmtm6sy2uj"
+ }
+ }
+ },
+ "isMissingData": true,
+ "originalName": "VF_vMee 0",
+ "vnfStoreKey": "VF_vMee 0",
+ "trackById": "p3wk448m5do",
+ "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60",
+ "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+ "lcpCloudRegionId": null,
+ "tenantId": null,
+ "lineOfBusiness": null,
+ "platformName": null,
+ "modelInfo": {
+ "modelType": "VF",
+ "modelInvariantId": "4160458e-f648-4b30-a176-43881ffffe9e",
+ "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ "modelName": "VF_vMee",
+ "modelVersion": "2.0",
+ "modelCustomizationName": "VF_vMee 0"
+ }
+ }
+ },
+ "networks": {},
+ "instanceParams": [{}],
+ "validationCounter": 1,
+ "existingNames": {},
+ "existingVNFCounterMap": {"d6557200-ecf2-4641-8094-5393ae3aae60": 1},
+ "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "subscriptionServiceType": "TYLER SILVIA",
+ "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+ "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+ "lcpCloudRegionId": "hvf6",
+ "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+ "aicZoneId": "JAG1",
+ "projectName": "x1",
+ "rollbackOnFailure": "true",
+ "bulkSize": 1,
+ "modelInfo": {
+ "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ "modelName": "ComplexService",
+ "modelVersion": "1.0",
+ "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44"
+ },
+ "isALaCarte": false,
+ "name": "ComplexService",
+ "version": "1.0",
+ "description": "ComplexService",
+ "category": "Emanuel",
+ "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "serviceType": "",
+ "serviceRole": "",
+ "isMultiStepDesign": false
+ },
+ "6b528779-44a3-4472-bdff-9cd15ec93450": {
+ "networks": {
+ "ExtVL 0": {
+ "rollbackOnFailure": "true",
+ "isMissingData": false,
+ "originalName": "ExtVL 0",
+ "networkStoreKey": "ExtVL 0",
+ "trackById": "sf3zth68xjf",
+ "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+ "lcpCloudRegionId": "hvf6",
+ "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+ "platformName": "xxx1",
+ "lineOfBusiness": "ONAP",
+ "instanceParams": [{}],
+ "modelInfo": {
+ "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c",
+ "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ "modelName": "ExtVL",
+ "modelVersion": "37.0",
+ "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+ "modelCustomizationName": "ExtVL 0",
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+ },
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+ },
+ "ExtVL 0:0001": {
+ "rollbackOnFailure": "true",
+ "isMissingData": false,
+ "originalName": "ExtVL 0",
+ "networkStoreKey": "ExtVL 0",
+ "trackById": "2mdxioxca9h",
+ "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+ "lcpCloudRegionId": "hvf6",
+ "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+ "platformName": "xxx1",
+ "lineOfBusiness": "ONAP",
+ "instanceParams": [{}],
+ "modelInfo": {
+ "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c",
+ "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ "modelName": "ExtVL",
+ "modelVersion": "37.0",
+ "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+ "modelCustomizationName": "ExtVL 0",
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+ },
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+ },
+ "ExtVL 0_1": {
+ "rollbackOnFailure": "true",
+ "isMissingData": false,
+ "originalName": "ExtVL 0",
+ "networkStoreKey": "ExtVL 0_1",
+ "trackById": "z7vd1gmpbs",
+ "instanceName": "ExtVL",
+ "productFamilyId": "17cc1042-527b-11e6-beb8-9e71128cae77",
+ "lcpCloudRegionId": "hvf6",
+ "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+ "platformName": "xxx1",
+ "lineOfBusiness": "zzz1",
+ "instanceParams": [{
+ "vnf_config_template_version": "17.2",
+ "bandwidth_units": "Gbps",
+ "bandwidth": "10",
+ "AIC_CLLI": "ATLMY8GA",
+ "ASN": "AV_vPE",
+ "vnf_instance_name": "yoav"
+ }],
+ "modelInfo": {
+ "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c",
+ "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ "modelName": "ExtVL",
+ "modelVersion": "37.0",
+ "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+ "modelCustomizationName": "ExtVL 0",
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+ },
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+ }
+ },
+ "vnfs": {
+ "2017-488_ADIOD-vPE 0": {
+ "rollbackOnFailure": "true",
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1sgoqi": {
+ "instanceName": "yoav",
+ "volumeGroupName": "123",
+ "modelInfo": {
+ "modelInvariantId": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "modelName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "modelVersion": "6",
+ "modelCustomizationId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5"
+ },
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "isMissingData": false,
+ "instanceParams": [{
+ "adiodvpe0_bandwidth": "10",
+ "2017488_adiodvpe0_vnf_instance_name": "mtnj309me6",
+ "2017488_adiodvpe0_vnf_config_template_version": "17.2",
+ "2017488_adiodvpe0_AIC_CLLI": "ATLMY8GA",
+ "adiodvpe0_bandwidth_units": "Gbps"
+ }]
+ }
+ }
+ },
+ "isMissingData": false,
+ "originalName": "2017-488_ADIOD-vPE 0",
+ "vnfStoreKey": "2017-488_ADIOD-vPE 0",
+ "trackById": "o65b26t2thj",
+ "instanceName": "2017488_ADIODvPE",
+ "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+ "lcpCloudRegionId": "hvf6",
+ "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054",
+ "platformName": "platform",
+ "lineOfBusiness": "ONAP",
+ "instanceParams": [{}],
+ "modelInfo": {
+ "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "modelVersionId": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "modelName": "2017-488_ADIOD-vPE",
+ "modelVersion": "5.0",
+ "modelCustomizationId": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+ "modelCustomizationName": "2017-488_ADIOD-vPE 0",
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09"
+ },
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09"
+ }
+ },
+ "instanceParams": [{"2017488_adiodvpe0_ASN": "AV_vPE"}],
+ "validationCounter": 0,
+ "existingNames": {"123": "", "instancename": "", "yoav": "", "extvl": ""},
+ "existingVNFCounterMap": {"69e09f68-8b63-4cc9-b9ff-860960b5db09": 1},
+ "existingNetworksCounterMap": {"ddc3f20c-08b5-40fd-af72-c6d14636b986": 3},
+ "instanceName": "InstanceName",
+ "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "subscriptionServiceType": "TYLER SILVIA",
+ "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+ "productFamilyId": "17cc1042-527b-11e6-beb8-9e71128cae77",
+ "lcpCloudRegionId": "JANET25",
+ "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+ "aicZoneId": "JAG1",
+ "projectName": null,
+ "rollbackOnFailure": "true",
+ "aicZoneName": "YUDFJULP-JAG1",
+ "owningEntityName": "WayneHolland",
+ "testApi": "GR_API",
+ "tenantName": "USP-SIP-IC-24335-T-01",
+ "bulkSize": 1,
+ "modelInfo": {
+ "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "modelVersionId": "6b528779-44a3-4472-bdff-9cd15ec93450",
+ "modelName": "action-data",
+ "modelVersion": "1.0",
+ "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450"
+ },
+ "isALaCarte": false,
+ "name": "action-data",
+ "version": "1.0",
+ "description": "",
+ "category": "",
+ "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+ "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "serviceType": "",
+ "serviceRole": "",
+ "isMultiStepDesign": false
+ }
+ },
+ "lcpRegionsAndTenants": {
+ "lcpRegionList": [{
+ "id": "JANET25",
+ "name": "JANET25",
+ "isPermitted": true
+ }, {"id": "hvf6", "name": "hvf6", "isPermitted": true}],
+ "lcpRegionsTenantsMap": {
+ "JANET25": [{
+ "id": "092eb9e8e4b7412e8787dd091bc58e86",
+ "name": "USP-SIP-IC-24335-T-01",
+ "isPermitted": true
+ }],
+ "hvf6": [{
+ "id": "bae71557c5bb4d5aac6743a4e5f1d054",
+ "name": "AIN Web Tool-15-D-testalexandria",
+ "isPermitted": true
+ }, {
+ "id": "229bcdc6eaeb4ca59d55221141d01f8e",
+ "name": "AIN Web Tool-15-D-STTest2",
+ "isPermitted": true
+ }, {
+ "id": "1178612d2b394be4834ad77f567c0af2",
+ "name": "AIN Web Tool-15-D-SSPtestcustome",
+ "isPermitted": true
+ }, {
+ "id": "19c5ade915eb461e8af52fb2fd8cd1f2",
+ "name": "AIN Web Tool-15-D-UncheckedEcopm",
+ "isPermitted": true
+ }, {
+ "id": "de007636e25249238447264a988a927b",
+ "name": "AIN Web Tool-15-D-dfsdf",
+ "isPermitted": true
+ }, {
+ "id": "62f29b3613634ca6a3065cbe0e020c44",
+ "name": "AIN/SMS-16-D-Multiservices1",
+ "isPermitted": true
+ }, {
+ "id": "649289e30d3244e0b48098114d63c2aa",
+ "name": "AIN Web Tool-15-D-SSPST66",
+ "isPermitted": true
+ }, {
+ "id": "3f21eeea6c2c486bba31dab816c05a32",
+ "name": "AIN Web Tool-15-D-ASSPST47",
+ "isPermitted": true
+ }, {
+ "id": "f60ce21d3ee6427586cff0d22b03b773",
+ "name": "CESAR-100-D-sspjg67246",
+ "isPermitted": true
+ }, {
+ "id": "8774659e425f479895ae091bb5d46560",
+ "name": "CESAR-100-D-sspjg68359",
+ "isPermitted": true
+ }, {
+ "id": "624eb554b0d147c19ff8885341760481",
+ "name": "AINWebTool-15-D-iftach",
+ "isPermitted": true
+ }, {
+ "id": "214f55f5fc414c678059c383b03e4962",
+ "name": "CESAR-100-D-sspjg612401",
+ "isPermitted": true
+ }, {
+ "id": "c90666c291664841bb98e4d981ff1db5",
+ "name": "CESAR-100-D-sspjg621340",
+ "isPermitted": true
+ }, {
+ "id": "ce5b6bc5c7b348e1bf4b91ac9a174278",
+ "name": "sspjg621351cloned",
+ "isPermitted": true
+ }, {
+ "id": "b386b768a3f24c8e953abbe0b3488c02",
+ "name": "AINWebTool-15-D-eteancomp",
+ "isPermitted": true
+ }, {
+ "id": "dc6c4dbfd225474e9deaadd34968646c",
+ "name": "AINWebTool-15-T-SPFET",
+ "isPermitted": true
+ }, {
+ "id": "02cb5030e9914aa4be120bd9ed1e19eb",
+ "name": "AINWebTool-15-X-eeweww",
+ "isPermitted": true
+ }, {
+ "id": "f2f3830e4c984d45bcd00e1a04158a79",
+ "name": "CESAR-100-D-spjg61909",
+ "isPermitted": true
+ }, {
+ "id": "05b91bd5137f4929878edd965755c06d",
+ "name": "CESAR-100-D-sspjg621512cloned",
+ "isPermitted": true
+ }, {
+ "id": "7002fbe8482d4a989ddf445b1ce336e0",
+ "name": "AINWebTool-15-X-vdr",
+ "isPermitted": true
+ }, {
+ "id": "4008522be43741dcb1f5422022a2aa0b",
+ "name": "AINWebTool-15-D-ssasa",
+ "isPermitted": true
+ }, {
+ "id": "f44e2e96a1b6476abfda2fa407b00169",
+ "name": "AINWebTool-15-D-PFNPT",
+ "isPermitted": true
+ }, {
+ "id": "b69a52bec8a84669a37a1e8b72708be7",
+ "name": "AINWebTool-15-X-vdre",
+ "isPermitted": true
+ }, {
+ "id": "fac7d9fd56154caeb9332202dcf2969f",
+ "name": "AINWebTool-15-X-NONPODECOMP",
+ "isPermitted": true
+ }, {
+ "id": "2d34d8396e194eb49969fd61ffbff961",
+ "name": "DN5242-Nov16-T5",
+ "isPermitted": true
+ }, {
+ "id": "cb42a77ff45b48a8b8deb83bb64acc74",
+ "name": "ro-T11",
+ "isPermitted": true
+ }, {
+ "id": "fa45ca53c80b492fa8be5477cd84fc2b",
+ "name": "ro-T112",
+ "isPermitted": true
+ }, {
+ "id": "4914ab0ab3a743e58f0eefdacc1dde77",
+ "name": "DN5242-Nov21-T1",
+ "isPermitted": true
+ }, {
+ "id": "d0a3e3f2964542259d155a81c41aadc3",
+ "name": "test-hvf6-09",
+ "isPermitted": true
+ }, {"id": "cbb99fe4ada84631b7baf046b6fd2044", "name": "DN5242-Nov16-T3", "isPermitted": true}]
+ }
+ },
+ "productFamilies": [{
+ "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+ "name": "SCOTTIE",
+ "isPermitted": true
+ }, {
+ "id": "17cc1042-527b-11e6-beb8-9e71128cae77",
+ "name": "IGNACIO",
+ "isPermitted": true
+ }, {
+ "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+ "name": "Christie",
+ "isPermitted": true
+ }, {
+ "id": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7",
+ "name": "Enhanced Services",
+ "isPermitted": true
+ }, {"id": "vTerrance", "name": "vTerrance", "isPermitted": true}, {
+ "id": "323d69d9-2efe-4r45-ay0a-89ea7ard4e6f",
+ "name": "vSCP",
+ "isPermitted": true
+ }, {
+ "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+ "name": "Emanuel",
+ "isPermitted": true
+ }, {
+ "id": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+ "name": "BVOIP",
+ "isPermitted": true
+ }, {"id": "db171b8f-115c-4992-a2e3-ee04cae357e0", "name": "LINDSEY", "isPermitted": true}, {
+ "id": "LRSI-OSPF",
+ "name": "LRSI-OSPF",
+ "isPermitted": true
+ }, {"id": "vRosemarie", "name": "HNGATEWAY", "isPermitted": true}, {
+ "id": "vHNPaas",
+ "name": "WILKINS",
+ "isPermitted": true
+ }, {
+ "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "name": "TYLER SILVIA",
+ "isPermitted": true
+ }, {"id": "b6a3f28c-eebf-494c-a900-055cc7c874ce", "name": "VROUTER", "isPermitted": true}, {
+ "id": "Cisneros",
+ "name": "vMuriel",
+ "isPermitted": true
+ }, {
+ "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1",
+ "name": "CARA Griffin",
+ "isPermitted": true
+ }, {
+ "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d",
+ "name": "DARREN MCGEE",
+ "isPermitted": true
+ }, {"id": "e30755dc-5673-4b6b-9dcf-9abdd96b93d1", "name": "Transport", "isPermitted": true}, {
+ "id": "vSalvatore",
+ "name": "vSalvatore",
+ "isPermitted": true
+ }, {"id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4", "name": "Josefina", "isPermitted": true}, {
+ "id": "vHubbard",
+ "name": "vHubbard",
+ "isPermitted": true
+ }, {"id": "12a96a9d-4b4c-4349-a950-fe1159602621", "name": "DARREN MCGEE", "isPermitted": true}],
+ "serviceTypes": {
+ "e433710f-9217-458d-a79d-1c7aff376d89": [{
+ "id": "0",
+ "name": "vRichardson",
+ "isPermitted": false
+ }, {"id": "1", "name": "TYLER SILVIA", "isPermitted": true}, {
+ "id": "2",
+ "name": "Emanuel",
+ "isPermitted": false
+ }, {"id": "3", "name": "vJamie", "isPermitted": false}, {
+ "id": "4",
+ "name": "vVoiceMail",
+ "isPermitted": false
+ }, {"id": "5", "name": "Kennedy", "isPermitted": false}, {
+ "id": "6",
+ "name": "vSEGW",
+ "isPermitted": false
+ }, {"id": "7", "name": "vVM", "isPermitted": false}, {
+ "id": "8",
+ "name": "vOTA",
+ "isPermitted": false
+ }, {"id": "9", "name": "vMME", "isPermitted": false}, {
+ "id": "10",
+ "name": "vMNS",
+ "isPermitted": false
+ }, {"id": "11", "name": "vSCP", "isPermitted": false}, {
+ "id": "12",
+ "name": "VPMS",
+ "isPermitted": false
+ }, {"id": "13", "name": "vMMSC", "isPermitted": false}, {
+ "id": "14",
+ "name": "SSD",
+ "isPermitted": false
+ }, {"id": "15", "name": "vMOG", "isPermitted": false}, {
+ "id": "16",
+ "name": "LINDSEY",
+ "isPermitted": false
+ }, {"id": "17", "name": "JOHANNA_SANTOS", "isPermitted": false}, {
+ "id": "18",
+ "name": "vCarroll",
+ "isPermitted": false
+ }]
+ },
+ "aicZones": [{"id": "NFT1", "name": "NFTJSSSS-NFT1"}, {"id": "JAG1", "name": "YUDFJULP-JAG1"}, {
+ "id": "YYY1",
+ "name": "UUUAIAAI-YYY1"
+ }, {"id": "BAN1", "name": "VSDKYUTP-BAN1"}, {"id": "DKJ1", "name": "DKJSJDKA-DKJ1"}, {
+ "id": "MCS1",
+ "name": "ASACMAMS-MCS1"
+ }, {"id": "UIO1", "name": "uioclli1-UIO1"}, {"id": "RAJ1", "name": "YGBIJNLQ-RAJ1"}, {
+ "id": "OPA1",
+ "name": "opaclli1-OPA1"
+ }, {"id": "SDE1", "name": "ZXCVBNMA-SDE1"}, {"id": "VEN2", "name": "FGHJUHIL-VEN2"}, {
+ "id": "ORL1",
+ "name": "ORLDFLMA-ORL1"
+ }, {"id": "JAD1", "name": "JADECLLI-JAD1"}, {"id": "ZXL1", "name": "LWLWCANN-ZXL1"}, {
+ "id": "CKL1",
+ "name": "CLKSKCKK-CKL1"
+ }, {"id": "SDF1", "name": "sdfclli1-SDF1"}, {"id": "RAD1", "name": "RADICAL1-RAD1"}, {
+ "id": "KIT1",
+ "name": "BHYJFGLN-KIT1"
+ }, {"id": "REL1", "name": "INGERFGT-REL1"}, {"id": "JNL1", "name": "CJALSDAC-JNL1"}, {
+ "id": "OLK1",
+ "name": "OLKOLKLS-OLK1"
+ }, {"id": "CHI1", "name": "CHILLIWE-CHI1"}, {"id": "UUU4", "name": "UUUAAAUU-UUU4"}, {
+ "id": "TUF1",
+ "name": "TUFCLLI1-TUF1"
+ }, {"id": "KJN1", "name": "CKALDKSA-KJN1"}, {"id": "SAM1", "name": "SNDGCA64-SAN1"}, {
+ "id": "SCK1",
+ "name": "SCKSCKSK-SCK1"
+ }, {"id": "HJH1", "name": "AOEEQQQD-HJH1"}, {"id": "HGD1", "name": "SDFQWHGD-HGD1"}, {
+ "id": "KOR1",
+ "name": "HYFLNBVT-KOR1"
+ }, {"id": "ATL43", "name": "AICLOCID-ATL43"}, {"id": "ATL54", "name": "AICFTAAI-ATL54"}, {
+ "id": "ATL66",
+ "name": "CLLIAAII-ATL66"
+ }, {"id": "VEL1", "name": "BNMLKUIK-VEL1"}, {"id": "ICC1", "name": "SANJITAT-ICC1"}, {
+ "id": "MNT11",
+ "name": "WSXEFBTH-MNT11"
+ }, {"id": "DEF2", "name": "WSBHGTYL-DEF2"}, {"id": "MAD11", "name": "SDFQWGKL-MAD11"}, {
+ "id": "OLG1",
+ "name": "OLHOLHOL-OLG1"
+ }, {"id": "GAR1", "name": "NGFVSJKO-GAR1"}, {"id": "SAN22", "name": "GNVLSCTL-SAN22"}, {
+ "id": "HRG1",
+ "name": "HRGHRGGS-HRG1"
+ }, {"id": "JCS1", "name": "JCSJSCJS-JCS1"}, {"id": "DHA12", "name": "WSXEDECF-DHA12"}, {
+ "id": "HJE1",
+ "name": "AOEEWWWD-HJE1"
+ }, {"id": "NCA1", "name": "NCANCANN-NCA1"}, {"id": "IOP1", "name": "iopclli1-IOP1"}, {
+ "id": "RTY1",
+ "name": "rtyclli1-RTY1"
+ }, {"id": "KAP1", "name": "HIOUYTRQ-KAP1"}, {"id": "ZEN1", "name": "ZENCLLI1-ZEN1"}, {
+ "id": "HKA1",
+ "name": "JAKHLASS-HKA1"
+ }, {"id": "CQK1", "name": "CQKSCAKK-CQK1"}, {"id": "SAI1", "name": "UBEKQLPD-SAI1"}, {
+ "id": "ERT1",
+ "name": "ertclli1-ERT1"
+ }, {"id": "IBB1", "name": "PLMKOIJU-IBB1"}, {"id": "TIR2", "name": "PLKINHYI-TIR2"}, {
+ "id": "HSD1",
+ "name": "CHASKCDS-HSD1"
+ }, {"id": "SLF78", "name": "SDCTLFN1-SLF78"}, {"id": "SEE78", "name": "SDCTEEE4-SEE78"}, {
+ "id": "SAN13",
+ "name": "TOKYJPFA-SAN13"
+ }, {"id": "SAA78", "name": "SDCTAAA1-SAA78"}, {"id": "LUC1", "name": "ATLDFGYC-LUC1"}, {
+ "id": "AMD13",
+ "name": "MEMATLAN-AMD13"
+ }, {"id": "TOR1", "name": "TOROONXN-TOR1"}, {"id": "QWE1", "name": "QWECLLI1-QWE1"}, {
+ "id": "ZOG1",
+ "name": "ZOGASTRO-ZOG1"
+ }, {"id": "CAL33", "name": "CALIFORN-CAL33"}, {"id": "SHH78", "name": "SDIT1HHH-SHH78"}, {
+ "id": "DSA1",
+ "name": "LKJHGFDS-DSA1"
+ }, {"id": "CLG1", "name": "CLGRABAD-CLG1"}, {"id": "BNA1", "name": "BNARAGBK-BNA1"}, {
+ "id": "ATL84",
+ "name": "CANTTCOC-ATL84"
+ }, {"id": "APP1", "name": "WBHGTYUI-APP1"}, {"id": "RJN1", "name": "RJNRBZAW-RJN1"}, {
+ "id": "EHH78",
+ "name": "SDCSHHH5-EHH78"
+ }, {"id": "mac10", "name": "PKGTESTF-mac10"}, {"id": "SXB78", "name": "SDCTGXB1-SXB78"}, {
+ "id": "SAX78",
+ "name": "SDCTAXG1-SAX78"
+ }, {"id": "SYD1", "name": "SYDNAUBV-SYD1"}, {"id": "TOK1", "name": "TOKYJPFA-TOK1"}, {
+ "id": "KGM2",
+ "name": "KGMTNC20-KGM2"
+ }, {"id": "DCC1b", "name": "POIUYTGH-DCC1b"}, {"id": "SKK78", "name": "SDCTKKK1-SKK78"}, {
+ "id": "SGG78",
+ "name": "SDCTGGG1-SGG78"
+ }, {"id": "SJJ78", "name": "SDCTJJJ1-SJJ78"}, {"id": "SBX78", "name": "SDCTBXG1-SBX78"}, {
+ "id": "LAG1",
+ "name": "LARGIZON-LAG1"
+ }, {"id": "IAA1", "name": "QAZXSWED-IAA1"}, {"id": "POI1", "name": "PLMNJKIU-POI1"}, {
+ "id": "LAG1a",
+ "name": "LARGIZON-LAG1a"
+ }, {"id": "PBL1", "name": "PBLAPBAI-PBL1"}, {"id": "LAG45", "name": "LARGIZON-LAG1a"}, {
+ "id": "MAR1",
+ "name": "MNBVCXZM-MAR1"
+ }, {"id": "HST70", "name": "HSTNTX70-HST70"}, {"id": "DCC1a", "name": "POIUYTGH-DCC1a"}, {
+ "id": "TOL1",
+ "name": "TOLDOH21-TOL1"
+ }, {"id": "LON1", "name": "LONEENCO-LON1"}, {"id": "SJU78", "name": "SDIT1JUB-SJU78"}, {
+ "id": "STN27",
+ "name": "HSTNTX01-STN27"
+ }, {"id": "SSW56", "name": "ss8126GT-SSW56"}, {"id": "SBB78", "name": "SDIT1BBB-SBB78"}, {
+ "id": "DCC3",
+ "name": "POIUYTGH-DCC3"
+ }, {"id": "GNV1", "name": "GNVLSCTL-GNV1"}, {"id": "WAS1", "name": "WASHDCSW-WAS1"}, {
+ "id": "TOY1",
+ "name": "TORYONNZ-TOY1"
+ }, {"id": "STT1", "name": "STTLWA02-STT1"}, {"id": "STG1", "name": "STTGGE62-STG1"}, {
+ "id": "SLL78",
+ "name": "SDCTLLL1-SLL78"
+ }, {"id": "SBU78", "name": "SDIT1BUB-SBU78"}, {"id": "ATL2", "name": "ATLNGANW-ATL2"}, {
+ "id": "BOT1",
+ "name": "BOTHWAKY-BOT1"
+ }, {"id": "SNG1", "name": "SNGPSIAU-SNG1"}, {"id": "NYC1", "name": "NYCMNY54-NYC1"}, {
+ "id": "LAG1b",
+ "name": "LARGIZON-LAG1b"
+ }, {"id": "AMD15", "name": "AMDFAA01-AMD15"}, {"id": "SNA1", "name": "SNANTXCA-SNA1"}, {
+ "id": "PLT1",
+ "name": "PLTNCA60-PLT1"
+ }, {"id": "TLP1", "name": "TLPNXM18-TLP1"}, {"id": "SDD81", "name": "SAIT1DD6-SDD81"}, {
+ "id": "DCC1",
+ "name": "POIUYTGH-DCC1"
+ }, {"id": "DCC2", "name": "POIUYTGH-DCC2"}, {"id": "OKC1", "name": "OKCBOK55-OKC1"}, {
+ "id": "PAR1",
+ "name": "PARSFRCG-PAR1"
+ }, {"id": "TES36", "name": "ABCEETES-TES36"}, {"id": "COM1", "name": "PLMKOPIU-COM1"}, {
+ "id": "ANI1",
+ "name": "ATLNGTRE-ANI1"
+ }, {"id": "SDG78", "name": "SDIT1BDG-SDG78"}, {"id": "mac20", "name": "PKGTESTF-mac20"}, {
+ "id": "DSF45",
+ "name": "DSFBG123-DSF45"
+ }, {"id": "HST25", "name": "HSTNTX01-HST25"}, {"id": "AMD18", "name": "AUDIMA01-AMD18"}, {
+ "id": "SAA80",
+ "name": "SAIT9AA3-SAA80"
+ }, {"id": "SSA56", "name": "SSIT2AA7-SSA56"}, {"id": "SDD82", "name": "SAIT1DD9-SDD82"}, {
+ "id": "JCV1",
+ "name": "JCVLFLBW-JCV1"
+ }, {"id": "SUL2", "name": "WERTYUJK-SUL2"}, {"id": "PUR1", "name": "purelyde-PUR1"}, {
+ "id": "FDE55",
+ "name": "FDERT555-FDE55"
+ }, {"id": "SITE", "name": "LONEENCO-SITE"}, {"id": "ATL1", "name": "ATLNGAMA-ATL1"}, {
+ "id": "JUL1",
+ "name": "ZXCVBNMM-JUL1"
+ }, {"id": "TAT34", "name": "TESAAISB-TAT34"}, {"id": "XCP12", "name": "CHKGH123-XCP12"}, {
+ "id": "RAI1",
+ "name": "poiuytre-RAI1"
+ }, {"id": "HPO1", "name": "ATLNGAUP-HPO1"}, {"id": "KJF12", "name": "KJFDH123-KJF12"}, {
+ "id": "SCC80",
+ "name": "SAIT9CC3-SCC80"
+ }, {"id": "SAA12", "name": "SAIT9AF8-SAA12"}, {"id": "SAA14", "name": "SAIT1AA9-SAA14"}, {
+ "id": "ATL35",
+ "name": "TTESSAAI-ATL35"
+ }, {"id": "CWY1", "name": "CWYMOWBS-CWY1"}, {"id": "ATL76", "name": "TELEPAAI-ATL76"}, {
+ "id": "DSL12",
+ "name": "DSLFK242-DSL12"
+ }, {"id": "ATL53", "name": "AAIATLTE-ATL53"}, {"id": "SAA11", "name": "SAIT9AA2-SAA11"}, {
+ "id": "ATL62",
+ "name": "TESSASCH-ATL62"
+ }, {"id": "AUG1", "name": "ASDFGHJK-AUG1"}, {"id": "POI22", "name": "POIUY123-POI22"}, {
+ "id": "SAA13",
+ "name": "SAIT1AA9-SAA13"
+ }, {"id": "BHY17", "name": "BHYTFRF3-BHY17"}, {"id": "LIS1", "name": "HOSTPROF-LIS1"}, {
+ "id": "SIP1",
+ "name": "ZXCVBNMK-SIP1"
+ }, {"id": "ATL99", "name": "TEESTAAI-ATL43"}, {"id": "ATL64", "name": "FORLOAAJ-ATL64"}, {
+ "id": "TAT33",
+ "name": "TESAAISA-TAT33"
+ }, {"id": "RAD10", "name": "INDIPUNE-RAD10"}, {"id": "RTW5", "name": "BHYTFRY4-RTW5"}, {
+ "id": "JGS1",
+ "name": "KSJKKKKK-JGS1"
+ }, {"id": "ATL98", "name": "TEESTAAI-ATL43"}, {"id": "WAN1", "name": "LEIWANGW-WAN1"}, {
+ "id": "ATL44",
+ "name": "ATLSANAB-ATL44"
+ }, {"id": "RTD2", "name": "BHYTFRk4-RTD2"}, {"id": "NIR1", "name": "ORFLMANA-NIR1"}, {
+ "id": "ATL75",
+ "name": "SANAAIRE-ATL75"
+ }, {"id": "NUM1", "name": "QWERTYUI-NUM1"}, {"id": "MTN32", "name": "MDTWNJ21-MTN32"}, {
+ "id": "RTZ4",
+ "name": "BHYTFRZ6-RTZ4"
+ }, {"id": "ATL56", "name": "ATLSANAC-ATL56"}, {"id": "AMS1", "name": "AMSTNLBW-AMS1"}, {
+ "id": "RCT1",
+ "name": "AMSTERNL-RCT1"
+ }, {"id": "JAN1", "name": "ORFLMATT-JAN1"}, {"id": "ABC14", "name": "TESAAISA-ABC14"}, {
+ "id": "TAT37",
+ "name": "TESAAISD-TAT37"
+ }, {"id": "MIC54", "name": "MICHIGAN-MIC54"}, {"id": "ABC11", "name": "ATLSANAI-ABC11"}, {
+ "id": "AMF11",
+ "name": "AMDOCS01-AMF11"
+ }, {"id": "ATL63", "name": "ATLSANEW-ATL63"}, {"id": "ABC12", "name": "ATLSECIA-ABC12"}, {
+ "id": "MTN20",
+ "name": "MDTWNJ21-MTN20"
+ }, {"id": "ABC15", "name": "AAITESAN-ABC15"}, {"id": "AVT1", "name": "AVTRFLHD-AVT1"}, {
+ "id": "ATL34",
+ "name": "ATLSANAI-ATL34"
+ }],
+ "categoryParameters": {
+ "owningEntityList": [{
+ "id": "aaa1",
+ "name": "aaa1"
+ }, {"id": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", "name": "WayneHolland"}, {
+ "id": "Melissa",
+ "name": "Melissa"
+ }],
+ "projectList": [{"id": "WATKINS", "name": "WATKINS"}, {"id": "x1", "name": "x1"}, {"id": "yyy1", "name": "yyy1"}],
+ "lineOfBusinessList": [{"id": "ONAP", "name": "ONAP"}, {"id": "zzz1", "name": "zzz1"}],
+ "platformList": [{"id": "platform", "name": "platform"}, {"id": "xxx1", "name": "xxx1"}]
+ },
+ "type": "[LCP_REGIONS_AND_TENANTS] Update",
+ "subscribers": [{
+ "id": "CAR_2020_ER",
+ "name": "CAR_2020_ER",
+ "isPermitted": true
+ }, {
+ "id": "21014aa2-526b-11e6-beb8-9e71128cae77",
+ "name": "JULIO ERICKSON",
+ "isPermitted": false
+ }, {
+ "id": "DHV1707-TestSubscriber-2",
+ "name": "DALE BRIDGES",
+ "isPermitted": false
+ }, {"id": "DHV1707-TestSubscriber-1", "name": "LLOYD BRIDGES", "isPermitted": false}, {
+ "id": "jimmy-example",
+ "name": "JimmyExampleCust-20161102",
+ "isPermitted": false
+ }, {
+ "id": "jimmy-example2",
+ "name": "JimmyExampleCust-20161103",
+ "isPermitted": false
+ }, {
+ "id": "ERICA5779-TestSub-PWT-102",
+ "name": "ERICA5779-TestSub-PWT-102",
+ "isPermitted": false
+ }, {
+ "id": "ERICA5779-TestSub-PWT-101",
+ "name": "ERICA5779-TestSub-PWT-101",
+ "isPermitted": false
+ }, {
+ "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+ "name": "Emanuel",
+ "isPermitted": false
+ }, {
+ "id": "ERICA5779-Subscriber-4",
+ "name": "ERICA5779-Subscriber-5",
+ "isPermitted": false
+ }, {
+ "id": "ERICA5779-TestSub-PWT-103",
+ "name": "ERICA5779-TestSub-PWT-103",
+ "isPermitted": false
+ }, {
+ "id": "ERICA5779-Subscriber-2",
+ "name": "ERICA5779-Subscriber-2",
+ "isPermitted": false
+ }, {
+ "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "name": "SILVIA ROBBINS",
+ "isPermitted": true
+ }, {
+ "id": "ERICA5779-Subscriber-3",
+ "name": "ERICA5779-Subscriber-3",
+ "isPermitted": false
+ }, {"id": "31739f3e-526b-11e6-beb8-9e71128cae77", "name": "CRAIG/ROBERTS", "isPermitted": false}]
+ }
+ };
+ }
+}
+
+class MockFeatureFlagsService {}
+
+describe('VFModule popup service', () => {
+ let injector;
+ let service: VfModulePopuopService;
+ let genericFormService: GenericFormService
+ let defaultDataGeneratorService: DefaultDataGeneratorService;
+ let fb: FormBuilder;
+ let iframeService: IframeService;
+
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+ providers : [
+ VfModulePopuopService,
+ BasicControlGenerator,
+ VfModuleControlGenerator,
+ DefaultDataGeneratorService,
+ GenericFormService,
+ FormBuilder,
+ IframeService,
+ AaiService,
+ LogService,
+ BasicPopupService,
+ {provide:FeatureFlagsService, useClass: MockFeatureFlagsService},
+ {provide: NgRedux, useClass: MockReduxStore},
+ {provide: HttpClient, useClass: MockAppStore},
+ {provide: SdcUiServices.ModalService, useClass: MockModalService}
+ ]
+ });
+ await TestBed.compileComponents();
+
+ injector = getTestBed();
+ service = injector.get(VfModulePopuopService);
+ genericFormService = injector.get(GenericFormService);
+ defaultDataGeneratorService = injector.get(DefaultDataGeneratorService);
+ fb = injector.get(FormBuilder);
+ iframeService = injector.get(IframeService);
+
+ })().then(done).catch(done.fail));
+
+ test('getTitle should return the correct title for edit and create mode', () => {
+ expect(service.getTitle(true)).toBe('Edit Module (Heat stack)');
+ expect(service.getTitle(false)).toBe('Set new Module (Heat stack)');
+ });
+
+ test('getInstance should return new VfModuleInstance', () => {
+ const serviceId : string = '6b528779-44a3-4472-bdff-9cd15ec93450';
+ const vnfStoreKey = null;
+ const vfModuleStoreKey = "VF_vMee 0";
+ let VfModuleInstance ;
+ VfModuleInstance = service.getInstance(serviceId, vnfStoreKey, vfModuleStoreKey);
+ expect (VfModuleInstance).toBeDefined();
+ });
+
+ test('getSubLeftTitle should return network model name', () => {
+ service.model = {
+ 'name' : 'Model name'
+ };
+ expect(service.getSubLeftTitle()).toBe('Model name');
+ });
+
+ test('getSubRightTitle should return popup type', () => {
+ expect(service.getSubRightTitle()).toBe('Module (Heat stack) Instance Details');
+ });
+
+ test('getModelInformation should update modelInformations', () => {
+ const serviceId: string = '6b528779-44a3-4472-bdff-9cd15ec93450';
+ const vfModuleModelName: string = '2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1';
+
+ service.getModelInformation(serviceId, vfModuleModelName);
+ expect(service.modelInformations.length).toEqual(15);
+ expect(service.modelInformations[0].label).toEqual("Subscriber Name");
+ expect(service.modelInformations[0].values).toEqual(['SILVIA ROBBINS']);
+
+ expect(service.modelInformations[1].label).toEqual("Service Name");
+ expect(service.modelInformations[1].values).toEqual(['action-data']);
+
+ expect(service.modelInformations[2].label).toEqual("Service Instance Name");
+ expect(service.modelInformations[2].values).toEqual(['InstanceName']);
+
+ expect(service.modelInformations[3].label).toEqual("Model Name");
+ expect(service.modelInformations[3].values).toEqual(['2017488AdiodVpe..ADIOD_vRE_BV..module-1']);
+
+ expect(service.modelInformations[4].label).toEqual("Model version");
+ expect(service.modelInformations[4].values).toEqual(['6']);
+
+ expect(service.modelInformations[5].label).toEqual("Description");
+ expect(service.modelInformations[5].values).toEqual([null]);
+
+ expect(service.modelInformations[6].label).toEqual("Category");
+ expect(service.modelInformations[6].values).toEqual([undefined]);
+
+ expect(service.modelInformations[7].label).toEqual("Sub Category");
+ expect(service.modelInformations[7].values).toEqual([undefined]);
+
+ expect(service.modelInformations[8].label).toEqual("UUID");
+ expect(service.modelInformations[8].values).toEqual(['25284168-24bb-4698-8cb4-3f509146eca5']);
+
+ expect(service.modelInformations[9].label).toEqual("Invariant UUID");
+ expect(service.modelInformations[9].values).toEqual(['7253ff5c-97f0-4b8b-937c-77aeb4d79aa1']);
+
+ expect(service.modelInformations[10].label).toEqual("Service type");
+ expect(service.modelInformations[10].values).toEqual(['']);
+
+ expect(service.modelInformations[11].label).toEqual("Service role");
+ expect(service.modelInformations[11].values).toEqual(['']);
+
+ expect(service.modelInformations[12].label).toEqual("Minimum to instantiate");
+ expect(service.modelInformations[12].values).toEqual(['0']);
+
+ expect(service.modelInformations[13].label).toEqual("Maximum to instantiate");
+ expect(service.modelInformations[13].values).toEqual(['1']);
+ });
+
+
+ test('onCancel should trigger closeDialogEvent and iframe', () => {
+ let that = <any>{
+ parentElementClassName: 'content',
+ _iframeService: iframeService
+ };
+ jest.spyOn(iframeService, 'removeClassCloseModal');
+ jest.spyOn(service.closeDialogEvent, 'next');
+
+ service.onCancel(that, fb.group({}));
+
+ expect(that._iframeService.removeClassCloseModal).toHaveBeenCalledWith(that.parentElementClassName)
+ expect(service.closeDialogEvent.next).toHaveBeenCalledWith(that);
+ });
+
+ test('onSubmit should trigger onCancel', () => {
+ let that = <any>{
+ parentElementClassName: 'content',
+ _iframeService: iframeService,
+ storeVFModule: () => {
+ },
+ serviceModel: {
+ uuid: 'someUUID'
+ }
+ };
+ let form = fb.group({});
+ jest.spyOn(service, 'onCancel');
+ jest.spyOn(that, 'storeVFModule');
+ jest.spyOn(window.parent, 'postMessage');
+
+ service.onSubmit(that, form);
+
+ expect(service.onCancel).toHaveBeenCalledWith(that, form);
+ expect(that.storeVFModule).toHaveBeenCalledWith(that, form.value);
+ expect(window.parent.postMessage).toHaveBeenCalledWith({
+ eventId: 'submitIframe',
+ data: {
+ serviceModelId: 'someUUID'
+ }
+ }, "*");
+ });
+});
diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service.ts
new file mode 100644
index 000000000..7563f1d2a
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service.ts
@@ -0,0 +1,184 @@
+import {Injectable} from "@angular/core";
+import {FormPopupDetails, PopupType} from "../../../../models/formControlModels/formPopupDetails.model";
+import {BasicControlGenerator} from "../../../genericForm/formControlsServices/basic.control.generator";
+import {AppState} from "../../../../store/reducers";
+import {NgRedux} from "@angular-redux/store";
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import {ModelInformationItem} from "../../../model-information/model-information.component";
+import {Constants} from "../../../../utils/constants";
+import {AaiService} from "../../../../services/aaiService/aai.service";
+import {ServiceModel} from "../../../../models/serviceModel";
+import {FormGroup} from "@angular/forms";
+import {ModelInfo} from "../../../../models/modelInfo";
+import {IframeService} from "../../../../utils/iframe.service";
+import {GenericPopupInterface} from "../generic-popup.interface";
+import {Subject} from "rxjs/Subject";
+import {DefaultDataGeneratorService} from "../../../../services/defaultDataServiceGenerator/default.data.generator.service";
+import {BasicPopupService} from "../basic.popup.service";
+import {VfModuleInstance} from "../../../../models/vfModuleInstance";
+import {VfModuleControlGenerator} from "../../../genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator";
+import {FormControlModel} from "../../../../models/formControlModels/formControl.model";
+import * as _ from 'lodash';
+import {createVFModuleInstance, updateVFModuleInstance} from "../../../../storeUtil/utils/vfModule/vfModule.actions";
+
+@Injectable()
+export class VfModulePopuopService implements GenericPopupInterface {
+ dynamicInputs: any;
+ instance: any;
+ model: any;
+ serviceModel: ServiceModel;
+ modelInformations: ModelInformationItem[] = [];
+ uuidData: Object;
+ closeDialogEvent: Subject<any> = new Subject<any>();
+ isUpdateMode: boolean;
+
+
+ constructor(private _basicControlGenerator: BasicControlGenerator,
+ private _vfModuleControlGenerator: VfModuleControlGenerator,
+ private _iframeService: IframeService,
+ private _defaultDataGeneratorService: DefaultDataGeneratorService,
+ private _aaiService: AaiService,
+ private _basicPopupService : BasicPopupService,
+ private _store: NgRedux<AppState>) {
+
+ }
+
+ getInstance(serviceId: string, vnfStoreKey: string, vfModuleStoreKey: string): any {
+ if (_.isNil(vnfStoreKey) || _.isNil(vfModuleStoreKey)) {
+ return new VfModuleInstance();
+ }
+ const vfModules = this._store.getState().service.serviceInstance[serviceId].vnfs[vnfStoreKey].vfModules;
+ return vfModules[this.uuidData['modelName']][vfModuleStoreKey];
+ }
+
+ getDynamicInputs(UUIDData : Object) : FormControlModel[]{
+ let dynamic = this._defaultDataGeneratorService.getArbitraryInputs(this._store.getState().service.serviceHierarchy[UUIDData['serviceId']].vfModules[UUIDData['modelName']].inputs);
+ return this.getVFModuleDynamicInputs(dynamic, UUIDData);
+ }
+
+ getVFModuleDynamicInputs(dynamicInputs : any, UUIDData : Object) : FormControlModel[] {
+ let result : FormControlModel[] = [];
+ if(dynamicInputs) {
+ let vfModuleInstance = null;
+ if (_.has(this._store.getState().service.serviceInstance[UUIDData['serviceId']].vnfs, UUIDData['vnfStoreKey']) &&
+ _.has(this._store.getState().service.serviceInstance[UUIDData['serviceId']].vnfs[UUIDData['vnfStoreKey']].vfModules, UUIDData['modelName'])) {
+ vfModuleInstance = Object.assign({},this._store.getState().service.serviceInstance[UUIDData['serviceId']].vnfs[UUIDData['vnfStoreKey']].vfModules[UUIDData['modelName']][UUIDData['vfModuleStoreKey']]);
+ }
+ result = this._basicControlGenerator.getDynamicInputs(dynamicInputs, vfModuleInstance);
+ }
+ return result;
+ }
+
+
+ getGenericFormPopupDetails(serviceId: string, vnfStoreKey: string, vfModuleStoreKey: string, node: ITreeNode, uuidData: Object, isUpdateMode: boolean): FormPopupDetails {
+
+ this.uuidData = uuidData;
+ this.instance = this.getInstance(serviceId, vnfStoreKey, vfModuleStoreKey);
+ this.getModelInformation(serviceId, uuidData['modelName']);
+
+ return new FormPopupDetails(this,
+ PopupType.VFMODULE,
+ uuidData,
+ this.getTitle(isUpdateMode),
+ this.getSubLeftTitle(),
+ this.getSubRightTitle(),
+ this.getControls(serviceId, vnfStoreKey, vfModuleStoreKey, isUpdateMode),
+ this.getDynamicInputs(uuidData),
+ this.modelInformations,
+ (that, form: FormGroup) => {that.onSubmit(that, form);},
+ (that: any, form: FormGroup) => {that.onCancel(that, form); }
+ );
+ }
+
+ getModelInformation(serviceId: string, modelName: string) {
+ this._aaiService.getServiceModelById(serviceId).subscribe((result: any) => {
+ this.serviceModel = new ServiceModel(result);
+
+ this.model = this._basicPopupService.getModelFromResponse(result, 'vfModules', modelName);
+ const serviceInstance = this._store.getState().service.serviceInstance[serviceId];
+ this.modelInformations = [
+ new ModelInformationItem("Subscriber Name", "subscriberName", [this._basicPopupService.extractSubscriberNameBySubscriberId(serviceInstance.globalSubscriberId)], "", true),
+ new ModelInformationItem("Service Name", "serviceModelName", [this.serviceModel.name], "", true),
+ new ModelInformationItem("Service Instance Name", "serviceName", [serviceInstance.instanceName], "", false),
+ new ModelInformationItem("Model Name", "modelName", [this.model.name], "", true),
+ new ModelInformationItem("Model version", "modelVersion", [this.model.version], "", true),
+ new ModelInformationItem("Description", "description", [this.model.description]),
+ new ModelInformationItem("Category", "category", [this.model.category]),
+ new ModelInformationItem("Sub Category", "subCategory", [this.model.subCategory]),
+ new ModelInformationItem("UUID", "uuid", [this.model.uuid], Constants.ServicePopup.TOOLTIP_UUID, true),
+ new ModelInformationItem("Invariant UUID", "invariantUuid", [this.model.invariantUuid], Constants.ServicePopup.TOOLTIP_INVARIANT_UUID, true),
+ new ModelInformationItem("Service type", "serviceType", [this.serviceModel.serviceType]),
+ new ModelInformationItem("Service role", "serviceRole", [this.serviceModel.serviceRole]),
+ new ModelInformationItem("Minimum to instantiate", "min", this.model.min == undefined ? ['0'] : [this.model.min.toString()], "", true),
+ new ModelInformationItem("Maximum to instantiate", "max", this.model.max == undefined ? ['1'] : [this.model.max.toString()], "", true),
+ new ModelInformationItem("Recommended to instantiate", "initial", [this.model.initial])
+ ];
+ });
+ }
+
+ getControls(serviceId: string, vnfStoreKey: string, vfModuleStoreKey: string, isUpdateMode: boolean) {
+ if (this._store.getState().service.serviceHierarchy[serviceId].service.instantiationType === 'Macro') {
+ return this._vfModuleControlGenerator.getMacroFormControls(serviceId, vnfStoreKey, vfModuleStoreKey, this.uuidData, isUpdateMode);
+ } else {
+ return this._vfModuleControlGenerator.getAlaCarteFormControls(serviceId, vnfStoreKey, vfModuleStoreKey, this.uuidData, isUpdateMode);
+ }
+ }
+
+
+ onSubmit(that, form: FormGroup) {
+ form.value['instanceParams'] = form.value['instanceParams'] && [form.value['instanceParams']];
+ if (!_.isNil(form.controls['supplementaryFile_hidden_content']) && form.controls['supplementaryFile_hidden_content'].value) {
+ form.value['supplementaryFileContent'] = JSON.parse(form.controls['supplementaryFile_hidden_content'].value);
+ if (!_.isNil(form.controls['supplementaryFile_hidden'].value)) {
+ form.value['supplementaryFileName'] = form.controls['supplementaryFile_hidden'].value.name;
+ }
+ else {
+ form.value['supplementaryFileName'] = that.instance.supplementaryFileName;
+ }
+ }
+ else {
+ delete form.value['supplementaryFileContent'];
+ delete form.value['supplementaryFileName'];
+ }
+ that.storeVFModule(that, form.value);
+ window.parent.postMessage({
+ eventId: 'submitIframe',
+ data: {
+ serviceModelId: that.serviceModel.uuid
+ }
+ }, "*");
+ this.onCancel(that, form);
+ }
+
+
+ onCancel(that, form) {
+ form.reset();
+ that._iframeService.removeClassCloseModal('content');
+ this.closeDialogEvent.next(that);
+ }
+
+ storeVFModule = (that, formValues: any): void => {
+ formValues.modelInfo = new ModelInfo(that.model);
+ formValues.uuid = formValues.modelInfo.uuid;
+ formValues.isMissingData = false;
+ const vnf = that._store.getState().service.serviceInstance[that.uuidData.serviceId].vnfs[that.uuidData.vnfStoreKey];
+
+ if (!that.uuidData.vFModuleStoreKey) {
+ this._store.dispatch(createVFModuleInstance(formValues, that.uuidData.modelName, that.uuidData.serviceId, 0, that.uuidData.vnfStoreKey));
+ } else {
+ this._store.dispatch(updateVFModuleInstance(formValues, that.uuidData.modelName, that.uuidData.serviceId, that.uuidData.vFModuleStoreKey, that.uuidData.vnfStoreKey));
+ }
+ };
+
+ getTitle(isUpdateMode : boolean) : string {
+ return isUpdateMode ? 'Edit Module (Heat stack)' : 'Set new Module (Heat stack)';
+ }
+
+ getSubLeftTitle(): string {
+ return this.model.name;
+ }
+
+ getSubRightTitle(): string {
+ return "Module (Heat stack) Instance Details";
+ }
+}
diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service.spec.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service.spec.ts
new file mode 100644
index 000000000..c77c092f6
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service.spec.ts
@@ -0,0 +1,3242 @@
+import {DefaultDataGeneratorService} from "../../../../services/defaultDataServiceGenerator/default.data.generator.service";
+import {NgRedux} from "@angular-redux/store";
+import {ReflectiveInjector} from "@angular/core";
+import {IframeService} from "../../../../utils/iframe.service";
+import {VfModulePopuopService} from "../vfModule/vfModule.popuop.service";
+import {FormBuilder} from "@angular/forms";
+import {GenericFormService} from "../../../genericForm/generic-form.service";
+import {BasicPopupService} from "../basic.popup.service";
+import {AaiService} from "../../../../services/aaiService/aai.service";
+import {LogService} from "../../../../utils/log/log.service";
+import {HttpClient} from "@angular/common/http";
+import {VnfPopupService} from "./vnf.popup.service";
+import {BasicControlGenerator} from "../../../genericForm/formControlsServices/basic.control.generator";
+import {VnfControlGenerator} from "../../../genericForm/formControlsServices/vnfGenerator/vnf.control.generator";
+import {UUIDData} from "../../generic-form-popup.component";
+import {FeatureFlagsService} from "../../../../services/featureFlag/feature-flags.service";
+import {getTestBed, TestBed} from "@angular/core/testing";
+
+class MockAppStore<T> {}
+
+class MockReduxStore<T> {
+ getState() {
+ return {
+ "global": {
+ "name": null,
+ "flags": {
+ "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false,
+ "FLAG_SHOW_ASSIGNMENTS": true,
+ "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
+ "FLAG_UNASSIGN_SERVICE": true,
+ "FLAG_SHOW_VERIFY_SERVICE": false,
+ "FLAG_COLLECTION_RESOURCE_SUPPORT": true,
+ "FLAG_DUPLICATE_VNF": true,
+ "FLAG_SERVICE_MODEL_CACHE": true,
+ "FLAG_ADVANCED_PORTS_FILTER": true,
+ "CREATE_INSTANCE_TEST": false,
+ "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false,
+ "FLAG_REGION_ID_FROM_REMOTE": true,
+ "FLAG_ASYNC_INSTANTIATION": true,
+ "FLAG_ASYNC_JOBS": true,
+ "EMPTY_DRAWING_BOARD_TEST": false,
+ "FLAG_ADD_MSO_TESTAPI_FIELD": true
+ },
+ "type": "[FLAGS] Update"
+ },
+ "service": {
+ "serviceHierarchy": {
+ "6e59c5de-f052-46fa-aa7e-2fca9d674c44": {
+ "service": {
+ "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "name": "ComplexService",
+ "version": "1.0",
+ "toscaModelURL": null,
+ "category": "Emanuel",
+ "serviceType": "",
+ "serviceRole": "",
+ "description": "ComplexService",
+ "serviceEcompNaming": "false",
+ "instantiationType": "Macro",
+ "inputs": {}
+ },
+ "vnfGroups" : {},
+ "vnfs": {
+ "VF_vMee 0": {
+ "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60",
+ "invariantUuid": "4160458e-f648-4b30-a176-43881ffffe9e",
+ "description": "VSP_vMee",
+ "name": "VF_vMee",
+ "version": "2.0",
+ "customizationUuid": "91415b44-753d-494c-926a-456a9172bbb9",
+ "inputs": {},
+ "commands": {},
+ "properties": {
+ "max_instances": 10,
+ "min_instances": 1,
+ "gpb2_Internal2_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-ipv6-egress_src_start_port": "0",
+ "sctp-a-ipv6-egress_rule_application": "any",
+ "Internal2_allow_transit": "true",
+ "sctp-b-IPv6_ethertype": "IPv6",
+ "sctp-a-egress_rule_application": "any",
+ "sctp-b-ingress_action": "pass",
+ "sctp-b-ingress_rule_protocol": "icmp",
+ "ncb2_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-ipv6-ingress-src_start_port": "0.0",
+ "ncb1_Internal2_mac": "00:11:22:EF:AC:DF",
+ "fsb_volume_size_0": "320.0",
+ "sctp-b-egress_src_addresses": "local",
+ "sctp-a-ipv6-ingress_ethertype": "IPv4",
+ "sctp-a-ipv6-ingress-dst_start_port": "0",
+ "sctp-b-ipv6-ingress_rule_application": "any",
+ "domain_name": "default-domain",
+ "sctp-a-ingress_rule_protocol": "icmp",
+ "sctp-b-egress-src_start_port": "0.0",
+ "sctp-a-egress_src_addresses": "local",
+ "sctp-b-display_name": "epc-sctp-b-ipv4v6-sec-group",
+ "sctp-a-egress-src_start_port": "0.0",
+ "sctp-a-ingress_ethertype": "IPv4",
+ "sctp-b-ipv6-ingress-dst_end_port": "65535",
+ "sctp-b-dst_subnet_prefix_v6": "::",
+ "nf_naming": "{ecomp_generated_naming=true}",
+ "sctp-a-ipv6-ingress_src_subnet_prefix": "0.0.0.0",
+ "sctp-b-egress-dst_start_port": "0.0",
+ "ncb_flavor_name": "nv.c20r64d1",
+ "gpb1_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-egress_dst_subnet_prefix_len": "0.0",
+ "Internal2_net_cidr": "10.0.0.10",
+ "sctp-a-ingress-dst_start_port": "0.0",
+ "sctp-a-egress-dst_start_port": "0.0",
+ "fsb1_Internal2_mac": "00:11:22:EF:AC:DF",
+ "sctp-a-egress_ethertype": "IPv4",
+ "vlc_st_service_mode": "in-network-nat",
+ "sctp-a-ipv6-egress_ethertype": "IPv4",
+ "sctp-a-egress-src_end_port": "65535.0",
+ "sctp-b-ipv6-egress_rule_application": "any",
+ "sctp-b-egress_action": "pass",
+ "sctp-a-ingress-src_subnet_prefix_len": "0.0",
+ "sctp-b-ipv6-ingress-src_end_port": "65535.0",
+ "sctp-b-name": "epc-sctp-b-ipv4v6-sec-group",
+ "fsb2_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-a-ipv6-ingress-src_start_port": "0.0",
+ "sctp-b-ipv6-egress_ethertype": "IPv4",
+ "Internal1_net_cidr": "10.0.0.10",
+ "sctp-a-egress_dst_subnet_prefix": "0.0.0.0",
+ "fsb_flavor_name": "nv.c20r64d1",
+ "sctp_rule_protocol": "132",
+ "sctp-b-ipv6-ingress_src_subnet_prefix_len": "0",
+ "sctp-a-ipv6-ingress_rule_application": "any",
+ "ecomp_generated_naming": "false",
+ "sctp-a-IPv6_ethertype": "IPv6",
+ "vlc2_Internal1_mac": "00:11:22:EF:AC:DF",
+ "vlc_st_virtualization_type": "virtual-machine",
+ "sctp-b-ingress-dst_start_port": "0.0",
+ "sctp-b-ingress-dst_end_port": "65535.0",
+ "sctp-a-ipv6-ingress-src_end_port": "65535.0",
+ "sctp-a-display_name": "epc-sctp-a-ipv4v6-sec-group",
+ "sctp-b-ingress_rule_application": "any",
+ "int2_sec_group_name": "int2-sec-group",
+ "vlc_flavor_name": "nd.c16r64d1",
+ "sctp-b-ipv6-egress_src_addresses": "local",
+ "vlc_st_interface_type_int1": "other1",
+ "sctp-b-egress-src_end_port": "65535.0",
+ "sctp-a-ipv6-egress-dst_start_port": "0",
+ "vlc_st_interface_type_int2": "other2",
+ "sctp-a-ipv6-egress_rule_protocol": "any",
+ "Internal2_shared": "false",
+ "sctp-a-ipv6-egress_dst_subnet_prefix_len": "0",
+ "Internal2_rpf": "disable",
+ "vlc1_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-ipv6-egress_src_end_port": "65535",
+ "sctp-a-ipv6-egress_src_addresses": "local",
+ "sctp-a-ingress-dst_end_port": "65535.0",
+ "sctp-a-ipv6-egress_src_end_port": "65535",
+ "Internal1_forwarding_mode": "l2",
+ "Internal2_dhcp": "false",
+ "sctp-a-dst_subnet_prefix_v6": "::",
+ "pxe_image_name": "MME_PXE-Boot_16ACP04_GA.qcow2",
+ "vlc_st_interface_type_gtp": "other0",
+ "ncb1_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-src_subnet_prefix_v6": "::",
+ "sctp-a-egress_dst_subnet_prefix_len": "0.0",
+ "int1_sec_group_name": "int1-sec-group",
+ "Internal1_dhcp": "false",
+ "sctp-a-ipv6-egress_dst_end_port": "65535",
+ "Internal2_forwarding_mode": "l2",
+ "fsb2_Internal2_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-egress_dst_subnet_prefix": "0.0.0.0",
+ "Internal1_net_cidr_len": "17",
+ "gpb2_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-ingress-src_subnet_prefix_len": "0.0",
+ "sctp-a-ingress_dst_addresses": "local",
+ "sctp-a-egress_action": "pass",
+ "fsb_volume_type_0": "SF-Default-SSD",
+ "ncb2_Internal2_mac": "00:11:22:EF:AC:DF",
+ "vlc_st_interface_type_sctp_a": "left",
+ "vlc_st_interface_type_sctp_b": "right",
+ "sctp-a-src_subnet_prefix_v6": "::",
+ "vlc_st_version": "2",
+ "sctp-b-egress_ethertype": "IPv4",
+ "sctp-a-ingress_rule_application": "any",
+ "gpb1_Internal2_mac": "00:11:22:EF:AC:DF",
+ "instance_ip_family_v6": "v6",
+ "sctp-a-ipv6-egress_src_start_port": "0",
+ "sctp-b-ingress-src_start_port": "0.0",
+ "sctp-b-ingress_dst_addresses": "local",
+ "fsb1_Internal1_mac": "00:11:22:EF:AC:DF",
+ "vlc_st_interface_type_oam": "management",
+ "multi_stage_design": "true",
+ "oam_sec_group_name": "oam-sec-group",
+ "Internal2_net_gateway": "10.0.0.10",
+ "sctp-a-ipv6-ingress-dst_end_port": "65535",
+ "sctp-b-ipv6-egress-dst_start_port": "0",
+ "Internal1_net_gateway": "10.0.0.10",
+ "sctp-b-ipv6-egress_rule_protocol": "any",
+ "gtp_sec_group_name": "gtp-sec-group",
+ "sctp-a-ipv6-egress_dst_subnet_prefix": "0.0.0.0",
+ "sctp-b-ipv6-egress_dst_subnet_prefix_len": "0",
+ "sctp-a-ipv6-ingress_dst_addresses": "local",
+ "sctp-a-egress_rule_protocol": "icmp",
+ "sctp-b-ipv6-egress_action": "pass",
+ "sctp-a-ipv6-egress_action": "pass",
+ "Internal1_shared": "false",
+ "sctp-b-ipv6-ingress_rule_protocol": "any",
+ "Internal2_net_cidr_len": "17",
+ "sctp-a-name": "epc-sctp-a-ipv4v6-sec-group",
+ "sctp-a-ingress-src_end_port": "65535.0",
+ "sctp-b-ipv6-ingress_src_subnet_prefix": "0.0.0.0",
+ "sctp-a-egress-dst_end_port": "65535.0",
+ "sctp-a-ingress_action": "pass",
+ "sctp-b-egress_rule_protocol": "icmp",
+ "sctp-b-ipv6-ingress_action": "pass",
+ "vlc_st_service_type": "firewall",
+ "sctp-b-ipv6-egress_dst_end_port": "65535",
+ "sctp-b-ipv6-ingress-dst_start_port": "0",
+ "vlc2_Internal2_mac": "00:11:22:EF:AC:DF",
+ "vlc_st_availability_zone": "true",
+ "fsb_volume_image_name_1": "MME_FSB2_16ACP04_GA.qcow2",
+ "sctp-b-ingress-src_subnet_prefix": "0.0.0.0",
+ "sctp-a-ipv6-ingress_src_subnet_prefix_len": "0",
+ "Internal1_allow_transit": "true",
+ "gpb_flavor_name": "nv.c20r64d1",
+ "availability_zone_max_count": "1",
+ "fsb_volume_image_name_0": "MME_FSB1_16ACP04_GA.qcow2",
+ "sctp-b-ipv6-ingress_dst_addresses": "local",
+ "sctp-b-ipv6-egress_dst_subnet_prefix": "0.0.0.0",
+ "sctp-b-ipv6-ingress_ethertype": "IPv4",
+ "vlc1_Internal2_mac": "00:11:22:EF:AC:DF",
+ "sctp-a-ingress-src_subnet_prefix": "0.0.0.0",
+ "sctp-a-ipv6-ingress_action": "pass",
+ "Internal1_rpf": "disable",
+ "sctp-b-ingress_ethertype": "IPv4",
+ "sctp-b-egress_rule_application": "any",
+ "sctp-b-ingress-src_end_port": "65535.0",
+ "sctp-a-ipv6-ingress_rule_protocol": "any",
+ "sctp-a-ingress-src_start_port": "0.0",
+ "sctp-b-egress-dst_end_port": "65535.0"
+ },
+ "type": "VF",
+ "modelCustomizationName": "VF_vMee 0",
+ "vfModules": {
+ "vf_vmee0..VfVmee..vmme_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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..vmme_vlc..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "vmme_vlc"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ },
+ "vf_vmee0..VfVmee..vmme_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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..vmme_gpb..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "vmme_gpb"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "vf_vmee0..VfVmee..base_vmme..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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "base_vmme"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "vf_vmee0..VfVmee..base_vmme..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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "base_vmme"
+ },
+ "inputs": {}
+ }
+ },
+ "vfcInstanceGroups": {}
+ }
+ },
+ "networks": {
+ "ExtVL 0": {
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ "invariantUuid": "379f816b-a7aa-422f-be30-17114ff50b7c",
+ "description": "ECOMP generic virtual link (network) base type for all other service-level and global networks",
+ "name": "ExtVL",
+ "version": "37.0",
+ "customizationUuid": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+ "inputs": {},
+ "commands": {},
+ "properties": {
+ "netowrk_role": "role 1, role 2, role 3",
+ "network_assignments": "{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}",
+ "exVL_naming": "{ecomp_generated_naming=true}",
+ "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}",
+ "network_homing": "{ecomp_selected_instance_node_target=false}"
+ },
+ "type": "VL",
+ "modelCustomizationName": "ExtVL 0"
+ }
+ },
+ "collectionResource": {},
+ "configurations": {
+ "Port Mirroring Configuration By Policy 0": {
+ "uuid": "b4398538-e89d-4f13-b33d-ca323434ba50",
+ "invariantUuid": "6ef0ca40-f366-4897-951f-abd65d25f6f7",
+ "description": "A port mirroring configuration by policy object",
+ "name": "Port Mirroring Configuration By Policy",
+ "version": "27.0",
+ "customizationUuid": "3c3b7b8d-8669-4b3b-8664-61970041fad2",
+ "inputs": {},
+ "commands": {},
+ "properties": {},
+ "type": "Configuration",
+ "modelCustomizationName": "Port Mirroring Configuration By Policy 0",
+ "sourceNodes": [],
+ "collectorNodes": null,
+ "configurationByPolicy": false
+ }
+ },
+ "serviceProxies": {},
+ "vfModules": {
+ "vf_vmee0..VfVmee..vmme_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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..vmme_vlc..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "vmme_vlc"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ },
+ "vf_vmee0..VfVmee..vmme_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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..vmme_gpb..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "vmme_gpb"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "vf_vmee0..VfVmee..base_vmme..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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "base_vmme"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "vf_vmee0..VfVmee..base_vmme..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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "base_vmme"
+ },
+ "inputs": {}
+ }
+ },
+ "pnfs": {}
+ },
+ "6b528779-44a3-4472-bdff-9cd15ec93450": {
+ "service": {
+ "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+ "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "name": "action-data",
+ "version": "1.0",
+ "toscaModelURL": null,
+ "category": "",
+ "serviceType": "",
+ "serviceRole": "",
+ "description": "",
+ "serviceEcompNaming": "false",
+ "instantiationType": "A-La-Carte",
+ "inputs": {
+ "2017488_adiodvpe0_ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ }
+ }
+ },
+ "vnfs": {
+ "2017-388_ADIOD-vPE 1": {
+ "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413",
+ "invariantUuid": "00beb8f9-6d39-452f-816d-c709b9cbb87d",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-388_ADIOD-vPE",
+ "version": "1.0",
+ "customizationUuid": "280dec31-f16d-488b-9668-4aae55d6648a",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {
+ "vnf_config_template_version": {
+ "displayName": "vnf_config_template_version",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_config_template_version"
+ },
+ "bandwidth_units": {
+ "displayName": "bandwidth_units",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth_units"
+ },
+ "bandwidth": {
+ "displayName": "bandwidth",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth"
+ },
+ "AIC_CLLI": {
+ "displayName": "AIC_CLLI",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_AIC_CLLI"
+ },
+ "ASN": {
+ "displayName": "ASN",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_ASN"
+ },
+ "vnf_instance_name": {
+ "displayName": "vnf_instance_name",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_instance_name"
+ }
+ },
+ "properties": {
+ "max_instances": 5,
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=false}",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "false",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VF",
+ "modelCustomizationName": "2017-388_ADIOD-vPE 1",
+ "vfModules": {},
+ "volumeGroups": {},
+ "vfcInstanceGroups": {}
+ },
+ "2017-388_ADIOD-vPE 0": {
+ "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168",
+ "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-388_ADIOD-vPE",
+ "version": "4.0",
+ "customizationUuid": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {
+ "vnf_config_template_version": {
+ "displayName": "vnf_config_template_version",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_config_template_version"
+ },
+ "bandwidth_units": {
+ "displayName": "bandwidth_units",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth_units"
+ },
+ "bandwidth": {
+ "displayName": "bandwidth",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth"
+ },
+ "AIC_CLLI": {
+ "displayName": "AIC_CLLI",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_AIC_CLLI"
+ },
+ "ASN": {
+ "displayName": "ASN",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_ASN"
+ },
+ "vnf_instance_name": {
+ "displayName": "vnf_instance_name",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_instance_name"
+ }
+ },
+ "properties": {
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=false}",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "min_instances": "1",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "false",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VF",
+ "modelCustomizationName": "2017-388_ADIOD-vPE 0",
+ "vfModules": {},
+ "volumeGroups": {},
+ "vfcInstanceGroups": {}
+ },
+ "2017-488_ADIOD-vPE 0": {
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-488_ADIOD-vPE",
+ "version": "5.0",
+ "customizationUuid": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {
+ "vnf_config_template_version": {
+ "displayName": "vnf_config_template_version",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_config_template_version"
+ },
+ "bandwidth_units": {
+ "displayName": "bandwidth_units",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth_units"
+ },
+ "bandwidth": {
+ "displayName": "bandwidth",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth"
+ },
+ "AIC_CLLI": {
+ "displayName": "AIC_CLLI",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_AIC_CLLI"
+ },
+ "ASN": {
+ "displayName": "ASN",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_ASN"
+ },
+ "vnf_instance_name": {
+ "displayName": "vnf_instance_name",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_instance_name"
+ }
+ },
+ "properties": {
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=false}",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "max_instances": "3",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "min_instances": "1",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "false",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VF",
+ "modelCustomizationName": "2017-488_ADIOD-vPE 0",
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV"
+ },
+ "inputs": {
+ "adiodvpe0_bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "2017488_adiodvpe0_vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ },
+ "2017488_adiodvpe0_vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "2017488_adiodvpe0_AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "AIC_CLLI"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "adiodvpe0_bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ }
+ },
+ "volumeGroupAllowed": true
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+ "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+ "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+ "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "version": "5",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "ADIOD_base_vPE_BV"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV"
+ },
+ "inputs": {
+ "adiodvpe0_bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "2017488_adiodvpe0_vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ },
+ "2017488_adiodvpe0_vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "2017488_adiodvpe0_AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "AIC_CLLI"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "adiodvpe0_bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ }
+ }
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV"
+ },
+ "inputs": {}
+ }
+ },
+ "vfcInstanceGroups": {}
+ }
+ },
+ "vnfGroups": {},
+ "networks": {
+ "ExtVL 0": {
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ "invariantUuid": "379f816b-a7aa-422f-be30-17114ff50b7c",
+ "description": "ECOMP generic virtual link (network) base type for all other service-level and global networks",
+ "name": "ExtVL",
+ "version": "37.0",
+ "customizationUuid": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {},
+ "properties": {
+ "network_role": "network role 1, network role 2",
+ "min_instances": 1,
+ "max_instances": 10,
+ "network_assignments": "{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}",
+ "exVL_naming": "{ecomp_generated_naming=true}",
+ "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}",
+ "network_homing": "{ecomp_selected_instance_node_target=false}"
+ },
+ "type": "VL",
+ "modelCustomizationName": "ExtVL 0"
+ }
+ },
+ "collectionResource": {},
+ "configurations": {},
+ "fabricConfigurations": {},
+ "serviceProxies": {},
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV"
+ },
+ "inputs": {
+ "adiodvpe0_bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "2017488_adiodvpe0_vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ },
+ "2017488_adiodvpe0_vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "2017488_adiodvpe0_AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "AIC_CLLI"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "adiodvpe0_bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ }
+ },
+ "volumeGroupAllowed": true
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+ "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+ "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+ "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "version": "5",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "ADIOD_base_vPE_BV"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV"
+ },
+ "inputs": {
+ "adiodvpe0_bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "2017488_adiodvpe0_vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ },
+ "2017488_adiodvpe0_vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "2017488_adiodvpe0_AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "AIC_CLLI"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "adiodvpe0_bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ }
+ }
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV"
+ },
+ "inputs": {}
+ }
+ },
+ "pnfs": {}
+ }
+ },
+ "serviceInstance": {
+ "6e59c5de-f052-46fa-aa7e-2fca9d674c44": {
+ "vnfs": {
+ "VF_vMee 0": {
+ "rollbackOnFailure": "true",
+ "vfModules": {
+ "vf_vmee0..VfVmee..base_vmme..module-0": {
+ "vf_vmee0..VfVmee..base_vmme..module-0vmvzo": {
+ "isMissingData": false,
+ "sdncPreReload": null,
+ "modelInfo": {
+ "modelType": "VFmodule",
+ "modelInvariantId": "a6f9e51a-2b35-416a-ae15-15e58d61f36d",
+ "modelVersionId": "a27f5cfc-7f12-4f99-af08-0af9c3885c87",
+ "modelName": "VfVmee..base_vmme..module-0",
+ "modelVersion": "2",
+ "modelCustomizationId": "f8c040f1-7e51-4a11-aca8-acf256cfd861",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0"
+ },
+ "instanceParams": [
+ {}
+ ],
+ "trackById": "wmtm6sy2uj"
+ }
+ }
+ },
+ "isMissingData": true,
+ "originalName": "VF_vMee 0",
+ "vnfStoreKey": "VF_vMee 0",
+ "trackById": "p3wk448m5do",
+ "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60",
+ "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+ "lcpCloudRegionId": null,
+ "tenantId": null,
+ "lineOfBusiness": null,
+ "platformName": null,
+ "modelInfo": {
+ "modelType": "VF",
+ "modelInvariantId": "4160458e-f648-4b30-a176-43881ffffe9e",
+ "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ "modelName": "VF_vMee",
+ "modelVersion": "2.0",
+ "modelCustomizationName": "VF_vMee 0"
+ }
+ }
+ },
+ "vnfGroups": {},
+ "networks": {},
+ "instanceParams": [
+ {}
+ ],
+ "validationCounter": 1,
+ "existingNames": {},
+ "existingVnfGroupCounterMap": {},
+ "existingVNFCounterMap": {
+ "d6557200-ecf2-4641-8094-5393ae3aae60": 1
+ },
+ "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "subscriptionServiceType": "TYLER SILVIA",
+ "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+ "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+ "lcpCloudRegionId": "hvf6",
+ "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+ "aicZoneId": "JAG1",
+ "projectName": "x1",
+ "rollbackOnFailure": "true",
+ "bulkSize": 1,
+ "modelInfo": {
+ "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ "modelName": "ComplexService",
+ "modelVersion": "1.0",
+ "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44"
+ },
+ "isALaCarte": false,
+ "name": "ComplexService",
+ "version": "1.0",
+ "description": "ComplexService",
+ "category": "Emanuel",
+ "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "serviceType": "",
+ "serviceRole": "",
+ "isMultiStepDesign": false
+ },
+ "6b528779-44a3-4472-bdff-9cd15ec93450": {
+ "networks": {
+ "ExtVL 0": {
+ "rollbackOnFailure": "true",
+ "isMissingData": false,
+ "originalName": "ExtVL 0",
+ "networkStoreKey": "ExtVL 0",
+ "trackById": "sf3zth68xjf",
+ "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+ "lcpCloudRegionId": "hvf6",
+ "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+ "platformName": "xxx1",
+ "lineOfBusiness": "ONAP",
+ "instanceParams": [
+ {}
+ ],
+ "modelInfo": {
+ "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c",
+ "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ "modelName": "ExtVL",
+ "modelVersion": "37.0",
+ "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+ "modelCustomizationName": "ExtVL 0",
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+ },
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+ },
+ "ExtVL 0:0001": {
+ "rollbackOnFailure": "true",
+ "isMissingData": false,
+ "originalName": "ExtVL 0",
+ "networkStoreKey": "ExtVL 0",
+ "trackById": "2mdxioxca9h",
+ "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+ "lcpCloudRegionId": "hvf6",
+ "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+ "platformName": "xxx1",
+ "lineOfBusiness": "ONAP",
+ "instanceParams": [
+ {}
+ ],
+ "modelInfo": {
+ "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c",
+ "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ "modelName": "ExtVL",
+ "modelVersion": "37.0",
+ "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+ "modelCustomizationName": "ExtVL 0",
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+ },
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+ },
+ "ExtVL 0_1": {
+ "rollbackOnFailure": "true",
+ "isMissingData": false,
+ "originalName": "ExtVL 0",
+ "networkStoreKey": "ExtVL 0_1",
+ "trackById": "z7vd1gmpbs",
+ "instanceName": "ExtVL",
+ "productFamilyId": "17cc1042-527b-11e6-beb8-9e71128cae77",
+ "lcpCloudRegionId": "hvf6",
+ "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+ "platformName": "xxx1",
+ "lineOfBusiness": "zzz1",
+ "instanceParams": [
+ {
+ "vnf_config_template_version": "17.2",
+ "bandwidth_units": "Gbps",
+ "bandwidth": "10",
+ "AIC_CLLI": "ATLMY8GA",
+ "ASN": "AV_vPE",
+ "vnf_instance_name": "yoav"
+ }
+ ],
+ "modelInfo": {
+ "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c",
+ "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ "modelName": "ExtVL",
+ "modelVersion": "37.0",
+ "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+ "modelCustomizationName": "ExtVL 0",
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+ },
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+ }
+ },
+ "vnfs": {
+ "2017-488_ADIOD-vPE 0": {
+ "rollbackOnFailure": "true",
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1sgoqi": {
+ "instanceName": "yoav",
+ "volumeGroupName": "123",
+ "modelInfo": {
+ "modelInvariantId": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "modelName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "modelVersion": "6",
+ "modelCustomizationId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5"
+ },
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "isMissingData": false,
+ "instanceParams": [
+ {
+ "adiodvpe0_bandwidth": "10",
+ "2017488_adiodvpe0_vnf_instance_name": "mtnj309me6",
+ "2017488_adiodvpe0_vnf_config_template_version": "17.2",
+ "2017488_adiodvpe0_AIC_CLLI": "ATLMY8GA",
+ "adiodvpe0_bandwidth_units": "Gbps"
+ }
+ ]
+ }
+ }
+ },
+ "isMissingData": false,
+ "originalName": "2017-488_ADIOD-vPE 0",
+ "vnfStoreKey": "2017-488_ADIOD-vPE 0",
+ "trackById": "o65b26t2thj",
+ "instanceName": "2017488_ADIODvPE",
+ "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+ "lcpCloudRegionId": "hvf6",
+ "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054",
+ "platformName": "platform",
+ "lineOfBusiness": "ONAP",
+ "instanceParams": [
+ {}
+ ],
+ "modelInfo": {
+ "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "modelVersionId": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "modelName": "2017-488_ADIOD-vPE",
+ "modelVersion": "5.0",
+ "modelCustomizationId": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+ "modelCustomizationName": "2017-488_ADIOD-vPE 0",
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09"
+ },
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09"
+ }
+ },
+ "instanceParams": [
+ {
+ "2017488_adiodvpe0_ASN": "AV_vPE"
+ }
+ ],
+ "validationCounter": 0,
+ "existingNames": {
+ "123": "",
+ "instancename": "",
+ "yoav": "",
+ "extvl": ""
+ },
+ "existingVNFCounterMap": {
+ "69e09f68-8b63-4cc9-b9ff-860960b5db09": 1
+ },
+ "existingNetworksCounterMap": {
+ "ddc3f20c-08b5-40fd-af72-c6d14636b986": 3
+ },
+ "instanceName": "InstanceName",
+ "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "subscriptionServiceType": "TYLER SILVIA",
+ "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+ "productFamilyId": "17cc1042-527b-11e6-beb8-9e71128cae77",
+ "lcpCloudRegionId": "JANET25",
+ "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+ "aicZoneId": "JAG1",
+ "projectName": null,
+ "rollbackOnFailure": "true",
+ "aicZoneName": "YUDFJULP-JAG1",
+ "owningEntityName": "WayneHolland",
+ "testApi": "GR_API",
+ "tenantName": "USP-SIP-IC-24335-T-01",
+ "bulkSize": 1,
+ "modelInfo": {
+ "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "modelVersionId": "6b528779-44a3-4472-bdff-9cd15ec93450",
+ "modelName": "action-data",
+ "modelVersion": "1.0",
+ "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450"
+ },
+ "isALaCarte": false,
+ "name": "action-data",
+ "version": "1.0",
+ "description": "",
+ "category": "",
+ "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+ "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "serviceType": "",
+ "serviceRole": "",
+ "isMultiStepDesign": false
+ }
+ },
+ "lcpRegionsAndTenants": {
+ "lcpRegionList": [
+ {
+ "id": "JANET25",
+ "name": "JANET25",
+ "isPermitted": true
+ },
+ {
+ "id": "hvf6",
+ "name": "hvf6",
+ "isPermitted": true
+ }
+ ],
+ "lcpRegionsTenantsMap": {
+ "JANET25": [
+ {
+ "id": "092eb9e8e4b7412e8787dd091bc58e86",
+ "name": "USP-SIP-IC-24335-T-01",
+ "isPermitted": true
+ }
+ ],
+ "hvf6": [
+ {
+ "id": "bae71557c5bb4d5aac6743a4e5f1d054",
+ "name": "AIN Web Tool-15-D-testalexandria",
+ "isPermitted": true
+ },
+ {
+ "id": "229bcdc6eaeb4ca59d55221141d01f8e",
+ "name": "AIN Web Tool-15-D-STTest2",
+ "isPermitted": true
+ },
+ {
+ "id": "1178612d2b394be4834ad77f567c0af2",
+ "name": "AIN Web Tool-15-D-SSPtestcustome",
+ "isPermitted": true
+ },
+ {
+ "id": "19c5ade915eb461e8af52fb2fd8cd1f2",
+ "name": "AIN Web Tool-15-D-UncheckedEcopm",
+ "isPermitted": true
+ },
+ {
+ "id": "de007636e25249238447264a988a927b",
+ "name": "AIN Web Tool-15-D-dfsdf",
+ "isPermitted": true
+ },
+ {
+ "id": "62f29b3613634ca6a3065cbe0e020c44",
+ "name": "AIN/SMS-16-D-Multiservices1",
+ "isPermitted": true
+ },
+ {
+ "id": "649289e30d3244e0b48098114d63c2aa",
+ "name": "AIN Web Tool-15-D-SSPST66",
+ "isPermitted": true
+ },
+ {
+ "id": "3f21eeea6c2c486bba31dab816c05a32",
+ "name": "AIN Web Tool-15-D-ASSPST47",
+ "isPermitted": true
+ },
+ {
+ "id": "f60ce21d3ee6427586cff0d22b03b773",
+ "name": "CESAR-100-D-sspjg67246",
+ "isPermitted": true
+ },
+ {
+ "id": "8774659e425f479895ae091bb5d46560",
+ "name": "CESAR-100-D-sspjg68359",
+ "isPermitted": true
+ },
+ {
+ "id": "624eb554b0d147c19ff8885341760481",
+ "name": "AINWebTool-15-D-iftach",
+ "isPermitted": true
+ },
+ {
+ "id": "214f55f5fc414c678059c383b03e4962",
+ "name": "CESAR-100-D-sspjg612401",
+ "isPermitted": true
+ },
+ {
+ "id": "c90666c291664841bb98e4d981ff1db5",
+ "name": "CESAR-100-D-sspjg621340",
+ "isPermitted": true
+ },
+ {
+ "id": "ce5b6bc5c7b348e1bf4b91ac9a174278",
+ "name": "sspjg621351cloned",
+ "isPermitted": true
+ },
+ {
+ "id": "b386b768a3f24c8e953abbe0b3488c02",
+ "name": "AINWebTool-15-D-eteancomp",
+ "isPermitted": true
+ },
+ {
+ "id": "dc6c4dbfd225474e9deaadd34968646c",
+ "name": "AINWebTool-15-T-SPFET",
+ "isPermitted": true
+ },
+ {
+ "id": "02cb5030e9914aa4be120bd9ed1e19eb",
+ "name": "AINWebTool-15-X-eeweww",
+ "isPermitted": true
+ },
+ {
+ "id": "f2f3830e4c984d45bcd00e1a04158a79",
+ "name": "CESAR-100-D-spjg61909",
+ "isPermitted": true
+ },
+ {
+ "id": "05b91bd5137f4929878edd965755c06d",
+ "name": "CESAR-100-D-sspjg621512cloned",
+ "isPermitted": true
+ },
+ {
+ "id": "7002fbe8482d4a989ddf445b1ce336e0",
+ "name": "AINWebTool-15-X-vdr",
+ "isPermitted": true
+ },
+ {
+ "id": "4008522be43741dcb1f5422022a2aa0b",
+ "name": "AINWebTool-15-D-ssasa",
+ "isPermitted": true
+ },
+ {
+ "id": "f44e2e96a1b6476abfda2fa407b00169",
+ "name": "AINWebTool-15-D-PFNPT",
+ "isPermitted": true
+ },
+ {
+ "id": "b69a52bec8a84669a37a1e8b72708be7",
+ "name": "AINWebTool-15-X-vdre",
+ "isPermitted": true
+ },
+ {
+ "id": "fac7d9fd56154caeb9332202dcf2969f",
+ "name": "AINWebTool-15-X-NONPODECOMP",
+ "isPermitted": true
+ },
+ {
+ "id": "2d34d8396e194eb49969fd61ffbff961",
+ "name": "DN5242-Nov16-T5",
+ "isPermitted": true
+ },
+ {
+ "id": "cb42a77ff45b48a8b8deb83bb64acc74",
+ "name": "ro-T11",
+ "isPermitted": true
+ },
+ {
+ "id": "fa45ca53c80b492fa8be5477cd84fc2b",
+ "name": "ro-T112",
+ "isPermitted": true
+ },
+ {
+ "id": "4914ab0ab3a743e58f0eefdacc1dde77",
+ "name": "DN5242-Nov21-T1",
+ "isPermitted": true
+ },
+ {
+ "id": "d0a3e3f2964542259d155a81c41aadc3",
+ "name": "test-hvf6-09",
+ "isPermitted": true
+ },
+ {
+ "id": "cbb99fe4ada84631b7baf046b6fd2044",
+ "name": "DN5242-Nov16-T3",
+ "isPermitted": true
+ }
+ ]
+ }
+ },
+ "productFamilies": [
+ {
+ "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+ "name": "SCOTTIE",
+ "isPermitted": true
+ },
+ {
+ "id": "17cc1042-527b-11e6-beb8-9e71128cae77",
+ "name": "IGNACIO",
+ "isPermitted": true
+ },
+ {
+ "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+ "name": "Christie",
+ "isPermitted": true
+ },
+ {
+ "id": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7",
+ "name": "Enhanced Services",
+ "isPermitted": true
+ },
+ {
+ "id": "vTerrance",
+ "name": "vTerrance",
+ "isPermitted": true
+ },
+ {
+ "id": "323d69d9-2efe-4r45-ay0a-89ea7ard4e6f",
+ "name": "vSCP",
+ "isPermitted": true
+ },
+ {
+ "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+ "name": "Emanuel",
+ "isPermitted": true
+ },
+ {
+ "id": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+ "name": "BVOIP",
+ "isPermitted": true
+ },
+ {
+ "id": "db171b8f-115c-4992-a2e3-ee04cae357e0",
+ "name": "LINDSEY",
+ "isPermitted": true
+ },
+ {
+ "id": "LRSI-OSPF",
+ "name": "LRSI-OSPF",
+ "isPermitted": true
+ },
+ {
+ "id": "vRosemarie",
+ "name": "HNGATEWAY",
+ "isPermitted": true
+ },
+ {
+ "id": "vHNPaas",
+ "name": "WILKINS",
+ "isPermitted": true
+ },
+ {
+ "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "name": "TYLER SILVIA",
+ "isPermitted": true
+ },
+ {
+ "id": "b6a3f28c-eebf-494c-a900-055cc7c874ce",
+ "name": "VROUTER",
+ "isPermitted": true
+ },
+ {
+ "id": "Cisneros",
+ "name": "vMuriel",
+ "isPermitted": true
+ },
+ {
+ "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1",
+ "name": "CARA Griffin",
+ "isPermitted": true
+ },
+ {
+ "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d",
+ "name": "DARREN MCGEE",
+ "isPermitted": true
+ },
+ {
+ "id": "e30755dc-5673-4b6b-9dcf-9abdd96b93d1",
+ "name": "Transport",
+ "isPermitted": true
+ },
+ {
+ "id": "vSalvatore",
+ "name": "vSalvatore",
+ "isPermitted": true
+ },
+ {
+ "id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4",
+ "name": "Josefina",
+ "isPermitted": true
+ },
+ {
+ "id": "vHubbard",
+ "name": "vHubbard",
+ "isPermitted": true
+ },
+ {
+ "id": "12a96a9d-4b4c-4349-a950-fe1159602621",
+ "name": "DARREN MCGEE",
+ "isPermitted": true
+ }
+ ],
+ "serviceTypes": {
+ "e433710f-9217-458d-a79d-1c7aff376d89": [
+ {
+ "id": "0",
+ "name": "vRichardson",
+ "isPermitted": false
+ },
+ {
+ "id": "1",
+ "name": "TYLER SILVIA",
+ "isPermitted": true
+ },
+ {
+ "id": "2",
+ "name": "Emanuel",
+ "isPermitted": false
+ },
+ {
+ "id": "3",
+ "name": "vJamie",
+ "isPermitted": false
+ },
+ {
+ "id": "4",
+ "name": "vVoiceMail",
+ "isPermitted": false
+ },
+ {
+ "id": "5",
+ "name": "Kennedy",
+ "isPermitted": false
+ },
+ {
+ "id": "6",
+ "name": "vSEGW",
+ "isPermitted": false
+ },
+ {
+ "id": "7",
+ "name": "vVM",
+ "isPermitted": false
+ },
+ {
+ "id": "8",
+ "name": "vOTA",
+ "isPermitted": false
+ },
+ {
+ "id": "9",
+ "name": "vMME",
+ "isPermitted": false
+ },
+ {
+ "id": "10",
+ "name": "vMNS",
+ "isPermitted": false
+ },
+ {
+ "id": "11",
+ "name": "vSCP",
+ "isPermitted": false
+ },
+ {
+ "id": "12",
+ "name": "VPMS",
+ "isPermitted": false
+ },
+ {
+ "id": "13",
+ "name": "vMMSC",
+ "isPermitted": false
+ },
+ {
+ "id": "14",
+ "name": "SSD",
+ "isPermitted": false
+ },
+ {
+ "id": "15",
+ "name": "vMOG",
+ "isPermitted": false
+ },
+ {
+ "id": "16",
+ "name": "LINDSEY",
+ "isPermitted": false
+ },
+ {
+ "id": "17",
+ "name": "JOHANNA_SANTOS",
+ "isPermitted": false
+ },
+ {
+ "id": "18",
+ "name": "vCarroll",
+ "isPermitted": false
+ }
+ ]
+ },
+ "aicZones": [
+ {
+ "id": "NFT1",
+ "name": "NFTJSSSS-NFT1"
+ },
+ {
+ "id": "JAG1",
+ "name": "YUDFJULP-JAG1"
+ },
+ {
+ "id": "YYY1",
+ "name": "UUUAIAAI-YYY1"
+ },
+ {
+ "id": "BAN1",
+ "name": "VSDKYUTP-BAN1"
+ },
+ {
+ "id": "DKJ1",
+ "name": "DKJSJDKA-DKJ1"
+ },
+ {
+ "id": "MCS1",
+ "name": "ASACMAMS-MCS1"
+ },
+ {
+ "id": "UIO1",
+ "name": "uioclli1-UIO1"
+ },
+ {
+ "id": "RAJ1",
+ "name": "YGBIJNLQ-RAJ1"
+ },
+ {
+ "id": "OPA1",
+ "name": "opaclli1-OPA1"
+ },
+ {
+ "id": "SDE1",
+ "name": "ZXCVBNMA-SDE1"
+ },
+ {
+ "id": "VEN2",
+ "name": "FGHJUHIL-VEN2"
+ },
+ {
+ "id": "ORL1",
+ "name": "ORLDFLMA-ORL1"
+ },
+ {
+ "id": "JAD1",
+ "name": "JADECLLI-JAD1"
+ },
+ {
+ "id": "ZXL1",
+ "name": "LWLWCANN-ZXL1"
+ },
+ {
+ "id": "CKL1",
+ "name": "CLKSKCKK-CKL1"
+ },
+ {
+ "id": "SDF1",
+ "name": "sdfclli1-SDF1"
+ },
+ {
+ "id": "RAD1",
+ "name": "RADICAL1-RAD1"
+ },
+ {
+ "id": "KIT1",
+ "name": "BHYJFGLN-KIT1"
+ },
+ {
+ "id": "REL1",
+ "name": "INGERFGT-REL1"
+ },
+ {
+ "id": "JNL1",
+ "name": "CJALSDAC-JNL1"
+ },
+ {
+ "id": "OLK1",
+ "name": "OLKOLKLS-OLK1"
+ },
+ {
+ "id": "CHI1",
+ "name": "CHILLIWE-CHI1"
+ },
+ {
+ "id": "UUU4",
+ "name": "UUUAAAUU-UUU4"
+ },
+ {
+ "id": "TUF1",
+ "name": "TUFCLLI1-TUF1"
+ },
+ {
+ "id": "KJN1",
+ "name": "CKALDKSA-KJN1"
+ },
+ {
+ "id": "SAM1",
+ "name": "SNDGCA64-SAN1"
+ },
+ {
+ "id": "SCK1",
+ "name": "SCKSCKSK-SCK1"
+ },
+ {
+ "id": "HJH1",
+ "name": "AOEEQQQD-HJH1"
+ },
+ {
+ "id": "HGD1",
+ "name": "SDFQWHGD-HGD1"
+ },
+ {
+ "id": "KOR1",
+ "name": "HYFLNBVT-KOR1"
+ },
+ {
+ "id": "ATL43",
+ "name": "AICLOCID-ATL43"
+ },
+ {
+ "id": "ATL54",
+ "name": "AICFTAAI-ATL54"
+ },
+ {
+ "id": "ATL66",
+ "name": "CLLIAAII-ATL66"
+ },
+ {
+ "id": "VEL1",
+ "name": "BNMLKUIK-VEL1"
+ },
+ {
+ "id": "ICC1",
+ "name": "SANJITAT-ICC1"
+ },
+ {
+ "id": "MNT11",
+ "name": "WSXEFBTH-MNT11"
+ },
+ {
+ "id": "DEF2",
+ "name": "WSBHGTYL-DEF2"
+ },
+ {
+ "id": "MAD11",
+ "name": "SDFQWGKL-MAD11"
+ },
+ {
+ "id": "OLG1",
+ "name": "OLHOLHOL-OLG1"
+ },
+ {
+ "id": "GAR1",
+ "name": "NGFVSJKO-GAR1"
+ },
+ {
+ "id": "SAN22",
+ "name": "GNVLSCTL-SAN22"
+ },
+ {
+ "id": "HRG1",
+ "name": "HRGHRGGS-HRG1"
+ },
+ {
+ "id": "JCS1",
+ "name": "JCSJSCJS-JCS1"
+ },
+ {
+ "id": "DHA12",
+ "name": "WSXEDECF-DHA12"
+ },
+ {
+ "id": "HJE1",
+ "name": "AOEEWWWD-HJE1"
+ },
+ {
+ "id": "NCA1",
+ "name": "NCANCANN-NCA1"
+ },
+ {
+ "id": "IOP1",
+ "name": "iopclli1-IOP1"
+ },
+ {
+ "id": "RTY1",
+ "name": "rtyclli1-RTY1"
+ },
+ {
+ "id": "KAP1",
+ "name": "HIOUYTRQ-KAP1"
+ },
+ {
+ "id": "ZEN1",
+ "name": "ZENCLLI1-ZEN1"
+ },
+ {
+ "id": "HKA1",
+ "name": "JAKHLASS-HKA1"
+ },
+ {
+ "id": "CQK1",
+ "name": "CQKSCAKK-CQK1"
+ },
+ {
+ "id": "SAI1",
+ "name": "UBEKQLPD-SAI1"
+ },
+ {
+ "id": "ERT1",
+ "name": "ertclli1-ERT1"
+ },
+ {
+ "id": "IBB1",
+ "name": "PLMKOIJU-IBB1"
+ },
+ {
+ "id": "TIR2",
+ "name": "PLKINHYI-TIR2"
+ },
+ {
+ "id": "HSD1",
+ "name": "CHASKCDS-HSD1"
+ },
+ {
+ "id": "SLF78",
+ "name": "SDCTLFN1-SLF78"
+ },
+ {
+ "id": "SEE78",
+ "name": "SDCTEEE4-SEE78"
+ },
+ {
+ "id": "SAN13",
+ "name": "TOKYJPFA-SAN13"
+ },
+ {
+ "id": "SAA78",
+ "name": "SDCTAAA1-SAA78"
+ },
+ {
+ "id": "LUC1",
+ "name": "ATLDFGYC-LUC1"
+ },
+ {
+ "id": "AMD13",
+ "name": "MEMATLAN-AMD13"
+ },
+ {
+ "id": "TOR1",
+ "name": "TOROONXN-TOR1"
+ },
+ {
+ "id": "QWE1",
+ "name": "QWECLLI1-QWE1"
+ },
+ {
+ "id": "ZOG1",
+ "name": "ZOGASTRO-ZOG1"
+ },
+ {
+ "id": "CAL33",
+ "name": "CALIFORN-CAL33"
+ },
+ {
+ "id": "SHH78",
+ "name": "SDIT1HHH-SHH78"
+ },
+ {
+ "id": "DSA1",
+ "name": "LKJHGFDS-DSA1"
+ },
+ {
+ "id": "CLG1",
+ "name": "CLGRABAD-CLG1"
+ },
+ {
+ "id": "BNA1",
+ "name": "BNARAGBK-BNA1"
+ },
+ {
+ "id": "ATL84",
+ "name": "CANTTCOC-ATL84"
+ },
+ {
+ "id": "APP1",
+ "name": "WBHGTYUI-APP1"
+ },
+ {
+ "id": "RJN1",
+ "name": "RJNRBZAW-RJN1"
+ },
+ {
+ "id": "EHH78",
+ "name": "SDCSHHH5-EHH78"
+ },
+ {
+ "id": "mac10",
+ "name": "PKGTESTF-mac10"
+ },
+ {
+ "id": "SXB78",
+ "name": "SDCTGXB1-SXB78"
+ },
+ {
+ "id": "SAX78",
+ "name": "SDCTAXG1-SAX78"
+ },
+ {
+ "id": "SYD1",
+ "name": "SYDNAUBV-SYD1"
+ },
+ {
+ "id": "TOK1",
+ "name": "TOKYJPFA-TOK1"
+ },
+ {
+ "id": "KGM2",
+ "name": "KGMTNC20-KGM2"
+ },
+ {
+ "id": "DCC1b",
+ "name": "POIUYTGH-DCC1b"
+ },
+ {
+ "id": "SKK78",
+ "name": "SDCTKKK1-SKK78"
+ },
+ {
+ "id": "SGG78",
+ "name": "SDCTGGG1-SGG78"
+ },
+ {
+ "id": "SJJ78",
+ "name": "SDCTJJJ1-SJJ78"
+ },
+ {
+ "id": "SBX78",
+ "name": "SDCTBXG1-SBX78"
+ },
+ {
+ "id": "LAG1",
+ "name": "LARGIZON-LAG1"
+ },
+ {
+ "id": "IAA1",
+ "name": "QAZXSWED-IAA1"
+ },
+ {
+ "id": "POI1",
+ "name": "PLMNJKIU-POI1"
+ },
+ {
+ "id": "LAG1a",
+ "name": "LARGIZON-LAG1a"
+ },
+ {
+ "id": "PBL1",
+ "name": "PBLAPBAI-PBL1"
+ },
+ {
+ "id": "LAG45",
+ "name": "LARGIZON-LAG1a"
+ },
+ {
+ "id": "MAR1",
+ "name": "MNBVCXZM-MAR1"
+ },
+ {
+ "id": "HST70",
+ "name": "HSTNTX70-HST70"
+ },
+ {
+ "id": "DCC1a",
+ "name": "POIUYTGH-DCC1a"
+ },
+ {
+ "id": "TOL1",
+ "name": "TOLDOH21-TOL1"
+ },
+ {
+ "id": "LON1",
+ "name": "LONEENCO-LON1"
+ },
+ {
+ "id": "SJU78",
+ "name": "SDIT1JUB-SJU78"
+ },
+ {
+ "id": "STN27",
+ "name": "HSTNTX01-STN27"
+ },
+ {
+ "id": "SSW56",
+ "name": "ss8126GT-SSW56"
+ },
+ {
+ "id": "SBB78",
+ "name": "SDIT1BBB-SBB78"
+ },
+ {
+ "id": "DCC3",
+ "name": "POIUYTGH-DCC3"
+ },
+ {
+ "id": "GNV1",
+ "name": "GNVLSCTL-GNV1"
+ },
+ {
+ "id": "WAS1",
+ "name": "WASHDCSW-WAS1"
+ },
+ {
+ "id": "TOY1",
+ "name": "TORYONNZ-TOY1"
+ },
+ {
+ "id": "STT1",
+ "name": "STTLWA02-STT1"
+ },
+ {
+ "id": "STG1",
+ "name": "STTGGE62-STG1"
+ },
+ {
+ "id": "SLL78",
+ "name": "SDCTLLL1-SLL78"
+ },
+ {
+ "id": "SBU78",
+ "name": "SDIT1BUB-SBU78"
+ },
+ {
+ "id": "ATL2",
+ "name": "ATLNGANW-ATL2"
+ },
+ {
+ "id": "BOT1",
+ "name": "BOTHWAKY-BOT1"
+ },
+ {
+ "id": "SNG1",
+ "name": "SNGPSIAU-SNG1"
+ },
+ {
+ "id": "NYC1",
+ "name": "NYCMNY54-NYC1"
+ },
+ {
+ "id": "LAG1b",
+ "name": "LARGIZON-LAG1b"
+ },
+ {
+ "id": "AMD15",
+ "name": "AMDFAA01-AMD15"
+ },
+ {
+ "id": "SNA1",
+ "name": "SNANTXCA-SNA1"
+ },
+ {
+ "id": "PLT1",
+ "name": "PLTNCA60-PLT1"
+ },
+ {
+ "id": "TLP1",
+ "name": "TLPNXM18-TLP1"
+ },
+ {
+ "id": "SDD81",
+ "name": "SAIT1DD6-SDD81"
+ },
+ {
+ "id": "DCC1",
+ "name": "POIUYTGH-DCC1"
+ },
+ {
+ "id": "DCC2",
+ "name": "POIUYTGH-DCC2"
+ },
+ {
+ "id": "OKC1",
+ "name": "OKCBOK55-OKC1"
+ },
+ {
+ "id": "PAR1",
+ "name": "PARSFRCG-PAR1"
+ },
+ {
+ "id": "TES36",
+ "name": "ABCEETES-TES36"
+ },
+ {
+ "id": "COM1",
+ "name": "PLMKOPIU-COM1"
+ },
+ {
+ "id": "ANI1",
+ "name": "ATLNGTRE-ANI1"
+ },
+ {
+ "id": "SDG78",
+ "name": "SDIT1BDG-SDG78"
+ },
+ {
+ "id": "mac20",
+ "name": "PKGTESTF-mac20"
+ },
+ {
+ "id": "DSF45",
+ "name": "DSFBG123-DSF45"
+ },
+ {
+ "id": "HST25",
+ "name": "HSTNTX01-HST25"
+ },
+ {
+ "id": "AMD18",
+ "name": "AUDIMA01-AMD18"
+ },
+ {
+ "id": "SAA80",
+ "name": "SAIT9AA3-SAA80"
+ },
+ {
+ "id": "SSA56",
+ "name": "SSIT2AA7-SSA56"
+ },
+ {
+ "id": "SDD82",
+ "name": "SAIT1DD9-SDD82"
+ },
+ {
+ "id": "JCV1",
+ "name": "JCVLFLBW-JCV1"
+ },
+ {
+ "id": "SUL2",
+ "name": "WERTYUJK-SUL2"
+ },
+ {
+ "id": "PUR1",
+ "name": "purelyde-PUR1"
+ },
+ {
+ "id": "FDE55",
+ "name": "FDERT555-FDE55"
+ },
+ {
+ "id": "SITE",
+ "name": "LONEENCO-SITE"
+ },
+ {
+ "id": "ATL1",
+ "name": "ATLNGAMA-ATL1"
+ },
+ {
+ "id": "JUL1",
+ "name": "ZXCVBNMM-JUL1"
+ },
+ {
+ "id": "TAT34",
+ "name": "TESAAISB-TAT34"
+ },
+ {
+ "id": "XCP12",
+ "name": "CHKGH123-XCP12"
+ },
+ {
+ "id": "RAI1",
+ "name": "poiuytre-RAI1"
+ },
+ {
+ "id": "HPO1",
+ "name": "ATLNGAUP-HPO1"
+ },
+ {
+ "id": "KJF12",
+ "name": "KJFDH123-KJF12"
+ },
+ {
+ "id": "SCC80",
+ "name": "SAIT9CC3-SCC80"
+ },
+ {
+ "id": "SAA12",
+ "name": "SAIT9AF8-SAA12"
+ },
+ {
+ "id": "SAA14",
+ "name": "SAIT1AA9-SAA14"
+ },
+ {
+ "id": "ATL35",
+ "name": "TTESSAAI-ATL35"
+ },
+ {
+ "id": "CWY1",
+ "name": "CWYMOWBS-CWY1"
+ },
+ {
+ "id": "ATL76",
+ "name": "TELEPAAI-ATL76"
+ },
+ {
+ "id": "DSL12",
+ "name": "DSLFK242-DSL12"
+ },
+ {
+ "id": "ATL53",
+ "name": "AAIATLTE-ATL53"
+ },
+ {
+ "id": "SAA11",
+ "name": "SAIT9AA2-SAA11"
+ },
+ {
+ "id": "ATL62",
+ "name": "TESSASCH-ATL62"
+ },
+ {
+ "id": "AUG1",
+ "name": "ASDFGHJK-AUG1"
+ },
+ {
+ "id": "POI22",
+ "name": "POIUY123-POI22"
+ },
+ {
+ "id": "SAA13",
+ "name": "SAIT1AA9-SAA13"
+ },
+ {
+ "id": "BHY17",
+ "name": "BHYTFRF3-BHY17"
+ },
+ {
+ "id": "LIS1",
+ "name": "HOSTPROF-LIS1"
+ },
+ {
+ "id": "SIP1",
+ "name": "ZXCVBNMK-SIP1"
+ },
+ {
+ "id": "ATL99",
+ "name": "TEESTAAI-ATL43"
+ },
+ {
+ "id": "ATL64",
+ "name": "FORLOAAJ-ATL64"
+ },
+ {
+ "id": "TAT33",
+ "name": "TESAAISA-TAT33"
+ },
+ {
+ "id": "RAD10",
+ "name": "INDIPUNE-RAD10"
+ },
+ {
+ "id": "RTW5",
+ "name": "BHYTFRY4-RTW5"
+ },
+ {
+ "id": "JGS1",
+ "name": "KSJKKKKK-JGS1"
+ },
+ {
+ "id": "ATL98",
+ "name": "TEESTAAI-ATL43"
+ },
+ {
+ "id": "WAN1",
+ "name": "LEIWANGW-WAN1"
+ },
+ {
+ "id": "ATL44",
+ "name": "ATLSANAB-ATL44"
+ },
+ {
+ "id": "RTD2",
+ "name": "BHYTFRk4-RTD2"
+ },
+ {
+ "id": "NIR1",
+ "name": "ORFLMANA-NIR1"
+ },
+ {
+ "id": "ATL75",
+ "name": "SANAAIRE-ATL75"
+ },
+ {
+ "id": "NUM1",
+ "name": "QWERTYUI-NUM1"
+ },
+ {
+ "id": "MTN32",
+ "name": "MDTWNJ21-MTN32"
+ },
+ {
+ "id": "RTZ4",
+ "name": "BHYTFRZ6-RTZ4"
+ },
+ {
+ "id": "ATL56",
+ "name": "ATLSANAC-ATL56"
+ },
+ {
+ "id": "AMS1",
+ "name": "AMSTNLBW-AMS1"
+ },
+ {
+ "id": "RCT1",
+ "name": "AMSTERNL-RCT1"
+ },
+ {
+ "id": "JAN1",
+ "name": "ORFLMATT-JAN1"
+ },
+ {
+ "id": "ABC14",
+ "name": "TESAAISA-ABC14"
+ },
+ {
+ "id": "TAT37",
+ "name": "TESAAISD-TAT37"
+ },
+ {
+ "id": "MIC54",
+ "name": "MICHIGAN-MIC54"
+ },
+ {
+ "id": "ABC11",
+ "name": "ATLSANAI-ABC11"
+ },
+ {
+ "id": "AMF11",
+ "name": "AMDOCS01-AMF11"
+ },
+ {
+ "id": "ATL63",
+ "name": "ATLSANEW-ATL63"
+ },
+ {
+ "id": "ABC12",
+ "name": "ATLSECIA-ABC12"
+ },
+ {
+ "id": "MTN20",
+ "name": "MDTWNJ21-MTN20"
+ },
+ {
+ "id": "ABC15",
+ "name": "AAITESAN-ABC15"
+ },
+ {
+ "id": "AVT1",
+ "name": "AVTRFLHD-AVT1"
+ },
+ {
+ "id": "ATL34",
+ "name": "ATLSANAI-ATL34"
+ }
+ ],
+ "categoryParameters": {
+ "owningEntityList": [
+ {
+ "id": "aaa1",
+ "name": "aaa1"
+ },
+ {
+ "id": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+ "name": "WayneHolland"
+ },
+ {
+ "id": "Melissa",
+ "name": "Melissa"
+ }
+ ],
+ "projectList": [
+ {
+ "id": "WATKINS",
+ "name": "WATKINS"
+ },
+ {
+ "id": "x1",
+ "name": "x1"
+ },
+ {
+ "id": "yyy1",
+ "name": "yyy1"
+ }
+ ],
+ "lineOfBusinessList": [
+ {
+ "id": "ONAP",
+ "name": "ONAP"
+ },
+ {
+ "id": "zzz1",
+ "name": "zzz1"
+ }
+ ],
+ "platformList": [
+ {
+ "id": "platform",
+ "name": "platform"
+ },
+ {
+ "id": "xxx1",
+ "name": "xxx1"
+ }
+ ]
+ },
+ "type": "[LCP_REGIONS_AND_TENANTS] Update",
+ "subscribers": [
+ {
+ "id": "CAR_2020_ER",
+ "name": "CAR_2020_ER",
+ "isPermitted": true
+ },
+ {
+ "id": "21014aa2-526b-11e6-beb8-9e71128cae77",
+ "name": "JULIO ERICKSON",
+ "isPermitted": false
+ },
+ {
+ "id": "DHV1707-TestSubscriber-2",
+ "name": "DALE BRIDGES",
+ "isPermitted": false
+ },
+ {
+ "id": "DHV1707-TestSubscriber-1",
+ "name": "LLOYD BRIDGES",
+ "isPermitted": false
+ },
+ {
+ "id": "jimmy-example",
+ "name": "JimmyExampleCust-20161102",
+ "isPermitted": false
+ },
+ {
+ "id": "jimmy-example2",
+ "name": "JimmyExampleCust-20161103",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-TestSub-PWT-102",
+ "name": "ERICA5779-TestSub-PWT-102",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-TestSub-PWT-101",
+ "name": "ERICA5779-TestSub-PWT-101",
+ "isPermitted": false
+ },
+ {
+ "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+ "name": "Emanuel",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-Subscriber-4",
+ "name": "ERICA5779-Subscriber-5",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-TestSub-PWT-103",
+ "name": "ERICA5779-TestSub-PWT-103",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-Subscriber-2",
+ "name": "ERICA5779-Subscriber-2",
+ "isPermitted": false
+ },
+ {
+ "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "name": "SILVIA ROBBINS",
+ "isPermitted": true
+ },
+ {
+ "id": "ERICA5779-Subscriber-3",
+ "name": "ERICA5779-Subscriber-3",
+ "isPermitted": false
+ },
+ {
+ "id": "31739f3e-526b-11e6-beb8-9e71128cae77",
+ "name": "CRAIG/ROBERTS",
+ "isPermitted": false
+ }
+ ]
+ }
+ };
+ }
+}
+
+class MockFeatureFlagsService {}
+
+describe('vnf new popup service', () => {
+ let injector;
+ let service: VnfPopupService;
+ let genericFormService: GenericFormService
+ let defaultDataGeneratorService: DefaultDataGeneratorService;
+ let fb: FormBuilder;
+ let iframeService: IframeService;
+
+
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+ providers : [
+ VnfPopupService,
+ DefaultDataGeneratorService,
+ GenericFormService,
+ FormBuilder,
+ IframeService,
+ {provide:FeatureFlagsService, useClass: MockFeatureFlagsService},
+ AaiService,
+ LogService,
+ BasicPopupService,
+ VfModulePopuopService,
+ BasicControlGenerator,
+ VnfControlGenerator,
+ {provide: NgRedux, useClass: MockReduxStore},
+ {provide: HttpClient, useClass: MockAppStore},
+ ]
+ });
+ await TestBed.compileComponents();
+
+ injector = getTestBed();
+ service = injector.get(VnfPopupService);
+ genericFormService = injector.get(GenericFormService);
+ defaultDataGeneratorService = injector.get(DefaultDataGeneratorService);
+ fb = injector.get(FormBuilder);
+ iframeService = injector.get(IframeService);
+
+ })().then(done).catch(done.fail));
+
+ test('getTitle vnf should return the correct title for edit and create mode', () => {
+ expect(service.getTitle(false)).toBe('Set a new VNF');
+ expect(service.getTitle(true)).toBe('Edit VNF instance');
+ });
+
+ test('getSubRightTitle vnf should return popup type', () => {
+ expect(service.getSubRightTitle()).toBe('VNF Instance Details');
+ });
+
+ test('getModelInformation vnf should update modelInformations', () => {
+ const serviceId: string = '6b528779-44a3-4472-bdff-9cd15ec93450';
+ const vnfModelName: string = '2017-388_ADIOD-vPE 1';
+ service.getModelInformation(serviceId, vnfModelName);
+ expect(service.modelInformations.length).toEqual(14);
+ expect(service.modelInformations[0].label).toEqual("Subscriber Name");
+ expect(service.modelInformations[0].values).toEqual(['SILVIA ROBBINS']);
+
+ expect(service.modelInformations[1].label).toEqual("Service Name");
+ expect(service.modelInformations[1].values).toEqual(['action-data']);
+
+ expect(service.modelInformations[2].label).toEqual("Service Instance Name");
+ expect(service.modelInformations[2].values).toEqual(['InstanceName']);
+
+ expect(service.modelInformations[3].label).toEqual("Model Name");
+ expect(service.modelInformations[3].values).toEqual(['2017-388_ADIOD-vPE']);
+
+ expect(service.modelInformations[4].label).toEqual("Model version");
+ expect(service.modelInformations[4].values).toEqual(['1.0']);
+
+ expect(service.modelInformations[5].label).toEqual("Description");
+ expect(service.modelInformations[5].values).toEqual(['Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM']);
+
+ expect(service.modelInformations[6].label).toEqual("Category");
+ expect(service.modelInformations[6].values).toEqual([undefined]);
+
+ expect(service.modelInformations[7].label).toEqual("Sub Category");
+ expect(service.modelInformations[7].values).toEqual([undefined]);
+
+ expect(service.modelInformations[8].label).toEqual("UUID");
+ expect(service.modelInformations[8].values).toEqual(['0903e1c0-8e03-4936-b5c2-260653b96413']);
+
+ expect(service.modelInformations[9].label).toEqual("Invariant UUID");
+ expect(service.modelInformations[9].values).toEqual(['00beb8f9-6d39-452f-816d-c709b9cbb87d']);
+
+ expect(service.modelInformations[10].label).toEqual("Service type");
+ expect(service.modelInformations[10].values).toEqual(['']);
+
+ expect(service.modelInformations[11].label).toEqual("Service role");
+ expect(service.modelInformations[11].values).toEqual(['']);
+
+ expect(service.modelInformations[12].label).toEqual("Minimum to instantiate");
+ expect(service.modelInformations[12].values).toEqual(['0']);
+
+ expect(service.modelInformations[13].label).toEqual("Maximum to instantiate");
+ expect(service.modelInformations[13].values).toEqual(['5']);
+ });
+
+ test('getSubLeftTitle new vnf popup should return service model name', () => {
+ service.uuidData = {
+ serviceId: '6e59c5de-f052-46fa-aa7e-2fca9d674c44',
+ modelName: 'VF_vMee 0'
+ };
+ expect(service.getSubLeftTitle()).toBe('VNF MODEL: VF_vMee');
+ });
+
+ test('getInstance with empty storekey should be created', () => {
+ const serviceId: string = '6e59c5de-f052-46fa-aa7e-2fca9d674c44';
+ const vnfModelName: string = '2017-388_ADIOD-vPE 1';
+ const newInstance = service.getInstance(serviceId, vnfModelName, null);
+ expect(newInstance).toBeDefined();
+ });
+
+ test('getInstance with not empty storekey should return vnfStoreKey', () => {
+ const serviceId: string = '6b528779-44a3-4472-bdff-9cd15ec93450';
+ const vnfModelName: string = '2017-388_ADIOD-vPE 1';
+ const vnfStoreKey: string = '2017-488_ADIOD-vPE 0';
+ const newInstance = service.getInstance(serviceId, vnfModelName, vnfStoreKey);
+ expect(newInstance.vnfStoreKey).toEqual('2017-488_ADIOD-vPE 0');
+ });
+
+ test('getGenericFormPopupDetails returns the FormPopupDetails object', () => {
+ const serviceId: string = '6e59c5de-f052-46fa-aa7e-2fca9d674c44';
+ const vnfModelName: string = 'VF_vMee 0';
+ const vnfStoreKey: string = 'VF_vMee 0';
+ let uuidData: UUIDData = <any>{
+ serviceId: "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ modelName: "VF_vMee 0",
+ vnfStoreKey: "VF_vMee 0"
+ };
+ const formPopupDetailsObject = service.getGenericFormPopupDetails(serviceId, vnfModelName, vnfStoreKey, null, uuidData, true);
+ expect(formPopupDetailsObject).toBeDefined();
+ }
+ );
+});
diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service.ts
new file mode 100644
index 000000000..8969e3c15
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service.ts
@@ -0,0 +1,158 @@
+import {Injectable} from '@angular/core';
+import {GenericPopupInterface} from "../generic-popup.interface";
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import {FormPopupDetails, PopupType} from "../../../../models/formControlModels/formPopupDetails.model";
+import {FormGroup} from "@angular/forms";
+import {ModelInformationItem} from "../../../model-information/model-information.component";
+import {ServiceModel} from "../../../../models/serviceModel";
+import {Subject} from "rxjs/Subject";
+import {BasicControlGenerator} from "../../../genericForm/formControlsServices/basic.control.generator";
+import {VnfControlGenerator} from "../../../genericForm/formControlsServices/vnfGenerator/vnf.control.generator";
+import {IframeService} from "../../../../utils/iframe.service";
+import {DefaultDataGeneratorService} from "../../../../services/defaultDataServiceGenerator/default.data.generator.service";
+import {AaiService} from "../../../../services/aaiService/aai.service";
+import {BasicPopupService} from "../basic.popup.service";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../../../store/reducers";
+import {Subscriber} from "../../../../models/subscriber";
+import {Constants} from "../../../../utils/constants";
+import {VnfInstance} from "../../../../models/vnfInstance";
+import {ModelInfo} from "../../../../models/modelInfo";
+import {changeInstanceCounter} from "../../../../storeUtil/utils/general/general.actions";
+import {createVNFInstance, updateVNFInstance} from "../../../../storeUtil/utils/vnf/vnf.actions";
+import * as _ from 'lodash';
+
+@Injectable()
+export class VnfPopupService implements GenericPopupInterface{
+ dynamicInputs: any;
+ instance: any;
+ model:any;
+ serviceModel:ServiceModel;
+ modelInformations: ModelInformationItem[] = [];
+ uuidData: Object;
+ closeDialogEvent: Subject<any> = new Subject<any>();
+ isUpdateMode: boolean;
+
+ constructor(
+ private _basicControlGenerator: BasicControlGenerator,
+ private _vnfControlGenerator: VnfControlGenerator,
+ private _iframeService: IframeService,
+ private _defaultDataGeneratorService: DefaultDataGeneratorService,
+ private _aaiService: AaiService,
+ private _basicPopupService: BasicPopupService,
+ private _store: NgRedux<AppState>) {
+ }
+
+ getGenericFormPopupDetails(serviceId: string, modelName: string, vnfStoreKey: string, node: ITreeNode, uuidData: Object, isUpdateMode: boolean): FormPopupDetails {
+ this.uuidData = uuidData;
+ this.isUpdateMode = isUpdateMode;
+ this.instance = this.getInstance(serviceId, modelName, vnfStoreKey);
+ this.getModelInformation(serviceId, modelName);
+
+ return new FormPopupDetails(this,
+ PopupType.VNF_MACRO,
+ uuidData,
+ this.getTitle(isUpdateMode),
+ this.getSubLeftTitle(),
+ this.getSubRightTitle(),
+ this.getControls(serviceId, modelName, vnfStoreKey),
+ this._basicPopupService.getDynamicInputs(serviceId, modelName, vnfStoreKey, 'vnfs'),
+ this.modelInformations,
+ (that, form: FormGroup) => {that.onSubmit(that, form);},
+ (that: any, form: FormGroup) => {that.onCancel(that, form); }
+ )
+ }
+
+ getControls(serviceId: string, modelName: string, vnfStoreKey: string){
+ if(this._store.getState().service.serviceHierarchy[serviceId].service.instantiationType === 'Macro') {
+ return this._vnfControlGenerator.getMacroFormControls(serviceId, vnfStoreKey, modelName);
+ } else {
+ return this._vnfControlGenerator.getAlaCarteFormControls(serviceId, vnfStoreKey, modelName);
+ }
+ }
+
+ getInstance(serviceId: string, modelName: string, vnfStoreKey: string): any {
+ if(_.isNil(vnfStoreKey)){
+ return new VnfInstance();
+ }
+ return this._store.getState().service.serviceInstance[serviceId].vnfs[vnfStoreKey];
+ }
+
+ getModelInformation(serviceId: string, modelName: string): void {
+ this._aaiService.getServiceModelById(serviceId).subscribe((result: any) => {
+ this.serviceModel = new ServiceModel(result);
+ this.model = this._basicPopupService.getModelFromResponse(result, 'vnfs', modelName);
+ const serviceInstance = this._store.getState().service.serviceInstance[serviceId];
+ this.modelInformations = [
+ new ModelInformationItem("Subscriber Name", "subscriberName", [this.extractSubscriberNameBySubscriberId(serviceInstance.globalSubscriberId, this._store)], "", true),
+ new ModelInformationItem("Service Name", "serviceModelName", [this.serviceModel.name], "", true),
+ new ModelInformationItem("Service Instance Name", "serviceName", [serviceInstance.instanceName], "", false),
+ new ModelInformationItem("Model Name", "modelName", [this.model.name], "", true),
+ new ModelInformationItem("Model version", "modelVersion", [this.model.version], "", true),
+ new ModelInformationItem("Description", "description", [this.model.description]),
+ new ModelInformationItem("Category", "category", [this.model.category]),
+ new ModelInformationItem("Sub Category", "subCategory", [this.model.subCategory]),
+ new ModelInformationItem("UUID", "uuid", [this.model.uuid], Constants.ServicePopup.TOOLTIP_UUID, true),
+ new ModelInformationItem("Invariant UUID", "invariantUuid", [this.model.invariantUuid], Constants.ServicePopup.TOOLTIP_INVARIANT_UUID, true),
+ new ModelInformationItem("Service type", "serviceType", [this.serviceModel.serviceType]),
+ new ModelInformationItem("Service role", "serviceRole", [this.serviceModel.serviceRole]),
+ new ModelInformationItem("Minimum to instantiate", "vnf-min", [!_.isNil(this.model.min) ? this.model.min.toString() : '0'], "", false),
+ new ModelInformationItem("Maximum to instantiate", "vnf-max", [!_.isNil(this.model.max) ? this.model.max.toString() : '1'], "", false)
+ ];
+ })
+ }
+
+ getSubLeftTitle(): string {
+ return "VNF MODEL: " + this._store.getState().service.serviceHierarchy[this.uuidData['serviceId']].vnfs[this.uuidData['modelName']].name;
+ }
+
+ getSubRightTitle(): string {
+ return "VNF Instance Details";
+ }
+
+ storeVNF = (that, formValues: any): void => {
+ formValues.modelInfo = new ModelInfo(that.model);
+ formValues.uuid = formValues.modelInfo.uuid;
+ formValues.isMissingData = false;
+ if(!that.isUpdateMode){
+ that._store.dispatch(changeInstanceCounter(formValues.modelInfo.modelUniqueId, that.uuidData.serviceId, 1 , <any> {data: {type: 'VF'}}));
+ this._store.dispatch(createVNFInstance(formValues, that.uuidData['modelName'], that.uuidData['serviceId'], that.uuidData['modelName']));
+ }else {
+ that._store.dispatch(updateVNFInstance(formValues, that.uuidData.modelName, that.uuidData.serviceId, that.uuidData.vnfStoreKey))
+ }
+ };
+
+ getTitle(isUpdateMode: boolean): string {
+ return isUpdateMode ? "Edit VNF instance": "Set a new VNF" ;
+ }
+
+ onCancel(that, form): void {
+ form.reset();
+ that._iframeService.removeClassCloseModal('content');
+ this.closeDialogEvent.next(that);
+ }
+
+ onSubmit(that, form: FormGroup, ...args): void {
+ form.value['instanceParams'] = form.value['instanceParams'] && [form.value['instanceParams']];
+ that.storeVNF(that, form.value);
+ window.parent.postMessage( {
+ eventId: 'submitIframe',
+ data: {
+ serviceModelId: that.uuidData.serviceId
+ }
+ }, "*");
+ that.onCancel(that, form);
+ }
+
+ extractSubscriberNameBySubscriberId(subscriberId: string, store: NgRedux<AppState>) {
+ let result: string = null;
+ let filteredArray: any = _.filter(store.getState().service.subscribers, function (o: Subscriber) {
+ return o.id === subscriberId
+ });
+ if (filteredArray.length > 0) {
+ result = filteredArray[0].name;
+ }
+ return result;
+ }
+
+}
diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service.spec.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service.spec.ts
new file mode 100644
index 000000000..6027f4346
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service.spec.ts
@@ -0,0 +1,3239 @@
+import {DefaultDataGeneratorService} from "../../../../services/defaultDataServiceGenerator/default.data.generator.service";
+import {NgRedux} from "@angular-redux/store";
+import {ReflectiveInjector} from "@angular/core";
+import {IframeService} from "../../../../utils/iframe.service";
+import {VfModulePopuopService} from "../vfModule/vfModule.popuop.service";
+import {FormBuilder} from "@angular/forms";
+import {GenericFormService} from "../../../genericForm/generic-form.service";
+import {BasicPopupService} from "../basic.popup.service";
+import {AaiService} from "../../../../services/aaiService/aai.service";
+import {LogService} from "../../../../utils/log/log.service";
+import {HttpClient} from "@angular/common/http";
+import {BasicControlGenerator} from "../../../genericForm/formControlsServices/basic.control.generator";
+import {UUIDData} from "../../generic-form-popup.component";
+import {FeatureFlagsService} from "../../../../services/featureFlag/feature-flags.service";
+import {VnfGroupPopupService} from "./vnfGroup.popup.service";
+import {VnfGroupControlGenerator} from "../../../genericForm/formControlsServices/vnfGroupGenerator/vnfGroup.control.generator";
+import {getTestBed, TestBed} from "@angular/core/testing";
+
+class MockAppStore<T> {}
+
+class MockReduxStore<T> {
+ getState() {
+ return {
+ "global": {
+ "name": null,
+ "flags": {
+ "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false,
+ "FLAG_SHOW_ASSIGNMENTS": true,
+ "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
+ "FLAG_UNASSIGN_SERVICE": true,
+ "FLAG_SHOW_VERIFY_SERVICE": false,
+ "FLAG_COLLECTION_RESOURCE_SUPPORT": true,
+ "FLAG_DUPLICATE_VNF": true,
+ "FLAG_SERVICE_MODEL_CACHE": true,
+ "FLAG_ADVANCED_PORTS_FILTER": true,
+ "CREATE_INSTANCE_TEST": false,
+ "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false,
+ "FLAG_REGION_ID_FROM_REMOTE": true,
+ "FLAG_ASYNC_INSTANTIATION": true,
+ "FLAG_ASYNC_JOBS": true,
+ "EMPTY_DRAWING_BOARD_TEST": false,
+ "FLAG_ADD_MSO_TESTAPI_FIELD": true
+ },
+ "type": "[FLAGS] Update"
+ },
+ "service": {
+ "serviceHierarchy": {
+ "6e59c5de-f052-46fa-aa7e-2fca9d674c44": {
+ "service": {
+ "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "name": "ComplexService",
+ "version": "1.0",
+ "toscaModelURL": null,
+ "category": "Emanuel",
+ "serviceType": "",
+ "serviceRole": "",
+ "description": "ComplexService",
+ "serviceEcompNaming": "false",
+ "instantiationType": "Macro",
+ "inputs": {}
+ },
+ "vnfGroups": {
+ "VF_vMee 0": {
+ "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60",
+ "invariantUuid": "4160458e-f648-4b30-a176-43881ffffe9e",
+ "description": "VSP_vMee",
+ "name": "VF_vMee",
+ "version": "2.0",
+ "customizationUuid": "91415b44-753d-494c-926a-456a9172bbb9",
+ "inputs": {},
+ "commands": {},
+ "properties": {
+ "max_instances": 10,
+ "min_instances": 1,
+ "gpb2_Internal2_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-ipv6-egress_src_start_port": "0",
+ "sctp-a-ipv6-egress_rule_application": "any",
+ "Internal2_allow_transit": "true",
+ "sctp-b-IPv6_ethertype": "IPv6",
+ "sctp-a-egress_rule_application": "any",
+ "sctp-b-ingress_action": "pass",
+ "sctp-b-ingress_rule_protocol": "icmp",
+ "ncb2_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-ipv6-ingress-src_start_port": "0.0",
+ "ncb1_Internal2_mac": "00:11:22:EF:AC:DF",
+ "fsb_volume_size_0": "320.0",
+ "sctp-b-egress_src_addresses": "local",
+ "sctp-a-ipv6-ingress_ethertype": "IPv4",
+ "sctp-a-ipv6-ingress-dst_start_port": "0",
+ "sctp-b-ipv6-ingress_rule_application": "any",
+ "domain_name": "default-domain",
+ "sctp-a-ingress_rule_protocol": "icmp",
+ "sctp-b-egress-src_start_port": "0.0",
+ "sctp-a-egress_src_addresses": "local",
+ "sctp-b-display_name": "epc-sctp-b-ipv4v6-sec-group",
+ "sctp-a-egress-src_start_port": "0.0",
+ "sctp-a-ingress_ethertype": "IPv4",
+ "sctp-b-ipv6-ingress-dst_end_port": "65535",
+ "sctp-b-dst_subnet_prefix_v6": "::",
+ "nf_naming": "{ecomp_generated_naming=true}",
+ "sctp-a-ipv6-ingress_src_subnet_prefix": "0.0.0.0",
+ "sctp-b-egress-dst_start_port": "0.0",
+ "ncb_flavor_name": "nv.c20r64d1",
+ "gpb1_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-egress_dst_subnet_prefix_len": "0.0",
+ "Internal2_net_cidr": "10.0.0.10",
+ "sctp-a-ingress-dst_start_port": "0.0",
+ "sctp-a-egress-dst_start_port": "0.0",
+ "fsb1_Internal2_mac": "00:11:22:EF:AC:DF",
+ "sctp-a-egress_ethertype": "IPv4",
+ "vlc_st_service_mode": "in-network-nat",
+ "sctp-a-ipv6-egress_ethertype": "IPv4",
+ "sctp-a-egress-src_end_port": "65535.0",
+ "sctp-b-ipv6-egress_rule_application": "any",
+ "sctp-b-egress_action": "pass",
+ "sctp-a-ingress-src_subnet_prefix_len": "0.0",
+ "sctp-b-ipv6-ingress-src_end_port": "65535.0",
+ "sctp-b-name": "epc-sctp-b-ipv4v6-sec-group",
+ "fsb2_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-a-ipv6-ingress-src_start_port": "0.0",
+ "sctp-b-ipv6-egress_ethertype": "IPv4",
+ "Internal1_net_cidr": "10.0.0.10",
+ "sctp-a-egress_dst_subnet_prefix": "0.0.0.0",
+ "fsb_flavor_name": "nv.c20r64d1",
+ "sctp_rule_protocol": "132",
+ "sctp-b-ipv6-ingress_src_subnet_prefix_len": "0",
+ "sctp-a-ipv6-ingress_rule_application": "any",
+ "ecomp_generated_naming": "false",
+ "sctp-a-IPv6_ethertype": "IPv6",
+ "vlc2_Internal1_mac": "00:11:22:EF:AC:DF",
+ "vlc_st_virtualization_type": "virtual-machine",
+ "sctp-b-ingress-dst_start_port": "0.0",
+ "sctp-b-ingress-dst_end_port": "65535.0",
+ "sctp-a-ipv6-ingress-src_end_port": "65535.0",
+ "sctp-a-display_name": "epc-sctp-a-ipv4v6-sec-group",
+ "sctp-b-ingress_rule_application": "any",
+ "int2_sec_group_name": "int2-sec-group",
+ "vlc_flavor_name": "nd.c16r64d1",
+ "sctp-b-ipv6-egress_src_addresses": "local",
+ "vlc_st_interface_type_int1": "other1",
+ "sctp-b-egress-src_end_port": "65535.0",
+ "sctp-a-ipv6-egress-dst_start_port": "0",
+ "vlc_st_interface_type_int2": "other2",
+ "sctp-a-ipv6-egress_rule_protocol": "any",
+ "Internal2_shared": "false",
+ "sctp-a-ipv6-egress_dst_subnet_prefix_len": "0",
+ "Internal2_rpf": "disable",
+ "vlc1_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-ipv6-egress_src_end_port": "65535",
+ "sctp-a-ipv6-egress_src_addresses": "local",
+ "sctp-a-ingress-dst_end_port": "65535.0",
+ "sctp-a-ipv6-egress_src_end_port": "65535",
+ "Internal1_forwarding_mode": "l2",
+ "Internal2_dhcp": "false",
+ "sctp-a-dst_subnet_prefix_v6": "::",
+ "pxe_image_name": "MME_PXE-Boot_16ACP04_GA.qcow2",
+ "vlc_st_interface_type_gtp": "other0",
+ "ncb1_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-src_subnet_prefix_v6": "::",
+ "sctp-a-egress_dst_subnet_prefix_len": "0.0",
+ "int1_sec_group_name": "int1-sec-group",
+ "Internal1_dhcp": "false",
+ "sctp-a-ipv6-egress_dst_end_port": "65535",
+ "Internal2_forwarding_mode": "l2",
+ "fsb2_Internal2_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-egress_dst_subnet_prefix": "0.0.0.0",
+ "Internal1_net_cidr_len": "17",
+ "gpb2_Internal1_mac": "00:11:22:EF:AC:DF",
+ "sctp-b-ingress-src_subnet_prefix_len": "0.0",
+ "sctp-a-ingress_dst_addresses": "local",
+ "sctp-a-egress_action": "pass",
+ "fsb_volume_type_0": "SF-Default-SSD",
+ "ncb2_Internal2_mac": "00:11:22:EF:AC:DF",
+ "vlc_st_interface_type_sctp_a": "left",
+ "vlc_st_interface_type_sctp_b": "right",
+ "sctp-a-src_subnet_prefix_v6": "::",
+ "vlc_st_version": "2",
+ "sctp-b-egress_ethertype": "IPv4",
+ "sctp-a-ingress_rule_application": "any",
+ "gpb1_Internal2_mac": "00:11:22:EF:AC:DF",
+ "instance_ip_family_v6": "v6",
+ "sctp-a-ipv6-egress_src_start_port": "0",
+ "sctp-b-ingress-src_start_port": "0.0",
+ "sctp-b-ingress_dst_addresses": "local",
+ "fsb1_Internal1_mac": "00:11:22:EF:AC:DF",
+ "vlc_st_interface_type_oam": "management",
+ "multi_stage_design": "true",
+ "oam_sec_group_name": "oam-sec-group",
+ "Internal2_net_gateway": "10.0.0.10",
+ "sctp-a-ipv6-ingress-dst_end_port": "65535",
+ "sctp-b-ipv6-egress-dst_start_port": "0",
+ "Internal1_net_gateway": "10.0.0.10",
+ "sctp-b-ipv6-egress_rule_protocol": "any",
+ "gtp_sec_group_name": "gtp-sec-group",
+ "sctp-a-ipv6-egress_dst_subnet_prefix": "0.0.0.0",
+ "sctp-b-ipv6-egress_dst_subnet_prefix_len": "0",
+ "sctp-a-ipv6-ingress_dst_addresses": "local",
+ "sctp-a-egress_rule_protocol": "icmp",
+ "sctp-b-ipv6-egress_action": "pass",
+ "sctp-a-ipv6-egress_action": "pass",
+ "Internal1_shared": "false",
+ "sctp-b-ipv6-ingress_rule_protocol": "any",
+ "Internal2_net_cidr_len": "17",
+ "sctp-a-name": "epc-sctp-a-ipv4v6-sec-group",
+ "sctp-a-ingress-src_end_port": "65535.0",
+ "sctp-b-ipv6-ingress_src_subnet_prefix": "0.0.0.0",
+ "sctp-a-egress-dst_end_port": "65535.0",
+ "sctp-a-ingress_action": "pass",
+ "sctp-b-egress_rule_protocol": "icmp",
+ "sctp-b-ipv6-ingress_action": "pass",
+ "vlc_st_service_type": "firewall",
+ "sctp-b-ipv6-egress_dst_end_port": "65535",
+ "sctp-b-ipv6-ingress-dst_start_port": "0",
+ "vlc2_Internal2_mac": "00:11:22:EF:AC:DF",
+ "vlc_st_availability_zone": "true",
+ "fsb_volume_image_name_1": "MME_FSB2_16ACP04_GA.qcow2",
+ "sctp-b-ingress-src_subnet_prefix": "0.0.0.0",
+ "sctp-a-ipv6-ingress_src_subnet_prefix_len": "0",
+ "Internal1_allow_transit": "true",
+ "gpb_flavor_name": "nv.c20r64d1",
+ "availability_zone_max_count": "1",
+ "fsb_volume_image_name_0": "MME_FSB1_16ACP04_GA.qcow2",
+ "sctp-b-ipv6-ingress_dst_addresses": "local",
+ "sctp-b-ipv6-egress_dst_subnet_prefix": "0.0.0.0",
+ "sctp-b-ipv6-ingress_ethertype": "IPv4",
+ "vlc1_Internal2_mac": "00:11:22:EF:AC:DF",
+ "sctp-a-ingress-src_subnet_prefix": "0.0.0.0",
+ "sctp-a-ipv6-ingress_action": "pass",
+ "Internal1_rpf": "disable",
+ "sctp-b-ingress_ethertype": "IPv4",
+ "sctp-b-egress_rule_application": "any",
+ "sctp-b-ingress-src_end_port": "65535.0",
+ "sctp-a-ipv6-ingress_rule_protocol": "any",
+ "sctp-a-ingress-src_start_port": "0.0",
+ "sctp-b-egress-dst_end_port": "65535.0"
+ },
+ "type": "VnfGroup",
+ "modelCustomizationName": "VF_vMee 0",
+ "vfModules": {
+ "vf_vmee0..VfVmee..vmme_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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..vmme_vlc..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "vmme_vlc"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ },
+ "vf_vmee0..VfVmee..vmme_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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..vmme_gpb..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "vmme_gpb"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "vf_vmee0..VfVmee..base_vmme..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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "base_vmme"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "vf_vmee0..VfVmee..base_vmme..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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "base_vmme"
+ },
+ "inputs": {}
+ }
+ },
+ "vfcInstanceGroups": {}
+ }
+ },
+ "networks": {
+ "ExtVL 0": {
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ "invariantUuid": "379f816b-a7aa-422f-be30-17114ff50b7c",
+ "description": "ECOMP generic virtual link (network) base type for all other service-level and global networks",
+ "name": "ExtVL",
+ "version": "37.0",
+ "customizationUuid": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+ "inputs": {},
+ "commands": {},
+ "properties": {
+ "netowrk_role": "role 1, role 2, role 3",
+ "network_assignments": "{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}",
+ "exVL_naming": "{ecomp_generated_naming=true}",
+ "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}",
+ "network_homing": "{ecomp_selected_instance_node_target=false}"
+ },
+ "type": "VL",
+ "modelCustomizationName": "ExtVL 0"
+ }
+ },
+ "collectionResource": {},
+ "configurations": {
+ "Port Mirroring Configuration By Policy 0": {
+ "uuid": "b4398538-e89d-4f13-b33d-ca323434ba50",
+ "invariantUuid": "6ef0ca40-f366-4897-951f-abd65d25f6f7",
+ "description": "A port mirroring configuration by policy object",
+ "name": "Port Mirroring Configuration By Policy",
+ "version": "27.0",
+ "customizationUuid": "3c3b7b8d-8669-4b3b-8664-61970041fad2",
+ "inputs": {},
+ "commands": {},
+ "properties": {},
+ "type": "Configuration",
+ "modelCustomizationName": "Port Mirroring Configuration By Policy 0",
+ "sourceNodes": [],
+ "collectorNodes": null,
+ "configurationByPolicy": false
+ }
+ },
+ "serviceProxies": {},
+ "vfModules": {
+ "vf_vmee0..VfVmee..vmme_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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..vmme_vlc..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "vmme_vlc"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ },
+ "vf_vmee0..VfVmee..vmme_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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..vmme_gpb..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "vmme_gpb"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "vf_vmee0..VfVmee..base_vmme..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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "base_vmme"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "vf_vmee0..VfVmee..base_vmme..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",
+ "version": "2",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "base_vmme"
+ },
+ "inputs": {}
+ }
+ },
+ "pnfs": {}
+ },
+ "6b528779-44a3-4472-bdff-9cd15ec93450": {
+ "service": {
+ "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+ "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "name": "action-data",
+ "version": "1.0",
+ "toscaModelURL": null,
+ "category": "",
+ "serviceType": "",
+ "serviceRole": "",
+ "description": "",
+ "serviceEcompNaming": "false",
+ "instantiationType": "A-La-Carte",
+ "inputs": {
+ "2017488_adiodvpe0_ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ }
+ }
+ },
+ "vnfGroups": {
+ "2017-388_ADIOD-vPE 1": {
+ "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413",
+ "invariantUuid": "00beb8f9-6d39-452f-816d-c709b9cbb87d",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-388_ADIOD-vPE",
+ "version": "1.0",
+ "customizationUuid": "280dec31-f16d-488b-9668-4aae55d6648a",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {
+ "vnf_config_template_version": {
+ "displayName": "vnf_config_template_version",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_config_template_version"
+ },
+ "bandwidth_units": {
+ "displayName": "bandwidth_units",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth_units"
+ },
+ "bandwidth": {
+ "displayName": "bandwidth",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth"
+ },
+ "AIC_CLLI": {
+ "displayName": "AIC_CLLI",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_AIC_CLLI"
+ },
+ "ASN": {
+ "displayName": "ASN",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_ASN"
+ },
+ "vnf_instance_name": {
+ "displayName": "vnf_instance_name",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_instance_name"
+ }
+ },
+ "properties": {
+ "max_instances": 5,
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=false}",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "false",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VnfGroup",
+ "modelCustomizationName": "2017-388_ADIOD-vPE 1",
+ "vfModules": {},
+ "volumeGroups": {},
+ "vfcInstanceGroups": {}
+ },
+ "2017-388_ADIOD-vPE 0": {
+ "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168",
+ "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-388_ADIOD-vPE",
+ "version": "4.0",
+ "customizationUuid": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {
+ "vnf_config_template_version": {
+ "displayName": "vnf_config_template_version",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_config_template_version"
+ },
+ "bandwidth_units": {
+ "displayName": "bandwidth_units",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth_units"
+ },
+ "bandwidth": {
+ "displayName": "bandwidth",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth"
+ },
+ "AIC_CLLI": {
+ "displayName": "AIC_CLLI",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_AIC_CLLI"
+ },
+ "ASN": {
+ "displayName": "ASN",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_ASN"
+ },
+ "vnf_instance_name": {
+ "displayName": "vnf_instance_name",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_instance_name"
+ }
+ },
+ "properties": {
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=false}",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "min_instances": "1",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "false",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VnfGroup",
+ "modelCustomizationName": "2017-388_ADIOD-vPE 0",
+ "vfModules": {},
+ "volumeGroups": {},
+ "vfcInstanceGroups": {}
+ },
+ "2017-488_ADIOD-vPE 0": {
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+ "name": "2017-488_ADIOD-vPE",
+ "version": "5.0",
+ "customizationUuid": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {
+ "vnf_config_template_version": {
+ "displayName": "vnf_config_template_version",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_config_template_version"
+ },
+ "bandwidth_units": {
+ "displayName": "bandwidth_units",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth_units"
+ },
+ "bandwidth": {
+ "displayName": "bandwidth",
+ "command": "get_input",
+ "inputName": "adiodvpe0_bandwidth"
+ },
+ "AIC_CLLI": {
+ "displayName": "AIC_CLLI",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_AIC_CLLI"
+ },
+ "ASN": {
+ "displayName": "ASN",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_ASN"
+ },
+ "vnf_instance_name": {
+ "displayName": "vnf_instance_name",
+ "command": "get_input",
+ "inputName": "2017488_adiodvpe0_vnf_instance_name"
+ }
+ },
+ "properties": {
+ "vmxvre_retype": "RE-VMX",
+ "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+ "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+ "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+ "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+ "int_ctl_net_name": "VMX-INTXI",
+ "vmx_int_ctl_prefix": "10.0.0.10",
+ "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+ "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+ "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+ "nf_type": "vPE",
+ "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
+ "is_AVPN_service": "false",
+ "vmx_RSG_name": "vREXI-affinity",
+ "vmx_int_ctl_forwarding": "l2",
+ "vmxvre_oam_ip_0": "10.0.0.10",
+ "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+ "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+ "vmxvre_instance": "0",
+ "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvre_flavor_name": "ns.c1r16d32.v5",
+ "vmxvpfe_volume_size_0": "40.0",
+ "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+ "nf_naming": "{ecomp_generated_naming=false}",
+ "nf_naming_code": "Navneet",
+ "vmxvre_name_0": "vREXI",
+ "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+ "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+ "max_instances": "3",
+ "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+ "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+ "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+ "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+ "vmxvre_console": "vidconsole",
+ "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+ "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+ "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+ "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+ "min_instances": "1",
+ "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+ "vf_module_id": "123",
+ "nf_function": "JAI",
+ "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+ "vmxvre_int_ctl_ip_0": "10.0.0.10",
+ "ecomp_generated_naming": "false",
+ "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+ "vnf_name": "mtnj309me6vre",
+ "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+ "vmxvre_volume_type_1": "HITACHI",
+ "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+ "vmxvre_volume_type_0": "HITACHI",
+ "vmxvpfe_volume_type_0": "HITACHI",
+ "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+ "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+ "vnf_id": "123",
+ "vmxvre_oam_prefix": "24",
+ "availability_zone_0": "mtpocfo-kvm-az01",
+ "ASN": "get_input:2017488_adiodvpe0_ASN",
+ "vmxvre_chassis_i2cid": "161",
+ "vmxvpfe_name_0": "vPFEXI",
+ "bandwidth": "get_input:adiodvpe0_bandwidth",
+ "availability_zone_max_count": "1",
+ "vmxvre_volume_size_0": "45.0",
+ "vmxvre_volume_size_1": "50.0",
+ "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+ "vmxvre_oam_gateway": "10.0.0.10",
+ "vmxvre_volume_name_1": "vREXI_FAVolume",
+ "vmxvre_ore_present": "0",
+ "vmxvre_volume_name_0": "vREXI_FBVolume",
+ "vmxvre_type": "0",
+ "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+ "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+ "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+ "vmx_int_ctl_len": "24",
+ "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+ "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+ "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+ "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+ "nf_role": "Testing",
+ "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+ "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+ "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+ },
+ "type": "VnfGroup",
+ "modelCustomizationName": "2017-488_ADIOD-vPE 0",
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV"
+ },
+ "inputs": {
+ "adiodvpe0_bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "2017488_adiodvpe0_vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ },
+ "2017488_adiodvpe0_vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "2017488_adiodvpe0_AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "AIC_CLLI"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "adiodvpe0_bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ }
+ },
+ "volumeGroupAllowed": true
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+ "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+ "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+ "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "version": "5",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "ADIOD_base_vPE_BV"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV"
+ },
+ "inputs": {
+ "adiodvpe0_bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "2017488_adiodvpe0_vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ },
+ "2017488_adiodvpe0_vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "2017488_adiodvpe0_AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "AIC_CLLI"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "adiodvpe0_bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ }
+ }
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV"
+ },
+ "inputs": {}
+ }
+ },
+ "vfcInstanceGroups": {}
+ }
+ },
+ "networks": {
+ "ExtVL 0": {
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ "invariantUuid": "379f816b-a7aa-422f-be30-17114ff50b7c",
+ "description": "ECOMP generic virtual link (network) base type for all other service-level and global networks",
+ "name": "ExtVL",
+ "version": "37.0",
+ "customizationUuid": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+ "inputs": {
+ "vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "17.2"
+ },
+ "bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "Gbps"
+ },
+ "bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "10"
+ },
+ "AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "ASN": {
+ "type": "string",
+ "description": "AV/PE",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "AV_vPE"
+ },
+ "vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": null,
+ "constraints": [],
+ "required": true,
+ "default": "mtnj309me6"
+ }
+ },
+ "commands": {},
+ "properties": {
+ "network_role": "network role 1, network role 2",
+ "min_instances": 1,
+ "max_instances": 10,
+ "network_assignments": "{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}",
+ "exVL_naming": "{ecomp_generated_naming=true}",
+ "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}",
+ "network_homing": "{ecomp_selected_instance_node_target=false}"
+ },
+ "type": "VL",
+ "modelCustomizationName": "ExtVL 0"
+ }
+ },
+ "collectionResource": {},
+ "configurations": {},
+ "fabricConfigurations": {},
+ "serviceProxies": {},
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV"
+ },
+ "inputs": {
+ "adiodvpe0_bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "2017488_adiodvpe0_vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ },
+ "2017488_adiodvpe0_vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "2017488_adiodvpe0_AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "AIC_CLLI"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "adiodvpe0_bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ }
+ },
+ "volumeGroupAllowed": true
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+ "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+ "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+ "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "version": "5",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "properties": {
+ "minCountInstances": 1,
+ "maxCountInstances": 1,
+ "initialCount": 1,
+ "vfModuleLabel": "ADIOD_base_vPE_BV"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": false
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV"
+ },
+ "inputs": {},
+ "volumeGroupAllowed": true
+ }
+ },
+ "volumeGroups": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vRE_BV"
+ },
+ "inputs": {
+ "adiodvpe0_bandwidth": {
+ "type": "string",
+ "description": "Requested VPE bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "10"
+ },
+ "2017488_adiodvpe0_vnf_instance_name": {
+ "type": "string",
+ "description": "The hostname assigned to the vpe.",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_instance_name"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "mtnj309me6"
+ },
+ "2017488_adiodvpe0_vnf_config_template_version": {
+ "type": "string",
+ "description": "VPE Software Version",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "vnf_config_template_version"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "17.2"
+ },
+ "2017488_adiodvpe0_AIC_CLLI": {
+ "type": "string",
+ "description": "AIC Site CLLI",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "AIC_CLLI"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "ATLMY8GA"
+ },
+ "adiodvpe0_bandwidth_units": {
+ "type": "string",
+ "description": "Units of bandwidth",
+ "entry_schema": null,
+ "inputProperties": {
+ "sourceType": "HEAT",
+ "vfModuleLabel": "ADIOD_vRE_BV",
+ "paramName": "bandwidth_units"
+ },
+ "constraints": null,
+ "required": true,
+ "default": "Gbps"
+ }
+ }
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+ "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+ "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+ "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+ "description": null,
+ "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "version": "6",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+ "properties": {
+ "minCountInstances": 0,
+ "maxCountInstances": null,
+ "initialCount": 0,
+ "vfModuleLabel": "ADIOD_vPFE_BV"
+ },
+ "inputs": {}
+ }
+ },
+ "pnfs": {}
+ }
+ },
+ "serviceInstance": {
+ "6e59c5de-f052-46fa-aa7e-2fca9d674c44": {
+ "vnfGroups": {
+ "VF_vMee 0": {
+ "rollbackOnFailure": "true",
+ "vfModules": {
+ "vf_vmee0..VfVmee..base_vmme..module-0": {
+ "vf_vmee0..VfVmee..base_vmme..module-0vmvzo": {
+ "isMissingData": false,
+ "sdncPreReload": null,
+ "modelInfo": {
+ "modelType": "VFmodule",
+ "modelInvariantId": "a6f9e51a-2b35-416a-ae15-15e58d61f36d",
+ "modelVersionId": "a27f5cfc-7f12-4f99-af08-0af9c3885c87",
+ "modelName": "VfVmee..base_vmme..module-0",
+ "modelVersion": "2",
+ "modelCustomizationId": "f8c040f1-7e51-4a11-aca8-acf256cfd861",
+ "modelCustomizationName": "VfVmee..base_vmme..module-0"
+ },
+ "instanceParams": [
+ {}
+ ],
+ "trackById": "wmtm6sy2uj"
+ }
+ }
+ },
+ "isMissingData": true,
+ "originalName": "VF_vMee 0",
+ "vnfGroupStoreKey": "VF_vMee 0",
+ "trackById": "p3wk448m5do",
+ "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60",
+ "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+ "lcpCloudRegionId": null,
+ "tenantId": null,
+ "lineOfBusiness": null,
+ "platformName": null,
+ "modelInfo": {
+ "modelType": "VnfGroup",
+ "modelInvariantId": "4160458e-f648-4b30-a176-43881ffffe9e",
+ "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ "modelName": "VF_vMee",
+ "modelVersion": "2.0",
+ "modelCustomizationName": "VF_vMee 0"
+ }
+ }
+ },
+ "networks": {},
+ "instanceParams": [
+ {}
+ ],
+ "validationCounter": 1,
+ "existingNames": {},
+ "existingVNFCounterMap": {
+ "d6557200-ecf2-4641-8094-5393ae3aae60": 1
+ },
+ "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "subscriptionServiceType": "TYLER SILVIA",
+ "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+ "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+ "lcpCloudRegionId": "hvf6",
+ "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+ "aicZoneId": "JAG1",
+ "projectName": "x1",
+ "rollbackOnFailure": "true",
+ "bulkSize": 1,
+ "modelInfo": {
+ "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ "modelName": "ComplexService",
+ "modelVersion": "1.0",
+ "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44"
+ },
+ "isALaCarte": false,
+ "name": "ComplexService",
+ "version": "1.0",
+ "description": "ComplexService",
+ "category": "Emanuel",
+ "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "serviceType": "",
+ "serviceRole": "",
+ "isEcompGeneratedNaming": false,
+ "isMultiStepDesign": false
+ },
+ "6b528779-44a3-4472-bdff-9cd15ec93450": {
+ "networks": {
+ "ExtVL 0": {
+ "rollbackOnFailure": "true",
+ "isMissingData": false,
+ "originalName": "ExtVL 0",
+ "networkStoreKey": "ExtVL 0",
+ "trackById": "sf3zth68xjf",
+ "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+ "lcpCloudRegionId": "hvf6",
+ "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+ "platformName": "xxx1",
+ "lineOfBusiness": "ONAP",
+ "instanceParams": [
+ {}
+ ],
+ "modelInfo": {
+ "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c",
+ "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ "modelName": "ExtVL",
+ "modelVersion": "37.0",
+ "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+ "modelCustomizationName": "ExtVL 0",
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+ },
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+ },
+ "ExtVL 0:0001": {
+ "rollbackOnFailure": "true",
+ "isMissingData": false,
+ "originalName": "ExtVL 0",
+ "networkStoreKey": "ExtVL 0",
+ "trackById": "2mdxioxca9h",
+ "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+ "lcpCloudRegionId": "hvf6",
+ "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+ "platformName": "xxx1",
+ "lineOfBusiness": "ONAP",
+ "instanceParams": [
+ {}
+ ],
+ "modelInfo": {
+ "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c",
+ "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ "modelName": "ExtVL",
+ "modelVersion": "37.0",
+ "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+ "modelCustomizationName": "ExtVL 0",
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+ },
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+ },
+ "ExtVL 0_1": {
+ "rollbackOnFailure": "true",
+ "isMissingData": false,
+ "originalName": "ExtVL 0",
+ "networkStoreKey": "ExtVL 0_1",
+ "trackById": "z7vd1gmpbs",
+ "instanceName": "ExtVL",
+ "productFamilyId": "17cc1042-527b-11e6-beb8-9e71128cae77",
+ "lcpCloudRegionId": "hvf6",
+ "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+ "platformName": "xxx1",
+ "lineOfBusiness": "zzz1",
+ "instanceParams": [
+ {
+ "vnf_config_template_version": "17.2",
+ "bandwidth_units": "Gbps",
+ "bandwidth": "10",
+ "AIC_CLLI": "ATLMY8GA",
+ "ASN": "AV_vPE",
+ "vnf_instance_name": "yoav"
+ }
+ ],
+ "modelInfo": {
+ "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c",
+ "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ "modelName": "ExtVL",
+ "modelVersion": "37.0",
+ "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+ "modelCustomizationName": "ExtVL 0",
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+ },
+ "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+ }
+ },
+ "vnfGroups": {
+ "2017-488_ADIOD-vPE 0": {
+ "rollbackOnFailure": "true",
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1sgoqi": {
+ "instanceName": "yoav",
+ "volumeGroupName": "123",
+ "modelInfo": {
+ "modelInvariantId": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "modelName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "modelVersion": "6",
+ "modelCustomizationId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5"
+ },
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "isMissingData": false,
+ "instanceParams": [
+ {
+ "adiodvpe0_bandwidth": "10",
+ "2017488_adiodvpe0_vnf_instance_name": "mtnj309me6",
+ "2017488_adiodvpe0_vnf_config_template_version": "17.2",
+ "2017488_adiodvpe0_AIC_CLLI": "ATLMY8GA",
+ "adiodvpe0_bandwidth_units": "Gbps"
+ }
+ ]
+ }
+ }
+ },
+ "isMissingData": false,
+ "originalName": "2017-488_ADIOD-vPE 0",
+ "vnfGroupStoreKey": "2017-488_ADIOD-vPE 0",
+ "trackById": "o65b26t2thj",
+ "instanceName": "2017488_ADIODvPE",
+ "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+ "lcpCloudRegionId": "hvf6",
+ "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054",
+ "platformName": "platform",
+ "lineOfBusiness": "ONAP",
+ "instanceParams": [
+ {}
+ ],
+ "modelInfo": {
+ "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "modelVersionId": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "modelName": "2017-488_ADIOD-vPE",
+ "modelVersion": "5.0",
+ "modelCustomizationId": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+ "modelCustomizationName": "2017-488_ADIOD-vPE 0",
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09"
+ },
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09"
+ }
+ },
+ "instanceParams": [
+ {
+ "2017488_adiodvpe0_ASN": "AV_vPE"
+ }
+ ],
+ "validationCounter": 0,
+ "existingNames": {
+ "123": "",
+ "instancename": "",
+ "yoav": "",
+ "extvl": ""
+ },
+ "existingVnfGroupCounterMap": {
+ "69e09f68-8b63-4cc9-b9ff-860960b5db09": 1
+ },
+ "existingNetworksCounterMap": {
+ "ddc3f20c-08b5-40fd-af72-c6d14636b986": 3
+ },
+ "instanceName": "InstanceName",
+ "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "subscriptionServiceType": "TYLER SILVIA",
+ "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+ "productFamilyId": "17cc1042-527b-11e6-beb8-9e71128cae77",
+ "lcpCloudRegionId": "JANET25",
+ "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+ "aicZoneId": "JAG1",
+ "projectName": null,
+ "rollbackOnFailure": "true",
+ "aicZoneName": "YUDFJULP-JAG1",
+ "owningEntityName": "WayneHolland",
+ "testApi": "GR_API",
+ "isEcompGeneratedNaming": true,
+ "tenantName": "USP-SIP-IC-24335-T-01",
+ "bulkSize": 1,
+ "modelInfo": {
+ "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "modelVersionId": "6b528779-44a3-4472-bdff-9cd15ec93450",
+ "modelName": "action-data",
+ "modelVersion": "1.0",
+ "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450"
+ },
+ "isALaCarte": false,
+ "name": "action-data",
+ "version": "1.0",
+ "description": "",
+ "category": "",
+ "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+ "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "serviceType": "",
+ "serviceRole": "",
+ "isMultiStepDesign": false
+ }
+ },
+ "lcpRegionsAndTenants": {
+ "lcpRegionList": [
+ {
+ "id": "JANET25",
+ "name": "JANET25",
+ "isPermitted": true
+ },
+ {
+ "id": "hvf6",
+ "name": "hvf6",
+ "isPermitted": true
+ }
+ ],
+ "lcpRegionsTenantsMap": {
+ "JANET25": [
+ {
+ "id": "092eb9e8e4b7412e8787dd091bc58e86",
+ "name": "USP-SIP-IC-24335-T-01",
+ "isPermitted": true
+ }
+ ],
+ "hvf6": [
+ {
+ "id": "bae71557c5bb4d5aac6743a4e5f1d054",
+ "name": "AIN Web Tool-15-D-testalexandria",
+ "isPermitted": true
+ },
+ {
+ "id": "229bcdc6eaeb4ca59d55221141d01f8e",
+ "name": "AIN Web Tool-15-D-STTest2",
+ "isPermitted": true
+ },
+ {
+ "id": "1178612d2b394be4834ad77f567c0af2",
+ "name": "AIN Web Tool-15-D-SSPtestcustome",
+ "isPermitted": true
+ },
+ {
+ "id": "19c5ade915eb461e8af52fb2fd8cd1f2",
+ "name": "AIN Web Tool-15-D-UncheckedEcopm",
+ "isPermitted": true
+ },
+ {
+ "id": "de007636e25249238447264a988a927b",
+ "name": "AIN Web Tool-15-D-dfsdf",
+ "isPermitted": true
+ },
+ {
+ "id": "62f29b3613634ca6a3065cbe0e020c44",
+ "name": "AIN/SMS-16-D-Multiservices1",
+ "isPermitted": true
+ },
+ {
+ "id": "649289e30d3244e0b48098114d63c2aa",
+ "name": "AIN Web Tool-15-D-SSPST66",
+ "isPermitted": true
+ },
+ {
+ "id": "3f21eeea6c2c486bba31dab816c05a32",
+ "name": "AIN Web Tool-15-D-ASSPST47",
+ "isPermitted": true
+ },
+ {
+ "id": "f60ce21d3ee6427586cff0d22b03b773",
+ "name": "CESAR-100-D-sspjg67246",
+ "isPermitted": true
+ },
+ {
+ "id": "8774659e425f479895ae091bb5d46560",
+ "name": "CESAR-100-D-sspjg68359",
+ "isPermitted": true
+ },
+ {
+ "id": "624eb554b0d147c19ff8885341760481",
+ "name": "AINWebTool-15-D-iftach",
+ "isPermitted": true
+ },
+ {
+ "id": "214f55f5fc414c678059c383b03e4962",
+ "name": "CESAR-100-D-sspjg612401",
+ "isPermitted": true
+ },
+ {
+ "id": "c90666c291664841bb98e4d981ff1db5",
+ "name": "CESAR-100-D-sspjg621340",
+ "isPermitted": true
+ },
+ {
+ "id": "ce5b6bc5c7b348e1bf4b91ac9a174278",
+ "name": "sspjg621351cloned",
+ "isPermitted": true
+ },
+ {
+ "id": "b386b768a3f24c8e953abbe0b3488c02",
+ "name": "AINWebTool-15-D-eteancomp",
+ "isPermitted": true
+ },
+ {
+ "id": "dc6c4dbfd225474e9deaadd34968646c",
+ "name": "AINWebTool-15-T-SPFET",
+ "isPermitted": true
+ },
+ {
+ "id": "02cb5030e9914aa4be120bd9ed1e19eb",
+ "name": "AINWebTool-15-X-eeweww",
+ "isPermitted": true
+ },
+ {
+ "id": "f2f3830e4c984d45bcd00e1a04158a79",
+ "name": "CESAR-100-D-spjg61909",
+ "isPermitted": true
+ },
+ {
+ "id": "05b91bd5137f4929878edd965755c06d",
+ "name": "CESAR-100-D-sspjg621512cloned",
+ "isPermitted": true
+ },
+ {
+ "id": "7002fbe8482d4a989ddf445b1ce336e0",
+ "name": "AINWebTool-15-X-vdr",
+ "isPermitted": true
+ },
+ {
+ "id": "4008522be43741dcb1f5422022a2aa0b",
+ "name": "AINWebTool-15-D-ssasa",
+ "isPermitted": true
+ },
+ {
+ "id": "f44e2e96a1b6476abfda2fa407b00169",
+ "name": "AINWebTool-15-D-PFNPT",
+ "isPermitted": true
+ },
+ {
+ "id": "b69a52bec8a84669a37a1e8b72708be7",
+ "name": "AINWebTool-15-X-vdre",
+ "isPermitted": true
+ },
+ {
+ "id": "fac7d9fd56154caeb9332202dcf2969f",
+ "name": "AINWebTool-15-X-NONPODECOMP",
+ "isPermitted": true
+ },
+ {
+ "id": "2d34d8396e194eb49969fd61ffbff961",
+ "name": "DN5242-Nov16-T5",
+ "isPermitted": true
+ },
+ {
+ "id": "cb42a77ff45b48a8b8deb83bb64acc74",
+ "name": "ro-T11",
+ "isPermitted": true
+ },
+ {
+ "id": "fa45ca53c80b492fa8be5477cd84fc2b",
+ "name": "ro-T112",
+ "isPermitted": true
+ },
+ {
+ "id": "4914ab0ab3a743e58f0eefdacc1dde77",
+ "name": "DN5242-Nov21-T1",
+ "isPermitted": true
+ },
+ {
+ "id": "d0a3e3f2964542259d155a81c41aadc3",
+ "name": "test-hvf6-09",
+ "isPermitted": true
+ },
+ {
+ "id": "cbb99fe4ada84631b7baf046b6fd2044",
+ "name": "DN5242-Nov16-T3",
+ "isPermitted": true
+ }
+ ]
+ }
+ },
+ "productFamilies": [
+ {
+ "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+ "name": "SCOTTIE",
+ "isPermitted": true
+ },
+ {
+ "id": "17cc1042-527b-11e6-beb8-9e71128cae77",
+ "name": "IGNACIO",
+ "isPermitted": true
+ },
+ {
+ "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+ "name": "Christie",
+ "isPermitted": true
+ },
+ {
+ "id": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7",
+ "name": "Enhanced Services",
+ "isPermitted": true
+ },
+ {
+ "id": "vTerrance",
+ "name": "vTerrance",
+ "isPermitted": true
+ },
+ {
+ "id": "323d69d9-2efe-4r45-ay0a-89ea7ard4e6f",
+ "name": "vSCP",
+ "isPermitted": true
+ },
+ {
+ "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+ "name": "Emanuel",
+ "isPermitted": true
+ },
+ {
+ "id": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+ "name": "BVOIP",
+ "isPermitted": true
+ },
+ {
+ "id": "db171b8f-115c-4992-a2e3-ee04cae357e0",
+ "name": "LINDSEY",
+ "isPermitted": true
+ },
+ {
+ "id": "LRSI-OSPF",
+ "name": "LRSI-OSPF",
+ "isPermitted": true
+ },
+ {
+ "id": "vRosemarie",
+ "name": "HNGATEWAY",
+ "isPermitted": true
+ },
+ {
+ "id": "vHNPaas",
+ "name": "WILKINS",
+ "isPermitted": true
+ },
+ {
+ "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "name": "TYLER SILVIA",
+ "isPermitted": true
+ },
+ {
+ "id": "b6a3f28c-eebf-494c-a900-055cc7c874ce",
+ "name": "VROUTER",
+ "isPermitted": true
+ },
+ {
+ "id": "Cisneros",
+ "name": "vMuriel",
+ "isPermitted": true
+ },
+ {
+ "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1",
+ "name": "CARA Griffin",
+ "isPermitted": true
+ },
+ {
+ "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d",
+ "name": "DARREN MCGEE",
+ "isPermitted": true
+ },
+ {
+ "id": "e30755dc-5673-4b6b-9dcf-9abdd96b93d1",
+ "name": "Transport",
+ "isPermitted": true
+ },
+ {
+ "id": "vSalvatore",
+ "name": "vSalvatore",
+ "isPermitted": true
+ },
+ {
+ "id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4",
+ "name": "Josefina",
+ "isPermitted": true
+ },
+ {
+ "id": "vHubbard",
+ "name": "vHubbard",
+ "isPermitted": true
+ },
+ {
+ "id": "12a96a9d-4b4c-4349-a950-fe1159602621",
+ "name": "DARREN MCGEE",
+ "isPermitted": true
+ }
+ ],
+ "serviceTypes": {
+ "e433710f-9217-458d-a79d-1c7aff376d89": [
+ {
+ "id": "0",
+ "name": "vRichardson",
+ "isPermitted": false
+ },
+ {
+ "id": "1",
+ "name": "TYLER SILVIA",
+ "isPermitted": true
+ },
+ {
+ "id": "2",
+ "name": "Emanuel",
+ "isPermitted": false
+ },
+ {
+ "id": "3",
+ "name": "vJamie",
+ "isPermitted": false
+ },
+ {
+ "id": "4",
+ "name": "vVoiceMail",
+ "isPermitted": false
+ },
+ {
+ "id": "5",
+ "name": "Kennedy",
+ "isPermitted": false
+ },
+ {
+ "id": "6",
+ "name": "vSEGW",
+ "isPermitted": false
+ },
+ {
+ "id": "7",
+ "name": "vVM",
+ "isPermitted": false
+ },
+ {
+ "id": "8",
+ "name": "vOTA",
+ "isPermitted": false
+ },
+ {
+ "id": "9",
+ "name": "vMME",
+ "isPermitted": false
+ },
+ {
+ "id": "10",
+ "name": "vMNS",
+ "isPermitted": false
+ },
+ {
+ "id": "11",
+ "name": "vSCP",
+ "isPermitted": false
+ },
+ {
+ "id": "12",
+ "name": "VPMS",
+ "isPermitted": false
+ },
+ {
+ "id": "13",
+ "name": "vMMSC",
+ "isPermitted": false
+ },
+ {
+ "id": "14",
+ "name": "SSD",
+ "isPermitted": false
+ },
+ {
+ "id": "15",
+ "name": "vMOG",
+ "isPermitted": false
+ },
+ {
+ "id": "16",
+ "name": "LINDSEY",
+ "isPermitted": false
+ },
+ {
+ "id": "17",
+ "name": "JOHANNA_SANTOS",
+ "isPermitted": false
+ },
+ {
+ "id": "18",
+ "name": "vCarroll",
+ "isPermitted": false
+ }
+ ]
+ },
+ "aicZones": [
+ {
+ "id": "NFT1",
+ "name": "NFTJSSSS-NFT1"
+ },
+ {
+ "id": "JAG1",
+ "name": "YUDFJULP-JAG1"
+ },
+ {
+ "id": "YYY1",
+ "name": "UUUAIAAI-YYY1"
+ },
+ {
+ "id": "BAN1",
+ "name": "VSDKYUTP-BAN1"
+ },
+ {
+ "id": "DKJ1",
+ "name": "DKJSJDKA-DKJ1"
+ },
+ {
+ "id": "MCS1",
+ "name": "ASACMAMS-MCS1"
+ },
+ {
+ "id": "UIO1",
+ "name": "uioclli1-UIO1"
+ },
+ {
+ "id": "RAJ1",
+ "name": "YGBIJNLQ-RAJ1"
+ },
+ {
+ "id": "OPA1",
+ "name": "opaclli1-OPA1"
+ },
+ {
+ "id": "SDE1",
+ "name": "ZXCVBNMA-SDE1"
+ },
+ {
+ "id": "VEN2",
+ "name": "FGHJUHIL-VEN2"
+ },
+ {
+ "id": "ORL1",
+ "name": "ORLDFLMA-ORL1"
+ },
+ {
+ "id": "JAD1",
+ "name": "JADECLLI-JAD1"
+ },
+ {
+ "id": "ZXL1",
+ "name": "LWLWCANN-ZXL1"
+ },
+ {
+ "id": "CKL1",
+ "name": "CLKSKCKK-CKL1"
+ },
+ {
+ "id": "SDF1",
+ "name": "sdfclli1-SDF1"
+ },
+ {
+ "id": "RAD1",
+ "name": "RADICAL1-RAD1"
+ },
+ {
+ "id": "KIT1",
+ "name": "BHYJFGLN-KIT1"
+ },
+ {
+ "id": "REL1",
+ "name": "INGERFGT-REL1"
+ },
+ {
+ "id": "JNL1",
+ "name": "CJALSDAC-JNL1"
+ },
+ {
+ "id": "OLK1",
+ "name": "OLKOLKLS-OLK1"
+ },
+ {
+ "id": "CHI1",
+ "name": "CHILLIWE-CHI1"
+ },
+ {
+ "id": "UUU4",
+ "name": "UUUAAAUU-UUU4"
+ },
+ {
+ "id": "TUF1",
+ "name": "TUFCLLI1-TUF1"
+ },
+ {
+ "id": "KJN1",
+ "name": "CKALDKSA-KJN1"
+ },
+ {
+ "id": "SAM1",
+ "name": "SNDGCA64-SAN1"
+ },
+ {
+ "id": "SCK1",
+ "name": "SCKSCKSK-SCK1"
+ },
+ {
+ "id": "HJH1",
+ "name": "AOEEQQQD-HJH1"
+ },
+ {
+ "id": "HGD1",
+ "name": "SDFQWHGD-HGD1"
+ },
+ {
+ "id": "KOR1",
+ "name": "HYFLNBVT-KOR1"
+ },
+ {
+ "id": "ATL43",
+ "name": "AICLOCID-ATL43"
+ },
+ {
+ "id": "ATL54",
+ "name": "AICFTAAI-ATL54"
+ },
+ {
+ "id": "ATL66",
+ "name": "CLLIAAII-ATL66"
+ },
+ {
+ "id": "VEL1",
+ "name": "BNMLKUIK-VEL1"
+ },
+ {
+ "id": "ICC1",
+ "name": "SANJITAT-ICC1"
+ },
+ {
+ "id": "MNT11",
+ "name": "WSXEFBTH-MNT11"
+ },
+ {
+ "id": "DEF2",
+ "name": "WSBHGTYL-DEF2"
+ },
+ {
+ "id": "MAD11",
+ "name": "SDFQWGKL-MAD11"
+ },
+ {
+ "id": "OLG1",
+ "name": "OLHOLHOL-OLG1"
+ },
+ {
+ "id": "GAR1",
+ "name": "NGFVSJKO-GAR1"
+ },
+ {
+ "id": "SAN22",
+ "name": "GNVLSCTL-SAN22"
+ },
+ {
+ "id": "HRG1",
+ "name": "HRGHRGGS-HRG1"
+ },
+ {
+ "id": "JCS1",
+ "name": "JCSJSCJS-JCS1"
+ },
+ {
+ "id": "DHA12",
+ "name": "WSXEDECF-DHA12"
+ },
+ {
+ "id": "HJE1",
+ "name": "AOEEWWWD-HJE1"
+ },
+ {
+ "id": "NCA1",
+ "name": "NCANCANN-NCA1"
+ },
+ {
+ "id": "IOP1",
+ "name": "iopclli1-IOP1"
+ },
+ {
+ "id": "RTY1",
+ "name": "rtyclli1-RTY1"
+ },
+ {
+ "id": "KAP1",
+ "name": "HIOUYTRQ-KAP1"
+ },
+ {
+ "id": "ZEN1",
+ "name": "ZENCLLI1-ZEN1"
+ },
+ {
+ "id": "HKA1",
+ "name": "JAKHLASS-HKA1"
+ },
+ {
+ "id": "CQK1",
+ "name": "CQKSCAKK-CQK1"
+ },
+ {
+ "id": "SAI1",
+ "name": "UBEKQLPD-SAI1"
+ },
+ {
+ "id": "ERT1",
+ "name": "ertclli1-ERT1"
+ },
+ {
+ "id": "IBB1",
+ "name": "PLMKOIJU-IBB1"
+ },
+ {
+ "id": "TIR2",
+ "name": "PLKINHYI-TIR2"
+ },
+ {
+ "id": "HSD1",
+ "name": "CHASKCDS-HSD1"
+ },
+ {
+ "id": "SLF78",
+ "name": "SDCTLFN1-SLF78"
+ },
+ {
+ "id": "SEE78",
+ "name": "SDCTEEE4-SEE78"
+ },
+ {
+ "id": "SAN13",
+ "name": "TOKYJPFA-SAN13"
+ },
+ {
+ "id": "SAA78",
+ "name": "SDCTAAA1-SAA78"
+ },
+ {
+ "id": "LUC1",
+ "name": "ATLDFGYC-LUC1"
+ },
+ {
+ "id": "AMD13",
+ "name": "MEMATLAN-AMD13"
+ },
+ {
+ "id": "TOR1",
+ "name": "TOROONXN-TOR1"
+ },
+ {
+ "id": "QWE1",
+ "name": "QWECLLI1-QWE1"
+ },
+ {
+ "id": "ZOG1",
+ "name": "ZOGASTRO-ZOG1"
+ },
+ {
+ "id": "CAL33",
+ "name": "CALIFORN-CAL33"
+ },
+ {
+ "id": "SHH78",
+ "name": "SDIT1HHH-SHH78"
+ },
+ {
+ "id": "DSA1",
+ "name": "LKJHGFDS-DSA1"
+ },
+ {
+ "id": "CLG1",
+ "name": "CLGRABAD-CLG1"
+ },
+ {
+ "id": "BNA1",
+ "name": "BNARAGBK-BNA1"
+ },
+ {
+ "id": "ATL84",
+ "name": "CANTTCOC-ATL84"
+ },
+ {
+ "id": "APP1",
+ "name": "WBHGTYUI-APP1"
+ },
+ {
+ "id": "RJN1",
+ "name": "RJNRBZAW-RJN1"
+ },
+ {
+ "id": "EHH78",
+ "name": "SDCSHHH5-EHH78"
+ },
+ {
+ "id": "mac10",
+ "name": "PKGTESTF-mac10"
+ },
+ {
+ "id": "SXB78",
+ "name": "SDCTGXB1-SXB78"
+ },
+ {
+ "id": "SAX78",
+ "name": "SDCTAXG1-SAX78"
+ },
+ {
+ "id": "SYD1",
+ "name": "SYDNAUBV-SYD1"
+ },
+ {
+ "id": "TOK1",
+ "name": "TOKYJPFA-TOK1"
+ },
+ {
+ "id": "KGM2",
+ "name": "KGMTNC20-KGM2"
+ },
+ {
+ "id": "DCC1b",
+ "name": "POIUYTGH-DCC1b"
+ },
+ {
+ "id": "SKK78",
+ "name": "SDCTKKK1-SKK78"
+ },
+ {
+ "id": "SGG78",
+ "name": "SDCTGGG1-SGG78"
+ },
+ {
+ "id": "SJJ78",
+ "name": "SDCTJJJ1-SJJ78"
+ },
+ {
+ "id": "SBX78",
+ "name": "SDCTBXG1-SBX78"
+ },
+ {
+ "id": "LAG1",
+ "name": "LARGIZON-LAG1"
+ },
+ {
+ "id": "IAA1",
+ "name": "QAZXSWED-IAA1"
+ },
+ {
+ "id": "POI1",
+ "name": "PLMNJKIU-POI1"
+ },
+ {
+ "id": "LAG1a",
+ "name": "LARGIZON-LAG1a"
+ },
+ {
+ "id": "PBL1",
+ "name": "PBLAPBAI-PBL1"
+ },
+ {
+ "id": "LAG45",
+ "name": "LARGIZON-LAG1a"
+ },
+ {
+ "id": "MAR1",
+ "name": "MNBVCXZM-MAR1"
+ },
+ {
+ "id": "HST70",
+ "name": "HSTNTX70-HST70"
+ },
+ {
+ "id": "DCC1a",
+ "name": "POIUYTGH-DCC1a"
+ },
+ {
+ "id": "TOL1",
+ "name": "TOLDOH21-TOL1"
+ },
+ {
+ "id": "LON1",
+ "name": "LONEENCO-LON1"
+ },
+ {
+ "id": "SJU78",
+ "name": "SDIT1JUB-SJU78"
+ },
+ {
+ "id": "STN27",
+ "name": "HSTNTX01-STN27"
+ },
+ {
+ "id": "SSW56",
+ "name": "ss8126GT-SSW56"
+ },
+ {
+ "id": "SBB78",
+ "name": "SDIT1BBB-SBB78"
+ },
+ {
+ "id": "DCC3",
+ "name": "POIUYTGH-DCC3"
+ },
+ {
+ "id": "GNV1",
+ "name": "GNVLSCTL-GNV1"
+ },
+ {
+ "id": "WAS1",
+ "name": "WASHDCSW-WAS1"
+ },
+ {
+ "id": "TOY1",
+ "name": "TORYONNZ-TOY1"
+ },
+ {
+ "id": "STT1",
+ "name": "STTLWA02-STT1"
+ },
+ {
+ "id": "STG1",
+ "name": "STTGGE62-STG1"
+ },
+ {
+ "id": "SLL78",
+ "name": "SDCTLLL1-SLL78"
+ },
+ {
+ "id": "SBU78",
+ "name": "SDIT1BUB-SBU78"
+ },
+ {
+ "id": "ATL2",
+ "name": "ATLNGANW-ATL2"
+ },
+ {
+ "id": "BOT1",
+ "name": "BOTHWAKY-BOT1"
+ },
+ {
+ "id": "SNG1",
+ "name": "SNGPSIAU-SNG1"
+ },
+ {
+ "id": "NYC1",
+ "name": "NYCMNY54-NYC1"
+ },
+ {
+ "id": "LAG1b",
+ "name": "LARGIZON-LAG1b"
+ },
+ {
+ "id": "AMD15",
+ "name": "AMDFAA01-AMD15"
+ },
+ {
+ "id": "SNA1",
+ "name": "SNANTXCA-SNA1"
+ },
+ {
+ "id": "PLT1",
+ "name": "PLTNCA60-PLT1"
+ },
+ {
+ "id": "TLP1",
+ "name": "TLPNXM18-TLP1"
+ },
+ {
+ "id": "SDD81",
+ "name": "SAIT1DD6-SDD81"
+ },
+ {
+ "id": "DCC1",
+ "name": "POIUYTGH-DCC1"
+ },
+ {
+ "id": "DCC2",
+ "name": "POIUYTGH-DCC2"
+ },
+ {
+ "id": "OKC1",
+ "name": "OKCBOK55-OKC1"
+ },
+ {
+ "id": "PAR1",
+ "name": "PARSFRCG-PAR1"
+ },
+ {
+ "id": "TES36",
+ "name": "ABCEETES-TES36"
+ },
+ {
+ "id": "COM1",
+ "name": "PLMKOPIU-COM1"
+ },
+ {
+ "id": "ANI1",
+ "name": "ATLNGTRE-ANI1"
+ },
+ {
+ "id": "SDG78",
+ "name": "SDIT1BDG-SDG78"
+ },
+ {
+ "id": "mac20",
+ "name": "PKGTESTF-mac20"
+ },
+ {
+ "id": "DSF45",
+ "name": "DSFBG123-DSF45"
+ },
+ {
+ "id": "HST25",
+ "name": "HSTNTX01-HST25"
+ },
+ {
+ "id": "AMD18",
+ "name": "AUDIMA01-AMD18"
+ },
+ {
+ "id": "SAA80",
+ "name": "SAIT9AA3-SAA80"
+ },
+ {
+ "id": "SSA56",
+ "name": "SSIT2AA7-SSA56"
+ },
+ {
+ "id": "SDD82",
+ "name": "SAIT1DD9-SDD82"
+ },
+ {
+ "id": "JCV1",
+ "name": "JCVLFLBW-JCV1"
+ },
+ {
+ "id": "SUL2",
+ "name": "WERTYUJK-SUL2"
+ },
+ {
+ "id": "PUR1",
+ "name": "purelyde-PUR1"
+ },
+ {
+ "id": "FDE55",
+ "name": "FDERT555-FDE55"
+ },
+ {
+ "id": "SITE",
+ "name": "LONEENCO-SITE"
+ },
+ {
+ "id": "ATL1",
+ "name": "ATLNGAMA-ATL1"
+ },
+ {
+ "id": "JUL1",
+ "name": "ZXCVBNMM-JUL1"
+ },
+ {
+ "id": "TAT34",
+ "name": "TESAAISB-TAT34"
+ },
+ {
+ "id": "XCP12",
+ "name": "CHKGH123-XCP12"
+ },
+ {
+ "id": "RAI1",
+ "name": "poiuytre-RAI1"
+ },
+ {
+ "id": "HPO1",
+ "name": "ATLNGAUP-HPO1"
+ },
+ {
+ "id": "KJF12",
+ "name": "KJFDH123-KJF12"
+ },
+ {
+ "id": "SCC80",
+ "name": "SAIT9CC3-SCC80"
+ },
+ {
+ "id": "SAA12",
+ "name": "SAIT9AF8-SAA12"
+ },
+ {
+ "id": "SAA14",
+ "name": "SAIT1AA9-SAA14"
+ },
+ {
+ "id": "ATL35",
+ "name": "TTESSAAI-ATL35"
+ },
+ {
+ "id": "CWY1",
+ "name": "CWYMOWBS-CWY1"
+ },
+ {
+ "id": "ATL76",
+ "name": "TELEPAAI-ATL76"
+ },
+ {
+ "id": "DSL12",
+ "name": "DSLFK242-DSL12"
+ },
+ {
+ "id": "ATL53",
+ "name": "AAIATLTE-ATL53"
+ },
+ {
+ "id": "SAA11",
+ "name": "SAIT9AA2-SAA11"
+ },
+ {
+ "id": "ATL62",
+ "name": "TESSASCH-ATL62"
+ },
+ {
+ "id": "AUG1",
+ "name": "ASDFGHJK-AUG1"
+ },
+ {
+ "id": "POI22",
+ "name": "POIUY123-POI22"
+ },
+ {
+ "id": "SAA13",
+ "name": "SAIT1AA9-SAA13"
+ },
+ {
+ "id": "BHY17",
+ "name": "BHYTFRF3-BHY17"
+ },
+ {
+ "id": "LIS1",
+ "name": "HOSTPROF-LIS1"
+ },
+ {
+ "id": "SIP1",
+ "name": "ZXCVBNMK-SIP1"
+ },
+ {
+ "id": "ATL99",
+ "name": "TEESTAAI-ATL43"
+ },
+ {
+ "id": "ATL64",
+ "name": "FORLOAAJ-ATL64"
+ },
+ {
+ "id": "TAT33",
+ "name": "TESAAISA-TAT33"
+ },
+ {
+ "id": "RAD10",
+ "name": "INDIPUNE-RAD10"
+ },
+ {
+ "id": "RTW5",
+ "name": "BHYTFRY4-RTW5"
+ },
+ {
+ "id": "JGS1",
+ "name": "KSJKKKKK-JGS1"
+ },
+ {
+ "id": "ATL98",
+ "name": "TEESTAAI-ATL43"
+ },
+ {
+ "id": "WAN1",
+ "name": "LEIWANGW-WAN1"
+ },
+ {
+ "id": "ATL44",
+ "name": "ATLSANAB-ATL44"
+ },
+ {
+ "id": "RTD2",
+ "name": "BHYTFRk4-RTD2"
+ },
+ {
+ "id": "NIR1",
+ "name": "ORFLMANA-NIR1"
+ },
+ {
+ "id": "ATL75",
+ "name": "SANAAIRE-ATL75"
+ },
+ {
+ "id": "NUM1",
+ "name": "QWERTYUI-NUM1"
+ },
+ {
+ "id": "MTN32",
+ "name": "MDTWNJ21-MTN32"
+ },
+ {
+ "id": "RTZ4",
+ "name": "BHYTFRZ6-RTZ4"
+ },
+ {
+ "id": "ATL56",
+ "name": "ATLSANAC-ATL56"
+ },
+ {
+ "id": "AMS1",
+ "name": "AMSTNLBW-AMS1"
+ },
+ {
+ "id": "RCT1",
+ "name": "AMSTERNL-RCT1"
+ },
+ {
+ "id": "JAN1",
+ "name": "ORFLMATT-JAN1"
+ },
+ {
+ "id": "ABC14",
+ "name": "TESAAISA-ABC14"
+ },
+ {
+ "id": "TAT37",
+ "name": "TESAAISD-TAT37"
+ },
+ {
+ "id": "MIC54",
+ "name": "MICHIGAN-MIC54"
+ },
+ {
+ "id": "ABC11",
+ "name": "ATLSANAI-ABC11"
+ },
+ {
+ "id": "AMF11",
+ "name": "AMDOCS01-AMF11"
+ },
+ {
+ "id": "ATL63",
+ "name": "ATLSANEW-ATL63"
+ },
+ {
+ "id": "ABC12",
+ "name": "ATLSECIA-ABC12"
+ },
+ {
+ "id": "MTN20",
+ "name": "MDTWNJ21-MTN20"
+ },
+ {
+ "id": "ABC15",
+ "name": "AAITESAN-ABC15"
+ },
+ {
+ "id": "AVT1",
+ "name": "AVTRFLHD-AVT1"
+ },
+ {
+ "id": "ATL34",
+ "name": "ATLSANAI-ATL34"
+ }
+ ],
+ "categoryParameters": {
+ "owningEntityList": [
+ {
+ "id": "aaa1",
+ "name": "aaa1"
+ },
+ {
+ "id": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+ "name": "WayneHolland"
+ },
+ {
+ "id": "Melissa",
+ "name": "Melissa"
+ }
+ ],
+ "projectList": [
+ {
+ "id": "WATKINS",
+ "name": "WATKINS"
+ },
+ {
+ "id": "x1",
+ "name": "x1"
+ },
+ {
+ "id": "yyy1",
+ "name": "yyy1"
+ }
+ ],
+ "lineOfBusinessList": [
+ {
+ "id": "ONAP",
+ "name": "ONAP"
+ },
+ {
+ "id": "zzz1",
+ "name": "zzz1"
+ }
+ ],
+ "platformList": [
+ {
+ "id": "platform",
+ "name": "platform"
+ },
+ {
+ "id": "xxx1",
+ "name": "xxx1"
+ }
+ ]
+ },
+ "type": "[LCP_REGIONS_AND_TENANTS] Update",
+ "subscribers": [
+ {
+ "id": "CAR_2020_ER",
+ "name": "CAR_2020_ER",
+ "isPermitted": true
+ },
+ {
+ "id": "21014aa2-526b-11e6-beb8-9e71128cae77",
+ "name": "JULIO ERICKSON",
+ "isPermitted": false
+ },
+ {
+ "id": "DHV1707-TestSubscriber-2",
+ "name": "DALE BRIDGES",
+ "isPermitted": false
+ },
+ {
+ "id": "DHV1707-TestSubscriber-1",
+ "name": "LLOYD BRIDGES",
+ "isPermitted": false
+ },
+ {
+ "id": "jimmy-example",
+ "name": "JimmyExampleCust-20161102",
+ "isPermitted": false
+ },
+ {
+ "id": "jimmy-example2",
+ "name": "JimmyExampleCust-20161103",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-TestSub-PWT-102",
+ "name": "ERICA5779-TestSub-PWT-102",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-TestSub-PWT-101",
+ "name": "ERICA5779-TestSub-PWT-101",
+ "isPermitted": false
+ },
+ {
+ "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+ "name": "Emanuel",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-Subscriber-4",
+ "name": "ERICA5779-Subscriber-5",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-TestSub-PWT-103",
+ "name": "ERICA5779-TestSub-PWT-103",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-Subscriber-2",
+ "name": "ERICA5779-Subscriber-2",
+ "isPermitted": false
+ },
+ {
+ "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "name": "SILVIA ROBBINS",
+ "isPermitted": true
+ },
+ {
+ "id": "ERICA5779-Subscriber-3",
+ "name": "ERICA5779-Subscriber-3",
+ "isPermitted": false
+ },
+ {
+ "id": "31739f3e-526b-11e6-beb8-9e71128cae77",
+ "name": "CRAIG/ROBERTS",
+ "isPermitted": false
+ }
+ ]
+ }
+ };
+ }
+}
+
+class MockFeatureFlagsService {}
+
+describe('vnf group new popup service', () => {
+ let injector;
+ let service: VnfGroupPopupService;
+ let genericFormService: GenericFormService
+ let defaultDataGeneratorService: DefaultDataGeneratorService;
+ let fb: FormBuilder;
+ let iframeService: IframeService;
+
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+ providers : [
+ VnfGroupPopupService,
+ DefaultDataGeneratorService,
+ GenericFormService,
+ FormBuilder,
+ IframeService,
+ {provide:FeatureFlagsService, useClass: MockFeatureFlagsService},
+ AaiService,
+ LogService,
+ BasicPopupService,
+ VfModulePopuopService,
+ BasicControlGenerator,
+ VnfGroupControlGenerator,
+ {provide: NgRedux, useClass: MockReduxStore},
+ {provide: HttpClient, useClass: MockAppStore}]
+ });
+ await TestBed.compileComponents();
+
+ injector = getTestBed();
+ service = injector.get(VnfGroupPopupService);
+ genericFormService = injector.get(GenericFormService);
+ defaultDataGeneratorService = injector.get(DefaultDataGeneratorService);
+ fb = injector.get(FormBuilder);
+ iframeService = injector.get(IframeService);
+
+ })().then(done).catch(done.fail));
+
+ test('getTitle vnf group should return the correct title for edit and create mode', () => {
+ expect(service.getTitle(false)).toBe('Set a new VNF Group');
+ expect(service.getTitle(true)).toBe('Edit VNF Group instance');
+ });
+
+ test('getSubRightTitle vnf should return popup type', () => {
+ expect(service.getSubRightTitle()).toBe('VNF Group Instance Details');
+ });
+
+ test('getModelInformation vnfGroup should update modelInformations', () => {
+ const serviceId: string = '6b528779-44a3-4472-bdff-9cd15ec93450';
+ const vnfGroupModelName: string = '2017-388_ADIOD-vPE 1';
+ service.getModelInformation(serviceId, vnfGroupModelName);
+ expect(service.modelInformations.length).toEqual(14);
+
+ expect(service.modelInformations[0].label).toEqual("Model version");
+ expect(service.modelInformations[0].values).toEqual(['1.0']);
+
+ expect(service.modelInformations[1].label).toEqual("Description");
+ expect(service.modelInformations[1].values).toEqual(['Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM']);
+
+ expect(service.modelInformations[2].label).toEqual("Category");
+ expect(service.modelInformations[2].values).toEqual([undefined]);
+
+ expect(service.modelInformations[3].label).toEqual("Sub Category");
+ expect(service.modelInformations[3].values).toEqual([undefined]);
+
+ expect(service.modelInformations[4].label).toEqual("UUID");
+ expect(service.modelInformations[4].values).toEqual(['0903e1c0-8e03-4936-b5c2-260653b96413']);
+
+ expect(service.modelInformations[5].label).toEqual("Invariant UUID");
+ expect(service.modelInformations[5].values).toEqual(['00beb8f9-6d39-452f-816d-c709b9cbb87d']);
+
+ expect(service.modelInformations[6].label).toEqual("Type");
+ expect(service.modelInformations[6].values).toEqual([undefined]);
+
+ expect(service.modelInformations[7].label).toEqual("Role");
+ expect(service.modelInformations[7].values).toEqual([undefined]);
+
+ expect(service.modelInformations[8].label).toEqual("Function");
+ expect(service.modelInformations[8].values).toEqual([undefined]);
+
+ expect(service.modelInformations[9].label).toEqual("Member resource type");
+ expect(service.modelInformations[9].values).toEqual(['VNF']);
+
+ expect(service.modelInformations[10].label).toEqual("Members service Invariant UUID");
+ expect(service.modelInformations[10].values).toEqual([]);
+
+ expect(service.modelInformations[11].label).toEqual("Members service model name");
+ expect(service.modelInformations[11].values).toEqual([]);
+
+ expect(service.modelInformations[12].label).toEqual("Minimum to instantiate");
+ expect(service.modelInformations[12].values).toEqual(['0']);
+
+ expect(service.modelInformations[13].label).toEqual("Maximum to instantiate");
+ expect(service.modelInformations[13].values).toEqual(['Unlimited']);
+ });
+
+ test('getSubLeftTitle new vnf group popup should return service model name', () => {
+ service.uuidData = {
+ serviceId: '6e59c5de-f052-46fa-aa7e-2fca9d674c44',
+ modelName: 'VF_vMee 0'
+ };
+ expect(service.getSubLeftTitle()).toBe('VNF Group : VF_vMee');
+ });
+
+ test('getInstance with empty storekey should be created', () => {
+ const serviceId: string = '6e59c5de-f052-46fa-aa7e-2fca9d674c44';
+ const vnfGroupModelName: string = '2017-388_ADIOD-vPE 1';
+ const newInstance = service.getInstance(serviceId, vnfGroupModelName, null);
+ expect(newInstance).toBeDefined();
+ });
+
+ test('getInstance with not empty storekey should return vnfGroupStoreKey', () => {
+ const serviceId: string = '6b528779-44a3-4472-bdff-9cd15ec93450';
+ const vnfGroupModelName: string = '2017-388_ADIOD-vPE 1';
+ const vnfGroupStoreKey: string = '2017-488_ADIOD-vPE 0';
+ const newInstance = service.getInstance(serviceId, vnfGroupModelName, vnfGroupStoreKey);
+ expect(newInstance.vnfGroupStoreKey).toEqual('2017-488_ADIOD-vPE 0');
+ });
+
+ test('getGenericFormPopupDetails returns the FormPopupDetails object', () => {
+ const serviceId: string = '6e59c5de-f052-46fa-aa7e-2fca9d674c44';
+ const vnfGroupModelName: string = 'VF_vMee 0';
+ const vnfGroupStoreKey: string = 'VF_vMee 0';
+ let uuidData: UUIDData = <any>{
+ serviceId: "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ modelName: "VF_vMee 0",
+ vnfGroupStoreKey: "VF_vMee 0"
+ };
+ const formPopupDetailsObject = service.getGenericFormPopupDetails(serviceId, vnfGroupModelName, vnfGroupStoreKey, null, uuidData, true);
+ expect(formPopupDetailsObject).toBeDefined();
+ }
+ );
+});
diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service.ts
new file mode 100644
index 000000000..748edd2cb
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service.ts
@@ -0,0 +1,158 @@
+import {Injectable} from '@angular/core';
+import {GenericPopupInterface} from "../generic-popup.interface";
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import {FormPopupDetails, PopupType} from "../../../../models/formControlModels/formPopupDetails.model";
+import {FormGroup} from "@angular/forms";
+import {ModelInformationItem} from "../../../model-information/model-information.component";
+import {ServiceModel} from "../../../../models/serviceModel";
+import {Subject} from "rxjs/Subject";
+import {BasicControlGenerator} from "../../../genericForm/formControlsServices/basic.control.generator";
+import {IframeService} from "../../../../utils/iframe.service";
+import {DefaultDataGeneratorService} from "../../../../services/defaultDataServiceGenerator/default.data.generator.service";
+import {AaiService} from "../../../../services/aaiService/aai.service";
+import {BasicPopupService} from "../basic.popup.service";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../../../store/reducers";
+import {Subscriber} from "../../../../models/subscriber";
+import {Constants} from "../../../../utils/constants";
+import {ModelInfo} from "../../../../models/modelInfo";
+import {changeInstanceCounter} from "../../../../storeUtil/utils/general/general.actions";
+import * as _ from 'lodash';
+import {VnfGroupControlGenerator} from "../../../genericForm/formControlsServices/vnfGroupGenerator/vnfGroup.control.generator";
+import {VnfGroupInstance} from "../../../../models/vnfGroupInstance";
+import {createVnfGroupInstance, updateVnfGroupInstance} from "../../../../storeUtil/utils/vnfGroup/vnfGroup.actions";
+
+@Injectable()
+export class VnfGroupPopupService implements GenericPopupInterface{
+ dynamicInputs: any;
+ instance: any;
+ model:any;
+ serviceModel:ServiceModel;
+ modelInformations: ModelInformationItem[] = [];
+ uuidData: Object;
+ closeDialogEvent: Subject<any> = new Subject<any>();
+ isUpdateMode: boolean;
+
+ constructor(
+ private _basicControlGenerator: BasicControlGenerator,
+ private _vnfGroupControlGenerator: VnfGroupControlGenerator,
+ private _iframeService: IframeService,
+ private _defaultDataGeneratorService: DefaultDataGeneratorService,
+ private _aaiService: AaiService,
+ private _basicPopupService: BasicPopupService,
+ private _store: NgRedux<AppState>) {
+ }
+
+ getGenericFormPopupDetails(serviceId: string, modelName: string, vnfGroupStoreKey: string, node: ITreeNode, uuidData: Object, isUpdateMode: boolean): FormPopupDetails {
+ this.uuidData = uuidData;
+ this.isUpdateMode = isUpdateMode;
+ this.instance = this.getInstance(serviceId, modelName, vnfGroupStoreKey);
+ this.getModelInformation(serviceId, modelName);
+
+ return new FormPopupDetails(this,
+ PopupType.VNF_GROUP,
+ uuidData,
+ this.getTitle(isUpdateMode),
+ this.getSubLeftTitle(),
+ this.getSubRightTitle(),
+ this.getControls(serviceId, modelName, vnfGroupStoreKey),
+ this._basicPopupService.getDynamicInputs(serviceId, modelName, vnfGroupStoreKey, 'vnfGroups'),
+ this.modelInformations,
+ (that, form: FormGroup) => {that.onSubmit(that, form);},
+ (that: any, form: FormGroup) => {that.onCancel(that, form); }
+ )
+ }
+
+ getControls(serviceId: string, modelName: string, vnfGroupStoreKey: string){
+ if(this._store.getState().service.serviceHierarchy[serviceId].service.instantiationType === 'Macro') {
+ return this._vnfGroupControlGenerator.getMacroFormControls(serviceId, vnfGroupStoreKey, modelName);
+ } else {
+ return this._vnfGroupControlGenerator.getAlaCarteFormControls(serviceId, vnfGroupStoreKey, modelName);
+ }
+ }
+
+ getInstance(serviceId: string, modelName: string, vnfGroupStoreKey: string): any {
+ if(_.isNil(vnfGroupStoreKey)){
+ return new VnfGroupInstance();
+ }
+ return this._store.getState().service.serviceInstance[serviceId].vnfGroups[vnfGroupStoreKey];
+ }
+
+ getModelInformation(serviceId: string, modelName: string): void {
+ this._aaiService.getServiceModelById(serviceId).subscribe((result: any) => {
+ this.serviceModel = new ServiceModel(result);
+ this.model = this._basicPopupService.getModelFromResponse(result, 'vnfGroups', modelName);
+ const serviceInstance = this._store.getState().service.serviceInstance[serviceId];
+ this.modelInformations = [
+ new ModelInformationItem("Model version", "modelVersion", [this.model.version], "", true),
+ new ModelInformationItem("Description", "description", [this.model.description]),
+ new ModelInformationItem("Category", "category", [this.model.category]),
+ new ModelInformationItem("Sub Category", "subCategory", [this.model.subCategory]),
+ new ModelInformationItem("UUID", "uuid", [this.model.uuid], Constants.ServicePopup.TOOLTIP_UUID, true),
+ new ModelInformationItem("Invariant UUID", "invariantUuid", [this.model.invariantUuid], Constants.ServicePopup.TOOLTIP_INVARIANT_UUID, true),
+ new ModelInformationItem("Type", "type", [this.model.properties.type], "", true),
+ new ModelInformationItem("Role", "role", [this.model.properties.role]),
+ new ModelInformationItem("Function", "function", [this.model.properties.function]),
+ new ModelInformationItem("Member resource type", "contained_resource_type", ["VNF"], "", true),
+ new ModelInformationItem("Members service Invariant UUID", "Members service Invariant UUID", _.toArray(_.mapValues(this.model.members, 'sourceModelInvariant'))),
+ new ModelInformationItem("Members service model name", "sourceModelName", _.toArray(_.mapValues(this.model.members, 'sourceModelName'))),
+ new ModelInformationItem("Minimum to instantiate", "vnfGroup-min", ['0'], "", false),
+ new ModelInformationItem("Maximum to instantiate", "vnfGroup-max", ['Unlimited'], "", false)
+ ];
+ })
+ }
+
+ getSubLeftTitle(): string {
+ return "VNF Group : " + this._store.getState().service.serviceHierarchy[this.uuidData['serviceId']].vnfGroups[this.uuidData['modelName']].name;
+ }
+
+ getSubRightTitle(): string {
+ return "VNF Group Instance Details";
+ }
+
+ storeVnfGroup = (that, formValues: any): void => {
+ formValues.modelInfo = new ModelInfo(that.model);
+ formValues.uuid = formValues.modelInfo.uuid;
+ formValues.isMissingData = false;
+ if(!that.isUpdateMode){
+ that._store.dispatch(changeInstanceCounter(formValues.modelInfo.modelCustomizationId || formValues.uuid, that.uuidData.serviceId, 1 , <any> {data: {type: 'VnfGroup'}}));
+ this._store.dispatch(createVnfGroupInstance(formValues, that.uuidData['modelName'], that.uuidData['serviceId'], that.uuidData['modelName']));
+ }else {
+ that._store.dispatch(updateVnfGroupInstance(formValues, that.uuidData.modelName, that.uuidData.serviceId, that.uuidData.vnfGroupStoreKey))
+ }
+ };
+
+ getTitle(isUpdateMode: boolean): string {
+ return isUpdateMode ? "Edit VNF Group instance": "Set a new VNF Group" ;
+ }
+
+ onCancel(that, form): void {
+ form.reset();
+ that._iframeService.removeClassCloseModal('content');
+ this.closeDialogEvent.next(that);
+ }
+
+ onSubmit(that, form: FormGroup, ...args): void {
+ form.value['instanceParams'] = [{}];
+ that.storeVnfGroup(that, form.value);
+ window.parent.postMessage( {
+ eventId: 'submitIframe',
+ data: {
+ serviceModelId: that.uuidData.serviceId
+ }
+ }, "*");
+ that.onCancel(that, form);
+ }
+
+ extractSubscriberNameBySubscriberId(subscriberId: string, store: NgRedux<AppState>) {
+ let result: string = null;
+ let filteredArray: any = _.filter(store.getState().service.subscribers, function (o: Subscriber) {
+ return o.id === subscriberId
+ });
+ if (filteredArray.length > 0) {
+ result = filteredArray[0].name;
+ }
+ return result;
+ }
+
+}
diff --git a/vid-webpack-master/src/app/shared/components/messageBox/messageBox.component.ts b/vid-webpack-master/src/app/shared/components/messageBox/messageBox.component.ts
index 08e199cf5..c610110fd 100644
--- a/vid-webpack-master/src/app/shared/components/messageBox/messageBox.component.ts
+++ b/vid-webpack-master/src/app/shared/components/messageBox/messageBox.component.ts
@@ -30,7 +30,7 @@
import { Component } from '@angular/core';
import { MessageBoxData} from './messageBox.data';
import { MessageBoxService } from './messageBox.service';
-import { SdcUiComponents } from 'sdc-ui/lib/angular';
+import { SdcUiServices} from "onap-ui-angular";
@Component({
selector: 'message-box',
@@ -38,12 +38,17 @@ import { SdcUiComponents } from 'sdc-ui/lib/angular';
})
export class MessageBoxComponent {
- modalService: SdcUiComponents.ModalService;
-
- constructor(modalService: SdcUiComponents.ModalService, private _messageBoxService : MessageBoxService) {
+ modalService: SdcUiServices.ModalService;
+ isOpened : boolean = false;
+ constructor(modalService: SdcUiServices.ModalService, private _messageBoxService : MessageBoxService) {
this.modalService = modalService;
+
MessageBoxService.openModal.subscribe((messageBoxData: MessageBoxData) => {
- modalService.openModal(this._messageBoxService.setConfig(messageBoxData))
+ if(this.isOpened) return;
+ this.isOpened = true;
+ modalService.openModal(this._messageBoxService.setConfig(messageBoxData)).onDestroy(()=>{
+ this.isOpened = false;
+ })
});
}
}
diff --git a/vid-webpack-master/src/app/shared/components/messageBox/messageBox.data.ts b/vid-webpack-master/src/app/shared/components/messageBox/messageBox.data.ts
index 165140ba7..e67b1f76f 100644
--- a/vid-webpack-master/src/app/shared/components/messageBox/messageBox.data.ts
+++ b/vid-webpack-master/src/app/shared/components/messageBox/messageBox.data.ts
@@ -1,13 +1,14 @@
-import { Subject } from 'rxjs/Subject';
+import { SdcUiCommon} from "onap-ui-angular";
+import {IModalButtonComponent} from "onap-ui-angular/dist/modals/models/modal-config";
export class MessageBoxData {
title?: string;
message?: string;
- size : ModalSize;
- type: ModalType;
- buttons: Array<IModalButtonComponent>;
+ size : SdcUiCommon.ModalSize;
+ type: SdcUiCommon.ModalType;
+ buttons: IModalButtonComponent[];
- constructor(title: string, message: string, type: ModalType, size : ModalSize, buttons: Array<IModalButtonComponent>) {
+ constructor(title: string, message: string, type: SdcUiCommon.ModalType, size : SdcUiCommon.ModalSize, buttons: IModalButtonComponent[]) {
this.title = title;
this.message = message;
this.size = size;
@@ -15,37 +16,3 @@ export class MessageBoxData {
this.buttons = buttons;
}
}
-
-export interface IModalConfig {
- size?: string;
- title?: string;
- message?: string;
- buttons?: Array<IModalButtonComponent>;
- type?: string;
-}
-export interface IButtonComponent {
- text: string;
- disabled?: boolean;
- type?: string;
- size?: string;
-}
-export interface IModalButtonComponent extends IButtonComponent {
- callback?: Function;
- closeModal?: boolean;
-}
-export enum ModalType {
- alert = "alert",
- error = "error",
- standard = "info",
- custom = "custom",
-}
-export enum ModalSize {
- xlarge = "xl",
- large = "l",
- medium = "md",
- small = "sm",
- xsmall = "xsm",
-}
-
-
-
diff --git a/vid-webpack-master/src/app/shared/components/messageBox/messageBox.service.spec.ts b/vid-webpack-master/src/app/shared/components/messageBox/messageBox.service.spec.ts
index 89562ac54..1d0e18ffb 100644
--- a/vid-webpack-master/src/app/shared/components/messageBox/messageBox.service.spec.ts
+++ b/vid-webpack-master/src/app/shared/components/messageBox/messageBox.service.spec.ts
@@ -3,35 +3,37 @@ import {
HttpClientTestingModule,
HttpTestingController
} from '@angular/common/http/testing';
-
import { MessageBoxService } from './messageBox.service';
-import {MessageBoxData, ModalSize, ModalType } from './messageBox.data';
+import {MessageBoxData} from './messageBox.data';
+import { SdcUiCommon} from "onap-ui-angular";
describe('MessageBoxService', () => {
let injector;
let service: MessageBoxService;
let httpMock: HttpTestingController;
- beforeEach(() => {
+ beforeAll(done => (async () => {
TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
providers: [MessageBoxService]
});
+ await TestBed.compileComponents();
injector = getTestBed();
service = injector.get(MessageBoxService);
httpMock = injector.get(HttpTestingController);
- });
+
+ })().then(done).catch(done.fail));
describe('#setConfig', () => {
- it('should return <IModalConfig>', (done: DoneFn) => {
+ test('should return <IModalConfig>', () => {
let title = "Delete Instantiation";
let message = "You are about to stop the instantiation process of this service. \nAll data will be lost. Are you sure you want to stop?";
let messageBoxData : MessageBoxData = new MessageBoxData(
title,
message,
- ModalType.alert,
- ModalSize.medium,
+ SdcUiCommon.ModalType.warning,
+ SdcUiCommon.ModalSize.medium,
[
{text:"Stop Instantiation", size:"large", closeModal:true},
{text:"Cancel", size:"medium", closeModal:true}
@@ -41,9 +43,8 @@ describe('MessageBoxService', () => {
expect(result.title).toEqual(title);
expect(result.message).toEqual(message);
expect(result.buttons.length).toEqual(2);
- expect(result.type).toEqual(ModalType.alert);
- expect(result.size).toEqual(ModalSize.medium);
- done();
+ expect(result.type).toEqual(SdcUiCommon.ModalType.warning);
+ expect(result.size).toEqual(SdcUiCommon.ModalSize.medium);
});
});
});
diff --git a/vid-webpack-master/src/app/shared/components/messageBox/messageBox.service.ts b/vid-webpack-master/src/app/shared/components/messageBox/messageBox.service.ts
index eaa012d3b..d73631a43 100644
--- a/vid-webpack-master/src/app/shared/components/messageBox/messageBox.service.ts
+++ b/vid-webpack-master/src/app/shared/components/messageBox/messageBox.service.ts
@@ -1,18 +1,18 @@
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs/Subject';
-import { IModalConfig, MessageBoxData, ModalSize, ModalType } from './messageBox.data';
+import {MessageBoxData} from "./messageBox.data";
+import { SdcUiCommon} from "onap-ui-angular";
@Injectable()
export class MessageBoxService {
static openModal: Subject<MessageBoxData> = new Subject<MessageBoxData>();
- setConfig(messageBoxData: MessageBoxData) : IModalConfig{
+ setConfig(messageBoxData: MessageBoxData) : SdcUiCommon.IModalConfig{
return {
- size : ModalSize.medium,
+ size : SdcUiCommon.ModalSize.medium,
title : messageBoxData.title,
type : messageBoxData.type,
message : messageBoxData.message,
buttons: messageBoxData.buttons
};
}
-
}
diff --git a/vid-webpack-master/src/app/shared/components/model-information/model-information.component.ts b/vid-webpack-master/src/app/shared/components/model-information/model-information.component.ts
index fea4c44c7..9401aca05 100644
--- a/vid-webpack-master/src/app/shared/components/model-information/model-information.component.ts
+++ b/vid-webpack-master/src/app/shared/components/model-information/model-information.component.ts
@@ -1,5 +1,6 @@
import {Component, Input} from '@angular/core';
-import * as _ from 'lodash';
+import {ModelInformationService} from "./model-information.service";
+
@Component({
selector: 'model-information',
@@ -8,17 +9,21 @@ import * as _ from 'lodash';
})
export class ModelInformationComponent {
- private _modelInformationItems: Array<ModelInformationItem>;
+ constructor(private _modelInformationService : ModelInformationService){}
+
+ private _modelInformationItems: ModelInformationItem[];
+
+ @Input() itemClass: string = 'item'; //default class for item is "item"
- get modelInformationItems(): Array<ModelInformationItem> {
+ get modelInformationItems(): ModelInformationItem[] {
return this._modelInformationItems;
}
@Input()
- set modelInformationItems(_modelInformationItems: Array<ModelInformationItem>) {
+ set modelInformationItems(_modelInformationItems: ModelInformationItem[]) {
if (_modelInformationItems) {
- this._modelInformationItems = _modelInformationItems.filter(x => x.mandatory || (!_.isEmpty(x.values) && !_.isEmpty(x.values[0])));
+ this._modelInformationItems = this._modelInformationService.filterModelItems(_modelInformationItems);
}
}
}
@@ -27,11 +32,11 @@ export class ModelInformationComponent {
export class ModelInformationItem {
label: string;
testsId: string;
- values: Array<string>;
+ values: string[];
toolTipText: string;
mandatory: boolean;
- constructor(label: string, testsId: string, values: Array<any>, toolTipText: string = "", mandatory: boolean = false,nested:boolean=false) {
+ constructor(label: string, testsId: string, values: any[], toolTipText: string = "", mandatory: boolean = false) {
this.label = label;
this.testsId = testsId;
this.values = values;
@@ -39,4 +44,8 @@ export class ModelInformationItem {
this.mandatory = mandatory;
}
+ static createInstance(label: string, value: any):ModelInformationItem {
+ return new ModelInformationItem(label, label, [value]);
+ }
+
}
diff --git a/vid-webpack-master/src/app/shared/components/model-information/model-information.html b/vid-webpack-master/src/app/shared/components/model-information/model-information.html
index 456dfdee4..78548b035 100644
--- a/vid-webpack-master/src/app/shared/components/model-information/model-information.html
+++ b/vid-webpack-master/src/app/shared/components/model-information/model-information.html
@@ -1,12 +1,12 @@
<div id="model-information">
- <div *ngFor="let item of modelInformationItems" class="item" attr.data-tests-id="model-item-{{item.label}}">
+ <div *ngFor="let item of modelInformationItems" ngClass={{itemClass}} attr.data-tests-id="model-item-{{item.label}}">
<tooltip-content #a>
<span> {{item.toolTipText}}</span>
</tooltip-content>
<div class="wrapper" [tooltip]="a" [tooltipDisabled]="!item.toolTipText" tooltipPlacement="top" [tooltipAnimation]="false">
<label attr.data-tests-id="model-item-label-{{item.testsId}}">{{item.label}}</label>
- <div *ngFor="let value of item.values" attr.data-tests-id="model-item-value-{{item.testsId}}">{{value}}</div>
+ <div *ngFor="let value of item.values" class="model-item-value" attr.data-tests-id="model-item-value-{{item.testsId}}">{{value}}</div>
</div>
</div>
</div>
diff --git a/vid-webpack-master/src/app/shared/components/model-information/model-information.service.spec.ts b/vid-webpack-master/src/app/shared/components/model-information/model-information.service.spec.ts
new file mode 100644
index 000000000..418493f2b
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/model-information/model-information.service.spec.ts
@@ -0,0 +1,32 @@
+import {ModelInformationService} from "./model-information.service";
+import {ModelInformationItem} from "./model-information.component";
+
+describe('ModelInformationService', () => {
+ let underTest:ModelInformationService;
+
+ beforeEach(() => {
+ underTest = new ModelInformationService();
+ });
+
+ test('when call to filterModelItems then items with empty values are filtered', () =>{
+ expect(underTest.filterModelItems([
+ ModelInformationItem.createInstance("emptyValue", ""),
+ ModelInformationItem.createInstance("nullValue", null),
+ ModelInformationItem.createInstance("undefinedValue", undefined),
+ ModelInformationItem.createInstance("spacesValue", " "),
+ new ModelInformationItem("emptyArray", "id", [], "c", false)
+ ])).toHaveLength(0);
+ });
+
+ test('when call to filterModelItems then mandatory items with empty values are not filtered', () =>{
+ const mandatoryItem:ModelInformationItem = new ModelInformationItem("a", "b", [""], "c", true);
+ expect(underTest.filterModelItems([mandatoryItem])).toEqual([mandatoryItem]);
+ });
+
+ test('when call to filterModelItems then items with values are not filtered', () =>{
+ expect(underTest.filterModelItems([
+ ModelInformationItem.createInstance("withString", "a"),
+ ModelInformationItem.createInstance("withNumber", 1),
+ ])).toHaveLength(2);
+ });
+});
diff --git a/vid-webpack-master/src/app/shared/components/model-information/model-information.service.ts b/vid-webpack-master/src/app/shared/components/model-information/model-information.service.ts
new file mode 100644
index 000000000..7c0a96b01
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/model-information/model-information.service.ts
@@ -0,0 +1,16 @@
+import {Injectable} from "@angular/core";
+import * as _ from 'lodash';
+import {ModelInformationItem} from "./model-information.component";
+
+@Injectable()
+export class ModelInformationService {
+
+ filterModelItems(_modelInformationItems: ModelInformationItem[]) {
+ return _modelInformationItems.filter(x => x.mandatory || (
+ !_.isEmpty(x.values)
+ && !_.isNil(x.values[0])
+ && x.values[0].toString().trim()!=""
+ ));
+ }
+}
+
diff --git a/vid-webpack-master/src/app/shared/components/model-information/model-information.spec.ts b/vid-webpack-master/src/app/shared/components/model-information/model-information.spec.ts
new file mode 100644
index 000000000..cdba11f59
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/model-information/model-information.spec.ts
@@ -0,0 +1,12 @@
+import {ModelInformationItem} from "./model-information.component";
+
+describe('ModelInformationItem', () => {
+ test('when use createInstance, values initialized as expected', () =>{
+ const modelInformationItem:ModelInformationItem = ModelInformationItem.createInstance("aStr", 4);
+ expect(modelInformationItem.label).toEqual("aStr");
+ expect(modelInformationItem.testsId).toEqual("aStr");
+ expect(modelInformationItem.values).toEqual([4]);
+ expect(modelInformationItem.mandatory).toBeFalsy();
+ expect(modelInformationItem.toolTipText).toEqual("");
+ });
+});
diff --git a/vid-webpack-master/src/app/shared/components/no-content-message-and-icon/no-content-message-and-icon.component.html b/vid-webpack-master/src/app/shared/components/no-content-message-and-icon/no-content-message-and-icon.component.html
index bbe7bc78c..18200283b 100644
--- a/vid-webpack-master/src/app/shared/components/no-content-message-and-icon/no-content-message-and-icon.component.html
+++ b/vid-webpack-master/src/app/shared/components/no-content-message-and-icon/no-content-message-and-icon.component.html
@@ -1,5 +1,6 @@
<div class="width-100">
- <div class="text-title" [ngClass]="titleClass">{{title}}</div>
- <div class="text-subtitle" [ngClass]="subtitleClass">{{subtitle}}</div>
+ <div class="text-title" [ngClass]="titleClass" [attr.data-tests-id]="'text-title'">{{title}}</div>
+ <div class="text-title" [ngClass]="titleClass" [attr.data-tests-id]="'text-title2'">{{title2}}</div>
+ <div class="text-subtitle" [ngClass]="subtitleClass" [attr.data-tests-id]="'text-subtitle'">{{subtitle}}</div>
<img id="not-node-img-id" src="{{iconPath}}" alt="" class="no-content-icon" [ngClass]="iconClass" data-tests-id="no-content-icon">
</div>
diff --git a/vid-webpack-master/src/app/shared/components/no-content-message-and-icon/no-content-message-and-icon.component.scss b/vid-webpack-master/src/app/shared/components/no-content-message-and-icon/no-content-message-and-icon.component.scss
index 1320ef731..3829f06aa 100644
--- a/vid-webpack-master/src/app/shared/components/no-content-message-and-icon/no-content-message-and-icon.component.scss
+++ b/vid-webpack-master/src/app/shared/components/no-content-message-and-icon/no-content-message-and-icon.component.scss
@@ -9,6 +9,7 @@
font-size: 16px;
color: #4A4A4A;
text-align: center;
+ padding-bottom: 7px;
}
.text-subtitle {
@@ -16,7 +17,7 @@
font-size: 16px;
color: #959595;
text-align: center;
- margin-top: 7px;
+ margin-top: 2px;
}
.no-content-icon {
diff --git a/vid-webpack-master/src/app/shared/components/no-content-message-and-icon/no-content-message-and-icon.component.ts b/vid-webpack-master/src/app/shared/components/no-content-message-and-icon/no-content-message-and-icon.component.ts
index 7f4e98294..da66f3f17 100644
--- a/vid-webpack-master/src/app/shared/components/no-content-message-and-icon/no-content-message-and-icon.component.ts
+++ b/vid-webpack-master/src/app/shared/components/no-content-message-and-icon/no-content-message-and-icon.component.ts
@@ -11,6 +11,7 @@ export class NoContentMessageAndIconComponent {
constructor() {}
@Input() title: string;
+ @Input() title2?: string;
@Input() subtitle: string;
@Input() iconPath: string;
diff --git a/vid-webpack-master/src/app/shared/components/popover/popover.component.html b/vid-webpack-master/src/app/shared/components/popover/popover.component.html
index c5515596c..4dc8096dc 100644
--- a/vid-webpack-master/src/app/shared/components/popover/popover.component.html
+++ b/vid-webpack-master/src/app/shared/components/popover/popover.component.html
@@ -2,7 +2,10 @@
triggers="mouseenter:mouseleave"
popover="{{value}}"
[hidden]="value == null"
- container="body">
+ container="body"
+ containerClass="{{popoverType}}"
+ placement="{{placement}}"
+ [attr.data-tests-id]="'popover-test-id'">
<ng-content ></ng-content>
</div>
diff --git a/vid-webpack-master/src/app/shared/components/popover/popover.component.scss b/vid-webpack-master/src/app/shared/components/popover/popover.component.scss
index ca2800a27..946b62d30 100644
--- a/vid-webpack-master/src/app/shared/components/popover/popover.component.scss
+++ b/vid-webpack-master/src/app/shared/components/popover/popover.component.scss
@@ -1,4 +1,5 @@
.popover.popover-top.top {
color : green !important;
font-size: 10px;
+ word-wrap: break-word;
}
diff --git a/vid-webpack-master/src/app/shared/components/popover/popover.component.ts b/vid-webpack-master/src/app/shared/components/popover/popover.component.ts
index d6a4c3ae1..9dbbe63a5 100644
--- a/vid-webpack-master/src/app/shared/components/popover/popover.component.ts
+++ b/vid-webpack-master/src/app/shared/components/popover/popover.component.ts
@@ -1,17 +1,29 @@
import {Component, Input} from "@angular/core";
-
@Component({
selector: 'custom-popover',
- templateUrl: 'popover.component.html',
- styles: [`
- :host >>> .popover {
- font-size: 13px;
- text-align: left;
- z-index: 10000;
- }
- `]
+ templateUrl: 'popover.component.html'
})
-export class PopoverComponent {
- @Input() value: String;
+export class PopoverComponent{
+ @Input() value: string;
+ @Input() extraStyle : string;
+ @Input() placement : string = PopoverPlacement.LEFT;
+ @Input() popoverType : string = PopoverType.CUSTOM;
+
+}
+
+export enum PopoverPlacement{
+ TOP = 'top',
+ BOTTOM = 'bottom',
+ LEFT = 'left',
+ RIGHT = 'right',
+ AUTO ='auto',
}
+
+export enum PopoverType {
+ ERROR = 'error',
+ WARNING = 'warning',
+ SUCCESS = 'success',
+ CUSTOM = 'custom'
+}
+
diff --git a/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/member-table-row.model.ts b/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/member-table-row.model.ts
new file mode 100644
index 000000000..c5f1a7a07
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/member-table-row.model.ts
@@ -0,0 +1,6 @@
+import {VnfMember} from "../../../models/VnfMember";
+
+export class MemberTableRowModel extends VnfMember{
+ isSelected : boolean = false;
+}
+
diff --git a/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.component.html b/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.component.html
new file mode 100644
index 000000000..3a29ed824
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.component.html
@@ -0,0 +1,75 @@
+<div class="table-header">
+ <div class="left-header">
+ <span class="title-header">{{description}}</span>
+ <div class="sub-title-header">
+ <span class="vnf-match-your-criteria" class="total" [attr.data-tests-id]="'total-amount'" style="margin-right: 5px;"><span
+ [attr.data-tests-id]="'numberOfNotHideVnfMembers'">{{membersTableService.numberOfNotHideVnfMembers}}</span> VNFs match your criteria</span>
+ <span class="vnf-selected" class="total" [attr.data-tests-id]="'total-selected'"><span
+ [attr.data-tests-id]="'numberOfSelectedVnfMembers'">{{membersTableService.numberOfSelectedVnfMembers}}</span> VNF{{membersTableService.numberOfSelectedVnfMembers>1?'s':'' }} selected</span>
+ </div>
+ </div>
+
+ <div class="search-container">
+ <sdc-filter-bar
+ [placeHolder]="'Search...'"
+ [debounceTime]="250"
+ [testId]="'vnf-members-search'"
+ (valueChange)="search($event)">
+ </sdc-filter-bar>
+ </div>
+</div>
+<table id="member-table" class="table table-bordered" *ngIf="data?.length > 0">
+ <thead class="thead-dark">
+ <tr>
+ <th class="allCheckboxAreSelected" style="position: relative;">
+ <sdc-checkbox
+ [(checked)]="membersTableService.allCheckboxAreSelected"
+ [testId]="'all-checkbox-selected'"
+ (checkedChange)="changeAllCheckboxStatus($event)"
+ ></sdc-checkbox>
+ </th>
+ <th class="header-title" *ngFor="let header of headers">{{header.displayName}}</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr class="member-table-row" *ngFor="let vnf of membersTableService.filteredMembers">
+ <td class="sdcCheckboxMember" style="position: relative;" [attr.data-tests-id]="vnf?.instanceId">
+ <sdc-checkbox
+ [checked]="membersTableService.allMemberStatusMap[vnf.instanceId]?.isSelected"
+ [testId]="vnf?.instanceId"
+ (checkedChange)="changeCheckboxStatus(vnf.instanceId)"
+ ></sdc-checkbox></td>
+ <td id="vnfName">
+ <custom-ellipsis [id]="vnf?.instanceName" [value]="vnf?.instanceName"
+ [hightlight]="filterValue"></custom-ellipsis>
+ <custom-ellipsis class="second-line" [id]="vnf?.instanceId" [value]="'UUID: '+ vnf?.instanceId"
+ [hightlight]="filterValue"></custom-ellipsis>
+ </td>
+ <td id="version">
+ <custom-ellipsis [id]="vnf?.modelInfo?.modelVersion" [value]="vnf?.modelInfo?.modelVersion" [hightlight]="filterValue"></custom-ellipsis>
+ </td>
+ <td id="modelName">
+ <custom-ellipsis [id]="vnf?.modelInfo?.modelName" [value]="vnf?.modelInfo?.modelName" [hightlight]="filterValue"></custom-ellipsis>
+ </td>
+ <td id="provStatus">
+ <custom-ellipsis [id]="vnf?.provStatus" [value]="vnf?.provStatus" [hightlight]="filterValue"></custom-ellipsis>
+ </td>
+ <td id="serviceInstance">
+ <custom-ellipsis [id]="vnf?.serviceInstanceName" [value]="vnf?.serviceInstanceName"
+ [hightlight]="filterValue"></custom-ellipsis>
+ <custom-ellipsis class="second-line" [id]="vnf?.serviceInstanceId" [value]="'UUID: '+ vnf?.serviceInstanceId"
+ [hightlight]="filterValue"></custom-ellipsis>
+ </td>
+ <td id="cloudRegion">
+ <custom-ellipsis [id]="vnf?.lcpCloudRegionId" [value]="vnf?.lcpCloudRegionId" [hightlight]="filterValue"></custom-ellipsis>
+ </td>
+ <td id="tenantName">
+ <custom-ellipsis [id]="vnf?.tenantName" [value]="vnf?.tenantName" [hightlight]="filterValue"></custom-ellipsis>
+ </td>
+ </tr>
+
+ </tbody>
+</table>
+<div class="no-result" *ngIf="data?.length == 0">No VNFs were found that can belong to this group.</div>
+
+
diff --git a/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.component.scss b/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.component.scss
new file mode 100644
index 000000000..3be975222
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.component.scss
@@ -0,0 +1,91 @@
+.table-header {
+ display: flex;
+ margin-bottom: 5px;
+ .left-header{
+ .title-header{
+ font-family: OpenSans-SemiBold;
+ color: #191919;
+ font-size: 15px;
+ margin-bottom: 5px;
+ display: block;
+ }
+
+ .sub-title-header{
+
+ .vnf-selected{
+ margin-left: 25px;
+ }
+
+ .vnf-match-your-criteria{
+ }
+ }
+ .total{
+ font-family: OpenSans-Regular;
+ color: #191919;
+ font-size: 15px;
+ margin-right: 10px;
+ }
+
+ }
+
+ .search-container{
+ flex-basis: 300px;
+ margin-left: auto;
+ }
+}
+
+#member-table>tbody+tbody {
+ border-top: 1px solid #ddd;
+}
+
+
+
+#member-table {
+ border: 1px solid #D2D2D2;
+ thead {
+ background: #F8F8F8;
+ th.allCheckboxAreSelected {
+ vertical-align: middle !important;
+ width: 48px;
+ max-width: 48px;
+ min-width: 48px;
+ height: 48px;
+ }
+ th.header-title {
+ font-family: OpenSans-SemiBold;
+ vertical-align: middle !important;
+ height: 48px;
+ font-size: 12px;
+ }
+ }
+ tbody {
+ td{
+ text-align: center;
+ height: 60px;
+ padding-top: 0;
+ padding-bottom: 0;
+ max-height: 60px;
+ vertical-align: middle;
+ .second-line {
+ font-size: 12px;
+ }
+ }
+ }
+
+
+ //font-size: 12px;
+
+ th.allCheckboxAreSelected {
+ text-align: center;
+ }
+}
+
+.no-result {
+ font-family: OpenSans-Regular;
+ width: 100%;
+ height: 100%;
+ border: 1px solid #d2d2d2;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
diff --git a/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.component.ts b/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.component.ts
new file mode 100644
index 000000000..9736563af
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.component.ts
@@ -0,0 +1,57 @@
+import {Component, Input, OnChanges, Output, SimpleChanges, EventEmitter} from '@angular/core';
+import {VnfMember} from "../../../models/VnfMember";
+import {MembersTableService} from "./members-table.service";
+import * as _ from 'lodash';
+
+export class CustomTableColumnDefinition {
+ public displayName = '';
+ public key : any = '';
+ public type? = 'text';
+ public filter? = '';
+}
+
+@Component({
+ selector: 'app-members-table',
+ templateUrl: './members-table.component.html',
+ styleUrls: ['./members-table.component.scss']
+})
+
+export class MembersTableComponent implements OnChanges{
+ filterValue: string = null;
+ allMemberStatusMap = null;
+ membersTableService : MembersTableService;
+ headers: CustomTableColumnDefinition[] = MembersTableService.getHeaders();
+ @Input() data: VnfMember[];
+ @Input() description: string;
+ @Output() selectedMembersAmountChange : EventEmitter<number> = new EventEmitter();
+ constructor(private _membersTableService : MembersTableService){
+ this.membersTableService = this._membersTableService;
+ }
+
+ ngOnChanges(changes: SimpleChanges): void {
+ if(_.isNil(this.data)){
+ this._membersTableService.resetAll();
+ }else {
+ this._membersTableService.allMemberStatusMap = MembersTableService.generateAllMembersStatus(this.data);
+ this._membersTableService.filteredMembers = MembersTableService.sortVnfMembersByName(this.data, "instanceName");
+ this._membersTableService.updateAmountsAndCheckAll();
+ }
+ }
+
+ search(searchStr: string): void {
+ this.filterValue = searchStr;
+ this._membersTableService.filterMembers(this.filterValue);
+ }
+
+ changeAllCheckboxStatus(status: boolean) : void {
+ this._membersTableService.changeAllCheckboxStatus(status);
+ this.selectedMembersAmountChange.emit(this._membersTableService.numberOfSelectedVnfMembers);
+ }
+
+
+ changeCheckboxStatus(vnfInstanceId: string) : void {
+ this._membersTableService.changeCheckboxStatus(vnfInstanceId);
+ this.selectedMembersAmountChange.emit(this._membersTableService.numberOfSelectedVnfMembers);
+ }
+
+}
diff --git a/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.service.spec.ts b/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.service.spec.ts
new file mode 100644
index 000000000..e53c63be1
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.service.spec.ts
@@ -0,0 +1,270 @@
+import {MembersTableService} from "./members-table.service";
+import {TestBed, getTestBed} from "@angular/core/testing";
+import {NgRedux} from "@angular-redux/store";
+import {CustomTableColumnDefinition} from "./members-table.component";
+import {AppState} from "../../../store/reducers";
+import {createRelatedVnfMemberInstance} from "../../../storeUtil/utils/relatedVnfMember/relatedVnfMember.actions";
+import {DataFilterPipe} from "../../../pipes/dataFilter/data-filter.pipe";
+import {VnfMember} from "../../../models/VnfMember";
+
+
+
+class MockAppStore<T> {
+ dispatch() {
+ }
+ getState() {
+ return {
+ service : {
+ serviceHierarchy: {
+ },
+ serviceInstance : {
+ "serviceModelId" : {
+ vnfGroups:{
+ "aa1":{
+ vnfs:{
+ "VNF1_INSTANCE_ID":{
+ "action": "None",
+ "instanceName": "VNF1_INSTANCE_NAME",
+ "instanceId": "VNF1_INSTANCE_ID",
+ "orchStatus": null,
+ "lcpCloudRegionId": "mtn23b",
+ "tenantId": "3e9a20a3e89e45f884e09df0cc2d2d2a",
+ "tenantName": "APPC-24595-T-IST-02C",
+ "modelInfo": {
+ "modelInvariantId": "vnf-instance-model-invariant-id",
+ "modelVersionId": "7a6ee536-f052-46fa-aa7e-2fca9d674c44",
+ "modelVersion": "2.0",
+ "modelName": "vf_vEPDG",
+ "modelType": "vnf"
+ },
+ "instanceType": "VNF1_INSTANCE_TYPE",
+ "provStatus": null,
+ "inMaint": false,
+ "uuid": "7a6ee536-f052-46fa-aa7e-2fca9d674c44",
+ "trackById": "7a6ee536-f052-46fa-aa7e-2fca9d674c44:002",
+ "serviceInstanceId": "service-instance-id1",
+ "serviceInstanceName": "service-instance-name"
+
+ },
+ "aa1-vnf1":{
+ vnfName: "",
+ instanceId:"",
+ serviceInstanceId:""
+ }
+ }
+ }
+ }
+ }
+
+ }
+ }
+ }
+ }
+}
+
+describe('MembersTableService view member count', () => {
+ let injector;
+ let service: MembersTableService;
+ let store: NgRedux<AppState>;
+ let data = loadMockMembers();
+
+ beforeAll(done => (async () => {
+
+ TestBed.configureTestingModule(
+ {
+ providers: [
+ MembersTableService,
+ {provide: NgRedux, useClass: MockAppStore},
+ DataFilterPipe
+
+ ],
+ declarations: [DataFilterPipe]
+ });
+ await TestBed.compileComponents();
+
+ injector = getTestBed();
+ service = injector.get(MembersTableService);
+ store = injector.get(NgRedux)
+
+ })().then(done).catch(done.fail));
+
+
+ test('should return number of displayed members', () => {
+ service.allMemberStatusMap = MembersTableService.generateAllMembersStatus(<any>data);
+ service.filteredMembers = <any>data;
+ expect(service.calculateNotHideVnfMembers()).toEqual(2);
+ });
+
+ test('should return number of selected members', () => {
+ service.allMemberStatusMap = MembersTableService.generateAllMembersStatus(<any>data);
+ service.allMemberStatusMap['VNF1_INSTANCE_ID'].isSelected = true;
+ service.allMemberStatusMap['VNF2_INSTANCE_ID'].isSelected = true;
+ expect(service.calculateSelectedVnfMembers()).toEqual(2);
+ });
+
+ test('should return number of selected members', () => {
+ service.allMemberStatusMap = MembersTableService.generateAllMembersStatus(<any>data);
+ service.filteredMembers = <any>data;
+ service.allMemberStatusMap['VNF1_INSTANCE_ID'].isSelected = true;
+ service.filterMembers('VNF2');
+ service.allMemberStatusMap['VNF2_INSTANCE_ID'].isSelected = true;
+ expect(service.calculateNotHideVnfMembers()).toEqual(1);
+ });
+
+ test('getHeader should return labels with array of keys', () => {
+ const headers: CustomTableColumnDefinition[] = MembersTableService.getHeaders();
+ expect(headers).toEqual([
+ {displayName: 'VNF instance name', key: ['instanceName']},
+ {displayName: 'VNF version', key: ['modelInfo', 'modelVersion']},
+ {displayName: 'VNF model name', key: ['modelInfo', 'modelName']},
+ {displayName: 'Prov Status', key: ['provStatus']},
+ {displayName: 'Service instance name', key: ['serviceInstanceName']},
+ {displayName: 'Cloud Region', key: ['lcpCloudRegionId']},
+ {displayName: 'Tenant Name', key: ['tenantName']}
+ ]);
+ });
+
+
+ test('setMembers should dispatch action only on selected members', () => {
+ const vnfGroupStoreKey: string = 'vnfGroupStoreKey';
+ const serviceId: string = 'serviceId';
+
+ jest.spyOn(store, 'dispatch');
+ service.allMemberStatusMap = MembersTableService.generateAllMembersStatus(<any>data);
+ service.allMemberStatusMap['VNF1_INSTANCE_ID'].isSelected = true;
+ service.setMembers({serviceId: serviceId, vnfGroupStoreKey: vnfGroupStoreKey});
+ expect(store.dispatch).toHaveBeenCalledTimes(1);
+ expect(store.dispatch).toHaveBeenCalledWith(createRelatedVnfMemberInstance(vnfGroupStoreKey, serviceId, service.allMemberStatusMap['VNF1_INSTANCE_ID']));
+ });
+
+ test('generateAllMembersStatus should add to each instance isHide and isSelected and convert to map', () => {
+
+ let allMemberStatusMapMock = MembersTableService.generateAllMembersStatus(<any>data);
+ for (const key in allMemberStatusMapMock) {
+ expect(allMemberStatusMapMock[key].isSelected).toBeFalsy();
+ }
+ });
+
+ test('changeAllCheckboxStatus', () => {
+ let data = loadMockMembers();
+ service.allMemberStatusMap = MembersTableService.generateAllMembersStatus(<any>data);
+ service.filteredMembers = <any>data;
+ service.changeAllCheckboxStatus(true);
+ for (let key in service.allMemberStatusMap) {
+ expect(service.allMemberStatusMap[key].isSelected).toEqual(true);
+ }
+ });
+
+ test('should reset all numbers and lists', () => {
+ let data = loadMockMembers();
+ service.allMemberStatusMap = MembersTableService.generateAllMembersStatus(<any>data);
+ service.filteredMembers = <any>data;
+ service.changeAllCheckboxStatus(true);
+ service.resetAll();
+ expect(service.numberOfNotHideVnfMembers).toEqual(0);
+ expect(service.numberOfSelectedAndNotHideVnfMembers).toEqual(0);
+ expect(service.numberOfSelectedVnfMembers).toEqual(0);
+ expect(service.allMemberStatusMap).toEqual({});
+ expect(service.filteredMembers.length).toEqual(0);
+ });
+
+ test('checkAllCheckboxStatus should be false if not all are selected', () => {
+ service.allMemberStatusMap = MembersTableService.generateAllMembersStatus(<any>loadMockMembers());
+ service.updateAmountsAndCheckAll();
+
+ expect(service.allCheckboxAreSelected).toEqual(false);
+ });
+
+
+ test('sortVnfMembersByName should sort list by vnf name', () => {
+ let data = <any>loadMockMembers();
+ let sortedList = MembersTableService.sortVnfMembersByName(data, "instanceName");
+
+ expect(sortedList[0].instanceName).toEqual("VNF1_INSTANCE_NAME");
+ expect(sortedList[1].instanceName).toEqual("VNF2_INSTANCE_NAME");
+
+ let tmp = data[0];
+ data[0] = data[1];
+ data[1] = tmp;
+
+ sortedList = MembersTableService.sortVnfMembersByName(data, "instanceName");
+
+ expect(sortedList[1].instanceName).toEqual("VNF1_INSTANCE_NAME");
+ expect(sortedList[0].instanceName).toEqual("VNF2_INSTANCE_NAME");
+ sortedList = MembersTableService.sortVnfMembersByName(null, "instanceName");
+ expect(sortedList).toEqual([]);
+ sortedList = MembersTableService.sortVnfMembersByName(data, undefined);
+ expect(sortedList).toEqual([]);
+ });
+
+ test('should return only vnf members not associated to any vnf group', ()=>{
+ const result: VnfMember[] = service.filterUsedVnfMembers("serviceModelId",loadMockMembers());
+ expect(result.length).toEqual(1);
+ expect(result[0].instanceId).toEqual("VNF2_INSTANCE_ID");
+ });
+
+});
+
+
+function loadMockMembers(): any[] {
+ return [
+ {
+ "action": "None",
+ "instanceName": "VNF1_INSTANCE_NAME",
+ "instanceId": "VNF1_INSTANCE_ID",
+ "orchStatus": null,
+ "productFamilyId": null,
+ "lcpCloudRegionId": "mtn23b",
+ "tenantId": "3e9a20a3e89e45f884e09df0cc2d2d2a",
+ "tenantName": "APPC-24595-T-IST-02C",
+ "modelInfo": {
+ "modelInvariantId": "vnf-instance-model-invariant-id",
+ "modelVersionId": "7a6ee536-f052-46fa-aa7e-2fca9d674c44",
+ "modelVersion": "2.0",
+ "modelName": "vf_vEPDG",
+ "modelType": "vnf"
+ },
+ "instanceType": "VNF1_INSTANCE_TYPE",
+ "provStatus": null,
+ "inMaint": false,
+ "uuid": "7a6ee536-f052-46fa-aa7e-2fca9d674c44",
+ "originalName": null,
+ "legacyRegion": null,
+ "lineOfBusiness": null,
+ "platformName": null,
+ "trackById": "7a6ee536-f052-46fa-aa7e-2fca9d674c44:002",
+ "serviceInstanceId": "service-instance-id1",
+ "serviceInstanceName": "service-instance-name"
+ },
+ {
+ "action": "None",
+ "instanceName": "VNF2_INSTANCE_NAME",
+ "instanceId": "VNF2_INSTANCE_ID",
+ "orchStatus": null,
+ "productFamilyId": null,
+ "lcpCloudRegionId": "mtn23b",
+ "tenantId": "3e9a20a3e89e45f884e09df0cc2d2d2a",
+ "tenantName": "APPC-24595-T-IST-02C",
+ "modelInfo": {
+ "modelInvariantId": "vnf-instance-model-invariant-id",
+ "modelVersionId": "eb5f56bf-5855-4e61-bd00-3e19a953bf02",
+ "modelVersion": "1.0",
+ "modelName": "vf_vEPDG",
+ "modelType": "vnf"
+ },
+ "instanceType": "VNF2_INSTANCE_TYPE",
+ "provStatus": null,
+ "inMaint": true,
+ "uuid": "eb5f56bf-5855-4e61-bd00-3e19a953bf02",
+ "originalName": null,
+ "legacyRegion": null,
+ "lineOfBusiness": null,
+ "platformName": null,
+ "trackById": "eb5f56bf-5855-4e61-bd00-3e19a953bf02:003",
+ "serviceInstanceId": "service-instance-id2",
+ "serviceInstanceName": "service-instance-name"
+ }
+ ];
+}
+
+
diff --git a/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.service.ts b/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.service.ts
new file mode 100644
index 000000000..5b9cd39a2
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.service.ts
@@ -0,0 +1,153 @@
+import {Injectable} from "@angular/core";
+import {VnfMember} from "../../../models/VnfMember";
+import {CustomTableColumnDefinition} from "./members-table.component";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../../store/reducers";
+import {createRelatedVnfMemberInstance} from "../../../storeUtil/utils/relatedVnfMember/relatedVnfMember.actions";
+import * as _ from 'lodash';
+import {DataFilterPipe} from "../../../pipes/dataFilter/data-filter.pipe";
+import {MemberTableRowModel} from "./member-table-row.model";
+
+@Injectable()
+export class MembersTableService {
+ allMemberStatusMap : { [key:string]: MemberTableRowModel; };
+ filteredMembers : VnfMember[];
+ allCheckboxAreSelected : boolean;
+ numberOfNotHideVnfMembers : number;
+ numberOfSelectedVnfMembers : number;
+ numberOfSelectedAndNotHideVnfMembers : number;
+
+ constructor(private _store: NgRedux<AppState>, private dataFilter: DataFilterPipe){
+ this.resetAll();
+ }
+
+ filterUsedVnfMembers = (serviceModelId: string, result: VnfMember[]): VnfMember[] => {
+ const allMembersMap = _.keyBy(result as VnfMember[], 'instanceId');
+ const vnfGroupsData = this._store.getState().service.serviceInstance[serviceModelId].vnfGroups;
+ const vnfMembersArr = _.flatMap(vnfGroupsData).map((vnfGroup) =>vnfGroup.vnfs );
+ for( let vnf of vnfMembersArr ){
+ for(let member in vnf){
+ delete allMembersMap[member];
+ }
+ }
+ return _.flatMap(allMembersMap);
+ };
+
+ updateAmountsAndCheckAll = () : void => {
+ this.numberOfSelectedVnfMembers = this.calculateSelectedVnfMembers();
+ this.numberOfNotHideVnfMembers = this.calculateNotHideVnfMembers();
+ this.numberOfSelectedAndNotHideVnfMembers = this.calculateSelectedAndNotHide();
+ this.allCheckboxAreSelected = this.numberOfNotHideVnfMembers > 0 && this.numberOfNotHideVnfMembers === this.numberOfSelectedAndNotHideVnfMembers;
+ };
+
+ resetAll = () : void => {
+ this.allMemberStatusMap = {};
+ this.filteredMembers = [];
+ this.numberOfSelectedVnfMembers = 0;
+ this.numberOfNotHideVnfMembers = 0;
+ this.numberOfSelectedAndNotHideVnfMembers = 0;
+ this.allCheckboxAreSelected = false;
+ };
+
+ changeAllCheckboxStatus = (status : boolean) : void =>{
+ for(const member of this.filteredMembers){
+ this.allMemberStatusMap[member.instanceId].isSelected = status;
+ }
+ this.updateAmountsAndCheckAll();
+ };
+
+ changeCheckboxStatus = (vnfInstanceId : string ) : void =>{
+ this.allMemberStatusMap[vnfInstanceId].isSelected = !this.allMemberStatusMap[vnfInstanceId].isSelected;
+ this.updateAmountsAndCheckAll();
+ };
+
+ /************************************************
+ iterate over all current vnf members:
+ 1) if vnf member is selected then update REDUX store
+ 2) if vnf member is not selected then delete member
+ @allMemberStatusMap: current vnf member status
+ @vnfGroupStoreKey: vnf group store key
+ @serviceId: service model id
+ ************************************************/
+ setMembers = (data : {serviceId : string, vnfGroupStoreKey : string}) : void =>{
+ let tmpMembers = this.allMemberStatusMap;
+ for(let key in tmpMembers){
+ if(tmpMembers[key].isSelected){
+ this._store.dispatch(createRelatedVnfMemberInstance( data.vnfGroupStoreKey, data.serviceId, tmpMembers[key]));
+ }
+ }
+ };
+
+ filterMembers(searchStr: string): void {
+ const keys: string[][] = MembersTableService.getDataKeys();
+ this.filteredMembers = this.dataFilter.transform(_.values(this.allMemberStatusMap), searchStr || '', keys);
+ this.updateAmountsAndCheckAll();
+ }
+
+ /************************************
+ generate vnf member data for select/ unselect rows
+ ************************************/
+ static generateAllMembersStatus(tableData : VnfMember[]) : { [key:string]: MemberTableRowModel; }{
+
+ tableData.map((vnf) => {
+ vnf['isSelected'] = false
+ });
+ return _.keyBy(tableData as MemberTableRowModel[], 'instanceId');
+ }
+
+
+ static sortVnfMembersByName(list : VnfMember[], keyName : string) :VnfMember[]{
+ if(!_.isNil(list) && !_.isNil(keyName)) {
+ return list.sort(function(itemA, itemB) { return itemA[keyName]- itemB[keyName];})
+ }
+ return [];
+
+ }
+
+ /********************************
+ table columns headers and key's
+ ********************************/
+ static getHeaders() : CustomTableColumnDefinition[] {
+ return [
+ {displayName: 'VNF instance name', key: ['instanceName']},
+ {displayName: 'VNF version', key: ['modelInfo', 'modelVersion']},
+ {displayName: 'VNF model name', key: ['modelInfo', 'modelName']},
+ {displayName: 'Prov Status', key: ['provStatus']},
+ {displayName: 'Service instance name', key: ['serviceInstanceName']},
+ {displayName: 'Cloud Region', key: ['lcpCloudRegionId']},
+ {displayName: 'Tenant Name', key: ['tenantName']}
+ ];
+ }
+
+ static getDataKeys(): string[][]{
+ const headers = MembersTableService.getHeaders();
+ return headers.map((header)=> header.key).concat([['instanceId']],[['serviceInstanceId']]);
+ }
+
+ /*************************************************************************************
+ calculate the number of selected vnf members - include not visible and visible rows
+ @allMemberStatusMap: current vnf member status
+ *************************************************************************************/
+ calculateSelectedVnfMembers() : number {
+ const flatObject = _.values(this.allMemberStatusMap);
+ return _.filter(flatObject, (item) => { if (item.isSelected) return item }).length;
+ }
+
+ /************************************************
+ calculate the number of display vnf members
+ @allMemberStatusMap: current vnf member status
+ ************************************************/
+ calculateNotHideVnfMembers() : number {
+ return this.filteredMembers.length;
+ }
+
+ /************************************************
+ calculate the number of display vnf members
+ @allMemberStatusMap: current vnf member status
+ ************************************************/
+ calculateSelectedAndNotHide() : number {
+ return _.filter(this.filteredMembers, (item) => { if ( this.allMemberStatusMap[item.instanceId].isSelected) return item }).length;
+ }
+
+
+}
diff --git a/vid-webpack-master/src/app/shared/components/searchMembersModal/search-members-modal.component.html b/vid-webpack-master/src/app/shared/components/searchMembersModal/search-members-modal.component.html
new file mode 100644
index 000000000..899bc9889
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/searchMembersModal/search-members-modal.component.html
@@ -0,0 +1,35 @@
+<div class="modal-search-member-content">
+ <div class="header">
+ <vid-svg-icon
+ [attr.data-tests-id]="'cancelBtn'"
+ (click)="closeDialog()"
+ class="navigation-arrow-back"
+ [mode]="'primary'"
+ [size]="'large'"
+ [name]="'navigation-arrow-back'"
+ [clickable]="true"
+ [fill]="'#FFFFFF'"
+ [widthViewBox]="'24'"
+ [heightViewBox]="'24'">
+ </vid-svg-icon>
+
+ <span class="title">
+ {{title}}
+ </span>
+ <button type="submit" data-tests-id="setMembersBtn" [disabled]="disableSetMembers" (click)="setMembers()" class="sdc-button sdc-button__primary">SET MEMBERS</button>
+ </div>
+ <div class="content-wrapper">
+ <div class="sidebar-left">
+ <div class="search-criteria-wrapper">
+ <div class="search-criteria-title">SEARCH CRITERIA</div>
+ <div class="search-item" *ngFor="let searchFieldItem of searchFields">
+ <span class="label-item">{{searchFieldItem.title}}</span>
+ <span attr.data-tests-id="{{searchFieldItem.dataTestId}}" class="text-item">{{searchFieldItem.value}}</span>
+ </div>
+ </div>
+ </div>
+ <div class="sidebar-right">
+ <app-members-table [data]="membersData" [description]="description" (selectedMembersAmountChange)="selectedMembersAmountChange($event)"></app-members-table>
+ </div>
+ </div>
+</div>
diff --git a/vid-webpack-master/src/app/shared/components/searchMembersModal/search-members-modal.component.scss b/vid-webpack-master/src/app/shared/components/searchMembersModal/search-members-modal.component.scss
new file mode 100644
index 000000000..d49653934
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/searchMembersModal/search-members-modal.component.scss
@@ -0,0 +1,89 @@
+.modal-search-member-content {
+ height: 100vh;
+ width: 100vw;
+ position: relative;
+ background: white;
+ .header {
+ height: 60px;
+ font-family: OpenSans-Regular;
+ display: -webkit-box;
+ display: flex;
+ font-size: 14px;
+ box-shadow: 2px 2px 6px #D2D2D2;
+ color: white;
+ background: #009fdb;
+ z-index: 1;
+ position: relative;
+ .navigation-arrow-back {
+ border-right: 1px solid #1eb9f3;
+ width: 60px;
+ height: 60px;
+ cursor: pointer;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ }
+ .title {
+ font-size: 18px;
+ line-height: 60px;
+ margin-left: 20px;
+ }
+ button {
+ width: 125px;
+ font-family: OpenSans-Regular;
+ font-size: 14px;
+ margin-left: auto;
+ margin-right: 20px;
+ margin-top: 12px;
+ border: 1px solid white;
+ &:disabled {
+ opacity: 0.5;
+ background: none;
+ }
+ }
+ }
+
+ .content-wrapper {
+ display: flex;
+
+ .sidebar-left {
+ flex-basis: 285px;
+ border-right: 1px solid #D2D2D2;
+ height: calc(100vh - 60px);
+
+ .search-criteria-wrapper{
+
+ .search-criteria-title{
+ font-family: OpenSans-SemiBold;
+ font-size: 14px;
+ color: #191919;
+ border-bottom: 1px solid #D2D2D2;
+ line-height: 50px;
+ padding-left: 30px;
+ }
+ .search-item{
+ color: #191919;
+ display: flex;
+ flex-direction: column;
+ margin: 25px 30px;
+ .label-item {
+ font-family: OpenSans-SemiBold;
+ font-size: 12px;
+ }
+ .text-item{
+ font-family: OpenSans-Regular;
+ font-size: 14px;
+ color: #5a5a5a;
+ word-break: break-all;
+ }
+
+ }
+ }
+ }
+
+ .sidebar-right {
+ flex: 1;
+ margin: 80px 50px;
+ }
+ }
+}
diff --git a/vid-webpack-master/src/app/shared/components/searchMembersModal/search-members-modal.component.ts b/vid-webpack-master/src/app/shared/components/searchMembersModal/search-members-modal.component.ts
new file mode 100644
index 000000000..9c65d222d
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/searchMembersModal/search-members-modal.component.ts
@@ -0,0 +1,82 @@
+import {Component, OnDestroy, OnInit, ViewChild} from '@angular/core';
+import {DialogComponent, DialogService} from "ng2-bootstrap-modal";
+import {IframeService} from "../../utils/iframe.service";
+import {AaiService} from "../../services/aaiService/aai.service";
+import {VnfMember} from "../../models/VnfMember";
+import {VnfGroupModel} from "../../models/vnfGroupModel";
+import {MembersTableService} from "./members-table/members-table.service";
+import {VnfGroupInstance} from "../../models/vnfGroupInstance";
+
+
+export interface PopupModel {
+ title: string;
+ serviceModelId : string;
+ searchFields: ISearchField[];
+ description : string;
+ subscriberId: string,
+ serviceType: string,
+ node: VnfGroupInstance,
+ vnfGroupModel: VnfGroupModel;
+
+}
+
+export interface ISearchField {
+ title: string;
+ value: any;
+ dataTestId: string;
+}
+
+@Component({
+ selector : 'search-members-modal',
+ templateUrl : 'search-members-modal.component.html',
+ styleUrls : ['search-members-modal.component.scss']
+})
+
+export class SearchMembersModalComponent extends DialogComponent<PopupModel, boolean> implements OnInit, OnDestroy {
+ title: string;
+ serviceModelId : string;
+ parentElementClassName = 'content';
+ membersData: VnfMember[];
+ description : string;
+ searchFields: ISearchField[];
+ vnfGroupModel: VnfGroupModel;
+ subscriberId: string;
+ serviceType: string;
+ node: VnfGroupInstance;
+ disableSetMembers: boolean = true;
+ constructor(dialogService: DialogService ,
+ private _iframeService : IframeService,
+ private _aaiService : AaiService,
+ private _membersTableService: MembersTableService){
+ super(dialogService);
+
+ }
+ @ViewChild('MembersTableComponent') membersTable;
+
+ ngOnInit() : void{
+ this._aaiService.getOptionalGroupMembers(this.serviceModelId, this.subscriberId, this.serviceType, (Object.values(this.vnfGroupModel.members))[0].sourceModelInvariant, this.vnfGroupModel.properties.type, this.vnfGroupModel.properties.role)
+ .subscribe((result: VnfMember[])=>{
+ this.membersData = this._membersTableService.filterUsedVnfMembers(this.serviceModelId, result);
+ });
+ };
+
+
+ closeDialog() : void{
+ this._iframeService.removeClassCloseModal(this.parentElementClassName);
+ this.dialogService.removeDialog(this);
+ setTimeout(() => {
+ window.parent.postMessage("closeIframe", "*");
+ }, 15);
+ }
+ selectedMembersAmountChange(selectedMembersAmount: number) : void {
+ this.disableSetMembers = selectedMembersAmount==0;
+ }
+
+
+ setMembers() : void {
+ this._membersTableService.setMembers({serviceId : this.serviceModelId, vnfGroupStoreKey : this.node.vnfGroupStoreKey});
+ this.closeDialog();
+ }
+}
+
+
diff --git a/vid-webpack-master/src/app/shared/components/spinner/spinner.component.html b/vid-webpack-master/src/app/shared/components/spinner/spinner.component.html
index cb11feea8..238f7693d 100644
--- a/vid-webpack-master/src/app/shared/components/spinner/spinner.component.html
+++ b/vid-webpack-master/src/app/shared/components/spinner/spinner.component.html
@@ -1,2 +1,6 @@
-<div *ngIf="show"
- class="spinner"></div>
+<sdc-loader name= "global"
+ #globalLoader
+ [global] = "global"
+ [size]="size"
+ [(active)] = "show"></sdc-loader>
+
diff --git a/vid-webpack-master/src/app/shared/components/spinner/spinner.component.spec.ts b/vid-webpack-master/src/app/shared/components/spinner/spinner.component.spec.ts
index 531ee8c62..57f7b009c 100644
--- a/vid-webpack-master/src/app/shared/components/spinner/spinner.component.spec.ts
+++ b/vid-webpack-master/src/app/shared/components/spinner/spinner.component.spec.ts
@@ -1,42 +1,50 @@
-import {async, ComponentFixture, TestBed} from '@angular/core/testing';
+import {ComponentFixture, TestBed} from '@angular/core/testing';
import {HttpClientTestingModule} from '@angular/common/http/testing';
-import { SpinnerComponent } from './spinner.component';
+import {SpinnerComponent, SpinnerInfo} from './spinner.component';
+import {CUSTOM_ELEMENTS_SCHEMA} from "@angular/core";
describe('Spinner component', () => {
let component: SpinnerComponent;
let fixture: ComponentFixture<SpinnerComponent>;
- beforeEach(async(() => {
+ beforeAll(done => (async () => {
TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
providers: [],
- declarations: [SpinnerComponent ]
- })
- .compileComponents();
- }));
+ declarations: [SpinnerComponent],
+ schemas: [ CUSTOM_ELEMENTS_SCHEMA ]
+ });
+ await TestBed.compileComponents();
- beforeEach(() => {
fixture = TestBed.createComponent(SpinnerComponent);
component = fixture.componentInstance;
fixture.detectChanges();
- });
- it('component should be defined', () => {
+ })().then(done).catch(done.fail));
+
+
+
+ test('component should be defined', () => {
expect(component).toBeDefined();
});
-
- it('component constructor should subscribe of showSpinner event with true', ()=> {
- SpinnerComponent.showSpinner.next(true);
+ test('component constructor should subscribe of showSpinner event with true', ()=> {
+ let spinnerInfo : SpinnerInfo = new SpinnerInfo(true, 'someUrl', 'json');
+ SpinnerComponent.showSpinner.next(spinnerInfo);
expect(component.show).toBeTruthy();
});
- it('component constructor should subscribe of showSpinner event with false', ()=> {
- SpinnerComponent.showSpinner.next(false);
+ test('component constructor should subscribe of showSpinner event with true and then to be false', ()=> {
+ let spinnerInfo : SpinnerInfo = new SpinnerInfo(true, 'someUrl', 'json');
+ SpinnerComponent.showSpinner.next(spinnerInfo);
+ spinnerInfo = new SpinnerInfo(false, 'someUrl', 'json');
+ SpinnerComponent.showSpinner.next(spinnerInfo);
expect(component.show).toBeFalsy();
});
-
-
-
+ test('component constructor should subscribe of showSpinner event with false', ()=> {
+ let spinnerInfo : SpinnerInfo = new SpinnerInfo(false, 'someUrl', 'json');
+ SpinnerComponent.showSpinner.next(spinnerInfo);
+ expect(component.show).toBeFalsy();
+ });
});
diff --git a/vid-webpack-master/src/app/shared/components/spinner/spinner.component.ts b/vid-webpack-master/src/app/shared/components/spinner/spinner.component.ts
index 0ce5d2074..94a0e1c52 100644
--- a/vid-webpack-master/src/app/shared/components/spinner/spinner.component.ts
+++ b/vid-webpack-master/src/app/shared/components/spinner/spinner.component.ts
@@ -1,18 +1,50 @@
-import { Component, Input } from '@angular/core';
-import { Subject } from 'rxjs/Subject';
+import {Component} from '@angular/core';
+import {Subject} from 'rxjs/Subject';
+import * as _ from 'lodash';
@Component({
selector : 'spinner-component',
- templateUrl : './spinner.component.html',
- styleUrls : ['./spinner.component.scss']
+ templateUrl: './spinner.component.html',
+ styleUrls : ['./spinner.component.scss'],
+ providers : []
+
})
-export class SpinnerComponent {
- show : boolean = false;
- static showSpinner: Subject<boolean> = new Subject<boolean>();
+export class SpinnerComponent{
+ show : boolean;
+ size = "large";
+ global = true;
+
+ requestMap = {};
+
+ static showSpinner: Subject<SpinnerInfo> = new Subject<SpinnerInfo>();
constructor(){
- SpinnerComponent.showSpinner.subscribe((status) => {
- this.show = status;
+ SpinnerComponent.showSpinner.subscribe((spinnerInfo) => {
+ let status = spinnerInfo['status'];
+ let requestType = spinnerInfo['requestType'];
+ let requestUrl = spinnerInfo['requestUrl'];
+
+ if(status && requestType === 'json'){
+ this.requestMap[requestUrl] = true;
+ }else {
+ delete this.requestMap[requestUrl]
+ }
+ console.log(this.requestMap);
+ this.show = !_.isEmpty(this.requestMap) && this.requestMap !== undefined;
+
})
}
}
+
+
+export class SpinnerInfo {
+ status : boolean;
+ requestUrl : string;
+ requestType : string;
+
+ constructor(status : boolean, requestUrl : string, requestType : string){
+ this.status = status;
+ this.requestUrl = requestUrl;
+ this.requestType = requestType;
+ }
+}
diff --git a/vid-webpack-master/src/app/shared/components/svg/svg-component.ts b/vid-webpack-master/src/app/shared/components/svg/svg-component.ts
new file mode 100644
index 000000000..2e4642432
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/components/svg/svg-component.ts
@@ -0,0 +1,47 @@
+import {
+ AfterViewChecked,
+ Component,
+ ElementRef,
+ EventEmitter,
+ Input,
+ Output
+} from "@angular/core";
+import * as _ from 'lodash';
+
+@Component({
+ selector : 'vid-svg-icon',
+ template: `
+ <svg-icon
+ [mode]="mode"
+ [size]="size"
+ [name]="name"
+ [testId]="testId"
+ [clickable]="clickable">
+ </svg-icon>
+ `,
+
+
+})
+export class SvgComponent implements AfterViewChecked{
+ @Input() mode : string = 'primary';
+ @Input() size : string = 'large';
+ @Input() testId : string = null;
+ @Input() name : string = null;
+ @Input() clickable : boolean = false;
+ @Input() fill : string ;
+ @Input() widthViewBox: string = null;
+ @Input() heightViewBox: string = null;
+
+ constructor(private elRef: ElementRef) {}
+
+ ngAfterViewChecked(): void {
+ if(!_.isNil(this.fill)){
+ this.elRef.nativeElement.children[0].children[0].children[0].style.fill = this.fill;
+ }
+
+ if(this.widthViewBox && this.heightViewBox){
+ this.elRef.nativeElement.children[0].children[0].children[0].setAttribute('viewBox', "1 1 " + this.widthViewBox + " " + this.heightViewBox)
+ }
+
+ }
+}
diff --git a/vid-webpack-master/src/app/shared/components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator.spec.ts b/vid-webpack-master/src/app/shared/components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator.spec.ts
deleted file mode 100644
index ec9f3f73e..000000000
--- a/vid-webpack-master/src/app/shared/components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator.spec.ts
+++ /dev/null
@@ -1,39 +0,0 @@
-import { ReflectiveInjector } from '@angular/core';
-import { NumbersLettersUnderscoreValidator } from './numbersLettersUnderscore.validator';
-
-describe('Numbers letters underscore validator', () => {
- let injector;
- let service: NumbersLettersUnderscoreValidator;
-
- beforeEach(() => {
-
- let injector = ReflectiveInjector.resolveAndCreate([
- NumbersLettersUnderscoreValidator
- ]);
-
- service = injector.get(NumbersLettersUnderscoreValidator);
- });
-
-
- describe('#valid', () => {
- it("'legal' should return null", ()=> {
- let legalVal: string = "legal";
- let result = NumbersLettersUnderscoreValidator.valid(legalVal);
- expect(result).toBeNull();
- });
-
- it("'illegal' should return object with invalidNumberLettersUnderscore true", ()=> {
- let illegalVal: string = "illegal-Val";
- let result = NumbersLettersUnderscoreValidator.valid(illegalVal);
- expect(result.invalidNumberLettersUnderscore).toBeTruthy();
- });
-
- it("'null' should return null", ()=> {
- let nullVal: string = null
- let result = NumbersLettersUnderscoreValidator.valid(nullVal);
- expect(result).toBeNull();
- });
-
-
- });
-});
diff --git a/vid-webpack-master/src/app/shared/components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator.ts b/vid-webpack-master/src/app/shared/components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator.ts
deleted file mode 100644
index 418bdfc4d..000000000
--- a/vid-webpack-master/src/app/shared/components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import { Injectable } from '@angular/core';
-import { isNullOrUndefined, isString } from 'util';
-
-@Injectable()
-export class NumbersLettersUnderscoreValidator {
- static valid(control: any) {
- let reg = /^[a-zA-Z0-9_]*$/;
-
- if(isNullOrUndefined(control)) return null;
- let val = isString(control) ? control : control.value;
- if (val === null) {
- return {'invalidNumberLettersUnderscore': true};
- }
- if (reg.test(val)) {
- return null;
- } else {
- return {'invalidNumberLettersUnderscore': true};
- }
- }
-}
diff --git a/vid-webpack-master/src/app/shared/directives/clickOutside/clickOutside.directive.spec.ts b/vid-webpack-master/src/app/shared/directives/clickOutside/clickOutside.directive.spec.ts
new file mode 100644
index 000000000..8edfb8733
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/directives/clickOutside/clickOutside.directive.spec.ts
@@ -0,0 +1,52 @@
+import {ComponentFixture, TestBed} from '@angular/core/testing';
+import {Component, DebugElement} from "@angular/core";
+import {By} from "@angular/platform-browser";
+import {ClickOutsideDirective} from "./clickOutside.directive";
+
+@Component({
+ template:
+ `<div id="innerDiv" [clickOutside] [classElements]="['outsideDivShouldNotTrigger']"></div>
+ <div class="outsideDivShouldTrigger"></div>
+ <div class="outsideDivShouldNotTrigger"></div>`
+})
+class TestHoverFocusComponent {
+}
+
+
+describe('Click outside Directive', () => {
+ let component: TestHoverFocusComponent;
+ let fixture: ComponentFixture<TestHoverFocusComponent>;
+ let directiveInstance : ClickOutsideDirective;
+ let outsideDivShouldNotTrigger: DebugElement;
+ let outsideDivShouldTrigger: DebugElement;
+ let innerDiv: DebugElement;
+
+ beforeEach(() => {
+ TestBed.configureTestingModule({
+ declarations: [TestHoverFocusComponent, ClickOutsideDirective]
+ });
+ fixture = TestBed.createComponent(TestHoverFocusComponent);
+ component = fixture.componentInstance;
+ outsideDivShouldNotTrigger = fixture.debugElement.query(By.css('.outsideDivShouldNotTrigger'));
+ outsideDivShouldTrigger = fixture.debugElement.query(By.css('.outsideDivShouldTrigger'));
+ innerDiv = fixture.debugElement.query(By.css('#innerDiv'));
+ directiveInstance = innerDiv.injector.get(ClickOutsideDirective);
+ });
+
+ test('directive should be defined', () => {
+ expect(directiveInstance).toBeDefined();
+ });
+
+ test(`should have list of class's`, () => {
+ fixture.detectChanges();
+ expect(directiveInstance.classElements).toEqual(['outsideDivShouldNotTrigger']);
+ });
+
+ test('should not trigger output on click outside', () => {
+ fixture.detectChanges();
+ spyOn(directiveInstance.clickOutsideTrigger, 'next');
+ outsideDivShouldNotTrigger.nativeElement.click();
+ expect(directiveInstance.clickOutsideTrigger.next).toHaveBeenCalledTimes(0);
+ });
+
+});
diff --git a/vid-webpack-master/src/app/shared/directives/clickOutside/clickOutside.directive.ts b/vid-webpack-master/src/app/shared/directives/clickOutside/clickOutside.directive.ts
new file mode 100644
index 000000000..1a43a3e68
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/directives/clickOutside/clickOutside.directive.ts
@@ -0,0 +1,41 @@
+import {Directive, EventEmitter, HostListener, Input, Output} from "@angular/core";
+import * as _ from 'lodash';
+/**********************************************************************
+ Click outside directive
+ can get one list of class's or id's (Not together)
+ if all elements are not the target then clickOutside is trigger
+ *******************************************************************/
+@Directive({
+ selector : '[clickOutside]'
+})
+export class ClickOutsideDirective {
+ @Input() clickOutside : string;
+ @Input() classElements : string[] = [];
+ @Input() idElements : string[] = [];
+ @Output() public clickOutsideTrigger: EventEmitter<any> = new EventEmitter();
+
+ @HostListener('document:click', ['$event.target']) public onClick(targetElement) {
+ if(!_.isNil(this.classElements)){this.hostListener(targetElement, this.classElements, 'getElementsByClassName');}
+ if(!_.isNil(this.idElements)){this.hostListener(targetElement, this.idElements, 'getElementById');}
+ }
+
+
+/********************************************************************************
+ hostListener - iterate over all elements and check if the element is the target.
+ @param targetElement - the target element
+ @param elements - elements to check
+ @param documentMethod - method to find the element in dom
+ ********************************************************************************/
+hostListener(targetElement, elements, documentMethod): void{
+ let result = true;
+for(let i = 0 ; i < elements.length; i++){
+ const classElements = document[documentMethod](elements[i]);
+ for (let j = 0 ; j < classElements.length; j++){
+ const clickedInside = document[documentMethod](elements[i])[j].contains(targetElement);
+ if(clickedInside) return;
+ result = result && clickedInside;
+ }
+}
+if (!result) {this.clickOutsideTrigger.emit(null); }
+}
+}
diff --git a/vid-webpack-master/src/app/shared/directives/inputPrevention/inputPreventionPattern.directive.spec.ts b/vid-webpack-master/src/app/shared/directives/inputPrevention/inputPreventionPattern.directive.spec.ts
index 846ff70f2..ec5bfd8f3 100644
--- a/vid-webpack-master/src/app/shared/directives/inputPrevention/inputPreventionPattern.directive.spec.ts
+++ b/vid-webpack-master/src/app/shared/directives/inputPrevention/inputPreventionPattern.directive.spec.ts
@@ -1,19 +1,18 @@
-import {TestBed, ComponentFixture} from '@angular/core/testing';
+import {ComponentFixture, TestBed} from '@angular/core/testing';
import {Component, DebugElement} from "@angular/core";
import {By} from "@angular/platform-browser";
-import { InputPreventionPatternDirective } from './inputPreventionPattern.directive';
+import {InputPreventionPatternDirective} from './inputPreventionPattern.directive';
@Component({
- template: `<input
+ template: `<input
patternInput
- pattern="^[a-zA-Z0-9_]*$">`
+ pattern="^[a-zA-Z0-9._-]*$">`
})
class TestHoverFocusComponent {
}
describe('InputPrevention Pattern Directive', () => {
-
let component: TestHoverFocusComponent;
let fixture: ComponentFixture<TestHoverFocusComponent>;
let directiveInstance : InputPreventionPatternDirective;
@@ -29,37 +28,54 @@ describe('InputPrevention Pattern Directive', () => {
directiveInstance = inputEl.injector.get(InputPreventionPatternDirective);
});
- it('directive should be defined', () => {
+ test('directive should be defined', () => {
expect(directiveInstance).toBeDefined();
});
- it('pattern exists', () => {
- expect(inputEl.nativeElement.pattern).toEqual('^[a-zA-Z0-9_]*$');
+ test('pattern exists', () => {
+ expect(inputEl.nativeElement.pattern).toEqual('^[a-zA-Z0-9._-]*$');
});
- it('kepress legal input', () => {
+ test('kepress legal input', () => {
fixture.detectChanges();
inputEl.nativeElement.value = "legalInput";
expect(new RegExp(inputEl.nativeElement.pattern).test(inputEl.nativeElement.value)).toBeTruthy();
});
- it('kepress illegal input', () => {
+ test('kepress illegal input', () => {
inputEl.triggerEventHandler('kepress', " ");
fixture.detectChanges();
expect(inputEl.nativeElement.value).toBe('');
});
- it('kepress event legal input should return event', () => {
- const event = <any>{ key: 'A' };
+
+ test('kepress event legal input should return event', () => {
+ const event = <any>{ key: 'A'};
+ inputEl.nativeElement.value = "legalInput";
+ let result = directiveInstance.onKeypress(event);
+ expect(result).toBe(event);
+ });
+
+
+ test('kepress event legal(-) input should return event', () => {
+ const event = <any>{ key: '-'};
inputEl.nativeElement.value = "legalInput";
let result = directiveInstance.onKeypress(event);
expect(result).toBe(event);
});
- it('kepress event illegal input should prevent default', () => {
- const event = <any>{key: '-', preventDefault : function () {} };
- spyOn(event, 'preventDefault');
- inputEl.nativeElement.value = "-";
+ test('kepress event legal (.) input should return event', () => {
+ const event = <any>{ key: '.'};
+ inputEl.nativeElement.value = "legalInput";
+ let result = directiveInstance.onKeypress(event);
+ expect(result).toBe(event);
+ });
+
+
+ test('kepress event illegal input should prevent default', () => {
+ const event = <any>{key: '$', preventDefault : function () {} };
+ jest.spyOn(event, 'preventDefault');
+ inputEl.nativeElement.value = "$";
let result = directiveInstance.onKeypress(event);
expect(event.preventDefault).toHaveBeenCalled();
});
diff --git a/vid-webpack-master/src/app/shared/directives/inputPrevention/inputPreventionPattern.directive.ts b/vid-webpack-master/src/app/shared/directives/inputPrevention/inputPreventionPattern.directive.ts
index dada09bef..d00c52502 100644
--- a/vid-webpack-master/src/app/shared/directives/inputPrevention/inputPreventionPattern.directive.ts
+++ b/vid-webpack-master/src/app/shared/directives/inputPrevention/inputPreventionPattern.directive.ts
@@ -1,18 +1,10 @@
-import {Directive, ElementRef} from '@angular/core';
+import {Directive, ElementRef, HostBinding, HostListener} from '@angular/core';
@Directive({
- selector: '[patternInput]',
- host: {
- '(keypress)': 'onKeypress($event)'
- }
+ selector: '[patternInput]'
})
export class InputPreventionPatternDirective{
- inputElement : ElementRef;
- constructor(el: ElementRef) {
- this.inputElement = el;
- }
-
- onKeypress(event: KeyboardEvent) {
+ @HostListener('keypress', ['$event']) onKeypress(event: KeyboardEvent) {
const pattern = new RegExp(this.inputElement.nativeElement.pattern);
if(pattern){
if(!pattern.test(event['key'])){
@@ -21,4 +13,9 @@ export class InputPreventionPatternDirective{
}
return event;
}
+
+ inputElement : ElementRef;
+ constructor(el: ElementRef) {
+ this.inputElement = el;
+ }
}
diff --git a/vid-webpack-master/src/app/shared/directives/svg/svg.directive.html b/vid-webpack-master/src/app/shared/directives/svg/svg.directive.html
deleted file mode 100644
index e69de29bb..000000000
--- a/vid-webpack-master/src/app/shared/directives/svg/svg.directive.html
+++ /dev/null
diff --git a/vid-webpack-master/src/app/shared/directives/svg/svg.directive.ts b/vid-webpack-master/src/app/shared/directives/svg/svg.directive.ts
deleted file mode 100644
index e4dc55a56..000000000
--- a/vid-webpack-master/src/app/shared/directives/svg/svg.directive.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-import { AfterContentChecked, AfterViewInit, Directive, ElementRef, Input } from '@angular/core';
-import { isNullOrUndefined } from 'util';
-
-
-/*
- Temporary
- Changing svg color and size.
- color changing according to fill attribute
- size according to viewBox
-*/
-@Directive({
- selector: '[svg-directive]'
-})
-export class SvgDirective implements AfterContentChecked {
- @Input('fill') fill: string = "black";
- @Input('widthViewBox') widthViewBox: string = null;
- @Input('heightViewBox') heightViewBox: string = null;
-
- constructor(private elRef: ElementRef) {}
- ngAfterContentChecked(): void {
- if(this.elRef !== undefined && this.elRef.nativeElement.children !== undefined && this.elRef.nativeElement.children[0] !== undefined){
- this.elRef.nativeElement.children[0].children[1].children[0].style.fill = this.fill;
- if(this.elRef.nativeElement.children[0].children[1].children.length > 1){
- this.elRef.nativeElement.children[0].children[1].children[1].style.fill = this.fill;
- this.elRef.nativeElement.children[0].children[1].children[2].children[0].style.fill = this.fill;
- }
-
- if(this.widthViewBox && this.heightViewBox){
- this.elRef.nativeElement.firstChild.setAttribute('viewBox', "1 1 " + this.widthViewBox + " " + this.heightViewBox)
- }
-
- }
- }
-}
diff --git a/vid-webpack-master/src/app/shared/index.ts b/vid-webpack-master/src/app/shared/index.ts
deleted file mode 100644
index 68fada65d..000000000
--- a/vid-webpack-master/src/app/shared/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from './api.service';
diff --git a/vid-webpack-master/src/app/shared/models/ServiceNodeTypes.ts b/vid-webpack-master/src/app/shared/models/ServiceNodeTypes.ts
index f72b32d8b..945c69be9 100644
--- a/vid-webpack-master/src/app/shared/models/ServiceNodeTypes.ts
+++ b/vid-webpack-master/src/app/shared/models/ServiceNodeTypes.ts
@@ -2,7 +2,9 @@ export enum ServiceNodeTypes {
VF = "VF",
VFmodule = "VFmodule",
Network = "Network",
- Configuration = "Configuration"
+ VL = 'VL',
+ Configuration = "Configuration",
+ VnfGroup = 'VnfGroup'
}
diff --git a/vid-webpack-master/src/app/shared/models/VnfMember.ts b/vid-webpack-master/src/app/shared/models/VnfMember.ts
new file mode 100644
index 000000000..392f8ddf9
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/models/VnfMember.ts
@@ -0,0 +1,11 @@
+import {Level1Instance} from "./level1Instance";
+
+export class VnfMember extends Level1Instance{
+ serviceInstanceName: string;
+ serviceInstanceId: string;
+ tenantName: string;
+ constructor(){
+ super();
+ }
+
+}
diff --git a/vid-webpack-master/src/app/shared/models/formControlModels/checkboxFormControl.model.ts b/vid-webpack-master/src/app/shared/models/formControlModels/checkboxFormControl.model.ts
new file mode 100644
index 000000000..f505b5667
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/models/formControlModels/checkboxFormControl.model.ts
@@ -0,0 +1,11 @@
+import {FormControlModel} from "./formControl.model";
+import {FormControlType} from "./formControlTypes.enum";
+
+export class CheckboxFormControl extends FormControlModel{
+
+ constructor(data) {
+ super(data);
+ this.type = FormControlType.CHECKBOX;
+ this.validations = [];
+ }
+}
diff --git a/vid-webpack-master/src/app/shared/models/formControlModels/dropdownFormControl.model.ts b/vid-webpack-master/src/app/shared/models/formControlModels/dropdownFormControl.model.ts
new file mode 100644
index 000000000..ba3e860e0
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/models/formControlModels/dropdownFormControl.model.ts
@@ -0,0 +1,29 @@
+import {FormControlModel} from "./formControl.model";
+import {FormGroup} from "@angular/forms";
+import {FormControlType} from "./formControlTypes.enum";
+import {Observable} from "rxjs";
+
+export class DropdownFormControl extends FormControlModel{
+ options$ : Observable<any[]> = null;
+ args : string[];
+ onInit: (data : DropdownFormControl, form: FormGroup) => Observable<any>;
+ selectedField : string;
+ onInitSelectedField : string[]; // key that should select from API response.
+ ngValue : string;
+ name : string;
+ hasEmptyOptions : boolean; // get empty result from API or REDUX.
+
+
+ constructor(data) {
+ super(data);
+ this.type = FormControlType.DROPDOWN;
+ this.options$ = data.options ? data.options$ : null;
+ this.onInit = data.onInit;
+ this.selectedField = data.selectedField;
+ this.onInitSelectedField = data.onInitSelectedField ? data.onInitSelectedField : null;
+ this.ngValue = data.selectedField ? data.selectedField : 'id';
+ this.name = data.name;
+ this.hasEmptyOptions = false;
+ }
+
+}
diff --git a/vid-webpack-master/src/app/shared/models/formControlModels/fileFormControl.model.ts b/vid-webpack-master/src/app/shared/models/formControlModels/fileFormControl.model.ts
new file mode 100644
index 000000000..7803fabf8
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/models/formControlModels/fileFormControl.model.ts
@@ -0,0 +1,18 @@
+import {CustomValidatorOptions, FormControlModel, ValidatorModel} from "./formControl.model";
+import {FormControlType} from "./formControlTypes.enum";
+import {InputFormControl} from "./inputFormControl.model";
+
+export class FileFormControl extends FormControlModel{
+ acceptedExtentions : String;
+ selectedFile : String;
+ onDelete? :Function;
+ hiddenFile: InputFormControl[];
+ constructor(data) {
+ super(data);
+ this.type = FormControlType.FILE;
+ this.selectedFile = data.selectedFile ? data.selectedFile : data.placeHolder;
+ this.acceptedExtentions = data.acceptedExtentions ? data.acceptedExtentions : '';
+ this.onDelete = data.onDelete ? data.onDelete : function () {};
+ this.hiddenFile = data.hiddenFile;
+ }
+}
diff --git a/vid-webpack-master/src/app/shared/models/formControlModels/formControl.model.ts b/vid-webpack-master/src/app/shared/models/formControlModels/formControl.model.ts
new file mode 100644
index 000000000..24116549e
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/models/formControlModels/formControl.model.ts
@@ -0,0 +1,121 @@
+import {FormGroup, ValidatorFn, Validators} from "@angular/forms";
+import {Subject} from "rxjs/Subject";
+import {FormControlType} from "./formControlTypes.enum";
+import {CustomValidators} from "../../validators/uniqueName/uniqueName.validator";
+import * as _ from 'lodash';
+
+export class FormControlModel {
+ formGroup : FormGroup;
+ controlName : string;
+ type : FormControlType;
+ displayName : string;
+ dataTestId : string;
+ placeHolder? : string;
+ tooltip? :string;
+ isDisabled? : boolean;
+ validations? : ValidatorModel[];
+ isVisible? : boolean;
+ value? : any;
+ originalValue?: any;
+ minLength?: number;
+ maxLength?: number;
+ onChange? : Function;
+ onBlur? : Function;
+ preventionsAttribute : AttributeMap[] = [];
+ waitFor? : Subject<string>[] = [];
+ hasErrors : () => string[];
+
+
+ constructor(data: any){
+ this.type = data.type;
+ this.displayName = data.displayName;
+ this.dataTestId = data.dataTestId;
+ this.placeHolder = data.placeHolder;
+ this.tooltip = data.tooltip;
+ this.isDisabled = data.isDisabled || false;
+ this.validations = data.validations || [];
+ this.isVisible = !_.isNil(data.isVisible) ? data.isVisible : true;
+ this.value = data.value;
+ this.originalValue = data.value;
+ this.controlName = data.controlName;
+ this.minLength = data.minLength;
+ this.maxLength = data.maxLength;
+ this.preventionsAttribute = data.preventionsAttribute || [];
+ this.onBlur = function(){};
+ this.onChange = data.onChange ? data.onChange: function () {}
+ }
+
+ isRequired() : boolean {
+ for(let validtorsModel of this.validations){
+ let required = 'required';
+ if(validtorsModel.validatorName.toString() === required){
+ return true;
+ }
+ }
+ return false;
+ }
+
+ getPreventionAttribute() : AttributeMap[] {
+ let result : AttributeMap[] = [new AttributeMap('data-tests-id', this.dataTestId)];
+ return this.preventionsAttribute.concat(result);
+ }
+}
+
+
+
+export class ValidatorModel {
+ validator : ValidatorFn;
+ validatorArg? : any;
+ validatorName : ValidatorOptions | CustomValidatorOptions;
+ errorMsg : string;
+
+ constructor(validatorName : ValidatorOptions | CustomValidatorOptions, errorMsg : string, validatorArg: any = null){
+ this.validatorName = validatorName;
+ this.validator = this.setValidator(validatorName, validatorArg);
+ this.errorMsg = errorMsg;
+ this.validatorArg = validatorArg;
+ }
+
+
+ setValidator(validatorName : ValidatorOptions | CustomValidatorOptions, validatorArg: any = null) : ValidatorFn {
+ if(validatorName in ValidatorOptions){
+ return validatorArg ? Validators[validatorName](validatorArg) : Validators[validatorName];
+ }else {
+ return validatorArg ? CustomValidators[CustomValidatorOptions[validatorName]].apply(this, validatorArg) : CustomValidators[CustomValidatorOptions[validatorName]];
+ }
+ }
+}
+
+
+
+export enum ValidatorOptions {
+ required = 'required',
+ minLength = 'minLength',
+ maxLength = 'maxLength',
+ pattern = 'pattern',
+ nullValidator = 'nullValidator'
+}
+
+
+
+export enum CustomValidatorOptions {
+ uniqueInstanceNameValidator = 'uniqueInstanceNameValidator',
+ emptyDropdownOptions = 'emptyDropdownOptions',
+ isValidJson = 'isValidJson',
+ isFileTooBig = 'isFileTooBig',
+ isStringContainTags = 'isStringContainTags'
+}
+
+export class AttributeMap {
+ key : string;
+ value : string;
+
+ constructor(key : string, value? : string){
+ this.key = key;
+ this.value = value ? value : '';
+ }
+}
+
+
+
+
diff --git a/vid-webpack-master/src/app/shared/models/formControlModels/formControlTypes.enum.ts b/vid-webpack-master/src/app/shared/models/formControlModels/formControlTypes.enum.ts
new file mode 100644
index 000000000..eba1b0894
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/models/formControlModels/formControlTypes.enum.ts
@@ -0,0 +1,8 @@
+export enum FormControlType{
+ MULTI_SELECT = 'MULTI_SELECT',
+ FILE = 'FILE',
+ NUMBER = 'NUMBER',
+ INPUT = 'INPUT',
+ DROPDOWN = 'DROPDOWN',
+ CHECKBOX = 'CHECKBOX'
+}
diff --git a/vid-webpack-master/src/app/shared/models/formControlModels/formPopupDetails.model.ts b/vid-webpack-master/src/app/shared/models/formControlModels/formPopupDetails.model.ts
new file mode 100644
index 000000000..8ea3d2d0b
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/models/formControlModels/formPopupDetails.model.ts
@@ -0,0 +1,55 @@
+import {FormControlModel} from "./formControl.model";
+import {ModelInformationItem} from "../../components/model-information/model-information.component";
+import {FormGroup} from "@angular/forms";
+
+export class FormPopupDetails {
+ popupTypeName: PopupType;
+ that : any;
+ UUIDData : Object = {}; // TODO uuid tree
+ title: string;
+ leftSubTitle: string;
+ rightSubTitle: string;
+ formControlList: FormControlModel[];
+ dynamicInputsControlList: FormControlModel[];
+ modelInformationItems: ModelInformationItem[];
+ onSubmit : (that : any, form: FormGroup , ...args) => void;
+ onCancel : (that : any, form: FormGroup) => void;
+
+ constructor(that : any,
+ popupTypeName : PopupType ,
+ UUIDData : Object,
+ title : string,
+ leftSubTitle : string,
+ rightSubTitle : string,
+ formControlList : FormControlModel[],
+ dynamicInputsControlList : FormControlModel[],
+ modelInformationItems : ModelInformationItem[],
+ onSubmit : (that : any, form : FormGroup, ...args) => void,
+ onCancel : (that : any, form : FormGroup) => void){
+ this.title = title;
+ this.leftSubTitle = leftSubTitle;
+ this.rightSubTitle = rightSubTitle;
+ this.formControlList = formControlList;
+ this.dynamicInputsControlList = dynamicInputsControlList;
+ this.modelInformationItems = modelInformationItems;
+ this.onSubmit = onSubmit;
+ this.onCancel = onCancel;
+ this.popupTypeName = popupTypeName;
+ this.UUIDData = UUIDData;
+ this.that = that;
+ }
+}
+
+
+
+export enum PopupType {
+ SERVICE_MACRO = 'service macro',
+ SERVICE_A_LA_CART = 'service a-la-cart',
+ SERVICE = 'service',
+ VNF_MACRO ='vnf macro',
+ VNF_A_LA_CARTE = 'vnf a-la-carte',
+ VFMODULE = 'vfModule',
+ NETWORK_MACRO = 'network_macro',
+ VNF_GROUP = 'vnfGroup'
+}
+
diff --git a/vid-webpack-master/src/app/shared/models/formControlModels/inputFormControl.model.ts b/vid-webpack-master/src/app/shared/models/formControlModels/inputFormControl.model.ts
new file mode 100644
index 000000000..99210af7a
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/models/formControlModels/inputFormControl.model.ts
@@ -0,0 +1,19 @@
+import {FormControlModel} from "./formControl.model";
+import {FormControlType} from "./formControlTypes.enum";
+
+export class InputFormControl extends FormControlModel {
+ onBlur ?: Function;
+ onKeypress?: Function;
+ inputType: string = 'text';
+ pattern: string;
+ preventions: string[];
+
+ constructor(data) {
+ super(data);
+ this.type = FormControlType.INPUT;
+ this.pattern = data.pattern;
+ this.onKeypress = data.onKeypress ? data.onKeypress : ()=>{}
+ this.onBlur = data.onBlur ? data.onBlur : ()=>{}
+ }
+}
+
diff --git a/vid-webpack-master/src/app/shared/models/formControlModels/multiselectFormControl.model.ts b/vid-webpack-master/src/app/shared/models/formControlModels/multiselectFormControl.model.ts
new file mode 100644
index 000000000..b13745104
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/models/formControlModels/multiselectFormControl.model.ts
@@ -0,0 +1,27 @@
+import {FormControlModel} from "./formControl.model";
+import {Observable} from "rxjs";
+import {FormGroup} from "@angular/forms";
+import {FormControlType} from "./formControlTypes.enum";
+
+export class MultiselectFormControl extends FormControlModel{
+ options$ : Observable<any[]>;
+ args : string[];
+ onInit: (data : MultiselectFormControl, form: FormGroup) => Observable<any>;
+ selectedItems : string;
+ onInitSelectedItems : string[];
+ ngValue : string;
+ settings: {};
+
+
+ constructor(data) {
+ super(data);
+ this.type = FormControlType.MULTI_SELECT;
+ this.options$ = data.options;
+ this.onInit = data.onInit;
+ this.selectedItems = data.selectedItems;
+ this.onInitSelectedItems = data.onInitSelectedItems ? data.onInitSelectedItems : null;
+ this.ngValue = data.selectedField ? data.selectedField : 'id';
+ this.settings = data.settings || {};
+ }
+
+}
diff --git a/vid-webpack-master/src/app/shared/models/formControlModels/numberFormControl.model.ts b/vid-webpack-master/src/app/shared/models/formControlModels/numberFormControl.model.ts
new file mode 100644
index 000000000..5de38e2f7
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/models/formControlModels/numberFormControl.model.ts
@@ -0,0 +1,16 @@
+import {FormControlModel} from "./formControl.model";
+import {FormControlType} from "./formControlTypes.enum";
+
+export class NumberFormControl extends FormControlModel{
+ min: number;
+ max: number;
+
+
+ constructor(data) {
+ super(data);
+ this.type = FormControlType.NUMBER;
+ this.min = data.min;
+ this.max = data.max;
+ }
+
+}
diff --git a/vid-webpack-master/src/app/shared/models/inputTypes.ts b/vid-webpack-master/src/app/shared/models/inputTypes.ts
index 1f7222f52..542c13b44 100644
--- a/vid-webpack-master/src/app/shared/models/inputTypes.ts
+++ b/vid-webpack-master/src/app/shared/models/inputTypes.ts
@@ -1,11 +1,11 @@
export enum InputType {
- LCP_REGION = "LCP_REGION",
- TENANT = "TENANT",
- LOB = "LOB",
- PLATFORM = "PLATFORM",
- ROLLBACK = "ROLLBACK",
- PRODUCT_FAMILY = "PRODUCT_FAMILY",
- VG = "VG"
+ LCP_REGION = "lcpCloudRegionId",
+ TENANT = "tenantId",
+ LOB = "lineOfBusiness",
+ PLATFORM = "platformName",
+ ROLLBACK = "rollbackOnFailure",
+ PRODUCT_FAMILY = "productFamilyId",
+ VG = "volumeGroupName"
}
diff --git a/vid-webpack-master/src/app/shared/models/lcpRegion.ts b/vid-webpack-master/src/app/shared/models/lcpRegion.ts
index e39321d58..fe82a3eea 100644
--- a/vid-webpack-master/src/app/shared/models/lcpRegion.ts
+++ b/vid-webpack-master/src/app/shared/models/lcpRegion.ts
@@ -2,10 +2,12 @@ export class LcpRegion {
id: string;
name: string;
isPermitted: boolean;
+ cloudOwner: string;
- constructor(serviceJson){
- this.id = serviceJson["cloudRegionID"];
- this.name = serviceJson["cloudRegionID"];
- this.isPermitted = serviceJson["is-permitted"];
+ constructor(id: string, name: string, isPermitted: boolean, cloudOwner: string) {
+ this.id = id;
+ this.name = name;
+ this.isPermitted = isPermitted;
+ this.cloudOwner = cloudOwner;
}
}
diff --git a/vid-webpack-master/src/app/shared/models/level1Instance.ts b/vid-webpack-master/src/app/shared/models/level1Instance.ts
new file mode 100644
index 000000000..b7925b8bd
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/models/level1Instance.ts
@@ -0,0 +1,24 @@
+import {ChildNodeInstance} from "./nodeInstance";
+import {DefaultDataGeneratorService} from "../services/defaultDataServiceGenerator/default.data.generator.service";
+
+export class Level1Instance extends ChildNodeInstance{
+ uuid : string;
+ isEcompGeneratedNaming: boolean;
+ productFamilyId: string;
+ lcpCloudRegionId: string;
+ legacyRegion: string;
+ tenantId: string;
+ platformName: string;
+ lineOfBusiness: string;
+ rollbackOnFailure: string;
+ originalName: string;
+
+ constructor() {
+ super();
+ this.rollbackOnFailure = 'true';
+ this.originalName = null;
+ this.isMissingData= false;
+ this.trackById = DefaultDataGeneratorService.createRandomTrackById();
+ this.inMaint= false;
+ }
+}
diff --git a/vid-webpack-master/src/app/shared/models/modelInfo.ts b/vid-webpack-master/src/app/shared/models/modelInfo.ts
index 091c02ef1..eb599cbe1 100644
--- a/vid-webpack-master/src/app/shared/models/modelInfo.ts
+++ b/vid-webpack-master/src/app/shared/models/modelInfo.ts
@@ -1,11 +1,13 @@
export class ModelInfo {
- modelInvariantId: string;
- modelVersionId: string;
+ modelInvariantId?: string;
+ modelVersionId?: string;
modelName: string;
modelVersion: string;
- modelCustomizationId: string;
- modelCustomizationName: string;
+ modelCustomizationId?: string;
+ modelCustomizationName?: string;
+ uuid? : string;
+ modelUniqueId?: String;
@@ -16,6 +18,8 @@ export class ModelInfo {
this.modelVersion = instanceModel.version;
this.modelCustomizationId = instanceModel.customizationUuid;
this.modelCustomizationName = instanceModel.modelCustomizationName;
+ this.uuid = instanceModel.uuid;
+ this.modelUniqueId = this.modelCustomizationId||this.uuid;
}
}
diff --git a/vid-webpack-master/src/app/shared/models/networkInstance.ts b/vid-webpack-master/src/app/shared/models/networkInstance.ts
new file mode 100644
index 000000000..ded95a787
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/models/networkInstance.ts
@@ -0,0 +1,14 @@
+
+
+import {Level1Instance} from "./level1Instance";
+
+export class NetworkInstance extends Level1Instance{
+ networkStoreKey : string;
+ isFailed: boolean;
+ statusMessage?: string;
+
+ constructor() {
+ super();
+ this.networkStoreKey = null;
+ }
+}
diff --git a/vid-webpack-master/src/app/shared/models/networkModel.ts b/vid-webpack-master/src/app/shared/models/networkModel.ts
new file mode 100644
index 000000000..03f118eb7
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/models/networkModel.ts
@@ -0,0 +1,32 @@
+import {
+ Level1Model, Level1ModelProperties,
+ Level1ModelResponseInterface
+} from "./nodeModel";
+import {VfcInstanceGroupMap} from "./vfcInstanceGroupMap";
+
+
+export interface NetworkProperties extends Level1ModelProperties{
+ ecomp_generated_naming: string;
+ network_role: string;
+}
+
+export interface NetworkModelResponseInterface extends Level1ModelResponseInterface{
+ properties: NetworkProperties;
+}
+
+export class NetworkModel extends Level1Model{
+
+ roles: string[] = [];
+ properties: NetworkProperties;
+
+ constructor(networkJson?: NetworkModelResponseInterface){
+ super(networkJson);
+ if(networkJson && networkJson.properties){
+ this.properties = networkJson.properties;
+ // expecting network_role to be a comma-saparated list
+ this.roles = networkJson.properties.network_role ? networkJson.properties.network_role.split(',') : [];
+ }
+ }
+
+
+}
diff --git a/vid-webpack-master/src/app/shared/models/networkTreeNode.ts b/vid-webpack-master/src/app/shared/models/networkTreeNode.ts
new file mode 100644
index 000000000..d09d5e4c5
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/models/networkTreeNode.ts
@@ -0,0 +1,23 @@
+import {NetworkInstance} from "./networkInstance";
+import {TreeNodeModel} from "./treeNodeModel";
+import {Level1Model} from "./nodeModel";
+
+
+
+export class NetworkTreeNode extends TreeNodeModel {
+ networkStoreKey : string;
+ typeName: string;
+ menuActions: { [p: string]: { method: Function; visible: Function; enable: Function } };
+ isFailed: boolean;
+ statusMessage?: string;
+
+ constructor(instance: NetworkInstance, networkModel: Level1Model, networkStoreKey : string){
+ super(instance, networkModel);
+ this.name = instance.instanceName? instance.instanceName: !networkModel.isEcompGeneratedNaming ? networkModel.modelCustomizationName : '&lt;Automatically Assigned&gt;';
+ this.modelName = networkModel.modelCustomizationName;
+ this.type = networkModel.type;
+ this.isEcompGeneratedNaming = networkModel.isEcompGeneratedNaming;
+ this.networkStoreKey = networkStoreKey;
+ }
+}
+
diff --git a/vid-webpack-master/src/app/shared/models/nodeInstance.ts b/vid-webpack-master/src/app/shared/models/nodeInstance.ts
new file mode 100644
index 000000000..7656a0c2e
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/models/nodeInstance.ts
@@ -0,0 +1,21 @@
+import {ServiceInstanceActions} from "./serviceInstanceActions";
+import {ModelInfo} from "./modelInfo";
+
+export class NodeInstance {
+ instanceName: string;
+ orchStatus?:string;
+ action: ServiceInstanceActions = ServiceInstanceActions.Create;
+ originalAction : ServiceInstanceActions;
+ modelInfo?: ModelInfo;
+ instanceId?: string;
+ trackById?: string;
+}
+export class ChildNodeInstance extends NodeInstance {
+ isMissingData: boolean;
+ provStatus?:string;
+ inMaint?:boolean;
+ constructor() {
+ super();
+ this.inMaint = false;
+ }
+}
diff --git a/vid-webpack-master/src/app/shared/models/nodeModel.ts b/vid-webpack-master/src/app/shared/models/nodeModel.ts
index 4b22b8d91..ee57ec038 100644
--- a/vid-webpack-master/src/app/shared/models/nodeModel.ts
+++ b/vid-webpack-master/src/app/shared/models/nodeModel.ts
@@ -1,12 +1,27 @@
+import {VfcInstanceGroupMap} from "./vfcInstanceGroupMap";
+
export interface NodeModelResponseInterface {
+ customizationUuid: string;
name: string;
version: string;
description: string;
category: string;
uuid: string;
invariantUuid: string;
+ max: number;
+ min:number;
+}
+export interface Level1ModelResponseInterface extends NodeModelResponseInterface{
+ serviceType: string;
+ serviceRole: string;
+ subCategory: string;
+ customizationUuid: string;
+ serviceEcompNaming: boolean;
+ type: string;
+ modelCustomizationName: string;
+ vfcInstanceGroups: VfcInstanceGroupMap;
+ properties: Level1ModelProperties;
}
-
export class NodeModel {
name: string;
version: string;
@@ -14,16 +29,65 @@ export class NodeModel {
category: string;
uuid: string;
invariantUuid: string;
+ max: number;
+ min: number;
+ customizationUuid?: string;
constructor(serviceJson?: NodeModelResponseInterface) {
if (serviceJson) {
+ this.customizationUuid = serviceJson.customizationUuid;
this.name = serviceJson.name;
this.version = serviceJson.version;
this.description = serviceJson.description;
this.category = serviceJson.category;
this.uuid = serviceJson.uuid;
this.invariantUuid = serviceJson.invariantUuid;
+ this.max = serviceJson.max;
+ this.min = serviceJson.min;
}
}
}
+export class Level1ModelProperties {
+ max_instances : number;
+ min_instances : number;
+}
+
+
+
+export class Level1Model extends NodeModel{
+ serviceType: string;
+ serviceRole: string;
+ subCategory: string;
+ customizationUuid: string;
+ serviceEcompNaming: boolean;
+ type: string;
+ modelCustomizationName: string;
+ vfcInstanceGroups: VfcInstanceGroupMap;
+ isEcompGeneratedNaming: boolean;
+ constructor(nodeJson?: Level1ModelResponseInterface) {
+ super(nodeJson);
+ if (nodeJson) {
+ this.serviceType = nodeJson.serviceType;
+ this.serviceRole = nodeJson.serviceRole;
+ this.subCategory = nodeJson.subCategory;
+ this.customizationUuid = nodeJson.customizationUuid;
+ this.isEcompGeneratedNaming = this.getIsEcompGeneratedNaming(nodeJson);
+ this.type = nodeJson.type;
+ this.modelCustomizationName = nodeJson.modelCustomizationName;
+ this.vfcInstanceGroups = nodeJson.vfcInstanceGroups;
+ this.max = 1;
+ this.min = 0;
+ if (nodeJson.properties) {
+ this.min = nodeJson.properties.min_instances || 0;
+ this.max = nodeJson.properties.max_instances || 1;
+ }
+
+
+ }
+ }
+ private getIsEcompGeneratedNaming(vnfJson) {
+ const ecompGeneratedNaming = vnfJson.properties.ecomp_generated_naming;
+ return ecompGeneratedNaming === "true";
+ };
+}
diff --git a/vid-webpack-master/src/app/shared/models/productFamily.ts b/vid-webpack-master/src/app/shared/models/productFamily.ts
index 3c55ac004..1ed2579b2 100644
--- a/vid-webpack-master/src/app/shared/models/productFamily.ts
+++ b/vid-webpack-master/src/app/shared/models/productFamily.ts
@@ -1,4 +1,4 @@
-import {ServiceResponseInterface} from "../../services/aaiService/responseInterfaces/getServicesResponseInterface";
+import {ServiceResponseInterface} from "../services/aaiService/responseInterfaces/getServicesResponseInterface";
export class ProductFamily {
id: string;
diff --git a/vid-webpack-master/src/app/shared/models/serviceInstance.ts b/vid-webpack-master/src/app/shared/models/serviceInstance.ts
index a952430b0..38b4ac35d 100644
--- a/vid-webpack-master/src/app/shared/models/serviceInstance.ts
+++ b/vid-webpack-master/src/app/shared/models/serviceInstance.ts
@@ -1,8 +1,11 @@
import {VnfInstance} from "./vnfInstance";
+import {NetworkInstance} from "./networkInstance";
+import {NodeInstance} from "./nodeInstance";
+import {VnfGroupInstance} from "./vnfGroupInstance";
+import {VnfMember} from "./VnfMember";
-export class ServiceInstance {
- instanceName: string;
- isUserProvidedNaming: boolean;
+export class ServiceInstance extends NodeInstance{
+ isEcompGeneratedNaming: boolean;
globalSubscriberId: string;
productFamilyId: string;
subscriptionServiceType: string;
@@ -16,13 +19,37 @@ export class ServiceInstance {
owningEntityName: string;
pause: boolean;
bulkSize: number;
- vnfs: { [vnf_module_model_name: string] : VnfInstance; };
- instanceParams: { [key: string] : string; };
- rollbackOnFailure : boolean;
- subscriberName : string;
+ vnfs: { [vnf_module_model_name: string]: VnfInstance; };
+ vnfGroups : {[vnf_module_model_name: string]: VnfGroupInstance; };
+ networks: { [vnf_module_model_name: string]: NetworkInstance; };
+ isDirty : boolean;
+ instanceParams: {[key: string]: string}[];
+ rollbackOnFailure: boolean;
+ subscriberName: string;
+ validationCounter: number;
+ existingNames: {[key: string] : any};
+ modelInavariantId?: string;
+ existingVNFCounterMap : { [vnf_module_model_name: string]: number; };
+ existingVnfGroupCounterMap : { [vnf_group_module_model_name: string]: number; };
+ existingNetworksCounterMap : { [network_module_model_name: string]: number; };
+ optionalGroupMembersMap?: { [path: string]: VnfMember[]; };
+ isFailed: boolean;
+ statusMessage: string;
constructor() {
+ super();
+ this.isDirty = false;
this.vnfs = {};
- this.instanceParams = {};
+ this.instanceParams = [];
+ this.validationCounter = 0;
+ this.existingNames = {};
+ this.existingVNFCounterMap = {};
+ this.existingVnfGroupCounterMap = {};
+ this.existingNetworksCounterMap = {};
+ this.optionalGroupMembersMap = {};
+ this.networks = {};
+ this.vnfGroups = {};
+ this.bulkSize = 1;
}
+
}
diff --git a/vid-webpack-master/src/app/shared/models/serviceInstanceActions.ts b/vid-webpack-master/src/app/shared/models/serviceInstanceActions.ts
new file mode 100644
index 000000000..783f133b0
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/models/serviceInstanceActions.ts
@@ -0,0 +1,24 @@
+export enum ServiceInstanceActions{
+ Delete = "Delete",
+ Update="Update",
+ Create="Create",
+ None="None",
+ Update_Delete = 'Update_Delete',
+ None_Delete = 'None_Delete'
+}
+export enum ServiceAction {
+ INSTANTIATE = 'INSTANTIATE',
+ DELETE = 'DELETE',
+ UPDATE = 'UPDATE'
+}
+export enum JobStatus {
+ COMPLETED = 'COMPLETED',
+ FAILED = 'FAILED',
+ IN_PROGRESS = 'IN_PROGRESS',
+ RESOURCE_IN_PROGRESS = 'RESOURCE_IN_PROGRESS',
+ PAUSE = 'PAUSE',
+ PENDING = 'PENDING',
+ STOPPED = 'STOPPED',
+ COMPLETED_WITH_ERRORS = 'COMPLETED_WITH_ERRORS',
+ CREATING = 'CREATING'
+}
diff --git a/vid-webpack-master/src/app/shared/models/serviceModel.ts b/vid-webpack-master/src/app/shared/models/serviceModel.ts
index 18d8582e8..21a34cc95 100644
--- a/vid-webpack-master/src/app/shared/models/serviceModel.ts
+++ b/vid-webpack-master/src/app/shared/models/serviceModel.ts
@@ -7,6 +7,7 @@ export interface ServiceModelResponseInterface extends NodeModelResponseInterfac
serviceType: string;
serviceRole: string;
serviceEcompNaming: boolean;
+ vidNotions: any;
}
export class ServiceModel extends NodeModel{
@@ -14,8 +15,9 @@ export class ServiceModel extends NodeModel{
serviceType: string;
serviceRole: string;
servicesQty: number;
- isUserProvidedNaming: boolean;
+ isEcompGeneratedNaming: boolean;
isMultiStepDesign: boolean;
+ vidNotions?: any;
constructor(serviceModelJson?: any){
super(serviceModelJson.service);
@@ -23,13 +25,14 @@ export class ServiceModel extends NodeModel{
const service: ServiceModelResponseInterface = serviceModelJson.service;
this.serviceType = service.serviceType;
this.serviceRole = service.serviceRole;
- this.isUserProvidedNaming = this.getIsUserProvidedName(service);
+ this.vidNotions= service.vidNotions;
+ this.isEcompGeneratedNaming = this.getServiceEcompNaming(service);
this.isMultiStepDesign = this.getIsMultiStepDesign(serviceModelJson);
}
}
- private getIsUserProvidedName(serviceJson): boolean {
- return serviceJson.serviceEcompNaming !== undefined && serviceJson.serviceEcompNaming === "false";
+ private getServiceEcompNaming(serviceJson): boolean {
+ return serviceJson.serviceEcompNaming === "true";
};
private getIsMultiStepDesign(serviceModel): boolean {
diff --git a/vid-webpack-master/src/app/shared/models/serviceProxyModel.ts b/vid-webpack-master/src/app/shared/models/serviceProxyModel.ts
new file mode 100644
index 000000000..31810ca72
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/models/serviceProxyModel.ts
@@ -0,0 +1,22 @@
+
+import {NodeModel, NodeModelResponseInterface} from "./nodeModel";
+
+export interface ServiceProxyModelResponseInterface extends NodeModelResponseInterface{
+ sourceModelUuid: string;
+ sourceModelInvariant: string;
+ sourceModelName: string;
+}
+export class ServiceProxyModel extends NodeModel {
+ sourceModelUuid: string;
+ sourceModelInvariant: string;
+ sourceModelName: string;
+
+ constructor(serviceProxyJson?: ServiceProxyModelResponseInterface) {
+ if (serviceProxyJson) {
+ super(serviceProxyJson);
+ this.sourceModelUuid = serviceProxyJson.sourceModelUuid;
+ this.sourceModelInvariant = serviceProxyJson.sourceModelInvariant;
+ this.sourceModelName = serviceProxyJson.sourceModelName;
+ }
+ }
+}
diff --git a/vid-webpack-master/src/app/shared/models/tenant.ts b/vid-webpack-master/src/app/shared/models/tenant.ts
index 234f1dbff..26ff69df5 100644
--- a/vid-webpack-master/src/app/shared/models/tenant.ts
+++ b/vid-webpack-master/src/app/shared/models/tenant.ts
@@ -2,10 +2,12 @@ export class Tenant {
id: string;
name: string;
isPermitted: boolean;
+ cloudOwner: string;
constructor(serviceJson){
this.id = serviceJson["tenantID"];
this.name = serviceJson["tenantName"];
this.isPermitted = serviceJson["is-permitted"];
+ this.cloudOwner = serviceJson["cloudOwner"];
}
}
diff --git a/vid-webpack-master/src/app/shared/models/treeNodeModel.ts b/vid-webpack-master/src/app/shared/models/treeNodeModel.ts
new file mode 100644
index 000000000..2be8b804a
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/models/treeNodeModel.ts
@@ -0,0 +1,53 @@
+import {ChildNodeInstance} from "./nodeInstance";
+import {NodeModel} from "./nodeModel";
+import {ServiceNodeTypes} from "./ServiceNodeTypes";
+import * as _ from 'lodash';
+import {ServiceInstanceActions} from "./serviceInstanceActions";
+export enum TreeLevel {
+ Level_0 , Level_1, Level_2
+
+}
+interface TreeNodeInstanceInterface {
+ treeLevel: TreeLevel;
+ getModel(): NodeModel;
+ convertToTreeNode(node: any): any;
+ type: ServiceNodeTypes;
+}
+export class TreeNodeModel {
+ type: String;
+ modelId: string;
+ modelCustomizationId?: string;
+ modelUniqueId?: string;
+ id: string;
+ name: string;
+ modelName: string;
+ missingData: boolean;
+ isEcompGeneratedNaming: boolean;
+ orchStatus?:string;
+ provStatus?:string;
+ inMaint?:boolean;
+ action : string ;
+
+ constructor(instance: ChildNodeInstance, nodeModel: NodeModel){
+ this.modelCustomizationId = nodeModel.customizationUuid;
+ this.modelId = nodeModel.uuid;
+ this.modelUniqueId = this.modelCustomizationId || this.modelId;
+ this.missingData = false;
+ this.id = instance.trackById;
+ this.action = !_.isNil(instance.action) ? instance.action : ServiceInstanceActions.Create;
+
+ if(!_.isNil(instance.orchStatus)){
+ this.orchStatus= instance.orchStatus;
+ }
+
+ if(!_.isNil(instance.provStatus)){
+ this.provStatus= instance.provStatus;
+ }
+
+ if(!_.isNil(instance.inMaint)){
+ this.inMaint= instance.inMaint;
+ }
+
+
+ }
+}
diff --git a/vid-webpack-master/src/app/shared/models/vfModule.ts b/vid-webpack-master/src/app/shared/models/vfModule.ts
index 21f43ed17..c75202124 100644
--- a/vid-webpack-master/src/app/shared/models/vfModule.ts
+++ b/vid-webpack-master/src/app/shared/models/vfModule.ts
@@ -1,7 +1,7 @@
import {NodeModel, NodeModelResponseInterface} from "./nodeModel";
-export interface properties{
+export interface Properties{
initialCount: number;
maxCountInstances: number;
minCountInstances: number;
@@ -10,24 +10,25 @@ export interface properties{
export interface VFModuleResponseInterface extends NodeModelResponseInterface {
customizationUuid: string;
modelCustomizationName: string;
- properties: properties
+ volumeGroupAllowed : boolean;
+ properties: Properties
}
export class VfModule extends NodeModel {
- min:number;
- max:number;
vgName:string;
rollbackOnFailure:boolean;
initial:number;
customizationUuid: string;
modelCustomizationName: string;
+ volumeGroupAllowed : boolean;
constructor(vf?: VFModuleResponseInterface) {
super(vf);
if(vf){
this.customizationUuid = vf.customizationUuid;
this.modelCustomizationName = vf.modelCustomizationName;
+ this.volumeGroupAllowed = vf.volumeGroupAllowed || false;
}
if (vf && vf.properties) {
this.min = vf.properties.minCountInstances;
diff --git a/vid-webpack-master/src/app/shared/models/vfModuleInstance.ts b/vid-webpack-master/src/app/shared/models/vfModuleInstance.ts
index c6db00025..71140d44b 100644
--- a/vid-webpack-master/src/app/shared/models/vfModuleInstance.ts
+++ b/vid-webpack-master/src/app/shared/models/vfModuleInstance.ts
@@ -1,5 +1,14 @@
-export class VfModuleInstance {
- instanceName: string;
+import {ChildNodeInstance} from "./nodeInstance";
+
+export class VfModuleInstance extends ChildNodeInstance{
volumeGroupName: string;
instanceParams: { [key: string] : string; };
+ isFailed: boolean;
+ position: any;
+ statusMessage?: string;
+
+ constructor() {
+ super();
+ this.instanceParams = {};
+ }
}
diff --git a/vid-webpack-master/src/app/shared/models/vfModuleTreeNode.ts b/vid-webpack-master/src/app/shared/models/vfModuleTreeNode.ts
index d4cc7e9c7..e3d1b79b0 100644
--- a/vid-webpack-master/src/app/shared/models/vfModuleTreeNode.ts
+++ b/vid-webpack-master/src/app/shared/models/vfModuleTreeNode.ts
@@ -1,17 +1,23 @@
import {VfModule} from "./vfModule";
import {VfModuleInstance} from "./vfModuleInstance";
import {ServiceNodeTypes} from "./ServiceNodeTypes";
+import {TreeLevel, TreeNodeModel} from "./treeNodeModel";
-export class VfModuleTreeNode {
- modelId: string;
- name: string;
- modelName: string;
- type: string;
+export class VfModuleTreeNode extends TreeNodeModel{
+ dynamicInputs: any;
+ dynamicModelName : string;
+ typeName: string;
+ menuActions: { [p: string]: { method: Function; visible: Function; enable: Function } };
+ isFailed: boolean;
+ statusMessage?: string;
- constructor(vfModuleInstance: VfModuleInstance, vfModuleModel: VfModule, vfModuleModelName: string){
- this.name = vfModuleInstance.instanceName || vfModuleInstance.volumeGroupName || '<Automatically Assigned>';
- this.modelId = vfModuleModel.uuid;
+ constructor(vfModuleInstance: VfModuleInstance, vfModuleModel: VfModule, vfModuleModelName: string, dynamicInputs: any, isEcompGeneratedNaming: boolean, dynamicModelName : string){
+ super(vfModuleInstance,vfModuleModel);
+ this.name = vfModuleInstance.instanceName || vfModuleInstance.volumeGroupName || '&lt;Automatically Assigned&gt;';
this.modelName = vfModuleModelName;
this.type = ServiceNodeTypes.VFmodule;
+ this.isEcompGeneratedNaming = isEcompGeneratedNaming;
+ this.dynamicInputs = dynamicInputs;
+ this.dynamicModelName = dynamicModelName;
}
}
diff --git a/vid-webpack-master/src/app/shared/models/vnfGroupInstance.ts b/vid-webpack-master/src/app/shared/models/vnfGroupInstance.ts
new file mode 100644
index 000000000..22ca44492
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/models/vnfGroupInstance.ts
@@ -0,0 +1,13 @@
+import {Level1Instance} from "./level1Instance";
+import {VnfMember} from "./VnfMember";
+import {NetworkInstance} from "./networkInstance";
+
+export class VnfGroupInstance extends Level1Instance{
+ vnfGroupStoreKey : string;
+ vnfs: { [vnf_module_model_name: string]: VnfMember; };
+ constructor() {
+ super();
+ this.vnfGroupStoreKey = null;
+ this.vnfs ={};
+ }
+}
diff --git a/vid-webpack-master/src/app/shared/models/vnfGroupModel.ts b/vid-webpack-master/src/app/shared/models/vnfGroupModel.ts
new file mode 100644
index 000000000..5cff86cf0
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/models/vnfGroupModel.ts
@@ -0,0 +1,32 @@
+import {
+ Level1Model,
+ Level1ModelProperties,
+ Level1ModelResponseInterface
+} from "./nodeModel";
+import {ServiceProxyModel} from "./serviceProxyModel";
+
+
+export interface VnfGroupProperties extends Level1ModelProperties{
+ ecomp_generated_naming: string;
+ role?: string;
+ type?: string;
+ quantity?: number;
+}
+
+export interface VnfGroupModelResponseInterface extends Level1ModelResponseInterface{
+ properties: VnfGroupProperties;
+ members: {[key: string]: ServiceProxyModel};
+}
+
+export class VnfGroupModel extends Level1Model{
+ properties: VnfGroupProperties;
+ members: {[key: string]: ServiceProxyModel};
+
+ constructor(vnfGoupJson?: VnfGroupModelResponseInterface) {
+ super(vnfGoupJson);
+ if (vnfGoupJson) {
+ this.properties = vnfGoupJson.properties;
+ this.members = vnfGoupJson.members;
+ }
+ }
+}
diff --git a/vid-webpack-master/src/app/shared/models/vnfGroupTreeNode.ts b/vid-webpack-master/src/app/shared/models/vnfGroupTreeNode.ts
new file mode 100644
index 000000000..0e71f47b8
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/models/vnfGroupTreeNode.ts
@@ -0,0 +1,12 @@
+import {NetworkTreeNode} from "./networkTreeNode";
+import {NetworkInstance} from "./networkInstance";
+import {Level1Model} from "./nodeModel";
+
+export class VnfGroupTreeNode extends NetworkTreeNode{
+ vnfGroupStoreKey : string;
+ limitMembers: number;
+ constructor(instance: NetworkInstance, vnfGroupModel: Level1Model, vnfGroupStoreKey : string){
+ super(instance, vnfGroupModel, vnfGroupStoreKey);
+ this.vnfGroupStoreKey = vnfGroupStoreKey;
+ }
+}
diff --git a/vid-webpack-master/src/app/shared/models/vnfInstance.ts b/vid-webpack-master/src/app/shared/models/vnfInstance.ts
index 7f41e483a..8959cc5c3 100644
--- a/vid-webpack-master/src/app/shared/models/vnfInstance.ts
+++ b/vid-webpack-master/src/app/shared/models/vnfInstance.ts
@@ -1,19 +1,18 @@
import {VfModuleMap} from "./vfModulesMap";
+import {Level1Instance} from "./level1Instance";
+
+
+export class VnfInstance extends Level1Instance {
-export class VnfInstance {
- instanceName: string;
- isUserProvidedNaming: boolean;
- productFamilyId: string;
- lcpCloudRegionId: string;
- legacyRegion: string;
- tenantId: string;
- platformName: string;
- lineOfBusiness: string;
- rollbackOnFailure: string;
vfModules: { [vf_module_model_name: string] : VfModuleMap; };
+ vnfStoreKey : string;
+ isFailed: boolean;
+ position: number;
+ statusMessage?: string;
constructor() {
- this.rollbackOnFailure = 'true';
+ super();
this.vfModules = {};
+ this.vnfStoreKey = null;
}
}
diff --git a/vid-webpack-master/src/app/shared/models/vnfModel.ts b/vid-webpack-master/src/app/shared/models/vnfModel.ts
index e1302f1d0..8389606b6 100644
--- a/vid-webpack-master/src/app/shared/models/vnfModel.ts
+++ b/vid-webpack-master/src/app/shared/models/vnfModel.ts
@@ -1,52 +1,27 @@
-import {NodeModel, NodeModelResponseInterface} from "./nodeModel";
-import {VfcInstanceGroupMap} from "./vfcInstanceGroupMap";
+import {
+ Level1Model,
+ Level1ModelProperties,
+ Level1ModelResponseInterface
+} from "./nodeModel";
-export interface VnfProperties {
- ecomp_generated_naming: string
-}
-export interface VNFModelResponseInterface extends NodeModelResponseInterface{
+export interface VnfProperties extends Level1ModelProperties{
+ ecomp_generated_naming: string;
+}
- serviceType: string;
- serviceRole: string;
- subCategory: string;
- customizationUuid: string;
- serviceEcompNaming: boolean;
- type: string;
- modelCustomizationName: string;
+export interface VNFModelResponseInterface extends Level1ModelResponseInterface{
properties: VnfProperties;
- vfcInstanceGroups: VfcInstanceGroupMap;
}
-export class VNFModel extends NodeModel{
-
- serviceType: string;
- serviceRole: string;
- subCategory: string;
- customizationUuid: string;
- isUserProvidedNaming: boolean;
- type: string;
- modelCustomizationName: string;
- vfcInstanceGroups: VfcInstanceGroupMap;
+export class VNFModel extends Level1Model{
+ properties: VnfProperties;
- constructor(vnfJson?: VNFModelResponseInterface){
+ constructor(vnfJson?: VNFModelResponseInterface) {
super(vnfJson);
if (vnfJson) {
- this.serviceType = vnfJson.serviceType;
- this.serviceRole = vnfJson.serviceRole;
- this.subCategory = vnfJson.subCategory;
- this.customizationUuid = vnfJson.customizationUuid;
- this.isUserProvidedNaming = this.getIsUserProvidedName(vnfJson);
- this.type = vnfJson.type;
- this.modelCustomizationName = vnfJson.modelCustomizationName;
- this.vfcInstanceGroups = vnfJson.vfcInstanceGroups;
-
+ this.properties = vnfJson.properties;
}
}
- private getIsUserProvidedName(vnfJson) {
- const ecompGeneratedNaming = vnfJson.properties.ecomp_generated_naming;
- return ecompGeneratedNaming !== undefined && ecompGeneratedNaming === "false";
- };
}
diff --git a/vid-webpack-master/src/app/shared/models/vnfTreeNode.ts b/vid-webpack-master/src/app/shared/models/vnfTreeNode.ts
index 316bf3e8b..b878d016e 100644
--- a/vid-webpack-master/src/app/shared/models/vnfTreeNode.ts
+++ b/vid-webpack-master/src/app/shared/models/vnfTreeNode.ts
@@ -1,18 +1,17 @@
-import {VNFModel} from "./vnfModel";
-import {VnfInstance} from "./vnfInstance";
import {VfModuleTreeNode} from "./vfModuleTreeNode";
+import {NetworkTreeNode} from "./networkTreeNode";
+import {Level1Model} from "./nodeModel";
+import {VnfInstance} from "./vnfInstance";
+import {ServiceNodeTypes} from "./ServiceNodeTypes";
+
+export class VnfTreeNode extends NetworkTreeNode{
-export class VnfTreeNode {
- modelId: string;
- name: string;
- modelName: string;
- type: string;
children: VfModuleTreeNode[];
+ vnfStoreKey : string;
- constructor(instance: VnfInstance, vnfModel: VNFModel){
- this.name = instance.instanceName || vnfModel['properties'].ecomp_generated_naming == 'false' ? vnfModel.modelCustomizationName : '<Automatically Assigned>';
- this.modelId = vnfModel.uuid;
- this.modelName = vnfModel.modelCustomizationName;
- this.type = vnfModel.type;
+ constructor(instance: VnfInstance, vnfModel: Level1Model, vnfStoreKey : string){
+ super(<any>instance, vnfModel, vnfStoreKey);
+ this.type = ServiceNodeTypes.VF;
+ this.vnfStoreKey = vnfStoreKey;
}
}
diff --git a/vid-webpack-master/src/app/shared/pipes/capitalize/capitalize-and-format.pipe.spec.ts b/vid-webpack-master/src/app/shared/pipes/capitalize/capitalize-and-format.pipe.spec.ts
index 84d2ff4b6..f0bcbb0f1 100644
--- a/vid-webpack-master/src/app/shared/pipes/capitalize/capitalize-and-format.pipe.spec.ts
+++ b/vid-webpack-master/src/app/shared/pipes/capitalize/capitalize-and-format.pipe.spec.ts
@@ -1,25 +1,33 @@
-
import {CapitalizeAndFormatPipe} from "./capitalize-and-format.pipe";
+import {TestBed} from "@angular/core/testing";
describe('Capitalize And Format Pipe', () => {
let capitalizeAndFormatPipe: CapitalizeAndFormatPipe;
- beforeEach(() => {
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({});
+ await TestBed.compileComponents();
capitalizeAndFormatPipe = new CapitalizeAndFormatPipe();
- });
+ })().then(done).catch(done.fail));
+
- it('Capitalize And Format Pipe should be defined', () => {
+ test('Capitalize And Format Pipe should be defined', () => {
expect(capitalizeAndFormatPipe).toBeDefined();
});
- it('Capitalize And Format Pipe : (UPPERCASE)', ()=> {
+ test('Capitalize And Format Pipe : (UPPERCASE)', ()=> {
let result: string = capitalizeAndFormatPipe.transform('PENDING');
expect(result).toEqual('Pending');
});
- it('Capitalize And Format Pipe (UPPERCASE) and Underscore should replace by -', ()=> {
+ test('Capitalize And Format Pipe (UPPERCASE) and Underscore should replace by -', ()=> {
let result: string = capitalizeAndFormatPipe.transform('IN_PROGRESS');
expect(result).toEqual('In-progress');
});
+ test('Capitalize And Format Pipe (COMPLETED_WITH_ERRORS) and All Underscores should replace by -', ()=> {
+ let result: string = capitalizeAndFormatPipe.transform('COMPLETED_WITH_ERRORS');
+ expect('Completed-with-errors').toEqual(result);
+ });
+
});
diff --git a/vid-webpack-master/src/app/shared/pipes/capitalize/capitalize-and-format.pipe.ts b/vid-webpack-master/src/app/shared/pipes/capitalize/capitalize-and-format.pipe.ts
index e3ec9ae9a..12b1eb912 100644
--- a/vid-webpack-master/src/app/shared/pipes/capitalize/capitalize-and-format.pipe.ts
+++ b/vid-webpack-master/src/app/shared/pipes/capitalize/capitalize-and-format.pipe.ts
@@ -4,7 +4,7 @@ import {PipeTransform, Pipe} from '@angular/core';
export class CapitalizeAndFormatPipe implements PipeTransform {
transform(text: string): string {
if (text) {
- text = text.toLowerCase().replace('_', '-');
+ text = text.toLowerCase().replace(/_/g, '-');
return text.charAt(0).toUpperCase() + text.slice(1);
}
return text;
diff --git a/vid-webpack-master/src/app/shared/pipes/data-filter.pipe.ts b/vid-webpack-master/src/app/shared/pipes/data-filter.pipe.ts
deleted file mode 100644
index 1ff836762..000000000
--- a/vid-webpack-master/src/app/shared/pipes/data-filter.pipe.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * Created by cp2122 on 1/4/2018.
- */
-import { Pipe, PipeTransform } from '@angular/core';
-
-@Pipe({
- name: 'dataFilter'
-})
-export class DataFilterPipe implements PipeTransform {
- keys = [];
- transform(items: any, args: string): any {
- if (items != null && items.length > 0) {
- let ans = [];
-
- if (this.keys.length === 0) {
- this.keys = Object.keys(items[0]);
- }
- for (let i of items) {
- for (let k of this.keys) {
- if (i[k] !== null && i[k].toString().match('^.*' + args + '.*$')) {
- ans.push(i);
- break;
- }
- }
- }
- return ans;
- }
- }
-}
diff --git a/vid-webpack-master/src/app/shared/pipes/dataFilter/data-filter.pipe.spec.ts b/vid-webpack-master/src/app/shared/pipes/dataFilter/data-filter.pipe.spec.ts
new file mode 100644
index 000000000..378ba259d
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/pipes/dataFilter/data-filter.pipe.spec.ts
@@ -0,0 +1,52 @@
+import {TestBed} from "@angular/core/testing";
+import {DataFilterPipe} from "./data-filter.pipe";
+
+describe('Data filter pipe', () => {
+
+ let dataFilterPipe: DataFilterPipe;
+
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({});
+ await TestBed.compileComponents();
+
+ dataFilterPipe = new DataFilterPipe();
+
+ })().then(done).catch(done.fail));
+ const items= [{'id':1, 'name': 'aaa'},
+ {'id':12, 'name': 'bbb', 'children':{'first': 155, 'second': 2, 'third': 3}},
+ {'id':3, 'name': 'ccc', 'children':{'first': 1, 'second': 2, 'third': 3}},
+ {'id':4, 'name': 'aad', 'children':{'first': 1, 'second': 2, 'third': 3}}];
+ const keys : string[][] = [["id"],["name"],["children", "first"]];
+
+
+ test('should return items contains substring, keys not provided', () => {
+ const expected = [{'id':1, 'name': 'aaa'}, {'id':4, 'name': 'aad', 'children':{'first': 1, 'second': 2, 'third': 3}}];
+ let res:any[] = dataFilterPipe.transform(items,'aa');
+ expect(res).toEqual(expected);
+ });
+
+
+ test('should return no result, keys not provided', () => {
+ const expected = [];
+ let res:any[] = dataFilterPipe.transform(items,'5');
+ expect(res).toEqual(expected);
+ });
+
+ test('should return no result, deep keys provided', () => {
+ const expected = [];
+ let res:any[] = dataFilterPipe.transform(items,'6', keys);
+ expect(res).toEqual(expected);
+ });
+
+ test('should return expected result, deep keys provided', () => {
+ const expected = [{'id':12, 'name': 'bbb', 'children':{'first': 155, 'second': 2, 'third': 3}}];
+ let res:any[] = dataFilterPipe.transform(items,'155', keys);
+ expect(res).toEqual(expected);
+ });
+
+ test('should return expected result, case insensitive', () => {
+ const expected = [{'id':12, 'name': 'bbb', 'children':{'first': 155, 'second': 2, 'third': 3}}];
+ let res:any[] = dataFilterPipe.transform(items,'BBB', keys);
+ expect(res).toEqual(expected);
+ });
+});
diff --git a/vid-webpack-master/src/app/shared/pipes/dataFilter/data-filter.pipe.ts b/vid-webpack-master/src/app/shared/pipes/dataFilter/data-filter.pipe.ts
new file mode 100644
index 000000000..4b4f1a5bc
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/pipes/dataFilter/data-filter.pipe.ts
@@ -0,0 +1,47 @@
+/**
+ * Created by cp2122 on 1/4/2018.
+ */
+import { Pipe, PipeTransform } from '@angular/core';
+import * as _ from 'lodash';
+
+@Pipe({
+ name: 'dataFilter'
+})
+export class DataFilterPipe implements PipeTransform {
+
+ transform(items: any, searchStr: string, keys?: string[][]): any {
+ if (items != null && items.length > 0 && !_.isNil(searchStr)) {
+ let ans = [];
+
+ if (_.isNil(keys) || keys.length === 0) {
+ keys = Object.keys(items[0]).map((key)=> new Array(key) );
+ }
+ for (const item of items) {
+ for(const key of keys) {
+
+ let val: string = DataFilterPipe.getDeepObjectValueByKeys(item, key);
+ if (!_.isNil(val) && val.toLowerCase().includes(searchStr.toLowerCase())) {
+ ans.push(item);
+ break;
+ }
+ }
+ }
+ return ans;
+ }
+ }
+ /**********************************************************************
+ get value from obj data by array of keys.
+ @keys: all table column and keys
+ @rowData : row data
+ ************************************************************************/
+ static getDeepObjectValueByKeys(rowData: any , keys: string[]) : string {
+ let obj = rowData[keys[0]];
+ if(_.isNil(obj)) {
+ return obj;
+ }
+ for(let i = 1; i < keys.length ; i++){
+ obj = obj[keys[i]];
+ }
+ return obj.toString();
+ }
+}
diff --git a/vid-webpack-master/src/app/shared/pipes/dynamicInputLabel/dynamic-input-label.pipe.spec.ts b/vid-webpack-master/src/app/shared/pipes/dynamicInputLabel/dynamic-input-label.pipe.spec.ts
index 22b619290..9938a1c57 100644
--- a/vid-webpack-master/src/app/shared/pipes/dynamicInputLabel/dynamic-input-label.pipe.spec.ts
+++ b/vid-webpack-master/src/app/shared/pipes/dynamicInputLabel/dynamic-input-label.pipe.spec.ts
@@ -1,43 +1,47 @@
import { DynamicInputLabelPipe } from './dynamic-input-label.pipe';
+import {TestBed} from "@angular/core/testing";
describe('Dynamic input label Pipe', () => {
- let dynamicInputLabelPipe: DynamicInputLabelPipe;
- beforeEach(() => {
+ let dynamicInputLabelPipe: DynamicInputLabelPipe;
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({});
+ await TestBed.compileComponents();
dynamicInputLabelPipe = new DynamicInputLabelPipe();
- });
- it('Dynamic input label Pipe should be defined', () => {
+ })().then(done).catch(done.fail));
+
+ test('Dynamic input label Pipe should be defined', () => {
expect(dynamicInputLabelPipe).toBeDefined();
});
- it('Dynamic input label Pipe : Empty string should return empty string', ()=> {
+ test('Dynamic input label Pipe : Empty string should return empty string', ()=> {
let result: string = dynamicInputLabelPipe.transform('');
- expect(result).toEqual(':*');
+ expect(result).toEqual(':');
});
- it('Dynamic input label Pipe: vnf should be VNF (UPPERCASE)', ()=> {
+ test('Dynamic input label Pipe: vnf should be VNF (UPPERCASE)', ()=> {
let result: string = dynamicInputLabelPipe.transform('vnf');
- expect(result).toEqual('VNF:*');
+ expect(result).toEqual('VNF:');
});
- it('Dynamic input label Pipe : nf should be NF (UPPERCASE)\'', ()=> {
+ test('Dynamic input label Pipe : nf should be NF (UPPERCASE)\'', ()=> {
let result: string = dynamicInputLabelPipe.transform('nf');
- expect(result).toEqual('NF:*');
+ expect(result).toEqual('NF:');
});
- it('Dynamic input label Pipe : Underscore should replace by empty character', ()=> {
+ test('Dynamic input label Pipe : Underscore should replace by empty character', ()=> {
let result: string = dynamicInputLabelPipe.transform('nf_Test');
- expect(result).toEqual('NF test:*');
+ expect(result).toEqual('NF test:');
});
- it('Dynamic input label Pipe : Complex string', ()=> {
+ test('Dynamic input label Pipe : Complex string', ()=> {
let result: string = dynamicInputLabelPipe.transform('nf_Test_vnf_nf');
- expect(result).toEqual('NF test VNF NF:*');
+ expect(result).toEqual('NF test VNF NF:');
});
- it('Dynamic input label Pipe : First letter should be uppercase', ()=> {
+ test('Dynamic input label Pipe : First letter should be uppercase', ()=> {
let result: string = dynamicInputLabelPipe.transform('nfr');
- expect(result).toEqual('Nfr:*');
+ expect(result).toEqual('Nfr:');
});
});
diff --git a/vid-webpack-master/src/app/shared/pipes/dynamicInputLabel/dynamic-input-label.pipe.ts b/vid-webpack-master/src/app/shared/pipes/dynamicInputLabel/dynamic-input-label.pipe.ts
index bec87b46d..f0896befb 100644
--- a/vid-webpack-master/src/app/shared/pipes/dynamicInputLabel/dynamic-input-label.pipe.ts
+++ b/vid-webpack-master/src/app/shared/pipes/dynamicInputLabel/dynamic-input-label.pipe.ts
@@ -7,6 +7,6 @@ export class DynamicInputLabelPipe implements PipeTransform {
let uppercase_vnf = split_label.replace(/\bvnf\b/ig, 'VNF');
let uppercase_nf = uppercase_vnf.replace(/\bnf\b/ig, 'NF');
let capitalize_sentence = uppercase_nf.charAt(0).toUpperCase() + uppercase_nf.slice(1);
- return capitalize_sentence + ':*';
+ return capitalize_sentence + ':';
}
}
diff --git a/vid-webpack-master/src/app/shared/pipes/highlight/highlight-filter.pipe.spec.ts b/vid-webpack-master/src/app/shared/pipes/highlight/highlight-filter.pipe.spec.ts
new file mode 100644
index 000000000..6c2fc42d7
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/pipes/highlight/highlight-filter.pipe.spec.ts
@@ -0,0 +1,29 @@
+
+import {HighlightPipe} from "./highlight-filter.pipe";
+import {TestBed} from "@angular/core/testing";
+
+describe('Highlight Pipe', () => {
+ let highlightPipe: HighlightPipe;
+
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({});
+ await TestBed.compileComponents();
+
+ highlightPipe = new HighlightPipe();
+
+ })().then(done).catch(done.fail));
+
+ test('Highlight Pipe should be defined', () => {
+ expect(highlightPipe).toBeDefined();
+ });
+
+ test('Highlight Pipe should return "HTML" with highlight class if match exist', () => {
+ let result : string = highlightPipe.transform('Hello World', 'Wor');
+ expect(result).toEqual('Hello <span class="highlight">Wor</span>ld');
+ });
+
+ test('Highlight Pipe should not return "HTML" with highlight class if no match exist', () => {
+ let result : string = highlightPipe.transform('Hello World', 'ABC');
+ expect(result).toEqual('Hello World');
+ });
+});
diff --git a/vid-webpack-master/src/app/shared/pipes/highlight-filter.pipe.ts b/vid-webpack-master/src/app/shared/pipes/highlight/highlight-filter.pipe.ts
index 93aecbf69..b25458d6d 100644
--- a/vid-webpack-master/src/app/shared/pipes/highlight-filter.pipe.ts
+++ b/vid-webpack-master/src/app/shared/pipes/highlight/highlight-filter.pipe.ts
@@ -1,8 +1,10 @@
import {PipeTransform, Pipe} from '@angular/core';
+import * as _ from 'lodash';
@Pipe({ name: 'highlight' })
export class HighlightPipe implements PipeTransform {
transform(text: string, search: string): string {
+ if(_.isNil(text)) return text;
let pattern = search.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&');
let regex = new RegExp(pattern, 'gi');
return search ? text.replace(regex, (match) => `<span class="highlight">${match}</span>`) : text;
diff --git a/vid-webpack-master/src/app/shared/pipes/objectToArray/objectToArray.pipe.spec.ts b/vid-webpack-master/src/app/shared/pipes/objectToArray/objectToArray.pipe.spec.ts
new file mode 100644
index 000000000..093e17341
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/pipes/objectToArray/objectToArray.pipe.spec.ts
@@ -0,0 +1,35 @@
+import {TestBed} from "@angular/core/testing";
+import {ObjectToArrayPipe} from "./objectToArray.pipe";
+
+
+describe('Object To Array Pipe', () => {
+ let pipe: ObjectToArrayPipe;
+
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+
+ });
+ await TestBed.compileComponents();
+ pipe = new ObjectToArrayPipe();
+
+ })().then(done).catch(done.fail));
+
+
+ test('should flat object to array', () => {
+ let object = {
+ "a" : {
+ "name" : "A"
+ },
+ "b" : {
+ "name" : "B"
+ },
+ "c" : {
+ "name" : "C"
+ }
+ };
+ let result = pipe.transform(object);
+ expect(result[0]).toEqual({"name" : "A"});
+ expect(result[1]).toEqual({"name" : "B"});
+ expect(result[2]).toEqual({"name" : "C"});
+ });
+});
diff --git a/vid-webpack-master/src/app/shared/pipes/objectToArray/objectToArray.pipe.ts b/vid-webpack-master/src/app/shared/pipes/objectToArray/objectToArray.pipe.ts
new file mode 100644
index 000000000..fa201d981
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/pipes/objectToArray/objectToArray.pipe.ts
@@ -0,0 +1,8 @@
+import { PipeTransform, Pipe } from '@angular/core';
+import * as _ from 'lodash';
+@Pipe({name: 'objecttoarray'})
+export class ObjectToArrayPipe implements PipeTransform {
+ transform(obj) : any {
+ return _.values(obj);
+ }
+}
diff --git a/vid-webpack-master/src/app/shared/pipes/order/orderBy.pipe.spec.ts b/vid-webpack-master/src/app/shared/pipes/order/orderBy.pipe.spec.ts
new file mode 100644
index 000000000..e6a1d310c
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/pipes/order/orderBy.pipe.spec.ts
@@ -0,0 +1,60 @@
+import {OrderByPipe} from "./orderBy.pipe";
+import {TestBed} from "@angular/core/testing";
+
+
+describe('Sort Pipe', () => {
+ let pipe: OrderByPipe;
+
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+
+ });
+ await TestBed.compileComponents();
+ pipe = new OrderByPipe();
+
+ })().then(done).catch(done.fail));
+
+
+ test('Sort should order the array with nested objects', () => {
+ let list = [
+ {
+ id: 1,
+ name: 'b'
+ },
+ {
+ id: 3,
+ name: 'a'
+ },
+ {
+ id: 2,
+ name: 'd'
+ }
+ ];
+
+ let result = pipe.transform(list, {property : 'name'});
+ expect(result.length).toEqual(3);
+ expect(result).toEqual(<any>[
+ {
+ 'id': 3,
+ 'name': 'a'
+ },
+ {
+ 'id': 1,
+ 'name': 'b'
+ },
+ {
+ 'id': 2,
+ 'name': 'd'
+ }])
+
+ });
+
+ test('Sort should order the array', () => {
+ let list = ['b', 'd', 'a'];
+
+ let result = pipe.transform(list);
+ expect(result.length).toEqual(3);
+ expect(result).toEqual(<any>['a', 'b', 'd']);
+
+ });
+});
diff --git a/vid-webpack-master/src/app/shared/pipes/order/orderBy.pipe.ts b/vid-webpack-master/src/app/shared/pipes/order/orderBy.pipe.ts
new file mode 100644
index 000000000..a3b82329b
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/pipes/order/orderBy.pipe.ts
@@ -0,0 +1,35 @@
+import { Pipe, PipeTransform } from '@angular/core';
+import * as _ from 'lodash';
+@Pipe({ name: 'orderBy' })
+export class OrderByPipe implements PipeTransform {
+
+ transform(records: any[], args: any = {}): any {
+ args.direction = !_.isNil(args.direction) ? args.direction : 1;
+
+ if(!_.isNil(records)){
+ return records.sort(function(a, b){
+ if(args.property){
+ if(a[args.property] < b[args.property]){
+ return -1 * args.direction;
+ }
+ else if( a[args.property] > b[args.property]){
+ return 1 * args.direction;
+ }
+ else{
+ return 0;
+ }
+ }else {
+ if(a < b){
+ return -1 * args.direction;
+ }
+ else if( a > b){
+ return 1 * args.direction;
+ }
+ else{
+ return 0;
+ }
+ }
+ });
+ }
+ };
+}
diff --git a/vid-webpack-master/src/app/shared/pipes/safe/safe.pipe.spec.ts b/vid-webpack-master/src/app/shared/pipes/safe/safe.pipe.spec.ts
new file mode 100644
index 000000000..f0471731e
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/pipes/safe/safe.pipe.spec.ts
@@ -0,0 +1,60 @@
+import {SafePipe} from "./safe.pipe";
+import {DomSanitizer} from "@angular/platform-browser";
+import {getTestBed, TestBed} from "@angular/core/testing";
+
+
+describe('Safe pipe', () => {
+
+ let injector;
+ let pipe: SafePipe;
+ let sanitizer: DomSanitizer;
+
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+ providers: [SafePipe]
+ });
+ await TestBed.compileComponents();
+
+ injector = getTestBed();
+ sanitizer = injector.get(DomSanitizer);
+ pipe = injector.get(SafePipe);
+
+ })().then(done).catch(done.fail));
+
+ test('safe pipe should return Safe object', () => {
+ let options = [
+ {
+ value: 'value',
+ type: 'html',
+ func: 'bypassSecurityTrustHtml'
+ },
+ {
+ value: 'value',
+ type: 'style',
+ func: 'bypassSecurityTrustStyle'
+ },
+ {
+ value: 'value',
+ type: 'script',
+ func: 'bypassSecurityTrustScript'
+ },
+ {
+ value: 'value',
+ type: 'url',
+ func: 'bypassSecurityTrustUrl'
+ },
+ {
+ value: 'value',
+ type: 'resourceUrl',
+ func: 'bypassSecurityTrustResourceUrl'
+ }
+ ];
+
+ for (let option of options) {
+ jest.spyOn(sanitizer, <any>option.func);
+ pipe.transform(option.value, option.type);
+ expect(sanitizer[option.func]).toHaveBeenCalledWith(option.value);
+ }
+ });
+
+});
diff --git a/vid-webpack-master/src/app/shared/pipes/safe/safe.pipe.ts b/vid-webpack-master/src/app/shared/pipes/safe/safe.pipe.ts
new file mode 100644
index 000000000..cff5b61a9
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/pipes/safe/safe.pipe.ts
@@ -0,0 +1,22 @@
+// @ts-ignore
+import {DomSanitizer, SafeHtml, SafeResourceUrl, SafeScript, SafeStyle, SafeUrl} from "@angular/platform-browser";
+import {Pipe, PipeTransform} from "@angular/core";
+
+
+@Pipe({
+ name: 'safe'
+})
+export class SafePipe implements PipeTransform {
+
+ constructor(protected sanitizer: DomSanitizer) {}
+
+ public transform(value: any, type: string): SafeHtml | SafeStyle | SafeScript | SafeUrl | SafeResourceUrl {
+ switch (type) {
+ case 'html': return this.sanitizer.bypassSecurityTrustHtml(value);
+ case 'style': return this.sanitizer.bypassSecurityTrustStyle(value);
+ case 'script': return this.sanitizer.bypassSecurityTrustScript(value);
+ case 'url': return this.sanitizer.bypassSecurityTrustUrl(value);
+ case 'resourceUrl': return this.sanitizer.bypassSecurityTrustResourceUrl(value);
+ }
+ }
+}
diff --git a/vid-webpack-master/src/app/shared/pipes/serviceInfo/serviceInfo.pipe.spec.ts b/vid-webpack-master/src/app/shared/pipes/serviceInfo/serviceInfo.pipe.spec.ts
index 984e3378c..670f2f224 100644
--- a/vid-webpack-master/src/app/shared/pipes/serviceInfo/serviceInfo.pipe.spec.ts
+++ b/vid-webpack-master/src/app/shared/pipes/serviceInfo/serviceInfo.pipe.spec.ts
@@ -1,14 +1,23 @@
import {ServiceInfoPipe} from "./serviceInfo.pipe";
+import {TestBed} from "@angular/core/testing";
describe('Service info Pipe', () => {
let pipe: ServiceInfoPipe;
- beforeEach(() => {
+
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+
+ });
+ await TestBed.compileComponents();
pipe = new ServiceInfoPipe();
- });
- it('Service info Pipe should return model name', () => {
+
+ })().then(done).catch(done.fail));
+
+
+ test('Service info Pipe should return model name', () => {
let store = {
getState : function() {
return {
@@ -24,7 +33,7 @@ describe('Service info Pipe', () => {
- it('Service info Pipe should return null if field name not exist', () => {
+ test('Service info Pipe should return null if field name not exist', () => {
let store = {
getState : function() {
return {
@@ -38,7 +47,7 @@ describe('Service info Pipe', () => {
expect(result).toBeNull();
});
- it('Service info Pipe should return null if model not exist', () => {
+ test('Service info Pipe should return null if model not exist', () => {
let store = {
getState : function() {
return {
@@ -53,6 +62,6 @@ describe('Service info Pipe', () => {
});
function generateserviceHierarchy(){
- return JSON.parse('{"6e59c5de-f052-46fa-aa7e-2fca9d674c44":{"service":{"uuid":"6e59c5de-f052-46fa-aa7e-2fca9d674c44","invariantUuid":"e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0","name":"ComplexService","version":"1.0","toscaModelURL":null,"category":"Mobility","serviceType":"","serviceRole":"","description":"ComplexService","serviceEcompNaming":"true","instantiationType":"Macro","inputs":{}},"vnfs":{"VF_vMee 0":{"uuid":"d6557200-ecf2-4641-8094-5393ae3aae60","invariantUuid":"4160458e-f648-4b30-a176-43881ffffe9e","description":"VSP_vMee","name":"VF_vMee","version":"2.0","customizationUuid":"91415b44-753d-494c-926a-456a9172bbb9","inputs":{},"commands":{},"properties":{"gpb2_Internal2_mac":"00:80:37:0E:02:22","sctp-b-ipv6-egress_src_start_port":"0","sctp-a-ipv6-egress_rule_application":"any","Internal2_allow_transit":"true","sctp-b-IPv6_ethertype":"IPv6","sctp-a-egress_rule_application":"any","sctp-b-ingress_action":"pass","sctp-b-ingress_rule_protocol":"icmp","ncb2_Internal1_mac":"00:80:37:0E:0F:12","sctp-b-ipv6-ingress-src_start_port":"0.0","ncb1_Internal2_mac":"00:80:37:0E:09:12","fsb_volume_size_0":"320.0","sctp-b-egress_src_addresses":"local","sctp-a-ipv6-ingress_ethertype":"IPv4","sctp-a-ipv6-ingress-dst_start_port":"0","sctp-b-ipv6-ingress_rule_application":"any","domain_name":"default-domain","sctp-a-ingress_rule_protocol":"icmp","sctp-b-egress-src_start_port":"0.0","sctp-a-egress_src_addresses":"local","sctp-b-display_name":"epc-sctp-b-ipv4v6-sec-group","sctp-a-egress-src_start_port":"0.0","sctp-a-ingress_ethertype":"IPv4","sctp-b-ipv6-ingress-dst_end_port":"65535","sctp-b-dst_subnet_prefix_v6":"::","nf_naming":"{ecomp_generated_naming=true}","sctp-a-ipv6-ingress_src_subnet_prefix":"0.0.0.0","sctp-b-egress-dst_start_port":"0.0","ncb_flavor_name":"nv.c20r64d1","gpb1_Internal1_mac":"00:80:37:0E:01:22","sctp-b-egress_dst_subnet_prefix_len":"0.0","Internal2_net_cidr":"169.255.0.0","sctp-a-ingress-dst_start_port":"0.0","sctp-a-egress-dst_start_port":"0.0","fsb1_Internal2_mac":"00:80:37:0E:0B:12","sctp-a-egress_ethertype":"IPv4","vlc_st_service_mode":"in-network-nat","sctp-a-ipv6-egress_ethertype":"IPv4","sctp-a-egress-src_end_port":"65535.0","sctp-b-ipv6-egress_rule_application":"any","sctp-b-egress_action":"pass","sctp-a-ingress-src_subnet_prefix_len":"0.0","sctp-b-ipv6-ingress-src_end_port":"65535.0","sctp-b-name":"epc-sctp-b-ipv4v6-sec-group","fsb2_Internal1_mac":"00:80:37:0E:0D:12","sctp-a-ipv6-ingress-src_start_port":"0.0","sctp-b-ipv6-egress_ethertype":"IPv4","Internal1_net_cidr":"169.253.0.0","sctp-a-egress_dst_subnet_prefix":"0.0.0.0","fsb_flavor_name":"nv.c20r64d1","sctp_rule_protocol":"132","sctp-b-ipv6-ingress_src_subnet_prefix_len":"0","sctp-a-ipv6-ingress_rule_application":"any","ecomp_generated_naming":"true","sctp-a-IPv6_ethertype":"IPv6","vlc2_Internal1_mac":"00:80:37:0E:02:12","vlc_st_virtualization_type":"virtual-machine","sctp-b-ingress-dst_start_port":"0.0","sctp-b-ingress-dst_end_port":"65535.0","sctp-a-ipv6-ingress-src_end_port":"65535.0","sctp-a-display_name":"epc-sctp-a-ipv4v6-sec-group","sctp-b-ingress_rule_application":"any","int2_sec_group_name":"int2-sec-group","vlc_flavor_name":"nd.c16r64d1","sctp-b-ipv6-egress_src_addresses":"local","vlc_st_interface_type_int1":"other1","sctp-b-egress-src_end_port":"65535.0","sctp-a-ipv6-egress-dst_start_port":"0","vlc_st_interface_type_int2":"other2","sctp-a-ipv6-egress_rule_protocol":"any","Internal2_shared":"false","sctp-a-ipv6-egress_dst_subnet_prefix_len":"0","Internal2_rpf":"disable","vlc1_Internal1_mac":"00:80:37:0E:01:12","sctp-b-ipv6-egress_src_end_port":"65535","sctp-a-ipv6-egress_src_addresses":"local","sctp-a-ingress-dst_end_port":"65535.0","sctp-a-ipv6-egress_src_end_port":"65535","Internal1_forwarding_mode":"l2","Internal2_dhcp":"false","sctp-a-dst_subnet_prefix_v6":"::","pxe_image_name":"MME_PXE-Boot_16ACP04_GA.qcow2","vlc_st_interface_type_gtp":"other0","ncb1_Internal1_mac":"00:80:37:0E:09:12","sctp-b-src_subnet_prefix_v6":"::","sctp-a-egress_dst_subnet_prefix_len":"0.0","int1_sec_group_name":"int1-sec-group","Internal1_dhcp":"false","sctp-a-ipv6-egress_dst_end_port":"65535","Internal2_forwarding_mode":"l2","fsb2_Internal2_mac":"00:80:37:0E:0D:12","sctp-b-egress_dst_subnet_prefix":"0.0.0.0","Internal1_net_cidr_len":"17","gpb2_Internal1_mac":"00:80:37:0E:02:22","sctp-b-ingress-src_subnet_prefix_len":"0.0","sctp-a-ingress_dst_addresses":"local","sctp-a-egress_action":"pass","fsb_volume_type_0":"SF-Default-SSD","ncb2_Internal2_mac":"00:80:37:0E:0F:12","vlc_st_interface_type_sctp_a":"left","vlc_st_interface_type_sctp_b":"right","sctp-a-src_subnet_prefix_v6":"::","vlc_st_version":"2","sctp-b-egress_ethertype":"IPv4","sctp-a-ingress_rule_application":"any","gpb1_Internal2_mac":"00:80:37:0E:01:22","instance_ip_family_v6":"v6","sctp-a-ipv6-egress_src_start_port":"0","sctp-b-ingress-src_start_port":"0.0","sctp-b-ingress_dst_addresses":"local","fsb1_Internal1_mac":"00:80:37:0E:0B:12","vlc_st_interface_type_oam":"management","multi_stage_design":"false","oam_sec_group_name":"oam-sec-group","Internal2_net_gateway":"169.255.0.3","sctp-a-ipv6-ingress-dst_end_port":"65535","sctp-b-ipv6-egress-dst_start_port":"0","Internal1_net_gateway":"169.253.0.3","sctp-b-ipv6-egress_rule_protocol":"any","gtp_sec_group_name":"gtp-sec-group","sctp-a-ipv6-egress_dst_subnet_prefix":"0.0.0.0","sctp-b-ipv6-egress_dst_subnet_prefix_len":"0","sctp-a-ipv6-ingress_dst_addresses":"local","sctp-a-egress_rule_protocol":"icmp","sctp-b-ipv6-egress_action":"pass","sctp-a-ipv6-egress_action":"pass","Internal1_shared":"false","sctp-b-ipv6-ingress_rule_protocol":"any","Internal2_net_cidr_len":"17","sctp-a-name":"epc-sctp-a-ipv4v6-sec-group","sctp-a-ingress-src_end_port":"65535.0","sctp-b-ipv6-ingress_src_subnet_prefix":"0.0.0.0","sctp-a-egress-dst_end_port":"65535.0","sctp-a-ingress_action":"pass","sctp-b-egress_rule_protocol":"icmp","sctp-b-ipv6-ingress_action":"pass","vlc_st_service_type":"firewall","sctp-b-ipv6-egress_dst_end_port":"65535","sctp-b-ipv6-ingress-dst_start_port":"0","vlc2_Internal2_mac":"00:80:37:0E:02:12","vlc_st_availability_zone":"true","fsb_volume_image_name_1":"MME_FSB2_16ACP04_GA.qcow2","sctp-b-ingress-src_subnet_prefix":"0.0.0.0","sctp-a-ipv6-ingress_src_subnet_prefix_len":"0","Internal1_allow_transit":"true","gpb_flavor_name":"nv.c20r64d1","availability_zone_max_count":"1","fsb_volume_image_name_0":"MME_FSB1_16ACP04_GA.qcow2","sctp-b-ipv6-ingress_dst_addresses":"local","sctp-b-ipv6-egress_dst_subnet_prefix":"0.0.0.0","sctp-b-ipv6-ingress_ethertype":"IPv4","vlc1_Internal2_mac":"00:80:37:0E:01:12","sctp-a-ingress-src_subnet_prefix":"0.0.0.0","sctp-a-ipv6-ingress_action":"pass","Internal1_rpf":"disable","sctp-b-ingress_ethertype":"IPv4","sctp-b-egress_rule_application":"any","sctp-b-ingress-src_end_port":"65535.0","sctp-a-ipv6-ingress_rule_protocol":"any","sctp-a-ingress-src_start_port":"0.0","sctp-b-egress-dst_end_port":"65535.0"},"type":"VF","modelCustomizationName":"VF_vMee 0","vfModules":{"vf_vmee0..VfVmee..vmme_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","version":"2","modelCustomizationName":"VfVmee..vmme_vlc..module-1","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_vlc"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..vmme_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","version":"2","modelCustomizationName":"VfVmee..vmme_gpb..module-2","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_gpb"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..base_vmme..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","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{},"volumeGroupAllowed":true}},"volumeGroups":{"vf_vmee0..VfVmee..base_vmme..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","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{}}},"vfcInstanceGroups":{}}},"networks":{"ExtVL 0":{"uuid":"ddc3f20c-08b5-40fd-af72-c6d14636b986","invariantUuid":"379f816b-a7aa-422f-be30-17114ff50b7c","description":"ECOMP generic virtual link (network) base type for all other service-level and global networks","name":"ExtVL","version":"37.0","customizationUuid":"94fdd893-4a36-4d70-b16a-ec29c54c184f","inputs":{},"commands":{},"properties":{"network_assignments":"{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}","exVL_naming":"{ecomp_generated_naming=true}","network_flows":"{is_network_policy=false, is_bound_to_vpn=false}","network_homing":"{ecomp_selected_instance_node_target=false}"},"type":"VL","modelCustomizationName":"ExtVL 0"}},"collectionResource":{},"configurations":{"Port Mirroring Configuration By Policy 0":{"uuid":"b4398538-e89d-4f13-b33d-ca323434ba50","invariantUuid":"6ef0ca40-f366-4897-951f-abd65d25f6f7","description":"A port mirroring configuration by policy object","name":"Port Mirroring Configuration By Policy","version":"27.0","customizationUuid":"3c3b7b8d-8669-4b3b-8664-61970041fad2","inputs":{},"commands":{},"properties":{},"type":"Configuration","modelCustomizationName":"Port Mirroring Configuration By Policy 0","sourceNodes":[],"collectorNodes":null,"configurationByPolicy":false}},"serviceProxies":{},"vfModules":{"vf_vmee0..VfVmee..vmme_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","version":"2","modelCustomizationName":"VfVmee..vmme_vlc..module-1","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_vlc"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..vmme_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","version":"2","modelCustomizationName":"VfVmee..vmme_gpb..module-2","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_gpb"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..base_vmme..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","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{},"volumeGroupAllowed":true}},"volumeGroups":{"vf_vmee0..VfVmee..base_vmme..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","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{}}},"pnfs":{}}}');
+ return JSON.parse('{"6e59c5de-f052-46fa-aa7e-2fca9d674c44":{"service":{"uuid":"6e59c5de-f052-46fa-aa7e-2fca9d674c44","invariantUuid":"e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0","name":"ComplexService","version":"1.0","toscaModelURL":null,"category":"Emanuel","serviceType":"","serviceRole":"","description":"ComplexService","serviceEcompNaming":"true","instantiationType":"Macro","inputs":{}},"vnfs":{"VF_vMee 0":{"uuid":"d6557200-ecf2-4641-8094-5393ae3aae60","invariantUuid":"4160458e-f648-4b30-a176-43881ffffe9e","description":"VSP_vMee","name":"VF_vMee","version":"2.0","customizationUuid":"91415b44-753d-494c-926a-456a9172bbb9","inputs":{},"commands":{},"properties":{"gpb2_Internal2_mac":"00:11:22:EF:AC:DF","sctp-b-ipv6-egress_src_start_port":"0","sctp-a-ipv6-egress_rule_application":"any","Internal2_allow_transit":"true","sctp-b-IPv6_ethertype":"IPv6","sctp-a-egress_rule_application":"any","sctp-b-ingress_action":"pass","sctp-b-ingress_rule_protocol":"icmp","ncb2_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-ipv6-ingress-src_start_port":"0.0","ncb1_Internal2_mac":"00:11:22:EF:AC:DF","fsb_volume_size_0":"320.0","sctp-b-egress_src_addresses":"local","sctp-a-ipv6-ingress_ethertype":"IPv4","sctp-a-ipv6-ingress-dst_start_port":"0","sctp-b-ipv6-ingress_rule_application":"any","domain_name":"default-domain","sctp-a-ingress_rule_protocol":"icmp","sctp-b-egress-src_start_port":"0.0","sctp-a-egress_src_addresses":"local","sctp-b-display_name":"epc-sctp-b-ipv4v6-sec-group","sctp-a-egress-src_start_port":"0.0","sctp-a-ingress_ethertype":"IPv4","sctp-b-ipv6-ingress-dst_end_port":"65535","sctp-b-dst_subnet_prefix_v6":"::","nf_naming":"{ecomp_generated_naming=true}","sctp-a-ipv6-ingress_src_subnet_prefix":"0.0.0.0","sctp-b-egress-dst_start_port":"0.0","ncb_flavor_name":"nv.c20r64d1","gpb1_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-egress_dst_subnet_prefix_len":"0.0","Internal2_net_cidr":"10.0.0.10","sctp-a-ingress-dst_start_port":"0.0","sctp-a-egress-dst_start_port":"0.0","fsb1_Internal2_mac":"00:11:22:EF:AC:DF","sctp-a-egress_ethertype":"IPv4","vlc_st_service_mode":"in-network-nat","sctp-a-ipv6-egress_ethertype":"IPv4","sctp-a-egress-src_end_port":"65535.0","sctp-b-ipv6-egress_rule_application":"any","sctp-b-egress_action":"pass","sctp-a-ingress-src_subnet_prefix_len":"0.0","sctp-b-ipv6-ingress-src_end_port":"65535.0","sctp-b-name":"epc-sctp-b-ipv4v6-sec-group","fsb2_Internal1_mac":"00:11:22:EF:AC:DF","sctp-a-ipv6-ingress-src_start_port":"0.0","sctp-b-ipv6-egress_ethertype":"IPv4","Internal1_net_cidr":"10.0.0.10","sctp-a-egress_dst_subnet_prefix":"0.0.0.0","fsb_flavor_name":"nv.c20r64d1","sctp_rule_protocol":"132","sctp-b-ipv6-ingress_src_subnet_prefix_len":"0","sctp-a-ipv6-ingress_rule_application":"any","ecomp_generated_naming":"true","sctp-a-IPv6_ethertype":"IPv6","vlc2_Internal1_mac":"00:11:22:EF:AC:DF","vlc_st_virtualization_type":"virtual-machine","sctp-b-ingress-dst_start_port":"0.0","sctp-b-ingress-dst_end_port":"65535.0","sctp-a-ipv6-ingress-src_end_port":"65535.0","sctp-a-display_name":"epc-sctp-a-ipv4v6-sec-group","sctp-b-ingress_rule_application":"any","int2_sec_group_name":"int2-sec-group","vlc_flavor_name":"nd.c16r64d1","sctp-b-ipv6-egress_src_addresses":"local","vlc_st_interface_type_int1":"other1","sctp-b-egress-src_end_port":"65535.0","sctp-a-ipv6-egress-dst_start_port":"0","vlc_st_interface_type_int2":"other2","sctp-a-ipv6-egress_rule_protocol":"any","Internal2_shared":"false","sctp-a-ipv6-egress_dst_subnet_prefix_len":"0","Internal2_rpf":"disable","vlc1_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-ipv6-egress_src_end_port":"65535","sctp-a-ipv6-egress_src_addresses":"local","sctp-a-ingress-dst_end_port":"65535.0","sctp-a-ipv6-egress_src_end_port":"65535","Internal1_forwarding_mode":"l2","Internal2_dhcp":"false","sctp-a-dst_subnet_prefix_v6":"::","pxe_image_name":"MME_PXE-Boot_16ACP04_GA.qcow2","vlc_st_interface_type_gtp":"other0","ncb1_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-src_subnet_prefix_v6":"::","sctp-a-egress_dst_subnet_prefix_len":"0.0","int1_sec_group_name":"int1-sec-group","Internal1_dhcp":"false","sctp-a-ipv6-egress_dst_end_port":"65535","Internal2_forwarding_mode":"l2","fsb2_Internal2_mac":"00:11:22:EF:AC:DF","sctp-b-egress_dst_subnet_prefix":"0.0.0.0","Internal1_net_cidr_len":"17","gpb2_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-ingress-src_subnet_prefix_len":"0.0","sctp-a-ingress_dst_addresses":"local","sctp-a-egress_action":"pass","fsb_volume_type_0":"SF-Default-SSD","ncb2_Internal2_mac":"00:11:22:EF:AC:DF","vlc_st_interface_type_sctp_a":"left","vlc_st_interface_type_sctp_b":"right","sctp-a-src_subnet_prefix_v6":"::","vlc_st_version":"2","sctp-b-egress_ethertype":"IPv4","sctp-a-ingress_rule_application":"any","gpb1_Internal2_mac":"00:11:22:EF:AC:DF","instance_ip_family_v6":"v6","sctp-a-ipv6-egress_src_start_port":"0","sctp-b-ingress-src_start_port":"0.0","sctp-b-ingress_dst_addresses":"local","fsb1_Internal1_mac":"00:11:22:EF:AC:DF","vlc_st_interface_type_oam":"management","multi_stage_design":"false","oam_sec_group_name":"oam-sec-group","Internal2_net_gateway":"10.0.0.10","sctp-a-ipv6-ingress-dst_end_port":"65535","sctp-b-ipv6-egress-dst_start_port":"0","Internal1_net_gateway":"10.0.0.10","sctp-b-ipv6-egress_rule_protocol":"any","gtp_sec_group_name":"gtp-sec-group","sctp-a-ipv6-egress_dst_subnet_prefix":"0.0.0.0","sctp-b-ipv6-egress_dst_subnet_prefix_len":"0","sctp-a-ipv6-ingress_dst_addresses":"local","sctp-a-egress_rule_protocol":"icmp","sctp-b-ipv6-egress_action":"pass","sctp-a-ipv6-egress_action":"pass","Internal1_shared":"false","sctp-b-ipv6-ingress_rule_protocol":"any","Internal2_net_cidr_len":"17","sctp-a-name":"epc-sctp-a-ipv4v6-sec-group","sctp-a-ingress-src_end_port":"65535.0","sctp-b-ipv6-ingress_src_subnet_prefix":"0.0.0.0","sctp-a-egress-dst_end_port":"65535.0","sctp-a-ingress_action":"pass","sctp-b-egress_rule_protocol":"icmp","sctp-b-ipv6-ingress_action":"pass","vlc_st_service_type":"firewall","sctp-b-ipv6-egress_dst_end_port":"65535","sctp-b-ipv6-ingress-dst_start_port":"0","vlc2_Internal2_mac":"00:11:22:EF:AC:DF","vlc_st_availability_zone":"true","fsb_volume_image_name_1":"MME_FSB2_16ACP04_GA.qcow2","sctp-b-ingress-src_subnet_prefix":"0.0.0.0","sctp-a-ipv6-ingress_src_subnet_prefix_len":"0","Internal1_allow_transit":"true","gpb_flavor_name":"nv.c20r64d1","availability_zone_max_count":"1","fsb_volume_image_name_0":"MME_FSB1_16ACP04_GA.qcow2","sctp-b-ipv6-ingress_dst_addresses":"local","sctp-b-ipv6-egress_dst_subnet_prefix":"0.0.0.0","sctp-b-ipv6-ingress_ethertype":"IPv4","vlc1_Internal2_mac":"00:11:22:EF:AC:DF","sctp-a-ingress-src_subnet_prefix":"0.0.0.0","sctp-a-ipv6-ingress_action":"pass","Internal1_rpf":"disable","sctp-b-ingress_ethertype":"IPv4","sctp-b-egress_rule_application":"any","sctp-b-ingress-src_end_port":"65535.0","sctp-a-ipv6-ingress_rule_protocol":"any","sctp-a-ingress-src_start_port":"0.0","sctp-b-egress-dst_end_port":"65535.0"},"type":"VF","modelCustomizationName":"VF_vMee 0","vfModules":{"vf_vmee0..VfVmee..vmme_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","version":"2","modelCustomizationName":"VfVmee..vmme_vlc..module-1","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_vlc"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..vmme_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","version":"2","modelCustomizationName":"VfVmee..vmme_gpb..module-2","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_gpb"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..base_vmme..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","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{},"volumeGroupAllowed":true}},"volumeGroups":{"vf_vmee0..VfVmee..base_vmme..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","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{}}},"vfcInstanceGroups":{}}},"networks":{"ExtVL 0":{"uuid":"ddc3f20c-08b5-40fd-af72-c6d14636b986","invariantUuid":"379f816b-a7aa-422f-be30-17114ff50b7c","description":"ECOMP generic virtual link (network) base type for all other service-level and global networks","name":"ExtVL","version":"37.0","customizationUuid":"94fdd893-4a36-4d70-b16a-ec29c54c184f","inputs":{},"commands":{},"properties":{"network_assignments":"{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}","exVL_naming":"{ecomp_generated_naming=true}","network_flows":"{is_network_policy=false, is_bound_to_vpn=false}","network_homing":"{ecomp_selected_instance_node_target=false}"},"type":"VL","modelCustomizationName":"ExtVL 0"}},"collectionResource":{},"configurations":{"Port Mirroring Configuration By Policy 0":{"uuid":"b4398538-e89d-4f13-b33d-ca323434ba50","invariantUuid":"6ef0ca40-f366-4897-951f-abd65d25f6f7","description":"A port mirroring configuration by policy object","name":"Port Mirroring Configuration By Policy","version":"27.0","customizationUuid":"3c3b7b8d-8669-4b3b-8664-61970041fad2","inputs":{},"commands":{},"properties":{},"type":"Configuration","modelCustomizationName":"Port Mirroring Configuration By Policy 0","sourceNodes":[],"collectorNodes":null,"configurationByPolicy":false}},"serviceProxies":{},"vfModules":{"vf_vmee0..VfVmee..vmme_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","version":"2","modelCustomizationName":"VfVmee..vmme_vlc..module-1","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_vlc"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..vmme_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","version":"2","modelCustomizationName":"VfVmee..vmme_gpb..module-2","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_gpb"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..base_vmme..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","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{},"volumeGroupAllowed":true}},"volumeGroups":{"vf_vmee0..VfVmee..base_vmme..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","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{}}},"pnfs":{}}}');
}
});
diff --git a/vid-webpack-master/src/app/shared/pipes/serviceInfo/serviceInfo.pipe.ts b/vid-webpack-master/src/app/shared/pipes/serviceInfo/serviceInfo.pipe.ts
index 8cb2e1dcd..2876362e2 100644
--- a/vid-webpack-master/src/app/shared/pipes/serviceInfo/serviceInfo.pipe.ts
+++ b/vid-webpack-master/src/app/shared/pipes/serviceInfo/serviceInfo.pipe.ts
@@ -1,11 +1,11 @@
import {PipeTransform, Pipe} from '@angular/core';
-import {isNullOrUndefined} from "util";
+import * as _ from 'lodash';
@Pipe({ name: 'serviceInfo'})
export class ServiceInfoPipe implements PipeTransform {
transform(service: string, store : any , modelId : string, fieldName : string): string {
const serviceHierarchy = store.getState().service.serviceHierarchy;
- if(!isNullOrUndefined(serviceHierarchy) && !isNullOrUndefined(serviceHierarchy[modelId])){
+ if(!_.isNil(serviceHierarchy) && !_.isNil(serviceHierarchy[modelId])){
return serviceHierarchy[modelId].service[fieldName] || null;
}
return null;
diff --git a/vid-webpack-master/src/app/shared/resolvers/flag/flag.resolver.spec.ts b/vid-webpack-master/src/app/shared/resolvers/flag/flag.resolver.spec.ts
new file mode 100644
index 000000000..930562ce0
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/resolvers/flag/flag.resolver.spec.ts
@@ -0,0 +1,61 @@
+import {TestBed, getTestBed} from '@angular/core/testing';
+import {
+ HttpClientTestingModule,
+ HttpTestingController
+} from '@angular/common/http/testing';
+import {NgRedux} from "@angular-redux/store";
+import {FeatureFlagsService} from "../../services/featureFlag/feature-flags.service";
+import {ActivatedRouteSnapshot, convertToParamMap} from "@angular/router";
+import {FlagsResolve} from "./flag.resolver";
+import {ConfigurationService} from "../../services/configuration.service";
+
+class MockAppStore<T> {
+ getState() {
+ return {
+ service: {
+ serviceInstance: {}
+ }
+ }
+ }
+}
+
+
+describe('Flag resolver', () => {
+ let injector;
+ let resolver: FlagsResolve;
+ let configurationService: ConfigurationService;
+ let httpMock: HttpTestingController;
+
+ let activatedRouteSnapshot: ActivatedRouteSnapshot;
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+ imports: [HttpClientTestingModule],
+ providers: [
+ FlagsResolve,
+ ConfigurationService,
+ FeatureFlagsService,
+ {provide: NgRedux, useClass: MockAppStore},
+ {
+ provide: ActivatedRouteSnapshot, useValue: {
+ queryParamMap:
+ convertToParamMap({ })
+ }
+ },
+ ]
+ });
+ await TestBed.compileComponents();
+
+ injector = getTestBed();
+ resolver = injector.get(FlagsResolve);
+ httpMock = injector.get(HttpTestingController);
+ activatedRouteSnapshot = injector.get(ActivatedRouteSnapshot);
+ configurationService = injector.get(ConfigurationService);
+
+ })().then(done).catch(done.fail));
+
+ test('should update flags', () => {
+ spyOn(configurationService, 'getFlags');
+ resolver.resolve(activatedRouteSnapshot);
+ expect(configurationService.getFlags).toHaveBeenCalled();
+ });
+});
diff --git a/vid-webpack-master/src/app/services/flags.resolve.ts b/vid-webpack-master/src/app/shared/resolvers/flag/flag.resolver.ts
index 70449379f..7ebce8bde 100644
--- a/vid-webpack-master/src/app/services/flags.resolve.ts
+++ b/vid-webpack-master/src/app/shared/resolvers/flag/flag.resolver.ts
@@ -1,7 +1,7 @@
import {ActivatedRouteSnapshot, Resolve} from "@angular/router";
import {Injectable} from "@angular/core";
-import {ConfigurationService} from "./configuration.service";
-import {Observable} from "rxjs/Observable";
+import {Observable} from "rxjs";
+import {ConfigurationService} from "../../services/configuration.service";
@Injectable()
export class FlagsResolve implements Resolve<Observable< { [key: string]: boolean }>> {
diff --git a/vid-webpack-master/src/app/shared/resolvers/retry/retry.resolver.spec.ts b/vid-webpack-master/src/app/shared/resolvers/retry/retry.resolver.spec.ts
new file mode 100644
index 000000000..2578d7b2d
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/resolvers/retry/retry.resolver.spec.ts
@@ -0,0 +1,306 @@
+import {getTestBed, TestBed} from '@angular/core/testing';
+import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing';
+import {NgRedux} from "@angular-redux/store";
+import {ActivatedRouteSnapshot, convertToParamMap} from "@angular/router";
+import {AppState} from "../../store/reducers";
+import {RetryResolver} from "./retry.resolver";
+import {AaiService} from "../../services/aaiService/aai.service";
+import {FeatureFlagsService} from "../../services/featureFlag/feature-flags.service";
+import {Observable, of} from "rxjs";
+
+class MockAppStore<T> {
+ getState() {
+ return {
+ global:{
+ drawingBoardStatus: "VIEW"
+ },
+ service: {
+ serviceInstance: {}
+ }
+ }
+ }
+ dispatch(){
+
+ }
+}
+
+
+describe('View Edit resolver', () => {
+ let injector;
+ let aaiService: AaiService;
+ let resolver: RetryResolver;
+ let httpMock: HttpTestingController;
+ let store : NgRedux<AppState>;
+ let activatedRouteSnapshot: ActivatedRouteSnapshot;
+
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+ imports: [HttpClientTestingModule],
+ providers: [
+ FeatureFlagsService,
+ RetryResolver,
+ AaiService,
+ {provide: NgRedux, useClass: MockAppStore},
+ {
+ provide: ActivatedRouteSnapshot, useValue: {
+ queryParamMap:
+ convertToParamMap({
+ serviceModelId: 'serviceModelId',
+ subscriberId: 'subscriberId',
+ serviceType: 'serviceType',
+ serviceInstanceId : 'serviceInstanceId',
+ jobId : 'jobId'
+ })
+ },
+
+ }
+ ]
+ });
+ await TestBed.compileComponents();
+
+ injector = getTestBed();
+ aaiService = injector.get(AaiService);
+ resolver = injector.get(RetryResolver);
+ httpMock = injector.get(HttpTestingController);
+ activatedRouteSnapshot = injector.get(ActivatedRouteSnapshot);
+ store = injector.get(NgRedux)
+
+ })().then(done).catch(done.fail));
+
+
+ test("should call get all parameter's from url", () => {
+ expect(activatedRouteSnapshot.queryParamMap.get("serviceModelId")).toBe('serviceModelId');
+ expect(activatedRouteSnapshot.queryParamMap.get("subscriberId")).toBe('subscriberId');
+ expect(activatedRouteSnapshot.queryParamMap.get("serviceType")).toBe('serviceType');
+ expect(activatedRouteSnapshot.queryParamMap.get("serviceInstanceId")).toBe('serviceInstanceId');
+ expect(activatedRouteSnapshot.queryParamMap.get("jobId")).toBe('jobId');
+ });
+
+
+ test("should return retry topology", () => {
+ jest.spyOn(aaiService, 'getServiceModelById').mockReturnValue(of({}));
+ jest.spyOn(aaiService, 'retrieveAndStoreServiceInstanceTopology').mockReturnValue(of({
+ "vnfs": {
+ "2017-388_ADIOD-vPE 0": {
+ "vfModules": {},
+ "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168",
+ "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "lcpCloudRegionId": "JANET25",
+ "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+ "lineOfBusiness": "ONAP",
+ "platformName": "platform",
+ "modelInfo": {
+ "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "modelVersionId": "afacccf6-397d-45d6-b5ae-94c39734b168",
+ "modelName": "2017-388_ADIOD-vPE",
+ "modelVersion": "4.0",
+ "modelCustomizationId": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c",
+ "modelCustomizationName": "2017-388_ADIOD-vPE 0",
+ "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168"
+ },
+ "instanceName": "2017388_ADIODvPEmCaNkinstanceName",
+ "legacyRegion": "some legacy region"
+ },
+ "2017-488_ADIOD-vPE 0": {
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0uvfot": {
+ "instanceName": "VFinstancenameZERO",
+ "modelInfo": {
+ "modelInvariantId": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+ "modelVersionId": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+ "modelName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "modelVersion": "5",
+ "modelCustomizationId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db"
+ },
+ "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+ "provStatus": "Prov Status",
+ "orchStatus": "Active",
+ "inMaint": true
+ }
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1fshmc": {
+ "instanceName": "VFinstancename",
+ "volumeGroupName": "VFinstancename_vol_abc",
+ "orchStatus": "Create",
+ "provStatus": "Prov Status",
+ "inMaint": false,
+ "modelInfo": {
+ "modelInvariantId": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "modelName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "modelVersion": "6",
+ "modelCustomizationId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5"
+ },
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5"
+ }
+ }
+ },
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "lcpCloudRegionId": "JANET25",
+ "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+ "lineOfBusiness": "ONAP",
+ "platformName": "platform",
+ "modelInfo": {
+ "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "modelVersionId": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "modelName": "2017-488_ADIOD-vPE",
+ "modelVersion": "5.0",
+ "modelCustomizationId": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+ "modelCustomizationName": "2017-488_ADIOD-vPE 0",
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09"
+ },
+ "orchStatus": "Created",
+ "inMaint": false,
+ "instanceName": "2017488_ADIODvPEVNFinstancename",
+ "legacyRegion": "some legacy region"
+ },
+ "2017-488_ADIOD-vPE 0:0001": {
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0uvfot": {
+ "instanceName": "VFinstancenameZERO_001",
+ "provStatus": "Prov Status",
+ "inMaint": true,
+ "modelInfo": {
+ "modelInvariantId": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+ "modelVersionId": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+ "modelName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "modelVersion": "5",
+ "modelCustomizationId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db"
+ },
+ "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db"
+ }
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1fshmc": {
+ "instanceName": "VFinstancename_001",
+ "volumeGroupName": "VFinstancename_vol_abc_001",
+ "modelInfo": {
+ "modelInvariantId": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "modelName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "modelVersion": "6",
+ "modelCustomizationId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5"
+ },
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5"
+ }
+ }
+ },
+
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "lcpCloudRegionId": "JANET25",
+ "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+ "lineOfBusiness": "ONAP",
+ "platformName": "platform",
+ "modelInfo": {
+ "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "modelVersionId": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "modelName": "2017-488_ADIOD-vPE",
+ "modelVersion": "5.0",
+ "modelCustomizationId": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+ "modelCustomizationName": "2017-488_ADIOD-vPE 0",
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09"
+ },
+ "instanceName": "2017488_ADIODvPEVNFinstancename_001",
+ "legacyRegion": "some legacy region"
+ },
+ "2017-488_ADIOD-vPE 0:0002": {
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0uvfot": {
+ "instanceName": "VFinstancenameZERO_002",
+ "modelInfo": {
+ "modelInvariantId": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+ "modelVersionId": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+ "modelName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "modelVersion": "5",
+ "modelCustomizationId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db"
+ },
+ "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db"
+ }
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1fshmc": {
+ "instanceName": "VFinstancename_002",
+ "volumeGroupName": "VFinstancename_vol_abc_002",
+ "modelInfo": {
+ "modelInvariantId": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "modelName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "modelVersion": "6",
+ "modelCustomizationId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5"
+ },
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5"
+ }
+ }
+ },
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "lcpCloudRegionId": "JANET25",
+ "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+ "lineOfBusiness": "ONAP",
+ "platformName": "platform",
+ "modelInfo": {
+ "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "modelVersionId": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "modelName": "2017-488_ADIOD-vPE",
+ "modelVersion": "5.0",
+ "modelCustomizationId": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+ "modelCustomizationName": "2017-488_ADIOD-vPE 0",
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09"
+ },
+ "instanceName": "2017488_ADIODvPEVNFinstancename_002",
+ "legacyRegion": "some legacy region"
+ }
+ },
+ "vnfGroups": {},
+ "existingVnfGroupCounterMap": {},
+ "validationCounter": 0,
+ "existingVNFCounterMap": {
+ "afacccf6-397d-45d6-b5ae-94c39734b168": 1,
+ "69e09f68-8b63-4cc9-b9ff-860960b5db09": 3
+ },
+ "existingNetworksCounterMap": {},
+ "instanceName": "mCaNkinstancename",
+ "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "subscriptionServiceType": "TYLER SILVIA",
+ "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+ "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "lcpCloudRegionId": "hvf6",
+ "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054",
+ "aicZoneId": "NFT1",
+ "projectName": "WATKINS",
+ "rollbackOnFailure": "true",
+ "aicZoneName": "NFTJSSSS-NFT1",
+ "owningEntityName": "WayneHolland",
+ "tenantName": "AIN Web Tool-15-D-testalexandria",
+ "modelInfo": {
+ "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "modelVersionId": "6b528779-44a3-4472-bdff-9cd15ec93450",
+ "modelName": "action-data",
+ "modelVersion": "1.0",
+ "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450"
+ },
+ "isALaCarte": false,
+ "orchStatus": "Active",
+ "modelInavariantId": "6b528779-44a3-4472-bdff-9cd15ec93450"
+ }));
+ });
+
+});
diff --git a/vid-webpack-master/src/app/shared/resolvers/retry/retry.resolver.ts b/vid-webpack-master/src/app/shared/resolvers/retry/retry.resolver.ts
new file mode 100644
index 000000000..5e2250ad7
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/resolvers/retry/retry.resolver.ts
@@ -0,0 +1,27 @@
+import {ActivatedRouteSnapshot, Resolve} from "@angular/router";
+import {Injectable} from "@angular/core";
+import {Observable} from "rxjs";
+import {AaiService} from "../../services/aaiService/aai.service";
+import {forkJoin} from "rxjs/observable/forkJoin";
+import {AppState} from "../../store/reducers";
+import {NgRedux} from "@angular-redux/store";
+import {createServiceInstance} from "../../storeUtil/utils/service/service.actions";
+
+@Injectable()
+export class RetryResolver implements Resolve<Observable<boolean>> {
+
+ constructor(private _aaiService: AaiService, private _store: NgRedux<AppState>) {}
+
+ resolve(route: ActivatedRouteSnapshot): Observable<boolean> {
+ const serviceModelId: string = route.queryParamMap.get("serviceModelId");
+ const jobId: string = route.queryParamMap.get("jobId");
+
+ let serviceModelApi = this._aaiService.getServiceModelById(serviceModelId);
+
+ let serviceInstanceApi = this._aaiService.retrieveAndStoreServiceInstanceRetryTopology(jobId, serviceModelId);
+ return forkJoin([serviceModelApi, serviceInstanceApi]).map(([serviceModel, serviceInstance ]) => {
+ this._store.dispatch(createServiceInstance( serviceInstance, serviceModelId));
+ return true;
+ });
+ }
+}
diff --git a/vid-webpack-master/src/app/shared/resolvers/viewEdit/viewEdit.resolver.spec.ts b/vid-webpack-master/src/app/shared/resolvers/viewEdit/viewEdit.resolver.spec.ts
new file mode 100644
index 000000000..6e8fdc757
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/resolvers/viewEdit/viewEdit.resolver.spec.ts
@@ -0,0 +1,82 @@
+import {getTestBed, TestBed} from '@angular/core/testing';
+import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing';
+import {NgRedux} from "@angular-redux/store";
+import {ViewEditResolver} from "./viewEdit.resolver";
+import {AaiService} from "../../services/aaiService/aai.service";
+import {FeatureFlagsService} from "../../services/featureFlag/feature-flags.service";
+import {ActivatedRouteSnapshot, convertToParamMap} from "@angular/router";
+import {AppState} from "../../store/reducers";
+import {UpdateDrawingBoardStatusAction} from "../../storeUtil/utils/global/global.actions";
+
+class MockAppStore<T> {
+ getState() {
+ return {
+ global:{
+ drawingBoardStatus: "VIEW"
+ },
+ service: {
+ serviceInstance: {}
+ }
+ }
+ }
+ dispatch(){
+
+ }
+}
+
+
+describe('View Edit resolver', () => {
+ let injector;
+ let aaiService: AaiService;
+ let resolver: ViewEditResolver;
+ let httpMock: HttpTestingController;
+ let store : NgRedux<AppState>;
+
+ let activatedRouteSnapshot: ActivatedRouteSnapshot;
+ let updateDrawingBoardStatusAction: UpdateDrawingBoardStatusAction;
+
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+ imports: [HttpClientTestingModule],
+ providers: [
+ ViewEditResolver,
+ AaiService,
+ FeatureFlagsService,
+ {provide: NgRedux, useClass: MockAppStore},
+ {
+ provide: ActivatedRouteSnapshot, useValue: {
+ queryParamMap:
+ convertToParamMap({
+ serviceModelId: 'serviceModelId',
+ subscriberId: 'subscriberId',
+ serviceType: 'serviceType',
+ serviceInstanceId : 'serviceInstanceId'
+ })
+ },
+
+ }
+ ]
+ });
+ await TestBed.compileComponents();
+
+ injector = getTestBed();
+ aaiService = injector.get(AaiService);
+ resolver = injector.get(ViewEditResolver);
+ httpMock = injector.get(HttpTestingController);
+ activatedRouteSnapshot = injector.get(ActivatedRouteSnapshot);
+ store = injector.get(NgRedux)
+
+ })().then(done).catch(done.fail));
+
+
+ test('should call both api', () => {
+ // spyOn(aaiService, 'getServiceModelById');
+ // spyOn(aaiService, 'retrieveAndStoreServiceInstanceTopology');
+ // spyOn(store, 'dispatch');
+ // resolver.resolve(activatedRouteSnapshot);
+ //
+ // expect(aaiService.getServiceModelById).toHaveBeenCalledWith('serviceModelId');
+ // expect(aaiService.retrieveAndStoreServiceInstanceTopology).toHaveBeenCalledWith('serviceInstanceId', 'subscriberId', 'serviceType', 'serviceModelId');
+ });
+
+});
diff --git a/vid-webpack-master/src/app/shared/resolvers/viewEdit/viewEdit.resolver.ts b/vid-webpack-master/src/app/shared/resolvers/viewEdit/viewEdit.resolver.ts
new file mode 100644
index 000000000..d4aef1937
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/resolvers/viewEdit/viewEdit.resolver.ts
@@ -0,0 +1,40 @@
+import {ActivatedRouteSnapshot, Resolve} from "@angular/router";
+import {Injectable} from "@angular/core";
+import {Observable} from "rxjs";
+import {AaiService} from "../../services/aaiService/aai.service";
+import {forkJoin} from "rxjs/observable/forkJoin";
+import {AppState} from "../../store/reducers";
+import {NgRedux} from "@angular-redux/store";
+import {createServiceInstance} from "../../storeUtil/utils/service/service.actions";
+
+@Injectable()
+export class ViewEditResolver implements Resolve<Observable<boolean>> {
+
+ constructor(private _aaiService: AaiService, private _store: NgRedux<AppState>) {
+ }
+
+ resolve(route: ActivatedRouteSnapshot): Observable<boolean> {
+ const serviceModeId: string = route.queryParamMap.get("serviceModelId");
+ const serviceInstanceId: string = route.queryParamMap.get("serviceInstanceId");
+ const subscriberId: string = route.queryParamMap.get("subscriberId");
+ const serviceType: string = route.queryParamMap.get("serviceType");
+ let serviceModelApi = this._aaiService.getServiceModelById(serviceModeId);
+ let serviceInstanceApi = this._aaiService.retrieveAndStoreServiceInstanceTopology(serviceInstanceId, subscriberId, serviceType, serviceModeId);
+ return forkJoin([serviceModelApi, serviceInstanceApi]).map(([serviceModel, serviceInstance ]) => {
+ this.setIsALaCarte(serviceInstance,serviceModel.service.instantiationType );
+ this.setTestApi(serviceInstance);
+ this._store.dispatch(createServiceInstance( serviceInstance, serviceModeId));
+ return true;
+ });
+ }
+
+ setTestApi = (service: any) => {
+ if (this._store.getState().global.flags['FLAG_ADD_MSO_TESTAPI_FIELD'] && service.isALaCarte) {
+ service.testApi = sessionStorage.getItem("msoRequestParametersTestApiValue");
+ }
+ };
+ setIsALaCarte = (service: any, instantiationType) => {
+ service.isALaCarte = instantiationType === 'A-La-Carte';
+ };
+
+}
diff --git a/vid-webpack-master/src/app/shared/server/healthStatusService/health-status.service.spec.ts b/vid-webpack-master/src/app/shared/server/healthStatusService/health-status.service.spec.ts
deleted file mode 100644
index 36f6349e2..000000000
--- a/vid-webpack-master/src/app/shared/server/healthStatusService/health-status.service.spec.ts
+++ /dev/null
@@ -1,60 +0,0 @@
-import {TestBed, inject, getTestBed} from '@angular/core/testing';
-
-import { HealthStatusService } from './health-status.service';
-import {Constants} from "../../utils/constants";
-import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing";
-import {ExternalComponentStatus} from "../../models/externalComponentStatus";
-
-describe('HealthStatusService', () => {
-
- let injector;
- let service: HealthStatusService;
- let httpMock: HttpTestingController;
-
- beforeEach(() => {
- TestBed.configureTestingModule({
- imports: [HttpClientTestingModule],
- providers: [HealthStatusService]
- });
-
- injector = getTestBed();
- service = injector.get(HealthStatusService);
- httpMock = injector.get(HttpTestingController);
- });
-
- describe('#getProbe', () =>{
- it('when call probe, there is http GET with right url', () => {
-
- service.getProbe().subscribe((result: Array<ExternalComponentStatus>)=>{
- expect(result[0].component).toEqual("AAI");
- expect(result[0].available).toBeTruthy();
- expect(result[0].metadata).toEqual({ myKey: 'myValue' });
-
- expect(result[1].component).toEqual("MSO");
- expect(result[1].available).toBeFalsy();
- expect(result[1].metadata).toEqual({otherKey: 123});
- });
-
- const req = httpMock.expectOne(Constants.Path.SERVICES_PROBE_PATH);
- expect(req.request.method).toEqual('GET');
- req.flush([
- {
- "component": "AAI",
- "available": true,
- "metadata": {
- "myKey": "myValue"
- }
- },
- {
- "component": "MSO",
- "available": false,
- "metadata": {
- "otherKey": 123
- }
- },
- ]);
- });
-
- });
-
-});
diff --git a/vid-webpack-master/src/app/shared/server/healthStatusService/health-status.service.ts b/vid-webpack-master/src/app/shared/server/healthStatusService/health-status.service.ts
index 4305ab97e..71e32f1d4 100644
--- a/vid-webpack-master/src/app/shared/server/healthStatusService/health-status.service.ts
+++ b/vid-webpack-master/src/app/shared/server/healthStatusService/health-status.service.ts
@@ -1,6 +1,6 @@
import { Injectable } from '@angular/core';
import {HttpClient} from "@angular/common/http";
-import {Observable} from "rxjs/Observable";
+import {Observable} from "rxjs";
import {Constants} from "../../utils/constants";
import {ExternalComponentStatus} from "../../models/externalComponentStatus";
@@ -10,8 +10,8 @@ export class HealthStatusService {
constructor(private _http: HttpClient) {
}
- getProbe(): Observable<Array<ExternalComponentStatus>> {
+ getProbe(): Observable<ExternalComponentStatus[]> {
let pathQuery = Constants.Path.SERVICES_PROBE_PATH;
- return this._http.get<Array<ExternalComponentStatus>>(pathQuery).map(res => res);
+ return this._http.get<ExternalComponentStatus[]>(pathQuery).map(res => res);
}
}
diff --git a/vid-webpack-master/src/app/shared/server/serviceInfo/AuditStatus.model.ts b/vid-webpack-master/src/app/shared/server/serviceInfo/AuditStatus.model.ts
index 0b4c70f9d..a0920a902 100644
--- a/vid-webpack-master/src/app/shared/server/serviceInfo/AuditStatus.model.ts
+++ b/vid-webpack-master/src/app/shared/server/serviceInfo/AuditStatus.model.ts
@@ -6,5 +6,7 @@ export class AuditStatus{
jobStatus :string;
source: string;
requestId: string;
- additionalInfo :any
+ additionalInfo :any;
+ instanceName: string;
+ instanceType : string;
}
diff --git a/vid-webpack-master/src/app/shared/server/serviceInfo/serviceInfo.model.ts b/vid-webpack-master/src/app/shared/server/serviceInfo/serviceInfo.model.ts
index 0b4695930..a507e073e 100644
--- a/vid-webpack-master/src/app/shared/server/serviceInfo/serviceInfo.model.ts
+++ b/vid-webpack-master/src/app/shared/server/serviceInfo/serviceInfo.model.ts
@@ -1,4 +1,5 @@
import {ServiceStatus} from '../../../instantiationStatus/instantiationStatus.component.service';
+import {ServiceAction} from "../../models/serviceInstanceActions";
export class ServiceInfoModel {
id: number;
@@ -9,6 +10,8 @@ export class ServiceInfoModel {
numRow: number;
uuid: string;
userId: string;
+ requestId: string;
+ aLaCarte: boolean;
jobStatus: string;
pause: boolean;
owningEntityId: string;
@@ -22,6 +25,7 @@ export class ServiceInfoModel {
regionName: string;
serviceType: string;
subscriberName: string;
+ subscriberId: string;
serviceInstanceId: string;
serviceInstanceName: string;
serviceModelId: string;
@@ -30,6 +34,8 @@ export class ServiceInfoModel {
templateId: string;
auditUserId: string;
jobId: string;
+ action: ServiceAction;
+ isRetryEnabled: boolean;
}
export class ServiceInfoUiModel extends ServiceInfoModel{
diff --git a/vid-webpack-master/src/app/shared/server/serviceInfo/serviceInfo.service.spec.ts b/vid-webpack-master/src/app/shared/server/serviceInfo/serviceInfo.service.spec.ts
index 78c1b5ab9..147434b1a 100644
--- a/vid-webpack-master/src/app/shared/server/serviceInfo/serviceInfo.service.spec.ts
+++ b/vid-webpack-master/src/app/shared/server/serviceInfo/serviceInfo.service.spec.ts
@@ -9,59 +9,75 @@ describe('Service Info Service', () => {
let service: ServiceInfoService;
let httpMock: HttpTestingController;
- beforeEach(() => {
+ beforeAll(done => (async () => {
TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
providers: [ServiceInfoService]
});
+ await TestBed.compileComponents();
+
injector = getTestBed();
service = injector.get(ServiceInfoService);
httpMock = injector.get(HttpTestingController);
- });
- describe('#getServicesJobInfo', () => {
- it('should return an Observable<ServiceInfoModel[]>', () => {
- const dummyServiceInfo: ServiceInfoModel[] = generateServiceInfoData();
+ })().then(done).catch(done.fail));
- service.getServicesJobInfo(true).subscribe((serviceInfo:Array<ServiceInfoModel>) => {
- expect(serviceInfo).toEqual(dummyServiceInfo);
- });
- });
+ describe('#getMacroJobAuditStatus', ()=> {
+ test('should return Observable<Object[]>', ()=>{
+ let job: ServiceInfoModel = new ServiceInfoModel();
+ job.jobId = '111';
+ service.getJobAuditStatus(job).subscribe();
+ const req = httpMock.expectOne(Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + job.jobId + '?source=VID');
+ const req2 = httpMock.expectOne(Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + job.jobId + '?source=MSO');
+ expect(req.request.method).toBe('GET');
+ expect(req2.request.method).toBe('GET');
+ });
});
- describe('#deleteJob', () =>{
- it('delete job', () => {
- const jobId : string = "1111";
-
- service.deleteJob(jobId).subscribe();
+ describe('#getALaCarteJobAuditStatus Without params', ()=> {
+ test('should return Observable<Object[]>', ()=>{
+ let job: ServiceInfoModel = new ServiceInfoModel();
+ job.aLaCarte = true;
+ job.jobId = '111';
- const req = httpMock.expectOne(Constants.Path.SERVICES_JOB_INFO_PATH + '/job/' + jobId);
- expect(req.request.method).toEqual('DELETE');
+ service.getJobAuditStatus(job).subscribe();
+ const req = httpMock.expectOne(Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + job.jobId + '?source=VID');
+ const req2 = httpMock.expectOne(Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + job.jobId + '/mso');
+ expect(req.request.method).toEqual('GET');
+ expect(req2.request.method).toEqual('GET');
});
});
- describe('#hideJob', () =>{
- it('when call hide job, there is http POST with right url', () => {
- const jobId : string = "3";
+ describe('#getALaCarteJobAuditStatus With ServiceInstanceId', ()=> {
+ test('should return Observable<Object[]>', ()=>{
+ let job: ServiceInfoModel = new ServiceInfoModel();
+ job.aLaCarte = true;
+ job.jobId = '111';
+ job.serviceInstanceId = '222';
- service.hideJob(jobId).subscribe();
+ service.getJobAuditStatus(job).subscribe();
+ const req = httpMock.expectOne(Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + job.jobId + '?source=VID');
+ const req2 = httpMock.expectOne(Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + job.jobId + '/mso?serviceInstanceId=' + job.serviceInstanceId);
- const req = httpMock.expectOne(Constants.Path.SERVICES_JOB_INFO_PATH + '/hide/' + jobId);
- expect(req.request.method).toEqual('POST');
+ expect(req.request.method).toEqual('GET');
+ expect(req2.request.method).toEqual('GET');
});
});
- describe('#getJobAuditStatus', ()=> {
- it('should return Observable<Object[]>', ()=>{
- const jobId : string = '111';
+ describe('#getALaCarteJobAuditStatus With RequestId', ()=> {
+ test('should return Observable<Object[]>', ()=>{
+ let job: ServiceInfoModel = new ServiceInfoModel();
+ job.aLaCarte = true;
+ job.jobId = '111';
+ job.requestId = '333';
- service.getJobAuditStatus(jobId).subscribe();
- const req = httpMock.expectOne(Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + jobId + '?source=VID');
- const req2 = httpMock.expectOne(Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + jobId + '?source=MSO');
+ service.getJobAuditStatus(job).subscribe();
+ const req = httpMock.expectOne(Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + job.jobId + '?source=VID');
+ const req2 = httpMock.expectOne(Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + job.jobId + '/mso?requestId=' + job.requestId);
expect(req.request.method).toEqual('GET');
expect(req2.request.method).toEqual('GET');
@@ -73,6 +89,7 @@ describe('Service Info Service', () => {
[{
"created": 1519956533000,
"modified": 1521727738000,
+ "action": "INSTANTIATE",
"createdId": null,
"modifiedId": null,
"rowNum": null,
@@ -105,6 +122,7 @@ describe('Service Info Service', () => {
{
"created": 1519956533000,
"modified": 1521727738000,
+ "action": "INSTANTIATE",
"createdId": null,
"modifiedId": null,
"rowNum": null,
@@ -137,6 +155,7 @@ describe('Service Info Service', () => {
{
"created": 1519956533000,
"modified": 1521727738000,
+ "action": "INSTANTIATE",
"createdId": null,
"modifiedId": null,
"rowNum": null,
@@ -169,6 +188,7 @@ describe('Service Info Service', () => {
{
"created": 1519956533000,
"modified": 1521727738000,
+ "action": "INSTANTIATE",
"createdId": null,
"modifiedId": null,
"rowNum": null,
@@ -201,6 +221,7 @@ describe('Service Info Service', () => {
{
"created": 1519956533000,
"modified": 1521727738000,
+ "action": "INSTANTIATE",
"createdId": null,
"modifiedId": null,
"rowNum": null,
diff --git a/vid-webpack-master/src/app/shared/server/serviceInfo/serviceInfo.service.ts b/vid-webpack-master/src/app/shared/server/serviceInfo/serviceInfo.service.ts
index e0057bb4d..fe6ebc7ee 100644
--- a/vid-webpack-master/src/app/shared/server/serviceInfo/serviceInfo.service.ts
+++ b/vid-webpack-master/src/app/shared/server/serviceInfo/serviceInfo.service.ts
@@ -1,19 +1,23 @@
import {Injectable} from '@angular/core';
-import {Observable} from 'rxjs/Observable';
+import {Observable} from 'rxjs';
import {ServiceInfoModel} from './serviceInfo.model';
-import {HttpClient} from '@angular/common/http';
-import 'rxjs/add/operator/map'
+import {HttpClient, HttpHeaders} from '@angular/common/http';
+import { of } from 'rxjs';
+import { map } from 'rxjs/operators';
import {Constants} from '../../utils/constants';
import {forkJoin} from "rxjs/observable/forkJoin";
+import * as _ from 'lodash';
+import {AuditStatus} from "./AuditStatus.model";
@Injectable()
export class ServiceInfoService {
constructor(private _http: HttpClient) {
}
- getServicesJobInfo(filterByUser : boolean): Observable<ServiceInfoModel[]> {
+ getServicesJobInfo(filterByUser : boolean, showSpinner: boolean = true): Observable<ServiceInfoModel[]> {
let pathQuery = Constants.Path.SERVICES_JOB_INFO_PATH;
- return this._http.get<ServiceInfoModel[]>(pathQuery).map(res => res );
+ let headers = new HttpHeaders({'x-show-spinner': showSpinner.toString()});
+ return this._http.get<ServiceInfoModel[]>(pathQuery, { headers: headers }).map(res => res );
}
deleteJob(jobId: string): Observable<any> {
@@ -26,13 +30,42 @@ export class ServiceInfoService {
return this._http.post<any>(pathQuery, null).map(res => res);
}
- getJobAuditStatus(jobId : string) : Observable<Object[]>{
- let pathQueryVID = Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + jobId + '?source=VID';
- let pathQueryMSO = Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + jobId + '?source=MSO';
+ getJobAuditStatus(jobData: ServiceInfoModel) : Observable<Object[]>{
+ let pathQueryBySource: string = Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + jobData.jobId + '?source=';
+ let pathQueryVID: string = pathQueryBySource + 'VID';
+ let pathQueryMSO: string;
+
+ // just call it
+ if(jobData.aLaCarte) {
+ let requestParams: string[] = [];
+ pathQueryMSO = Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + jobData.jobId + '/mso';
+ if (!_.isEmpty(jobData.requestId)) {
+ requestParams[requestParams.length] = 'requestId=' + jobData.requestId;
+ }
+ if (!_.isEmpty(jobData.serviceInstanceId)) {
+ requestParams[requestParams.length] = 'serviceInstanceId=' + jobData.serviceInstanceId;
+ }
+ if (requestParams.length > 0) {
+ pathQueryMSO += '?' + requestParams.join('&');
+ }
+ }
+ else {
+ pathQueryMSO = pathQueryBySource + 'MSO';
+ }
+
let vidObs = this._http.get(pathQueryVID);
let msoObs = this._http.get(pathQueryMSO);
return forkJoin([vidObs, msoObs]);
}
+ getInstanceAuditStatus(instanceId: string, type :string) : Observable<AuditStatus[]>{
+ let pathQuery: string = Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + type + '/' + instanceId + '/mso';
+ return this._http.get<any>(pathQuery).map(res => res);
+ }
+
+ getAuditStatusForRetry(trackById: string) : Observable<AuditStatus>{
+ let pathQuery: string = Constants.Path.AUDIT_STATUS_FOR_RETRY_PATH + '/' + trackById ;
+ return this._http.get<any>(pathQuery).map(res => res);
+ }
}
diff --git a/vid-webpack-master/src/app/services/aaiService/aai.actions.ts b/vid-webpack-master/src/app/shared/services/aaiService/aai.actions.ts
index 649fb1456..dc234bd61 100644
--- a/vid-webpack-master/src/app/services/aaiService/aai.actions.ts
+++ b/vid-webpack-master/src/app/shared/services/aaiService/aai.actions.ts
@@ -50,8 +50,10 @@ export const loadUserId: ActionCreator<LoadUserId> =
export const loadLcpTenant: ActionCreator<LoadLcpTenant> =
- () => ({
+ (subscriberId : string, serviceType : string) => ({
type: LOAD_LCP_TENANT,
+ subscriberId : subscriberId,
+ serviceType : serviceType
});
diff --git a/vid-webpack-master/src/app/services/aaiService/aai.epics.ts b/vid-webpack-master/src/app/shared/services/aaiService/aai.epics.ts
index 5249cea82..a850d55da 100644
--- a/vid-webpack-master/src/app/services/aaiService/aai.epics.ts
+++ b/vid-webpack-master/src/app/shared/services/aaiService/aai.epics.ts
@@ -1,6 +1,5 @@
-import {updateServiceInstance} from './../../service.actions';
import {Injectable} from '@angular/core';
-import {createEpicMiddleware} from 'redux-observable';
+import {combineEpics, createEpicMiddleware, ofType} from 'redux-observable';
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/do';
@@ -15,11 +14,15 @@ import {
LOAD_USER_ID
} from "./aai.actions";
import {AaiService} from "./aai.service";
+import {AppState} from "../../store/reducers";
import {
- updateAicZones, updateCategoryParameters, updateLcpRegionsAndTenants, updateNetworkCollectionFunction,
+ updateAicZones, updateCategoryParameters,
+ updateLcpRegionsAndTenants,
+ updateNetworkCollectionFunction,
updateProductFamilies, updateUserId
-} from "../../service.actions";
-import {AppState} from "../../store/reducers";
+} from "../../storeUtil/utils/general/general.actions";
+import {createServiceInstance} from "../../storeUtil/utils/service/service.actions";
+import {delay, mapTo} from "rxjs/operators";
const notFetchedAlready = (state: AppState): boolean => state.service.productFamilies !== null;
@@ -29,23 +32,20 @@ export class AAIEpics {
}
public createEpic() {
- return [createEpicMiddleware(this.loadProductFamiliesEpic)
- , createEpicMiddleware(this.loadLcpTenants)
- , createEpicMiddleware(this.loadAicZones)
- , createEpicMiddleware(this.loadCategoryParameters)
- , createEpicMiddleware(this.loadServiceAccordingToUuid)
- , createEpicMiddleware(this.loadNetworkAccordingToNetworkFunction)
- , createEpicMiddleware(this.loadUserId)
- ];
+ return combineEpics(
+ this.loadProductFamiliesEpic
+ , this.loadLcpTenants
+ , this.loadAicZones
+ , this.loadCategoryParameters
+ , this.loadServiceAccordingToUuid
+ , this.loadNetworkAccordingToNetworkFunction
+ , this.loadUserId)
}
private loadLcpTenants = (action$, store) =>
- action$
- .ofType(LOAD_LCP_TENANT)
- .switchMap(() => this
- .aaiService
- .getLcpRegionsAndTenants('e433710f-9217-458d-a79d-1c7aff376d89', 'VIRTUAL USP')
- .map(data => updateLcpRegionsAndTenants(data)));
+ action$.ofType(LOAD_LCP_TENANT)
+ .switchMap((action) => this.aaiService.getLcpRegionsAndTenants(action.subscriberId, action.serviceType)
+ .map(data => updateLcpRegionsAndTenants(data)));
private loadProductFamiliesEpic = (action$, store) => action$
.ofType(LOAD_PRODUCT_FAMILIES)
@@ -64,7 +64,7 @@ export class AAIEpics {
private loadServiceAccordingToUuid = (action$, store) => action$
.ofType(LOAD_SERVICE_MDOEL_BY_UUID)
.switchMap((action) => this.aaiService.getServiceModelById(action.modelId)
- .map(data => updateServiceInstance(action.uuid, data)));
+ .map(data => createServiceInstance(action.uuid, data)));
private loadUserId = (action$, store) => action$
.ofType(LOAD_USER_ID)
diff --git a/vid-webpack-master/src/app/shared/services/aaiService/aai.service.spec.ts b/vid-webpack-master/src/app/shared/services/aaiService/aai.service.spec.ts
new file mode 100644
index 000000000..9f19f6259
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/services/aaiService/aai.service.spec.ts
@@ -0,0 +1,497 @@
+import {ServiceInstance} from "../../models/serviceInstance";
+import {RootObject} from "./model/crawledAaiService";
+import {AaiService} from "./aai.service";
+import {instance, mock, when} from "ts-mockito";
+import {FeatureFlagsService, Features} from "../featureFlag/feature-flags.service";
+import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing";
+import {getTestBed, TestBed} from "@angular/core/testing";
+import {NgRedux} from "@angular-redux/store";
+import {Constants} from "../../utils/constants";
+import {AppState} from "../../store/reducers";
+import {setOptionalMembersVnfGroupInstance} from "../../storeUtil/utils/vnfGroup/vnfGroup.actions";
+import each from 'jest-each';
+
+class MockAppStore<T> {
+ dispatch(){}
+ getState(){}
+}
+
+describe("AaiService", () => {
+
+ let injector;
+ let httpMock: HttpTestingController;
+ let aaiService: AaiService;
+ let mockFeatureFlagsService: FeatureFlagsService = mock(FeatureFlagsService);
+ let store : NgRedux<AppState>;
+
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+ imports: [HttpClientTestingModule],
+ providers: [
+ AaiService,
+ {provide: NgRedux, useClass: MockAppStore},
+ {provide: FeatureFlagsService, useValue: instance(mockFeatureFlagsService)}
+ ]
+ });
+ await TestBed.compileComponents();
+
+ injector = getTestBed();
+ httpMock = injector.get(HttpTestingController);
+ aaiService = injector.get(AaiService);
+ store = injector.get(NgRedux);
+
+ })().then(done).catch(done.fail));
+
+
+
+ describe('#resolve tests', () => {
+ test('aai service resolve should return the right object', () => {
+ let serviceInstance = new ServiceInstance();
+ aaiService.resolve(aaiServiceInstnace.root, serviceInstance);
+
+ expectedResult.vnfs['DROR_vsp'].trackById = serviceInstance.vnfs['DROR_vsp'].trackById;
+ expect(JSON.parse(JSON.stringify(serviceInstance.vnfs))).toEqual(expectedResult.vnfs);
+ expect(JSON.parse(JSON.stringify(serviceInstance.networks))).toEqual(expectedResult.networks);
+ });
+ });
+
+ describe('#serviceInstanceTopology tests', () => {
+ test('aai service get serviceInstanceTopolgetServiceInstanceTopologyResult.jsonogy from backend, and return ServiceInstance', () => {
+
+ const mockedResult = getTopology();
+ const serviceInstanceId: string = "id";
+ const subscriberId: string = "fakeSunId";
+ const serviceType: string = "justServiceType";
+ aaiService.retrieveServiceInstanceTopology(serviceInstanceId, subscriberId, serviceType).subscribe((result: ServiceInstance) => {
+ expect(result.instanceName).toEqual("mCaNkinstancename");
+ expect(result.modelInavariantId).toEqual("6b528779-44a3-4472-bdff-9cd15ec93450");
+ expect(result.vnfs["2017-388_ADIOD-vPE 0"].instanceName).toEqual("2017388_ADIODvPEmCaNkinstanceName");
+ expect(result.vnfs["2017-488_ADIOD-vPE 0"].
+ vfModules["2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0"]
+ ["2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0uvfot"].instanceName
+ ).toEqual("VFinstancenameZERO");
+ });
+
+ const req = httpMock.expectOne(`${Constants.Path.AAI_GET_SERVICE_INSTANCE_TOPOLOGY_PATH}${subscriberId}/${serviceType}/${serviceInstanceId}`);
+ expect(req.request.method).toEqual('GET');
+ req.flush(mockedResult);
+ });
+ });
+
+
+ describe('#retrieveAndStoreServiceInstanceRetryTopology tests', () => {
+ test('aai service get retrieveAndStoreServiceInstanceRetryTopology.jsonogy from backend, and return ServiceInstance', () => {
+
+ let mockedResult = getTopology();
+
+ const jobId: string = "jobId";
+ aaiService.retrieveServiceInstanceRetryTopology(jobId).subscribe((result: ServiceInstance) => {
+ expect(result.instanceName).toEqual("mCaNkinstancename");
+ expect(result.modelInavariantId).toEqual("6b528779-44a3-4472-bdff-9cd15ec93450");
+ expect(result.vnfs["2017-388_ADIOD-vPE 0"].instanceName).toEqual("2017388_ADIODvPEmCaNkinstanceName");
+ expect(result.vnfs["2017-488_ADIOD-vPE 0"].
+ vfModules["2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0"]
+ ["2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0uvfot"].instanceName
+ ).toEqual("VFinstancenameZERO");
+ });
+
+ const req = httpMock.expectOne(`${Constants.Path.SERVICES_RETRY_TOPOLOGY}/${jobId}`);
+ expect(req.request.method).toEqual('GET');
+ req.flush(mockedResult);
+ });
+ });
+
+ describe('# get optional group members tests', () =>{
+ test('aai service get getOptionalGroupMembers and return list of VnfMember', () => {
+ jest.spyOn(store, 'dispatch');
+ jest.spyOn(store, 'getState').mockReturnValue({
+ service :{
+ serviceInstance : {
+ "serviceModelId" : {
+ optionalGroupMembersMap : {}
+ }
+ }
+ }
+ });
+ const mockedResult = getMockMembers();
+ const serviceInvariantId: string = "serviceInvariantId";
+ const subscriberId: string = "subscriberId";
+ const serviceType: string = "serviceType";
+ const groupType: string = "groupType";
+ const groupRole: string = "groupRole";
+ const serviceModelId: string = "serviceModelId";
+ aaiService.getOptionalGroupMembers(serviceModelId, subscriberId, serviceType, serviceInvariantId, groupType, groupRole).subscribe((res)=>{
+ const path = `${Constants.Path.AAI_GET_SERVICE_GROUP_MEMBERS_PATH}${subscriberId}/${serviceType}/${serviceInvariantId}/${groupType}/${groupRole}`;
+ expect(store.dispatch).toHaveBeenCalledWith(setOptionalMembersVnfGroupInstance(serviceModelId, path, res));
+ expect(res.length).toEqual(2);
+ });
+
+
+ const req = httpMock.expectOne(`${Constants.Path.AAI_GET_SERVICE_GROUP_MEMBERS_PATH}${subscriberId}/${serviceType}/${serviceInvariantId}/${groupType}/${groupRole}`);
+ expect(req.request.method).toEqual('GET');
+ req.flush(mockedResult);
+ });
+ });
+ describe('#cloud owner tests', () => {
+ let featureFlagToLcpRegionName = [
+ ['aai service extract lcpRegion, flag is true=> lcp region include cloud owner', true, 'id (OWNER)' ],
+ ['aai service extract lcpRegion, flag is false=> lcp region doesnt include cloud owner', false, 'id']
+ ];
+
+ each(featureFlagToLcpRegionName).test("%s", (desc: string, flag: boolean, expectedName: string ) => {
+ when(mockFeatureFlagsService.getFlagState(Features.FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST)).thenReturn(flag);
+ let name: string = aaiService.extractLcpRegionName("id", "att-owner");
+ expect(name).toEqual(expectedName);
+ });
+
+ let cloudOwnerFormattingDataProvider = [
+ ['classic cloud owner', 'irma-aic', ' (AIC)'],
+ ['upper case cloud owner', 'IRMA-AIC', ' (AIC)'],
+ ['no att cloud owner', 'nc', ' (NC)'],
+ ];
+
+ each(cloudOwnerFormattingDataProvider).test('test cloudOwner trailer formatting %s', (desc: string, cloudOwner: string, expectedTrailer: string) => {
+ expect(AaiService.formatCloudOwnerTrailer(cloudOwner)).toEqual(expectedTrailer);
+ });
+ });
+
+ function getTopology() {
+ return {
+ "vnfs": {
+ "2017-388_ADIOD-vPE 0": {
+ "vfModules": {},
+ "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168",
+ "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "lcpCloudRegionId": "JANET25",
+ "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+ "lineOfBusiness": "ONAP",
+ "platformName": "platform",
+ "modelInfo": {
+ "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "modelVersionId": "afacccf6-397d-45d6-b5ae-94c39734b168",
+ "modelName": "2017-388_ADIOD-vPE",
+ "modelVersion": "4.0",
+ "modelCustomizationId": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c",
+ "modelCustomizationName": "2017-388_ADIOD-vPE 0",
+ "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168"
+ },
+ "instanceName": "2017388_ADIODvPEmCaNkinstanceName",
+ "legacyRegion": "some legacy region"
+ },
+ "2017-488_ADIOD-vPE 0": {
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0uvfot": {
+ "instanceName": "VFinstancenameZERO",
+ "modelInfo": {
+ "modelInvariantId": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+ "modelVersionId": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+ "modelName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "modelVersion": "5",
+ "modelCustomizationId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db"
+ },
+ "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+ "provStatus": "Prov Status",
+ "orchStatus": "Active",
+ "inMaint": true
+ }
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1fshmc": {
+ "instanceName": "VFinstancename",
+ "volumeGroupName": "VFinstancename_vol_abc",
+ "orchStatus": "Create",
+ "provStatus": "Prov Status",
+ "inMaint": false,
+ "modelInfo": {
+ "modelInvariantId": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "modelName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "modelVersion": "6",
+ "modelCustomizationId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5"
+ },
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5"
+ }
+ }
+ },
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "lcpCloudRegionId": "JANET25",
+ "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+ "lineOfBusiness": "ONAP",
+ "platformName": "platform",
+ "modelInfo": {
+ "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "modelVersionId": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "modelName": "2017-488_ADIOD-vPE",
+ "modelVersion": "5.0",
+ "modelCustomizationId": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+ "modelCustomizationName": "2017-488_ADIOD-vPE 0",
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09"
+ },
+ "orchStatus": "Created",
+ "inMaint": false,
+ "instanceName": "2017488_ADIODvPEVNFinstancename",
+ "legacyRegion": "some legacy region"
+ },
+ "2017-488_ADIOD-vPE 0:0001": {
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0uvfot": {
+ "instanceName": "VFinstancenameZERO_001",
+ "provStatus": "Prov Status",
+ "inMaint": true,
+ "modelInfo": {
+ "modelInvariantId": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+ "modelVersionId": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+ "modelName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "modelVersion": "5",
+ "modelCustomizationId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db"
+ },
+ "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db"
+ }
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1fshmc": {
+ "instanceName": "VFinstancename_001",
+ "volumeGroupName": "VFinstancename_vol_abc_001",
+ "modelInfo": {
+ "modelInvariantId": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "modelName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "modelVersion": "6",
+ "modelCustomizationId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5"
+ },
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5"
+ }
+ }
+ },
+
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "lcpCloudRegionId": "JANET25",
+ "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+ "lineOfBusiness": "ONAP",
+ "platformName": "platform",
+ "modelInfo": {
+ "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "modelVersionId": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "modelName": "2017-488_ADIOD-vPE",
+ "modelVersion": "5.0",
+ "modelCustomizationId": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+ "modelCustomizationName": "2017-488_ADIOD-vPE 0",
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09"
+ },
+ "instanceName": "2017488_ADIODvPEVNFinstancename_001",
+ "legacyRegion": "some legacy region"
+ },
+ "2017-488_ADIOD-vPE 0:0002": {
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0uvfot": {
+ "instanceName": "VFinstancenameZERO_002",
+ "modelInfo": {
+ "modelInvariantId": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+ "modelVersionId": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+ "modelName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "modelVersion": "5",
+ "modelCustomizationId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db"
+ },
+ "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db"
+ }
+ },
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1fshmc": {
+ "instanceName": "VFinstancename_002",
+ "volumeGroupName": "VFinstancename_vol_abc_002",
+ "modelInfo": {
+ "modelInvariantId": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+ "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5",
+ "modelName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "modelVersion": "6",
+ "modelCustomizationId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5"
+ },
+ "uuid": "25284168-24bb-4698-8cb4-3f509146eca5"
+ }
+ }
+ },
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "lcpCloudRegionId": "JANET25",
+ "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+ "lineOfBusiness": "ONAP",
+ "platformName": "platform",
+ "modelInfo": {
+ "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "modelVersionId": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "modelName": "2017-488_ADIOD-vPE",
+ "modelVersion": "5.0",
+ "modelCustomizationId": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+ "modelCustomizationName": "2017-488_ADIOD-vPE 0",
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09"
+ },
+ "instanceName": "2017488_ADIODvPEVNFinstancename_002",
+ "legacyRegion": "some legacy region"
+ }
+ },
+ "vnfGroups": {},
+ "existingVnfGroupCounterMap": {},
+ "validationCounter": 0,
+ "existingVNFCounterMap": {
+ "afacccf6-397d-45d6-b5ae-94c39734b168": 1,
+ "69e09f68-8b63-4cc9-b9ff-860960b5db09": 3
+ },
+ "existingNetworksCounterMap": {},
+ "instanceName": "mCaNkinstancename",
+ "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "subscriptionServiceType": "TYLER SILVIA",
+ "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+ "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "lcpCloudRegionId": "hvf6",
+ "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054",
+ "aicZoneId": "NFT1",
+ "projectName": "WATKINS",
+ "rollbackOnFailure": "true",
+ "aicZoneName": "NFTJSSSS-NFT1",
+ "owningEntityName": "WayneHolland",
+ "tenantName": "AIN Web Tool-15-D-testalexandria",
+ "modelInfo": {
+ "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "modelVersionId": "6b528779-44a3-4472-bdff-9cd15ec93450",
+ "modelName": "action-data",
+ "modelVersion": "1.0",
+ "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450"
+ },
+ "isALaCarte": false,
+ "orchStatus": "Active",
+ "modelInavariantId": "6b528779-44a3-4472-bdff-9cd15ec93450"
+ }
+ }
+
+ const getMockMembers = (): any[] => {
+ return [
+ {
+ "action":"None",
+ "instanceName":"VNF1_INSTANCE_NAME",
+ "instanceId":"VNF1_INSTANCE_ID",
+ "orchStatus":null,
+ "productFamilyId":null,
+ "lcpCloudRegionId":null,
+ "tenantId":null,
+ "modelInfo":{
+ "modelInvariantId":"vnf-instance-model-invariant-id",
+ "modelVersionId":"7a6ee536-f052-46fa-aa7e-2fca9d674c44",
+ "modelVersion":"2.0",
+ "modelName":"vf_vEPDG",
+ "modelType":"vnf"
+ },
+ "instanceType":"VNF1_INSTANCE_TYPE",
+ "provStatus":null,
+ "inMaint":false,
+ "uuid":"7a6ee536-f052-46fa-aa7e-2fca9d674c44",
+ "originalName":null,
+ "legacyRegion":null,
+ "lineOfBusiness":null,
+ "platformName":null,
+ "trackById":"7a6ee536-f052-46fa-aa7e-2fca9d674c44:002",
+ "serviceInstanceId":"service-instance-id1",
+ "serviceInstanceName":"service-instance-name"
+ },
+ {
+ "action":"None",
+ "instanceName":"VNF2_INSTANCE_NAME",
+ "instanceId":"VNF2_INSTANCE_ID",
+ "orchStatus":null,
+ "productFamilyId":null,
+ "lcpCloudRegionId":null,
+ "tenantId":null,
+ "modelInfo":{
+ "modelInvariantId":"vnf-instance-model-invariant-id",
+ "modelVersionId":"eb5f56bf-5855-4e61-bd00-3e19a953bf02",
+ "modelVersion":"1.0",
+ "modelName":"vf_vEPDG",
+ "modelType":"vnf"
+ },
+ "instanceType":"VNF2_INSTANCE_TYPE",
+ "provStatus":null,
+ "inMaint":true,
+ "uuid":"eb5f56bf-5855-4e61-bd00-3e19a953bf02",
+ "originalName":null,
+ "legacyRegion":null,
+ "lineOfBusiness":null,
+ "platformName":null,
+ "trackById":"eb5f56bf-5855-4e61-bd00-3e19a953bf02:003",
+ "serviceInstanceId":"service-instance-id2",
+ "serviceInstanceName":"service-instance-name"
+ }];
+ };
+});
+
+
+var expectedResult =
+ {
+ 'vnfs': {
+ 'DROR_vsp': {
+ 'rollbackOnFailure': 'true',
+ 'vfModules': {},
+ 'isMissingData': false,
+ 'originalName': 'DROR_vsp',
+ 'orchStatus': 'Created',
+ 'inMaint': false,
+ 'vnfStoreKey' : null,
+ 'trackById' : 'abc',
+ 'action': 'Create'
+ }
+ },
+ "vnfGroups" :{},
+ "existingVNFCounterMap" : {},
+ "existingVnfGroupCounterMap" : {},
+ "existingNetworksCounterMap" : {},
+ 'instanceParams': {},
+ 'validationCounter': 0,
+ 'existingNames': {},
+ 'networks': {},
+ 'instanceName': 'Dror123',
+ 'orchStatus': 'Active',
+ 'modelInavariantId': '35340388-0b82-4d3a-823d-cbddf842be52',
+ 'action': 'Create'
+ };
+
+
+var aaiServiceInstnace: RootObject = {
+ "root": {
+ "type": "service-instance",
+ "orchestrationStatus": "Active",
+ "modelVersionId": "4e799efd-fd78-444d-bc25-4a3cde2f8cb0",
+ "modelCustomizationId": "4e799efd-fd78-444d-bc25-4a3cde2f8cb0",
+ "modelInvariantId": "35340388-0b82-4d3a-823d-cbddf842be52",
+ "id": "62888f15-6d24-4f7b-92a7-c3f35beeb215",
+ "name": "Dror123",
+ "children": [
+ {
+ "type": "generic-vnf",
+ "orchestrationStatus": "Created",
+ "provStatus": "PREPROV",
+ "inMaint": true,
+ "modelVersionId": "11c6dc3e-cd6a-41b3-a50e-b5a10f7157d0",
+ "modelCustomizationId": "11c6dc3e-cd6a-41b3-a50e-b5a10f7157d0",
+ "modelInvariantId": "55628ce3-ed56-40bd-9b27-072698ce02a9",
+ "id": "59bde732-9b84-46bd-a59a-3c45fee0538b",
+ "name": "DROR_vsp",
+ "children": []
+ }
+ ]
+ }
+};
diff --git a/vid-webpack-master/src/app/shared/services/aaiService/aai.service.ts b/vid-webpack-master/src/app/shared/services/aaiService/aai.service.ts
new file mode 100644
index 000000000..1b102e623
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/services/aaiService/aai.service.ts
@@ -0,0 +1,619 @@
+import {NgRedux} from "@angular-redux/store";
+import {HttpClient} from '@angular/common/http';
+import {Injectable} from '@angular/core';
+import * as _ from 'lodash';
+import 'rxjs/add/operator/catch';
+import 'rxjs/add/operator/do';
+import {of} from "rxjs";
+
+import {AicZone} from "../../models/aicZone";
+import {CategoryParams} from "../../models/categoryParams";
+import {LcpRegion} from "../../models/lcpRegion";
+import {LcpRegionsAndTenants} from "../../models/lcpRegionsAndTenants";
+import {OwningEntity} from "../../models/owningEntity";
+import {ProductFamily} from "../../models/productFamily";
+import {Project} from "../../models/project";
+import {SelectOption} from '../../models/selectOption';
+import {ServiceType} from "../../models/serviceType";
+import {Subscriber} from "../../models/subscriber";
+import {Tenant} from "../../models/tenant";
+import {Constants} from '../../utils/constants';
+import {AppState} from "../../store/reducers";
+import {GetAicZonesResponse} from "./responseInterfaces/getAicZonesResponseInterface";
+import {GetCategoryParamsResponseInterface} from "./responseInterfaces/getCategoryParamsResponseInterface";
+import {GetServicesResponseInterface} from "./responseInterfaces/getServicesResponseInterface";
+import {GetSubDetailsResponse} from "./responseInterfaces/getSubDetailsResponseInterface";
+import {GetSubscribersResponse} from "./responseInterfaces/getSubscribersResponseInterface";
+import {Root} from "./model/crawledAaiService";
+import {VnfInstance} from "../../models/vnfInstance";
+import {VfModuleInstance} from "../../models/vfModuleInstance";
+import {ServiceInstance} from "../../models/serviceInstance";
+import {VfModuleMap} from "../../models/vfModulesMap";
+import {
+ updateAicZones,
+ updateCategoryParameters,
+ updateLcpRegionsAndTenants,
+ updateServiceTypes,
+ updateSubscribers,
+ updateUserId
+} from "../../storeUtil/utils/general/general.actions";
+import {updateModel, createServiceInstance} from "../../storeUtil/utils/service/service.actions";
+import {FeatureFlagsService, Features} from "../featureFlag/feature-flags.service";
+import {VnfMember} from "../../models/VnfMember";
+import {setOptionalMembersVnfGroupInstance} from "../../storeUtil/utils/vnfGroup/vnfGroup.actions";
+import {Observable} from "rxjs";
+
+@Injectable()
+export class AaiService {
+ constructor(private http: HttpClient, private store: NgRedux<AppState>, private featureFlagsService:FeatureFlagsService) {
+
+ }
+
+ getServiceModelById = (serviceModelId: string): Observable<any> => {
+ if (_.has(this.store.getState().service.serviceHierarchy, serviceModelId)) {
+ return of(<any> JSON.parse(JSON.stringify(this.store.getState().service.serviceHierarchy[serviceModelId])));
+ }
+ let pathQuery: string = Constants.Path.SERVICES_PATH + serviceModelId;
+ return this.http.get(pathQuery).map(res => res)
+ .do((res) => {
+ this.store.dispatch(updateModel(res));
+ });
+ };
+
+ getUserId = (): Observable<any> => {
+ return this.http.get("../../getuserID", {responseType: 'text'}).do((res) => this.store.dispatch(updateUserId(res)));
+ };
+
+
+ resolve = (root: Root, serviceInstance: ServiceInstance) => {
+ if (root.type === 'service-instance') {
+ serviceInstance.instanceName = root.name;
+ serviceInstance.orchStatus = root.orchestrationStatus;
+ serviceInstance.modelInavariantId = root.modelInvariantId;
+ for (let i = 0; i < root.children.length; i++) {
+ let child = root.children[i];
+ if (child.type === 'generic-vnf') {
+ let vnf = new VnfInstance();
+ vnf.originalName = child.name;
+ vnf.orchStatus = child.orchestrationStatus
+ if (child.children.length > 0) {
+ let vfModuleMap = new VfModuleMap();
+ for (let j = 0; j < child.children.length; j++) {
+ let child = root.children[i];
+ if (child.type === 'vf-module') {
+ let vfModule = new VfModuleInstance();
+ vfModule.instanceName = child.name;
+ vfModule.orchStatus = child.orchestrationStatus;
+ vfModuleMap.vfModules[child.name] = vfModule;
+ }
+ }
+ vnf.vfModules = {"a": vfModuleMap};
+ }
+ serviceInstance.vnfs[child.name] = vnf;
+
+ }
+ }
+
+ }
+ };
+
+
+ getCRAccordingToNetworkFunctionId = (networkCollectionFunction, cloudOwner, cloudRegionId) => {
+ return this.http.get('../../aai_get_instance_groups_by_cloudregion/' + cloudOwner + '/' + cloudRegionId + '/' + networkCollectionFunction)
+ .map(res => res).do((res) => console.log(res));
+ };
+
+ getCategoryParameters = (familyName): Observable<CategoryParams> => {
+ familyName = familyName || Constants.Path.PARAMETER_STANDARDIZATION_FAMILY;
+ let pathQuery: string = Constants.Path.GET_CATEGORY_PARAMETERS + "?familyName=" + familyName + "&r=" + Math.random();
+
+ return this.http.get<GetCategoryParamsResponseInterface>(pathQuery)
+ .map(this.categoryParametersResponseToProductAndOwningEntity)
+ .do(res => {
+ this.store.dispatch(updateCategoryParameters(res))
+ });
+ };
+
+
+ categoryParametersResponseToProductAndOwningEntity = (res: GetCategoryParamsResponseInterface): CategoryParams => {
+ if (res && res.categoryParameters) {
+ const owningEntityList = res.categoryParameters.owningEntity.map(owningEntity => new OwningEntity(owningEntity));
+ const projectList = res.categoryParameters.project.map(project => new Project(project));
+ const lineOfBusinessList = res.categoryParameters.lineOfBusiness.map(owningEntity => new SelectOption(owningEntity));
+ const platformList = res.categoryParameters.platform.map(platform => new SelectOption(platform));
+
+ return new CategoryParams(owningEntityList, projectList, lineOfBusinessList, platformList);
+ } else {
+ return new CategoryParams();
+ }
+ };
+
+ getProductFamilies = (): Observable<ProductFamily[]> => {
+
+ let pathQuery: string = Constants.Path.AAI_GET_SERVICES + Constants.Path.ASSIGN + Math.random();
+
+ return this.http.get<GetServicesResponseInterface>(pathQuery).map(res => res.service.map(service => new ProductFamily(service)));
+ };
+
+ getServices = (): Observable<GetServicesResponseInterface> => {
+ let pathQuery: string = Constants.Path.AAI_GET_SERVICES + Constants.Path.ASSIGN + Math.random();
+
+ return this.http.get<GetServicesResponseInterface>(pathQuery);
+ };
+
+ getSubscribers = (): Observable<Subscriber[]> => {
+
+ if (this.store.getState().service.subscribers) {
+ return of(<any> JSON.parse(JSON.stringify(this.store.getState().service.subscribers)));
+ }
+
+ let pathQuery: string = Constants.Path.AAI_GET_SUBSCRIBERS + Constants.Path.ASSIGN + Math.random();
+
+ return this.http.get<GetSubscribersResponse>(pathQuery).map(res =>
+ res.customer.map(subscriber => new Subscriber(subscriber))).do((res) => {
+ this.store.dispatch(updateSubscribers(res));
+ });
+ };
+
+ getAicZones = (): Observable<AicZone[]> => {
+ if (this.store.getState().service.aicZones) {
+ return of(<any> JSON.parse(JSON.stringify(this.store.getState().service.aicZones)));
+ }
+
+ let pathQuery: string = Constants.Path.AAI_GET_AIC_ZONES + Constants.Path.ASSIGN + Math.random();
+
+ return this.http.get<GetAicZonesResponse>(pathQuery).map(res =>
+ res.zone.map(aicZone => new AicZone(aicZone))).do((res) => {
+ this.store.dispatch(updateAicZones(res));
+ });
+ };
+
+ getLcpRegionsAndTenants = (globalCustomerId, serviceType): Observable<LcpRegionsAndTenants> => {
+
+ let pathQuery: string = Constants.Path.AAI_GET_TENANTS
+ + globalCustomerId + Constants.Path.FORWARD_SLASH + serviceType + Constants.Path.ASSIGN + Math.random();
+
+ console.log("AaiService:getSubscriptionServiceTypeList: globalCustomerId: "
+ + globalCustomerId);
+ if (globalCustomerId != null) {
+ return this.http.get(pathQuery)
+ .map(this.tenantResponseToLcpRegionsAndTenants).do((res) => {
+ this.store.dispatch(updateLcpRegionsAndTenants(res));
+ });
+ }
+ };
+
+ tenantResponseToLcpRegionsAndTenants = (cloudRegionTenantList): LcpRegionsAndTenants => {
+
+ const lcpRegionsTenantsMap = {};
+
+ const lcpRegionList = _.uniqBy(cloudRegionTenantList, 'cloudRegionID').map((cloudRegionTenant) => {
+ const cloudOwner:string = cloudRegionTenant["cloudOwner"];
+ const cloudRegionId:string = cloudRegionTenant["cloudRegionID"];
+ const name:string = this.extractLcpRegionName(cloudRegionId, cloudOwner);
+ const isPermitted:boolean = cloudRegionTenant["is-permitted"];
+ return new LcpRegion(cloudRegionId, name, isPermitted, cloudOwner);
+ });
+
+ lcpRegionList.forEach(region => {
+ lcpRegionsTenantsMap[region.id] = _.filter(cloudRegionTenantList, {'cloudRegionID': region.id})
+ .map((cloudRegionTenant) => {
+ return new Tenant(cloudRegionTenant)
+ });
+ const reducer = (accumulator, currentValue) => {
+ accumulator.isPermitted = accumulator.isPermitted || currentValue.isPermitted;
+
+ return accumulator;
+ };
+ region.isPermitted = lcpRegionsTenantsMap[region.id].reduce(reducer).isPermitted;
+ });
+
+ return new LcpRegionsAndTenants(lcpRegionList, lcpRegionsTenantsMap);
+ };
+
+ public extractLcpRegionName(cloudRegionId: string, cloudOwner: string):string {
+ return this.featureFlagsService.getFlagState(Features.FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST) ?
+ cloudRegionId+AaiService.formatCloudOwnerTrailer(cloudOwner) : cloudRegionId;
+ };
+
+ public static formatCloudOwnerTrailer(cloudOwner: string):string {
+ return " ("+ cloudOwner.trim().toLowerCase().replace(/^att-/, "").toUpperCase() + ")";
+ }
+
+ getServiceTypes = (subscriberId): Observable<ServiceType[]> => {
+
+ console.log("AaiService:getSubscriptionServiceTypeList: globalCustomerId: " + subscriberId);
+ if (_.has(this.store.getState().service.serviceTypes, subscriberId)) {
+ return of(<ServiceType[]> JSON.parse(JSON.stringify(this.store.getState().service.serviceTypes[subscriberId])));
+ }
+
+ return this.getSubscriberDetails(subscriberId)
+ .map(this.subDetailsResponseToServiceTypes)
+ .do((res) => {
+ this.store.dispatch(updateServiceTypes(res, subscriberId));
+ });
+ };
+
+ getSubscriberDetails = (subscriberId): Observable<GetSubDetailsResponse> => {
+ let pathQuery: string = Constants.Path.AAI_SUB_DETAILS_PATH + subscriberId + Constants.Path.ASSIGN + Math.random();
+
+ if (subscriberId != null) {
+ return this.http.get<GetSubDetailsResponse>(pathQuery);
+ }
+ };
+
+ subDetailsResponseToServiceTypes = (res: GetSubDetailsResponse): ServiceType[] => {
+ if (res && res['service-subscriptions']) {
+ const serviceSubscriptions = res['service-subscriptions']['service-subscription'];
+ return serviceSubscriptions.map((subscription, index) => new ServiceType(String(index), subscription))
+ } else {
+ return [];
+ }
+ };
+
+
+ public retrieveServiceInstanceTopology(serviceInstanceId : string, subscriberId: string, serviceType: string):Observable<ServiceInstance> {
+ let pathQuery: string = `${Constants.Path.AAI_GET_SERVICE_INSTANCE_TOPOLOGY_PATH}${subscriberId}/${serviceType}/${serviceInstanceId}`;
+ return this.http.get<ServiceInstance>(pathQuery);
+ }
+
+ public retrieveAndStoreServiceInstanceTopology(serviceInstanceId: string, subscriberId: string, serviceType: string, serviceModeId: string):Observable<ServiceInstance> {
+ return this.retrieveServiceInstanceTopology(serviceInstanceId, subscriberId, serviceType).do((service:ServiceInstance) => {
+ this.store.dispatch(createServiceInstance(service, serviceModeId));
+ });
+ };
+
+
+ public retrieveServiceInstanceRetryTopology(jobId : string) :Observable<ServiceInstance> {
+ let pathQuery: string = `${Constants.Path.SERVICES_RETRY_TOPOLOGY}/${jobId}`;
+ return this.http.get<ServiceInstance>(pathQuery);
+
+ // return of(
+ // <any>{
+ // "action": "None",
+ // "instanceName": "LXzQMx9clZl7D6ckJ",
+ // "instanceId": "service-instance-id",
+ // "orchStatus": "GARBAGE DATA",
+ // "productFamilyId": null,
+ // "lcpCloudRegionId": null,
+ // "tenantId": null,
+ // "modelInfo": {
+ // "modelInvariantId": "d27e42cf-087e-4d31-88ac-6c4b7585f800",
+ // "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+ // "modelName": "vf_vEPDG",
+ // "modelType": "service",
+ // "modelVersion": "5.0"
+ // },
+ // "globalSubscriberId": "global-customer-id",
+ // "subscriptionServiceType": "service-instance-type",
+ // "owningEntityId": null,
+ // "owningEntityName": null,
+ // "tenantName": null,
+ // "aicZoneId": null,
+ // "aicZoneName": null,
+ // "projectName": null,
+ // "rollbackOnFailure": null,
+ // "isALaCarte": false,
+ // "vnfs": {
+ // "1e918ade-3dc6-4cec-b952-3ff94ed82d1c": {
+ // "action": "None",
+ // "instanceName": "DgZuxjJy5LMIc3755",
+ // "instanceId": "1e918ade-3dc6-4cec-b952-3ff94ed82d1c",
+ // "orchStatus": null,
+ // "productFamilyId": null,
+ // "lcpCloudRegionId": null,
+ // "tenantId": null,
+ // "modelInfo": {
+ // "modelInvariantId": "vnf-instance-model-invariant-id",
+ // "modelVersionId": "vnf-instance-model-version-id",
+ // "modelType": "vnf"
+ // },
+ // "instanceType": "SXDBMhwdR9iO0g1Uv",
+ // "provStatus": null,
+ // "inMaint": false,
+ // "uuid": "vnf-instance-model-version-id",
+ // "originalName": null,
+ // "legacyRegion": null,
+ // "lineOfBusiness": null,
+ // "platformName": null,
+ // "trackById": "1e918ade-3dc6-4cec-b952-3ff94ed82d1c",
+ // "vfModules": {},
+ // "networks": {
+ // "ff464c97-ea9c-4165-996a-fe400499af3e": {
+ // "action": "None",
+ // "instanceName": "ZI0quzIpu8TNXS7nl",
+ // "instanceId": "ff464c97-ea9c-4165-996a-fe400499af3e",
+ // "orchStatus": "Assigned",
+ // "productFamilyId": null,
+ // "lcpCloudRegionId": null,
+ // "tenantId": null,
+ // "modelInfo": {
+ // "modelInvariantId": "network-instance-model-invariant-id",
+ // "modelVersionId": "network-instance-model-version-id",
+ // "modelType": "network"
+ // },
+ // "instanceType": "CONTRAIL30_BASIC",
+ // "provStatus": "prov",
+ // "inMaint": false,
+ // "uuid": "network-instance-model-version-id",
+ // "originalName": null,
+ // "legacyRegion": null,
+ // "lineOfBusiness": null,
+ // "platformName": null,
+ // "trackById": "ff464c97-ea9c-4165-996a-fe400499af3e",
+ // "isFailed": true
+ // },
+ // "3e41d57c-8bb4-443e-af02-9f86487ba938": {
+ // "action": "None",
+ // "instanceName": "0i9asscqSLm7Poeb8",
+ // "instanceId": "3e41d57c-8bb4-443e-af02-9f86487ba938",
+ // "orchStatus": "Created",
+ // "productFamilyId": null,
+ // "lcpCloudRegionId": null,
+ // "tenantId": null,
+ // "modelInfo": {
+ // "modelInvariantId": "network-instance-model-invariant-id",
+ // "modelVersionId": "network-instance-model-version-id",
+ // "modelType": "network"
+ // },
+ // "instanceType": "CONTRAIL30_BASIC",
+ // "provStatus": "prov",
+ // "inMaint": false,
+ // "uuid": "network-instance-model-version-id",
+ // "originalName": null,
+ // "legacyRegion": null,
+ // "lineOfBusiness": null,
+ // "platformName": null,
+ // "trackById": "3e41d57c-8bb4-443e-af02-9f86487ba938",
+ // "isFailed": true
+ // }
+ // },
+ // "isFailed": true
+ // },
+ // "9a9b2705-c569-4f1b-9a67-13e9f86e6c55": {
+ // "isFailed": true,
+ // "action": "None",
+ // "instanceName": "TFn0SYhrCUs7L3qWS",
+ // "instanceId": "9a9b2705-c569-4f1b-9a67-13e9f86e6c55",
+ // "orchStatus": null,
+ // "productFamilyId": null,
+ // "lcpCloudRegionId": null,
+ // "tenantId": null,
+ // "modelInfo": {
+ // "modelCustomizationName": "VF_vMee 0",
+ // "modelInvariantId": "vnf-instance-model-invariant-id",
+ // "modelVersionId": "d6557200-ecf2-4641-8094-5393ae3aae60",
+ // "modelType": "vnf"
+ // },
+ // "instanceType": "WIT68GUnH34VaGZgp",
+ // "provStatus": null,
+ // "inMaint": true,
+ // "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60",
+ // "originalName": "VF_vMee 0",
+ // "legacyRegion": null,
+ // "lineOfBusiness": null,
+ // "platformName": null,
+ // "trackById": "9a9b2705-c569-4f1b-9a67-13e9f86e6c55",
+ // "vfModules": {
+ // "vf_vmee0..VfVmee..vmme_vlc..module-1": {
+ // "2c1ca484-cbc2-408b-ab86-25a2c15ce280": {
+ // "action": "None",
+ // "instanceName": "ss820f_0918_db",
+ // "instanceId": "2c1ca484-cbc2-408b-ab86-25a2c15ce280",
+ // "orchStatus": "deleted",
+ // "productFamilyId": null,
+ // "lcpCloudRegionId": null,
+ // "tenantId": null,
+ // "modelInfo": {
+ // "modelCustomizationName": "VfVmee..vmme_vlc..module-1",
+ // "modelCustomizationId": "b200727a-1bf9-4e7c-bd06-b5f4c9d920b9",
+ // "modelInvariantId": "09edc9ef-85d0-4b26-80de-1f569d49e750",
+ // "modelVersionId": "522159d5-d6e0-4c2a-aa44-5a542a12a830",
+ // "modelType": "vfModule"
+ // },
+ // "instanceType": null,
+ // "provStatus": null,
+ // "inMaint": true,
+ // "uuid": "522159d5-d6e0-4c2a-aa44-5a542a12a830",
+ // "originalName": "VfVmee..vmme_vlc..module-1",
+ // "legacyRegion": null,
+ // "lineOfBusiness": null,
+ // "platformName": null,
+ // "trackById": "2c1ca484-cbc2-408b-ab86-25a2c15ce280",
+ // "isBase": false,
+ // "volumeGroupName": null,
+ // "isFailed": true
+ // }
+ // },
+ // "dc229cd8-c132-4455-8517-5c1787c18b14": {
+ // "3ef042c4-259f-45e0-9aba-0989bd8d1cc5": {
+ // "action": "None",
+ // "instanceName": "ss820f_0918_base",
+ // "instanceId": "3ef042c4-259f-45e0-9aba-0989bd8d1cc5",
+ // "orchStatus": "Assigned",
+ // "productFamilyId": null,
+ // "lcpCloudRegionId": null,
+ // "tenantId": null,
+ // "modelInfo": {
+ // "modelCustomizationId": "8ad8670b-0541-4499-8101-275bbd0e8b6a",
+ // "modelInvariantId": "1e463c9c-404d-4056-ba56-28fd102608de",
+ // "modelVersionId": "dc229cd8-c132-4455-8517-5c1787c18b14",
+ // "modelType": "vfModule"
+ // },
+ // "instanceType": null,
+ // "provStatus": null,
+ // "inMaint": false,
+ // "uuid": "dc229cd8-c132-4455-8517-5c1787c18b14",
+ // "originalName": null,
+ // "legacyRegion": null,
+ // "lineOfBusiness": null,
+ // "platformName": null,
+ // "trackById": "3ef042c4-259f-45e0-9aba-0989bd8d1cc5",
+ // "isBase": true,
+ // "volumeGroupName": null
+ // }
+ // }
+ // },
+ // "networks": {}
+ // }
+ // },
+ // "networks": {
+ // "e1edb09e-e68b-4ebf-adb8-e2587be56257": {
+ // "action": "None",
+ // "instanceName": "cNpGlYQDsmrUDK5iG",
+ // "instanceId": "e1edb09e-e68b-4ebf-adb8-e2587be56257",
+ // "orchStatus": "Created",
+ // "productFamilyId": null,
+ // "lcpCloudRegionId": null,
+ // "tenantId": null,
+ // "modelInfo": {
+ // "modelInvariantId": "network-instance-model-invariant-id",
+ // "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ // "modelType": "network"
+ // },
+ // "instanceType": "CONTRAIL30_HIMELGUARD",
+ // "provStatus": "preprov",
+ // "inMaint": false,
+ // "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ // "originalName": null,
+ // "legacyRegion": null,
+ // "lineOfBusiness": null,
+ // "platformName": null,
+ // "trackById": "e1edb09e-e68b-4ebf-adb8-e2587be56257"
+ // },
+ // "de4b5203-ad1c-4f2b-8843-5236fb8dc9ba": {
+ // "action": "None",
+ // "instanceName": "EI9QlSRVK0lon54Cb",
+ // "instanceId": "de4b5203-ad1c-4f2b-8843-5236fb8dc9ba",
+ // "orchStatus": "Assigned",
+ // "productFamilyId": null,
+ // "lcpCloudRegionId": null,
+ // "tenantId": null,
+ // "modelInfo": {
+ // "modelInvariantId": "network-instance-model-invariant-id",
+ // "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ // "modelType": "network"
+ // },
+ // "instanceType": "CONTRAIL30_BASIC",
+ // "provStatus": "nvtprov",
+ // "inMaint": false,
+ // "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+ // "originalName": null,
+ // "legacyRegion": null,
+ // "lineOfBusiness": null,
+ // "platformName": null,
+ // "trackById": "de4b5203-ad1c-4f2b-8843-5236fb8dc9ba",
+ // "isFailed": true
+ // }
+ // },
+ // "vnfGroups": {},
+ // "validationCounter": 0,
+ // "existingVNFCounterMap": {
+ // "vnf-instance-model-version-id": 1,
+ // "d6557200-ecf2-4641-8094-5393ae3aae60": 1
+ // },
+ // "existingNetworksCounterMap": {
+ // "ddc3f20c-08b5-40fd-af72-c6d14636b986": 2
+ // },
+ // "existingVnfGroupCounterMap": {}
+ // }
+ // );
+
+ }
+
+ public retrieveAndStoreServiceInstanceRetryTopology(jobId: string, serviceModeId : string):Observable<ServiceInstance> {
+ return this.retrieveServiceInstanceRetryTopology(jobId).do((service:ServiceInstance) => {
+ this.store.dispatch(createServiceInstance(service, serviceModeId));
+ });
+ };
+
+ public getOptionalGroupMembers(serviceModelId: string, subscriberId: string, serviceType: string, serviceInvariantId: string, groupType: string, groupRole: string): Observable<VnfMember[]> {
+ let pathQuery: string = `${Constants.Path.AAI_GET_SERVICE_GROUP_MEMBERS_PATH}${subscriberId}/${serviceType}/${serviceInvariantId}/${groupType}/${groupRole}`;
+ if(_.has(this.store.getState().service.serviceInstance[serviceModelId].optionalGroupMembersMap,pathQuery)){
+ return of(<VnfMember[]> JSON.parse(JSON.stringify(this.store.getState().service.serviceInstance[serviceModelId].optionalGroupMembersMap[pathQuery])));
+ }
+ return this.http.get<VnfMember[]>(pathQuery)
+ .do((res) => {
+ this.store.dispatch(setOptionalMembersVnfGroupInstance(serviceModelId, pathQuery, res))
+ });
+ // let res = Observable.of((JSON.parse(JSON.stringify(this.loadMockMembers()))));
+ // return res;
+
+ }
+
+ //TODO: make other places use this function
+ extractSubscriberNameBySubscriberId(subscriberId: string) {
+ let result: string = null;
+ let filteredArray: any = _.filter(this.store.getState().service.subscribers, function (o: Subscriber) {
+ return o.id === subscriberId
+ });
+ if (filteredArray.length > 0) {
+ result = filteredArray[0].name;
+ }
+ return result;
+ }
+
+ loadMockMembers(): any {
+ return [
+ {
+ "action":"None",
+ "instanceName":"VNF1_INSTANCE_NAME",
+ "instanceId":"VNF1_INSTANCE_ID",
+ "orchStatus":null,
+ "productFamilyId":null,
+ "lcpCloudRegionId":"mtn23b",
+ "tenantId":"3e9a20a3e89e45f884e09df0cc2d2d2a",
+ "tenantName":"APPC-24595-T-IST-02C",
+ "modelInfo":{
+ "modelInvariantId":"vnf-instance-model-invariant-id",
+ "modelVersionId":"7a6ee536-f052-46fa-aa7e-2fca9d674c44",
+ "modelVersion":"2.0",
+ "modelName":"vf_vEPDG",
+ "modelType":"vnf"
+ },
+ "instanceType":"VNF1_INSTANCE_TYPE",
+ "provStatus":null,
+ "inMaint":false,
+ "uuid":"7a6ee536-f052-46fa-aa7e-2fca9d674c44",
+ "originalName":null,
+ "legacyRegion":null,
+ "lineOfBusiness":null,
+ "platformName":null,
+ "trackById":"7a6ee536-f052-46fa-aa7e-2fca9d674c44:002",
+ "serviceInstanceId":"service-instance-id1",
+ "serviceInstanceName":"service-instance-name"
+ },
+ {
+ "action":"None",
+ "instanceName":"VNF2_INSTANCE_NAME",
+ "instanceId":"VNF2_INSTANCE_ID",
+ "orchStatus":null,
+ "productFamilyId":null,
+ "lcpCloudRegionId":"mtn23b",
+ "tenantId":"3e9a20a3e89e45f884e09df0cc2d2d2a",
+ "tenantName":"APPC-24595-T-IST-02C",
+ "modelInfo":{
+ "modelInvariantId":"vnf-instance-model-invariant-id",
+ "modelVersionId":"eb5f56bf-5855-4e61-bd00-3e19a953bf02",
+ "modelVersion":"1.0",
+ "modelName":"vf_vEPDG",
+ "modelType":"vnf"
+ },
+ "instanceType":"VNF2_INSTANCE_TYPE",
+ "provStatus":null,
+ "inMaint":true,
+ "uuid":"eb5f56bf-5855-4e61-bd00-3e19a953bf02",
+ "originalName":null,
+ "legacyRegion":null,
+ "lineOfBusiness":null,
+ "platformName":null,
+ "trackById":"eb5f56bf-5855-4e61-bd00-3e19a953bf02:003",
+ "serviceInstanceId":"service-instance-id2",
+ "serviceInstanceName":"service-instance-name"
+ }
+ ]
+
+ }
+
+
+}
diff --git a/vid-webpack-master/src/app/shared/services/aaiService/model/crawledAaiService.ts b/vid-webpack-master/src/app/shared/services/aaiService/model/crawledAaiService.ts
new file mode 100644
index 000000000..8c27d43f7
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/services/aaiService/model/crawledAaiService.ts
@@ -0,0 +1,30 @@
+
+ export interface Child {
+ type: string;
+ orchestrationStatus: string;
+ provStatus: string;
+ inMaint: boolean;
+ modelVersionId: string;
+ modelCustomizationId: string;
+ modelInvariantId: string;
+ id: string;
+ name: string;
+ children: any[];
+ }
+
+ export interface Root {
+ type: string;
+ orchestrationStatus: string;
+ modelVersionId: string;
+ modelCustomizationId: string;
+ modelInvariantId: string;
+ id: string;
+ name: string;
+ children: Child[];
+ }
+
+ export interface RootObject {
+ root: Root;
+ }
+
+
diff --git a/vid-webpack-master/src/app/services/aaiService/responseInterfaces/getAicZonesResponseInterface.ts b/vid-webpack-master/src/app/shared/services/aaiService/responseInterfaces/getAicZonesResponseInterface.ts
index 62581c9e2..62581c9e2 100644
--- a/vid-webpack-master/src/app/services/aaiService/responseInterfaces/getAicZonesResponseInterface.ts
+++ b/vid-webpack-master/src/app/shared/services/aaiService/responseInterfaces/getAicZonesResponseInterface.ts
diff --git a/vid-webpack-master/src/app/services/aaiService/responseInterfaces/getCategoryParamsResponseInterface.ts b/vid-webpack-master/src/app/shared/services/aaiService/responseInterfaces/getCategoryParamsResponseInterface.ts
index 06398904c..06398904c 100644
--- a/vid-webpack-master/src/app/services/aaiService/responseInterfaces/getCategoryParamsResponseInterface.ts
+++ b/vid-webpack-master/src/app/shared/services/aaiService/responseInterfaces/getCategoryParamsResponseInterface.ts
diff --git a/vid-webpack-master/src/app/services/aaiService/responseInterfaces/getServiceModelResponseInterface.ts b/vid-webpack-master/src/app/shared/services/aaiService/responseInterfaces/getServiceModelResponseInterface.ts
index 87671155d..016bb0a85 100644
--- a/vid-webpack-master/src/app/services/aaiService/responseInterfaces/getServiceModelResponseInterface.ts
+++ b/vid-webpack-master/src/app/shared/services/aaiService/responseInterfaces/getServiceModelResponseInterface.ts
@@ -1,4 +1,4 @@
-import {ServiceModelResponseInterface} from "../../../shared/models/serviceModel";
+import {ServiceModelResponseInterface} from "../../../models/serviceModel";
export interface GetServiceModelResponseInterface {
service: ServiceModelResponseInterface
diff --git a/vid-webpack-master/src/app/services/aaiService/responseInterfaces/getServicesResponseInterface.ts b/vid-webpack-master/src/app/shared/services/aaiService/responseInterfaces/getServicesResponseInterface.ts
index ae04055e4..ae04055e4 100644
--- a/vid-webpack-master/src/app/services/aaiService/responseInterfaces/getServicesResponseInterface.ts
+++ b/vid-webpack-master/src/app/shared/services/aaiService/responseInterfaces/getServicesResponseInterface.ts
diff --git a/vid-webpack-master/src/app/services/aaiService/responseInterfaces/getSubDetailsResponseInterface.ts b/vid-webpack-master/src/app/shared/services/aaiService/responseInterfaces/getSubDetailsResponseInterface.ts
index dbfb695d0..dbfb695d0 100644
--- a/vid-webpack-master/src/app/services/aaiService/responseInterfaces/getSubDetailsResponseInterface.ts
+++ b/vid-webpack-master/src/app/shared/services/aaiService/responseInterfaces/getSubDetailsResponseInterface.ts
diff --git a/vid-webpack-master/src/app/services/aaiService/responseInterfaces/getSubscribersResponseInterface.ts b/vid-webpack-master/src/app/shared/services/aaiService/responseInterfaces/getSubscribersResponseInterface.ts
index 065f66e21..1399709a5 100644
--- a/vid-webpack-master/src/app/services/aaiService/responseInterfaces/getSubscribersResponseInterface.ts
+++ b/vid-webpack-master/src/app/shared/services/aaiService/responseInterfaces/getSubscribersResponseInterface.ts
@@ -1,4 +1,4 @@
-import {Subscriber} from "../../../shared/models/subscriber";
+import {Subscriber} from "../../../models/subscriber";
export interface GetSubscribersResponse {
customer: Subscriber[];
diff --git a/vid-webpack-master/src/app/services/configuration.service.ts b/vid-webpack-master/src/app/shared/services/configuration.service.ts
index 4edd8ffb5..6c618b5b4 100644
--- a/vid-webpack-master/src/app/services/configuration.service.ts
+++ b/vid-webpack-master/src/app/shared/services/configuration.service.ts
@@ -1,10 +1,11 @@
import {Injectable} from '@angular/core';
import {HttpClient} from "@angular/common/http";
-import {Constants} from "../shared/utils/constants";
-import {Observable} from 'rxjs/Observable';
-import {updateFlags} from "../global.actions";
+import {Constants} from "../utils/constants";
+import {Observable} from 'rxjs';
import {NgRedux} from "@angular-redux/store";
import {AppState} from "../store/reducers";
+import {updateFlags} from "../storeUtil/utils/global/global.actions";
+import {of} from "rxjs";
@Injectable()
export class ConfigurationService {
@@ -23,7 +24,7 @@ export class ConfigurationService {
getFlags(): Observable<{[key: string] : boolean}> {
let flags = this.store.getState().global.flags;
if (flags) {
- return Observable.of(flags);
+ return of(flags);
}
let pathQuery = Constants.Path.FEATURES_FLAG_PATH;
return this._http.get<{[key: string] : boolean}>(pathQuery).map(response => {
diff --git a/vid-webpack-master/src/app/services/data.service.ts b/vid-webpack-master/src/app/shared/services/data.service.ts
index 4f8bf3623..4f8bf3623 100644
--- a/vid-webpack-master/src/app/services/data.service.ts
+++ b/vid-webpack-master/src/app/shared/services/data.service.ts
diff --git a/vid-webpack-master/src/app/shared/services/defaultDataServiceGenerator/default.data.generator.service.spec.ts b/vid-webpack-master/src/app/shared/services/defaultDataServiceGenerator/default.data.generator.service.spec.ts
index 617dbd3da..c4ef881f0 100644
--- a/vid-webpack-master/src/app/shared/services/defaultDataServiceGenerator/default.data.generator.service.spec.ts
+++ b/vid-webpack-master/src/app/shared/services/defaultDataServiceGenerator/default.data.generator.service.spec.ts
@@ -1,33 +1,44 @@
-import { getTestBed, TestBed } from '@angular/core/testing';
-import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
-import { NgRedux } from '@angular-redux/store';
-import { DefaultDataGeneratorService } from './default.data.generator.service';
-
-export class MockAppStore<T> {}
+import {getTestBed, TestBed} from '@angular/core/testing';
+import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing';
+import {NgRedux} from '@angular-redux/store';
+import {DefaultDataGeneratorService} from './default.data.generator.service';
+import {ServiceNodeTypes} from "../../models/ServiceNodeTypes";
+import {VNFModel} from "../../models/vnfModel";
+class MockAppStore<T> {}
describe('Default Data Generator Service', () => {
let injector;
let service: DefaultDataGeneratorService;
let httpMock: HttpTestingController;
- beforeEach(() => {
+ beforeAll(done => (async () => {
TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
- providers: [DefaultDataGeneratorService,
- {provide: NgRedux, useClass: MockAppStore}]
+ providers: [DefaultDataGeneratorService,
+ {provide: NgRedux, useClass: MockAppStore}]
});
+ await TestBed.compileComponents();
injector = getTestBed();
service = injector.get(DefaultDataGeneratorService);
httpMock = injector.get(HttpTestingController);
+ })().then(done).catch(done.fail));
+
+ test('generateVFModule aLaCarte vf module object should missed data', () => {
+ const serviceHierarchy = generateServiceHierarchy();
+ const vnfUUID: string = 'VF_vMee 0';
+ const vnfModuleUUID: string = 'vf_vmee0..VfVmee..base_vmme..module-0';
+
+ let result = service.generateVFModule(serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID], [], false, true);
+ expect(result.isMissingData).toBeTruthy();
});
- it('generateVFModule should create vf module object', () => {
+ test('generateVFModule should create vf module object', () => {
const serviceHierarchy = generateServiceHierarchy();
const vnfUUID: string = 'VF_vMee 0';
const vnfModuleUUID: string = 'vf_vmee0..VfVmee..base_vmme..module-0';
- let result = service.generateVFModule(serviceHierarchy, vnfUUID, vnfModuleUUID);
+ let result = service.generateVFModule(serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID], [], false, false);
expect(result.modelInfo.modelType).toEqual('VFmodule');
expect(result.modelInfo.modelInvariantId).toEqual(serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID].invariantUuid);
@@ -37,15 +48,16 @@ describe('Default Data Generator Service', () => {
expect(result.modelInfo.modelCustomizationId).toEqual(serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID].customizationUuid);
expect(result.modelInfo.modelCustomizationName).toEqual(serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID].modelCustomizationName);
expect(result.sdncPreReload).toBeNull();
+ expect(result.isMissingData).toBeTruthy();
+ expect(result.instanceParams).toEqual([{}]);
});
- it('generateVNFData should create vnf object', () => {
+ test('generateVNFData should create vnf object', () => {
const serviceHierarchy = generateServiceHierarchy();
const vnfName: string = 'VF_vMee 0';
const formValues = generateVNFFormValues();
- const vfUUID: string = 'vf_vmee0..VfVmee..base_vmme..module-0';
- let result = service.generateVNFData(serviceHierarchy, vnfName, vfUUID, formValues);
+ let result = service.generateVNFData(serviceHierarchy, vnfName, formValues, false);
expect(result.productFamilyId).toEqual(formValues.productFamilyId);
expect(result.lcpCloudRegionId).toBeNull();
@@ -57,17 +69,343 @@ describe('Default Data Generator Service', () => {
expect(result.modelInfo.modelVersionId).toEqual(formValues.modelInfo.modelVersionId);
expect(result.modelInfo.modelName).toEqual(serviceHierarchy.vnfs[vnfName].name);
expect(result.modelInfo.modelVersion).toEqual(serviceHierarchy.vnfs[vnfName].version);
- expect(result.modelInfo.modelCustomizationId).toEqual(serviceHierarchy.vnfs[vnfName].modelCustomizationId);
+ expect(result.modelInfo.modelCustomizationId).toEqual(serviceHierarchy.vnfs[vnfName].customizationUuid);
+ expect(result.modelInfo.modelUniqueId).toEqual(serviceHierarchy.vnfs[vnfName].customizationUuid);
expect(result.modelInfo.modelCustomizationName).toEqual(serviceHierarchy.vnfs[vnfName].modelCustomizationName);
+ expect(result.isMissingData).toBeTruthy();
+ });
+
+ describe('#updateDynamicInputsVnfDataFromModel', () => {
+ test('get vfModule instance params', () => {
+ let dynamicInputs = service.updateDynamicInputsVnfDataFromModel(ServiceNodeTypes.VFmodule, generateVFModule());
+ expect(dynamicInputs).toEqual([{
+ id: '2017488_adiodvpe0_vnf_config_template_version',
+ type: 'string',
+ name: '2017488_adiodvpe0_vnf_config_template_version',
+ value: '17.2',
+ isRequired: true,
+ description: 'VPE Software Version'
+ }, {
+ id: '2017488_adiodvpe0_AIC_CLLI',
+ type: 'string',
+ name: '2017488_adiodvpe0_AIC_CLLI',
+ value: 'ATLMY8GA',
+ isRequired: true,
+ description: 'AIC Site CLLI'
+ }]);
+
+ /*get vfModule with no instance params should return empty array*/
+ dynamicInputs = service.updateDynamicInputsVnfDataFromModel(ServiceNodeTypes.VFmodule, generateVFModule2);
+ expect(dynamicInputs).toEqual([]);
+
+ /*get vf instance params should be undefined*/
+ dynamicInputs = service.updateDynamicInputsVnfDataFromModel(ServiceNodeTypes.VF, generateVNF());
+ expect(dynamicInputs).toEqual([]);
+ });
+ });
+
+ describe('#createNewVfModuleTreeNode', () => {
+ test('createNewVfModuleTreeNode with isEcompGeneratedNaming instance name not fill - missing data true', () => {
+ const vnfModuleUUID: string = 'vf_vmee0..VfVmee..base_vmme..module-0';
+ const vfModuleModel = generateServiceHierarchy().vnfs['VF_vMee 0'].vfModules['vf_vmee0..VfVmee..base_vmme..module-0'];
+ const newVfModule = service.createNewVfModuleTreeNode(<any>{
+ instanceName: "",
+ instanceParams: {},
+ volumeGroupName: "",
+ isMissingData : false,
+ trackById: Math.random().toString()
+ }, vfModuleModel, vnfModuleUUID, false, [], "");
+ expect(newVfModule.name).toEqual('&lt;Automatically Assigned&gt;');
+ expect(newVfModule.missingData).toEqual(true);
+ });
+
+ test('createNewVfModuleTreeNode without isEcompGeneratedNaming missing data false', () => {
+ const vnfModuleUUID: string = 'vf_vmee0..VfVmee..base_vmme..module-0';
+ const vfModuleModel = generateServiceHierarchy().vnfs['VF_vMee 0'].vfModules['vf_vmee0..VfVmee..base_vmme..module-0'];
+ const newVfModule = service.createNewVfModuleTreeNode(<any>{
+ instanceName: "",
+ instanceParams: {},
+ volumeGroupName: "",
+ isMissingData : false,
+ trackById: Math.random().toString()
+ }, vfModuleModel, vnfModuleUUID, true, [], "");
+ expect(newVfModule.name).toEqual('&lt;Automatically Assigned&gt;');
+ expect(newVfModule.missingData).toEqual(false);
+ });
+ });
+
+ describe('#createNewVnfTreeNode', () => {
+ test('createNewVnfTreeNode with isEcompGeneratedNaming instance name not filled - missing data true', () => {
+ const vnfModel = generateServiceHierarchy().vnfs['VF_vMee 0'];
+ const newVnf = service.createNewTreeNode({
+ uuid : '',
+ instanceName: "",
+ productFamilyId: "productFamilyId",
+ lcpCloudRegionId: "lcpCloudRegionId",
+ legacyRegion: "legacyRegion",
+ tenantId: "tenantId",
+ platformName: "platformName",
+ lineOfBusiness: "lineOfBusiness",
+ rollbackOnFailure: "rollbackOnFailure",
+ originalName : null,
+ vfModules: {},
+ isMissingData: false,
+ trackById: Math.random().toString(),
+ vnfStoreKey: "abc"
+ }, new VNFModel(vnfModel),'VF_vMee 0', 'vnfs');
+ expect(newVnf.name).toEqual('VF_vMee 0');
+ expect(newVnf.missingData).toEqual(true);
+ });
+
+ test('createNewVnfTreeNode with isEcompGeneratedNaming instance name filled - missing data false', () => {
+ const vnfModel = generateServiceHierarchy().vnfs['VF_vMee 0'];
+ const newVnf = service.createNewTreeNode({
+ uuid : '',
+ instanceName: "instanceName",
+ productFamilyId: "productFamilyId",
+ lcpCloudRegionId: "lcpCloudRegionId",
+ legacyRegion: "legacyRegion",
+ tenantId: "tenantId",
+ platformName: "platformName",
+ lineOfBusiness: "lineOfBusiness",
+ rollbackOnFailure: "rollbackOnFailure",
+ originalName : null,
+ vfModules: {},
+ isMissingData: false,
+ trackById: Math.random().toString(),
+ vnfStoreKey: "abc"
+ }, vnfModel,'VF_vMee 0', 'vnfs');
+ expect(newVnf.name).toEqual("instanceName");
+ expect(newVnf.missingData).toEqual(false);
+ });
});
+
});
function generateServiceHierarchy() {
- return JSON.parse('{"service":{"uuid":"6e59c5de-f052-46fa-aa7e-2fca9d674c44","invariantUuid":"e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0","name":"ComplexService","version":"1.0","toscaModelURL":null,"category":"Mobility","serviceType":"","serviceRole":"","description":"ComplexService","serviceEcompNaming":"true","instantiationType":"Macro","inputs":{}},"vnfs":{"VF_vMee 0":{"uuid":"d6557200-ecf2-4641-8094-5393ae3aae60","invariantUuid":"4160458e-f648-4b30-a176-43881ffffe9e","description":"VSP_vMee","name":"VF_vMee","version":"2.0","customizationUuid":"91415b44-753d-494c-926a-456a9172bbb9","inputs":{},"commands":{},"properties":{"gpb2_Internal2_mac":"00:80:37:0E:02:22","sctp-b-ipv6-egress_src_start_port":"0","sctp-a-ipv6-egress_rule_application":"any","Internal2_allow_transit":"true","sctp-b-IPv6_ethertype":"IPv6","sctp-a-egress_rule_application":"any","sctp-b-ingress_action":"pass","sctp-b-ingress_rule_protocol":"icmp","ncb2_Internal1_mac":"00:80:37:0E:0F:12","sctp-b-ipv6-ingress-src_start_port":"0.0","ncb1_Internal2_mac":"00:80:37:0E:09:12","fsb_volume_size_0":"320.0","sctp-b-egress_src_addresses":"local","sctp-a-ipv6-ingress_ethertype":"IPv4","sctp-a-ipv6-ingress-dst_start_port":"0","sctp-b-ipv6-ingress_rule_application":"any","domain_name":"default-domain","sctp-a-ingress_rule_protocol":"icmp","sctp-b-egress-src_start_port":"0.0","sctp-a-egress_src_addresses":"local","sctp-b-display_name":"epc-sctp-b-ipv4v6-sec-group","sctp-a-egress-src_start_port":"0.0","sctp-a-ingress_ethertype":"IPv4","sctp-b-ipv6-ingress-dst_end_port":"65535","sctp-b-dst_subnet_prefix_v6":"::","nf_naming":"{ecomp_generated_naming=true}","sctp-a-ipv6-ingress_src_subnet_prefix":"0.0.0.0","sctp-b-egress-dst_start_port":"0.0","ncb_flavor_name":"nv.c20r64d1","gpb1_Internal1_mac":"00:80:37:0E:01:22","sctp-b-egress_dst_subnet_prefix_len":"0.0","Internal2_net_cidr":"169.255.0.0","sctp-a-ingress-dst_start_port":"0.0","sctp-a-egress-dst_start_port":"0.0","fsb1_Internal2_mac":"00:80:37:0E:0B:12","sctp-a-egress_ethertype":"IPv4","vlc_st_service_mode":"in-network-nat","sctp-a-ipv6-egress_ethertype":"IPv4","sctp-a-egress-src_end_port":"65535.0","sctp-b-ipv6-egress_rule_application":"any","sctp-b-egress_action":"pass","sctp-a-ingress-src_subnet_prefix_len":"0.0","sctp-b-ipv6-ingress-src_end_port":"65535.0","sctp-b-name":"epc-sctp-b-ipv4v6-sec-group","fsb2_Internal1_mac":"00:80:37:0E:0D:12","sctp-a-ipv6-ingress-src_start_port":"0.0","sctp-b-ipv6-egress_ethertype":"IPv4","Internal1_net_cidr":"169.253.0.0","sctp-a-egress_dst_subnet_prefix":"0.0.0.0","fsb_flavor_name":"nv.c20r64d1","sctp_rule_protocol":"132","sctp-b-ipv6-ingress_src_subnet_prefix_len":"0","sctp-a-ipv6-ingress_rule_application":"any","ecomp_generated_naming":"true","sctp-a-IPv6_ethertype":"IPv6","vlc2_Internal1_mac":"00:80:37:0E:02:12","vlc_st_virtualization_type":"virtual-machine","sctp-b-ingress-dst_start_port":"0.0","sctp-b-ingress-dst_end_port":"65535.0","sctp-a-ipv6-ingress-src_end_port":"65535.0","sctp-a-display_name":"epc-sctp-a-ipv4v6-sec-group","sctp-b-ingress_rule_application":"any","int2_sec_group_name":"int2-sec-group","vlc_flavor_name":"nd.c16r64d1","sctp-b-ipv6-egress_src_addresses":"local","vlc_st_interface_type_int1":"other1","sctp-b-egress-src_end_port":"65535.0","sctp-a-ipv6-egress-dst_start_port":"0","vlc_st_interface_type_int2":"other2","sctp-a-ipv6-egress_rule_protocol":"any","Internal2_shared":"false","sctp-a-ipv6-egress_dst_subnet_prefix_len":"0","Internal2_rpf":"disable","vlc1_Internal1_mac":"00:80:37:0E:01:12","sctp-b-ipv6-egress_src_end_port":"65535","sctp-a-ipv6-egress_src_addresses":"local","sctp-a-ingress-dst_end_port":"65535.0","sctp-a-ipv6-egress_src_end_port":"65535","Internal1_forwarding_mode":"l2","Internal2_dhcp":"false","sctp-a-dst_subnet_prefix_v6":"::","pxe_image_name":"MME_PXE-Boot_16ACP04_GA.qcow2","vlc_st_interface_type_gtp":"other0","ncb1_Internal1_mac":"00:80:37:0E:09:12","sctp-b-src_subnet_prefix_v6":"::","sctp-a-egress_dst_subnet_prefix_len":"0.0","int1_sec_group_name":"int1-sec-group","Internal1_dhcp":"false","sctp-a-ipv6-egress_dst_end_port":"65535","Internal2_forwarding_mode":"l2","fsb2_Internal2_mac":"00:80:37:0E:0D:12","sctp-b-egress_dst_subnet_prefix":"0.0.0.0","Internal1_net_cidr_len":"17","gpb2_Internal1_mac":"00:80:37:0E:02:22","sctp-b-ingress-src_subnet_prefix_len":"0.0","sctp-a-ingress_dst_addresses":"local","sctp-a-egress_action":"pass","fsb_volume_type_0":"SF-Default-SSD","ncb2_Internal2_mac":"00:80:37:0E:0F:12","vlc_st_interface_type_sctp_a":"left","vlc_st_interface_type_sctp_b":"right","sctp-a-src_subnet_prefix_v6":"::","vlc_st_version":"2","sctp-b-egress_ethertype":"IPv4","sctp-a-ingress_rule_application":"any","gpb1_Internal2_mac":"00:80:37:0E:01:22","instance_ip_family_v6":"v6","sctp-a-ipv6-egress_src_start_port":"0","sctp-b-ingress-src_start_port":"0.0","sctp-b-ingress_dst_addresses":"local","fsb1_Internal1_mac":"00:80:37:0E:0B:12","vlc_st_interface_type_oam":"management","multi_stage_design":"false","oam_sec_group_name":"oam-sec-group","Internal2_net_gateway":"169.255.0.3","sctp-a-ipv6-ingress-dst_end_port":"65535","sctp-b-ipv6-egress-dst_start_port":"0","Internal1_net_gateway":"169.253.0.3","sctp-b-ipv6-egress_rule_protocol":"any","gtp_sec_group_name":"gtp-sec-group","sctp-a-ipv6-egress_dst_subnet_prefix":"0.0.0.0","sctp-b-ipv6-egress_dst_subnet_prefix_len":"0","sctp-a-ipv6-ingress_dst_addresses":"local","sctp-a-egress_rule_protocol":"icmp","sctp-b-ipv6-egress_action":"pass","sctp-a-ipv6-egress_action":"pass","Internal1_shared":"false","sctp-b-ipv6-ingress_rule_protocol":"any","Internal2_net_cidr_len":"17","sctp-a-name":"epc-sctp-a-ipv4v6-sec-group","sctp-a-ingress-src_end_port":"65535.0","sctp-b-ipv6-ingress_src_subnet_prefix":"0.0.0.0","sctp-a-egress-dst_end_port":"65535.0","sctp-a-ingress_action":"pass","sctp-b-egress_rule_protocol":"icmp","sctp-b-ipv6-ingress_action":"pass","vlc_st_service_type":"firewall","sctp-b-ipv6-egress_dst_end_port":"65535","sctp-b-ipv6-ingress-dst_start_port":"0","vlc2_Internal2_mac":"00:80:37:0E:02:12","vlc_st_availability_zone":"true","fsb_volume_image_name_1":"MME_FSB2_16ACP04_GA.qcow2","sctp-b-ingress-src_subnet_prefix":"0.0.0.0","sctp-a-ipv6-ingress_src_subnet_prefix_len":"0","Internal1_allow_transit":"true","gpb_flavor_name":"nv.c20r64d1","availability_zone_max_count":"1","fsb_volume_image_name_0":"MME_FSB1_16ACP04_GA.qcow2","sctp-b-ipv6-ingress_dst_addresses":"local","sctp-b-ipv6-egress_dst_subnet_prefix":"0.0.0.0","sctp-b-ipv6-ingress_ethertype":"IPv4","vlc1_Internal2_mac":"00:80:37:0E:01:12","sctp-a-ingress-src_subnet_prefix":"0.0.0.0","sctp-a-ipv6-ingress_action":"pass","Internal1_rpf":"disable","sctp-b-ingress_ethertype":"IPv4","sctp-b-egress_rule_application":"any","sctp-b-ingress-src_end_port":"65535.0","sctp-a-ipv6-ingress_rule_protocol":"any","sctp-a-ingress-src_start_port":"0.0","sctp-b-egress-dst_end_port":"65535.0"},"type":"VF","modelCustomizationName":"VF_vMee 0","vfModules":{"vf_vmee0..VfVmee..vmme_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","version":"2","modelCustomizationName":"VfVmee..vmme_vlc..module-1","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_vlc"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..vmme_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","version":"2","modelCustomizationName":"VfVmee..vmme_gpb..module-2","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_gpb"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..base_vmme..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","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{},"volumeGroupAllowed":true}},"volumeGroups":{"vf_vmee0..VfVmee..base_vmme..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","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{}}},"vfcInstanceGroups":{}}},"networks":{"ExtVL 0":{"uuid":"ddc3f20c-08b5-40fd-af72-c6d14636b986","invariantUuid":"379f816b-a7aa-422f-be30-17114ff50b7c","description":"ECOMP generic virtual link (network) base type for all other service-level and global networks","name":"ExtVL","version":"37.0","customizationUuid":"94fdd893-4a36-4d70-b16a-ec29c54c184f","inputs":{},"commands":{},"properties":{"network_assignments":"{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}","exVL_naming":"{ecomp_generated_naming=true}","network_flows":"{is_network_policy=false, is_bound_to_vpn=false}","network_homing":"{ecomp_selected_instance_node_target=false}"},"type":"VL","modelCustomizationName":"ExtVL 0"}},"collectionResource":{},"configurations":{"Port Mirroring Configuration By Policy 0":{"uuid":"b4398538-e89d-4f13-b33d-ca323434ba50","invariantUuid":"6ef0ca40-f366-4897-951f-abd65d25f6f7","description":"A port mirroring configuration by policy object","name":"Port Mirroring Configuration By Policy","version":"27.0","customizationUuid":"3c3b7b8d-8669-4b3b-8664-61970041fad2","inputs":{},"commands":{},"properties":{},"type":"Configuration","modelCustomizationName":"Port Mirroring Configuration By Policy 0","sourceNodes":[],"collectorNodes":null,"configurationByPolicy":false}},"serviceProxies":{},"vfModules":{"vf_vmee0..VfVmee..vmme_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","version":"2","modelCustomizationName":"VfVmee..vmme_vlc..module-1","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_vlc"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..vmme_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","version":"2","modelCustomizationName":"VfVmee..vmme_gpb..module-2","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_gpb"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..base_vmme..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","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{},"volumeGroupAllowed":true}},"volumeGroups":{"vf_vmee0..VfVmee..base_vmme..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","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{}}},"pnfs":{}}');
+ return JSON.parse('{"service":{"uuid":"6e59c5de-f052-46fa-aa7e-2fca9d674c44","invariantUuid":"e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0","name":"ComplexService","version":"1.0","toscaModelURL":null,"category":"Emanuel","serviceType":"","serviceRole":"","description":"ComplexService","serviceEcompNaming":"true","instantiationType":"Macro","inputs":{}},"vnfs":{"VF_vMee 0":{"uuid":"d6557200-ecf2-4641-8094-5393ae3aae60","invariantUuid":"4160458e-f648-4b30-a176-43881ffffe9e","description":"VSP_vMee","name":"VF_vMee","version":"2.0","customizationUuid":"91415b44-753d-494c-926a-456a9172bbb9","inputs":{},"commands":{},"properties":{"gpb2_Internal2_mac":"00:11:22:EF:AC:DF","sctp-b-ipv6-egress_src_start_port":"0","sctp-a-ipv6-egress_rule_application":"any","Internal2_allow_transit":"true","sctp-b-IPv6_ethertype":"IPv6","sctp-a-egress_rule_application":"any","sctp-b-ingress_action":"pass","sctp-b-ingress_rule_protocol":"icmp","ncb2_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-ipv6-ingress-src_start_port":"0.0","ncb1_Internal2_mac":"00:11:22:EF:AC:DF","fsb_volume_size_0":"320.0","sctp-b-egress_src_addresses":"local","sctp-a-ipv6-ingress_ethertype":"IPv4","sctp-a-ipv6-ingress-dst_start_port":"0","sctp-b-ipv6-ingress_rule_application":"any","domain_name":"default-domain","sctp-a-ingress_rule_protocol":"icmp","sctp-b-egress-src_start_port":"0.0","sctp-a-egress_src_addresses":"local","sctp-b-display_name":"epc-sctp-b-ipv4v6-sec-group","sctp-a-egress-src_start_port":"0.0","sctp-a-ingress_ethertype":"IPv4","sctp-b-ipv6-ingress-dst_end_port":"65535","sctp-b-dst_subnet_prefix_v6":"::","nf_naming":"{ecomp_generated_naming=true}","sctp-a-ipv6-ingress_src_subnet_prefix":"0.0.0.0","sctp-b-egress-dst_start_port":"0.0","ncb_flavor_name":"nv.c20r64d1","gpb1_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-egress_dst_subnet_prefix_len":"0.0","Internal2_net_cidr":"10.0.0.10","sctp-a-ingress-dst_start_port":"0.0","sctp-a-egress-dst_start_port":"0.0","fsb1_Internal2_mac":"00:11:22:EF:AC:DF","sctp-a-egress_ethertype":"IPv4","vlc_st_service_mode":"in-network-nat","sctp-a-ipv6-egress_ethertype":"IPv4","sctp-a-egress-src_end_port":"65535.0","sctp-b-ipv6-egress_rule_application":"any","sctp-b-egress_action":"pass","sctp-a-ingress-src_subnet_prefix_len":"0.0","sctp-b-ipv6-ingress-src_end_port":"65535.0","sctp-b-name":"epc-sctp-b-ipv4v6-sec-group","fsb2_Internal1_mac":"00:11:22:EF:AC:DF","sctp-a-ipv6-ingress-src_start_port":"0.0","sctp-b-ipv6-egress_ethertype":"IPv4","Internal1_net_cidr":"10.0.0.10","sctp-a-egress_dst_subnet_prefix":"0.0.0.0","fsb_flavor_name":"nv.c20r64d1","sctp_rule_protocol":"132","sctp-b-ipv6-ingress_src_subnet_prefix_len":"0","sctp-a-ipv6-ingress_rule_application":"any","ecomp_generated_naming":"false","sctp-a-IPv6_ethertype":"IPv6","vlc2_Internal1_mac":"00:11:22:EF:AC:DF","vlc_st_virtualization_type":"virtual-machine","sctp-b-ingress-dst_start_port":"0.0","sctp-b-ingress-dst_end_port":"65535.0","sctp-a-ipv6-ingress-src_end_port":"65535.0","sctp-a-display_name":"epc-sctp-a-ipv4v6-sec-group","sctp-b-ingress_rule_application":"any","int2_sec_group_name":"int2-sec-group","vlc_flavor_name":"nd.c16r64d1","sctp-b-ipv6-egress_src_addresses":"local","vlc_st_interface_type_int1":"other1","sctp-b-egress-src_end_port":"65535.0","sctp-a-ipv6-egress-dst_start_port":"0","vlc_st_interface_type_int2":"other2","sctp-a-ipv6-egress_rule_protocol":"any","Internal2_shared":"false","sctp-a-ipv6-egress_dst_subnet_prefix_len":"0","Internal2_rpf":"disable","vlc1_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-ipv6-egress_src_end_port":"65535","sctp-a-ipv6-egress_src_addresses":"local","sctp-a-ingress-dst_end_port":"65535.0","sctp-a-ipv6-egress_src_end_port":"65535","Internal1_forwarding_mode":"l2","Internal2_dhcp":"false","sctp-a-dst_subnet_prefix_v6":"::","pxe_image_name":"MME_PXE-Boot_16ACP04_GA.qcow2","vlc_st_interface_type_gtp":"other0","ncb1_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-src_subnet_prefix_v6":"::","sctp-a-egress_dst_subnet_prefix_len":"0.0","int1_sec_group_name":"int1-sec-group","Internal1_dhcp":"false","sctp-a-ipv6-egress_dst_end_port":"65535","Internal2_forwarding_mode":"l2","fsb2_Internal2_mac":"00:11:22:EF:AC:DF","sctp-b-egress_dst_subnet_prefix":"0.0.0.0","Internal1_net_cidr_len":"17","gpb2_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-ingress-src_subnet_prefix_len":"0.0","sctp-a-ingress_dst_addresses":"local","sctp-a-egress_action":"pass","fsb_volume_type_0":"SF-Default-SSD","ncb2_Internal2_mac":"00:11:22:EF:AC:DF","vlc_st_interface_type_sctp_a":"left","vlc_st_interface_type_sctp_b":"right","sctp-a-src_subnet_prefix_v6":"::","vlc_st_version":"2","sctp-b-egress_ethertype":"IPv4","sctp-a-ingress_rule_application":"any","gpb1_Internal2_mac":"00:11:22:EF:AC:DF","instance_ip_family_v6":"v6","sctp-a-ipv6-egress_src_start_port":"0","sctp-b-ingress-src_start_port":"0.0","sctp-b-ingress_dst_addresses":"local","fsb1_Internal1_mac":"00:11:22:EF:AC:DF","vlc_st_interface_type_oam":"management","multi_stage_design":"false","oam_sec_group_name":"oam-sec-group","Internal2_net_gateway":"10.0.0.10","sctp-a-ipv6-ingress-dst_end_port":"65535","sctp-b-ipv6-egress-dst_start_port":"0","Internal1_net_gateway":"10.0.0.10","sctp-b-ipv6-egress_rule_protocol":"any","gtp_sec_group_name":"gtp-sec-group","sctp-a-ipv6-egress_dst_subnet_prefix":"0.0.0.0","sctp-b-ipv6-egress_dst_subnet_prefix_len":"0","sctp-a-ipv6-ingress_dst_addresses":"local","sctp-a-egress_rule_protocol":"icmp","sctp-b-ipv6-egress_action":"pass","sctp-a-ipv6-egress_action":"pass","Internal1_shared":"false","sctp-b-ipv6-ingress_rule_protocol":"any","Internal2_net_cidr_len":"17","sctp-a-name":"epc-sctp-a-ipv4v6-sec-group","sctp-a-ingress-src_end_port":"65535.0","sctp-b-ipv6-ingress_src_subnet_prefix":"0.0.0.0","sctp-a-egress-dst_end_port":"65535.0","sctp-a-ingress_action":"pass","sctp-b-egress_rule_protocol":"icmp","sctp-b-ipv6-ingress_action":"pass","vlc_st_service_type":"firewall","sctp-b-ipv6-egress_dst_end_port":"65535","sctp-b-ipv6-ingress-dst_start_port":"0","vlc2_Internal2_mac":"00:11:22:EF:AC:DF","vlc_st_availability_zone":"true","fsb_volume_image_name_1":"MME_FSB2_16ACP04_GA.qcow2","sctp-b-ingress-src_subnet_prefix":"0.0.0.0","sctp-a-ipv6-ingress_src_subnet_prefix_len":"0","Internal1_allow_transit":"true","gpb_flavor_name":"nv.c20r64d1","availability_zone_max_count":"1","fsb_volume_image_name_0":"MME_FSB1_16ACP04_GA.qcow2","sctp-b-ipv6-ingress_dst_addresses":"local","sctp-b-ipv6-egress_dst_subnet_prefix":"0.0.0.0","sctp-b-ipv6-ingress_ethertype":"IPv4","vlc1_Internal2_mac":"00:11:22:EF:AC:DF","sctp-a-ingress-src_subnet_prefix":"0.0.0.0","sctp-a-ipv6-ingress_action":"pass","Internal1_rpf":"disable","sctp-b-ingress_ethertype":"IPv4","sctp-b-egress_rule_application":"any","sctp-b-ingress-src_end_port":"65535.0","sctp-a-ipv6-ingress_rule_protocol":"any","sctp-a-ingress-src_start_port":"0.0","sctp-b-egress-dst_end_port":"65535.0"},"type":"VF","modelCustomizationName":"VF_vMee 0","vfModules":{"vf_vmee0..VfVmee..vmme_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","version":"2","modelCustomizationName":"VfVmee..vmme_vlc..module-1","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_vlc"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..vmme_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","version":"2","modelCustomizationName":"VfVmee..vmme_gpb..module-2","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_gpb"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..base_vmme..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","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{},"volumeGroupAllowed":true}},"volumeGroups":{"vf_vmee0..VfVmee..base_vmme..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","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{}}},"vfcInstanceGroups":{}}},"networks":{"ExtVL 0":{"uuid":"ddc3f20c-08b5-40fd-af72-c6d14636b986","invariantUuid":"379f816b-a7aa-422f-be30-17114ff50b7c","description":"ECOMP generic virtual link (network) base type for all other service-level and global networks","name":"ExtVL","version":"37.0","customizationUuid":"94fdd893-4a36-4d70-b16a-ec29c54c184f","inputs":{},"commands":{},"properties":{"network_assignments":"{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}","exVL_naming":"{ecomp_generated_naming=true}","network_flows":"{is_network_policy=false, is_bound_to_vpn=false}","network_homing":"{ecomp_selected_instance_node_target=false}"},"type":"VL","modelCustomizationName":"ExtVL 0"}},"collectionResource":{},"configurations":{"Port Mirroring Configuration By Policy 0":{"uuid":"b4398538-e89d-4f13-b33d-ca323434ba50","invariantUuid":"6ef0ca40-f366-4897-951f-abd65d25f6f7","description":"A port mirroring configuration by policy object","name":"Port Mirroring Configuration By Policy","version":"27.0","customizationUuid":"3c3b7b8d-8669-4b3b-8664-61970041fad2","inputs":{},"commands":{},"properties":{},"type":"Configuration","modelCustomizationName":"Port Mirroring Configuration By Policy 0","sourceNodes":[],"collectorNodes":null,"configurationByPolicy":false}},"serviceProxies":{},"vfModules":{"vf_vmee0..VfVmee..vmme_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","version":"2","modelCustomizationName":"VfVmee..vmme_vlc..module-1","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_vlc"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..vmme_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","version":"2","modelCustomizationName":"VfVmee..vmme_gpb..module-2","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_gpb"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..base_vmme..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","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{},"volumeGroupAllowed":true}},"volumeGroups":{"vf_vmee0..VfVmee..base_vmme..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","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{}}},"pnfs":{}}');
}
function generateVNFFormValues() {
- return JSON.parse('{"globalSubscriberId":"e433710f-9217-458d-a79d-1c7aff376d89","productFamilyId":"vRRaaS","subscriptionServiceType":"VIRTUAL USP","lcpCloudRegionId":"mtn6","tenantId":"1178612d2b394be4834ad77f567c0af2","aicZoneId":"JAG1","projectName":"DFW","owningEntityId":"d61e6f2d-12fa-4cc2-91df-7c244011d6fc","rollbackOnFailure":"true","bulkSize":1,"instanceParams":[{}],"modelInfo":{"modelInvariantId":"e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0","modelVersionId":"6e59c5de-f052-46fa-aa7e-2fca9d674c44","modelName":"ComplexService","modelVersion":"1.0"},"isUserProvidedNaming":false,"tenantName":"AIN Web Tool-15-D-SSPtestcustome","aicZoneName":"YUDFJULP-JAG1"}');
+ return JSON.parse('{"globalSubscriberId":"e433710f-9217-458d-a79d-1c7aff376d89","productFamilyId":"vTerrance","subscriptionServiceType":"TYLER SILVIA","lcpCloudRegionId":"hvf6","tenantId":"1178612d2b394be4834ad77f567c0af2","aicZoneId":"JAG1","projectName":"WATKINS","owningEntityId":"d61e6f2d-12fa-4cc2-91df-7c244011d6fc","rollbackOnFailure":"true","bulkSize":1,"instanceParams":[{}],"modelInfo":{"modelInvariantId":"e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0","modelVersionId":"6e59c5de-f052-46fa-aa7e-2fca9d674c44","modelName":"ComplexService","modelVersion":"1.0"},"tenantName":"AIN Web Tool-15-D-SSPtestcustome","aicZoneName":"YUDFJULP-JAG1"}');
+}
+
+function generateVFModule() {
+ return {
+ 'uuid': '25284168-24bb-4698-8cb4-3f509146eca5',
+ 'invariantUuid': '7253ff5c-97f0-4b8b-937c-77aeb4d79aa1',
+ 'customizationUuid': 'f7e7c365-60cf-49a9-9ebf-a1aa11b9d401',
+ 'description': null,
+ 'name': '2017488AdiodVpe..ADIOD_vRE_BV..module-1',
+ 'version': '6',
+ 'modelCustomizationName': '2017488AdiodVpe..ADIOD_vRE_BV..module-1',
+ 'properties': {'minCountInstances': 0, 'maxCountInstances': null, 'initialCount': 0},
+ 'commands': {},
+ 'volumeGroupAllowed': true,
+ 'inputs': {
+ '2017488_adiodvpe0_vnf_config_template_version': {
+ 'type': 'string',
+ 'description': 'VPE Software Version',
+ 'entry_schema': null,
+ 'constraints': [],
+ 'required': true,
+ 'default': '17.2'
+ },
+ '2017488_adiodvpe0_AIC_CLLI': {
+ 'type': 'string',
+ 'description': 'AIC Site CLLI',
+ 'entry_schema': null,
+ 'constraints': [],
+ 'required': true,
+ 'default': 'ATLMY8GA'
+ }
+ }
+ };
+}
+
+function generateVFModule2() {
+ return {
+ 'uuid': '0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a',
+ 'invariantUuid': 'eff8cc59-53a1-4101-aed7-8cf24ecf8339',
+ 'customizationUuid': '3cd946bb-50e0-40d8-96d3-c9023520b557',
+ 'description': null,
+ 'name': '2017488AdiodVpe..ADIOD_vPFE_BV..module-2',
+ 'version': '6',
+ 'modelCustomizationName': '2017488AdiodVpe..ADIOD_vPFE_BV..module-2',
+ 'properties': {'minCountInstances': 0, 'maxCountInstances': null, 'initialCount': 0},
+ 'commands': {},
+ 'volumeGroupAllowed': true,
+ 'inputs': {}
+ };
+}
+
+function generateVNF() {
+ return {
+ 'uuid': '0903e1c0-8e03-4936-b5c2-260653b96413',
+ 'invariantUuid': '00beb8f9-6d39-452f-816d-c709b9cbb87d',
+ 'description': 'Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM',
+ 'name': '2017-388_ADIOD-vPE',
+ 'version': '1.0',
+ 'customizationUuid': '280dec31-f16d-488b-9668-4aae55d6648a',
+ 'inputs': {
+ 'vnf_config_template_version': {
+ 'type': 'string',
+ 'description': 'VPE Software Version',
+ 'entry_schema': null,
+ 'constraints': [],
+ 'required': true,
+ 'default': '17.2'
+ },
+ 'bandwidth_units': {
+ 'type': 'string',
+ 'description': 'Units of bandwidth',
+ 'entry_schema': null,
+ 'constraints': [],
+ 'required': true,
+ 'default': 'Gbps'
+ },
+ 'bandwidth': {
+ 'type': 'string',
+ 'description': 'Requested VPE bandwidth',
+ 'entry_schema': null,
+ 'constraints': [],
+ 'required': true,
+ 'default': '10'
+ },
+ 'AIC_CLLI': {
+ 'type': 'string',
+ 'description': 'AIC Site CLLI',
+ 'entry_schema': null,
+ 'constraints': [],
+ 'required': true,
+ 'default': 'ATLMY8GA'
+ },
+ 'ASN': {
+ 'type': 'string',
+ 'description': 'AV/PE',
+ 'entry_schema': null,
+ 'constraints': [],
+ 'required': true,
+ 'default': 'AV_vPE'
+ },
+ 'vnf_instance_name': {
+ 'type': 'string',
+ 'description': 'The hostname assigned to the vpe.',
+ 'entry_schema': null,
+ 'constraints': [],
+ 'required': true,
+ 'default': 'mtnj309me6'
+ }
+ },
+ 'commands': {
+ 'vnf_config_template_version': {
+ 'displayName': 'vnf_config_template_version',
+ 'command': 'get_input',
+ 'inputName': '2017488_adiodvpe0_vnf_config_template_version'
+ },
+ 'bandwidth_units': {
+ 'displayName': 'bandwidth_units',
+ 'command': 'get_input',
+ 'inputName': 'adiodvpe0_bandwidth_units'
+ },
+ 'bandwidth': {'displayName': 'bandwidth', 'command': 'get_input', 'inputName': 'adiodvpe0_bandwidth'},
+ 'AIC_CLLI': {'displayName': 'AIC_CLLI', 'command': 'get_input', 'inputName': '2017488_adiodvpe0_AIC_CLLI'},
+ 'ASN': {'displayName': 'ASN', 'command': 'get_input', 'inputName': '2017488_adiodvpe0_ASN'},
+ 'vnf_instance_name': {
+ 'displayName': 'vnf_instance_name',
+ 'command': 'get_input',
+ 'inputName': '2017488_adiodvpe0_vnf_instance_name'
+ }
+ },
+ 'properties': {
+ 'vmxvre_retype': 'RE-VMX',
+ 'vnf_config_template_version': 'get_input:2017488_adiodvpe0_vnf_config_template_version',
+ 'sriov44_net_id': '48d399b3-11ee-48a8-94d2-f0ea94d6be8d',
+ 'int_ctl_net_id': '2f323477-6936-4d01-ac53-d849430281d9',
+ 'vmxvpfe_sriov41_0_port_mac': '00:11:22:EF:AC:DF',
+ 'int_ctl_net_name': 'VMX-INTXI',
+ 'vmx_int_ctl_prefix': '10.0.0.10',
+ 'sriov43_net_id': 'da349ca1-6de9-4548-be88-2d88e99bfef5',
+ 'sriov42_net_id': '760669ba-013d-4d9b-b0e7-4151fe2e6279',
+ 'sriov41_net_id': '25ad52d5-c165-40f8-b3b0-ddfc2373280a',
+ 'nf_type': 'vPE',
+ 'vmxvpfe_int_ctl_ip_1': '10.0.0.10',
+ 'is_AVPN_service': 'false',
+ 'vmx_RSG_name': 'vREXI-affinity',
+ 'vmx_int_ctl_forwarding': 'l2',
+ 'vmxvre_oam_ip_0': '10.0.0.10',
+ 'vmxvpfe_sriov44_0_port_mac': '00:11:22:EF:AC:DF',
+ 'vmxvpfe_sriov41_0_port_vlanstrip': 'false',
+ 'vmxvpfe_sriov42_0_port_vlanfilter': '4001',
+ 'vmxvpfe_sriov44_0_port_unknownunicastallow': 'true',
+ 'vmxvre_image_name_0': 'VRE-ENGINE_17.2-S2.1.qcow2',
+ 'vmxvre_instance': '0',
+ 'vmxvpfe_sriov43_0_port_mac': '00:11:22:EF:AC:DF',
+ 'vmxvre_flavor_name': 'ns.c1r16d32.v5',
+ 'vmxvpfe_volume_size_0': '40.0',
+ 'vmxvpfe_sriov43_0_port_vlanfilter': '4001',
+ 'nf_naming': '{ecomp_generated_naming=true}',
+ 'nf_naming_code': 'Navneet',
+ 'vmxvre_name_0': 'vREXI',
+ 'vmxvpfe_sriov42_0_port_vlanstrip': 'false',
+ 'vmxvpfe_volume_name_0': 'vPFEXI_FBVolume',
+ 'vmx_RSG_id': 'bd89a33c-13c3-4a04-8fde-1a57eb123141',
+ 'vmxvpfe_image_name_0': 'VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2',
+ 'vmxvpfe_sriov43_0_port_unknownunicastallow': 'true',
+ 'vmxvpfe_sriov44_0_port_unknownmulticastallow': 'true',
+ 'vmxvre_console': 'vidconsole',
+ 'vmxvpfe_sriov44_0_port_vlanfilter': '4001',
+ 'vmxvpfe_sriov42_0_port_mac': '00:11:22:EF:AC:DF',
+ 'vmxvpfe_volume_id_0': '47cede15-da2f-4397-a101-aa683220aff3',
+ 'vmxvpfe_sriov42_0_port_unknownmulticastallow': 'true',
+ 'vmxvpfe_sriov44_0_port_vlanstrip': 'false',
+ 'vf_module_id': '123',
+ 'nf_function': 'JAI',
+ 'vmxvpfe_sriov43_0_port_unknownmulticastallow': 'true',
+ 'vmxvre_int_ctl_ip_0': '10.0.0.10',
+ 'AIC_CLLI': 'get_input:2017488_adiodvpe0_AIC_CLLI',
+ 'vnf_name': 'mtnj309me6vre',
+ 'vmxvpfe_sriov41_0_port_unknownunicastallow': 'true',
+ 'vmxvre_volume_type_1': 'HITACHI',
+ 'vmxvpfe_sriov44_0_port_broadcastallow': 'true',
+ 'vmxvre_volume_type_0': 'HITACHI',
+ 'vmxvpfe_volume_type_0': 'HITACHI',
+ 'vmxvpfe_sriov43_0_port_broadcastallow': 'true',
+ 'bandwidth_units': 'get_input:adiodvpe0_bandwidth_units',
+ 'vnf_id': '123',
+ 'vmxvre_oam_prefix': '24',
+ 'availability_zone_0': 'mtpocfo-kvm-az01',
+ 'ASN': 'get_input:2017488_adiodvpe0_ASN',
+ 'vmxvre_chassis_i2cid': '161',
+ 'vmxvpfe_name_0': 'vPFEXI',
+ 'bandwidth': 'get_input:adiodvpe0_bandwidth',
+ 'availability_zone_max_count': '1',
+ 'vmxvre_volume_size_0': '45.0',
+ 'vmxvre_volume_size_1': '50.0',
+ 'vmxvpfe_sriov42_0_port_broadcastallow': 'true',
+ 'vmxvre_oam_gateway': '10.0.0.10',
+ 'vmxvre_volume_name_1': 'vREXI_FAVolume',
+ 'vmxvre_ore_present': '0',
+ 'vmxvre_volume_name_0': 'vREXI_FBVolume',
+ 'vmxvre_type': '0',
+ 'vnf_instance_name': 'get_input:2017488_adiodvpe0_vnf_instance_name',
+ 'vmxvpfe_sriov41_0_port_unknownmulticastallow': 'true',
+ 'oam_net_id': 'b95eeb1d-d55d-4827-abb4-8ebb94941429',
+ 'vmx_int_ctl_len': '24',
+ 'vmxvpfe_sriov43_0_port_vlanstrip': 'false',
+ 'vmxvpfe_sriov41_0_port_broadcastallow': 'true',
+ 'vmxvre_volume_id_1': '6e86797e-03cd-4fdc-ba72-2957119c746d',
+ 'vmxvpfe_sriov41_0_port_vlanfilter': '4001',
+ 'nf_role': 'Testing',
+ 'vmxvre_volume_id_0': 'f4eacb79-f687-4e9d-b760-21847c8bb15a',
+ 'vmxvpfe_sriov42_0_port_unknownunicastallow': 'true',
+ 'vmxvpfe_flavor_name': 'ns.c20r16d25.v5'
+ },
+ 'type': 'VF',
+ 'modelCustomizationName': '2017-388_ADIOD-vPE 1',
+ 'vfModules': {},
+ 'volumeGroups': {}
+ };
}
diff --git a/vid-webpack-master/src/app/shared/services/defaultDataServiceGenerator/default.data.generator.service.ts b/vid-webpack-master/src/app/shared/services/defaultDataServiceGenerator/default.data.generator.service.ts
index b1e676fc5..b0baa82ec 100644
--- a/vid-webpack-master/src/app/shared/services/defaultDataServiceGenerator/default.data.generator.service.ts
+++ b/vid-webpack-master/src/app/shared/services/defaultDataServiceGenerator/default.data.generator.service.ts
@@ -1,67 +1,355 @@
-import { Injectable } from '@angular/core';
+import {Injectable} from '@angular/core';
import * as _ from 'lodash';
-import { createVFModuleInstance, updateVNFInstance } from '../../../service.actions';
-import { NgRedux } from '@angular-redux/store';
-import { AppState } from '../../../store/reducers';
+
+import {NgRedux} from '@angular-redux/store';
+import {AppState} from '../../store/reducers';
+import {VnfTreeNode} from "../../models/vnfTreeNode";
+import {VfModuleInstance} from "../../models/vfModuleInstance";
+import {VfModule} from "../../models/vfModule";
+import {VfModuleTreeNode} from "../../models/vfModuleTreeNode";
+import {InputType} from "../../models/inputTypes";
+import {ServiceNodeTypes} from "../../models/ServiceNodeTypes";
+import {Constants} from "../../utils/constants";
+import {Utils} from "../../utils/utils";
+import {NetworkTreeNode} from "../../models/networkTreeNode";
+import {createVNFInstance} from "../../storeUtil/utils/vnf/vnf.actions";
+import {changeInstanceCounter} from "../../storeUtil/utils/general/general.actions";
+import {createNetworkInstance} from "../../storeUtil/utils/network/network.actions";
+import {createVFModuleInstance} from "../../storeUtil/utils/vfModule/vfModule.actions";
+import {createVnfGroupInstance} from "../../storeUtil/utils/vnfGroup/vnfGroup.actions";
+import {VnfGroupTreeNode} from "../../models/vnfGroupTreeNode";
+import {ModelInfo} from "../../models/modelInfo";
+import {ServiceInstanceActions} from "../../models/serviceInstanceActions";
+import Parameter = Constants.Parameter;
@Injectable()
export class DefaultDataGeneratorService {
static controlsFieldsStatus = {};
+ public requiredFields = {
+ VF: [InputType.LCP_REGION, InputType.TENANT, InputType.PLATFORM],
+ Network: [InputType.LCP_REGION, InputType.TENANT, InputType.PLATFORM],
+ VL: [InputType.LCP_REGION, InputType.TENANT, InputType.PLATFORM],
+ VFmodule: [],
+ VnfGroup: []
+ };
+
+ constructor(private store: NgRedux<AppState>) {
+ }
+
+ public getArbitraryInputs(inputs) {
+ let parameter;
+ let parameterList = [];
+ for (let key in inputs) {
+ parameter = {
+ id: key,
+ type: Parameter.STRING,
+ name: key,
+ value: inputs[key][Parameter.DEFAULT],
+ isRequired: inputs[key][Parameter.REQUIRED],
+ description: inputs[key][Parameter.DESCRIPTION]
+ };
+ switch (inputs[key][Parameter.TYPE]) {
+ case Parameter.INTEGER:
+ parameter.type = Parameter.NUMBER;
+ break;
+ case Parameter.BOOLEAN:
+ parameter.type = Parameter.BOOLEAN;
+ break;
+ case Parameter.RANGE:
+ break;
+ case Parameter.LIST:
+ parameter.type = Parameter.LIST;
+ break;
+ case Parameter.MAP:
+ parameter.type = Parameter.MAP;
+ break;
+ }
+ if (Utils.hasContents(inputs[key][Parameter.CONSTRAINTS])
+ && ( inputs[key][Parameter.CONSTRAINTS].length > 0 )) {
+ let constraintsArray = inputs[key][Parameter.CONSTRAINTS];
+ this.addConstraintParameters(parameterList, constraintsArray, key, inputs, parameter);
+ }
+ else {
+
+ parameterList.push(parameter);
+ }
+ }
+ return parameterList;
+ }
+
+ private addConstraintParameters(parameterList, constraintsArray, key, inputs, parameter) {
+ // If there are constraints and the operator is "valid_values",
+ // use a select parameter type.
+ let i: number = constraintsArray.length;
+ let parameterPushed: boolean = false;
+ if (i > 0) {
+ while ((i--) && (!parameterPushed)) {
+ let keys = Object.keys(constraintsArray[i]);
+ for (let operator in keys) {
+ switch (keys[operator]) {
+ case Parameter.VALID_VALUES:
+ let j: number = constraintsArray[i][Parameter.VALID_VALUES].length;
+ if (j > 0) {
+ let oList = [];
+ let option;
+ while (j--) {
+ option = {
+ name: constraintsArray[i][Parameter.VALID_VALUES][j],
+ isDefault: false
+ };
+ if ((Utils.hasContents(inputs[key][Parameter.DEFAULT]) )
+ && (inputs[key][Parameter.DEFAULT] === constraintsArray[i][Parameter.VALID_VALUES][j] )) {
+ option = {
+ name: constraintsArray[i][Parameter.VALID_VALUES][j],
+ isDefault: true
+ }
+ }
+ oList.push(option);
+ }
+ parameter.type = Parameter.SELECT;
+ parameter.optionList = oList;
+ parameterList.push(parameter);
+ parameterPushed = true;
+ }
+ break;
+
+ case Parameter.EQUAL:
+ if (constraintsArray[i][Parameter.EQUAL] != null) {
+ parameter.type = Parameter.STRING;
+ parameter.isReadOnly = true;
+ parameter.value = constraintsArray[i][Parameter.EQUAL];
+ parameterList.push(parameter);
+ parameterPushed = true;
+ }
+ break;
+
+ case Parameter.LENGTH:
+ if (constraintsArray[i][Parameter.LENGTH] != null) {
+ parameter.minLength = constraintsArray[i][Parameter.LENGTH];
+ parameter.maxLength = constraintsArray[i][Parameter.LENGTH];
+ parameterList.push(parameter);
+ parameterPushed = true;
+ }
+ break;
+ case Parameter.MAX_LENGTH:
+ if (constraintsArray[i][Parameter.MAX_LENGTH] != null) {
+ parameter.maxLength = constraintsArray[i][Parameter.MAX_LENGTH];
+ parameterList.push(parameter);
+ parameterPushed = true;
+ }
+ break;
+ case Parameter.MIN_LENGTH:
+ if (constraintsArray[i][Parameter.MIN_LENGTH] != null) {
+ parameter.minLength = constraintsArray[i][Parameter.MIN_LENGTH];
+ parameterList.push(parameter);
+ parameterPushed = true;
+ }
+ break;
+ case Parameter.IN_RANGE:
+ if (constraintsArray[i][Parameter.IN_RANGE] != null) {
+ if (constraintsArray[i][Parameter.IN_RANGE].length > 1) {
+ parameter.min = constraintsArray[i][Parameter.IN_RANGE][0];
+ parameter.max = constraintsArray[i][Parameter.IN_RANGE][1];
+ parameter.type = Parameter.NUMBER;
+ parameter.value = inputs[key][Parameter.DEFAULT];
+ parameterList.push(parameter);
+ parameterPushed = true;
+ }
+ }
+ break;
+ case Parameter.GREATER_THAN:
+ if (constraintsArray[i][Parameter.GREATER_THAN] != null) {
+ parameter.type = Parameter.NUMBER;
+ parameter.min = constraintsArray[i][Parameter.GREATER_THAN];
+ parameter.value = inputs[key][Parameter.DEFAULT];
+ parameterList.push(parameter);
+ parameterPushed = true;
+ }
+ break;
+ }
+ }
+ }
+ }
+ };
+
+ updateDynamicInputsVnfDataFromModel(modelType: string, model: any): any[] {
+ let displayInputs;
+ if (modelType === ServiceNodeTypes.VFmodule) {
+ displayInputs = model.inputs;
+ }
+ return _.isEmpty(displayInputs) ? [] : this.getArbitraryInputs(displayInputs);
+ }
+
+ updateNetworksOnFirstSet(serviceId: string, formServiceValues: any){
+ const serviceHierarchy = this.store.getState().service.serviceHierarchy[serviceId];
+ if (serviceHierarchy && !_.isEmpty(serviceHierarchy.networks)) {
+ for (let networkUUID in serviceHierarchy.networks) {
+ const isEcompGeneratedNaming = this.getIsEcompGeneratedNaming(serviceHierarchy.networks[networkUUID]);
+ let min_vnf_instances_greater_than_0 = serviceHierarchy.networks[networkUUID].properties['min_instances'] && serviceHierarchy.networks[networkUUID].properties['min_instances'] > 0;
+ if(this.store.getState().global.flags['FLAG_DEFAULT_VNF'] && min_vnf_instances_greater_than_0)
+ {
+ this.createNetworkInstanceReduxIfNotExist(
+ serviceId,
+ this.generateNetworkData(serviceHierarchy, networkUUID, formServiceValues, isEcompGeneratedNaming)
+ );
+ }
+ }
+ }
+ }
- constructor(private store: NgRedux<AppState>) { }
+ updateVnfGroupsOnFirstSet(serviceId: string, formServiceValues: any){
+ const serviceHierarchy = this.store.getState().service.serviceHierarchy[serviceId];
+ if (serviceHierarchy && !_.isEmpty(serviceHierarchy.vnfGroups)) {
+ for (let vnfGroupUUID in serviceHierarchy.vnfGroups) {
+ const isEcompGeneratedNaming = this.getIsEcompGeneratedNaming(serviceHierarchy.vnfGroups[vnfGroupUUID]);
+ let min_vnf_group_instances_greater_than_0 = serviceHierarchy.vnfGroups[vnfGroupUUID].properties['min_instances'] && serviceHierarchy.vnfGroups[vnfGroupUUID].properties['min_instances'] > 0;
+ if(this.store.getState().global.flags['FLAG_DEFAULT_VNF'] && min_vnf_group_instances_greater_than_0)
+ {
+ this.createVnfGroupInstanceReduxIfNotExist(
+ serviceId,
+ this.generateVnfGroupData(serviceHierarchy, vnfGroupUUID, formServiceValues, isEcompGeneratedNaming)
+ );
+ }
+ }
+ }
+ }
updateReduxOnFirstSet(serviceId: string, formServiceValues: any): void {
+ this.updateNetworksOnFirstSet(serviceId, formServiceValues);
+ this.updateVnfGroupsOnFirstSet(serviceId, formServiceValues);
const serviceHierarchy = this.store.getState().service.serviceHierarchy[serviceId];
if (serviceHierarchy && !_.isEmpty(serviceHierarchy.vnfs)) {
for (let vnfUUID in serviceHierarchy.vnfs) {
+ const isEcompGeneratedNaming = this.getIsEcompGeneratedNaming(serviceHierarchy.vnfs[vnfUUID]);
for (let vnfModuleUUID in serviceHierarchy.vnfs[vnfUUID].vfModules) {
- if (serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID].properties.minCountInstances > 0) {
-
- let vfModule = this.generateVFModule(serviceHierarchy, vnfUUID, vnfModuleUUID);
- this.updateVNFInstanceRedux(
- serviceHierarchy.vnfs[vnfUUID].modelName,
- serviceId,
- serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID].properties.initialCount,
- vfModule,
- this.generateVNFData(serviceHierarchy, vnfUUID, vnfModuleUUID, formServiceValues),
- vnfModuleUUID
- );
+ const vfModuleModel = serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID];
+ if (vfModuleModel.properties.minCountInstances > 0) {
+ let vfModule = this.generateVFModule(vfModuleModel, this.updateDynamicInputsVnfDataFromModel(ServiceNodeTypes.VFmodule, vfModuleModel), isEcompGeneratedNaming, formServiceValues.isALaCarte);
+ if (vfModuleModel.properties.initialCount > 0) {
+ this.createVNFInstanceReduxIfNotExist(
+ serviceId,
+ this.generateVNFData(serviceHierarchy, vnfUUID, formServiceValues, isEcompGeneratedNaming)
+ );
+
+ this.addDefaultVfModulesInRedux(
+ serviceId,
+ vfModuleModel.properties.initialCount,
+ vfModule,
+ vnfModuleUUID,
+ vnfUUID
+ )
+
+ }
}
}
+
+ let min_vnf_instances_greater_than_0 = serviceHierarchy.vnfs[vnfUUID].properties['min_instances'] && serviceHierarchy.vnfs[vnfUUID].properties['min_instances'] > 0;
+ if(this.store.getState().global.flags['FLAG_DEFAULT_VNF'] && min_vnf_instances_greater_than_0)
+ {
+ this.createVNFInstanceReduxIfNotExist(
+ serviceId,
+ this.generateVNFData(serviceHierarchy, vnfUUID, formServiceValues, isEcompGeneratedNaming)
+ );
+ }
}
}
}
- updateVNFInstanceRedux(vnfModelName: string, serviceId: string, numberOfVfModules: number, vfModuleData: any, vnfData: any, vfModuleName : string): void {
- if (numberOfVfModules > 0) {
- this.store.dispatch(updateVNFInstance(vnfData, vnfData.modelInfo.modelCustomizationName, serviceId));
- for (let i = 0; i < numberOfVfModules; i++) {
- this.store.dispatch(createVFModuleInstance(vfModuleData, vfModuleName, serviceId));
- }
+
+ private getIsEcompGeneratedNaming(vnfJson) {
+ const ecompGeneratedNaming = vnfJson.properties.ecomp_generated_naming;
+ return ecompGeneratedNaming === "true";
+ };
+
+ createVNFInstanceReduxIfNotExist(serviceId: string, vnfData: any): void {
+ if(!this.store.getState().service.serviceInstance[serviceId].vnfs[vnfData.modelInfo.modelCustomizationName]){
+ this.store.dispatch(createVNFInstance(vnfData, vnfData.modelInfo.modelCustomizationName, serviceId));
+ this.store.dispatch(changeInstanceCounter(vnfData.modelInfo.modelUniqueId, serviceId, 1, <any> {data : {type : 'VF'}}));
+ }
+ }
+
+ createNetworkInstanceReduxIfNotExist(serviceId: string, networkData: any): void {
+ if(!this.store.getState().service.serviceInstance[serviceId].vnfs[networkData.modelInfo.modelCustomizationName]){
+ this.store.dispatch(createNetworkInstance(networkData, networkData.modelInfo.modelCustomizationName, serviceId));
+ this.store.dispatch(changeInstanceCounter(networkData.modelInfo.modelUniqueId, serviceId, 1, <any> {data : {type : 'VL'}}));
}
}
+ createVnfGroupInstanceReduxIfNotExist(serviceId: string, vnfGroupData: any): void {
+ if(!this.store.getState().service.serviceInstance[serviceId].vnfGroups[vnfGroupData.modelInfo.modelCustomizationName]){
+ this.store.dispatch(createVnfGroupInstance(vnfGroupData, vnfGroupData.modelInfo.modelCustomizationName, serviceId));
+ this.store.dispatch(changeInstanceCounter(vnfGroupData.modelInfo.modelUniqueId , serviceId, 1, <any> {data : {type : 'VnfGroup'}}));
+ }
+ }
+
+ addDefaultVfModulesInRedux(serviceId: string, numberOfVfModules: number, vfModuleData: any, vfModuleName: string, vnfUUID : string){
+ for (let i = 0; i < numberOfVfModules; i++) {
+ this.store.dispatch(createVFModuleInstance(vfModuleData, vfModuleName, serviceId, null, vnfUUID));
+ }
+ }
- generateVFModule(serviceHierarchy: any, vnfUUID: string, vnfModuleUUID: string) {
+ generateVnfGroupInstance(vnfGroupModel: any, isEcompGeneratedNaming : boolean, isALaCarte: boolean, instanceName: string) {
+ let modelInfo = new ModelInfo(vnfGroupModel);
+ let instanceParams = {};
return {
+ 'uuid' : modelInfo.uuid,
+ 'action': ServiceInstanceActions.Create,
+ 'instanceName': (!isEcompGeneratedNaming) ? instanceName : null,
+ 'isMissingData' : false,
+ 'modelInfo': modelInfo,
+ 'rollbackOnFailure' : "true",
+ 'instanceParams': [
+ instanceParams
+ ],
+ 'trackById': DefaultDataGeneratorService.createRandomTrackById()
+ };
+ }
+
+
+ generateVFModule(vfModule: any, dynamicInputs: any, isEcompGeneratedNaming : boolean, isALaCarte: boolean) {
+ let instanceParams = {};
+ dynamicInputs.forEach(field => {
+ instanceParams[field.id] = field.value;
+ });
+ return {
+ 'isMissingData' : this.setIsMissingData(ServiceNodeTypes.VFmodule, dynamicInputs, isEcompGeneratedNaming, isALaCarte),
'sdncPreReload': null,
'modelInfo': {
'modelType': 'VFmodule',
- 'modelInvariantId': serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID].invariantUuid,
- 'modelVersionId': serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID].uuid,
- 'modelName': serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID].name,
- 'modelVersion': serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID].version,
- 'modelCustomizationId': serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID].customizationUuid,
- 'modelCustomizationName': serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID].modelCustomizationName
+ 'modelInvariantId': vfModule.invariantUuid,
+ 'modelVersionId': vfModule.uuid,
+ 'modelName': vfModule.name,
+ 'modelVersion': vfModule.version,
+ 'modelCustomizationId': vfModule.customizationUuid,
+ 'modelCustomizationName': vfModule.modelCustomizationName,
+ 'modelUniqueId' : vfModule.customizationUuid || vfModule.uuid
},
'instanceParams': [
- {}
- ]
+ instanceParams
+ ],
+ 'trackById': DefaultDataGeneratorService.createRandomTrackById(),
};
}
- generateVNFData(serviceHierarchy: any, vnfName: string, vnfUUID: string, formValues: any) {
+ setIsMissingData(type: string, dynamicInputs: any, isEcompGeneratedNaming: boolean, isAlaCarte?: boolean): boolean {
+ if (isAlaCarte || !isEcompGeneratedNaming || this.requiredFields[type].length > 0) {
+ return true;
+ }
+
+ if (dynamicInputs) {
+ for(let input of dynamicInputs) {
+ if (input.isRequired && _.isEmpty(input.value)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ generateVNFData(serviceHierarchy: any, vnfName: string, formValues: any, isEcompGeneratedNaming) {
return {
+ 'uuid' : serviceHierarchy.vnfs[vnfName].uuid,
+ 'isMissingData' :this.setIsMissingData(ServiceNodeTypes.VF, [], isEcompGeneratedNaming),
'productFamilyId': formValues.productFamilyId,
'lcpCloudRegionId': null,
'tenantId': null,
@@ -73,10 +361,100 @@ export class DefaultDataGeneratorService {
'modelVersionId': formValues.modelInfo.modelVersionId,
'modelName': serviceHierarchy.vnfs[vnfName].name,
'modelVersion': serviceHierarchy.vnfs[vnfName].version,
- 'modelCustomizationId': serviceHierarchy.vnfs[vnfName].modelCustomizationId,
- 'modelCustomizationName': serviceHierarchy.vnfs[vnfName].modelCustomizationName
+ 'modelCustomizationId': serviceHierarchy.vnfs[vnfName].customizationUuid,
+ 'modelCustomizationName': serviceHierarchy.vnfs[vnfName].modelCustomizationName,
+ 'modelUniqueId' : serviceHierarchy.vnfs[vnfName].customizationUuid || serviceHierarchy.vnfs[vnfName].uuid,
},
- 'isUserProvidedNaming': null
+ 'trackById': DefaultDataGeneratorService.createRandomTrackById(),
}
}
+
+ generateNetworkData(serviceHierarchy: any, networkName: string, formValues: any, isEcompGeneratedNaming) {
+ return {
+ 'uuid' : serviceHierarchy.network[networkName].uuid,
+ 'isMissingData' :this.setIsMissingData(ServiceNodeTypes.VL, [], isEcompGeneratedNaming),
+ 'productFamilyId': formValues.productFamilyId,
+ 'lcpCloudRegionId': null,
+ 'tenantId': null,
+ 'lineOfBusiness': null,
+ 'platformName': null,
+ 'modelInfo': {
+ 'modelType': 'VF',
+ 'modelInvariantId': serviceHierarchy.network[networkName].invariantUuid,
+ 'modelVersionId': formValues.modelInfo.modelVersionId,
+ 'modelName': serviceHierarchy.network[networkName].name,
+ 'modelVersion': serviceHierarchy.network[networkName].version,
+ 'modelCustomizationId': serviceHierarchy.network[networkName].modelCustomizationId,
+ 'modelCustomizationName': serviceHierarchy.network[networkName].modelCustomizationName,
+ 'modelUniqueId' : serviceHierarchy.network[networkName].modelCustomizationId || serviceHierarchy.network[networkName].uuid,
+ },
+ 'trackById': DefaultDataGeneratorService.createRandomTrackById(),
+ }
+ }
+
+ generateVnfGroupData(serviceHierarchy: any, vnfGroupName: string, formValues: any, isEcompGeneratedNaming) {
+ return {
+ 'uuid' : serviceHierarchy.vnfGroups[vnfGroupName].uuid,
+ 'isMissingData' :this.setIsMissingData(ServiceNodeTypes.VnfGroup, [], isEcompGeneratedNaming),
+ 'platformName': null,
+ 'modelInfo': {
+ 'modelType': 'VnfGroup',
+ 'modelInvariantId': serviceHierarchy.vnfGroups[vnfGroupName].invariantUuid,
+ 'modelVersionId': formValues.modelInfo.modelVersionId,
+ 'modelName': serviceHierarchy.vnfGroups[vnfGroupName].name,
+ 'modelVersion': serviceHierarchy.vnfGroups[vnfGroupName].version,
+ 'modelCustomizationId': serviceHierarchy.vnfGroups[vnfGroupName].modelCustomizationId,
+ 'modelCustomizationName': serviceHierarchy.vnfGroups[vnfGroupName].modelCustomizationName,
+ 'modelUniqueId' : serviceHierarchy.vnfGroups[vnfGroupName].modelCustomizationId || serviceHierarchy.vnfGroups[vnfGroupName].uuid,
+
+ },
+ 'trackById': DefaultDataGeneratorService.createRandomTrackById(),
+ }
+ }
+
+
+ static createRandomTrackById() {
+ return Math.random().toString(36).slice(2);
+ }
+
+ private checkMissingData(instance, type: string, dynamicInputs: any, isEcompGeneratedNaming: boolean): boolean {
+ if (!isEcompGeneratedNaming && _.isEmpty(instance.instanceName)) {
+ return true;
+ }
+
+ for (let field of this.requiredFields[type]) {
+ if (_.isEmpty(instance[field])) {
+ return true;
+ }
+ }
+
+ for (let field of dynamicInputs) {
+ if (field.isRequired && !_.isNil(instance.instanceParams) && _.isEmpty(instance.instanceParams[0][field.id])) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ createNewTreeNode(instance: any, model: any, storeKey : string, type : string): VnfTreeNode {
+ let tmp = null;
+ if(type === 'vnfs') {
+ tmp = new VnfTreeNode(instance, model, storeKey);
+ }else if (type === 'vnfGroups') {
+ tmp = new VnfGroupTreeNode(instance, model, storeKey);
+ }else {
+ tmp = new NetworkTreeNode(instance, model, storeKey);
+ }
+ tmp.missingData = this.checkMissingData(instance, ServiceNodeTypes.VF, [], model.isEcompGeneratedNaming);
+
+ return tmp;
+ }
+
+ createNewVfModuleTreeNode(instance: VfModuleInstance, vfModuleModel: VfModule, vfModuleModelName: string, isEcompGeneratedNamig: boolean, dynamicInputs, dynamicModelName :string): VfModuleTreeNode {
+ let newVfModule: VfModuleTreeNode = new VfModuleTreeNode(instance, vfModuleModel, vfModuleModelName, dynamicInputs, isEcompGeneratedNamig, dynamicModelName);
+ newVfModule.missingData = this.checkMissingData(instance, ServiceNodeTypes.VFmodule, dynamicInputs, isEcompGeneratedNamig);
+ return newVfModule;
+ }
+
}
diff --git a/vid-webpack-master/src/app/shared/services/featureFlag/feature-flags.service.spec.ts b/vid-webpack-master/src/app/shared/services/featureFlag/feature-flags.service.spec.ts
new file mode 100644
index 000000000..847af6676
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/services/featureFlag/feature-flags.service.spec.ts
@@ -0,0 +1,47 @@
+import {FeatureFlagsService, Features} from "./feature-flags.service";
+import {getTestBed, TestBed} from "@angular/core/testing";
+import {NgRedux} from "@angular-redux/store";
+import each from 'jest-each';
+let flagValue:boolean;
+
+class MockReduxStore<T> {
+
+ getState() {
+ return {
+ "global": {
+ "flags": {
+ "FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST": flagValue,
+ },
+ },
+ }
+ };
+}
+
+describe('Feature flags Service', () => {
+
+ let injector;
+ let service: FeatureFlagsService;
+
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+ providers: [
+ FeatureFlagsService,
+ {provide: NgRedux, useClass: MockReduxStore}]
+ });
+ await TestBed.compileComponents();
+
+ injector = getTestBed();
+ service = injector.get(FeatureFlagsService);
+
+ })().then(done).catch(done.fail));
+
+ let flagValueDataProvider = [
+ ['flag is true', true],
+ ['flag is false', false]
+ ];
+
+ each(flagValueDataProvider).test("should return the correct flag %s", (desc: string, flag: boolean) => {
+ flagValue = flag;
+ expect(service.getFlagState(Features.FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST)).toEqual(flag);
+ });
+});
diff --git a/vid-webpack-master/src/app/shared/services/featureFlag/feature-flags.service.ts b/vid-webpack-master/src/app/shared/services/featureFlag/feature-flags.service.ts
new file mode 100644
index 000000000..ec7bb0214
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/services/featureFlag/feature-flags.service.ts
@@ -0,0 +1,29 @@
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../store/reducers";
+import {Injectable} from "@angular/core";
+
+export enum Features {
+ FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST='FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST',
+ FLAG_1902_NEW_VIEW_EDIT='FLAG_1902_NEW_VIEW_EDIT',
+ FLAG_1902_VNF_GROUPING='FLAG_1902_VNF_GROUPING',
+ FLAG_VF_MODULE_RESUME_STATUS_CREATE = 'FLAG_VF_MODULE_RESUME_STATUS_CREATE',
+ DRAG_AND_DROP_OPERATION = 'DRAG_AND_DROP_OPERATION',
+ FLAG_1906_COMPONENT_INFO = 'FLAG_1906_COMPONENT_INFO',
+}
+
+@Injectable()
+export class FeatureFlagsService {
+
+ constructor(private store: NgRedux<AppState>){}
+
+ public getFlagState(flag: Features):boolean {
+ return FeatureFlagsService.getFlagState(flag, this.store);
+ }
+
+ /*static method for easy refactoring of code, so no injection of FeatureFlagsService is needed*/
+ public static getFlagState(flag: Features, store: NgRedux<AppState>):boolean {
+ return store.getState().global.flags[flag];
+ }
+
+
+}
diff --git a/vid-webpack-master/src/app/shared/services/msoService/mso.service.spec.ts b/vid-webpack-master/src/app/shared/services/msoService/mso.service.spec.ts
new file mode 100644
index 000000000..9142e8d0f
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/services/msoService/mso.service.spec.ts
@@ -0,0 +1,37 @@
+import {getTestBed, TestBed} from '@angular/core/testing';
+import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing';
+import {MsoService} from './mso.service';
+import {Constants} from "../../utils/constants";
+
+
+describe('Mso Service', () => {
+ let injector;
+ let service: MsoService;
+ let httpMock: HttpTestingController;
+
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+ imports: [HttpClientTestingModule],
+ providers: [MsoService]
+ });
+ await TestBed.compileComponents();
+
+
+ injector = getTestBed();
+ service = injector.get(MsoService);
+ httpMock = injector.get(HttpTestingController);
+
+ })().then(done).catch(done.fail));
+
+ describe('#instantiation status tests ', ()=> {
+ test('retry should send the right request', ()=>{
+ const jobId: string = '111';
+
+ service.retryMsoTask(jobId).subscribe();
+ const req = httpMock.expectOne(Constants.Path.SERVICES_JOB_INFO_PATH + '/retry/' + jobId);
+
+ expect(req.request.method).toBe('POST');
+ });
+ });
+
+});
diff --git a/vid-webpack-master/src/app/shared/services/msoService/mso.service.ts b/vid-webpack-master/src/app/shared/services/msoService/mso.service.ts
new file mode 100644
index 000000000..7d31c6f7c
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/services/msoService/mso.service.ts
@@ -0,0 +1,38 @@
+import {Injectable} from "@angular/core";
+import {HttpClient} from "@angular/common/http";
+import {Observable} from "rxjs";
+import {Constants} from "../../utils/constants";
+import {ServiceInstance} from "../../models/serviceInstance";
+
+@Injectable()
+export class MsoService {
+ httpClient: HttpClient;
+
+ constructor(http: HttpClient) {
+ this.httpClient = http;
+ }
+
+
+ public submitMsoTask(instanceFields): Observable<any> {
+ let path = Constants.Path.SERVICES_JOB_INFO_PATH + '/bulk';
+ return this.httpClient.post(path, instanceFields);
+ }
+
+ public retryMsoTask(jobId: string): Observable<any> {
+ let pathQuery = Constants.Path.SERVICES_JOB_INFO_PATH + '/retry/' + jobId;
+ return this.httpClient.post<any>(pathQuery, null);
+ }
+
+ public retryBulkMsoTask(jobId: string, instanceFields: ServiceInstance): Observable<any> {
+ let pathQuery = Constants.Path.SERVICES_JOB_INFO_PATH + '/retryJobWithChangedData/'+ jobId;
+ return this.httpClient.post<any>(pathQuery, instanceFields);
+ }
+
+ public createVnf(requestDetails, serviceInstanceId): Observable<any> {
+ let pathQuery: string = Constants.Path.MSO_CREATE_VNF_INSTANCE + serviceInstanceId;
+
+ return this.httpClient.post( pathQuery, {
+ requestDetails : requestDetails
+ });
+ }
+}
diff --git a/vid-webpack-master/src/app/shared/shared.module.ts b/vid-webpack-master/src/app/shared/shared.module.ts
index ab6ecaa08..57af070c1 100644
--- a/vid-webpack-master/src/app/shared/shared.module.ts
+++ b/vid-webpack-master/src/app/shared/shared.module.ts
@@ -1,33 +1,77 @@
-import {NgModule, ModuleWithProviders} from '@angular/core';
+import {ModuleWithProviders, NgModule} from '@angular/core';
import {CommonModule} from '@angular/common';
import {RouterModule} from '@angular/router';
-import { BrowserModule } from '@angular/platform-browser';
-import { HttpClientModule } from '@angular/common/http';
-import { ServiceInfoService } from './server/serviceInfo/serviceInfo.service';
-import { PopoverModule } from 'ngx-bootstrap';
-import { AngularSvgIconModule } from 'angular-svg-icon';
-import { SvgDirective } from './directives/svg/svg.directive';
-import { PopoverComponent } from './components/popover/popover.component';
-import { EllipsisComponent } from './components/ellipsis/ellipsis.component';
-import { MessageBoxComponent } from './components/messageBox/messageBox.component';
-import { MessageBoxService } from './components/messageBox/messageBox.service';
-import { SdcUiComponentsModule , SdcUiComponents} from 'sdc-ui/lib/angular';
-import { HttpInterceptorService } from './utils/httpInterceptor/httpInterceptor.service';
-import { FormControlErrorComponent } from './components/formControlError/formControlError.component';
-import { InputPreventionPatternDirective } from './directives/inputPrevention/inputPreventionPattern.directive';
-import { FormGeneralErrorsComponent } from './components/formGeneralErrors/formGeneralErrors.component';
-import { NumbersLettersUnderscoreValidator } from './components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator';
-import { SpinnerComponent } from './components/spinner/spinner.component';
-import { NoContentMessageAndIconComponent } from './components/no-content-message-and-icon/no-content-message-and-icon.component';
-import { ModelInformationComponent } from './components/model-information/model-information.component';
-import { TooltipModule } from 'ngx-tooltip';
+import {BrowserModule} from '@angular/platform-browser';
+import {HttpClientModule} from '@angular/common/http';
+import {ServiceInfoService} from './server/serviceInfo/serviceInfo.service';
+import {ModalModule, PopoverModule} from 'ngx-bootstrap';
+import {PopoverComponent} from './components/popover/popover.component';
+import {EllipsisComponent} from './components/ellipsis/ellipsis.component';
+import {MessageBoxComponent} from './components/messageBox/messageBox.component';
+import {MessageBoxService} from './components/messageBox/messageBox.service';
+import {HttpInterceptorService} from './utils/httpInterceptor/httpInterceptor.service';
+import {FormControlErrorComponent} from './components/formControlError/formControlError.component';
+import {DropdownFormControlComponent} from "./components/formControls/component/dropdown/dropdown.formControl.component";
+import {InputPreventionPatternDirective} from './directives/inputPrevention/inputPreventionPattern.directive';
+import {FormGeneralErrorsComponent} from './components/formGeneralErrors/formGeneralErrors.component';
+import {SpinnerComponent} from './components/spinner/spinner.component';
+import {NoContentMessageAndIconComponent} from './components/no-content-message-and-icon/no-content-message-and-icon.component';
+import {ModelInformationComponent} from './components/model-information/model-information.component';
+import {TooltipModule} from 'ngx-tooltip';
import {IframeService} from "./utils/iframe.service";
import {CapitalizeAndFormatPipe} from "./pipes/capitalize/capitalize-and-format.pipe";
-import { DefaultDataGeneratorService } from './services/defaultDataServiceGenerator/default.data.generator.service';
+import {DefaultDataGeneratorService} from './services/defaultDataServiceGenerator/default.data.generator.service';
import {ServiceInfoPipe} from "./pipes/serviceInfo/serviceInfo.pipe";
-import {HealthStatusService} from "./server/healthStatusService/health-status.service";
-import {ConfigurationService} from "../services/configuration.service";
-import {FlagsResolve} from "../services/flags.resolve";
+import {ConfigurationService} from "./services/configuration.service";
+import {InputFormControlComponent} from "./components/formControls/component/input/input.formControl.component";
+import {MultiselectFormControlComponent} from "./components/formControls/component/multiselect/multiselect.formControl.component";
+import {FormsModule, ReactiveFormsModule} from "@angular/forms";
+import {FormControlMessageErrorComponent} from "./components/formControls/errorMessage/formControlMessageError.component";
+import {GenericFormPopupComponent} from "./components/genericFormPopup/generic-form-popup.component";
+import {CheckboxFormControlComponent} from "./components/formControls/component/checkbox/checkbox.formControl.component";
+import {GenericFormService} from "./components/genericForm/generic-form.service";
+import {GenericFormComponent} from "./components/genericForm/generic-form.component";
+import {ServiceControlGenerator} from "./components/genericForm/formControlsServices/service.control.generator";
+import {BasicControlGenerator} from "./components/genericForm/formControlsServices/basic.control.generator";
+import {CustomValidators} from "./validators/uniqueName/uniqueName.validator";
+import {FileFormControlComponent} from "./components/formControls/component/file/file.formControl.component";
+import {NumberFormControlComponent} from "./components/formControls/component/number/number.formControl.component";
+import {AngularMultiSelectModule} from 'angular2-multiselect-dropdown';
+import {VnfControlGenerator} from "./components/genericForm/formControlsServices/vnfGenerator/vnf.control.generator";
+import {NetworkPopupService} from "./components/genericFormPopup/genericFormServices/network/network.popup.service";
+import {NetworkControlGenerator} from "./components/genericForm/formControlsServices/networkGenerator/network.control.generator";
+import {BasicPopupService} from "./components/genericFormPopup/genericFormServices/basic.popup.service";
+import {VfModulePopuopService} from "./components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service";
+import {VfModuleControlGenerator} from "./components/genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator";
+import {OrderByPipe} from "./pipes/order/orderBy.pipe";
+import {ServicePopupService} from "./components/genericFormPopup/genericFormServices/service/service.popup.service";
+import {GenericFormPopupService} from "./components/genericFormPopup/generic-form-popup.service";
+import {FormGeneralErrorsService} from "./components/formGeneralErrors/formGeneralErrors.service";
+import {VnfPopupService} from "./components/genericFormPopup/genericFormServices/vnf/vnf.popup.service";
+import {SdcUiComponentsModule, SdcUiServices} from "onap-ui-angular";
+import {SafePipe} from "./pipes/safe/safe.pipe";
+import {ViewEditResolver} from "./resolvers/viewEdit/viewEdit.resolver";
+import {FlagsResolve} from "./resolvers/flag/flag.resolver";
+import {FeatureFlagModule} from "../featureFlag/featureFlag.module";
+import {VnfGroupPopupService} from "./components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service";
+import {VnfGroupControlGenerator} from "./components/genericForm/formControlsServices/vnfGroupGenerator/vnfGroup.control.generator";
+import {AuditInfoModalComponent} from "./components/auditInfoModal/auditInfoModal.component";
+import {BootstrapModalModule} from 'ng2-bootstrap-modal';
+import {DataTableModule} from "angular2-datatable";
+import {AuditInfoModalComponentService} from "./components/auditInfoModal/auditInfoModal.component.service";
+import {SearchMembersModalComponent} from "./components/searchMembersModal/search-members-modal.component";
+import {MembersTableComponent} from "./components/searchMembersModal/members-table/members-table.component";
+import {MembersTableService} from "./components/searchMembersModal/members-table/members-table.service";
+import {ObjectToArrayPipe} from "./pipes/objectToArray/objectToArray.pipe";
+import {DataFilterPipe} from "./pipes/dataFilter/data-filter.pipe";
+import {SvgComponent} from "./components/svg/svg-component";
+import {ErrorMsgComponent} from './components/error-msg/error-msg.component';
+import {ErrorMsgService} from "./components/error-msg/error-msg.service";
+import {RetryResolver} from "./resolvers/retry/retry.resolver";
+import {ClickOutsideDirective} from "./directives/clickOutside/clickOutside.directive";
+import {DynamicInputsComponent} from "./components/dynamic-inputs/dynamic-inputs.component";
+import {DynamicInputLabelPipe} from "./pipes/dynamicInputLabel/dynamic-input-label.pipe";
+import {ModelInformationService} from "./components/model-information/model-information.service";
@NgModule({
@@ -37,49 +81,119 @@ import {FlagsResolve} from "../services/flags.resolve";
CommonModule,
RouterModule,
PopoverModule.forRoot(),
- AngularSvgIconModule,
+ FeatureFlagModule.forRoot(),
+ FormsModule,
+ ReactiveFormsModule,
TooltipModule,
SdcUiComponentsModule,
+ AngularMultiSelectModule,
+ BootstrapModalModule,
+ DataTableModule,
+ ModalModule.forRoot()
],
declarations: [
PopoverComponent,
- SvgDirective,
EllipsisComponent,
MessageBoxComponent,
FormControlErrorComponent,
+ DropdownFormControlComponent,
+ MultiselectFormControlComponent,
+ FileFormControlComponent,
+ NumberFormControlComponent,
InputPreventionPatternDirective,
+ ClickOutsideDirective,
FormGeneralErrorsComponent,
SpinnerComponent,
NoContentMessageAndIconComponent,
ModelInformationComponent,
CapitalizeAndFormatPipe,
ServiceInfoPipe,
+ OrderByPipe,
+ SafePipe,
+ ObjectToArrayPipe,
+ DataFilterPipe,
+ InputFormControlComponent,
+ FormControlMessageErrorComponent,
+ GenericFormPopupComponent,
+ SearchMembersModalComponent,
+ AuditInfoModalComponent,
+ GenericFormComponent,
+ CheckboxFormControlComponent,
+ MembersTableComponent,
+ SvgComponent,
+ ErrorMsgComponent,
+ DynamicInputsComponent,
+ DynamicInputLabelPipe
],
exports: [
PopoverComponent,
- SvgDirective,
EllipsisComponent,
MessageBoxComponent,
FormControlErrorComponent,
+ DropdownFormControlComponent,
InputPreventionPatternDirective,
+ ClickOutsideDirective,
FormGeneralErrorsComponent,
SpinnerComponent,
NoContentMessageAndIconComponent,
ModelInformationComponent,
CapitalizeAndFormatPipe,
ServiceInfoPipe,
+ OrderByPipe,
+ SafePipe,
+ ObjectToArrayPipe,
+ DataFilterPipe,
+ InputFormControlComponent,
+ FormControlMessageErrorComponent,
+ GenericFormPopupComponent,
+ SearchMembersModalComponent,
+ AuditInfoModalComponent,
+ GenericFormComponent,
+ CheckboxFormControlComponent,
+ MembersTableComponent,
+ ErrorMsgComponent,
+ SvgComponent,
+ DynamicInputsComponent,
+ DynamicInputLabelPipe
+ ],
+ entryComponents : [
+ GenericFormPopupComponent,
+ SearchMembersModalComponent
],
providers: [
ServiceInfoService,
MessageBoxService,
- SdcUiComponents.ModalService,
+ SdcUiServices.ModalService,
+ SdcUiServices.LoaderService,
HttpInterceptorService,
IframeService,
- NumbersLettersUnderscoreValidator,
DefaultDataGeneratorService,
- HealthStatusService,
ConfigurationService,
- FlagsResolve
+ GenericFormService,
+ FlagsResolve,
+ ViewEditResolver,
+ RetryResolver,
+ ServiceControlGenerator,
+ ServicePopupService,
+ VnfControlGenerator,
+ VfModuleControlGenerator,
+ BasicControlGenerator,
+ CustomValidators,
+ NetworkPopupService,
+ VfModulePopuopService,
+ NetworkControlGenerator,
+ VnfGroupControlGenerator,
+ VnfGroupPopupService,
+ BasicPopupService,
+ GenericFormPopupService,
+ FormGeneralErrorsService,
+ VnfPopupService,
+ AuditInfoModalComponentService,
+ VnfPopupService,
+ MembersTableService,
+ ErrorMsgService,
+ DataFilterPipe,
+ ModelInformationService,
]
})
export class SharedModule {
diff --git a/vid-webpack-master/src/app/store/epics.ts b/vid-webpack-master/src/app/shared/store/epics.ts
index f424e7355..c7b190d19 100644
--- a/vid-webpack-master/src/app/store/epics.ts
+++ b/vid-webpack-master/src/app/shared/store/epics.ts
@@ -1,13 +1,11 @@
import { Injectable } from '@angular/core';
-
import {AAIEpics} from "../services/aaiService/aai.epics";
@Injectable()
export class RootEpics {
constructor(private aaiEpics: AAIEpics) {}
- public createEpics() {
+ public createEpics() {
return this.aaiEpics.createEpic();
-
}
}
diff --git a/vid-webpack-master/src/app/shared/store/module.ts b/vid-webpack-master/src/app/shared/store/module.ts
new file mode 100644
index 000000000..5a81f36ec
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/store/module.ts
@@ -0,0 +1,36 @@
+import {NgModule} from '@angular/core';
+import {NgReduxModule, NgRedux, DevToolsExtension} from '@angular-redux/store';
+import {RootEpics} from './epics';
+
+import rootReducer, {AppState} from "./reducers";
+import {AAIEpics} from "../services/aaiService/aai.epics";
+import {createEpicMiddleware} from "redux-observable";
+import {AaiService} from "../services/aaiService/aai.service";
+import {applyMiddleware, createStore} from "redux";
+
+@NgModule({
+ imports: [NgReduxModule],
+ providers: [RootEpics, AAIEpics],
+})
+
+export class StoreModule {
+ constructor(
+ public store: NgRedux<AppState>,
+ private aaiService : AaiService,
+ devTools: DevToolsExtension,
+ rootEpics: RootEpics,
+ ) {
+ const epicMiddleware = createEpicMiddleware();
+ const persistedState = sessionStorage.getItem('reduxState') ?
+ JSON.parse(sessionStorage.getItem('reduxState')) : {};
+
+ const configStore = createStore(
+ rootReducer,
+ <any>persistedState,
+ applyMiddleware(epicMiddleware)
+ );
+
+ epicMiddleware.run(rootEpics.createEpics());
+ store.provideStore(configStore);
+ }
+}
diff --git a/vid-webpack-master/src/app/shared/store/reducers.ts b/vid-webpack-master/src/app/shared/store/reducers.ts
new file mode 100644
index 000000000..90cdd273f
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/store/reducers.ts
@@ -0,0 +1,16 @@
+import {MainReducer, ServiceState} from "../storeUtil/utils/main.reducer";
+import {globalReducer, GlobalState} from "../storeUtil/utils/global/global.reducers";
+import {combineReducers, Reducer} from "redux";
+
+
+export interface AppState {
+ global: GlobalState;
+ service: ServiceState;
+}
+
+const rootReducer: Reducer<AppState> = combineReducers<AppState>({
+ global: globalReducer,
+ service: MainReducer
+});
+
+export default rootReducer;
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/general/general.action.spec.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/general/general.action.spec.ts
new file mode 100644
index 000000000..a65249a3b
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/storeUtil/utils/general/general.action.spec.ts
@@ -0,0 +1,157 @@
+import {
+ GeneralActions, UpdateAicZonesAction,
+ UpdateLcpRegionsAndTenantsAction,
+ UpdateProductFamiliesAction,
+ UpdateSubscribersAction, UpdateUserIdAction
+} from "./general.actions";
+import {SelectOption} from "../../../models/selectOption";
+
+
+describe('general actions', () => {
+ test('#UPDATE_LCP_REGIONS_AND_TENANTS : action', () => {
+ const action: UpdateLcpRegionsAndTenantsAction = <UpdateLcpRegionsAndTenantsAction>{
+ type: GeneralActions.UPDATE_LCP_REGIONS_AND_TENANTS,
+ lcpRegionsAndTenants: {
+ "lcpRegionList": [],
+ "lcpRegionsTenantsMap": {}
+ }
+ };
+
+ expect(action.type).toEqual(GeneralActions.UPDATE_LCP_REGIONS_AND_TENANTS);
+ expect(action.lcpRegionsAndTenants.lcpRegionList).toEqual([]);
+ expect(action.lcpRegionsAndTenants.lcpRegionsTenantsMap).toEqual({});
+ });
+
+ test('#UPDATE_SUBSCRIBERS : action', () => {
+ const action: UpdateSubscribersAction = <UpdateSubscribersAction>{
+ type: GeneralActions.UPDATE_SUBSCRIBERS,
+ subscribers: [
+ {
+ "id": "ERICA5779-Subscriber-2",
+ "name": "ERICA5779-Subscriber-2",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-Subscriber-3",
+ "name": "ERICA5779-Subscriber-3",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-Subscriber-4",
+ "name": "ERICA5779-Subscriber-5",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-TestSub-PWT-101",
+ "name": "ERICA5779-TestSub-PWT-101",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-TestSub-PWT-102",
+ "name": "ERICA5779-TestSub-PWT-102",
+ "isPermitted": false
+ },
+ {
+ "id": "ERICA5779-TestSub-PWT-103",
+ "name": "ERICA5779-TestSub-PWT-103",
+ "isPermitted": false
+ },
+ {
+ "id": "31739f3e-526b-11e6-beb8-9e71128cae77",
+ "name": "CRAIG/ROBERTS",
+ "isPermitted": false
+ },
+ {
+ "id": "DHV1707-TestSubscriber-2",
+ "name": "DALE BRIDGES",
+ "isPermitted": false
+ },
+ {
+ "id": "jimmy-example",
+ "name": "JimmyExampleCust-20161102",
+ "isPermitted": false
+ },
+ {
+ "id": "jimmy-example2",
+ "name": "JimmyExampleCust-20161103",
+ "isPermitted": false
+ },
+ {
+ "id": "CAR_2020_ER",
+ "name": "CAR_2020_ER",
+ "isPermitted": true
+ },
+ {
+ "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+ "name": "Emanuel",
+ "isPermitted": false
+ },
+ {
+ "id": "21014aa2-526b-11e6-beb8-9e71128cae77",
+ "name": "JULIO ERICKSON",
+ "isPermitted": false
+ },
+ {
+ "id": "DHV1707-TestSubscriber-1",
+ "name": "LLOYD BRIDGES",
+ "isPermitted": false
+ },
+ {
+ "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "name": "SILVIA ROBBINS",
+ "isPermitted": true
+ }
+ ]
+ };
+
+ expect(action.type).toEqual(GeneralActions.UPDATE_SUBSCRIBERS);
+ expect(action.subscribers).toHaveLength(15);
+ });
+
+ test('#UPDATE_PRODUCT_FAMILIES : action', () => {
+ const action: UpdateProductFamiliesAction = <UpdateProductFamiliesAction>{
+ type: GeneralActions.UPDATE_PRODUCT_FAMILIES,
+ productFamilies: [
+ new SelectOption({
+ id : 'id',
+ name : 'name',
+ isPermitted : false
+ })
+ ]
+ };
+
+ expect(action.type).toEqual(GeneralActions.UPDATE_PRODUCT_FAMILIES);
+ expect(action.productFamilies).toHaveLength(1);
+ });
+
+
+ test('#UpdateAicZonesAction : action', () => {
+ const action: UpdateAicZonesAction = <UpdateAicZonesAction>{
+ type: GeneralActions.UPDATE_AIC_ZONES,
+ aicZones: [
+ new SelectOption({
+ id : 'id',
+ name : 'name',
+ isPermitted : false
+ })
+ ]
+ };
+
+ expect(action.type).toEqual(GeneralActions.UPDATE_AIC_ZONES);
+ expect(action.aicZones).toHaveLength(1);
+ });
+
+ test('#UpdateUserIdAction : action', () => {
+ const action: UpdateUserIdAction = <UpdateUserIdAction>{
+ type: GeneralActions.UPDATE_USER_ID,
+ userId: "userId"
+ };
+
+ expect(action.type).toEqual(GeneralActions.UPDATE_USER_ID);
+ expect(action.userId).toBe("userId");
+ });
+
+});
+
+
+
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/general/general.actions.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/general/general.actions.ts
new file mode 100644
index 000000000..7a10eba0a
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/storeUtil/utils/general/general.actions.ts
@@ -0,0 +1,150 @@
+import {Action, ActionCreator} from "redux";
+import {LcpRegionsAndTenants} from "../../../models/lcpRegionsAndTenants";
+import {SelectOptionInterface} from "../../../models/selectOption";
+import {ServiceType} from "../../../models/serviceType";
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+
+export enum GeneralActions {
+ UPDATE_LCP_REGIONS_AND_TENANTS = "UPDATE_LCP_REGIONS_AND_TENANTS",
+ UPDATE_SUBSCRIBERS = "UPDATE_SUBSCRIBERS",
+ UPDATE_PRODUCT_FAMILIES = "UPDATE_PRODUCT_FAMILIES",
+ UPDATE_SERVICE_TYPES = "UPDATE_SERVICE_TYPES",
+ UPDATE_AIC_ZONES = "UPDATE_AIC_ZONES",
+ UPDATE_USER_ID = "UPDATE_USER_ID",
+ UPDATE_NETWORK_FUNCTION = "UPDATE_NETWORK_FUNCTION",
+ UPDATE_CATEGORY_PARAMETERS = "UPDATE_CATEGORY_PARAMETERS",
+ REMOVE_INSTANCE = 'REMOVE_INSTANCE',
+ CHANGE_INSTANCE_COUNTER = 'CHANGE_INSTANCE_COUNTER',
+ DUPLICATE_BULK_INSTANCES = 'DUPLICATE_BULK_INSTANCES'
+}
+export interface UpdateLcpRegionsAndTenantsAction extends Action {
+ lcpRegionsAndTenants?: LcpRegionsAndTenants;
+}
+
+export interface RemoveInstanceAction extends Action {
+ modelName?: string;
+ serviceModelId: string;
+ storeKey : string;
+ node : ITreeNode;
+}
+
+export interface UpdateSubscribersAction extends Action {
+ subscribers?: SelectOptionInterface[];
+}
+
+export interface UpdateProductFamiliesAction extends Action {
+ productFamilies?: SelectOptionInterface[];
+}
+
+export interface UpdateAicZonesAction extends Action {
+ aicZones?: SelectOptionInterface[];
+}
+
+export interface UpdateServiceTypesAction extends Action {
+ serviceTypes?: ServiceType[];
+ subscriberId: string;
+}
+export interface UpdateUserIdAction extends Action {
+ userId: string;
+}
+
+export interface UpdateNetworkCollectionFunction extends Action {
+ networksAccordingToNetworkCollection: any;
+ network_function: any;
+}
+
+export interface UpdateCategoryParametersAction extends Action {
+ categoryParameters?: Object;
+}
+
+export interface ChangeInstanceCounterAction extends Action{
+ serviceUUID : string;
+ UUID : string;
+ changeBy : number;
+ node : ITreeNode;
+}
+
+export interface DuplicateBulkInstancesAction extends Action {
+ serviceId?: string;
+ modelName?: string;
+ originalName? : string;
+ objects? : {};
+ existingNames: {[key: string] : any};
+ node : ITreeNode;
+}
+
+export interface UpdateServiceTypesAction extends Action {
+ serviceTypes?: ServiceType[];
+ subscriberId: string;
+}
+
+export const updateLcpRegionsAndTenants: ActionCreator<UpdateLcpRegionsAndTenantsAction> = lcpRegionsAndTenants => ({
+ type: GeneralActions.UPDATE_LCP_REGIONS_AND_TENANTS,
+ lcpRegionsAndTenants: lcpRegionsAndTenants
+});
+
+export const updateSubscribers: ActionCreator<UpdateSubscribersAction> = subscribers => ({
+ type: GeneralActions.UPDATE_SUBSCRIBERS,
+ subscribers: subscribers
+});
+
+export const updateProductFamilies: ActionCreator<UpdateProductFamiliesAction> = productFamilies => ({
+ type: GeneralActions.UPDATE_PRODUCT_FAMILIES,
+ productFamilies: productFamilies
+});
+
+export const updateAicZones: ActionCreator<UpdateAicZonesAction> = aicZones => ({
+ type: GeneralActions.UPDATE_AIC_ZONES,
+ aicZones: aicZones
+});
+
+export const updateUserId: ActionCreator<UpdateUserIdAction> = userId => ({
+ type: GeneralActions.UPDATE_USER_ID,
+ userId: userId
+});
+
+export const updateNetworkCollectionFunction: ActionCreator<UpdateNetworkCollectionFunction> = (ncf, networksAccordingToNetworkCollection) => ({
+ type: GeneralActions.UPDATE_NETWORK_FUNCTION,
+ networksAccordingToNetworkCollection: networksAccordingToNetworkCollection["results"],
+ network_function: ncf
+});
+
+export const updateCategoryParameters: ActionCreator<UpdateCategoryParametersAction> = categoryParameters => ({
+ type: GeneralActions.UPDATE_CATEGORY_PARAMETERS,
+ categoryParameters: categoryParameters
+});
+
+export const removeInstance: ActionCreator<RemoveInstanceAction> = (modelName, serviceModelId, storeKey, node : ITreeNode) => ({
+ type: GeneralActions.REMOVE_INSTANCE,
+ modelName: modelName,
+ serviceModelId: serviceModelId,
+ storeKey: storeKey,
+ node : node
+});
+
+
+export const changeInstanceCounter: ActionCreator<ChangeInstanceCounterAction> = (UUID, serviceUUID , changeBy, node) => ({
+ type: GeneralActions.CHANGE_INSTANCE_COUNTER,
+ UUID: UUID,
+ serviceUUID: serviceUUID,
+ changeBy : changeBy || 1,
+ node : node
+});
+
+
+export const duplicateBulkInstances: ActionCreator<DuplicateBulkInstancesAction> = (serviceId, objects, existingNames, node) => ({
+ type: GeneralActions.DUPLICATE_BULK_INSTANCES,
+ serviceId: serviceId,
+ objects : objects,
+ existingNames: existingNames,
+ node : node
+});
+
+
+export const updateServiceTypes: ActionCreator<UpdateServiceTypesAction> = (serviceTypes, subscriberId) => ({
+ type: GeneralActions.UPDATE_SERVICE_TYPES,
+ serviceTypes: serviceTypes,
+ subscriberId: subscriberId
+});
+
+
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/general/general.reducers.spec.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/general/general.reducers.spec.ts
new file mode 100644
index 000000000..ed456314e
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/storeUtil/utils/general/general.reducers.spec.ts
@@ -0,0 +1,376 @@
+import {LcpRegion} from "../../../models/lcpRegion";
+import {Tenant} from "../../../models/tenant";
+import {generalReducer} from "./general.reducers";
+import {
+ ChangeInstanceCounterAction,
+ RemoveInstanceAction,
+ DuplicateBulkInstancesAction,
+ GeneralActions,
+ UpdateAicZonesAction,
+ UpdateCategoryParametersAction,
+ UpdateProductFamiliesAction,
+ UpdateServiceTypesAction,
+ UpdateSubscribersAction,
+ UpdateUserIdAction, UpdateNetworkCollectionFunction,
+} from "./general.actions";
+import {SelectOption} from "../../../models/selectOption";
+import {ServiceType} from "../../../models/serviceType";
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import {VnfInstance} from "../../../models/vnfInstance";
+
+describe('generalReducer', () => {
+ test('#UPDATE_LCP_REGIONS_AND_TENANTS : should update lcp region and tenants', () => {
+ let lcpRegionsAndTenantsObj = [
+ {
+ lcpRegionList : [
+ new LcpRegion(
+ 'cloudRegionID',
+ 'cloudRegionID (cloudOwner)',
+ true,
+ 'cloudOwner'
+ )
+ ],
+ lcpRegionsTenantsMap : {
+ "lcpRegion" : [new Tenant({
+ "tenantID" : "tenantID",
+ "tenantName" : "tenantName",
+ "is-permitted" : true
+ })]
+ }
+ }
+ ];
+ let lcpRegionsAndTenantsState = generalReducer(<any>{serviceInstance : {}},
+ <any>{
+ type: GeneralActions.UPDATE_LCP_REGIONS_AND_TENANTS,
+ lcpRegionsAndTenants : lcpRegionsAndTenantsObj
+ })['lcpRegionsAndTenants'];
+
+ expect(lcpRegionsAndTenantsState).toBeDefined();
+ });
+
+ test('#UPDATE_SUBSCRIBERS : should update subscribers', () => {
+ let subscribersList = [
+ new SelectOption({
+ id : 'id',
+ name : 'name',
+ isPermitted : false
+ })
+ ];
+ let subscribersState = generalReducer(<any>
+ {
+ serviceInstance : {}
+ },
+ <UpdateSubscribersAction>{
+ type: GeneralActions.UPDATE_SUBSCRIBERS,
+ subscribers : subscribersList
+ })['subscribers'];
+
+ expect(subscribersState).toBeDefined();
+ expect(subscribersState[0].id).toEqual(subscribersList[0].id);
+ expect(subscribersState[0].isPermitted).toEqual(subscribersList[0].isPermitted);
+ expect(subscribersState[0].name).toEqual(subscribersList[0].name);
+ });
+
+ test('#UPDATE_PRODUCT_FAMILIES : should update product families', () => {
+ let productFamiliesObj = [
+ new SelectOption({
+ id : 'id',
+ name : 'name',
+ isPermitted : false
+ })
+ ];
+ let productFamiliesState = generalReducer(<any>{serviceInstance : {}},
+ <UpdateProductFamiliesAction>{
+ type: GeneralActions.UPDATE_PRODUCT_FAMILIES,
+ productFamilies : productFamiliesObj
+ })['productFamilies'];
+
+ expect(productFamiliesState).toBeDefined();
+ expect(productFamiliesState[0].id).toEqual(productFamiliesObj[0].id);
+ expect(productFamiliesState[0].isPermitted).toEqual(productFamiliesObj[0].isPermitted);
+ expect(productFamiliesState[0].name).toEqual(productFamiliesObj[0].name);
+ });
+
+ test('#UPDATE_AIC_ZONES : should update aic zones', () => {
+ let aicZonesObj = [
+ new SelectOption({
+ id : 'id',
+ name : 'name',
+ isPermitted : false
+ })
+ ];
+ let aicZonesState = generalReducer(<any>{serviceInstance : {}},
+ <UpdateAicZonesAction>{
+ type: GeneralActions.UPDATE_AIC_ZONES,
+ aicZones : aicZonesObj
+ })['aicZones'];
+
+ expect(aicZonesState).toBeDefined();
+ expect(aicZonesState[0].id).toEqual(aicZonesObj[0].id);
+ expect(aicZonesState[0].isPermitted).toEqual(aicZonesObj[0].isPermitted);
+ expect(aicZonesState[0].name).toEqual(aicZonesObj[0].name);
+ });
+
+ test('#UPDATE_SERVICE_TYPES : should update service types', () => {
+ const subscriberId = 'subscriberId';
+ let serviceTypesList : ServiceType[] = [
+ new ServiceType('id',{
+ 'service-type' : 'name',
+ 'is-permitted' : true
+ })
+ ];
+ let serviceTypesState = generalReducer(<any>
+ {
+ serviceTypes : {
+ }
+ },
+ <UpdateServiceTypesAction>{
+ type: GeneralActions.UPDATE_SERVICE_TYPES,
+ subscriberId : subscriberId,
+ serviceTypes : serviceTypesList
+ })['serviceTypes'][subscriberId];
+
+ expect(serviceTypesState).toBeDefined();
+ expect(serviceTypesState[0].id).toEqual(serviceTypesList[0].id);
+ expect(serviceTypesState[0].isPermitted).toEqual(serviceTypesList[0].isPermitted);
+ expect(serviceTypesState[0].name).toEqual(serviceTypesList[0].name);
+ });
+
+ test('#UPDATE_CATEGORY_PARAMETERS : should update category parameters', () => {
+ let list = [
+ new SelectOption({
+ id : 'id',
+ name : 'name',
+ isPermitted : false
+ })
+ ];
+
+ const categoryParametersObj = {
+ owningEntityList : list,
+ projectList : list,
+ lineOfBusinessList : list,
+ platformList : list
+ };
+
+ let categoryParametersState = generalReducer(<any>{serviceInstance : {}},
+ <UpdateCategoryParametersAction>{
+ type: GeneralActions.UPDATE_CATEGORY_PARAMETERS,
+ categoryParameters : categoryParametersObj
+ })['categoryParameters'];
+
+ expect(categoryParametersState).toBeDefined();
+ expect(categoryParametersState['owningEntityList'][0].id).toEqual(list[0].id);
+ expect(categoryParametersState['owningEntityList'][0].isPermitted).toEqual(list[0].isPermitted);
+ expect(categoryParametersState['owningEntityList'][0].name).toEqual(list[0].name);
+
+ expect(categoryParametersState['projectList'][0].id).toEqual(list[0].id);
+ expect(categoryParametersState['projectList'][0].isPermitted).toEqual(list[0].isPermitted);
+ expect(categoryParametersState['projectList'][0].name).toEqual(list[0].name);
+
+ expect(categoryParametersState['lineOfBusinessList'][0].id).toEqual(list[0].id);
+ expect(categoryParametersState['lineOfBusinessList'][0].isPermitted).toEqual(list[0].isPermitted);
+ expect(categoryParametersState['lineOfBusinessList'][0].name).toEqual(list[0].name);
+
+ expect(categoryParametersState['platformList'][0].id).toEqual(list[0].id);
+ expect(categoryParametersState['platformList'][0].isPermitted).toEqual(list[0].isPermitted);
+ expect(categoryParametersState['platformList'][0].name).toEqual(list[0].name);
+ });
+
+ test('#UPDATE_USER_ID : should update user id', () => {
+ const userId = 'userId';
+ let userState = generalReducer(<any>{serviceInstance : {}},
+ <UpdateUserIdAction>{
+ type: GeneralActions.UPDATE_USER_ID,
+ userId : userId
+ })['userId'];
+
+ expect(userState).toBeDefined();
+ expect(userState).toEqual(userId);
+ });
+
+ test('#DELETE_VNF_INSTANCE : should delete existing vnf', () => {
+ let state = generalReducer(<any>{serviceInstance : {
+ 'serviceModelId' : {
+ vnfs : {
+ 'modelName' : {}
+ }
+ }
+ }},
+ <RemoveInstanceAction>{
+ type: GeneralActions.REMOVE_INSTANCE,
+ modelName : 'modelName',
+ serviceModelId : 'serviceModelId',
+ storeKey : 'modelName',
+ node : {
+ data : {
+ type : 'VF'
+ }
+ }
+ });
+
+ expect(state).toBeDefined();
+ expect(state.serviceInstance[ 'serviceModelId'].vnfs['modelName']).not.toBeDefined();
+ });
+
+ test('#DELETE_VNF_INSTANCE : should delete existing network', () => {
+ let state = generalReducer(<any>{serviceInstance : {
+ 'serviceModelId' : {
+ 'networks' : {
+ 'modelName' : {}
+ }
+ }
+ }},
+ <RemoveInstanceAction>{
+ type: GeneralActions.REMOVE_INSTANCE,
+ modelName : 'modelName',
+ serviceModelId : 'serviceModelId',
+ storeKey : 'modelName',
+ node : {
+ data : {
+ type : 'VL'
+ }
+ }
+ });
+
+ expect(state).toBeDefined();
+ expect(state.serviceInstance['serviceModelId'].networks['modelName']).not.toBeDefined();
+ });
+
+ test('#CHANGE_VNF_INSTANCE_COUNTER : should init existingVNFCounterMap to 1', () => {
+ let state = generalReducer(<any>{serviceInstance : {
+ 'serviceModelId' : {
+ vnfs : {
+ 'vnfName' : { }
+ },
+ existingVNFCounterMap : {
+
+ }
+ }
+ }},
+ <ChangeInstanceCounterAction>{
+ type: GeneralActions.CHANGE_INSTANCE_COUNTER,
+ serviceUUID : 'serviceModelId',
+ node : {data : {type : 'VF'}},
+ UUID : 'vnfUUID',
+ changeBy : 1
+ });
+
+ expect(state).toBeDefined();
+ expect(state.serviceInstance['serviceModelId'].existingVNFCounterMap['vnfUUID']).toEqual(1);
+ });
+
+ test('#CHANGE_VNF_INSTANCE_COUNTER : should increase existingVNFCounterMap to 2 if VNF exist', () => {
+ let state = generalReducer(<any>{serviceInstance : {
+ 'serviceModelId' : {
+ vnfs : {
+ 'vnfName' : { }
+ },
+ existingVNFCounterMap : {
+ 'vnfUUID' : 1
+ }
+ }
+ }},
+ <ChangeInstanceCounterAction>{
+ type: GeneralActions.CHANGE_INSTANCE_COUNTER,
+ serviceUUID : 'serviceModelId',
+ UUID : 'vnfUUID',
+ node : {data : {type : 'VF'}},
+ changeBy : 1
+ });
+
+ expect(state).toBeDefined();
+ expect(state.serviceInstance['serviceModelId'].existingVNFCounterMap['vnfUUID']).toEqual(2);
+ });
+
+ test('#CHANGE_VNF_INSTANCE_COUNTER : should remove existingVNFCounterMap to 0 remove VNF', () => {
+
+ let state = generalReducer(<any>{serviceInstance : {
+ 'serviceModelId' : {
+ vnfs : {
+ 'vnfName' : { }
+ },
+ existingVNFCounterMap : {
+ 'vnfUUID' : 1
+ }
+ }
+ }},
+ <ChangeInstanceCounterAction>{
+ type: GeneralActions.CHANGE_INSTANCE_COUNTER,
+ serviceUUID : 'serviceModelId',
+ UUID : 'vnfUUID',
+ node : {data : {type : 'VF'}},
+ changeBy : -1
+ });
+
+ expect(state).toBeDefined();
+ expect(state.serviceInstance['serviceModelId'].existingVNFCounterMap['vnfUUID']).toEqual(0);
+ });
+
+ test('#DUPLICATE_BULK_INSTANCES : should duplicate existing VNF/Network', ()=>{
+ let existingNames = {
+ 'vnfOriginalName' : 1
+ };
+
+ let vnfInstance: VnfInstance = new VnfInstance();
+ vnfInstance.originalName = 'vnfOriginalName';
+ vnfInstance.vnfStoreKey = 'vnfStoreKey';
+
+ let cloneObjects = {
+ 'vnfOriginalName' : vnfInstance,
+ 'vnfOriginalName:0001' : vnfInstance,
+ 'vnfOriginalName:0002' : vnfInstance,
+ 'vnfOriginalName:0003' : vnfInstance
+ };
+
+ let node : ITreeNode = <any>{
+ data : {
+ serviceId : 'serviceModelId',
+ vnfStoreKey : 'vnfStoreKey',
+ type : 'VF'
+ }
+ };
+
+ let vnfsState = generalReducer(<any>{serviceInstance : {
+ 'serviceModelId' : {
+ vnfs : {
+ },
+ existingVNFCounterMap : {}
+ }
+ }},
+ <DuplicateBulkInstancesAction>{
+ type: GeneralActions.DUPLICATE_BULK_INSTANCES,
+ serviceId: 'serviceModelId',
+ modelName: 'modelName',
+ originalName : 'modelName',
+ objects : cloneObjects,
+ existingNames: existingNames,
+ node : node
+ }).serviceInstance['serviceModelId'].vnfs;
+
+ expect(vnfsState).toBeDefined();
+ expect(Object.keys(vnfsState).length).toEqual(4);
+ });
+
+ test('#UPDATE_NETWORK_FUNCTION : should update network functions', ()=>{
+ let state = generalReducer(<any>{serviceInstance : {
+ 'serviceModelId' : {
+ vnfs : {
+ },
+ existingVNFCounterMap : {}
+ }
+ }},
+ <UpdateNetworkCollectionFunction>{
+ type: GeneralActions.UPDATE_NETWORK_FUNCTION,
+ network_function : {
+ results : []
+ },
+ networksAccordingToNetworkCollection : "networksAccordingToNetworkCollection"
+ });
+
+ expect(state).toBeDefined();
+ expect(state['networkFunctions']).toBeDefined();
+ });
+});
+
+
+
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/general/general.reducers.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/general/general.reducers.ts
new file mode 100644
index 000000000..8ee47331f
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/storeUtil/utils/general/general.reducers.ts
@@ -0,0 +1,147 @@
+import {Action} from "redux";
+import {
+ ChangeInstanceCounterAction, RemoveInstanceAction, DuplicateBulkInstancesAction,
+ GeneralActions,
+ UpdateAicZonesAction, UpdateCategoryParametersAction,
+ UpdateLcpRegionsAndTenantsAction, UpdateNetworkCollectionFunction,
+ UpdateProductFamiliesAction, UpdateServiceTypesAction,
+ UpdateSubscribersAction, UpdateUserIdAction
+} from "./general.actions";
+import {TypeNodeInformation} from "../../../../drawingBoard/service-planning/typeNodeInformation.model";
+import * as _ from "lodash";
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import {ServiceInstance} from "../../../models/serviceInstance";
+import {ServiceState} from "../main.reducer";
+
+export function generalReducer(state: ServiceState, action: Action) : ServiceState {
+ switch (action.type) {
+ case GeneralActions.UPDATE_LCP_REGIONS_AND_TENANTS: {
+ Object.assign(state, (<UpdateLcpRegionsAndTenantsAction>action));
+ return Object.assign({}, state);
+ }
+ case GeneralActions.UPDATE_SUBSCRIBERS: {
+ Object.assign(state, (<UpdateSubscribersAction>action));
+ return Object.assign({}, state);
+ }
+ case GeneralActions.UPDATE_AIC_ZONES: {
+ Object.assign(state, (<UpdateAicZonesAction>action));
+ return Object.assign({}, state);
+ }
+ case GeneralActions.UPDATE_PRODUCT_FAMILIES: {
+ Object.assign(state, (<UpdateProductFamiliesAction>action));
+ return Object.assign({}, state);
+ }
+ case GeneralActions.UPDATE_NETWORK_FUNCTION: {
+ const networkFunctionReduxObj = state['networkFunctions'] == undefined ? {} : state['networkFunctions'];
+ networkFunctionReduxObj[(<UpdateNetworkCollectionFunction>action).network_function] = (<UpdateNetworkCollectionFunction>action).networksAccordingToNetworkCollection;
+ Object.assign(state, {'networkFunctions': networkFunctionReduxObj});
+ return Object.assign({}, state);
+ }
+ case GeneralActions.UPDATE_SERVICE_TYPES: {
+ state.serviceTypes[(<UpdateServiceTypesAction>action).subscriberId] = (<UpdateServiceTypesAction>action).serviceTypes;
+ return Object.assign({}, state);
+ }
+ case GeneralActions.UPDATE_CATEGORY_PARAMETERS: {
+ Object.assign(state, (<UpdateCategoryParametersAction>action));
+ return Object.assign({}, state);
+ }
+ case GeneralActions.UPDATE_USER_ID: {
+ const updateUserId: UpdateUserIdAction = <UpdateUserIdAction>action;
+ let newState = _.cloneDeep(state);
+ newState['userId'] = updateUserId.userId;
+ return newState;
+ }
+ case GeneralActions.REMOVE_INSTANCE: {
+ const actionData = (<RemoveInstanceAction>action);
+ if (state.serviceInstance[actionData.serviceModelId]) {
+ const typeNodeInformation : TypeNodeInformation = new TypeNodeInformation(actionData.node);
+ updateIsMissingDataOnDelete(state, actionData.serviceModelId, actionData.storeKey, actionData.node);
+ updateUniqueNames(state.serviceInstance[actionData.serviceModelId][typeNodeInformation.hierarchyName][actionData.storeKey].instanceName, null, state.serviceInstance[actionData.serviceModelId]);
+ if(actionData.node.data.type === 'VF'){
+ _.forOwn(state.serviceInstance[actionData.serviceModelId][typeNodeInformation.hierarchyName][actionData.storeKey].vfModules, (vfModuleMap) => {
+ _.forOwn(vfModuleMap, (vfModuleInstance) => {
+ updateUniqueNames(vfModuleInstance.instanceName, null, state.serviceInstance[actionData.serviceModelId]);
+ })
+ });
+ }
+ delete state.serviceInstance[actionData.serviceModelId][typeNodeInformation.hierarchyName][actionData.storeKey];
+ }
+ return Object.assign({}, state);
+ }
+
+ case GeneralActions.CHANGE_INSTANCE_COUNTER : {
+ const changeInstanceCounterAction = <ChangeInstanceCounterAction>action;
+ const typeNodeInformation : TypeNodeInformation = new TypeNodeInformation(changeInstanceCounterAction.node);
+ let newState = _.cloneDeep(state);
+
+ let existing: number = getExistingCounter(newState, changeInstanceCounterAction.serviceUUID, changeInstanceCounterAction.UUID, typeNodeInformation);
+ newState.serviceInstance[changeInstanceCounterAction.serviceUUID][typeNodeInformation.existingMappingCounterName][changeInstanceCounterAction.UUID] = existing ? existing + changeInstanceCounterAction.changeBy : changeInstanceCounterAction.changeBy;
+ return newState;
+ }
+
+ case GeneralActions.DUPLICATE_BULK_INSTANCES : {
+ const createInstanceAction = <DuplicateBulkInstancesAction>action;
+ const typeNodeInformation : TypeNodeInformation = new TypeNodeInformation(createInstanceAction.node);
+ const serviceId = createInstanceAction.serviceId;
+ const objects = createInstanceAction.objects;
+
+ let newState = _.cloneDeep(state);
+ newState.serviceInstance[serviceId].existingNames = createInstanceAction.existingNames;
+ newState.serviceInstance[serviceId][typeNodeInformation.hierarchyName] = Object.assign({}, newState.serviceInstance[serviceId][typeNodeInformation.hierarchyName], objects);
+ return newState;
+ }
+ }
+}
+
+const getExistingCounter = (state: any, serviceModelId: string, modelId: string, typeNodeInformation : TypeNodeInformation ) : number => {
+ const serviceExistingCounterMap = state.serviceInstance[serviceModelId][typeNodeInformation.existingMappingCounterName];
+ if(serviceExistingCounterMap && !_.isNil(serviceExistingCounterMap[modelId])){
+ return serviceExistingCounterMap[modelId];
+ }else {
+ return null;
+ }
+};
+
+const updateIsMissingDataOnDelete = (state: any, serviceModelId: string, storeKey: string, node: ITreeNode): void => {
+ const typeNodeInformation : TypeNodeInformation = new TypeNodeInformation(node);
+ let vnf = state.serviceInstance[serviceModelId][typeNodeInformation.hierarchyName][storeKey];
+ if(node.children){
+ _.forOwn(vnf.vfModules, (vfModules, vfModulesKey) => {
+ updateIsMissingDataOnDeleteVFModule(state, serviceModelId, storeKey, vfModulesKey);
+ });
+ }
+
+
+ let isMissingData: boolean = state.serviceInstance[serviceModelId][typeNodeInformation.hierarchyName][storeKey].isMissingData;
+ updateServiceValidationCounter(state, isMissingData, false, serviceModelId);
+};
+
+const updateUniqueNames = (oldName : string, newName : string, serviceInstance : ServiceInstance) : void => {
+ let existingNames = serviceInstance.existingNames;
+ if (!_.isNil(oldName) && oldName.toLowerCase() in existingNames) {
+ delete existingNames[oldName.toLowerCase()];
+ }
+ if(!_.isNil(newName)) {
+ existingNames[newName.toLowerCase()] = "";
+ }
+};
+
+const updateIsMissingDataOnDeleteVFModule = (state: any, serviceModelId: string, vnfStoreKey: string, vfModuleName): void => {
+ const vfModules = state.serviceInstance[serviceModelId].vnfs[vnfStoreKey].vfModules[vfModuleName];
+
+ _.forOwn(vfModules, (vfModuleInstance) => {
+ let isMissingData: boolean = vfModuleInstance.isMissingData;
+ updateServiceValidationCounter(state, isMissingData, false, serviceModelId);
+ });
+};
+
+const updateServiceValidationCounter = (newState: any, oldValidationState: boolean, newValidationState: boolean, serviceUuid: string) => {
+ if (oldValidationState && !newValidationState) {
+ newState.serviceInstance[serviceUuid].validationCounter--;
+ } else if (!oldValidationState && newValidationState) {
+ newState.serviceInstance[serviceUuid].validationCounter++;
+ }
+};
+
+
+
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/global/global.actions.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/global/global.actions.ts
new file mode 100644
index 000000000..609ec69f4
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/storeUtil/utils/global/global.actions.ts
@@ -0,0 +1,37 @@
+import {Action, ActionCreator} from "redux";
+
+export enum GlobalActions {
+ UPDATE_NAME = 'UPDATE_NAME',
+ UPDATE_FLAGS = 'UPDATE_FLAGS',
+ UPDATE_DRAWING_BOARD_STATUS = 'UPDATE_DRAWING_BOARD_STATUS'
+}
+
+export interface UpdateGlobalAction extends Action {
+ name?: string;
+}
+
+export interface UpdateFlagsAction extends Action {
+ flags?: any;
+}
+
+export interface UpdateDrawingBoardStatusAction extends Action{
+ drawingBoardStatus?: any;
+}
+
+export const updateName: ActionCreator<UpdateGlobalAction> =
+ (name) => ({
+ type: GlobalActions.UPDATE_NAME,
+ name: name
+ });
+
+export const updateFlags: ActionCreator<UpdateFlagsAction> =
+ (flags) => ({
+ type: GlobalActions.UPDATE_FLAGS,
+ flags: flags
+ });
+
+export const updateDrawingBoardStatus: ActionCreator<UpdateDrawingBoardStatusAction> =
+ (drawingBoardStatus) => ({
+ type: GlobalActions.UPDATE_DRAWING_BOARD_STATUS,
+ drawingBoardStatus: drawingBoardStatus
+ });
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/global/global.reducers.spec.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/global/global.reducers.spec.ts
new file mode 100644
index 000000000..4fc80863a
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/storeUtil/utils/global/global.reducers.spec.ts
@@ -0,0 +1,48 @@
+import {GlobalActions, UpdateFlagsAction, UpdateGlobalAction, UpdateDrawingBoardStatusAction} from "./global.actions";
+import {globalReducer} from "./global.reducers";
+
+
+describe('globalReducer', () => {
+
+ test('#UPDATE_FLAGS : should update global flags', () => {
+ const flags = {
+ 'A' : 'A',
+ 'B' : 'B',
+ 'C' : 'C',
+ 'D' : 'D'
+ };
+ let flagsState = globalReducer(<any>{global : {}},
+ <UpdateFlagsAction>{
+ type: GlobalActions.UPDATE_FLAGS,
+ flags : flags
+ }).flags;
+
+ expect(flagsState).toBeDefined();
+ expect(<any>flagsState).toEqual(<any>flags);
+ });
+
+ test('#UPDATE_NAME : should update global name', () => {
+ const name = 'name';
+ let globalState = globalReducer(<any>{global : {}},
+ <UpdateGlobalAction>{
+ type: GlobalActions.UPDATE_NAME,
+ name : name
+ });
+ expect(globalState).toBeDefined();
+ expect(globalState.name).toEqual(name);
+ });
+
+ test('#UPDATE_DRAWING_BOARD_STATUS : should update global drawing board status', ()=> {
+ const drawingBoardStatus = 'EDIT';
+ let globalDrawingBoardState = globalReducer(<any>{global : {}},
+ <UpdateDrawingBoardStatusAction>{
+ type: GlobalActions.UPDATE_DRAWING_BOARD_STATUS,
+ drawingBoardStatus : drawingBoardStatus
+ });
+ expect(globalDrawingBoardState).toBeDefined();
+ expect(globalDrawingBoardState.drawingBoardStatus).toEqual(drawingBoardStatus);
+ });
+});
+
+
+
diff --git a/vid-webpack-master/src/app/global.reducer.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/global/global.reducers.ts
index cffd34603..f9e083414 100644
--- a/vid-webpack-master/src/app/global.reducer.ts
+++ b/vid-webpack-master/src/app/shared/storeUtil/utils/global/global.reducers.ts
@@ -1,28 +1,28 @@
-/* tslint:disable no-switch-case-fall-through */
import {Action} from 'redux';
-import {UPDATE_FLAGS, UPDATE_NAME, UpdateFlagsAction, UpdateGlobalAction} from "./global.actions";
-
-
+import {GlobalActions, UpdateFlagsAction, UpdateGlobalAction, UpdateDrawingBoardStatusAction} from "./global.actions";
export interface GlobalState {
name : string;
flags : { [key: string]: boolean };
+ drawingBoardStatus : string;
}
const initialState: GlobalState = {
name : null,
- flags : null
+ flags : null,
+ drawingBoardStatus : null
};
-
-export const GlobalReducer =
+export const globalReducer =
function (state: GlobalState = initialState, action: Action): GlobalState {
switch (action.type) {
- case UPDATE_NAME:
+ case GlobalActions.UPDATE_NAME:
return Object.assign(state, state, (<UpdateGlobalAction>action));
- case UPDATE_FLAGS:
+ case GlobalActions.UPDATE_FLAGS:
Object.assign(state, (<UpdateFlagsAction>action));
return Object.assign({}, state);
+ case GlobalActions.UPDATE_DRAWING_BOARD_STATUS:
+ return Object.assign(state, state, (<UpdateDrawingBoardStatusAction>action));
default:
return state;
}
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/main.reducer.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/main.reducer.ts
new file mode 100644
index 000000000..2166c81a0
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/storeUtil/utils/main.reducer.ts
@@ -0,0 +1,67 @@
+import {LcpRegionsAndTenants} from "../../models/lcpRegionsAndTenants";
+import {CategoryParams} from "../../models/categoryParams";
+import {Action} from "redux";
+import {ServiceActions} from "./service/service.actions";
+import {GeneralActions} from "./general/general.actions";
+import {NetworkActions} from "./network/network.actions";
+import {VfModuleActions} from "./vfModule/vfModule.actions";
+import {VNFActions} from "./vnf/vnf.actions";
+import {vnfReducer} from "./vnf/vnf.reducers";
+import {generalReducer} from "./general/general.reducers";
+import {serviceReducer} from "./service/service.reducers";
+import {networkReducer} from "./network/network.reducers";
+import {vfModuleReducer} from "./vfModule/vfModule.reducers";
+import {ServiceInstance} from "../../models/serviceInstance";
+import {SelectOptionInterface} from "../../models/selectOption";
+import {ServiceType} from "../../models/serviceType";
+import {VnfGroupActions} from "./vnfGroup/vnfGroup.actions";
+import {vnfGroupReducer} from "./vnfGroup/vnfGroup.reducers";
+import {RelatedVnfActions} from "./relatedVnfMember/relatedVnfMember.actions";
+import {relatedVnfMemeberReducer} from "./relatedVnfMember/relatedVnfMember.reducers";
+
+export let initialState: ServiceState = {
+ serviceHierarchy: {},
+ serviceInstance: {},
+ lcpRegionsAndTenants: new LcpRegionsAndTenants(),
+ subscribers: null,
+ productFamilies: null,
+ serviceTypes: {},
+ aicZones: null,
+ categoryParameters: new CategoryParams()
+};
+
+
+export interface ServiceState {
+ serviceHierarchy: any;
+ serviceInstance: { [uuid: string]: ServiceInstance; };
+ lcpRegionsAndTenants: LcpRegionsAndTenants;
+ subscribers: SelectOptionInterface[];
+ productFamilies: any;
+ serviceTypes: { [subscriberId: string]: ServiceType[]; };
+ aicZones: SelectOptionInterface[];
+ categoryParameters: CategoryParams;
+}
+
+export const MainReducer = function (state: ServiceState = initialState, action: Action): ServiceState {
+ console.info("action name", action.type);
+ if(Object.values(ServiceActions).includes(action.type)){
+ return serviceReducer(state, action);
+ }else if (Object.values(GeneralActions).includes(action.type)){
+ return generalReducer(state, action);
+ }else if (Object.values(NetworkActions).includes(action.type)){
+ return networkReducer(state, action);
+ }else if (Object.values(VfModuleActions).includes(action.type)){
+ return vfModuleReducer(state, action);
+ }else if (Object.values(VNFActions).includes(action.type)){
+ return vnfReducer(state, action);
+ }else if (Object.values(VnfGroupActions).includes(action.type)){
+ return vnfGroupReducer(state, action);
+ }else if(Object.values(RelatedVnfActions).includes(action.type)){
+ return relatedVnfMemeberReducer(state, action);
+ } else {
+ return Object.assign({}, state);
+ }
+};
+
+
+
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/network/network.actions.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/network/network.actions.ts
new file mode 100644
index 000000000..c90d8eb3d
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/storeUtil/utils/network/network.actions.ts
@@ -0,0 +1,94 @@
+import {Action, ActionCreator} from "redux";
+import {NetworkInstance} from "../../../models/networkInstance";
+
+export enum NetworkActions {
+ UPDATE_NETWORK_INSTANCE = "UPDATE_NETWORK_INSTANCE",
+ UPDATE_NETWORK_FUNCTION = 'UPDATE_NETWORK_FUNCTION',
+ CREATE_NETWORK_INSTANCE = 'CREATE_NETWORK_INSTANCE',
+ DELETE_ACTION_NETWORK_INSTANCE = "DELETE_ACTION_NETWORK_INSTANCE",
+ UNDO_DELETE_ACTION_NETWORK_INSTANCE = "UNDO_DELETE_ACTION_NETWORK_INSTANCE",
+ UPDATE_NETWORK_POSITION = "UPDATE_NETWORK_POSITION"
+
+}
+
+
+export interface UpdateNetworkPosition extends Action {
+ node: any,
+ instanceId : string,
+ networkStoreKey?: string;
+}
+
+export interface UpdateNetworkInstanceAction extends Action {
+ networkInstance?: NetworkInstance;
+ networkModelName?: string;
+ serviceUuid?: string;
+ networkStoreKey?:string;
+}
+
+export interface UpdateNetworkCollectionFunction extends Action {
+ networksAccordingToNetworkCollection: any;
+ network_function: any;
+}
+
+export interface CreateNetworkInstanceAction extends Action {
+ networkInstance?: NetworkInstance;
+ networkModelName?: string;
+ serviceUuid?: string;
+ networkStoreKey?:string;
+}
+
+export interface DeleteActionNetworkInstanceAction extends Action {
+ networkStoreKey: string;
+ serviceId?: string;
+}
+
+export interface UndoDeleteActionNetworkInstanceAction extends Action {
+ networkStoreKey: string;
+ serviceId?: string;
+}
+
+export const updateNetworkInstance: ActionCreator<UpdateNetworkInstanceAction> = (networkInstance, networkfModelName, serviceUuid, networkStoreKey) => ({
+ type: NetworkActions.UPDATE_NETWORK_INSTANCE,
+ networkInstance: networkInstance,
+ networkModelName: networkfModelName,
+ serviceUuid: serviceUuid,
+ networkStoreKey : networkStoreKey
+});
+
+
+export const updateNetworkCollectionFunction: ActionCreator<UpdateNetworkCollectionFunction> = (ncf, networksAccordingToNetworkCollection) => ({
+ type: NetworkActions.UPDATE_NETWORK_FUNCTION,
+ networksAccordingToNetworkCollection: networksAccordingToNetworkCollection["results"],
+ network_function: ncf
+});
+
+export const createNetworkInstance: ActionCreator<CreateNetworkInstanceAction> = (networkInstance, networkModelName, serviceUuid, networkStoreKey) => ({
+ type: NetworkActions.CREATE_NETWORK_INSTANCE,
+ networkInstance: networkInstance,
+ networkModelName: networkModelName,
+ serviceUuid: serviceUuid,
+ networkStoreKey : networkStoreKey
+});
+
+
+export const deleteActionNetworkInstance: ActionCreator<DeleteActionNetworkInstanceAction> = (networkStoreKey, serviceId) => ({
+ type: NetworkActions.DELETE_ACTION_NETWORK_INSTANCE,
+ networkStoreKey: networkStoreKey,
+ serviceId: serviceId
+});
+
+export const undoDeleteActionNetworkInstance: ActionCreator<UndoDeleteActionNetworkInstanceAction> = (networkStoreKey, serviceId) => ({
+ type: NetworkActions.UNDO_DELETE_ACTION_NETWORK_INSTANCE,
+ networkStoreKey: networkStoreKey,
+ serviceId: serviceId
+});
+
+
+export const updateNetworkPosition: ActionCreator<UpdateNetworkPosition> = (node, instanceId, networkStoreKey) => ({
+ type: NetworkActions.UPDATE_NETWORK_POSITION,
+ node: node,
+ instanceId: instanceId,
+ networkStoreKey : networkStoreKey
+});
+
+
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/network/network.reducers.spec.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/network/network.reducers.spec.ts
new file mode 100644
index 000000000..ba41ad6e6
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/storeUtil/utils/network/network.reducers.spec.ts
@@ -0,0 +1,114 @@
+import {networkReducer} from "./network.reducers";
+import {
+ CreateNetworkInstanceAction, DeleteActionNetworkInstanceAction,
+ NetworkActions, UndoDeleteActionNetworkInstanceAction,
+ UpdateNetworkCollectionFunction,
+ UpdateNetworkInstanceAction
+} from "./network.actions";
+import {NetworkInstance} from "../../../models/networkInstance";
+import {ServiceInstanceActions} from "../../../models/serviceInstanceActions";
+
+
+describe('networkReducer', () => {
+ test('#CREATE_SERVICE_INSTANCE', () => {
+ let networkInstance: NetworkInstance = new NetworkInstance();
+ networkInstance.isMissingData = false;
+ networkInstance.instanceName = 'instanceName';
+ let networkState = networkReducer(<any>{serviceInstance : {
+ 'serviceModelId' : {
+ networks : {
+ 'networkStoreKey' : {
+ isMissingData : true
+ }
+ }
+ }
+ }},
+ <UpdateNetworkInstanceAction>{
+ type: NetworkActions.UPDATE_NETWORK_INSTANCE,
+ networkInstance : new NetworkInstance(),
+ networkStoreKey : 'networkStoreKey',
+ networkModelName : 'networkModelName',
+ serviceUuid : 'serviceModelId'
+ }).serviceInstance['serviceModelId'].networks['networkStoreKey'];
+
+ expect(networkState).toBeDefined();
+ expect(networkState.isMissingData).toBeFalsy();
+ });
+
+ test('#CREATE_NETWORK_INSTANCE', () => {
+ let networkInstance: NetworkInstance = new NetworkInstance();
+ networkInstance.isMissingData = false;
+ networkInstance.instanceName = 'instanceName';
+ let networkState = networkReducer(<any>{serviceInstance : {
+ 'serviceModelId' : {
+ networks : {}
+ }
+ }},
+ <CreateNetworkInstanceAction>{
+ type: NetworkActions.CREATE_NETWORK_INSTANCE,
+ networkInstance : new NetworkInstance(),
+ networkStoreKey : null,
+ networkModelName : 'networkModelName',
+ serviceUuid : 'serviceModelId'
+ }).serviceInstance['serviceModelId'].networks['networkModelName'];
+
+ expect(networkState).toBeDefined();
+ expect(networkState.isMissingData).toBeFalsy();
+ });
+
+ test('#UPDATE_NETWORK_FUNCTION', () => {
+ let state = networkReducer(<any>{serviceInstance : {}},
+ <UpdateNetworkCollectionFunction>{
+ type: NetworkActions.UPDATE_NETWORK_FUNCTION,
+ networksAccordingToNetworkCollection: 'networksAccordingToNetworkCollection',
+ network_function: 'network_function'
+ });
+
+ expect(state).toBeDefined();
+ });
+
+ test('#DELETE_ACTION_NETWORK_INSTANCE', () => {
+ let networkState = networkReducer(<any>{serviceInstance : {
+ 'serviceModelId' : {
+ networks : {
+ 'networkStoreKey' : {
+ isMissingData : true,
+ action : 'None'
+ }
+ }
+ }
+ }},
+ <DeleteActionNetworkInstanceAction>{
+ type: NetworkActions.DELETE_ACTION_NETWORK_INSTANCE,
+ networkStoreKey: 'networkStoreKey',
+ serviceId: 'serviceModelId'
+ }).serviceInstance['serviceModelId'].networks['networkStoreKey'];
+
+ expect(networkState).toBeDefined();
+ expect(networkState.action).toEqual(ServiceInstanceActions.None_Delete);
+ });
+
+ test('#UNDO_DELETE_ACTION_NETWORK_INSTANCE', () => {
+ let networkState = networkReducer(<any>{serviceInstance : {
+ 'serviceModelId' : {
+ networks : {
+ 'networkStoreKey' : {
+ isMissingData : true,
+ action : 'Update_Delete'
+ }
+ }
+ }
+ }},
+ <UndoDeleteActionNetworkInstanceAction>{
+ type: NetworkActions.UNDO_DELETE_ACTION_NETWORK_INSTANCE,
+ networkStoreKey: 'networkStoreKey',
+ serviceId: 'serviceModelId'
+ }).serviceInstance['serviceModelId'].networks['networkStoreKey'];
+
+ expect(networkState).toBeDefined();
+ expect(networkState.action).toEqual(ServiceInstanceActions.Update);
+ });
+});
+
+
+
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/network/network.reducers.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/network/network.reducers.ts
new file mode 100644
index 000000000..bcbbea57d
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/storeUtil/utils/network/network.reducers.ts
@@ -0,0 +1,102 @@
+import {Action} from "redux";
+import * as _ from "lodash";
+import {NetworkInstance} from "../../../models/networkInstance";
+import {
+ CreateNetworkInstanceAction, DeleteActionNetworkInstanceAction,
+ NetworkActions, UndoDeleteActionNetworkInstanceAction,
+ UpdateNetworkCollectionFunction,
+ UpdateNetworkInstanceAction
+} from "./network.actions";
+import {ServiceInstance} from "../../../models/serviceInstance";
+import {calculateNextUniqueModelName} from "../vnf/vnf.reducers";
+import {ServiceState} from "../main.reducer";
+import {ServiceInstanceActions} from "../../../models/serviceInstanceActions";
+
+
+export function networkReducer(state: ServiceState , action: Action) : ServiceState {
+ switch (action.type) {
+ case NetworkActions.CREATE_NETWORK_INSTANCE: {
+ const updateNetworkInstanceAction = <CreateNetworkInstanceAction>action;
+ const serviceUuid = updateNetworkInstanceAction.serviceUuid;
+ let networkModelName = updateNetworkInstanceAction.networkModelName;
+
+
+ let newState = _.cloneDeep(state);
+
+ updateNetworkInstanceAction.networkInstance.originalName = networkModelName;
+ updateNetworkInstanceAction.networkModelName = calculateNextUniqueModelName(networkModelName, serviceUuid, newState, 'networks');
+
+ let networkInstance: NetworkInstance = newState.serviceInstance[serviceUuid].networks[networkModelName];
+ networkInstance = new NetworkInstance();
+ updateNetworkInstanceAction.networkInstance.networkStoreKey = updateNetworkInstanceAction.networkModelName;
+ updateNetworkInstanceAction.networkInstance.originalName = networkModelName;
+ networkInstance.originalName = updateNetworkInstanceAction.networkInstance.originalName;
+ networkInstance.networkStoreKey = updateNetworkInstanceAction.networkInstance.networkStoreKey;
+ updateServiceValidationCounter(newState, networkInstance['isMissingData'], updateNetworkInstanceAction.networkInstance['isMissingData'], serviceUuid);
+
+ newState.serviceInstance[serviceUuid].networks[updateNetworkInstanceAction.networkModelName] = Object.assign(networkInstance, updateNetworkInstanceAction.networkInstance);
+ return newState;
+ }
+ case NetworkActions.UPDATE_NETWORK_INSTANCE: {
+ const updateNetworkInstanceAction = <UpdateNetworkInstanceAction>action;
+ const serviceUuid = updateNetworkInstanceAction.serviceUuid;
+ let networkStoreKey = updateNetworkInstanceAction.networkStoreKey;
+
+ let newState = _.cloneDeep(state);
+ let networkInstance: NetworkInstance = newState.serviceInstance[serviceUuid].networks[networkStoreKey];
+ updateUniqueNames(networkInstance? networkInstance.instanceName : null, updateNetworkInstanceAction.networkInstance.instanceName, newState.serviceInstance[serviceUuid]);
+
+ networkInstance = networkInstance || new NetworkInstance();
+ updateServiceValidationCounter(newState, networkInstance['isMissingData'], updateNetworkInstanceAction.networkInstance['isMissingData'], serviceUuid);
+
+ newState.serviceInstance[serviceUuid].networks[networkStoreKey] = Object.assign(networkInstance, updateNetworkInstanceAction.networkInstance);
+ return newState;
+ }
+ case NetworkActions.UPDATE_NETWORK_FUNCTION: {
+ let networkFunctionReduxObj = state['networkFunctions'] == undefined ? {} : state['networkFunctions'];
+ networkFunctionReduxObj[(<UpdateNetworkCollectionFunction>action).network_function] = (<UpdateNetworkCollectionFunction>action).networksAccordingToNetworkCollection;
+ Object.assign(state, {'networkFunctions': networkFunctionReduxObj});
+ return Object.assign({}, state);
+ }
+ case NetworkActions.DELETE_ACTION_NETWORK_INSTANCE : {
+ let newState = _.cloneDeep(state);
+ let network = newState.serviceInstance[(<DeleteActionNetworkInstanceAction>action).serviceId].networks[(<DeleteActionNetworkInstanceAction>action).networkStoreKey];
+ let oldAction = network.action;
+ if(oldAction === ServiceInstanceActions.None_Delete || oldAction === ServiceInstanceActions.Update_Delete) return newState;
+ newState.serviceInstance[(<DeleteActionNetworkInstanceAction>action).serviceId].networks[(<DeleteActionNetworkInstanceAction>action).networkStoreKey].action = (oldAction + '_Delete') as ServiceInstanceActions;
+ updateServiceValidationCounter(newState, network['isMissingData'], false , (<DeleteActionNetworkInstanceAction>action).serviceId);
+
+ return newState;
+ }
+
+ case NetworkActions.UNDO_DELETE_ACTION_NETWORK_INSTANCE : {
+ let newState = _.cloneDeep(state);
+ let network = newState.serviceInstance[(<UndoDeleteActionNetworkInstanceAction>action).serviceId].networks[(<UndoDeleteActionNetworkInstanceAction>action).networkStoreKey];
+ let oldState = network.action;
+ newState.serviceInstance[(<UndoDeleteActionNetworkInstanceAction>action).serviceId].networks[(<UndoDeleteActionNetworkInstanceAction>action).networkStoreKey].action = (oldState.split('_')[0]) as ServiceInstanceActions;
+ updateServiceValidationCounter(newState, network['isMissingData'], false , (<DeleteActionNetworkInstanceAction>action).serviceId);
+ return newState;
+ }
+ }
+}
+
+const updateUniqueNames = (oldName : string, newName : string, serviceInstance : ServiceInstance) : void => {
+ let existingNames = serviceInstance.existingNames;
+ if (!_.isNil(oldName) && oldName.toLowerCase() in existingNames) {
+ delete existingNames[oldName.toLowerCase()];
+ }
+ if(!_.isNil(newName)) {
+ existingNames[newName.toLowerCase()] = "";
+ }
+};
+
+
+const updateServiceValidationCounter = (newState: any, oldValidationState: boolean, newValidationState: boolean, serviceUuid: string) => {
+ if (oldValidationState && !newValidationState) {
+ newState.serviceInstance[serviceUuid].validationCounter--;
+ } else if (!oldValidationState && newValidationState) {
+ newState.serviceInstance[serviceUuid].validationCounter++;
+ }
+};
+
+
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/relatedVnfMember/relatedVnfMember.actions.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/relatedVnfMember/relatedVnfMember.actions.ts
new file mode 100644
index 000000000..faa7a52d3
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/storeUtil/utils/relatedVnfMember/relatedVnfMember.actions.ts
@@ -0,0 +1,68 @@
+import {Action, ActionCreator} from "redux";
+
+export enum RelatedVnfActions {
+ CREATE_RELATED_VNF_MEMBER_INSTANCE = "CREATE_RELATED_VNF_MEMBER_INSTANCE",
+ REMOVE_RELATED_VNF_MEMBER_INSTANCE = "REMOVE_RELATED_VNF_MEMBER_INSTANCE",
+ DELETE_ACTION_RELATED_VNF_MEMBER_INSTANCE = "DELETE_ACTION_RELATED_VNF_MEMBER_INSTANCE",
+ UNDO_DELETE_ACTION_RELATED_VNF_MEMBER_INSTANCE = "UNDO_DELETE_ACTION_RELATED_VNF_MEMBER_INSTANCE"
+}
+
+export interface RemoveRelatedVnfMemebrInstance extends Action {
+ vnfGroupStoreKey: string;
+ relatedVnfMemeberStoreKey: string;
+ serviceId?: string;
+}
+
+export interface DeleteRelatedVnfMemebrInstanceAction extends Action {
+ vnfGroupStoreKey: string;
+ relatedVnfMemeberStoreKey: string;
+ serviceId?: string;
+}
+
+export interface DeleteActionRelatedVnfMemeberInstanceAction extends Action {
+ vnfGroupStoreKey: string;
+ relatedVnfMemeberStoreKey: string;
+ serviceId?: string;
+}
+
+export interface UndoDeleteActionRelatedVnfMemeberInstanceAction extends Action {
+ vnfGroupStoreKey: string;
+ relatedVnfMemeberStoreKey: string;
+ serviceId?: string;
+}
+
+export interface CreateRelatedVnfMemeberInstanceAction extends Action {
+ relatedVnfMember: any;
+ vnfGroupStoreKey: string;
+ serviceId?: string;
+}
+
+
+export const removeRelatedVnfMemberInstance: ActionCreator<RemoveRelatedVnfMemebrInstance> = (vnfGroupStoreKey, relatedVnfMemeberStoreKey, serviceId) => ({
+ type: RelatedVnfActions.REMOVE_RELATED_VNF_MEMBER_INSTANCE,
+ vnfGroupStoreKey: vnfGroupStoreKey,
+ relatedVnfMemeberStoreKey: relatedVnfMemeberStoreKey,
+ serviceId: serviceId
+});
+
+export const deleteActionRelatedVnfMemberInstance: ActionCreator<DeleteActionRelatedVnfMemeberInstanceAction> = (vnfGroupStoreKey, relatedVnfMemeberStoreKey, serviceId) => ({
+ type: RelatedVnfActions.DELETE_ACTION_RELATED_VNF_MEMBER_INSTANCE,
+ vnfGroupStoreKey: vnfGroupStoreKey,
+ relatedVnfMemeberStoreKey: relatedVnfMemeberStoreKey,
+ serviceId: serviceId
+});
+
+export const undoDeleteActionRelatedVnfMemberInstance: ActionCreator<UndoDeleteActionRelatedVnfMemeberInstanceAction> = (vnfGroupStoreKey, relatedVnfMemeberStoreKey, serviceId) => ({
+ type: RelatedVnfActions.UNDO_DELETE_ACTION_RELATED_VNF_MEMBER_INSTANCE,
+ vnfGroupStoreKey: vnfGroupStoreKey,
+ relatedVnfMemeberStoreKey: relatedVnfMemeberStoreKey,
+ serviceId: serviceId
+});
+
+
+export const createRelatedVnfMemberInstance: ActionCreator<CreateRelatedVnfMemeberInstanceAction> = (vnfGroupStoreKey, serviceId, relatedVnfMember) => ({
+ type: RelatedVnfActions.CREATE_RELATED_VNF_MEMBER_INSTANCE,
+ relatedVnfMember: relatedVnfMember,
+ vnfGroupStoreKey: vnfGroupStoreKey,
+ serviceId: serviceId
+});
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/relatedVnfMember/relatedVnfMember.reducers.spec.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/relatedVnfMember/relatedVnfMember.reducers.spec.ts
new file mode 100644
index 000000000..347957480
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/storeUtil/utils/relatedVnfMember/relatedVnfMember.reducers.spec.ts
@@ -0,0 +1,153 @@
+import {relatedVnfMemeberReducer} from "./relatedVnfMember.reducers";
+import {
+ CreateRelatedVnfMemeberInstanceAction,
+ DeleteActionRelatedVnfMemeberInstanceAction,
+ RelatedVnfActions,
+ UndoDeleteActionRelatedVnfMemeberInstanceAction
+} from "./relatedVnfMember.actions";
+import {ServiceInstanceActions} from "../../../models/serviceInstanceActions";
+
+
+describe('relatedVnfMemberReducer', () => {
+
+ test('#DELETE_ACTION_RELATED_VNF_MEMBER_INSTANCE should change action to delete',() => {
+ const serviceUuid: string = 'serviceUuid';
+ const actionName: ServiceInstanceActions = ServiceInstanceActions.None;
+
+ let service = relatedVnfMemeberReducer(<any>{
+ serviceInstance: {
+ 'serviceUuid': {
+ 'vnfGroups' : {
+ 'vnfGroupStoreKey' : {
+ 'vnfs' : {
+ 'vnfStoreKey1' : {
+ 'action' : actionName
+ }
+ }
+ }
+
+ }
+ }
+ }
+ }, <DeleteActionRelatedVnfMemeberInstanceAction>{
+ type: RelatedVnfActions.DELETE_ACTION_RELATED_VNF_MEMBER_INSTANCE,
+ vnfGroupStoreKey: 'vnfGroupStoreKey',
+ relatedVnfMemeberStoreKey : 'vnfStoreKey1',
+ serviceId : 'serviceUuid'
+ });
+
+ expect(service.serviceInstance[serviceUuid].vnfGroups['vnfGroupStoreKey']['vnfs']['vnfStoreKey1'].action).toEqual('None_Delete');
+ });
+
+ test('#UNDO_DELETE_ACTION_RELATED_VNF_MEMBER_INSTANCE should undo change action to delete', () => {
+ const serviceUuid: string = 'serviceUuid';
+ const actionName: ServiceInstanceActions = ServiceInstanceActions.None_Delete;
+
+ let service = relatedVnfMemeberReducer(<any>{
+ serviceInstance: {
+ 'serviceUuid': {
+ 'vnfGroups' : {
+ 'vnfGroupStoreKey' : {
+ 'vnfs' : {
+ 'vnfStoreKey1' : {
+ 'action' : actionName
+ }
+ }
+ }
+
+ }
+ }
+ }
+ }, <UndoDeleteActionRelatedVnfMemeberInstanceAction>{
+ type: RelatedVnfActions.UNDO_DELETE_ACTION_RELATED_VNF_MEMBER_INSTANCE,
+ vnfGroupStoreKey: 'vnfGroupStoreKey',
+ relatedVnfMemeberStoreKey : 'vnfStoreKey1',
+ serviceId : 'serviceUuid'
+ });
+
+ expect(service.serviceInstance[serviceUuid].vnfGroups['vnfGroupStoreKey']['vnfs']['vnfStoreKey1'].action).toEqual('None');
+ });
+
+ test('#REMOVE_RELATED_VNF_MEMBER_INSTANCE should remove instance', () => {
+ const serviceUuid: string = 'serviceUuid';
+ const actionName: ServiceInstanceActions = ServiceInstanceActions.None_Delete;
+
+ let service = relatedVnfMemeberReducer(<any>{
+ serviceInstance: {
+ 'serviceUuid': {
+ 'vnfGroups' : {
+ 'vnfGroupStoreKey' : {
+ 'vnfs' : {
+ 'vnfStoreKey1' : {
+ 'action' : actionName
+ }
+ }
+ }
+
+ }
+ }
+ }
+ }, <UndoDeleteActionRelatedVnfMemeberInstanceAction>{
+ type: RelatedVnfActions.UNDO_DELETE_ACTION_RELATED_VNF_MEMBER_INSTANCE,
+ vnfGroupStoreKey: 'vnfGroupStoreKey',
+ relatedVnfMemeberStoreKey : 'vnfStoreKey1',
+ serviceId : 'serviceUuid'
+ });
+
+ expect(service.serviceInstance[serviceUuid].vnfGroups['vnfGroupStoreKey']['vnfs']['vnfStoreKey1'].action).toEqual('None');
+ });
+
+ test('#CREATE_RELATED_VNF_MEMBER_INSTANCE should add new relatedVNF instance', () => {
+ const serviceUuid: string = 'serviceUuid';
+ const actionName: ServiceInstanceActions = ServiceInstanceActions.None_Delete;
+ let relatedVnfMember = {
+ "instanceName":"VNF1_INSTANCE_NAME",
+ "instanceId":"VNF1_INSTANCE_ID",
+ "orchStatus":null,
+ "productFamilyId":null,
+ "lcpCloudRegionId":"mtn23b",
+ "tenantId":"3e9a20a3e89e45f884e09df0cc2d2d2a",
+ "tenantName":"APPC-24595-T-IST-02C",
+ "modelInfo":{
+ "modelInvariantId":"vnf-instance-model-invariant-id",
+ "modelVersionId":"7a6ee536-f052-46fa-aa7e-2fca9d674c44",
+ "modelVersion":"2.0",
+ "modelName":"vf_vEPDG",
+ "modelType":"vnf"
+ },
+ "instanceType":"VNF1_INSTANCE_TYPE",
+ "provStatus":null,
+ "inMaint":false,
+ "uuid":"7a6ee536-f052-46fa-aa7e-2fca9d674c44",
+ "originalName":null,
+ "legacyRegion":null,
+ "lineOfBusiness":null,
+ "platformName":null,
+ "trackById":"7a6ee536-f052-46fa-aa7e-2fca9d674c44:002",
+ "serviceInstanceId":"service-instance-id1",
+ "serviceInstanceName":"service-instance-name"
+ };
+
+ let service = relatedVnfMemeberReducer(<any>{
+ serviceInstance: {
+ 'serviceUuid': {
+ 'vnfGroups' : {
+ 'vnfGroupStoreKey' : { }
+ }
+ }
+ }
+ }, <CreateRelatedVnfMemeberInstanceAction>{
+ type: RelatedVnfActions.CREATE_RELATED_VNF_MEMBER_INSTANCE,
+ relatedVnfMember: relatedVnfMember,
+ vnfGroupStoreKey: 'vnfGroupStoreKey',
+ serviceId: serviceUuid
+ });
+
+ expect(service.serviceInstance[serviceUuid].vnfGroups['vnfGroupStoreKey']['vnfs']['VNF1_INSTANCE_ID'].action).toEqual('Create');
+ expect(service.serviceInstance[serviceUuid].vnfGroups['vnfGroupStoreKey']['vnfs']['VNF1_INSTANCE_ID'].instanceId).toEqual('VNF1_INSTANCE_ID');
+ });
+
+});
+
+
+
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/relatedVnfMember/relatedVnfMember.reducers.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/relatedVnfMember/relatedVnfMember.reducers.ts
new file mode 100644
index 000000000..250f934be
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/storeUtil/utils/relatedVnfMember/relatedVnfMember.reducers.ts
@@ -0,0 +1,58 @@
+import {Action} from "redux";
+import * as _ from "lodash";
+import {ServiceState} from "../main.reducer";
+import {ServiceInstanceActions} from "../../../models/serviceInstanceActions";
+import {
+ CreateRelatedVnfMemeberInstanceAction,
+ DeleteActionRelatedVnfMemeberInstanceAction, DeleteRelatedVnfMemebrInstanceAction,
+ RelatedVnfActions,
+ UndoDeleteActionRelatedVnfMemeberInstanceAction
+} from "./relatedVnfMember.actions";
+
+export function relatedVnfMemeberReducer(state: ServiceState, action: Action): ServiceState {
+ switch (action.type) {
+
+ case RelatedVnfActions.DELETE_ACTION_RELATED_VNF_MEMBER_INSTANCE : {
+ let newState = _.cloneDeep(state);
+ let relatedVnfMember = newState.serviceInstance[(<DeleteActionRelatedVnfMemeberInstanceAction>action).serviceId].vnfGroups[(<DeleteActionRelatedVnfMemeberInstanceAction>action).vnfGroupStoreKey]['vnfs'][(<DeleteActionRelatedVnfMemeberInstanceAction>action).relatedVnfMemeberStoreKey];
+ let oldAction = relatedVnfMember.action;
+ if(oldAction === ServiceInstanceActions.None_Delete || oldAction === ServiceInstanceActions.Update_Delete) return newState;
+ newState.serviceInstance[(<DeleteActionRelatedVnfMemeberInstanceAction>action).serviceId].vnfGroups[(<DeleteActionRelatedVnfMemeberInstanceAction>action).vnfGroupStoreKey]['vnfs'][(<DeleteActionRelatedVnfMemeberInstanceAction>action).relatedVnfMemeberStoreKey].action = (oldAction + '_Delete') as ServiceInstanceActions;
+ return newState;
+ }
+
+ case RelatedVnfActions.UNDO_DELETE_ACTION_RELATED_VNF_MEMBER_INSTANCE : {
+ let newState = _.cloneDeep(state);
+ let relatedVnfMember = newState.serviceInstance[(<UndoDeleteActionRelatedVnfMemeberInstanceAction>action).serviceId].vnfGroups[(<UndoDeleteActionRelatedVnfMemeberInstanceAction>action).vnfGroupStoreKey]['vnfs'][(<UndoDeleteActionRelatedVnfMemeberInstanceAction>action).relatedVnfMemeberStoreKey];
+ let oldState = relatedVnfMember.action;
+ newState.serviceInstance[(<DeleteActionRelatedVnfMemeberInstanceAction>action).serviceId].vnfGroups[(<DeleteActionRelatedVnfMemeberInstanceAction>action).vnfGroupStoreKey]['vnfs'][(<DeleteActionRelatedVnfMemeberInstanceAction>action).relatedVnfMemeberStoreKey].action = (oldState.split('_')[0]) as ServiceInstanceActions;
+ return newState;
+ }
+
+ case RelatedVnfActions.REMOVE_RELATED_VNF_MEMBER_INSTANCE : {
+ let newState = _.cloneDeep(state);
+ delete newState.serviceInstance[(<DeleteRelatedVnfMemebrInstanceAction>action).serviceId].vnfGroups[(<DeleteRelatedVnfMemebrInstanceAction>action).vnfGroupStoreKey]['vnfs'][(<DeleteRelatedVnfMemebrInstanceAction>action).relatedVnfMemeberStoreKey];
+ return newState;
+ }
+
+ case RelatedVnfActions.CREATE_RELATED_VNF_MEMBER_INSTANCE : {
+ let newState = _.cloneDeep(state);
+ let relatedVnfMember = (<CreateRelatedVnfMemeberInstanceAction>action).relatedVnfMember;
+ relatedVnfMember['action'] = 'Create';
+ relatedVnfMember['vnfStoreKey'] = relatedVnfMember.instanceId;
+ relatedVnfMember['trackById'] = relatedVnfMember.instanceId;
+ relatedVnfMember['instanceName'] = relatedVnfMember.instanceName;
+ if(_.isNil(newState.serviceInstance[(<CreateRelatedVnfMemeberInstanceAction>action).serviceId].vnfGroups[(<CreateRelatedVnfMemeberInstanceAction>action).vnfGroupStoreKey]['vnfs'])){
+ newState.serviceInstance[(<CreateRelatedVnfMemeberInstanceAction>action).serviceId].vnfGroups[(<CreateRelatedVnfMemeberInstanceAction>action).vnfGroupStoreKey]['vnfs'] = {};
+ }
+ newState.serviceInstance[(<CreateRelatedVnfMemeberInstanceAction>action).serviceId].vnfGroups[(<CreateRelatedVnfMemeberInstanceAction>action).vnfGroupStoreKey]['vnfs'][(<CreateRelatedVnfMemeberInstanceAction>action).relatedVnfMember['instanceId']] = relatedVnfMember;
+ newState.serviceInstance[(<CreateRelatedVnfMemeberInstanceAction>action).serviceId].isDirty = true;
+ return newState;
+ }
+ }
+}
+
+
+
+
+
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/service/service.actions.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/service/service.actions.ts
new file mode 100644
index 000000000..e4e7e494e
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/storeUtil/utils/service/service.actions.ts
@@ -0,0 +1,102 @@
+import {ServiceInstance} from "../../../models/serviceInstance";
+import {ServiceInstanceActions} from "../../../models/serviceInstanceActions";
+import {Action, ActionCreator} from "redux";
+
+export enum ServiceActions {
+ CREATE_SERVICE_INSTANCE = 'CREATE_SERVICE_INSTANCE',
+ UPDATE_SERVICE_INSTANCE = 'UPDATE_SERVICE_INSTANCE',
+ DELETE_ALL_SERVICE_INSTANCES = 'DELETE_ALL_SERVICE_INSTANCES',
+ UPDATE_MODEL = 'UPDATE_MODEL',
+ ADD_SERVICE_ACTION = 'ADD_SERVICE_ACTION',
+ DELETE_ACTION_SERVICE_INSTANCE = "DELETE_ACTION_SERVICE_INSTANCE",
+ UNDO_DELETE_ACTION_SERVICE_INSTANCE = "UNDO_DELETE_ACTION_SERVICE_INSTANCE",
+ CHANGE_SERVICE_IS_DIRTY = "CHANGE_SERVICE_IS_DIRTY"
+}
+
+export interface CreateServiceInstanceAction extends Action {
+ serviceUuid?: string;
+ serviceInstance?: ServiceInstance;
+}
+
+export interface UpdateServiceInstanceAction extends Action {
+ serviceUuid?: string;
+ serviceInstance?: ServiceInstance;
+}
+
+export interface DeleteServiceInstanceAction extends Action {
+ serviceUuid?: string;
+}
+
+export interface DeleteServiceInstanceAction extends Action {
+ serviceUuid?: string;
+}
+
+export interface UpdateServiceModelAction extends Action {
+ serviceHierarchy?: any;
+}
+
+export interface AddServiceAction extends Action{
+ serviceUuid: string;
+ action: ServiceInstanceActions;
+}
+
+
+export interface DeleteActionServiceInstanceAction extends Action {
+ serviceId?: string;
+}
+
+export interface UndoDeleteActionServiceInstanceAction extends Action {
+ serviceId?: string;
+}
+
+export interface ChangeServiceDirty extends Action {
+ nodes: any[];
+ serviceId : string;
+}
+
+export const addServiceAction: ActionCreator<AddServiceAction> = (serviceUuid : string, actionName : ServiceInstanceActions) => ({
+ type: ServiceActions.ADD_SERVICE_ACTION,
+ serviceUuid: serviceUuid,
+ action : actionName
+});
+
+
+export const deleteAllServiceInstances: ActionCreator<DeleteServiceInstanceAction> = () => ({
+ type: ServiceActions.DELETE_ALL_SERVICE_INSTANCES
+});
+
+export const createServiceInstance: ActionCreator<CreateServiceInstanceAction> = (serviceInstance, serviceUuid) => ({
+ type: ServiceActions.CREATE_SERVICE_INSTANCE,
+ serviceInstance: serviceInstance,
+ serviceUuid: serviceUuid
+});
+
+export const updateServiceInstance: ActionCreator<UpdateServiceInstanceAction> = (serviceInstance, serviceUuid) => ({
+ type: ServiceActions.UPDATE_SERVICE_INSTANCE,
+ serviceInstance: serviceInstance,
+ serviceUuid: serviceUuid
+});
+
+export const updateModel: ActionCreator<UpdateServiceModelAction> = serviceHierarchy => ({
+ type: ServiceActions.UPDATE_MODEL,
+ serviceHierarchy: serviceHierarchy
+});
+
+
+export const deleteActionServiceInstance: ActionCreator<DeleteActionServiceInstanceAction> = (vnfStoreKey, serviceId) => ({
+ type: ServiceActions.DELETE_ACTION_SERVICE_INSTANCE,
+ serviceId: serviceId
+});
+
+export const undoDeleteActionServiceInstance: ActionCreator<UndoDeleteActionServiceInstanceAction> = (vnfStoreKey, serviceId) => ({
+ type: ServiceActions.UNDO_DELETE_ACTION_SERVICE_INSTANCE,
+ serviceId: serviceId
+});
+
+export const changeServiceIsDirty: ActionCreator<ChangeServiceDirty> = (nodes, serviceId) => ({
+ type: ServiceActions.CHANGE_SERVICE_IS_DIRTY,
+ nodes: nodes,
+ serviceId : serviceId
+});
+
+
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/service/service.reducers.spec.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/service/service.reducers.spec.ts
new file mode 100644
index 000000000..05fc008ad
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/storeUtil/utils/service/service.reducers.spec.ts
@@ -0,0 +1,499 @@
+import {ServiceInstance} from "../../../models/serviceInstance";
+import {
+ AddServiceAction, ChangeServiceDirty,
+ DeleteServiceInstanceAction,
+ ServiceActions,
+ CreateServiceInstanceAction,
+ UpdateServiceModelAction, UpdateServiceInstanceAction
+} from "./service.actions";
+import {serviceReducer} from "./service.reducers";
+import {ServiceInstanceActions} from "../../../models/serviceInstanceActions";
+
+describe('serviceReducer', () => {
+
+ test('#UPDATE_SERVICE_INSTANCE should update exiting instance without change his child', () => {
+ const serviceUuid: string = 'serviceUuid';
+ const actionName: ServiceInstanceActions = ServiceInstanceActions.Create;
+
+ const elemntThatShouldNotOverideOnUpdateService = {
+ vnfs: {
+ "2017-388_ADIOD-vPE 0": {
+ "action": "Create",
+ "inMaint": false,
+ "rollbackOnFailure": "true",
+ "originalName": "2017-388_ADIOD-vPE 0",
+ "isMissingData": false,
+ "trackById": "eymgwlevh54",
+ "vfModules": {},
+ "vnfStoreKey": "2017-388_ADIOD-vPE 0",
+ "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168",
+ "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "lcpCloudRegionId": "JANET25",
+ "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+ "lineOfBusiness": "ONAP",
+ "platformName": "platform",
+ "modelInfo": {
+ "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "modelVersionId": "afacccf6-397d-45d6-b5ae-94c39734b168",
+ "modelName": "2017-388_ADIOD-vPE",
+ "modelVersion": "4.0",
+ "modelCustomizationId": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c",
+ "modelCustomizationName": "2017-388_ADIOD-vPE 0",
+ "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168",
+ "modelUniqueId": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c"
+ },
+ "instanceName": "2017-388_ADIOD-vPEAjXzainstanceName",
+ "legacyRegion": "some legacy region",
+ "instanceParams": [
+ {
+ "vnf_config_template_version": "17.2",
+ "bandwidth_units": "Gbps",
+ "bandwidth": "10",
+ "AIC_CLLI": "ATLMY8GA",
+ "ASN": "AV_vPE",
+ "vnf_instance_name": "mtnj309me6"
+ }
+ ]
+ },
+ "2017-488_ADIOD-vPE 0": {
+ "action": "Create",
+ "inMaint": false,
+ "rollbackOnFailure": "true",
+ "originalName": "2017-488_ADIOD-vPE 0",
+ "isMissingData": false,
+ "trackById": "xr6o2782z7",
+ "vfModules": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+ "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0wmkjw": {
+ "isMissingData": true,
+ "sdncPreReload": null,
+ "modelInfo": {
+ "modelType": "VFmodule",
+ "modelInvariantId": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+ "modelVersionId": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+ "modelName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "modelVersion": "5",
+ "modelCustomizationId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+ "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+ "modelUniqueId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3"
+ },
+ "instanceParams": [
+ {}
+ ],
+ "trackById": "a19sjb1ez2"
+ }
+ }
+ },
+ "vnfStoreKey": "2017-488_ADIOD-vPE 0",
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "lcpCloudRegionId": "JANET25",
+ "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+ "lineOfBusiness": "ONAP",
+ "platformName": "platform",
+ "modelInfo": {
+ "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+ "modelVersionId": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "modelName": "2017-488_ADIOD-vPE",
+ "modelVersion": "5.0",
+ "modelCustomizationId": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+ "modelCustomizationName": "2017-488_ADIOD-vPE 0",
+ "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+ "modelUniqueId": "1da7b585-5e61-4993-b95e-8e6606c81e45"
+ },
+ "instanceName": "2017-488_ADIOD-vPEVNFinstancename",
+ "legacyRegion": "some legacy region",
+ "instanceParams": [
+ {
+ "vnf_config_template_version": "17.2",
+ "bandwidth_units": "Gbps",
+ "bandwidth": "10",
+ "AIC_CLLI": "ATLMY8GA",
+ "ASN": "AV_vPE",
+ "vnf_instance_name": "mtnj309me6"
+ }
+ ]
+ }
+ },
+ existingVNFCounterMap: {
+ "b3c76f73-eeb5-4fb6-9d31-72a889f1811c": 1,
+ "1da7b585-5e61-4993-b95e-8e6606c81e45": 1
+ },
+ existingVnfGroupCounterMap: {},
+ existingNetworksCounterMap: {},
+ optionalGroupMembersMap : {},
+ networks : {},
+ vnfGroups : {}
+ };
+
+
+ let service = serviceReducer(<any>{
+ "serviceInstance": {
+ "6b528779-44a3-4472-bdff-9cd15ec93450": {
+ "action": "Create",
+ "isDirty": true,
+ "vnfs": elemntThatShouldNotOverideOnUpdateService.vnfs,
+ "instanceParams": [
+ {
+ "2017488_adiodvpe0_ASN": "AV_vPE"
+ }
+ ],
+ "validationCounter": 1,
+ "existingNames": {
+ "ajxzainstancename": "",
+ "2017-488_adiod-vpevnfinstancename": "",
+ "2017-388_adiod-vpeajxzainstancename": ""
+ },
+ "existingVNFCounterMap": elemntThatShouldNotOverideOnUpdateService.existingVNFCounterMap,
+ "existingVnfGroupCounterMap": elemntThatShouldNotOverideOnUpdateService.existingVnfGroupCounterMap,
+ "existingNetworksCounterMap": elemntThatShouldNotOverideOnUpdateService.existingNetworksCounterMap,
+ "optionalGroupMembersMap":elemntThatShouldNotOverideOnUpdateService.optionalGroupMembersMap,
+ "networks": elemntThatShouldNotOverideOnUpdateService.networks,
+ "vnfGroups": elemntThatShouldNotOverideOnUpdateService.vnfGroups,
+ "bulkSize": "3",
+ "instanceName": "AjXzainstancename",
+ "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "subscriptionServiceType": "TYLER SILVIA",
+ "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+ "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89",
+ "lcpCloudRegionId": "hvf6",
+ "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054",
+ "aicZoneId": "NFT1",
+ "projectName": "WATKINS",
+ "rollbackOnFailure": "true",
+ "aicZoneName": "NFTJSSSS-NFT1",
+ "owningEntityName": "WayneHolland",
+ "testApi": "VNF_API",
+ "tenantName": "AIN Web Tool-15-D-testalexandria",
+ "modelInfo": {
+ "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "modelVersionId": "6b528779-44a3-4472-bdff-9cd15ec93450",
+ "modelName": "action-data",
+ "modelVersion": "1.0",
+ "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+ "modelUniqueId": "6b528779-44a3-4472-bdff-9cd15ec93450"
+ },
+ "isALaCarte": false,
+ "name": "action-data",
+ "version": "1.0",
+ "description": "",
+ "category": "",
+ "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+ "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ "serviceType": "",
+ "serviceRole": "",
+ "vidNotions": {
+ "instantiationUI": "legacy",
+ "modelCategory": "other",
+ "viewEditUI": "legacy"
+ },
+ "isEcompGeneratedNaming": false,
+ "isMultiStepDesign": false
+ }
+ },
+ }, <UpdateServiceInstanceAction>{
+ type: ServiceActions.UPDATE_SERVICE_INSTANCE,
+ serviceUuid: "6b528779-44a3-4472-bdff-9cd15ec93450",
+ serviceInstance: <any>{
+ aicZoneId: "ATL53",
+ aicZoneName: "AAIATLTE-ATL53",
+ bulkSize: 1,
+ category: "",
+ description: "",
+ globalSubscriberId: "e433710f-9217-458d-a79d-1c7aff376d89",
+ instanceName: "yoav",
+ instanceParams: [{}],
+ invariantUuid: "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ isALaCarte: false,
+ isEcompGeneratedNaming: false,
+ isMultiStepDesign: false,
+ lcpCloudRegionId: "JANET25",
+ modelInfo: {
+ modelInvariantId: "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+ modelVersionId: "6b528779-44a3-4472-bdff-9cd15ec93450",
+ modelName: "action-data",
+ modelVersion: "1.0"
+ },
+ name: "action-data",
+ owningEntityId: "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+ owningEntityName: "WayneHolland",
+ productFamilyId: "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+ projectName: "WATKINS",
+ rollbackOnFailure: "true",
+ serviceRole: "",
+ serviceType: "",
+ subscriptionServiceType: "TYLER SILVIA",
+ tenantId: "092eb9e8e4b7412e8787dd091bc58e86",
+ tenantName: "USP-SIP-IC-24335-T-01",
+ testApi: "VNF_API",
+ uuid: "6b528779-44a3-4472-bdff-9cd15ec93450",
+ version: "1.0",
+ vidNotions: {instantiationUI: "legacy", modelCategory: "other", viewEditUI: "legacy"}
+ }
+ });
+ expect(service.serviceInstance["6b528779-44a3-4472-bdff-9cd15ec93450"]).toBeDefined();
+
+ for(const element in elemntThatShouldNotOverideOnUpdateService){
+ expect(service.serviceInstance["6b528779-44a3-4472-bdff-9cd15ec93450"][element]).toEqual(elemntThatShouldNotOverideOnUpdateService[element]);
+ }
+
+ expect(service.serviceInstance["6b528779-44a3-4472-bdff-9cd15ec93450"].aicZoneId).toEqual("ATL53");
+ expect(service.serviceInstance["6b528779-44a3-4472-bdff-9cd15ec93450"].owningEntityId).toEqual("d61e6f2d-12fa-4cc2-91df-7c244011d6fc");
+ expect(service.serviceInstance["6b528779-44a3-4472-bdff-9cd15ec93450"].owningEntityName).toEqual("WayneHolland");
+ expect(service.serviceInstance["6b528779-44a3-4472-bdff-9cd15ec93450"].productFamilyId).toEqual("d8a6ed93-251c-47ca-adc9-86671fd19f4c");
+ expect(service.serviceInstance["6b528779-44a3-4472-bdff-9cd15ec93450"].projectName).toEqual("WATKINS");
+ expect(service.serviceInstance["6b528779-44a3-4472-bdff-9cd15ec93450"].rollbackOnFailure).toEqual("true");
+ expect(service.serviceInstance["6b528779-44a3-4472-bdff-9cd15ec93450"].subscriptionServiceType).toEqual("TYLER SILVIA");
+ expect(service.serviceInstance["6b528779-44a3-4472-bdff-9cd15ec93450"].tenantId).toEqual("092eb9e8e4b7412e8787dd091bc58e86");
+
+ });
+
+ test('#ADD_SERVICE_ACTION should add action to the service', () => {
+ const serviceUuid: string = 'serviceUuid';
+ const actionName: ServiceInstanceActions = ServiceInstanceActions.Create;
+
+ let service = serviceReducer(<any>{
+ serviceInstance: {
+ 'serviceUuid': {}
+ }
+ }, <AddServiceAction>{
+ type: ServiceActions.ADD_SERVICE_ACTION,
+ serviceUuid: 'serviceUuid',
+ action: actionName
+ });
+ expect(service.serviceInstance[serviceUuid]['action']).toEqual(actionName);
+ });
+
+ test('#UPDATE_SERVICE_INSTANCE', () => {
+ const serviceUuid: string = 'serviceUuid';
+
+ let serviceInstanceObject: ServiceInstance = <any>{
+ isDirty: false,
+ instanceName: 'instanceName',
+ isEcompGeneratedNaming: false,
+ globalSubscriberId: 'globalSubscriberId',
+ productFamilyId: 'productFamilyId',
+ subscriptionServiceType: 'subscriptionServiceType',
+ lcpCloudRegionId: 'lcpCloudRegionId',
+ tenantId: 'tenantId',
+ tenantName: 'tenantName',
+ aicZoneId: 'aicZoneId',
+ aicZoneName: 'aicZoneName',
+ projectName: 'projectName',
+ owningEntityId: 'owningEntityId',
+ owningEntityName: 'owningEntityName',
+ existingVnfGroupCounterMap: {},
+ existingVNFCounterMap: {},
+ existingNetworksCounterMap: {},
+ pause: false,
+ bulkSize: 1,
+ vnfs: {},
+ vnfGroups: {},
+ networks: {},
+ instanceParams: [],
+ rollbackOnFailure: false,
+ subscriberName: 'subscriberName',
+ validationCounter: 0,
+ existingNames: {},
+ action: ServiceInstanceActions.Create
+ };
+
+ let serviceState = serviceReducer(<any>{serviceInstance: {}},
+ <CreateServiceInstanceAction>{
+ type: ServiceActions.CREATE_SERVICE_INSTANCE,
+ serviceUuid: serviceUuid,
+ serviceInstance: serviceInstanceObject
+ }).serviceInstance[serviceUuid];
+
+ expect(serviceState.instanceName).toEqual(serviceInstanceObject.instanceName);
+ expect(serviceState.isEcompGeneratedNaming).toEqual(serviceInstanceObject.isEcompGeneratedNaming);
+ expect(serviceState.globalSubscriberId).toEqual(serviceInstanceObject.globalSubscriberId);
+ expect(serviceState.productFamilyId).toEqual(serviceInstanceObject.productFamilyId);
+ expect(serviceState.subscriptionServiceType).toEqual(serviceInstanceObject.subscriptionServiceType);
+ expect(serviceState.lcpCloudRegionId).toEqual(serviceInstanceObject.lcpCloudRegionId);
+ expect(serviceState.tenantId).toEqual(serviceInstanceObject.tenantId);
+ expect(serviceState.tenantName).toEqual(serviceInstanceObject.tenantName);
+ expect(serviceState.aicZoneId).toEqual(serviceInstanceObject.aicZoneId);
+ expect(serviceState.aicZoneName).toEqual(serviceInstanceObject.aicZoneName);
+ expect(serviceState.projectName).toEqual(serviceInstanceObject.projectName);
+ expect(serviceState.owningEntityId).toEqual(serviceInstanceObject.owningEntityId);
+ expect(serviceState.owningEntityName).toEqual(serviceInstanceObject.owningEntityName);
+ expect(serviceState.pause).toEqual(serviceInstanceObject.pause);
+ expect(serviceState.bulkSize).toEqual(serviceInstanceObject.bulkSize);
+ expect(serviceState.vnfs).toEqual(serviceInstanceObject.vnfs);
+ expect(serviceState.instanceParams).toEqual(serviceInstanceObject.instanceParams);
+ expect(serviceState.rollbackOnFailure).toEqual(serviceInstanceObject.rollbackOnFailure);
+ expect(serviceState.subscriberName).toEqual(serviceInstanceObject.subscriberName);
+ });
+
+
+ test('#DELETE_ALL_SERVICE_INSTANCES should delete all services', () => {
+ const state = serviceReducer(<any>{
+ serviceInstance: {
+ 'service-1': {},
+ 'service-2': {}
+ }
+ },
+ <CreateServiceInstanceAction>{
+ type: ServiceActions.DELETE_ALL_SERVICE_INSTANCES
+ });
+
+ expect(state.serviceInstance['service-1']).toBeUndefined();
+ expect(state.serviceInstance['service-2']).toBeUndefined();
+ });
+
+ test('#DELETE_SERVICE_INSTANCE should delete service', () => {
+ const state = serviceReducer(<any>{
+ serviceInstance: {
+ 'service-1': {}
+ }
+ },
+ <DeleteServiceInstanceAction>{
+ type: ServiceActions.DELETE_ALL_SERVICE_INSTANCES
+ });
+
+ expect(state.serviceInstance['service-1']).toBeUndefined();
+ });
+
+ test('#UPDATE_MODEL should update service model ', () => {
+ const state = serviceReducer(<any>{
+ serviceHierarchy: {}
+ },
+ <UpdateServiceModelAction>{
+ type: ServiceActions.UPDATE_MODEL,
+ serviceHierarchy: {
+ service: {
+ uuid: 'uuid-1'
+ }
+ }
+ });
+
+ expect(state.serviceHierarchy['uuid-1'].service).toBeDefined();
+ });
+
+ test('#UPDATE_MODEL should update service model with vnfGroups ', () => {
+ const state = serviceReducer(<any>{
+ serviceHierarchy: {}
+ },
+ <UpdateServiceModelAction>{
+ type: ServiceActions.UPDATE_MODEL,
+ serviceHierarchy: {
+ service: {
+ uuid: 'uuid-1'
+ },
+ vnfs: {},
+ vnfGroups: {
+ 'vnfGrouop_1': {
+ uuid: 'vnfGroup_uuid_1',
+ name: 'vnfGroup_name_1',
+ type: 'Group'
+ },
+ 'vnfGrouop_2': {
+ uuid: 'vnfGroup_uuid_2',
+ name: 'vnfGroup_name_2',
+ type: 'Group'
+ }
+ }
+ }
+ });
+
+ expect(state.serviceHierarchy['uuid-1']).toBeDefined();
+ expect(state.serviceHierarchy['uuid-1'].vnfGroups['vnfGrouop_1']).toBeDefined();
+ expect(state.serviceHierarchy['uuid-1'].vnfGroups['vnfGrouop_2']).toBeDefined();
+ });
+
+ test('#CHANGE_SERVICE_IS_DIRTY should update service isDirty flag : service is not dirty ', () => {
+ const state = serviceReducer(<any>{
+ serviceInstance: {
+ 'serviceId': {
+ action: ServiceInstanceActions.None,
+ 'vnfs': {
+ 'vnf1': {
+ action: ServiceInstanceActions.None
+ },
+ 'vnf2': {
+ action: ServiceInstanceActions.None
+ }
+ }
+
+ }
+ }
+ },
+ <ChangeServiceDirty>{
+ type: ServiceActions.CHANGE_SERVICE_IS_DIRTY,
+ nodes: [
+ {
+ action: ServiceInstanceActions.None
+ },
+ {
+ action: ServiceInstanceActions.None
+ }],
+ serviceId: 'serviceId'
+
+ });
+
+ expect(state.serviceInstance['serviceId'].isDirty).toBeFalsy();
+ });
+
+ test('#CHANGE_SERVICE_IS_DIRTY should update service isDirty flag : service is dirty should return true', () => {
+ const state = serviceReducer(<any>{
+ serviceInstance: {
+ 'serviceId': {
+ action: ServiceInstanceActions.Create
+
+ }
+ }
+ },
+ <ChangeServiceDirty>{
+ type: ServiceActions.CHANGE_SERVICE_IS_DIRTY,
+ nodes: [
+ {
+ action: ServiceInstanceActions.None
+ },
+ {
+ action: ServiceInstanceActions.None
+ }],
+ serviceId: 'serviceId'
+
+ });
+
+ expect(state.serviceInstance['serviceId'].isDirty).toBeTruthy();
+ });
+
+ test('#CHANGE_SERVICE_IS_DIRTY should update service isDirty flag : vnf is dirty ', () => {
+ const state = serviceReducer(<any>{
+ serviceInstance: {
+ 'serviceId': {
+ action: ServiceInstanceActions.None,
+ 'vnfs': {
+ 'vnf1': {
+ action: ServiceInstanceActions.None
+ },
+ 'vnf2': {
+ action: ServiceInstanceActions.Create
+ }
+ }
+
+ }
+ }
+ },
+ <ChangeServiceDirty>{
+ type: ServiceActions.CHANGE_SERVICE_IS_DIRTY,
+ nodes: [
+ {
+ action: ServiceInstanceActions.None
+ },
+ {
+ action: ServiceInstanceActions.Create
+ }],
+ serviceId: 'serviceId'
+
+ });
+
+ expect(state.serviceInstance['serviceId'].isDirty).toBeTruthy();
+ });
+
+});
+
+
+
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/service/service.reducers.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/service/service.reducers.ts
new file mode 100644
index 000000000..9d21d359c
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/storeUtil/utils/service/service.reducers.ts
@@ -0,0 +1,107 @@
+import {Action} from "redux";
+import {
+ AddServiceAction,
+ ChangeServiceDirty,
+ ServiceActions,
+ CreateServiceInstanceAction,
+ UpdateServiceModelAction, UpdateServiceInstanceAction
+} from "./service.actions";
+import {ServiceInstance} from "../../../models/serviceInstance";
+import {ServiceState} from "../main.reducer";
+import {ServiceInstanceActions} from "../../../models/serviceInstanceActions";
+import * as _ from "lodash";
+
+export function serviceReducer(state: ServiceState, action: Action) : ServiceState{
+ switch (action.type) {
+ case ServiceActions.UPDATE_SERVICE_INSTANCE : {
+ let newState = _.cloneDeep(state);
+ const updateServiceInstanceAction = <UpdateServiceInstanceAction>action;
+ const uuid = updateServiceInstanceAction.serviceUuid;
+ const serviceInstance = updateServiceInstanceAction.serviceInstance;
+
+
+ updateUniqueNames(serviceInstance.instanceName, updateServiceInstanceAction.serviceInstance.instanceName, newState.serviceInstance[uuid]);
+
+ newState.serviceInstance[uuid] = _.merge(newState.serviceInstance[uuid], serviceInstance);
+ return newState;
+ }
+ case ServiceActions.CREATE_SERVICE_INSTANCE : {
+ const updateServiceInstanceAction = <CreateServiceInstanceAction>action;
+ const uuid = updateServiceInstanceAction.serviceUuid;
+ let newState = _.cloneDeep(state);
+
+ const serviceInstance: ServiceInstance = new ServiceInstance();
+ const currentInstaceName = state.serviceInstance[uuid] ? serviceInstance.instanceName : null;
+
+ newState.serviceInstance[uuid] = Object.assign(serviceInstance, updateServiceInstanceAction.serviceInstance);
+ if (!_.isNil(updateServiceInstanceAction.serviceInstance)) {
+ updateUniqueNames(currentInstaceName, updateServiceInstanceAction.serviceInstance.instanceName, newState.serviceInstance[uuid]);
+ }
+ return newState;
+ }
+ case ServiceActions.DELETE_ALL_SERVICE_INSTANCES: {
+ if (state.serviceInstance) {
+ let newState = _.cloneDeep(state);
+ newState.serviceInstance = {};
+ return Object.assign({}, state, newState);
+ }
+ return Object.assign({}, state);
+ }
+ case ServiceActions.UPDATE_MODEL: {
+ let uuid = (<UpdateServiceModelAction>action).serviceHierarchy.service.uuid;
+ state.serviceHierarchy[uuid] = _.cloneDeep((<UpdateServiceModelAction>action).serviceHierarchy);
+ return Object.assign({}, state);
+ }
+ case ServiceActions.ADD_SERVICE_ACTION: {
+ const uuid: string = (<AddServiceAction>action).serviceUuid;
+ const actionToAdd: ServiceInstanceActions = (<AddServiceAction>action).action;
+ state.serviceInstance[uuid].action = actionToAdd;
+ return Object.assign({}, state);
+ }
+ case ServiceActions.CHANGE_SERVICE_IS_DIRTY : {
+ let newState = _.cloneDeep(state);
+ let serviceInstanceAction: ServiceInstanceActions = newState.serviceInstance[(<ChangeServiceDirty>action).serviceId].action;
+
+ if(serviceInstanceAction !== ServiceInstanceActions.None){
+ newState.serviceInstance[(<ChangeServiceDirty>action).serviceId].isDirty = true;
+ return newState;
+ }
+
+ const nodes = (<ChangeServiceDirty>action).nodes;
+ for(let node of nodes){
+ const dirty = isDirty(node);
+ if(dirty) {
+ newState.serviceInstance[(<ChangeServiceDirty>action).serviceId].isDirty = true;
+ return newState;
+ }
+ }
+
+ newState.serviceInstance[(<ChangeServiceDirty>action).serviceId].isDirty = false;
+ return newState;
+ }
+ }
+}
+
+const isDirty = (node) : boolean => {
+ if(node.action !== ServiceInstanceActions.None) return true;
+ if(!_.isNil(node.children) && node.children.length > 0){
+ for(let child of node.children){
+ const dirty: boolean = isDirty(child);
+ if(dirty) return true;
+ }
+ }
+ return false;
+};
+
+const updateUniqueNames = (oldName : string, newName : string, serviceInstance : ServiceInstance) : void => {
+ let existingNames = serviceInstance.existingNames;
+ if (!_.isNil(oldName) && oldName.toLowerCase() in existingNames) {
+ delete existingNames[oldName.toLowerCase()];
+ }
+ if(!_.isNil(newName)) {
+ existingNames[newName.toLowerCase()] = "";
+ }
+};
+
+
+
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/vfModule/vfModule.actions.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/vfModule/vfModule.actions.ts
new file mode 100644
index 000000000..a3f0f4009
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/storeUtil/utils/vfModule/vfModule.actions.ts
@@ -0,0 +1,105 @@
+import {Action, ActionCreator} from "redux";
+
+export enum VfModuleActions {
+ REMOVE_VNF_MODULE_INSTANCE = 'REMOVE_VNF_MODULE_INSTANCE',
+ CREATE_VF_MODULE = 'CREATE_VF_MODULE',
+ UPDATE_VF_MODULE = 'UPDATE_VF_MODULE',
+ DELETE_ACTION_VF_MODULE_INSTANCE = "DELETE_ACTION_VF_MODULE_INSTANCE",
+ UNDO_DELETE_ACTION_VF_MODULE_INSTANCE = "UNDO_DELETE_ACTION_VF_MODULE_INSTANCE",
+ UPDATE_VFMODULE_POSITION = "UPDATE_VFMODULE_POSITION"
+}
+
+
+export interface UpdateVFModluePosition extends Action {
+ node: any,
+ instanceId : string,
+ vnfStoreKey ?: string;
+}
+
+export interface DeleteVfModuleInstanceAction extends Action {
+ modelName?: string;
+ serviceModelId?: string;
+ vfName?: string;
+ vnfStoreKey?:string;
+ dynamicModelName?: string;
+}
+
+export interface CreateVFModuleInstanceAction extends Action {
+ vfInstance: any;
+ vfId: string;
+ serviceUuid: string;
+ index : number
+ vnfStoreKey : string;
+}
+
+export interface UpdateVFModuleInstanceAction extends Action {
+ vfInstance: any;
+ vfId: string;
+ serviceUuid: string;
+ dynamicModelName : string;
+ vnfStoreKey : string
+}
+
+
+export interface DeleteActionVfModuleInstanceAction extends Action {
+ dynamicModelName: string;
+ vnfStoreKey : string;
+ serviceId?: string;
+}
+
+export interface UndoDeleteActionVfModuleInstanceAction extends Action {
+ dynamicModelName: string;
+ vnfStoreKey : string;
+ serviceId?: string;
+}
+
+export const removeVfModuleInstance: ActionCreator<DeleteVfModuleInstanceAction> = (modelName, serviceModelId, vfName, vnfStoreKey, dynamicModelName) => ({
+ type: VfModuleActions.REMOVE_VNF_MODULE_INSTANCE,
+ modelName: modelName,
+ serviceModelId: serviceModelId,
+ vfName: vfName,
+ vnfStoreKey : vnfStoreKey,
+ dynamicModelName:dynamicModelName
+});
+
+
+export const createVFModuleInstance: ActionCreator<CreateVFModuleInstanceAction> = (vfInstance, vfId, serviceUuid, index, vnfStoreKey) => ({
+ type: VfModuleActions.CREATE_VF_MODULE,
+ vfInstance: vfInstance,
+ vfId: vfId,
+ serviceUuid: serviceUuid,
+ index : index,
+ vnfStoreKey : vnfStoreKey
+});
+
+export const updateVFModuleInstance: ActionCreator<UpdateVFModuleInstanceAction> = (vfInstance, vfId, serviceUuid, dynamicModelName, vnfStoreKey) => ({
+ type: VfModuleActions.UPDATE_VF_MODULE,
+ vfInstance: vfInstance,
+ vfId: vfId,
+ serviceUuid: serviceUuid,
+ dynamicModelName : dynamicModelName,
+ vnfStoreKey : vnfStoreKey
+});
+
+export const deleteActionVfModuleInstance: ActionCreator<DeleteActionVfModuleInstanceAction> = (dynamicModelName, vnfStoreKey, serviceId) => ({
+ type: VfModuleActions.DELETE_ACTION_VF_MODULE_INSTANCE,
+ dynamicModelName: dynamicModelName,
+ vnfStoreKey : vnfStoreKey,
+ serviceId: serviceId
+});
+
+export const undoDeleteVfModuleInstance: ActionCreator<UndoDeleteActionVfModuleInstanceAction> = (dynamicModelName, vnfStoreKey, serviceId) => ({
+ type: VfModuleActions.UNDO_DELETE_ACTION_VF_MODULE_INSTANCE,
+ dynamicModelName: dynamicModelName,
+ vnfStoreKey : vnfStoreKey,
+ serviceId: serviceId
+});
+
+
+export const updateVFModulePosition: ActionCreator<UpdateVFModluePosition> = (node, instanceId, vnfStoreKey) => ({
+ type: VfModuleActions.UPDATE_VFMODULE_POSITION,
+ node: node,
+ instanceId: instanceId,
+ vnfStoreKey : vnfStoreKey
+});
+
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/vfModule/vfModule.reducers.spec.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/vfModule/vfModule.reducers.spec.ts
new file mode 100644
index 000000000..de6d2142c
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/storeUtil/utils/vfModule/vfModule.reducers.spec.ts
@@ -0,0 +1,248 @@
+import {
+ CreateVFModuleInstanceAction,
+ DeleteActionVfModuleInstanceAction,
+ DeleteVfModuleInstanceAction, UndoDeleteActionVfModuleInstanceAction, UpdateVFModluePosition,
+ VfModuleActions
+} from "./vfModule.actions";
+import {vfModuleReducer} from "./vfModule.reducers";
+import {VfModuleInstance} from "../../../models/vfModuleInstance";
+import {ServiceInstanceActions} from "../../../models/serviceInstanceActions";
+
+
+describe('vfModuleReducer', () => {
+ test('#REMOVE_VNF_MODULE_INSTANCE : should delete existing vnf module by dynamicModelName', () => {
+ let state = vfModuleReducer(<any>{serviceInstance : {
+ 'serviceModelId' : {
+ vnfs : {
+ 'vfName' : {
+ vfModules : {
+ 'modelName' : {
+ 'dynamicModelName1': {},
+ 'dynamicModelName2': {},
+ }
+ }
+ }
+ }
+ }
+ }},
+ <DeleteVfModuleInstanceAction>{
+ type: VfModuleActions.REMOVE_VNF_MODULE_INSTANCE,
+ modelName : 'modelName',
+ vfName : 'vfName',
+ vnfStoreKey : 'vfName',
+ serviceModelId : 'serviceModelId',
+ dynamicModelName: 'dynamicModelName1'
+ });
+
+ expect(state).toBeDefined();
+ expect(state.serviceInstance['serviceModelId'].vnfs['vfName'].vfModules['modelName']['dynamicModelName2']).toBeDefined();
+ expect(state.serviceInstance['serviceModelId'].vnfs['vfName'].vfModules['modelName']['dynamicModelName1']).not.toBeDefined();
+ });
+
+ test('#DELETE_LAST_VNF_MODULE_INSTANCE : should delete existing vnf module', () => {
+ let state = vfModuleReducer(<any>{serviceInstance : {
+ 'serviceModelId' : {
+ vnfs : {
+ 'vfName' : {
+ vfModules : {
+ 'modelName' : {
+ 'dynamicModelName': {
+ }
+ }
+ }
+ }
+ }
+ }
+ }},
+ <DeleteVfModuleInstanceAction>{
+ type: VfModuleActions.REMOVE_VNF_MODULE_INSTANCE,
+ modelName : 'modelName',
+ vfName : 'vfName',
+ vnfStoreKey : 'vfName',
+ serviceModelId : 'serviceModelId',
+ dynamicModelName: 'dynamicModelName'
+ });
+
+ expect(state).toBeDefined();
+ expect(state.serviceInstance['serviceModelId'].vnfs['vfName'].vfModules['modelName']).not.toBeDefined();
+ });
+
+ test('#CREATE_VF_MODULE: should create new vfModule to existing VNF', ()=>{
+ let vfModuleInstance : VfModuleInstance = new VfModuleInstance();
+ vfModuleInstance.instanceName = 'instanceName';
+ vfModuleInstance.isMissingData = false;
+ vfModuleInstance.volumeGroupName = 'volumeGroupName';
+ let vfModule = vfModuleReducer(<any>{serviceInstance : {
+ 'serviceUuid' : {
+ vnfs : {
+ 'vnfStoreKey' : {
+ 'vfModules' : {
+ }
+ }
+ }
+ }
+ }},
+ <CreateVFModuleInstanceAction>{
+ type: VfModuleActions.CREATE_VF_MODULE,
+ vfId : 'vfId',
+ vfInstance : new VfModuleInstance(),
+ vnfStoreKey : 'vnfStoreKey',
+ serviceUuid : 'serviceUuid',
+ index : 1
+ }).serviceInstance['serviceUuid'].vnfs['vnfStoreKey'].vfModules;
+
+ let firstVfModuleName = Object.keys(vfModule)[0];
+ expect(vfModule[firstVfModuleName]).toBeDefined();
+ expect(vfModule[firstVfModuleName].isMissingData).toBeFalsy();
+ });
+
+ test('#UPDATE_VF_MODULE: should update existing VFModule', ()=>{
+ let vfModuleInstance : VfModuleInstance = new VfModuleInstance();
+ vfModuleInstance.instanceName = 'instanceName';
+ vfModuleInstance.isMissingData = false;
+ vfModuleInstance.volumeGroupName = 'volumeGroupName';
+ let vfModule = vfModuleReducer(<any>{
+ serviceHierarchy : {
+ 'serviceModelId' : {}
+ },
+ serviceInstance : {
+ 'serviceModelId' : {
+ vnfs : {
+ 'vfName' : {
+ vfModules : {
+ 'modelName' : {
+ 'dynamicModelName1': {
+ isMissingData : true
+ },
+ 'dynamicModelName2': {},
+ }
+ }
+ }
+ }
+ }
+ }},
+ <CreateVFModuleInstanceAction>{
+ type: VfModuleActions.UPDATE_VF_MODULE,
+ vfId : 'modelName',
+ vfInstance : new VfModuleInstance(),
+ vnfStoreKey : 'vfName',
+ dynamicModelName : 'dynamicModelName1',
+ serviceUuid : 'serviceModelId',
+ index : 1
+ }).serviceInstance['serviceModelId'].vnfs['vfName'].vfModules;
+
+ let firstVfModuleName = Object.keys(vfModule)[0];
+ expect(vfModule[firstVfModuleName]).toBeDefined();
+ expect(vfModule[firstVfModuleName].isMissingData).toBeFalsy();
+ });
+
+
+ test('#UPDATE_VFMODULE_POSITION: should update position', ()=>{
+ let vfModule = vfModuleReducer(<any>{
+ serviceHierarchy : {
+ 'serviceModelId' : {}
+ },
+ serviceInstance : {
+ 'serviceModelId' : {
+ vnfs : {
+ 'vfName' : {
+ vfModules : {
+ 'modelName' : {
+ 'dynamicModelName': {
+ isMissingData : true
+ }
+ }
+ }
+ }
+ }
+ }
+ }},
+ <UpdateVFModluePosition>{
+ type: VfModuleActions.UPDATE_VFMODULE_POSITION,
+ node: {
+ position : 1,
+ dynamicModelName : "dynamicModelName",
+ modelName : "modelName"
+ },
+ instanceId : "serviceModelId",
+ vnfStoreKey : "vfName"
+
+ }).serviceInstance['serviceModelId'].vnfs['vfName'].vfModules["modelName"]["dynamicModelName"];
+
+ expect(vfModule.position).toEqual(1);
+ });
+
+
+ test('#DELETE_ACTION_VF_MODULE_INSTANCE', ()=>{
+ let vfModule = vfModuleReducer(<any>{
+ serviceHierarchy : {
+ 'serviceModelId' : {}
+ },
+ serviceInstance : {
+ 'serviceModelId' : {
+ vnfs : {
+ 'vnfStoreKey' : {
+ vfModules : {
+ 'modelName' : {
+ 'dynamicModelName1': {
+ isMissingData : true,
+ action : 'None'
+ },
+ 'dynamicModelName2': {},
+ }
+ }
+ }
+ }
+ }
+ }},
+ <DeleteActionVfModuleInstanceAction>{
+ type: VfModuleActions.DELETE_ACTION_VF_MODULE_INSTANCE,
+ dynamicModelName: 'dynamicModelName1',
+ vnfStoreKey : 'vnfStoreKey',
+ serviceId: 'serviceModelId'
+ }).serviceInstance['serviceModelId'].vnfs['vnfStoreKey'].vfModules['modelName']['dynamicModelName1'];
+
+ console.log(vfModule.action);
+ expect(vfModule).toBeDefined();
+ expect(vfModule.isMissingData).toBeTruthy();
+ expect(vfModule.action).toEqual(ServiceInstanceActions.None_Delete);
+ });
+
+ test('#UNDO_DELETE_ACTION_VF_MODULE_INSTANCE', ()=>{
+ let vfModule = vfModuleReducer(<any>{
+ serviceHierarchy : {
+ 'serviceModelId' : {}
+ },
+ serviceInstance : {
+ 'serviceModelId' : {
+ vnfs : {
+ 'vnfStoreKey' : {
+ vfModules : {
+ 'modelName' : {
+ 'dynamicModelName1': {
+ isMissingData : true,
+ action : 'None_Delete'
+ },
+ 'dynamicModelName2': {},
+ }
+ }
+ }
+ }
+ }
+ }},
+ <UndoDeleteActionVfModuleInstanceAction>{
+ type: VfModuleActions.UNDO_DELETE_ACTION_VF_MODULE_INSTANCE,
+ dynamicModelName: 'dynamicModelName1',
+ vnfStoreKey : 'vnfStoreKey',
+ serviceId: 'serviceModelId'
+ }).serviceInstance['serviceModelId'].vnfs['vnfStoreKey'].vfModules['modelName']['dynamicModelName1'];
+
+ console.log(vfModule.action);
+ expect(vfModule).toBeDefined();
+ expect(vfModule.action).toEqual(ServiceInstanceActions.None);
+ });
+
+});
+
+
+
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/vfModule/vfModule.reducers.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/vfModule/vfModule.reducers.ts
new file mode 100644
index 000000000..f3636ff41
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/storeUtil/utils/vfModule/vfModule.reducers.ts
@@ -0,0 +1,165 @@
+import {Action} from "redux";
+import * as _ from "lodash";
+import {
+ CreateVFModuleInstanceAction, DeleteActionVfModuleInstanceAction,
+ DeleteVfModuleInstanceAction, UndoDeleteActionVfModuleInstanceAction, UpdateVFModluePosition,
+ UpdateVFModuleInstanceAction,
+ VfModuleActions
+} from "./vfModule.actions";
+import {ServiceInstance} from "../../../models/serviceInstance";
+import {VfModuleMap} from "../../../models/vfModulesMap";
+import {ServiceState} from "../main.reducer";
+import {ServiceInstanceActions} from "../../../models/serviceInstanceActions";
+
+
+export function vfModuleReducer(state: ServiceState , action: Action) : ServiceState{
+ switch (action.type) {
+ case VfModuleActions.CREATE_VF_MODULE: {
+ const updateVFModuleInstanceAction = <CreateVFModuleInstanceAction>action;
+ const vfInstance = updateVFModuleInstanceAction.vfInstance;
+ const serviceUuid = updateVFModuleInstanceAction.serviceUuid;
+ const vfModuleId = updateVFModuleInstanceAction.vfId;
+ const vnfStoreKey = updateVFModuleInstanceAction.vnfStoreKey;
+
+ let newState = Object.assign({}, state);
+
+ let vfModulesMap = newState.serviceInstance[serviceUuid].vnfs[vnfStoreKey].vfModules[vfModuleId] || new VfModuleMap();
+ let randomId = generateId();
+ vfModulesMap[vfModuleId + randomId] = vfInstance;
+ updateUniqueNames(null, vfInstance.instanceName, newState.serviceInstance[serviceUuid]);
+ updateUniqueNames(null, vfInstance.volumeGroupName, newState.serviceInstance[serviceUuid]);
+ updateServiceValidationCounter(newState, false, vfInstance['isMissingData'], serviceUuid);
+
+ newState.serviceInstance[serviceUuid].vnfs[vnfStoreKey].vfModules[vfModuleId] = vfModulesMap;
+ return newState;
+ }
+ case VfModuleActions.UPDATE_VF_MODULE: {
+ const updateVFModuleInstanceAction = <UpdateVFModuleInstanceAction>action;
+ const vfInstance = updateVFModuleInstanceAction.vfInstance;
+ const serviceUuid = updateVFModuleInstanceAction.serviceUuid;
+ const vfModuleId = updateVFModuleInstanceAction.vfId;
+ const newState = _.cloneDeep(state);
+ const vnfs = newState.serviceHierarchy[serviceUuid].vnfs;
+ let vnfId = getVfModuleParentVnfId(vnfs, vfModuleId);
+ const vnfStoreKey = updateVFModuleInstanceAction.vnfStoreKey;
+ if (!_.isNil(vnfStoreKey)) {
+ vnfId = vnfStoreKey;
+ }
+ let vfModulesMap = newState.serviceInstance[serviceUuid].vnfs[vnfId].vfModules[vfModuleId] || new VfModuleMap();
+ updateServiceValidationCounter(newState, vfModulesMap[updateVFModuleInstanceAction.dynamicModelName]['isMissingData'], vfInstance.isMissingData, serviceUuid);
+ updateUniqueNames(vfModulesMap[updateVFModuleInstanceAction.dynamicModelName].instanceName, vfInstance.instanceName, newState.serviceInstance[serviceUuid]);
+ updateUniqueNames(vfModulesMap[updateVFModuleInstanceAction.dynamicModelName].volumeGroupName, vfInstance.volumeGroupName, newState.serviceInstance[serviceUuid]);
+ vfModulesMap[updateVFModuleInstanceAction.dynamicModelName] = vfInstance;
+ newState.serviceInstance[serviceUuid].vnfs[vnfId].vfModules[vfModuleId] = vfModulesMap;
+ return newState;
+ }
+ case VfModuleActions.REMOVE_VNF_MODULE_INSTANCE: {
+ const actionData = (<DeleteVfModuleInstanceAction>action);
+ if (state.serviceInstance[actionData.serviceModelId]) {
+ let vfModulesMap = state.serviceInstance[actionData.serviceModelId].vnfs[actionData.vnfStoreKey].vfModules;
+ updateIsMissingDataOnDeleteVFModule(state, actionData.serviceModelId, actionData.vnfStoreKey, actionData.modelName);
+ updateUniqueNames(vfModulesMap[actionData.modelName][actionData.dynamicModelName].instanceName, null, state.serviceInstance[actionData.serviceModelId] );
+ updateUniqueNames(vfModulesMap[actionData.modelName][actionData.dynamicModelName].volumeGroupName, null, state.serviceInstance[actionData.serviceModelId] );
+ delete vfModulesMap[actionData.modelName][actionData.dynamicModelName];
+ if(_.isEmpty(vfModulesMap[actionData.modelName])){
+ delete vfModulesMap[actionData.modelName];
+ }
+ }
+ return Object.assign({}, state);
+ }
+ case VfModuleActions.DELETE_ACTION_VF_MODULE_INSTANCE : {
+ let newState = _.cloneDeep(state);
+ let vfModules = newState.serviceInstance[(<DeleteActionVfModuleInstanceAction>action).serviceId].vnfs[(<DeleteActionVfModuleInstanceAction>action).vnfStoreKey].vfModules;
+
+ for(let key in vfModules){
+ let firstKey = Object.keys(vfModules[key])[0];
+ if(firstKey === (<DeleteActionVfModuleInstanceAction>action).dynamicModelName){
+ let oldAction = newState.serviceInstance[(<DeleteActionVfModuleInstanceAction>action).serviceId].vnfs[(<DeleteActionVfModuleInstanceAction>action).vnfStoreKey].vfModules[key][firstKey].action;
+ if(oldAction === ServiceInstanceActions.None_Delete || oldAction === ServiceInstanceActions.Update_Delete) return newState;
+ newState.serviceInstance[(<DeleteActionVfModuleInstanceAction>action).serviceId].vnfs[(<DeleteActionVfModuleInstanceAction>action).vnfStoreKey].vfModules[key][firstKey].action = (oldAction + '_Delete') as ServiceInstanceActions;
+ updateIsMissingDataOnDeleteVFModule(newState, (<UndoDeleteActionVfModuleInstanceAction>action).serviceId, (<UndoDeleteActionVfModuleInstanceAction>action).vnfStoreKey, key);
+ return newState;
+ }
+ }
+ return newState;
+ }
+ case VfModuleActions.UNDO_DELETE_ACTION_VF_MODULE_INSTANCE : {
+ let newState = _.cloneDeep(state);
+ let vfModules = newState.serviceInstance[(<DeleteActionVfModuleInstanceAction>action).serviceId].vnfs[(<DeleteActionVfModuleInstanceAction>action).vnfStoreKey].vfModules;
+
+ for(let key in vfModules){
+ let firstKey = Object.keys(vfModules[key])[0];
+ if(firstKey === (<UndoDeleteActionVfModuleInstanceAction>action).dynamicModelName){
+ let oldAction = newState.serviceInstance[(<UndoDeleteActionVfModuleInstanceAction>action).serviceId].vnfs[(<UndoDeleteActionVfModuleInstanceAction>action).vnfStoreKey].vfModules[key][firstKey].action;
+ newState.serviceInstance[(<UndoDeleteActionVfModuleInstanceAction>action).serviceId].vnfs[(<UndoDeleteActionVfModuleInstanceAction>action).vnfStoreKey].vfModules[key][firstKey].action = (oldAction.split('_')[0]) as ServiceInstanceActions;
+ updateIsMissingDataOnDeleteVFModule(newState, (<UndoDeleteActionVfModuleInstanceAction>action).serviceId, (<UndoDeleteActionVfModuleInstanceAction>action).vnfStoreKey, key);
+ return newState;
+ }
+ }
+ return newState;
+ }
+
+ case VfModuleActions.UPDATE_VFMODULE_POSITION : {
+ const updateVFModluePosition = <UpdateVFModluePosition>action;
+ const serviceUuid = updateVFModluePosition.instanceId;
+ const dynamicModelName = updateVFModluePosition.node.dynamicModelName;
+ const modelName = updateVFModluePosition.node.modelName;
+ const newState = _.cloneDeep(state);
+
+ newState.serviceInstance[serviceUuid].vnfs[updateVFModluePosition.vnfStoreKey].vfModules[modelName][dynamicModelName].position = updateVFModluePosition.node.position;
+ return newState;
+ }
+ }
+}
+
+const updateIsMissingDataOnDeleteVFModule = (state: any, serviceModelId: string, vnfStoreKey: string, vfModuleName): void => {
+ const vfModules = state.serviceInstance[serviceModelId].vnfs[vnfStoreKey].vfModules[vfModuleName];
+
+ _.forOwn(vfModules, (vfModuleInstance) => {
+ let isMissingData: boolean = vfModuleInstance.isMissingData;
+ updateServiceValidationCounter(state, isMissingData, false, serviceModelId);
+ });
+};
+
+
+const updateUniqueNames = (oldName : string, newName : string, serviceInstance : ServiceInstance) : void => {
+ let existingNames = serviceInstance.existingNames;
+ if (!_.isNil(oldName) && oldName.toLowerCase() in existingNames) {
+ delete existingNames[oldName.toLowerCase()];
+ }
+ if(!_.isNil(newName)) {
+ existingNames[newName.toLowerCase()] = "";
+ }
+};
+
+const updateServiceValidationCounter = (newState: any, oldValidationState: boolean, newValidationState: boolean, serviceUuid: string) => {
+ if (oldValidationState && !newValidationState) {
+ newState.serviceInstance[serviceUuid].validationCounter--;
+ } else if (!oldValidationState && newValidationState) {
+ newState.serviceInstance[serviceUuid].validationCounter++;
+ }
+};
+
+const generateId = () => {
+ return Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 5);
+};
+const getVfModuleParentVnfId = (vnfs: object, vfModuleId: string) => {
+ let vnfId = undefined;
+ _.forOwn(vnfs, (value, key) => {
+ if (vnfs[key].vfModules && vnfs[key].vfModules[vfModuleId]) {
+ vnfId = vnfs[key].modelCustomizationName;
+ return false;
+ }
+ });
+ return vnfId;
+};
+
+
+
+
+
+
+
+
+
+
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/vnf/vnf.actions.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/vnf/vnf.actions.ts
new file mode 100644
index 000000000..b84284490
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/storeUtil/utils/vnf/vnf.actions.ts
@@ -0,0 +1,99 @@
+import {Action, ActionCreator} from "redux";
+import {VnfInstance} from "../../../models/vnfInstance";
+
+export enum VNFActions {
+ CREATE_VNF_INSTANCE = "CREATE_VNF_INSTANCE",
+ UPDATE_VNF_INSTANCE = "UPDATE_VNF_INSTANCE",
+ REMOVE_VNF_INSTANCE = "REMOVE_VNF_INSTANCE",
+ DELETE_ACTION_VNF_INSTANCE = "DELETE_VNF_INSTANCE",
+ UNDO_DELETE_ACTION_VNF_INSTANCE = "UNDO_DELETE_VNF_INSTANCE",
+ UPDATE_VNF_POSITION = "UPDATE_VNF_POISTION"
+}
+
+
+export interface CreateVnfInstanceAction extends Action {
+ vnfInstance?: VnfInstance;
+ vnfModelName?: string;
+ serviceUuid?: string;
+ vnfStoreKey?:string;
+}
+
+export interface UpdateVnfPosition extends Action {
+ node: any,
+ instanceId : string,
+ vnfStoreKey?: string;
+}
+
+export interface UpdateVnfInstanceAction extends Action {
+ vnfInstance?: VnfInstance;
+ vnfModelName?: string;
+ serviceUuid?: string;
+ vnfStoreKey?:string;
+}
+
+
+
+export interface DeleteActionVnfInstanceAction extends Action {
+ vnfStoreKey: string;
+ serviceId?: string;
+}
+
+export interface UndoDeleteActionVnfInstanceAction extends Action {
+ vnfStoreKey: string;
+ serviceId?: string;
+}
+
+export interface RemoveVnfInstanceAction extends Action {
+ vnfStoreKey: string;
+ serviceId?: string;
+}
+
+export const createVNFInstance: ActionCreator<CreateVnfInstanceAction> = (vnfInstance, vnfModelName, serviceUuid, vnfStoreKey) => ({
+ type: VNFActions.CREATE_VNF_INSTANCE,
+ vnfInstance: vnfInstance,
+ vnfModelName: vnfModelName,
+ serviceUuid: serviceUuid,
+ vnfStoreKey : vnfStoreKey
+});
+
+
+export const updateVNFInstance: ActionCreator<UpdateVnfInstanceAction> = (vnfInstance, vnfModelName, serviceUuid, vnfStoreKey) => ({
+ type: VNFActions.UPDATE_VNF_INSTANCE,
+ vnfInstance: vnfInstance,
+ vnfModelName: vnfModelName,
+ serviceUuid: serviceUuid,
+ vnfStoreKey : vnfStoreKey
+});
+
+
+export const deleteActionVnfInstance: ActionCreator<DeleteActionVnfInstanceAction> = (vnfStoreKey, serviceId) => ({
+ type: VNFActions.DELETE_ACTION_VNF_INSTANCE,
+ vnfStoreKey: vnfStoreKey,
+ serviceId: serviceId
+});
+
+export const undoDeleteActionVnfInstance: ActionCreator<UndoDeleteActionVnfInstanceAction> = (vnfStoreKey, serviceId) => ({
+ type: VNFActions.UNDO_DELETE_ACTION_VNF_INSTANCE,
+ vnfStoreKey: vnfStoreKey,
+ serviceId: serviceId
+});
+
+export const removeVnfInstance: ActionCreator<RemoveVnfInstanceAction> = (vnfStoreKey, serviceId) => ({
+ type: VNFActions.REMOVE_VNF_INSTANCE,
+ vnfStoreKey: vnfStoreKey,
+ serviceId: serviceId
+});
+
+export const updateVnfPosition: ActionCreator<UpdateVnfPosition> = (node, instanceId, vnfStoreKey) => ({
+ type: VNFActions.UPDATE_VNF_POSITION,
+ node: node,
+ instanceId: instanceId,
+ vnfStoreKey : vnfStoreKey
+});
+
+
+
+
+
+
+
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/vnf/vnf.reducers.spec.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/vnf/vnf.reducers.spec.ts
new file mode 100644
index 000000000..3241f11d9
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/storeUtil/utils/vnf/vnf.reducers.spec.ts
@@ -0,0 +1,132 @@
+import {VnfInstance} from "../../../models/vnfInstance";
+import {
+ CreateVnfInstanceAction,
+ DeleteActionVnfInstanceAction, RemoveVnfInstanceAction,
+ UndoDeleteActionVnfInstanceAction, UpdateVnfPosition,
+ VNFActions
+} from "./vnf.actions";
+import {vnfReducer} from "./vnf.reducers";
+import {ServiceInstanceActions} from "../../../models/serviceInstanceActions";
+
+describe('networkReducer', () => {
+ test('#UPDATE_VNF_POSITION', () => {
+ let vnfInstance: VnfInstance = new VnfInstance();
+ vnfInstance.isMissingData = false;
+ vnfInstance.instanceName = 'instanceName';
+ let vnfState = vnfReducer(<any>{
+ serviceInstance : {
+ 'serviceModelId' : {
+ vnfs : {
+ "vnfStoreKey" : {
+
+ }
+ }
+ }
+ }},
+ <UpdateVnfPosition>{
+ type: VNFActions.UPDATE_VNF_POSITION,
+ node : <any>{
+ position : 1
+ },
+ vnfStoreKey : 'vnfStoreKey',
+ instanceId : 'serviceModelId'
+ }).serviceInstance['serviceModelId'].vnfs['vnfStoreKey'];
+
+ expect(vnfState).toBeDefined();
+ expect(vnfState.position).toEqual(1);
+ });
+
+ test('#CREATE_NETWORK_INSTANCE', () => {
+ let vnfInstance: VnfInstance = new VnfInstance();
+ vnfInstance.isMissingData = false;
+ vnfInstance.instanceName = 'instanceName';
+ let vnfState = vnfReducer(<any>{serviceInstance : {
+ 'serviceModelId' : {
+ vnfs : {
+
+ }
+ }
+ }},
+ <CreateVnfInstanceAction>{
+ type: VNFActions.CREATE_VNF_INSTANCE,
+ vnfInstance : vnfInstance,
+ vnfStoreKey : null,
+ vnfModelName : 'vnfModelName',
+ serviceUuid : 'serviceModelId'
+ }).serviceInstance['serviceModelId'].vnfs['vnfModelName'];
+
+ expect(vnfState).toBeDefined();
+ expect(vnfState.isMissingData).toBeFalsy();
+ });
+
+ test('#DELETE_ACTION_VNF_INSTANCE', () => {
+ let vnfState = vnfReducer(<any>{serviceInstance : {
+ 'serviceModelId' : {
+ vnfs : {
+ 'vnfStoreKey' : {
+ isMissingData : true,
+ action : 'None'
+ }
+ }
+ }
+ }},
+ <DeleteActionVnfInstanceAction>{
+ type: VNFActions.DELETE_ACTION_VNF_INSTANCE,
+ vnfStoreKey: 'vnfStoreKey',
+ serviceId: 'serviceModelId'
+ }).serviceInstance['serviceModelId'].vnfs['vnfStoreKey'];
+
+ expect(vnfState).toBeDefined();
+ expect(vnfState.action).toEqual(ServiceInstanceActions.None_Delete);
+ });
+
+ test('#UNDO_DELETE_ACTION_VNF_INSTANCE', () => {
+ let vnfState = vnfReducer(<any>{serviceInstance : {
+ 'serviceModelId' : {
+ vnfs : {
+ 'vnfStoreKey' : {
+ isMissingData : true,
+ action : 'Update_Delete'
+ }
+ }
+ }
+ }},
+ <UndoDeleteActionVnfInstanceAction>{
+ type: VNFActions.UNDO_DELETE_ACTION_VNF_INSTANCE,
+ vnfStoreKey: 'vnfStoreKey',
+ serviceId: 'serviceModelId'
+ }).serviceInstance['serviceModelId'].vnfs['vnfStoreKey'];
+
+ expect(vnfState).toBeDefined();
+ expect(vnfState.action).toEqual(ServiceInstanceActions.Update);
+ });
+
+ test('#REMOVE_VNF_INSTANCE', () => {
+ let vnfs = vnfReducer(<any>{serviceInstance : {
+ 'serviceModelId' : {
+ vnfs : {
+ 'vnfStoreKey' : {
+ isMissingData : true,
+ action : 'Update_Delete'
+ },
+ 'vnfStoreKey_1' : {
+ isMissingData : true,
+ action : 'Update_Delete'
+ }
+ }
+ }
+ }},
+ <RemoveVnfInstanceAction>{
+ type: VNFActions.REMOVE_VNF_INSTANCE,
+ vnfStoreKey: 'vnfStoreKey',
+ serviceId: 'serviceModelId'
+ }).serviceInstance['serviceModelId'].vnfs;
+
+ expect(vnfs).toBeDefined();
+ expect(vnfs['vnfStoreKey']).toBeUndefined();
+ });
+
+});
+
+
+
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/vnf/vnf.reducers.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/vnf/vnf.reducers.ts
new file mode 100644
index 000000000..cc24d8dc3
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/storeUtil/utils/vnf/vnf.reducers.ts
@@ -0,0 +1,124 @@
+import {Action} from "redux";
+import {VnfInstance} from "../../../models/vnfInstance";
+import {
+ CreateVnfInstanceAction,
+ DeleteActionVnfInstanceAction, RemoveVnfInstanceAction, UndoDeleteActionVnfInstanceAction,
+ UpdateVnfInstanceAction, UpdateVnfPosition,
+ VNFActions
+} from "./vnf.actions";
+import * as _ from "lodash";
+import {ServiceInstance} from "../../../models/serviceInstance";
+import {ServiceState} from "../main.reducer";
+import {ServiceInstanceActions} from "../../../models/serviceInstanceActions";
+
+export function vnfReducer(state: ServiceState, action: Action): ServiceState {
+ switch (action.type) {
+ case VNFActions.CREATE_VNF_INSTANCE: {
+ const updateVnfInstanceAction = <CreateVnfInstanceAction>action;
+ const serviceUuid = updateVnfInstanceAction.serviceUuid;
+ let vnfModelName = updateVnfInstanceAction.vnfModelName;
+ let newState = _.cloneDeep(state);
+
+ updateVnfInstanceAction.vnfInstance.originalName = vnfModelName;
+ updateVnfInstanceAction.vnfModelName = calculateNextUniqueModelName(vnfModelName, serviceUuid, newState, 'vnfs');
+
+ let vnfInstance: VnfInstance = newState.serviceInstance[serviceUuid].vnfs[vnfModelName];
+ vnfInstance = new VnfInstance();
+ updateVnfInstanceAction.vnfInstance.vnfStoreKey = updateVnfInstanceAction.vnfModelName;
+ updateVnfInstanceAction.vnfInstance.originalName = vnfModelName;
+ vnfInstance.originalName = updateVnfInstanceAction.vnfInstance.originalName;
+ vnfInstance.vnfStoreKey = updateVnfInstanceAction.vnfInstance.vnfStoreKey;
+ updateServiceValidationCounter(newState, vnfInstance['isMissingData'], updateVnfInstanceAction.vnfInstance['isMissingData'], serviceUuid);
+
+ newState.serviceInstance[serviceUuid].vnfs[updateVnfInstanceAction.vnfModelName] = Object.assign(vnfInstance, updateVnfInstanceAction.vnfInstance);
+ return newState;
+ }
+
+ case VNFActions.UPDATE_VNF_INSTANCE: {
+ const updateVnfInstanceAction = <UpdateVnfInstanceAction>action;
+ const serviceUuid = updateVnfInstanceAction.serviceUuid;
+ let vnfStoreKey = updateVnfInstanceAction.vnfStoreKey;
+
+
+ let newState = _.cloneDeep(state);
+ let vnfInstance: VnfInstance = newState.serviceInstance[serviceUuid].vnfs[vnfStoreKey];
+ updateUniqueNames(vnfInstance ? vnfInstance.instanceName : null, updateVnfInstanceAction.vnfInstance.instanceName, newState.serviceInstance[serviceUuid]);
+
+ vnfInstance = vnfInstance || new VnfInstance();
+ updateServiceValidationCounter(newState, vnfInstance['isMissingData'], updateVnfInstanceAction.vnfInstance['isMissingData'], serviceUuid);
+
+ newState.serviceInstance[serviceUuid].vnfs[vnfStoreKey] = Object.assign(vnfInstance, updateVnfInstanceAction.vnfInstance);
+ return newState;
+ }
+
+ case VNFActions.DELETE_ACTION_VNF_INSTANCE : {
+ let newState = _.cloneDeep(state);
+ let vnf = newState.serviceInstance[(<DeleteActionVnfInstanceAction>action).serviceId].vnfs[(<DeleteActionVnfInstanceAction>action).vnfStoreKey];
+ let oldAction = vnf.action;
+ if(oldAction === ServiceInstanceActions.None_Delete || oldAction === ServiceInstanceActions.Update_Delete) return newState;
+ newState.serviceInstance[(<DeleteActionVnfInstanceAction>action).serviceId].vnfs[(<DeleteActionVnfInstanceAction>action).vnfStoreKey].action = (oldAction + '_Delete') as ServiceInstanceActions;
+ updateServiceValidationCounter(newState, vnf['isMissingData'], false, (<RemoveVnfInstanceAction>action).serviceId);
+ return newState;
+ }
+
+ case VNFActions.UNDO_DELETE_ACTION_VNF_INSTANCE : {
+ let newState = _.cloneDeep(state);
+ let vnf = newState.serviceInstance[(<UndoDeleteActionVnfInstanceAction>action).serviceId].vnfs[(<UndoDeleteActionVnfInstanceAction>action).vnfStoreKey];
+ let oldState = vnf.action;
+ newState.serviceInstance[(<UndoDeleteActionVnfInstanceAction>action).serviceId].vnfs[(<UndoDeleteActionVnfInstanceAction>action).vnfStoreKey].action = (oldState.split('_')[0]) as ServiceInstanceActions;
+ updateServiceValidationCounter(newState, vnf['isMissingData'], false, (<UndoDeleteActionVnfInstanceAction>action).serviceId);
+ return newState;
+ }
+
+ case VNFActions.REMOVE_VNF_INSTANCE : {
+ let newState = _.cloneDeep(state);
+ let vnfInstance = newState.serviceInstance[(<RemoveVnfInstanceAction>action).serviceId].vnfs[(<RemoveVnfInstanceAction>action).vnfStoreKey];
+ updateServiceValidationCounter(newState, vnfInstance['isMissingData'], false, (<RemoveVnfInstanceAction>action).serviceId);
+ delete newState.serviceInstance[(<RemoveVnfInstanceAction>action).serviceId].vnfs[(<RemoveVnfInstanceAction>action).vnfStoreKey];
+ return newState;
+ }
+
+ case VNFActions.UPDATE_VNF_POSITION : {
+ let newState = _.cloneDeep(state);
+ newState.serviceInstance[(<UpdateVnfPosition>action).instanceId].vnfs[(<UpdateVnfPosition>action).vnfStoreKey].position = (<UpdateVnfPosition>action).node.position;
+ return newState;
+ }
+ }
+}
+
+const updateServiceValidationCounter = (newState: any, oldValidationState: boolean, newValidationState: boolean, serviceUuid: string) => {
+ if (oldValidationState && !newValidationState) {
+ newState.serviceInstance[serviceUuid].validationCounter--;
+ } else if (!oldValidationState && newValidationState) {
+ newState.serviceInstance[serviceUuid].validationCounter++;
+ }
+};
+
+
+const updateUniqueNames = (oldName: string, newName: string, serviceInstance: ServiceInstance): void => {
+ let existingNames = serviceInstance.existingNames;
+ if (!_.isNil(oldName) && oldName.toLowerCase() in existingNames) {
+ delete existingNames[oldName.toLowerCase()];
+ }
+ if (!_.isNil(newName)) {
+ existingNames[newName.toLowerCase()] = "";
+ }
+};
+
+
+export const calculateNextUniqueModelName = (vnfModelName: string, serviceId: string, state: any, levelName: string): string => {
+ let counter: number = null;
+ while (true) {
+ let pattern = !_.isNil(counter) ? ("_" + counter) : "";
+ if (!_.isNil(state.serviceInstance[serviceId][levelName][vnfModelName + pattern])) {
+ counter = counter ? (counter + 1) : 1;
+ } else {
+ return vnfModelName + pattern;
+ }
+ }
+};
+
+
+
+
+
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/vnfGroup/vnfGroup.actions.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/vnfGroup/vnfGroup.actions.ts
new file mode 100644
index 000000000..4ed377b7d
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/storeUtil/utils/vnfGroup/vnfGroup.actions.ts
@@ -0,0 +1,82 @@
+import {Action, ActionCreator} from "redux";
+import {VnfGroupInstance} from "../../../models/vnfGroupInstance";
+import {VnfMember} from "../../../models/VnfMember";
+
+export enum VnfGroupActions {
+ CREATE_VNF_GROUP_INSTANCE = "CREATE_VNF_GROUP_INSTANCE",
+ UPDATE_VNF_GROUP_INSTANCE = "UPDATE_VNF_GROUP_INSTANCE",
+ DELETE_ACTION_VNF_GROUP_INSTANCE = "DELETE_VNF_GROUP_INSTANCE",
+ UNDO_DELETE_ACTION_VNF_GROUP_INSTANCE = "UNDO_DELETE_VNF_GROUP_INSTANCE",
+ SET_OPTIONAL_MEMBERS_VNF_GROUP_INSTANCE = "SET_OPTIONAL_MEMBERS_VNF_GROUP_INSTANCE"
+}
+
+
+export interface CreateVnfGroupInstanceAction extends Action {
+ vnfGroupInstance?: VnfGroupInstance;
+ vnfGroupModelName?: string;
+ serviceUuid?: string;
+ vnfGroupStoreKey?:string;
+}
+
+export interface UpdateVnfGroupInstanceAction extends Action {
+ vnfGroupInstance?: VnfGroupInstance;
+ vnfGroupModelName?: string;
+ serviceUuid?: string;
+ vnfGroupStoreKey?:string;
+}
+
+export interface DeleteActionVnfGroupInstanceAction extends Action {
+ vnfGroupStoreKey: string;
+ serviceId?: string;
+}
+
+export interface UndoDeleteActionVnfGroupInstanceAction extends Action {
+ vnfGroupStoreKey: string;
+ serviceId?: string;
+}
+
+export interface SetOptionalMembersVnfGroupInstanceAction extends Action{
+ path?: string;
+ serviceId?: string;
+ vnfMembers?: VnfMember[]
+}
+
+export const createVnfGroupInstance: ActionCreator<CreateVnfGroupInstanceAction> = (vnfGroupInstance, vnfGroupModelName, serviceUuid, vnfGroupStoreKey) => ({
+ type: VnfGroupActions.CREATE_VNF_GROUP_INSTANCE,
+ vnfGroupInstance: vnfGroupInstance,
+ vnfGroupModelName: vnfGroupModelName,
+ serviceUuid: serviceUuid,
+ vnfGroupStoreKey : vnfGroupStoreKey
+});
+
+
+export const updateVnfGroupInstance: ActionCreator<UpdateVnfGroupInstanceAction> = (vnfGroupInstance, vnfGroupModelName, serviceUuid, vnfGroupStoreKey) => ({
+ type: VnfGroupActions.UPDATE_VNF_GROUP_INSTANCE,
+ vnfGroupInstance: vnfGroupInstance,
+ vnfGroupModelName: vnfGroupModelName,
+ serviceUuid: serviceUuid,
+ vnfGroupStoreKey : vnfGroupStoreKey
+});
+
+export const deleteActionVnfGroupInstance: ActionCreator<DeleteActionVnfGroupInstanceAction> = (vnfGroupStoreKey, serviceId) => ({
+ type: VnfGroupActions.DELETE_ACTION_VNF_GROUP_INSTANCE,
+ vnfGroupStoreKey: vnfGroupStoreKey,
+ serviceId: serviceId
+});
+
+export const undoDeleteActionVnfGroupInstance: ActionCreator<UndoDeleteActionVnfGroupInstanceAction> = (vnfGroupStoreKey, serviceId) => ({
+ type: VnfGroupActions.UNDO_DELETE_ACTION_VNF_GROUP_INSTANCE,
+ vnfGroupStoreKey: vnfGroupStoreKey,
+ serviceId: serviceId
+});
+
+export const setOptionalMembersVnfGroupInstance: ActionCreator<SetOptionalMembersVnfGroupInstanceAction> = ( serviceId: string, path: string, vnfMembers: VnfMember[]) => ({
+ type: VnfGroupActions.SET_OPTIONAL_MEMBERS_VNF_GROUP_INSTANCE,
+ path: path,
+ serviceId: serviceId,
+ vnfMembers: vnfMembers
+});
+
+
+
+
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/vnfGroup/vnfGroup.reducers.spec.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/vnfGroup/vnfGroup.reducers.spec.ts
new file mode 100644
index 000000000..16c1c45cd
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/storeUtil/utils/vnfGroup/vnfGroup.reducers.spec.ts
@@ -0,0 +1,140 @@
+import {VnfGroupInstance} from "../../../models/vnfGroupInstance";
+import {
+ CreateVnfGroupInstanceAction,
+ DeleteActionVnfGroupInstanceAction,
+ SetOptionalMembersVnfGroupInstanceAction,
+ UpdateVnfGroupInstanceAction,
+ VnfGroupActions
+} from "./vnfGroup.actions";
+import {vnfGroupReducer} from "./vnfGroup.reducers";
+import {ServiceInstanceActions} from "../../../models/serviceInstanceActions";
+import {VnfMember} from "../../../models/VnfMember";
+
+
+describe('vnfGroupReducer', () => {
+ test('#CREATE_VNF_GROUP_INSTANCE', () => {
+ let vnfGroupInstance: VnfGroupInstance = new VnfGroupInstance();
+ vnfGroupInstance.isMissingData = false;
+ vnfGroupInstance.instanceName = 'instanceName';
+ let vnfGroupState = vnfGroupReducer(<any>{serviceInstance : {
+ 'serviceModelId' : {
+ vnfGroups : {
+
+ }
+ }
+ }},
+ <CreateVnfGroupInstanceAction>{
+ type: VnfGroupActions.CREATE_VNF_GROUP_INSTANCE,
+ vnfGroupInstance : vnfGroupInstance,
+ vnfGroupStoreKey : null,
+ vnfGroupModelName : 'vnfGroupModelName',
+ serviceUuid : 'serviceModelId'
+ }).serviceInstance['serviceModelId'].vnfGroups['vnfGroupModelName'];
+
+ expect(vnfGroupState).toBeDefined();
+ expect(vnfGroupState.isMissingData).toBeFalsy();
+ });
+
+ test('#UPDATE_VNF_GROUP_INSTANCE', () => {
+ let vnfGroupInstance: VnfGroupInstance = new VnfGroupInstance();
+ vnfGroupInstance.isMissingData = false;
+ vnfGroupInstance.instanceName = 'instanceName';
+ let vnfGroupState = vnfGroupReducer(<any>{serviceInstance : {
+ 'serviceModelId' : {
+ vnfGroups : {
+ 'vnfGroupStoreKey' : {
+ isMissingData : true
+ }
+ }
+ }
+ }},
+ <UpdateVnfGroupInstanceAction>{
+ type: VnfGroupActions.UPDATE_VNF_GROUP_INSTANCE,
+ vnfGroupInstance : new VnfGroupInstance(),
+ vnfGroupStoreKey : 'vnfGroupStoreKey',
+ vnfGroupModelName : 'vnfGroupModelName',
+ serviceUuid : 'serviceModelId'
+ }).serviceInstance['serviceModelId'].vnfGroups['vnfGroupStoreKey'];
+
+ expect(vnfGroupState).toBeDefined();
+ expect(vnfGroupState.isMissingData).toBeFalsy();
+ });
+
+ test('#DELETE_ACTION_VNF_GROUP_INSTANCE', () => {
+ let vnfGroupInstance: VnfGroupInstance = new VnfGroupInstance();
+ vnfGroupInstance.isMissingData = false;
+ vnfGroupInstance.instanceName = 'instanceName';
+ vnfGroupInstance.action = ServiceInstanceActions.None;
+ let vnfGroupState = vnfGroupReducer(<any>{serviceInstance : {
+ 'serviceModelId' : {
+ vnfGroups : {
+ 'vnfGroupStoreKey' : {
+ isMissingData : true,
+ action : 'None'
+ }
+ }
+ }
+ }},
+ <DeleteActionVnfGroupInstanceAction>{
+ type: VnfGroupActions.DELETE_ACTION_VNF_GROUP_INSTANCE,
+ vnfGroupStoreKey: 'vnfGroupStoreKey',
+ serviceId: 'serviceModelId'
+ }).serviceInstance['serviceModelId'].vnfGroups['vnfGroupStoreKey'];
+
+ expect(vnfGroupState).toBeDefined();
+ expect(vnfGroupState.action).toEqual(ServiceInstanceActions.None_Delete);
+ });
+
+ test('#UNDO_DELETE_ACTION_VNF_GROUP_INSTANCE', () => {
+ let vnfGroupInstance: VnfGroupInstance = new VnfGroupInstance();
+ vnfGroupInstance.isMissingData = false;
+ vnfGroupInstance.instanceName = 'instanceName';
+ vnfGroupInstance.action = ServiceInstanceActions.None_Delete;
+ let vnfGroupState = vnfGroupReducer(<any>{serviceInstance : {
+ 'serviceModelId' : {
+ vnfGroups : {
+ 'vnfGroupStoreKey' : {
+ isMissingData : true,
+ action : 'None_Delete'
+ }
+ }
+ }
+ }},
+ <DeleteActionVnfGroupInstanceAction>{
+ type: VnfGroupActions.UNDO_DELETE_ACTION_VNF_GROUP_INSTANCE,
+ vnfGroupStoreKey: 'vnfGroupStoreKey',
+ serviceId: 'serviceModelId'
+ }).serviceInstance['serviceModelId'].vnfGroups['vnfGroupStoreKey'];
+
+ expect(vnfGroupState).toBeDefined();
+ expect(vnfGroupState.action).toEqual(ServiceInstanceActions.None);
+ });
+
+ test('#SET_OPTIONAL_MEMBERS_VNF_GROUP_INSTANCE', () => {
+ let vnf1: VnfMember = new VnfMember();
+ vnf1.serviceInstanceId = 'aa';
+ vnf1.instanceId = 'aaa';
+ let vnf2: VnfMember = new VnfMember();
+ vnf2.serviceInstanceId = 'bb';
+ vnf2.instanceId = 'bbb';
+ let optionalGroupMembersMap = vnfGroupReducer(<any>{
+ serviceInstance: {
+ 'serviceModelId': {
+ optionalGroupMembersMap : {}
+ }
+ }
+ },
+ <SetOptionalMembersVnfGroupInstanceAction>{
+ type: VnfGroupActions.SET_OPTIONAL_MEMBERS_VNF_GROUP_INSTANCE,
+ path: 'path1',
+ serviceId: 'serviceModelId',
+ vnfMembers: [vnf1, vnf2]
+ }).serviceInstance['serviceModelId'].optionalGroupMembersMap;
+
+ optionalGroupMembersMap['path1']= [vnf1, vnf2];
+ expect(optionalGroupMembersMap).toEqual({'path1':[vnf1, vnf2]});
+ });
+});
+
+
+
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/vnfGroup/vnfGroup.reducers.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/vnfGroup/vnfGroup.reducers.ts
new file mode 100644
index 000000000..2923c09b2
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/storeUtil/utils/vnfGroup/vnfGroup.reducers.ts
@@ -0,0 +1,108 @@
+import {Action} from "redux";
+import {VnfGroupInstance} from "../../../models/vnfGroupInstance";
+import * as _ from "lodash";
+import {ServiceInstance} from "../../../models/serviceInstance";
+import {ServiceState} from "../main.reducer";
+import {
+ CreateVnfGroupInstanceAction,
+ DeleteActionVnfGroupInstanceAction, SetOptionalMembersVnfGroupInstanceAction,
+ UpdateVnfGroupInstanceAction,
+ VnfGroupActions
+} from "./vnfGroup.actions";
+import {ServiceInstanceActions} from "../../../models/serviceInstanceActions";
+
+export function vnfGroupReducer(state: ServiceState, action: Action): ServiceState {
+ switch (action.type) {
+ case VnfGroupActions.CREATE_VNF_GROUP_INSTANCE: {
+ const updateVnfGroupInstanceAction = <CreateVnfGroupInstanceAction>action;
+ const serviceUuid = updateVnfGroupInstanceAction.serviceUuid;
+ let vnfGroupModelName = updateVnfGroupInstanceAction.vnfGroupModelName;
+ let newState = _.cloneDeep(state);
+
+ updateVnfGroupInstanceAction.vnfGroupInstance.originalName = vnfGroupModelName;
+ updateVnfGroupInstanceAction.vnfGroupModelName = calculateNextUniqueModelName(vnfGroupModelName, serviceUuid, newState, 'vnfGroups');
+
+ let vnfGroupInstance: VnfGroupInstance = newState.serviceInstance[serviceUuid].vnfGroups[vnfGroupModelName];
+ vnfGroupInstance = new VnfGroupInstance();
+ updateVnfGroupInstanceAction.vnfGroupInstance.vnfGroupStoreKey = updateVnfGroupInstanceAction.vnfGroupModelName;
+ updateVnfGroupInstanceAction.vnfGroupInstance.originalName = vnfGroupModelName;
+ vnfGroupInstance.originalName = updateVnfGroupInstanceAction.vnfGroupInstance.originalName;
+ vnfGroupInstance.vnfGroupStoreKey = updateVnfGroupInstanceAction.vnfGroupInstance.vnfGroupStoreKey;
+ updateServiceValidationCounter(newState, vnfGroupInstance['isMissingData'], updateVnfGroupInstanceAction.vnfGroupInstance['isMissingData'], serviceUuid);
+
+ newState.serviceInstance[serviceUuid].vnfGroups[updateVnfGroupInstanceAction.vnfGroupModelName] = Object.assign(vnfGroupInstance, updateVnfGroupInstanceAction.vnfGroupInstance);
+ return newState;
+ }
+ case VnfGroupActions.UPDATE_VNF_GROUP_INSTANCE: {
+ const updateVnfInstanceAction = <UpdateVnfGroupInstanceAction>action;
+ const serviceUuid = updateVnfInstanceAction.serviceUuid;
+ let vnfGroupStoreKey = updateVnfInstanceAction.vnfGroupStoreKey;
+
+
+ let newState = _.cloneDeep(state);
+ let vnfGroupInstance: VnfGroupInstance = newState.serviceInstance[serviceUuid].vnfGroups[vnfGroupStoreKey];
+ updateUniqueNames(vnfGroupInstance ? vnfGroupInstance.instanceName : null, updateVnfInstanceAction.vnfGroupInstance.instanceName, newState.serviceInstance[serviceUuid]);
+
+ vnfGroupInstance = vnfGroupInstance || new VnfGroupInstance();
+ updateServiceValidationCounter(newState, vnfGroupInstance['isMissingData'], updateVnfInstanceAction.vnfGroupInstance['isMissingData'], serviceUuid);
+
+ newState.serviceInstance[serviceUuid].vnfGroups[vnfGroupStoreKey] = Object.assign(vnfGroupInstance, updateVnfInstanceAction.vnfGroupInstance);
+ return newState;
+ }
+ case VnfGroupActions.DELETE_ACTION_VNF_GROUP_INSTANCE : {
+ let newState = _.cloneDeep(state);
+ let oldAction = newState.serviceInstance[(<DeleteActionVnfGroupInstanceAction>action).serviceId].vnfGroups[(<DeleteActionVnfGroupInstanceAction>action).vnfGroupStoreKey].action;
+ if(oldAction === ServiceInstanceActions.None_Delete || oldAction === ServiceInstanceActions.Update_Delete) return newState;
+ newState.serviceInstance[(<DeleteActionVnfGroupInstanceAction>action).serviceId].vnfGroups[(<DeleteActionVnfGroupInstanceAction>action).vnfGroupStoreKey].action = (oldAction + '_Delete') as ServiceInstanceActions;
+ return newState;
+ }
+ case VnfGroupActions.UNDO_DELETE_ACTION_VNF_GROUP_INSTANCE : {
+ let newState = _.cloneDeep(state);
+ let oldState = newState.serviceInstance[(<DeleteActionVnfGroupInstanceAction>action).serviceId].vnfGroups[(<DeleteActionVnfGroupInstanceAction>action).vnfGroupStoreKey].action;
+ newState.serviceInstance[(<DeleteActionVnfGroupInstanceAction>action).serviceId].vnfGroups[(<DeleteActionVnfGroupInstanceAction>action).vnfGroupStoreKey].action = (oldState.split('_')[0]) as ServiceInstanceActions;
+ return newState;
+ }
+ case VnfGroupActions.SET_OPTIONAL_MEMBERS_VNF_GROUP_INSTANCE:{
+ let newState = _.cloneDeep(state);
+ newState.serviceInstance[(<SetOptionalMembersVnfGroupInstanceAction>action).serviceId].optionalGroupMembersMap[(<SetOptionalMembersVnfGroupInstanceAction>action).path] = (<SetOptionalMembersVnfGroupInstanceAction>action).vnfMembers;
+ return newState;
+ }
+ }
+}
+
+const updateServiceValidationCounter = (newState: any, oldValidationState: boolean, newValidationState: boolean, serviceUuid: string) => {
+ if (oldValidationState && !newValidationState) {
+ newState.serviceInstance[serviceUuid].validationCounter--;
+ } else if (!oldValidationState && newValidationState) {
+ newState.serviceInstance[serviceUuid].validationCounter++;
+ }
+};
+
+
+const updateUniqueNames = (oldName: string, newName: string, serviceInstance: ServiceInstance): void => {
+ let existingNames = serviceInstance.existingNames;
+ if (!_.isNil(oldName) && oldName.toLowerCase() in existingNames) {
+ delete existingNames[oldName.toLowerCase()];
+ }
+ if (!_.isNil(newName)) {
+ existingNames[newName.toLowerCase()] = "";
+ }
+};
+
+
+export const calculateNextUniqueModelName = (vnfGroupModelName: string, serviceId: string, state: any, levelName: string): string => {
+ let counter: number = null;
+ while (true) {
+ let pattern = !_.isNil(counter) ? ("_" + counter) : "";
+ if (!_.isNil(state.serviceInstance[serviceId][levelName][vnfGroupModelName + pattern])) {
+ counter = counter ? (counter + 1) : 1;
+ } else {
+ return vnfGroupModelName + pattern;
+ }
+ }
+};
+
+
+
+
+
diff --git a/vid-webpack-master/src/app/shared/utils/constants.ts b/vid-webpack-master/src/app/shared/utils/constants.ts
index c78e12e28..f69517cf2 100644
--- a/vid-webpack-master/src/app/shared/utils/constants.ts
+++ b/vid-webpack-master/src/app/shared/utils/constants.ts
@@ -34,9 +34,10 @@ export module Constants {
public static AAI_GET_SERVICES_BY_TYPE = 'aai_get_models_by_service_type';
public static AAI_GET_TENANTS = '../../aai_get_tenants/';
public static AAI_SUB_DETAILS_PATH = '../../aai_sub_details/';
+ public static AAI_GET_SERVICE_INSTANCE_TOPOLOGY_PATH = '../../aai_get_service_instance_topology/';
+ public static AAI_GET_SERVICE_GROUP_MEMBERS_PATH = '../../aai_search_group_members/';
public static AAI_GET_VERSION_BY_INVARIANT_ID = 'aai_get_version_by_invariant_id/';
public static SEARCH_SERVICE_INSTANCES = 'search_service_instances';
- public static AAI_GET_VNF_DATA_PATH = 'aai_get_vnf_data/';
public static AAI_GET_VNF_BY_CUSTOMERID_AND_SERVICETYPE = 'get_vnf_data_by_globalid_and_service_type/';
public static AAI_GET_SERVICES_BY_OWNING_ENTITY_ID = 'aai_get_services_by_owning_entity_id';
public static AAI_GET_VNF_INFO = 'aai_get_vnf_information';
@@ -87,10 +88,12 @@ export module Constants {
public static WELCOME_PATH = 'welcome.htm';
public static IS_PERMITTED_SUB_PATH = '&isPermitted=';
public static SERVICES_JOB_INFO_PATH = '../../asyncInstantiation';
+ public static SERVICES_RETRY_TOPOLOGY = '../../asyncInstantiation/bulkForRetry';
public static CONFIGURATION_PATH = '../../get_property/{name}/defaultvalue';
public static SERVICES_JOB_AUDIT_PATH = '/auditStatus';
public static SERVICES_PROBE_PATH = "../../probe";
public static FEATURES_FLAG_PATH ="../../flags";
+ public static AUDIT_STATUS_FOR_RETRY_PATH = '../../asyncInstantiation/auditStatusForRetry';
// Test Environment Urls =
public static OPERATIONAL_ENVIRONMENT_CREATE = 'operationalEnvironment/create';
@@ -284,4 +287,8 @@ export module Constants {
export class AuditInfoModal{
public static TITLE = 'Service Instantiation Information';
}
+
+ export class LegacyRegion {
+ public static MEGA_REGION = ['JANET25'];
+ }
}
diff --git a/vid-webpack-master/src/app/shared/utils/httpInterceptor/httpInterceptor.service.ts b/vid-webpack-master/src/app/shared/utils/httpInterceptor/httpInterceptor.service.ts
index be9ade080..daa31a33f 100644
--- a/vid-webpack-master/src/app/shared/utils/httpInterceptor/httpInterceptor.service.ts
+++ b/vid-webpack-master/src/app/shared/utils/httpInterceptor/httpInterceptor.service.ts
@@ -1,19 +1,19 @@
-import { Injectable } from '@angular/core';
-import {
- HttpInterceptor,
- HttpRequest,
- HttpHandler,
- HttpEvent, HttpErrorResponse
-} from '@angular/common/http';
+import {Injectable} from '@angular/core';
+import {HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest} from '@angular/common/http';
-import { Observable } from 'rxjs/Observable';
-import { ErrorMessage, ErrorService } from '../../components/error/error.component.service';
-import { SpinnerComponent } from '../../components/spinner/spinner.component';
+import {Observable} from 'rxjs';
+import {ErrorMessage, ErrorService} from '../../components/error/error.component.service';
+import {SpinnerComponent, SpinnerInfo} from '../../components/spinner/spinner.component';
+import {of} from "rxjs";
@Injectable()
export class HttpInterceptorService implements HttpInterceptor {
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
- SpinnerComponent.showSpinner.next(true);
+ if (request.headers.get('x-show-spinner') !== false.toString()) {
+ let spinnerInfo : SpinnerInfo = new SpinnerInfo(true, request.url, request.responseType);
+ SpinnerComponent.showSpinner.next(spinnerInfo);
+ }
+
return next.handle(request)
.catch((err: HttpErrorResponse) => {
if (err.status === 500) {
@@ -21,11 +21,12 @@ export class HttpInterceptorService implements HttpInterceptor {
'It appears that one of the backend servers is not responding.\n Please try later.',
500);
ErrorService.showErrorWithMessage(errorMessage);
- return Observable.of(null);
+ return of(null);
}
return Observable.throw(err);
}).finally(() => {
- SpinnerComponent.showSpinner.next(false);
+ let spinnerInfo : SpinnerInfo = new SpinnerInfo(false, request.url, request.responseType);
+ SpinnerComponent.showSpinner.next(spinnerInfo);
});
}
}
diff --git a/vid-webpack-master/src/app/shared/utils/log/log.service.spec.ts b/vid-webpack-master/src/app/shared/utils/log/log.service.spec.ts
index ea0eb0499..15a840f76 100644
--- a/vid-webpack-master/src/app/shared/utils/log/log.service.spec.ts
+++ b/vid-webpack-master/src/app/shared/utils/log/log.service.spec.ts
@@ -1,16 +1,24 @@
import {LogService} from "./log.service";
+import {TestBed} from "@angular/core/testing";
describe('log service service', () => {
+
let logService : LogService;
- beforeEach(() => {
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+
+ });
+ await TestBed.compileComponents();
logService = new LogService();
- });
- it('check all ILogger function are defined', ()=>{
+ })().then(done).catch(done.fail));
+
+
+ test('check all ILogger function are defined', ()=>{
expect(logService.log).toBeDefined();
expect(logService.assert).toBeDefined();
expect(logService.error).toBeDefined();
@@ -20,10 +28,40 @@ describe('log service service', () => {
expect(logService.warn).toBeDefined();
});
- it('test getPrefixLog function', ()=> {
+ test('test getPrefixLog function: with data', ()=> {
let args = ['message', [1,2,3,4,5]];
let result = LogService.getPrefixLog(args);
expect(result).toBeDefined();
});
+ test('log assert', ()=> {
+ jest.spyOn(console, 'assert');
+ logService.assert('someArg');
+ expect(console.assert).toHaveBeenCalled();
+ });
+
+ test('log group', ()=> {
+ jest.spyOn(console, 'group');
+ logService.group('someArg');
+ expect(console.group).toHaveBeenCalled();
+ });
+
+ test('log groupEnd', ()=> {
+ jest.spyOn(console, 'groupEnd');
+ logService.groupEnd('someArg');
+ expect(console.groupEnd).toHaveBeenCalled();
+ });
+
+ test('log log', ()=> {
+ jest.spyOn(console, 'log');
+ logService.log('someArg');
+ expect(console.log).toHaveBeenCalled();
+ });
+
+ test('log warn', ()=> {
+ spyOn(console, 'warn');
+ logService.warn('someArg');
+ expect(console.warn).toHaveBeenCalled();
+ });
+
});
diff --git a/vid-webpack-master/src/app/shared/utils/util.spec.ts b/vid-webpack-master/src/app/shared/utils/util.spec.ts
new file mode 100644
index 000000000..2f9142f9c
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/utils/util.spec.ts
@@ -0,0 +1,31 @@
+import {Utils} from "./utils";
+import {TestBed} from "@angular/core/testing";
+
+
+describe('Util', () => {
+ let util: Utils;
+
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+
+ });
+ await TestBed.compileComponents();
+
+ util = new Utils();
+
+ })().then(done).catch(done.fail));
+
+ test('should be defined', () => {
+ expect(util).toBeDefined();
+ });
+
+ test('hasContents should return false if object is undefined or null or empty', () => {
+ expect(Utils.hasContents(undefined)).toBeFalsy();
+ expect(Utils.hasContents(null)).toBeFalsy();
+ expect(Utils.hasContents("")).toBeFalsy();
+ });
+
+ test('hasContents should return true if object is not undefined and not null and not empty', () => {
+ expect(Utils.hasContents("someValue")).toBeTruthy();
+ });
+});
diff --git a/vid-webpack-master/src/app/utils/utils.ts b/vid-webpack-master/src/app/shared/utils/utils.ts
index dc4db3e4f..d63a3c997 100644
--- a/vid-webpack-master/src/app/utils/utils.ts
+++ b/vid-webpack-master/src/app/shared/utils/utils.ts
@@ -1,5 +1,3 @@
-import { Constants } from '../shared/utils/constants';
-import Parameter = Constants.Parameter;
import * as _ from 'lodash'
export class Utils {
@@ -196,8 +194,6 @@ export class Utils {
for (let networkCustomizationName in serviceModel.networks) {
let networkModel = serviceModel.networks[networkCustomizationName];
convertedAsdcModel.networks[networkModel.invariantUuid] = {};
- //convertedAsdcModel.networks[networkModel.invariantUuid][networkModel.version] = networkModel;
- // need a network model to test this
convertedAsdcModel.networks[networkModel.uuid] = {
"uuid": networkModel.uuid,
"invariantUuid": networkModel.invariantUuid,
diff --git a/vid-webpack-master/src/app/shared/validators/uniqueName/uniqueName.validator.spec.ts b/vid-webpack-master/src/app/shared/validators/uniqueName/uniqueName.validator.spec.ts
new file mode 100644
index 000000000..35d3c48e8
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/validators/uniqueName/uniqueName.validator.spec.ts
@@ -0,0 +1,41 @@
+import {FormControl, ValidatorFn} from "@angular/forms";
+import {CustomValidators} from "./uniqueName.validator";
+import {FileUnit} from "../../components/formControls/component/file/fileUnit.enum";
+
+
+describe('Custom Validator Functions', () => {
+ test('isValidJson Validator should return null when value is valid and correct object when invalid', () => {
+
+ let isValidJsonFunction: ValidatorFn = CustomValidators.isValidJson();
+
+ expect(isValidJsonFunction(new FormControl("{ 'key': 'value', 'array': ['first',]}"))).toEqual({ isValidJson: true });
+
+ expect(isValidJsonFunction(new FormControl('{ "key": "value", "array": ["first"]'))).toEqual({ isValidJson: true });
+
+ expect(isValidJsonFunction(new FormControl('{ "key": "value", "array": ["first"]}'))).toEqual(null);
+
+ expect(isValidJsonFunction(new FormControl('{ "key": "value", "array": "first"}'))).toEqual(null);
+ });
+
+ test('isStringContainTags Validator should return null when value is valid and correct object when invalid', () => {
+
+ const isStringContainTagsFunction: ValidatorFn = CustomValidators.isStringContainTags();
+
+ expect(isStringContainTagsFunction(new FormControl('<asdf>'))).toEqual({isStringContainTags : true});
+
+ expect(isStringContainTagsFunction(new FormControl('1234<asfd56'))).toEqual(null);
+ });
+
+ test('isFileTooBig Validator should return null when value is valid and correct object when invalid', () => {
+
+ let isFileTooBigFunction: ValidatorFn = CustomValidators.isFileTooBig(FileUnit.MB, 5);
+
+ expect(isFileTooBigFunction(new FormControl({ size: 6000001 }))).toEqual({ isFileTooBig: true });
+
+ expect(isFileTooBigFunction(new FormControl({ size: 4000000}))).toEqual(null);
+
+ isFileTooBigFunction = CustomValidators.isFileTooBig(FileUnit.B, 5);
+
+ expect(isFileTooBigFunction(new FormControl({ size: 4000000}))).toEqual({ isFileTooBig: true });
+ })
+});
diff --git a/vid-webpack-master/src/app/shared/validators/uniqueName/uniqueName.validator.ts b/vid-webpack-master/src/app/shared/validators/uniqueName/uniqueName.validator.ts
new file mode 100644
index 000000000..4d3e3837b
--- /dev/null
+++ b/vid-webpack-master/src/app/shared/validators/uniqueName/uniqueName.validator.ts
@@ -0,0 +1,100 @@
+import {AbstractControl, ValidatorFn} from "@angular/forms";
+import {Injectable} from "@angular/core";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../store/reducers";
+import {FileUnit} from "../../components/formControls/component/file/fileUnit.enum";
+import * as _ from 'lodash';
+
+@Injectable()
+export class CustomValidators {
+ static uniqueInstanceNameValidator(...args): ValidatorFn {
+ const store : NgRedux<AppState> = args[0];
+ const serviceId : string = args[1];
+ const originalName : string = args[2];
+ return (control: AbstractControl): {[key: string]: any} | null => {
+ const name = control.value;
+ if(name && name !== originalName) {
+ const result: boolean = CustomValidators.isUnique(store.getState().service.serviceInstance, serviceId, name, name === originalName);
+ if(!result){
+ return {
+ uniqueInstanceNameValidator : true
+ };
+ }else {
+ return null;
+ }
+ }
+ return null;
+ };
+ }
+
+ static isUnique(serviceInstance : any, serviceId : string, name: string, isEqualToOriginalInstanceName : boolean) : boolean {
+ const service = serviceInstance[serviceId];
+ if(service){
+ const existingNames = service.existingNames;
+ if(_.includes(existingNames, name)) return false;
+ }
+ return true;
+ }
+
+ static isStringContainHtmlTag(str: string): boolean{
+ var regex = RegExp("<[^>]*>");
+ return regex.test(str);
+ }
+
+ static isValidJson() : ValidatorFn {
+ return (control: AbstractControl): {[key: string]: any} | null => {
+ const content = control.value;
+ let invalid: boolean = false;
+ if (content) {
+ try {
+ JSON.parse(content);
+ } catch (e) {
+ invalid = true;
+ }
+ }
+ return (invalid) ? {isValidJson : true} : null;
+ }
+ }
+
+ static isStringContainTags() : ValidatorFn {
+ return (control: AbstractControl): {[key: string]: any} | null => {
+ const content = control.value;
+ let invalid: boolean = false;
+ if (content) {
+ invalid = CustomValidators.isStringContainHtmlTag(content);
+ }
+ return (invalid) ? {isStringContainTags : true} : null;
+ }
+ }
+
+ static isFileTooBig(...args) : ValidatorFn {
+ const unit : FileUnit = args[0];
+ const size : number = args[1];
+ return (control: AbstractControl): {[key: string]: any} | null => {
+ const file = control.value;
+ let sizeToByte: number;
+ if (file) {
+ switch (unit) {
+ case FileUnit.b:
+ sizeToByte = 1/8;
+ break;
+ case FileUnit.B:
+ sizeToByte = 1;
+ break;
+ case FileUnit.KB:
+ sizeToByte = 1000;
+ break;
+ case FileUnit.MB:
+ sizeToByte = 1000000;
+ break;
+ default:
+ sizeToByte = 0;
+ break;
+
+ }
+ return (file.size > (sizeToByte * size)) ? {isFileTooBig: true} : null;
+ }
+ return null;
+ }
+ }
+}
diff --git a/vid-webpack-master/src/app/store/module.ts b/vid-webpack-master/src/app/store/module.ts
deleted file mode 100644
index c0909c124..000000000
--- a/vid-webpack-master/src/app/store/module.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import { NgModule } from '@angular/core';
-import { NgReduxModule, NgRedux, DevToolsExtension } from '@angular-redux/store';
-import { RootEpics } from './epics';
-
-import rootReducer, {AppState} from "./reducers";
-import {AAIEpics} from "../services/aaiService/aai.epics";
-
-@NgModule({
- imports: [NgReduxModule],
- providers: [RootEpics, AAIEpics],
-})
-
-export class StoreModule {
- constructor(
- public store: NgRedux<AppState>,
- devTools: DevToolsExtension,
- rootEpics: RootEpics,
- ) {
-
- const persistedState = sessionStorage.getItem('reduxState') ?
- JSON.parse(sessionStorage.getItem('reduxState')) : {};
-
- store.configureStore(
- rootReducer,
- persistedState,
- rootEpics.createEpics(),
- devTools.isEnabled() ? [ devTools.enhancer() ] : []);
- }
-}
diff --git a/vid-webpack-master/src/app/store/reducers.ts b/vid-webpack-master/src/app/store/reducers.ts
deleted file mode 100644
index b3e4f4712..000000000
--- a/vid-webpack-master/src/app/store/reducers.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import {Reducer, combineReducers} from 'redux';
-import {GlobalReducer, GlobalState} from "../global.reducer";
-import {ServiceReducer, ServiceState} from "../service.reducer";
-
-
-export interface AppState {
- global: GlobalState;
- service: ServiceState;
-
-}
-
-const rootReducer: Reducer<AppState> = combineReducers<AppState>({
- global: GlobalReducer,
- service: ServiceReducer
-});
-
-export default rootReducer;
diff --git a/vid-webpack-master/src/app/support/support.component.ts b/vid-webpack-master/src/app/support/support.component.ts
new file mode 100644
index 000000000..a065e8a67
--- /dev/null
+++ b/vid-webpack-master/src/app/support/support.component.ts
@@ -0,0 +1,20 @@
+import {Component} from '@angular/core';
+
+@Component({
+ selector: 'app-support',
+ template: `
+ <ul>
+ <li><a href="../../version">Version</a></li>
+ <li><a href="../../flags">Feature Flags</a></li>
+ <li><a href="#/healthStatus">Probe</a></li>
+ <li>
+ <form action="../../rest/models/reset" method="post">
+ <button name="upvote" value="Upvote"></button>
+ </form>
+ </li>
+ </ul>
+ `,
+})
+
+export class SupportComponent {
+}
diff --git a/vid-webpack-master/src/app/components/form-async/form-async.component.ts b/vid-webpack-master/src/app/vlanTagging/form-async/form-async.component.ts
index e71c4446b..623a4f42f 100644
--- a/vid-webpack-master/src/app/components/form-async/form-async.component.ts
+++ b/vid-webpack-master/src/app/vlanTagging/form-async/form-async.component.ts
@@ -1,16 +1,20 @@
import {Component, Input, OnInit, ViewChild} from '@angular/core';
-import { NgRedux, select } from '@angular-redux/store';
-import { Observable } from "rxjs/Observable";
-import { updateProductFamilies } from "../../service.actions";
-import { AppState } from "../../store/reducers";
+import {NgRedux, select} from '@angular-redux/store';
+import {Observable} from "rxjs";
+import {AppState} from "../../shared/store/reducers";
import {
- loadProductFamiliesAction, loadLcpTenant, loadAicZones,
- loadCategoryParameters
-} from '../../services/aaiService/aai.actions';
-import { LcpRegionsAndTenants } from "../../shared/models/lcpRegionsAndTenants";
+ loadAicZones,
+ loadCategoryParameters,
+ loadLcpTenant,
+ loadProductFamiliesAction
+} from '../../shared/services/aaiService/aai.actions';
+import {LcpRegionsAndTenants} from "../../shared/models/lcpRegionsAndTenants";
import {NgForm} from "@angular/forms";
import {SelectOption} from "../../shared/models/selectOption";
import {VNFModel} from "../../shared/models/vnfModel";
+import {Tenant} from "../../shared/models/tenant";
+import {FormAsyncService} from "./form-async.service";
+import {AaiService} from "../../shared/services/aaiService/aai.service";
@Component({
selector: "formasync",
@@ -19,16 +23,21 @@ import {VNFModel} from "../../shared/models/vnfModel";
})
-export class formasync implements OnInit {
+export class Formasync implements OnInit {
- constructor(private store: NgRedux<AppState>) { }
+ constructor(private store: NgRedux<AppState>, private _formAsyncService: FormAsyncService) { }
@ViewChild('form') form: NgForm;
-
+ @Input()
+ set params(params: any) {
+ if (params) {
+ this.paramsInfo = params;
+ }
+ }
@Input()
set model(model: VNFModel) {
if (model) {
- this.isUserProvidedNaming = model.isUserProvidedNaming;
+ this.isEcompGeneratedNaming = model.isEcompGeneratedNaming;
}
};
@@ -54,26 +63,39 @@ export class formasync implements OnInit {
new SelectOption({id: 'true', name: 'Rollback'}),
new SelectOption({id: 'false', name: 'Don\'t Rollback'})
];
- tenants = [];
+ tenants: Tenant[] = [];
serviceInstance: any = {
+ cloudOwner: null,
rollback:'true'
};
- isUserProvidedNaming: boolean = false;
+ isEcompGeneratedNaming: boolean = true;
+ paramsInfo : any;
onLcpSelect(newValue: string) {
let value: LcpRegionsAndTenants = undefined;
this.lcpRegionsAndTenants.subscribe(data => value = data);
this.tenants = value.lcpRegionsTenantsMap[newValue];
+ this.serviceInstance.tenantId = undefined;
+ }
+
+
+
+ onTenantSelect(newValue: string) {
+ this.serviceInstance.cloudOwner = this._formAsyncService.onTenantSelect(this.tenants, newValue);
}
ngOnInit() {
this.store.dispatch(loadProductFamiliesAction());
- this.store.dispatch(loadLcpTenant());
+ this.store.dispatch(loadLcpTenant(this.paramsInfo['globalCustomerId'], this.paramsInfo['serviceType']));
this.store.dispatch(loadAicZones());
this.store.dispatch(loadCategoryParameters());
}
+
+ public formatCloudOwnerTrailer(cloudOwner: string):string {
+ return AaiService.formatCloudOwnerTrailer(cloudOwner);
+ }
}
diff --git a/vid-webpack-master/src/app/vlanTagging/form-async/form-async.service.spec.ts b/vid-webpack-master/src/app/vlanTagging/form-async/form-async.service.spec.ts
new file mode 100644
index 000000000..0f7d4444b
--- /dev/null
+++ b/vid-webpack-master/src/app/vlanTagging/form-async/form-async.service.spec.ts
@@ -0,0 +1,31 @@
+import {async, getTestBed, TestBed} from '@angular/core/testing';
+import {FormAsyncService} from "./form-async.service";
+
+describe('FormAsyncService', () => {
+
+ let injector;
+ let service: FormAsyncService;
+
+ beforeAll(done => (async () => {
+ TestBed.configureTestingModule({
+ providers: [FormAsyncService]
+ });
+ await TestBed.compileComponents();
+
+ injector = getTestBed();
+ service = injector.get(FormAsyncService);
+
+ })().then(done).catch(done.fail));
+
+ test('should add cloudOwner according to new tenant value', () => {
+ const tenants = [{'id': '1', 'name': 'firstTenant', 'isPermitted': true, cloudOwner: 'irma-aic'},
+ {'id': '2', 'name': 'secondTenant', 'isPermitted': true, cloudOwner: 'irma-aic2'}];
+ let cloudOwner: string;
+ cloudOwner = service.onTenantSelect(tenants,'1');
+ expect(cloudOwner).toEqual('irma-aic');
+
+ cloudOwner = service.onTenantSelect(tenants, '2');
+ expect(cloudOwner).toEqual('irma-aic2');
+ })
+
+});
diff --git a/vid-webpack-master/src/app/vlanTagging/form-async/form-async.service.ts b/vid-webpack-master/src/app/vlanTagging/form-async/form-async.service.ts
new file mode 100644
index 000000000..f5a33fe4d
--- /dev/null
+++ b/vid-webpack-master/src/app/vlanTagging/form-async/form-async.service.ts
@@ -0,0 +1,12 @@
+import {Injectable} from '@angular/core';
+import {Tenant} from "../../shared/models/tenant";
+
+@Injectable()
+export class FormAsyncService {
+ constructor(){}
+
+ public onTenantSelect(tenants: Tenant[], newValue: string) {
+ let tenantTemp: Tenant[] = tenants.filter(tenant => tenant.id == newValue);
+ return tenantTemp[0] && tenantTemp[0].cloudOwner;
+ }
+}
diff --git a/vid-webpack-master/src/app/components/form-async/form-async.style.scss b/vid-webpack-master/src/app/vlanTagging/form-async/form-async.style.scss
index e6c89bcae..e6c89bcae 100644
--- a/vid-webpack-master/src/app/components/form-async/form-async.style.scss
+++ b/vid-webpack-master/src/app/vlanTagging/form-async/form-async.style.scss
diff --git a/vid-webpack-master/src/app/components/form-async/form-async.template.html b/vid-webpack-master/src/app/vlanTagging/form-async/form-async.template.html
index c63a7bee6..ba35a42e9 100644
--- a/vid-webpack-master/src/app/components/form-async/form-async.template.html
+++ b/vid-webpack-master/src/app/vlanTagging/form-async/form-async.template.html
@@ -1,6 +1,6 @@
<div class="content">
<form #form="ngForm" name="networkNodeForm" class="form-wrapper">
- <div *ngIf="isUserProvidedNaming" class="details-item">
+ <div class="details-item">
<label class="placeholder">Instance name*</label>
<input [attr.data-tests-id]="'instanceName'" id="instance-name" [(ngModel)]="serviceInstance.instanceName" name="instance-name"
class="form-control input-text" placeholder="Type Instance Name" type="text" required>
@@ -20,12 +20,12 @@
<select (change)="onLcpSelect($event.target.value)" class="form-control input-text" [(ngModel)]="serviceInstance.lcpRegion"
name="lcpRegion" id="lcpRegion-select" data-tests-id="lcpRegion" required>
<option class="placeholder1" [value]="undefined" disabled>Select LCP Region</option>
- <option *ngFor="let lcpRegion of lcpRegions | async" [value]="lcpRegion.id" [disabled]="!lcpRegion.isPermitted" class="lcpRegionOption">{{lcpRegion.id}}</option>
+ <option *ngFor="let lcpRegion of lcpRegions | async" [value]="lcpRegion.id" [disabled]="!lcpRegion.isPermitted" class="lcpRegionOption">{{lcpRegion.id}}{{formatCloudOwnerTrailer(lcpRegion.cloudOwner)}}</option>
</select>
</div>
<div class="details-item">
<label>Tenant:*</label>
- <select class="form-control input-text" [(ngModel)]="serviceInstance.tenantId" name="tenant" id="tenant-select" data-tests-id="tenant"
+ <select (change)="onTenantSelect($event.target.value)" class="form-control input-text" [(ngModel)]="serviceInstance.tenantId" name="tenant" id="tenant-select" data-tests-id="tenant"
required>
<option class="placeholder1" [value]="undefined" disabled>Select Tenant</option>
<option *ngFor="let tenant of tenants" [value]="tenant.id" [disabled]="!tenant.isPermitted">{{tenant.name}}</option>
diff --git a/vid-webpack-master/src/app/vlanTagging/network-selector/network-selector.component.ts b/vid-webpack-master/src/app/vlanTagging/network-selector/network-selector.component.ts
index 46a176984..d3df9268d 100644
--- a/vid-webpack-master/src/app/vlanTagging/network-selector/network-selector.component.ts
+++ b/vid-webpack-master/src/app/vlanTagging/network-selector/network-selector.component.ts
@@ -1,8 +1,8 @@
import {Component, Input, OnInit, ViewChild} from "@angular/core";
import {NgRedux, select} from "@angular-redux/store";
-import {AppState} from "../../store/reducers";
+import {AppState} from "../../shared/store/reducers";
import {ModelInformationItem} from "../../shared/components/model-information/model-information.component";
-import {Observable} from "rxjs/Observable";
+import {Observable} from "rxjs";
import {NgForm} from "@angular/forms";
import * as _ from 'lodash';
diff --git a/vid-webpack-master/src/app/vlanTagging/vlan-tagging.component.html b/vid-webpack-master/src/app/vlanTagging/vlan-tagging.component.html
index f474f4bd1..5443a25f0 100644
--- a/vid-webpack-master/src/app/vlanTagging/vlan-tagging.component.html
+++ b/vid-webpack-master/src/app/vlanTagging/vlan-tagging.component.html
@@ -9,7 +9,7 @@
<span (serviceInstamce)="onServiceInstanceChange($event)"></span>
<div class="content-wrapper">
<div class="left-side">
- <formasync [hidden]="currentStep === wizardSteps.two" [model]="model" class="form"></formasync>
+ <formasync [hidden]="currentStep === wizardSteps.two" [params]="params" [model]="model" class="form"></formasync>
<app-network-selector [hidden]="currentStep === wizardSteps.one" class="form-wrapper" [groups]="groups"></app-network-selector>
</div>
diff --git a/vid-webpack-master/src/app/vlanTagging/vlan-tagging.component.ts b/vid-webpack-master/src/app/vlanTagging/vlan-tagging.component.ts
index f3f63e1e9..87f117202 100644
--- a/vid-webpack-master/src/app/vlanTagging/vlan-tagging.component.ts
+++ b/vid-webpack-master/src/app/vlanTagging/vlan-tagging.component.ts
@@ -1,19 +1,17 @@
-import {formasync} from './../components/form-async/form-async.component';
+import {Formasync} from './form-async/form-async.component';
import {Component, OnInit, ViewChild} from "@angular/core";
import {NetworkSelectorComponent} from "./network-selector/network-selector.component";
import {NgRedux, select} from "@angular-redux/store";
-import {AppState} from "../store/reducers";
+import {AppState} from "../shared/store/reducers";
import {ActivatedRoute} from "@angular/router";
-import {
- loadServiceAccordingToUuid, loadAaiNetworkAccordingToNetworkCF,
- loadUserId
-} from "../services/aaiService/aai.actions";
+import {loadServiceAccordingToUuid, loadAaiNetworkAccordingToNetworkCF, loadUserId} from "../shared/services/aaiService/aai.actions";
import {createRequest} from "../factories/mso.factory";
-import {Observable} from "rxjs/Observable";
import {VNFModel} from "../shared/models/vnfModel";
import {VfcInstanceGroupProperties} from "../shared/models/vfcInstanceGroupProperties";
-import * as _ from "lodash";
import {ModelInformationItem} from "../shared/components/model-information/model-information.component";
+import {Observable} from "rxjs";
+import {RootEpics} from "../shared/store/epics";
+import * as _ from "lodash";
enum WizardSteps {
one,
@@ -33,12 +31,15 @@ const buttonTextCancel = "Cancel";
export class VlanTaggingComponent implements OnInit {
constructor(private store: NgRedux<AppState>,
- private route: ActivatedRoute) {
+ private route: ActivatedRoute,
+ rootEpics: RootEpics) {
this.nextButtonText = buttonTextNext;
this.cancelButtonText = buttonTextCancel;
this.currentStep = WizardSteps.one;
+ rootEpics.createEpics();
}
+ subscriberId: string;
subscriberName: string;
serviceKey: string;
serviceType: string;
@@ -47,11 +48,11 @@ export class VlanTaggingComponent implements OnInit {
serviceModelId: string;
modelInfoItems: Array<ModelInformationItem>;
groups: Array<Array<ModelInformationItem>>;
+ params : any;
currentStep: WizardSteps;
nextButtonText: string;
cancelButtonText: string;
wizardSteps = WizardSteps;
- cloudOwner: string;
cloudRegionId: string;
serviceInstanceId : string;
model: VNFModel;
@@ -72,8 +73,8 @@ export class VlanTaggingComponent implements OnInit {
@ViewChild(NetworkSelectorComponent)
public networkSelectorComponent: NetworkSelectorComponent;
- @ViewChild(formasync)
- public formAsync: formasync;
+ @ViewChild(Formasync)
+ public formAsync: Formasync;
deploySubInterface() {
@@ -101,15 +102,15 @@ export class VlanTaggingComponent implements OnInit {
this.store.dispatch(loadUserId());
this.userIdObs.subscribe(res => this.userId = res);
this.route.queryParams.subscribe(params => {
+ this.params = params;
this.serviceModelId = params["serviceModelId"];
- this.subscriberName = params["subscriberName"];
+ this.subscriberId = params["globalCustomerId"];
this.serviceType = params["serviceType"];
this.serviceKey = params["serviceInstanceID"];
this.vnfKey = params["modelCustomizationName"];
this.serviceInstanceId = params["serviceInstanceID"];
this.serviceInstanceName = params["serviceInstanceName"];
this.modelCustomizationId = params["modelCustomizationId"];
- this.cloudOwner = params["globalCustomerId"];
this.store.dispatch(loadServiceAccordingToUuid(this.serviceModelId));
this.serviceHierarchyObserable.subscribe(data => {
this.serviceHirarchy = data;
@@ -143,7 +144,7 @@ export class VlanTaggingComponent implements OnInit {
this.groups.map(group => {
let networkName = _.find(group, (groupElements: ModelInformationItem) => groupElements.testsId === "networkCollectionFunction");
this.store.dispatch(
- loadAaiNetworkAccordingToNetworkCF(networkName["values"][0], this.cloudOwner, this.formAsync.serviceInstance.lcpRegion)
+ loadAaiNetworkAccordingToNetworkCF(networkName["values"][0], this.formAsync.serviceInstance.cloudOwner, this.formAsync.serviceInstance.lcpRegion)
);
});
this.currentStep = WizardSteps.two;
diff --git a/vid-webpack-master/src/app/vlanTagging/vlan-tagging.module.ts b/vid-webpack-master/src/app/vlanTagging/vlan-tagging.module.ts
index 3227542c6..c3848998e 100644
--- a/vid-webpack-master/src/app/vlanTagging/vlan-tagging.module.ts
+++ b/vid-webpack-master/src/app/vlanTagging/vlan-tagging.module.ts
@@ -1,5 +1,4 @@
-
-import { formasync } from './../components/form-async/form-async.component';
+import { Formasync } from './form-async/form-async.component';
import {NgModule,} from '@angular/core';
import { FormsModule } from '@angular/forms';
import { VlanTaggingComponent } from './vlan-tagging.component';
@@ -9,11 +8,9 @@ import { NgReduxModule } from '@angular-redux/store';
import { SharedModule } from '../shared/shared.module';
import { NetworkSelectorComponent } from './network-selector/network-selector.component';
import { TooltipModule } from 'ngx-tooltip';
-
-
+import {FormAsyncService} from "./form-async/form-async.service";
@NgModule({
-
imports: [
CommonModule,
NgReduxModule,
@@ -23,11 +20,10 @@ imports: [
SharedModule.forRoot()
],
- providers: [ ],
- declarations: [VlanTaggingComponent,formasync,NetworkSelectorComponent],
+ providers: [ FormAsyncService ],
+ declarations: [VlanTaggingComponent, Formasync, NetworkSelectorComponent],
entryComponents: [],
- exports: [formasync]
-
+ exports: [Formasync]
})
export class VlanTaggingModule { }
diff --git a/vid-webpack-master/src/app/vlanTagging/vlan-tagging.routing.ts b/vid-webpack-master/src/app/vlanTagging/vlan-tagging.routing.ts
new file mode 100644
index 000000000..d89c9beec
--- /dev/null
+++ b/vid-webpack-master/src/app/vlanTagging/vlan-tagging.routing.ts
@@ -0,0 +1,19 @@
+import {Route} from "@angular/router";
+import {FlagsResolve} from "../shared/resolvers/flag/flag.resolver";
+import {VlanTaggingComponent} from "./vlan-tagging.component";
+
+export const VlanTaggingRoutes: Route[] = [
+ {
+ path: 'vlan',
+ children: [
+ {
+ path: '',
+ component: VlanTaggingComponent,
+ resolve: {
+ flags: FlagsResolve
+ },
+ }
+ ]
+ }
+];
+