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