Merge from ecomp 718fd196 - Modern UI
[vid.git] / vid-webpack-master / src / app / drawingBoard / service-planning / objectsToTree / models / vnf / vnf.model.info.ts
1 import {DynamicInputsService} from "../../dynamicInputs.service";
2 import {ILevelNodeInfo} from "../basic.model.info";
3 import {VFModuleModelInfo} from "../vfModule/vfModule.model.info";
4 import {VNFModel} from "../../../../../shared/models/vnfModel";
5 import {VnfInstance} from "../../../../../shared/models/vnfInstance";
6 import {VnfTreeNode} from "../../../../../shared/models/vnfTreeNode";
7 import {InputType} from "../../../../../shared/models/inputTypes";
8 import {SharedTreeService} from "../../shared.tree.service";
9 import {NgRedux} from "@angular-redux/store";
10 import {AppState} from "../../../../../shared/store/reducers";
11 import {DefaultDataGeneratorService} from "../../../../../shared/services/defaultDataServiceGenerator/default.data.generator.service";
12 import {
13   GenericFormPopupComponent,
14   PopupType
15 } from "../../../../../shared/components/genericFormPopup/generic-form-popup.component";
16 import {DialogService} from 'ng2-bootstrap-modal';
17 import {VnfPopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service";
18 import {VfModulePopuopService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service";
19 import {ITreeNode} from "angular-tree-component/dist/defs/api";
20 import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service";
21 import {DuplicateService} from "../../../duplicate/duplicate.service";
22 import {DuplicateVnfComponent} from "../../../duplicate/duplicate-vnf.component";
23 import {SdcUiServices} from "onap-ui-angular";
24 import {IframeService} from "../../../../../shared/utils/iframe.service";
25 import {changeInstanceCounter, removeInstance} from "../../../../../shared/storeUtil/utils/general/general.actions";
26 import {MessageBoxData} from "../../../../../shared/components/messageBox/messageBox.data";
27 import {MessageBoxService} from "../../../../../shared/components/messageBox/messageBox.service";
28 import {ServiceInstanceActions} from "../../../../../shared/models/serviceInstanceActions";
29 import {
30   deleteActionVnfInstance,
31   undoDeleteActionVnfInstance,
32   updateVnfPosition
33 } from "../../../../../shared/storeUtil/utils/vnf/vnf.actions";
34 import * as _ from 'lodash';
35 import {IModalConfig} from "onap-ui-angular/dist/modals/models/modal-config";
36 import {ComponentInfoType} from "../../../component-info/component-info-model";
37 import {ComponentInfoService} from "../../../component-info/component-info.service";
38 import {ModelInformationItem} from "../../../../../shared/components/model-information/model-information.component";
39
40 export class VnfModelInfo implements ILevelNodeInfo {
41   constructor(private _dynamicInputsService: DynamicInputsService,
42               private _sharedTreeService: SharedTreeService,
43               private _defaultDataGeneratorService: DefaultDataGeneratorService,
44               private _dialogService: DialogService,
45               private _vnfPopupService: VnfPopupService,
46               private _vfModulePopupService: VfModulePopuopService,
47               private _duplicateService: DuplicateService,
48               private modalService: SdcUiServices.ModalService,
49               private _iframeService: IframeService,
50               private _componentInfoService: ComponentInfoService,
51               private _store: NgRedux<AppState>) {
52   }
53
54   name: string = 'vnfs';
55   type: string = 'VNF';
56   childNames: string[] = ['vfModules'];
57   typeName: string = 'VNF';
58   componentInfoType = ComponentInfoType.VNF;
59
60   /***********************************************************
61    * return if user should provide instance name or not.
62    * @param currentModel - current Model object
63    ************************************************************/
64   isEcompGeneratedNaming = (currentModel): boolean => {
65     const ecompGeneratedNaming = currentModel.properties.ecomp_generated_naming;
66     return ecompGeneratedNaming === "true";
67   };
68
69   /***********************************************************
70    * return model dynamic inputs
71    * @param currentModel - current Model object
72    ************************************************************/
73   updateDynamicInputsDataFromModel = (currentModel): any => {
74     let displayInputs;
75     return _.isEmpty(displayInputs) ? [] : this._dynamicInputsService.getArbitraryInputs(displayInputs);
76   };
77
78   /***********************************************************
79    * return vnf model
80    * @param vnfModelId - current Model id
81    * @param instance - vnf instance
82    * @param serviceHierarchy - serviceHierarchy
83    ************************************************************/
84   getModel = (vnfModelId: string, instance: VnfInstance, serviceHierarchy): VNFModel => {
85     const originalModelName = instance.originalName ? instance.originalName : vnfModelId;
86     return new VNFModel(serviceHierarchy[this.name][originalModelName]);
87   };
88
89
90   /***********************************************************
91    * return vnf instance tree node
92    * @param instance - vnf instance
93    * @param model - vnf model
94    * @param parentModel
95    * @param storeKey - store key if exist
96    ************************************************************/
97   createInstanceTreeNode = (instance: VnfInstance, model: VNFModel, parentModel, storeKey: string): VnfTreeNode => {
98     let node = new VnfTreeNode(instance, model, storeKey);
99     node.missingData = this.hasMissingData(instance, node, model.isEcompGeneratedNaming);
100     node.typeName = this.typeName;
101     node.menuActions = this.getMenuAction(<any>node, model.uuid);
102     node.isFailed = _.isNil(instance.isFailed) ? false : instance.isFailed;
103     node.statusMessage = !_.isNil(instance.statusMessage) ? instance.statusMessage: "";
104     node = this._sharedTreeService.addingStatusProperty(node);
105     return node;
106   };
107
108   /***********************************************************
109    * return next level object (VFModule)
110    ************************************************************/
111   getNextLevelObject = (): VFModuleModelInfo => {
112     return new VFModuleModelInfo(this._dynamicInputsService, this._sharedTreeService, this._dialogService, this._vfModulePopupService, this._iframeService, this._store, this._componentInfoService);
113   };
114
115   /***********************************************************
116    * return if instance has missing data
117    * @param instance - vnf instance
118    * @param dynamicInputs
119    * @param isEcompGeneratedNaming
120    ************************************************************/
121   hasMissingData(instance, dynamicInputs: any, isEcompGeneratedNaming: boolean): boolean {
122     return this._sharedTreeService.hasMissingData(instance, dynamicInputs, isEcompGeneratedNaming, [InputType.LCP_REGION, InputType.TENANT, InputType.PLATFORM]);
123   }
124
125   getTooltip = (): string => 'VF';
126
127   getType = (): string => 'VF';
128
129   /***********************************************************
130    * return if instance has missing data
131    * @param node - VNF node
132    * @param serviceModelId - current service id
133    ************************************************************/
134   onClickAdd(node, serviceModelId: string): void {
135     this._dialogService.addDialog(GenericFormPopupComponent, {
136       type: PopupType.VNF,
137       uuidData: <any>{
138         serviceId: serviceModelId,
139         modelName: node.data.name,
140         vnfStoreKey: null,
141         modelId: node.data.modelVersionId,
142         type: node.data.type,
143         popupService: this._vnfPopupService
144       },
145       node: node,
146       isUpdateMode: false
147     })
148   }
149
150   /***********************************************************
151    * return number of existing instances
152    * @param node - VNF node
153    * @param serviceModelId - current service id
154    ************************************************************/
155   getNodeCount(node: ITreeNode, serviceModelId: string): number {
156     let map = null;
157     if (!_.isNil(this._store.getState().service.serviceInstance[serviceModelId])) {
158       map = this._store.getState().service.serviceInstance[serviceModelId].existingVNFCounterMap || 0;
159
160       if (!_.isNil(map)) {
161         let count = map[node.data.modelUniqueId] || 0;
162         count -= this._sharedTreeService.getExistingInstancesWithDeleteMode(node, serviceModelId, 'vnfs');
163         return count;
164       }
165     }
166     return 0;
167   }
168
169   /***********************************************************
170    * should show node icon
171    * @param node - current ITrees node
172    * @param serviceModelId - service id
173    ************************************************************/
174   showNodeIcons(node: ITreeNode, serviceModelId: string): AvailableNodeIcons {
175     let counter: number = !_.isNil(this._store.getState().service.serviceInstance[serviceModelId]) ?
176       (this._store.getState().service.serviceInstance[serviceModelId].existingVNFCounterMap[node.data.modelUniqueId] || 0) : 0;
177     counter -= this._sharedTreeService.getExistingInstancesWithDeleteMode(node, serviceModelId, 'vnfs');
178
179     const properties = this._store.getState().service.serviceHierarchy[serviceModelId].vnfs[node.data.name].properties;
180     const maxInstances: number = !_.isNil(properties) ? (properties.max_instances || 1) : 1;
181     const isReachedLimit = !(maxInstances > counter);
182     const showAddIcon = this._sharedTreeService.shouldShowAddIcon() && !isReachedLimit;
183     return new AvailableNodeIcons(showAddIcon, isReachedLimit)
184   }
185
186   getMenuAction(node: ITreeNode, serviceModelId: string): { [methodName: string]: { method: Function, visible: Function, enable: Function } } {
187     return <any>{
188       edit: {
189         method: (node, serviceModelId) => {
190           this._iframeService.addClassOpenModal('content');
191           this._dialogService.addDialog(GenericFormPopupComponent, {
192             type: PopupType.VNF,
193             uuidData: <any>{
194               serviceId: serviceModelId,
195               modelName: node.data.modelName,
196               vnfStoreKey: node.data.vnfStoreKey,
197               modelId: node.data.modelId,
198               type: node.data.type,
199               popupService: this._vnfPopupService
200             },
201             node: node,
202             isUpdateMode: true
203           });
204         },
205         visible: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
206         enable: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
207       },
208       showAuditInfo: {
209         method: (node, serviceModelId) => {
210             const instance = this._store.getState().service.serviceInstance[serviceModelId].vnfs[node.data.vnfStoreKey];
211             this._sharedTreeService.openAuditInfoModal(node, serviceModelId, instance, 'VNF', this);
212           },
213         visible: (node) => this._sharedTreeService.shouldShowAuditInfo(node),
214         enable: (node) => this._sharedTreeService.shouldShowAuditInfo(node)
215       },
216       duplicate: {
217         method: (node, serviceModelId) => {
218           const storeKey = node.data.vnfStoreKey;
219           let modalConfig: IModalConfig = this._duplicateService.openDuplicateModal(serviceModelId, node.data.modelUniqueId, node.data.modelName, storeKey, 1, this._store, node);
220           this.modalService.openCustomModal(modalConfig, DuplicateVnfComponent);
221         },
222         visible: (node) => this._sharedTreeService.shouldShowDuplicate(node) && !_.isNil(node.data) && !_.isNil(node.data.action) && node.data.action === ServiceInstanceActions.Create && this._duplicateService.canDuplicate(node),
223         enable: (node, serviceModelId) => this._duplicateService.isEnabled(node, this._store, serviceModelId)
224       },
225       remove: {
226         method: (node, serviceModelId) => {
227           if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) {
228             let storeKey: string = node.data.vnfStoreKey;
229             this._store.dispatch(removeInstance(node.data.vnfStoreKey, serviceModelId, storeKey, node));
230             this._store.dispatch(changeInstanceCounter(node.data.modelUniqueId, serviceModelId, -1, node));
231             this._sharedTreeService.selectedVNF = null;
232           } else {
233             let messageBoxData: MessageBoxData = new MessageBoxData(
234               "Remove VNF",  // modal title
235               "You are about to remove this VNF and all its children from this service. Are you sure you want to remove it?",
236               <any>"warning",
237               <any>"md",
238               [
239                 {
240                   text: "Remove VNF",
241                   size: "large",
242                   callback: this.removeVnf.bind(this, node, serviceModelId),
243                   closeModal: true
244                 },
245                 {text: "Don’t Remove", size: "medium", closeModal: true}
246               ]);
247
248             MessageBoxService.openModal.next(messageBoxData);
249           }
250         },
251         visible: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
252         enable: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
253       },
254       delete: {
255         method: (node, serviceModelId) => {
256           if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) {
257             this._store.dispatch(deleteActionVnfInstance(node.data.vnfStoreKey, serviceModelId));
258           } else {
259             this._sharedTreeService.shouldShowDeleteInstanceWithChildrenModal(node, serviceModelId, (node, serviceModelId) => {
260               this._sharedTreeService.removeDeleteAllChild(node, serviceModelId, (node, serviceModelId) => {
261                 this._store.dispatch(deleteActionVnfInstance(node.data.vnfStoreKey, serviceModelId));
262               });
263             });
264           }
265         },
266         visible: (node) => this._sharedTreeService.shouldShowDelete(node),
267         enable: (node) => this._sharedTreeService.shouldShowDelete(node)
268       },
269       undoDelete: {
270         method: (node, serviceModelId) => {
271           if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) {
272             this._store.dispatch(undoDeleteActionVnfInstance(node.data.vnfStoreKey, serviceModelId));
273           } else {
274             this._sharedTreeService.undoDeleteAllChild(node, serviceModelId, (node, serviceModelId) => {
275               this._store.dispatch(undoDeleteActionVnfInstance(node.data.vnfStoreKey, serviceModelId));
276             });
277           }
278         },
279         visible: (node) => this._sharedTreeService.shouldShowUndoDelete(node),
280         enable: (node, serviceModelId) => this._sharedTreeService.shouldShowUndoDelete(node) && !this._sharedTreeService.isServiceOnDeleteMode(serviceModelId)
281       }
282     }
283   }
284
285   removeVnf(this, node, serviceModelId) {
286     this._store.dispatch(removeInstance(node.data.modelName, serviceModelId, node.data.vnfStoreKey, node));
287     this._store.dispatch(changeInstanceCounter(node.data.modelUniqueId, serviceModelId, -1, node));
288     this._sharedTreeService.selectedVNF = null;
289   }
290
291   /***********************************************************
292    * should update node position inside the tree
293    * @param node - current ITrees node
294    ************************************************************/
295   updatePosition(that, node, instanceId): void {
296     that.store.dispatch(updateVnfPosition(node, instanceId, node.vnfStoreKey));
297   }
298
299   /***********************************************************
300    * return the position of the current node in the tree
301    * @param instance - current ITrees node instance
302    ************************************************************/
303   getNodePosition(instance): number {
304     return !_.isNil(instance) ? instance.position : null;
305   }
306
307   getInfo(model, instance): ModelInformationItem[] {
308     const modelInformation = !_.isEmpty(model) ? [
309       ModelInformationItem.createInstance("Min instances",  !_.isNull(model.min)? String(model.min): null),
310       ModelInformationItem.createInstance("Max instances",  !_.isNull(model.max)? String(model.max): null)
311     ] : [];
312
313     const instanceInfo = !_.isEmpty(instance) ? [
314       ModelInformationItem.createInstance("NF type", instance.nfType),
315       ModelInformationItem.createInstance("NF role", instance.nfRole)
316     ] : [];
317
318     const result = [modelInformation, instanceInfo];
319     return _.uniq(_.flatten(result));
320   }
321 }