Adding unlimited max value to VNF, NETWORK
[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 import {FeatureFlagsService} from "../../../../../shared/services/featureFlag/feature-flags.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: VfModulePopuopService,
51               private _vfModuleUpgradePopupService: VfModuleUpgradePopupService,
52               private _duplicateService: DuplicateService,
53               private modalService: SdcUiServices.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 = (vnfModelId: string, instance: VnfInstance, serviceHierarchy): VNFModel => {
91     const originalModelName = instance.originalName ? instance.originalName : vnfModelId;
92     return new VNFModel(serviceHierarchy[this.name][originalModelName], this._featureFlagsService.getAllFlags());
93   };
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    ************************************************************/
103   createInstanceTreeNode = (instance: VnfInstance, model: VNFModel, parentModel, storeKey: string): VnfTreeNode => {
104     let node = new VnfTreeNode(instance, model, storeKey);
105     node.missingData = this.hasMissingData(instance, node, model.isEcompGeneratedNaming);
106     node.typeName = this.typeName;
107     node.menuActions = this.getMenuAction(<any>node, model.uuid);
108     node.isFailed = _.isNil(instance.isFailed) ? false : instance.isFailed;
109     node.statusMessage = !_.isNil(instance.statusMessage) ? instance.statusMessage : "";
110     node = this._sharedTreeService.addingStatusProperty(node);
111     return node;
112   };
113
114   /***********************************************************
115    * return next level object (VFModule)
116    ************************************************************/
117   getNextLevelObject = (): VFModuleModelInfo => {
118     return new VFModuleModelInfo(this._dynamicInputsService, this._sharedTreeService, this._dialogService, this._vfModulePopupService, this._vfModuleUpgradePopupService, this._iframeService, this._featureFlagsService, this._store, this._componentInfoService);
119   };
120
121   /***********************************************************
122    * return if instance has missing data
123    * @param instance - vnf instance
124    * @param dynamicInputs
125    * @param isEcompGeneratedNaming
126    ************************************************************/
127   hasMissingData(instance, dynamicInputs: any, isEcompGeneratedNaming: boolean): boolean {
128     return this._sharedTreeService.hasMissingData(instance, dynamicInputs, isEcompGeneratedNaming, [InputType.LCP_REGION, InputType.TENANT, InputType.PLATFORM]);
129   }
130
131   getTooltip = (): string => 'VF';
132
133   getType = (): string => 'VF';
134
135   /***********************************************************
136    * return if instance has missing data
137    * @param node - VNF node
138    * @param serviceModelId - current service id
139    ************************************************************/
140   onClickAdd(node, serviceModelId: string): void {
141     this._dialogService.addDialog(GenericFormPopupComponent, {
142       type: PopupType.VNF,
143       uuidData: <any>{
144         serviceId: serviceModelId,
145         modelName: node.data.name,
146         vnfStoreKey: null,
147         modelId: node.data.modelVersionId,
148         type: node.data.type,
149         popupService: this._vnfPopupService
150       },
151       node: node,
152       isUpdateMode: false
153     })
154   }
155
156   /***********************************************************
157    * return number of existing instances
158    * @param node - VNF node
159    * @param serviceModelId - current service id
160    ************************************************************/
161   getNodeCount(node: ITreeNode, serviceModelId: string): number {
162     let map = null;
163     if (!_.isNil(this._store.getState().service.serviceInstance[serviceModelId])) {
164       map = this._store.getState().service.serviceInstance[serviceModelId].existingVNFCounterMap || 0;
165
166       if (!_.isNil(map)) {
167         let count = map[node.data.modelUniqueId] || 0;
168         count -= this._sharedTreeService.getExistingInstancesWithDeleteMode(node, serviceModelId, 'vnfs');
169         return count;
170       }
171     }
172     return 0;
173   }
174
175   /***********************************************************
176    * should show node icon
177    * @param node - current ITrees node
178    * @param serviceModelId - service id
179    ************************************************************/
180   showNodeIcons(node: ITreeNode, serviceModelId: string): AvailableNodeIcons {
181     let counter: number = !_.isNil(this._store.getState().service.serviceInstance[serviceModelId]) ?
182       (this._store.getState().service.serviceInstance[serviceModelId].existingVNFCounterMap[node.data.modelUniqueId] || 0) : 0;
183     counter -= this._sharedTreeService.getExistingInstancesWithDeleteMode(node, serviceModelId, 'vnfs');
184
185     const properties = this._store.getState().service.serviceHierarchy[serviceModelId].vnfs[node.data.name].properties;
186     const flags = FeatureFlagsService.getAllFlags(this._store);
187     const isReachedLimit: boolean = this._sharedTreeService.isReachedToMaxInstances(properties, counter, flags);
188     const showAddIcon = this._sharedTreeService.shouldShowAddIcon() && !isReachedLimit;
189     return new AvailableNodeIcons(showAddIcon, isReachedLimit)
190   }
191
192   getMenuAction(node: ITreeNode, serviceModelId: string): { [methodName: string]: { method: Function, visible: Function, enable: Function } } {
193     return <any>{
194       edit: {
195         method: (node, serviceModelId) => {
196           this._iframeService.addClassOpenModal('content');
197           this._dialogService.addDialog(GenericFormPopupComponent, {
198             type: PopupType.VNF,
199             uuidData: <any>{
200               serviceId: serviceModelId,
201               modelName: node.data.modelName,
202               vnfStoreKey: node.data.vnfStoreKey,
203               modelId: node.data.modelId,
204               type: node.data.type,
205               popupService: this._vnfPopupService
206             },
207             node: node,
208             isUpdateMode: true
209           });
210         },
211         visible: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
212         enable: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
213       },
214       showAuditInfo: {
215         method: (node, serviceModelId) => {
216           const instance = this._store.getState().service.serviceInstance[serviceModelId].vnfs[node.data.vnfStoreKey];
217           this._sharedTreeService.openAuditInfoModal(node, serviceModelId, instance, 'VNF', this);
218         },
219         visible: (node) => this._sharedTreeService.shouldShowAuditInfo(node),
220         enable: (node) => this._sharedTreeService.shouldShowAuditInfo(node)
221       },
222       duplicate: {
223         method: (node, serviceModelId) => {
224           const storeKey = node.data.vnfStoreKey;
225           let modalConfig: IModalConfig = this._duplicateService.openDuplicateModal(serviceModelId, node.data.modelUniqueId, node.data.modelName, storeKey, 1, this._store, node);
226           this.modalService.openCustomModal(modalConfig, DuplicateVnfComponent);
227         },
228         visible: (node) => this._sharedTreeService.shouldShowDuplicate(node) && !_.isNil(node.data) && !_.isNil(node.data.action) && node.data.action === ServiceInstanceActions.Create && this._duplicateService.canDuplicate(node),
229         enable: (node, serviceModelId) => this._duplicateService.isEnabled(node, this._store, serviceModelId)
230       },
231       remove: {
232         method: (node, serviceModelId) => {
233           if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) {
234             let storeKey: string = node.data.vnfStoreKey;
235             this._store.dispatch(removeInstance(node.data.vnfStoreKey, serviceModelId, storeKey, node));
236             this._store.dispatch(changeInstanceCounter(node.data.modelUniqueId, serviceModelId, -1, node));
237             this._sharedTreeService.selectedVNF = null;
238           } else {
239             let messageBoxData: MessageBoxData = new MessageBoxData(
240               "Remove VNF",  // modal title
241               "You are about to remove this VNF and all its children from this service. Are you sure you want to remove it?",
242               <any>"warning",
243               <any>"md",
244               [
245                 {
246                   text: "Remove VNF",
247                   size: "large",
248                   callback: this.removeVnf.bind(this, node, serviceModelId),
249                   closeModal: true
250                 },
251                 {text: "Don’t Remove", size: "medium", closeModal: true}
252               ]);
253
254             MessageBoxService.openModal.next(messageBoxData);
255           }
256         },
257         visible: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
258         enable: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
259       },
260       delete: {
261         method: (node, serviceModelId) => {
262           if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) {
263             this._store.dispatch(deleteActionVnfInstance(node.data.vnfStoreKey, serviceModelId));
264           } else {
265             this._sharedTreeService.shouldShowDeleteInstanceWithChildrenModal(node, serviceModelId, (node, serviceModelId) => {
266               this._sharedTreeService.removeDeleteAllChild(node, serviceModelId, (node, serviceModelId) => {
267                 this._store.dispatch(deleteActionVnfInstance(node.data.vnfStoreKey, serviceModelId));
268               });
269             });
270           }
271         },
272         visible: (node) => this._sharedTreeService.shouldShowDelete(node),
273         enable: (node) => this._sharedTreeService.shouldShowDelete(node)
274       },
275       undoDelete: {
276         method: (node, serviceModelId) => {
277           if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) {
278             this._store.dispatch(undoDeleteActionVnfInstance(node.data.vnfStoreKey, serviceModelId));
279           } else {
280             this._sharedTreeService.undoDeleteAllChild(node, serviceModelId, (node, serviceModelId) => {
281               this._store.dispatch(undoDeleteActionVnfInstance(node.data.vnfStoreKey, serviceModelId));
282             });
283           }
284         },
285         visible: (node) => this._sharedTreeService.shouldShowUndoDelete(node),
286         enable: (node, serviceModelId) => this._sharedTreeService.shouldShowUndoDelete(node) && !this._sharedTreeService.isServiceOnDeleteMode(serviceModelId)
287       },
288       upgrade: {
289         method: (node, serviceModelId) => {
290           this._store.dispatch(upgradeVnf(node.data.vnfStoreKey, serviceModelId));
291         },
292         visible: () => false,
293         enable: () => false
294       },
295       undoUpgrade: {
296         method: (node, serviceModelId) => {
297           this._store.dispatch(undoUpgradeVnf(node.data.vnfStoreKey, serviceModelId));
298         },
299         visible: () => false,
300         enable: () => false
301       },
302     }
303   }
304
305   removeVnf(this, node, serviceModelId) {
306     this._store.dispatch(removeInstance(node.data.modelName, serviceModelId, node.data.vnfStoreKey, node));
307     this._store.dispatch(changeInstanceCounter(node.data.modelUniqueId, serviceModelId, -1, node));
308     this._sharedTreeService.selectedVNF = null;
309   }
310
311   /***********************************************************
312    * should update node position inside the tree
313    * @param node - current ITrees node
314    ************************************************************/
315   updatePosition(that, node, instanceId): void {
316     that.store.dispatch(updateVnfPosition(node, instanceId, node.vnfStoreKey));
317   }
318
319   /***********************************************************
320    * return the position of the current node in the tree
321    * @param instance - current ITrees node instance
322    ************************************************************/
323   getNodePosition(instance): number {
324     return !_.isNil(instance) ? instance.position : null;
325   }
326
327   getInfo(model, instance): ModelInformationItem[] {
328     const modelInformation = !_.isEmpty(model) ? [
329       ModelInformationItem.createInstance("Min instances", !_.isNull(model.min) ? String(model.min) : null),
330       ModelInformationItem.createInstance("Max instances", !_.isNull(model.max) ? String(model.max) : null)
331     ] : [];
332
333     const instanceInfo = !_.isEmpty(instance) ? [
334       ModelInformationItem.createInstance("NF type", instance.nfType),
335       ModelInformationItem.createInstance("NF role", instance.nfRole)
336     ] : [];
337
338     const result = [modelInformation, instanceInfo];
339     return _.uniq(_.flatten(result));
340   }
341 }