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