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