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";
13 GenericFormPopupComponent,
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";
30 deleteActionVnfInstance,
31 undoDeleteActionVnfInstance,
33 } from "../../../../../shared/storeUtil/utils/vnf/vnf.actions";
34 import * as _ from 'lodash';
35 import {IModalConfig} from "onap-ui-angular/dist/modals/models/modal-config";
36 import {ComponentInfoModel, ComponentInfoType} from "../../../component-info/component-info-model";
37 import {ComponentInfoService} from "../../../component-info/component-info.service";
38 import {ModelInformationItem} from "../../../../../shared/components/model-information/model-information.component";
40 export class VnfModelInfo implements ILevelNodeInfo {
41 constructor(private _dynamicInputsService: DynamicInputsService,
42 private _sharedTreeService: SharedTreeService,
43 private _defaultDataGeneratorService: DefaultDataGeneratorService,
44 private _dialogService: DialogService,
45 private _vnfPopupService: VnfPopupService,
46 private _vfModulePopupService: VfModulePopuopService,
47 private _duplicateService: DuplicateService,
48 private modalService: SdcUiServices.ModalService,
49 private _iframeService: IframeService,
50 private _componentInfoService: ComponentInfoService,
51 private _store: NgRedux<AppState>) {
54 name: string = 'vnfs';
56 childName: string = 'vfModules';
57 childType: string = 'VFModuleModelInfo';
58 typeName: string = 'VNF';
60 /***********************************************************
61 * return if user should provide instance name or not.
62 * @param currentModel - current Model object
63 ************************************************************/
64 isEcompGeneratedNaming = (currentModel): boolean => {
65 const ecompGeneratedNaming = currentModel.properties.ecomp_generated_naming;
66 return ecompGeneratedNaming === "true";
69 /***********************************************************
70 * return model dynamic inputs
71 * @param currentModel - current Model object
72 ************************************************************/
73 updateDynamicInputsDataFromModel = (currentModel): any => {
75 return _.isEmpty(displayInputs) ? [] : this._dynamicInputsService.getArbitraryInputs(displayInputs);
78 /***********************************************************
80 * @param vnfModelId - current Model id
81 * @param instance - vnf instance
82 * @param serviceHierarchy - serviceHierarchy
83 ************************************************************/
84 getModel = (vnfModelId: string, instance: VnfInstance, serviceHierarchy): VNFModel => {
85 const originalModelName = instance.originalName ? instance.originalName : vnfModelId;
86 return new VNFModel(serviceHierarchy[this.name][originalModelName]);
90 /***********************************************************
91 * return vnf instance tree node
92 * @param instance - vnf instance
93 * @param model - vnf model
95 * @param storeKey - store key if exist
96 ************************************************************/
97 createInstanceTreeNode = (instance: VnfInstance, model: VNFModel, parentModel, storeKey: string): VnfTreeNode => {
98 let node = new VnfTreeNode(instance, model, storeKey);
99 node.missingData = this.hasMissingData(instance, node, model.isEcompGeneratedNaming);
100 node.typeName = this.typeName;
101 node.menuActions = this.getMenuAction(<any>node, model.uuid);
102 node.isFailed = _.isNil(instance.isFailed) ? false : instance.isFailed;
103 node.statusMessage = !_.isNil(instance.statusMessage) ? instance.statusMessage: "";
104 node = this._sharedTreeService.addingStatusProperty(node);
108 /***********************************************************
109 * return next level object (VFModule)
110 ************************************************************/
111 getNextLevelObject = (): VFModuleModelInfo => {
112 return new VFModuleModelInfo(this._dynamicInputsService, this._sharedTreeService, this._dialogService, this._vfModulePopupService, this._iframeService, this._store, this._componentInfoService);
115 /***********************************************************
116 * return if instance has missing data
117 * @param instance - vnf instance
118 * @param dynamicInputs
119 * @param isEcompGeneratedNaming
120 ************************************************************/
121 hasMissingData(instance, dynamicInputs: any, isEcompGeneratedNaming: boolean): boolean {
122 return this._sharedTreeService.hasMissingData(instance, dynamicInputs, isEcompGeneratedNaming, [InputType.LCP_REGION, InputType.TENANT, InputType.PLATFORM]);
125 getTooltip = (): string => 'VF';
127 getType = (): string => 'VF';
129 /***********************************************************
130 * return if instance has missing data
131 * @param node - VNF node
132 * @param serviceModelId - current service id
133 ************************************************************/
134 onClickAdd(node, serviceModelId: string): void {
135 this._dialogService.addDialog(GenericFormPopupComponent, {
138 serviceId: serviceModelId,
139 modelName: node.data.name,
141 modelId: node.data.modelVersionId,
142 type: node.data.type,
143 popupService: this._vnfPopupService
150 /***********************************************************
151 * return number of existing instances
152 * @param node - VNF node
153 * @param serviceModelId - current service id
154 ************************************************************/
155 getNodeCount(node: ITreeNode, serviceModelId: string): number {
157 if (!_.isNil(this._store.getState().service.serviceInstance[serviceModelId])) {
158 map = this._store.getState().service.serviceInstance[serviceModelId].existingVNFCounterMap || 0;
161 let count = map[node.data.modelUniqueId] || 0;
162 count -= this._sharedTreeService.getExistingInstancesWithDeleteMode(node, serviceModelId, 'vnfs');
169 /***********************************************************
170 * should show node icon
171 * @param node - current ITrees node
172 * @param serviceModelId - service id
173 ************************************************************/
174 showNodeIcons(node: ITreeNode, serviceModelId: string): AvailableNodeIcons {
175 let counter: number = !_.isNil(this._store.getState().service.serviceInstance[serviceModelId]) ?
176 (this._store.getState().service.serviceInstance[serviceModelId].existingVNFCounterMap[node.data.modelUniqueId] || 0) : 0;
177 counter -= this._sharedTreeService.getExistingInstancesWithDeleteMode(node, serviceModelId, 'vnfs');
179 const properties = this._store.getState().service.serviceHierarchy[serviceModelId].vnfs[node.data.name].properties;
180 const maxInstances: number = !_.isNil(properties) ? (properties.max_instances || 1) : 1;
181 const isReachedLimit = !(maxInstances > counter);
182 const showAddIcon = this._sharedTreeService.shouldShowAddIcon() && !isReachedLimit;
183 return new AvailableNodeIcons(showAddIcon, isReachedLimit)
186 getMenuAction(node: ITreeNode, serviceModelId: string): { [methodName: string]: { method: Function, visible: Function, enable: Function } } {
189 method: (node, serviceModelId) => {
190 this._iframeService.addClassOpenModal('content');
191 this._dialogService.addDialog(GenericFormPopupComponent, {
194 serviceId: serviceModelId,
195 modelName: node.data.modelName,
196 vnfStoreKey: node.data.vnfStoreKey,
197 modelId: node.data.modelId,
198 type: node.data.type,
199 popupService: this._vnfPopupService
205 visible: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
206 enable: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
209 method: (node, serviceModelId) => {
210 const instance = this._store.getState().service.serviceInstance[serviceModelId].vnfs[node.data.vnfStoreKey];
211 this._sharedTreeService.openAuditInfoModal(node, serviceModelId, instance, 'VNF', this);
213 visible: (node) => this._sharedTreeService.shouldShowAuditInfo(node),
214 enable: (node) => this._sharedTreeService.shouldShowAuditInfo(node)
217 method: (node, serviceModelId) => {
218 if (this._store.getState().global.flags['FLAG_DUPLICATE_VNF']) {
219 const storeKey = node.data.vnfStoreKey;
220 let modalConfig: IModalConfig = this._duplicateService.openDuplicateModal(serviceModelId, node.data.modelUniqueId, node.data.modelName, storeKey, 1, this._store, node);
221 this.modalService.openCustomModal(modalConfig, DuplicateVnfComponent);
224 visible: (node) => this._sharedTreeService.shouldShowDuplicate(node) && !_.isNil(node.data) && !_.isNil(node.data.action) && node.data.action === ServiceInstanceActions.Create && this._duplicateService.canDuplicate(node),
225 enable: (node, serviceModelId) => this._duplicateService.isEnabled(node, this._store, serviceModelId)
228 method: (node, serviceModelId) => {
229 if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) {
230 let storeKey: string = node.data.vnfStoreKey;
231 this._store.dispatch(removeInstance(node.data.vnfStoreKey, serviceModelId, storeKey, node));
232 this._store.dispatch(changeInstanceCounter(node.data.modelUniqueId, serviceModelId, -1, node));
233 this._sharedTreeService.selectedVNF = null;
235 let messageBoxData: MessageBoxData = new MessageBoxData(
236 "Remove VNF", // modal title
237 "You are about to remove this VNF and all its children from this service. Are you sure you want to remove it?",
244 callback: this.removeVnf.bind(this, node, serviceModelId),
247 {text: "Don’t Remove", size: "medium", closeModal: true}
250 MessageBoxService.openModal.next(messageBoxData);
253 visible: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
254 enable: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
257 method: (node, serviceModelId) => {
258 if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) {
259 this._store.dispatch(deleteActionVnfInstance(node.data.vnfStoreKey, serviceModelId));
261 this._sharedTreeService.shouldShowDeleteInstanceWithChildrenModal(node, serviceModelId, (node, serviceModelId) => {
262 this._sharedTreeService.removeDeleteAllChild(node, serviceModelId, (node, serviceModelId) => {
263 this._store.dispatch(deleteActionVnfInstance(node.data.vnfStoreKey, serviceModelId));
268 visible: (node) => this._sharedTreeService.shouldShowDelete(node),
269 enable: (node) => this._sharedTreeService.shouldShowDelete(node)
272 method: (node, serviceModelId) => {
273 if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) {
274 this._store.dispatch(undoDeleteActionVnfInstance(node.data.vnfStoreKey, serviceModelId));
276 this._sharedTreeService.undoDeleteAllChild(node, serviceModelId, (node, serviceModelId) => {
277 this._store.dispatch(undoDeleteActionVnfInstance(node.data.vnfStoreKey, serviceModelId));
281 visible: (node) => this._sharedTreeService.shouldShowUndoDelete(node),
282 enable: (node, serviceModelId) => this._sharedTreeService.shouldShowUndoDelete(node) && !this._sharedTreeService.isServiceOnDeleteMode(serviceModelId)
287 removeVnf(this, node, serviceModelId) {
288 this._store.dispatch(removeInstance(node.data.modelName, serviceModelId, node.data.vnfStoreKey, node));
289 this._store.dispatch(changeInstanceCounter(node.data.modelUniqueId, serviceModelId, -1, node));
290 this._sharedTreeService.selectedVNF = null;
293 /***********************************************************
294 * should update node position inside the tree
295 * @param node - current ITrees node
296 ************************************************************/
297 updatePosition(that, node, instanceId): void {
298 that.store.dispatch(updateVnfPosition(node, instanceId, node.vnfStoreKey));
301 /***********************************************************
302 * return the position of the current node in the tree
303 * @param instance - current ITrees node instance
304 ************************************************************/
305 getNodePosition(instance): number {
306 return !_.isNil(instance) ? instance.position : null;
309 /***********************************************************
310 * When user is click on some nod element
311 * @param node - current ITrees node
312 ************************************************************/
313 onSelectedNode(node: ITreeNode): void {
314 ComponentInfoService.triggerComponentInfoChange.next(new ComponentInfoModel(ComponentInfoType.VNF,[], []));
317 getInfoForVnf(model, instance): ComponentInfoModel {
318 let modelInfoItems: ModelInformationItem[] = [];
320 modelInfoItems.push(ModelInformationItem.createInstance("Min Instances", model.min));
321 modelInfoItems.push(ModelInformationItem.createInstance("Max Instances", model.max));
324 modelInfoItems.push(ModelInformationItem.createInstance("NF Type", instance.nfType));
325 modelInfoItems.push(ModelInformationItem.createInstance("NF Role", instance.nfRole));
327 return this._componentInfoService.addGeneralInfoItems(modelInfoItems, ComponentInfoType.VNF, model, instance);