aboutsummaryrefslogtreecommitdiffstats
path: root/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/pnf
diff options
context:
space:
mode:
authorMateusz Gołuchowski <mateusz.goluchowski@nokia.com>2020-11-05 10:11:08 +0100
committerIkram Ikramullah <ikram@research.att.com>2020-11-12 14:21:25 +0000
commitd74f6cc4a47f4ebe94c6143f5ffb12b7f47c8fb6 (patch)
tree659d245c2d60edd94c19f06683916e0d37a9c79b /vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/pnf
parent182d036de5a7d64250fc5058f3cf361b9d823282 (diff)
Extend Modern UI for pnf usecase
Implemented functionalities to manage PNFs in modern UI: - Adding, removing, editing PNFs - PNF default generation based on 'min_instances' property - FE sends proper instantiation request to BE This is still impossible to deploy service with PNFs as VID's BE logic must be adjusted to generate proper request to SO as described in VID-695. Issue-ID: VID-694 Signed-off-by: Mateusz Goluchowski <mateusz.goluchowski@nokia.com> Change-Id: I5285ac2ab5e95665244ca29c6549249d9330b1ed
Diffstat (limited to 'vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/pnf')
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/pnf/pnf.model.info.extended.spec.ts597
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/pnf/pnf.model.info.extended.ts149
-rw-r--r--vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/pnf/pnf.model.info.spec.ts2
3 files changed, 729 insertions, 19 deletions
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/pnf/pnf.model.info.extended.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/pnf/pnf.model.info.extended.spec.ts
new file mode 100644
index 000000000..7e7a6fc1d
--- /dev/null
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/pnf/pnf.model.info.extended.spec.ts
@@ -0,0 +1,597 @@
+import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing";
+import {getTestBed, TestBed} from "@angular/core/testing";
+import {MockNgRedux, NgReduxTestingModule} from "@angular-redux/store/testing";
+import {PnfModelInfoExtended} from "./pnf.model.info.extended";
+import {DynamicInputsService} from "../../dynamicInputs.service";
+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 {DuplicateService} from "../../../duplicate/duplicate.service";
+import {IframeService} from "../../../../../shared/utils/iframe.service";
+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";
+import {PnfPopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/pnf/pnf.popup.service";
+import {DrawingBoardModes} from "../../../drawing-board.modes";
+import {ServiceInstanceActions} from "../../../../../shared/models/serviceInstanceActions";
+import {PNFModel} from "../../../../../shared/models/pnfModel";
+import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service";
+
+class MockFeatureFlagsService extends FeatureFlagsService {
+ getAllFlags(): { [p: string]: boolean } {
+ return {};
+ }
+}
+
+class NodeBuilder {
+ static getPnfNode() {
+ return this.getPnfNodeWithAction(ServiceInstanceActions.None);
+ }
+
+ static getPnfNodeWithAction(action: ServiceInstanceActions) {
+ return {
+ data: {
+ "action": action,
+ "pnfStoreKey": "PNF_KEY",
+ "children": null,
+ "name": "pnfName",
+ "modelUniqueId": "modelCustomizationId",
+ "menuActions": {
+ "delete": "",
+ "undoDelete": ""
+ }
+ },
+ children: null,
+ type: 'PNF'
+ };
+ }
+}
+
+describe('Pnf Model Info Extended', () => {
+ let injector;
+ let _dynamicInputsService: DynamicInputsService;
+ let _sharedTreeService: SharedTreeService;
+ let _dialogService: DialogService;
+ let _pnfPopupService: PnfPopupService;
+ let _duplicateService: DuplicateService;
+ let _iframeService: IframeService;
+ let _featureFlagsService: FeatureFlagsService;
+ let _store: NgRedux<AppState>;
+ let pnfModelExtended: PnfModelInfoExtended;
+
+ beforeEach(() => {
+ TestBed.configureTestingModule({
+ imports: [HttpClientTestingModule, NgReduxTestingModule],
+ providers: [
+ MockNgRedux,
+ DynamicInputsService,
+ DialogService,
+ PnfPopupService,
+ DefaultDataGeneratorService,
+ SharedTreeService,
+ DuplicateService,
+ AaiService,
+ HttpClient,
+ HttpHandler,
+ {provide: FeatureFlagsService, useClass: MockFeatureFlagsService},
+ ComponentInfoService,
+ IframeService]
+ }).compileComponents();
+
+ injector = getTestBed();
+ _sharedTreeService = injector.get(SharedTreeService);
+ _store = injector.get(NgRedux);
+ _featureFlagsService = injector.get(FeatureFlagsService);
+
+ pnfModelExtended = new PnfModelInfoExtended(
+ _store,
+ _sharedTreeService,
+ _dialogService,
+ _pnfPopupService,
+ _iframeService,
+ _duplicateService,
+ null,
+ _dynamicInputsService);
+ });
+
+ test('pnfModelExtended should be defined', () => {
+ expect(pnfModelExtended).toBeDefined();
+ });
+
+ test('getMenuAction: edit should not be visible when mode is null and actions is "None"', () => {
+ jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+ global: {}
+ });
+
+ let node = NodeBuilder.getPnfNodeWithAction(ServiceInstanceActions.None);
+ let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
+ let menuActions = pnfModelExtended.getMenuAction(<any>node, serviceModelId);
+
+ expect(menuActions['edit']).toBeDefined();
+ expect(menuActions['edit'].visible(node)).toBeFalsy();
+ expect(menuActions['edit'].enable(node)).toBeFalsy();
+ });
+
+ test('getMenuAction: edit should be visible when mode is null and action is "Create"', () => {
+ jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+ global: {}
+ });
+
+ let node = NodeBuilder.getPnfNodeWithAction(ServiceInstanceActions.Create);
+ let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
+ let menuActions = pnfModelExtended.getMenuAction(<any>node, serviceModelId);
+
+ expect(menuActions['edit']).toBeDefined();
+ expect(menuActions['edit'].visible(node)).toBeTruthy();
+ expect(menuActions['edit'].enable(node)).toBeTruthy();
+ });
+
+ test('getMenuAction: edit should be visible when mode is "RETRY" and action is "Create"', () => {
+ jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+ global: {
+ drawingBoardStatus: DrawingBoardModes.RETRY
+ }
+ });
+
+ let node = NodeBuilder.getPnfNodeWithAction(ServiceInstanceActions.Create);
+ let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
+ let menuActions = pnfModelExtended.getMenuAction(<any>node, serviceModelId);
+
+ expect(menuActions['edit']).toBeDefined();
+ expect(menuActions['edit'].visible(node)).toBeFalsy();
+ expect(menuActions['edit'].enable(node)).toBeFalsy();
+ });
+
+ test('getMenuAction: showAuditInfo should be visible when mode is "RETRY"', () => {
+ jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+ global: {
+ drawingBoardStatus: DrawingBoardModes.RETRY
+ }
+ });
+
+ let node = NodeBuilder.getPnfNodeWithAction(ServiceInstanceActions.Create);
+ let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
+ let menuActions = pnfModelExtended.getMenuAction(<any>node, serviceModelId);
+
+ expect(menuActions['showAuditInfo']).toBeDefined();
+ expect(menuActions['showAuditInfo'].visible(node)).toBeTruthy();
+ expect(menuActions['showAuditInfo'].enable(node)).toBeTruthy();
+ });
+
+ test('getMenuAction: showAuditInfo should not be visible when mode is not "RETRY" and action is "CREATE"', () => {
+ jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+ global: {
+ drawingBoardStatus: DrawingBoardModes.EDIT
+ }
+ });
+
+ let node = NodeBuilder.getPnfNodeWithAction(ServiceInstanceActions.Create);
+ let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
+ let menuActions = pnfModelExtended.getMenuAction(<any>node, serviceModelId);
+
+ expect(menuActions['showAuditInfo']).toBeDefined();
+ expect(menuActions['showAuditInfo'].visible(node)).toBeFalsy();
+ expect(menuActions['showAuditInfo'].enable(node)).toBeFalsy();
+ });
+
+ test('getMenuAction: remove should dispatch 2 actions with proper data', () => {
+ let node = NodeBuilder.getPnfNodeWithAction(ServiceInstanceActions.None);
+ let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
+ let menuActions = pnfModelExtended.getMenuAction(<any>node, serviceModelId);
+
+ spyOn(_store, 'dispatch');
+ menuActions['remove'].method(node, serviceModelId);
+
+ expect(_store.dispatch).toHaveBeenCalledWith(jasmine.objectContaining({
+ type: "REMOVE_INSTANCE",
+ storeKey: "PNF_KEY"
+ }));
+ expect(_store.dispatch).toHaveBeenCalledWith(jasmine.objectContaining({
+ type: "CHANGE_INSTANCE_COUNTER",
+ changeBy: -1
+ }));
+ });
+
+ test('getMenuAction: remove should not dispatch actions when node has children', () => {
+ let node = NodeBuilder.getPnfNodeWithAction(ServiceInstanceActions.None);
+ let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
+ let menuActions = pnfModelExtended.getMenuAction(<any>node, serviceModelId);
+ node.data.children = [
+ {"not": "empty"}
+ ];
+
+ spyOn(_store, 'dispatch');
+ menuActions['remove'].method(node, serviceModelId);
+
+ expect(_store.dispatch).not.toHaveBeenCalledWith(jasmine.objectContaining({
+ type: "REMOVE_INSTANCE",
+ storeKey: "PNF_KEY"
+ }));
+ expect(_store.dispatch).not.toHaveBeenCalledWith(jasmine.objectContaining({
+ type: "CHANGE_INSTANCE_COUNTER",
+ changeBy: -1
+ }));
+ });
+
+ test('getMenuAction: delete should dispatch delete action', () => {
+ let node = NodeBuilder.getPnfNodeWithAction(ServiceInstanceActions.None);
+ let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
+ let menuActions = pnfModelExtended.getMenuAction(<any>node, serviceModelId);
+
+ spyOn(_store, 'dispatch');
+ menuActions['delete'].method(node, serviceModelId);
+
+ expect(_store.dispatch).toHaveBeenCalledWith(jasmine.objectContaining({
+ type: "DELETE_PNF_INSTANCE",
+ storeKey: "PNF_KEY"
+ }));
+ });
+
+ test('getMenuAction: delete should show modal when node has children', () => {
+ let node = NodeBuilder.getPnfNodeWithAction(ServiceInstanceActions.None);
+ let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
+ let menuActions = pnfModelExtended.getMenuAction(<any>node, serviceModelId);
+ node.data.children = [
+ {"not": "empty"}
+ ];
+
+ spyOn(_sharedTreeService, 'shouldShowDeleteInstanceWithChildrenModal');
+ menuActions['delete'].method(node, serviceModelId);
+
+ expect(_sharedTreeService.shouldShowDeleteInstanceWithChildrenModal).toHaveBeenCalledWith(jasmine.objectContaining({
+ type: "PNF"
+ }), jasmine.anything(), jasmine.anything());
+ });
+
+ test('getMenuAction: delete should not be visible when service isMacro', () => {
+ jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+ global: {
+ drawingBoardStatus: DrawingBoardModes.EDIT
+ },
+ service: {
+ serviceInstance: {
+ "d6557200-ecf2-4641-8094-5393ae3aae60": {
+ isALaCarte: false
+ }
+ }
+ }
+ });
+
+ let node = NodeBuilder.getPnfNodeWithAction(ServiceInstanceActions.None);
+ let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
+ let menuActions = pnfModelExtended.getMenuAction(<any>node, serviceModelId);
+
+ expect(menuActions['delete']).toBeDefined();
+ expect(menuActions['delete'].visible(node)).toBeFalsy();
+ expect(menuActions['delete'].enable(node)).toBeFalsy();
+ });
+
+ test('getMenuAction: delete should not be visible when service is aLaCarte and Action is Create', () => {
+ jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+ global: {
+ drawingBoardStatus: DrawingBoardModes.EDIT
+ },
+ service: {
+ serviceInstance: {
+ "d6557200-ecf2-4641-8094-5393ae3aae60": {
+ isALaCarte: true
+ }
+ }
+ }
+ });
+
+ let node = NodeBuilder.getPnfNodeWithAction(ServiceInstanceActions.Create);
+ let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
+ let menuActions = pnfModelExtended.getMenuAction(<any>node, serviceModelId);
+
+ expect(menuActions['delete']).toBeDefined();
+ expect(menuActions['delete'].visible(node)).toBeFalsy();
+ expect(menuActions['delete'].enable(node)).toBeFalsy();
+ });
+
+ test('getMenuAction: delete should be visible when service is aLaCarte and Action is None', () => {
+ jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+ global: {
+ drawingBoardStatus: DrawingBoardModes.EDIT
+ },
+ service: {
+ serviceInstance: {
+ "d6557200-ecf2-4641-8094-5393ae3aae60": {
+ isALaCarte: true
+ }
+ }
+ }
+ });
+
+ let node = NodeBuilder.getPnfNodeWithAction(ServiceInstanceActions.None);
+ let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
+ let menuActions = pnfModelExtended.getMenuAction(<any>node, serviceModelId);
+
+ expect(menuActions['delete']).toBeDefined();
+ expect(menuActions['delete'].visible(node)).toBeTruthy();
+ expect(menuActions['delete'].enable(node)).toBeTruthy();
+ });
+
+ test('getMenuAction: undo delete should dispatch undo delete action when no children', () => {
+ let node = NodeBuilder.getPnfNodeWithAction(ServiceInstanceActions.None);
+ let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
+ let menuActions = pnfModelExtended.getMenuAction(<any>node, serviceModelId);
+
+ spyOn(_store, 'dispatch');
+ menuActions['undoDelete'].method(node, serviceModelId);
+
+ expect(_store.dispatch).toHaveBeenCalledWith(jasmine.objectContaining({
+ type: "UNDO_DELETE_PNF_INSTANCE",
+ storeKey: "PNF_KEY"
+ }));
+ });
+
+ test('getMenuAction: undo delete should iterate over children when they exist', () => {
+ let node = NodeBuilder.getPnfNodeWithAction(ServiceInstanceActions.None);
+ node.data.children = [
+ {"not": "empty"}
+ ];
+ node.children = node.data.children;
+ let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
+ let menuActions = pnfModelExtended.getMenuAction(<any>node, serviceModelId);
+
+ spyOn(_store, 'dispatch');
+ menuActions['undoDelete'].method(node, serviceModelId);
+
+ expect(_store.dispatch).toHaveBeenCalledWith(jasmine.objectContaining({
+ type: "UNDO_DELETE_PNF_INSTANCE",
+ storeKey: "PNF_KEY"
+ }));
+ });
+
+ test('getMenuAction: undo delete should not be visible when action is Create or Delete', () => {
+ jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+ global: {
+ drawingBoardStatus: DrawingBoardModes.EDIT
+ },
+ service: {
+ serviceInstance: {
+ "d6557200-ecf2-4641-8094-5393ae3aae60": {}
+ }
+ }
+ });
+
+ let node = NodeBuilder.getPnfNodeWithAction(ServiceInstanceActions.Create);
+ let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
+ let menuActions = pnfModelExtended.getMenuAction(<any>node, serviceModelId);
+
+ expect(menuActions['undoDelete']).toBeDefined();
+ expect(menuActions['undoDelete'].visible(node)).toBeFalsy();
+ expect(menuActions['undoDelete'].enable(node)).toBeFalsy();
+ });
+
+ test('getMenuAction: undo delete should be visible when action is contains "*_Delete"', () => {
+ jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+ global: {
+ drawingBoardStatus: DrawingBoardModes.EDIT
+ },
+ service: {
+ serviceInstance: {
+ "d6557200-ecf2-4641-8094-5393ae3aae60": {
+ action: ServiceInstanceActions.None
+ }
+ }
+ }
+ });
+
+ let node = NodeBuilder.getPnfNodeWithAction(ServiceInstanceActions.None_Delete);
+ let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
+ let menuActions = pnfModelExtended.getMenuAction(<any>node, serviceModelId);
+
+ expect(menuActions['undoDelete']).toBeDefined();
+ expect(menuActions['undoDelete'].visible(node)).toBeTruthy();
+ expect(menuActions['undoDelete'].enable(node, serviceModelId)).toBeTruthy();
+ });
+
+ test('getModel should return PNF model', () => {
+ expect(pnfModelExtended.getModel({})).toBeInstanceOf(PNFModel);
+ });
+
+ test('getNextLevelObject should return null as there are no childs expected in PNF for now', () => {
+ expect(pnfModelExtended.getNextLevelObject()).toBeNull();
+ });
+
+ test('getNodeCount should return counter of 0 when existingPNFCounterMap doesnt exist', () => {
+ jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+ global: {},
+ service: {
+ serviceInstance: {
+ 'd6557200-ecf2-4641-8094-5393ae3aae60': {}
+ }
+ }
+ });
+
+ let serviceId: string = 'd6557200-ecf2-4641-8094-5393ae3aae60';
+ let node = NodeBuilder.getPnfNode();
+ let result = pnfModelExtended.getNodeCount(<any>node, serviceId);
+ jest.spyOn(_sharedTreeService, 'getExistingInstancesWithDeleteMode').mockReturnValue(0);
+
+ expect(result).toEqual(0);
+ });
+
+ test('getNodeCount should return counter of 1 when one node exists and no nodes in delete mode', () => {
+ jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+ global: {},
+ service: {
+ serviceInstance: {
+ 'd6557200-ecf2-4641-8094-5393ae3aae60': {
+ 'existingPNFCounterMap': {
+ 'modelCustomizationId': 1
+ }
+ }
+ }
+ }
+ });
+
+ let serviceId: string = 'd6557200-ecf2-4641-8094-5393ae3aae60';
+ let node = NodeBuilder.getPnfNode();
+ let result = pnfModelExtended.getNodeCount(<any>node, serviceId);
+ jest.spyOn(_sharedTreeService, 'getExistingInstancesWithDeleteMode').mockReturnValue(0);
+
+ expect(result).toEqual(1);
+ });
+
+ test('getNodeCount should return counter of 2 when three nodes exist and one node is in delete mode', () => {
+ jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+ global: {},
+ service: {
+ serviceInstance: {
+ 'd6557200-ecf2-4641-8094-5393ae3aae60': {
+ 'existingPNFCounterMap': {
+ 'modelCustomizationId': 3
+ }
+ }
+ }
+ }
+ });
+
+ jest.spyOn(_sharedTreeService, 'getExistingInstancesWithDeleteMode').mockReturnValue(1);
+ let serviceId: string = 'd6557200-ecf2-4641-8094-5393ae3aae60';
+ let node = NodeBuilder.getPnfNode();
+ let result = pnfModelExtended.getNodeCount(<any>node, serviceId);
+
+ expect(result).toEqual(2);
+ });
+
+ test('getTooltip should return "PNF"', () => {
+ expect(pnfModelExtended.getTooltip()).toEqual('PNF');
+ });
+
+ test('getType should return "PNF"', () => {
+ expect(pnfModelExtended.getType()).toEqual('PNF');
+ });
+
+ test('isEcompGeneratedNaming should return true if isEcompGeneratedNaming is "true" ', () => {
+ let isEcompGeneratedNaming: boolean = pnfModelExtended.isEcompGeneratedNaming(<any>{
+ properties: {
+ ecomp_generated_naming: 'true'
+ }
+ });
+ expect(isEcompGeneratedNaming).toBeTruthy();
+ });
+
+ test('isEcompGeneratedNaming should return false if isEcompGeneratedNaming is not defined', () => {
+ let isEcompGeneratedNaming: boolean = pnfModelExtended.isEcompGeneratedNaming({
+ properties: {}
+ });
+ expect(isEcompGeneratedNaming).toBeFalsy();
+ });
+
+ test('showNodeIcons should return false if reached limit of instances', () => {
+ let serviceId: string = 'servicedId';
+ let node = NodeBuilder.getPnfNode();
+ jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+ global: {},
+ service: {
+ serviceHierarchy: {
+ 'servicedId': {
+ 'pnfs': {
+ modelCustomizationId: "modelCustomizationId",
+ 'modelInfo': {
+ modelCustomizationId: "modelCustomizationId"
+ },
+ 'pnfName': {
+ 'properties': {
+ 'max_instances': 1
+ }
+ }
+ }
+ }
+ },
+ serviceInstance: {
+ 'servicedId': {
+ 'existingPNFCounterMap': {
+ 'modelCustomizationId': 1
+ },
+ 'pnfs': {
+ 'pnfName': {}
+ }
+ }
+ }
+ }
+ });
+
+ let result = pnfModelExtended.showNodeIcons(<any>node, serviceId);
+ expect(result).toEqual(new AvailableNodeIcons(false, true));
+ });
+
+ test('showNodeIcons should return true if limit of instances is not reached', () => {
+ let serviceId: string = 'servicedId';
+ let node = NodeBuilder.getPnfNode();
+ jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+ global: {
+ drawingBoardStatus: DrawingBoardModes.EDIT
+ },
+ service: {
+ serviceHierarchy: {
+ 'servicedId': {
+ 'pnfs': {
+ modelCustomizationId: "modelCustomizationId",
+ 'modelInfo': {
+ modelCustomizationId: "modelCustomizationId"
+ },
+ 'pnfName': {
+ 'properties': {
+ 'max_instances': 2
+ }
+ }
+ }
+ }
+ },
+ serviceInstance: {
+ 'servicedId': {
+ 'existingPNFCounterMap': {
+ 'modelCustomizationId': 1
+ },
+ 'pnfs': {
+ 'pnfName': {}
+ }
+ }
+ }
+ }
+ });
+
+ let result = pnfModelExtended.showNodeIcons(<any>node, serviceId);
+ expect(result).toEqual(new AvailableNodeIcons(true, false));
+ });
+
+ test('hasMissingData returns true instanceName is empty and ecompNameGenerating is off ', () => {
+ let instance = {
+ instanceName: "",
+ platformName: "platformName"
+ }
+
+ let result = pnfModelExtended.hasMissingData(instance, [], false);
+
+ expect(result).toBeTruthy();
+ });
+
+ test('hasMissingData returns true when at least one required field is empty ', () => {
+ let instance = {
+ platformName: ""
+ }
+
+ let result = pnfModelExtended.hasMissingData(instance, [], true);
+
+ expect(result).toBeTruthy();
+ });
+
+ test('hasMissingData returns false when there is no missing data', () => {
+ let instance = {
+ platformName: "platformName"
+ }
+
+ let result = pnfModelExtended.hasMissingData(instance, [], true);
+
+ expect(result).toBeFalsy();
+ });
+
+});
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/pnf/pnf.model.info.extended.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/pnf/pnf.model.info.extended.ts
index e2e31e904..3c3f09b5d 100644
--- a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/pnf/pnf.model.info.extended.ts
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/pnf/pnf.model.info.extended.ts
@@ -3,7 +3,6 @@ import {ComponentInfoType} from "../../../component-info/component-info-model";
import {ModelInformationItem} from "../../../../../shared/components/model-information/model-information.component";
import {ITreeNode} from "angular-tree-component/dist/defs/api";
import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service";
-
import {PNFModel} from "../../../../../shared/models/pnfModel";
import {SharedTreeService} from "../../shared.tree.service";
import * as _ from "lodash";
@@ -17,19 +16,35 @@ import {
import {DialogService} from "ng2-bootstrap-modal";
import {PnfPopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/pnf/pnf.popup.service";
import {PnfTreeNode} from "../../../../../shared/models/pnfTreeNode";
+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 {IframeService} from "../../../../../shared/utils/iframe.service";
+import {DuplicateService} from "../../../duplicate/duplicate.service";
+import {ModalService} from "../../../../../shared/components/customModal/services/modal.service";
+import {
+ deleteActionPnfInstance,
+ undoDeleteActionPnfInstance,
+ updatePnfPosition
+} from "../../../../../shared/storeUtil/utils/pnf/pnf.actions";
+import {DynamicInputsService} from "../../dynamicInputs.service";
+import {InputType} from "../../../../../shared/models/inputTypes";
-
-export class PnfModelInfoExtended implements ILevelNodeInfo{
+export class PnfModelInfoExtended implements ILevelNodeInfo {
constructor(
private _store: NgRedux<AppState>,
private _sharedTreeService: SharedTreeService,
private _dialogService: DialogService,
- private _pnfPopupService: PnfPopupService
- ){}
+ private _pnfPopupService: PnfPopupService,
+ private _iframeService: IframeService,
+ private _duplicateService: DuplicateService,
+ private modalService: ModalService,
+ private _dynamicInputsService: DynamicInputsService
+ ) {}
name: string = 'pnfs';
- type: string ='PNF';
+ type: string = 'PNF';
typeName: string = 'PNF';
childNames: string[];
componentInfoType = ComponentInfoType.PNF;
@@ -60,15 +75,109 @@ export class PnfModelInfoExtended implements ILevelNodeInfo{
return _.uniq(_.flatten(result));
}
- getMenuAction(node: ITreeNode, serviceModelId: string): { [methodName: string]: { method: Function; visible: Function; enable: Function } } {
- return {};
+ 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.PNF,
+ uuidData: <any>{
+ serviceId: serviceModelId,
+ modelName: node.data.modelName,
+ pnfStoreKey: node.data.pnfStoreKey,
+ modelId: node.data.modelId,
+ type: node.data.type,
+ popupService: this._pnfPopupService
+ },
+ 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].pnfs[node.data.pnfStoreKey];
+ this._sharedTreeService.openAuditInfoModal(node, serviceModelId, instance, 'PNF', this);
+ },
+ visible: (node) => this._sharedTreeService.shouldShowAuditInfo(node),
+ enable: (node) => this._sharedTreeService.shouldShowAuditInfo(node)
+ },
+ remove: {
+ method: (node, serviceModelId) => {
+ if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) {
+ let storeKey: string = node.data.pnfStoreKey;
+ this._store.dispatch(removeInstance(node.data.pnfStoreKey, serviceModelId, storeKey, node));
+ this._store.dispatch(changeInstanceCounter(node.data.modelUniqueId, serviceModelId, -1, node));
+ this._sharedTreeService.selectedNF = null;
+ } else {
+ let messageBoxData: MessageBoxData = new MessageBoxData(
+ "Remove PNF", // modal title
+ "You are about to remove this PNF from this service. Are you sure you want to remove it?",
+ <any>"warning",
+ <any>"md",
+ [
+ {
+ text: "Remove PNF",
+ size: "large",
+ callback: this.removePnf.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(deleteActionPnfInstance(node.data.pnfStoreKey, serviceModelId));
+ } else {
+ this._sharedTreeService.shouldShowDeleteInstanceWithChildrenModal(node, serviceModelId, (node, serviceModelId) => {
+ this._sharedTreeService.removeDeleteAllChild(node, serviceModelId, (node, serviceModelId) => {
+ this._store.dispatch(deleteActionPnfInstance(node.data.pnfStoreKey, serviceModelId));
+ });
+ });
+ }
+ },
+ visible: (node) => this._sharedTreeService.shouldShowDelete(node, serviceModelId),
+ enable: (node) => this._sharedTreeService.shouldShowDelete(node, serviceModelId)
+ },
+ undoDelete: {
+ method: (node, serviceModelId) => {
+ if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) {
+ this._store.dispatch(undoDeleteActionPnfInstance(node.data.pnfStoreKey, serviceModelId));
+ } else {
+ this._sharedTreeService.undoDeleteAllChild(node, serviceModelId, (node, serviceModelId) => {
+ this._store.dispatch(undoDeleteActionPnfInstance(node.data.pnfStoreKey, serviceModelId));
+ });
+ }
+ },
+ visible: (node) => this._sharedTreeService.shouldShowUndoDelete(node),
+ enable: (node, serviceModelId) => this._sharedTreeService.shouldShowUndoDelete(node) && !this._sharedTreeService.isServiceOnDeleteMode(serviceModelId)
+ }
+ }
+ }
+
+ removePnf(this, node, serviceModelId) {
+ this._store.dispatch(removeInstance(node.data.modelName, serviceModelId, node.data.pnfStoreKey, node));
+ this._store.dispatch(changeInstanceCounter(node.data.modelUniqueId, serviceModelId, -1, node));
+ this._sharedTreeService.selectedNF = null;
}
getModel = (instanceModel: any): PNFModel => {
return new PNFModel(instanceModel);
};
- getNextLevelObject(): any { return null; }
+ getNextLevelObject(): any {
+ return null;
+ }
getNodeCount(node: ITreeNode, serviceModelId: string): number {
let map = null;
@@ -90,17 +199,20 @@ export class PnfModelInfoExtended implements ILevelNodeInfo{
getTooltip = (): string => 'PNF';
-
getType = (): string => 'PNF';
-
hasMissingData(instance, dynamicInputs: any, isEcompGeneratedNaming: boolean): boolean {
- return false;
+ return this._sharedTreeService.hasMissingData(instance, dynamicInputs, isEcompGeneratedNaming, [InputType.PLATFORM]);
}
- isEcompGeneratedNaming(currentModel): boolean {
- return false;
- }
+ /***********************************************************
+ * 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";
+ };
onClickAdd(node, serviceModelId: string): void {
this._dialogService.addDialog(GenericFormPopupComponent, {
@@ -130,9 +242,12 @@ export class PnfModelInfoExtended implements ILevelNodeInfo{
return new AvailableNodeIcons(showAddIcon, isReachedLimit)
}
- updateDynamicInputsDataFromModel = (currentModel): any => [];
+ updateDynamicInputsDataFromModel = (currentModel): any => {
+ let displayInputs = _.isNil(currentModel) ? [] : currentModel.inputs;
+ return _.isEmpty(displayInputs) ? [] : this._dynamicInputsService.getArbitraryInputs(displayInputs);
+ };
updatePosition(that, node, instanceId): void {
+ that.store.dispatch(updatePnfPosition(node, instanceId, node.vnfStoreKey));
}
-
}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/pnf/pnf.model.info.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/pnf/pnf.model.info.spec.ts
index 8675d36f2..150069db4 100644
--- a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/pnf/pnf.model.info.spec.ts
+++ b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/pnf/pnf.model.info.spec.ts
@@ -12,9 +12,7 @@ import {IframeService} from "../../../../../shared/utils/iframe.service";
import {HttpClientTestingModule} from "@angular/common/http/testing";
import {MockNgRedux, NgReduxTestingModule} from "@angular-redux/store/testing";
import {HttpClient, HttpHandler} from "@angular/common/http";
-import {CollectionResourceModel} from "../../../../../shared/models/collectionResourceModel";
import {ComponentInfoType} from "../../../component-info/component-info-model";
-import {VNFModel} from "../../../../../shared/models/vnfModel";
import {PNFModel} from "../../../../../shared/models/pnfModel";