Merge "workflow parameters API"
[vid.git] / vid-webpack-master / src / app / drawingBoard / service-planning / objectsToTree / models / network / network.model.info.ts
1 import {DynamicInputsService} from "../../dynamicInputs.service";
2 import {ILevelNodeInfo} from "../basic.model.info";
3 import {NetworkInstance} from "../../../../../shared/models/networkInstance";
4 import {NetworkModel} from "../../../../../shared/models/networkModel";
5 import {NetworkTreeNode} from "../../../../../shared/models/networkTreeNode";
6 import {SharedTreeService} from "../../shared.tree.service";
7 import {InputType} from "../../../../../shared/models/inputTypes";
8 import {NgRedux} from "@angular-redux/store";
9 import {AppState} from "../../../../../shared/store/reducers";
10 import {
11   GenericFormPopupComponent,
12   PopupType
13 } from "../../../../../shared/components/genericFormPopup/generic-form-popup.component";
14 import {DialogService} from "ng2-bootstrap-modal";
15 import {NetworkPopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/network/network.popup.service";
16 import * as _ from "lodash";
17 import {ITreeNode} from "angular-tree-component/dist/defs/api";
18 import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service";
19 import {DuplicateVnfComponent} from "../../../duplicate/duplicate-vnf.component";
20 import {changeInstanceCounter, removeInstance} from "../../../../../shared/storeUtil/utils/general/general.actions";
21 import {IframeService} from "../../../../../shared/utils/iframe.service";
22 import {SdcUiServices} from "onap-ui-angular";
23 import {DuplicateService} from "../../../duplicate/duplicate.service";
24 import {ServiceInstanceActions} from "../../../../../shared/models/serviceInstanceActions";
25 import {
26   deleteActionNetworkInstance,
27   undoDeleteActionNetworkInstance,
28   updateNetworkPosition
29 } from "../../../../../shared/storeUtil/utils/network/network.actions";
30 import {IModalConfig} from "onap-ui-angular/dist/modals/models/modal-config";
31
32 export class NetworkModelInfo implements ILevelNodeInfo {
33   constructor(private _dynamicInputsService: DynamicInputsService,
34               private _sharedTreeService: SharedTreeService,
35               private _dialogService: DialogService,
36               private _networkPopupService: NetworkPopupService,
37               private _duplicateService: DuplicateService,
38               private modalService: SdcUiServices.ModalService,
39               private _iframeService: IframeService,
40               private _store: NgRedux<AppState>) {
41   }
42
43   name: string = 'networks';
44   type: string = 'Network';
45   typeName: string = 'N';
46
47   /***********************************************************
48    * return model dynamic inputs
49    * @param currentModel - current Model object
50    ************************************************************/
51   isEcompGeneratedNaming(currentModel): boolean {
52     const ecompGeneratedNaming = currentModel.properties.ecomp_generated_naming;
53     return ecompGeneratedNaming === "true";
54   }
55
56   updateDynamicInputsDataFromModel = (currentModel): any => {
57     let displayInputs;
58     return _.isEmpty(displayInputs) ? [] : this._dynamicInputsService.getArbitraryInputs(displayInputs);
59   };
60
61   /***********************************************************
62    * return network model
63    * @param networkModelId - current Model id
64    * @param instance
65    * @param serviceHierarchy - serviceHierarchy
66    ************************************************************/
67   getModel = (networkModelId: string, instance: NetworkInstance, serviceHierarchy): NetworkModel => {
68     const originalModelName = instance.originalName ? instance.originalName : networkModelId;
69     return new NetworkModel(serviceHierarchy[this.name][originalModelName]);
70   };
71
72
73   /***********************************************************
74    * return network instance tree node
75    * @param instance - network instance
76    * @param model - network model
77    * @param parentModel
78    * @param storeKey - store key if exist
79    ************************************************************/
80   createInstanceTreeNode = (instance: NetworkInstance, model: NetworkModel, parentModel, storeKey: string): NetworkTreeNode => {
81     let node = new NetworkTreeNode(instance, model, storeKey);
82     node.missingData = this.hasMissingData(instance, node, model.isEcompGeneratedNaming);
83     node.typeName = this.typeName;
84     node.menuActions = this.getMenuAction(<any>node, model.uuid);
85     node.isFailed = _.isNil(instance.isFailed) ? false : instance.isFailed;
86     node.statusMessage = !_.isNil(instance.statusMessage) ? instance.statusMessage: "";
87     node = this._sharedTreeService.addingStatusProperty(node);
88     return node;
89   };
90
91   /***********************************************************
92    * return next level object (null because is last level)
93    ************************************************************/
94   getNextLevelObject(): any {
95     return null;
96   }
97
98   getTooltip = (): string => 'Network';
99
100   getType = (): string => 'Network';
101
102   /***********************************************************
103    * return if instance has missing data
104    * @param instance - vnf instance
105    * @param dynamicInputs
106    * @param isEcompGeneratedNaming
107    ************************************************************/
108   hasMissingData(instance, dynamicInputs: any, isEcompGeneratedNaming: boolean): boolean {
109     return this._sharedTreeService.hasMissingData(instance, dynamicInputs, isEcompGeneratedNaming, [InputType.LCP_REGION, InputType.TENANT, InputType.PLATFORM]);
110   }
111
112
113   /***********************************************************
114    * return if instance has missing data
115    * @param node - Network node
116    * @param serviceModelId - current service id
117    ************************************************************/
118   onClickAdd(node, serviceModelId: string): void {
119     this._dialogService.addDialog(GenericFormPopupComponent, <any>{
120       type: PopupType.NETWORK,
121       uuidData: {
122         serviceId: serviceModelId,
123         networkId: node.data.name,
124         networkStoreKey: null,
125         type: 'VL',
126         popupService: this._networkPopupService
127       },
128       node: node,
129       isUpdateMode: false
130     });
131   }
132
133   /***********************************************************
134    * return number of existing instances
135    * @param node - Network node
136    * @param serviceModelId - current service id
137    ************************************************************/
138   getNodeCount(node: ITreeNode, serviceModelId: string): number {
139     let map = null;
140     if (!_.isNil(this._store.getState().service.serviceInstance[serviceModelId])) {
141       map = this._store.getState().service.serviceInstance[serviceModelId].existingNetworksCounterMap || 0;
142       if (!_.isNil(map)) {
143         let count = map[node.data.modelUniqueId] || 0;
144         count -= this._sharedTreeService.getExistingInstancesWithDeleteMode(node, serviceModelId , 'networks');
145         return count;
146       }
147     }
148     return 0;
149   }
150
151   /***********************************************************
152    * should show node icon
153    * @param node - current ITrees node
154    * @param serviceModelId - service id
155    ************************************************************/
156   showNodeIcons(node: ITreeNode, serviceModelId: string): AvailableNodeIcons {
157     let counter: number = !_.isNil(this._store.getState().service.serviceInstance[serviceModelId]) ?
158       (this._store.getState().service.serviceInstance[serviceModelId].existingNetworksCounterMap[node.data.modelUniqueId] || 0) : 0;
159
160     counter -= this._sharedTreeService.getExistingInstancesWithDeleteMode(node, serviceModelId , 'networks');
161
162     const properties = this._store.getState().service.serviceHierarchy[serviceModelId].networks[node.data.name].properties;
163     const maxInstances: number = !_.isNil(properties) ? (properties.max_instances || 1) : 1;
164     const isReachedLimit = !(maxInstances > counter);
165     const showAddIcon = this._sharedTreeService.shouldShowAddIcon() && !isReachedLimit;
166
167     return new AvailableNodeIcons(showAddIcon, isReachedLimit)
168   }
169
170   getMenuAction(node: ITreeNode, serviceModelId: string): { [methodName: string]: { method: Function, visible: Function, enable: Function }} {
171     const mode = this._store.getState().global.drawingBoardStatus;
172     return {
173       edit: {
174         method: (node, serviceModelId) => {
175           this._iframeService.addClassOpenModal('content');
176           this._dialogService.addDialog(GenericFormPopupComponent, {
177             type: PopupType.NETWORK,
178             uuidData: <any>{
179               serviceId: serviceModelId,
180               networkId: node.data.modelName,
181               networkStoreKey: node.data.networkStoreKey,
182               type: node.data.type,
183               popupService: this._networkPopupService
184             },
185             node: node,
186             isUpdateMode: true
187           });
188         },
189         visible: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
190         enable: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node)
191       },
192       showAuditInfo: {
193         method: (node, serviceModelId) => {
194           let instance = this._store.getState().service.serviceInstance[serviceModelId].networks[node.data.networkStoreKey];
195           this._sharedTreeService.openAuditInfoModal(node, serviceModelId, instance, 'NETWORK', this);
196         },
197         visible: (node) => this._sharedTreeService.shouldShowAuditInfo(node),
198         enable: (node) => this._sharedTreeService.shouldShowAuditInfo(node)
199       },
200       duplicate: {
201         method: (node, serviceModelId) => {
202           if (this._store.getState().global.flags['FLAG_DUPLICATE_VNF']) {
203             const storeKey = node.data.networkStoreKey;
204             let modalConfig: IModalConfig = this._duplicateService.openDuplicateModal(serviceModelId, node.data.modelUniqueId, node.data.modelName, storeKey, 1, this._store, node);
205             this.modalService.openCustomModal(modalConfig, DuplicateVnfComponent);
206           }
207         },
208         visible: (node) => this._sharedTreeService.shouldShowDuplicate(node) && !_.isNil(node.data) && !_.isNil(node.data.action) && node.data.action === ServiceInstanceActions.Create && this._duplicateService.canDuplicate(node),
209         enable: (node, serviceModelId) => this._duplicateService.isEnabled(node, this._store, serviceModelId)
210       },
211       remove: {
212         method: (node, serviceModelId) => {
213           let storeKey: string = node.data.networkStoreKey;
214           this._store.dispatch(removeInstance(node.data.networkStoreKey, serviceModelId, storeKey, node));
215           this._store.dispatch(changeInstanceCounter(node.data.modelUniqueId , serviceModelId, -1, node));
216           this._sharedTreeService.selectedVNF = null;
217         },
218         visible: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
219         enable: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
220       },
221       delete : {
222         method : (node, serviceModelId) => {
223           if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) {
224             this._store.dispatch(deleteActionNetworkInstance(node.data.networkStoreKey, serviceModelId));
225           }else {
226             this._sharedTreeService.removeDeleteAllChild(node, serviceModelId, (node, serviceModelId)=>{
227               this._store.dispatch(deleteActionNetworkInstance(node.data.networkStoreKey, serviceModelId));
228             });
229           }
230         },
231         visible: (node) => this._sharedTreeService.shouldShowDelete(node),
232         enable: (node) => this._sharedTreeService.shouldShowDelete(node)
233       },
234       undoDelete : {
235         method : (node, serviceModelId) => {
236           if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) {
237             this._store.dispatch(undoDeleteActionNetworkInstance(node.data.networkStoreKey, serviceModelId));
238           }else {
239             this._sharedTreeService.undoDeleteAllChild(node, serviceModelId, (node, serviceModelId)=>{
240               this._store.dispatch(undoDeleteActionNetworkInstance(node.data.networkStoreKey, serviceModelId));
241             });
242           }
243         },
244         visible: (node) => this._sharedTreeService.shouldShowUndoDelete(node),
245         enable: (node, serviceModelId) => this._sharedTreeService.shouldShowUndoDelete(node) && !this._sharedTreeService.isServiceOnDeleteMode(serviceModelId)
246       }
247     };
248   }
249
250   /***********************************************************
251    * should update node position inside the tree
252    * @param node - current ITrees node
253    ************************************************************/
254   updatePosition(that , node, instanceId): void {
255     that.store.dispatch(updateNetworkPosition(node));
256   }
257
258   getNodePosition(instance): number {
259     return !_.isNil(instance) ? instance.position : null;
260   }
261
262   onSelectedNode(node: ITreeNode): void {
263   }
264 }