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