Can't delete the second vfModule in drawing board - fix.
[vid.git] / vid-webpack-master / src / app / drawingBoard / service-planning / objectsToTree / models / vfModule / vfModule.model.info.ts
index 47a6dcb..b1a67a5 100644 (file)
@@ -13,7 +13,7 @@ import {
   PopupType
 } from "../../../../../shared/components/genericFormPopup/generic-form-popup.component";
 import {DialogService} from "ng2-bootstrap-modal";
-import {VfModulePopuopService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service";
+import {VfModulePopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popup.service";
 import {AppState} from "../../../../../shared/store/reducers";
 import {MessageBoxData} from "../../../../../shared/components/messageBox/messageBox.data";
 import {MessageBoxService} from "../../../../../shared/components/messageBox/messageBox.service";
@@ -21,6 +21,7 @@ import {AvailableNodeIcons} from "../../../available-models-tree/available-model
 import {IframeService} from "../../../../../shared/utils/iframe.service";
 import {
   deleteActionVfModuleInstance,
+  deleteVFModuleField,
   removeVfModuleInstance,
   undoDeleteVfModuleInstance,
   undoUgradeVFModule,
@@ -30,13 +31,18 @@ import {
 import {ComponentInfoService} from "../../../component-info/component-info.service";
 import {ComponentInfoType} from "../../../component-info/component-info-model";
 import {ModelInformationItem} from "../../../../../shared/components/model-information/model-information.component";
+import {VfModuleUpgradePopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vfModuleUpgrade/vfModule.upgrade.popuop.service";
+import {FeatureFlagsService, Features} from "../../../../../shared/services/featureFlag/feature-flags.service";
+import {Utils} from "../../../../../shared/utils/utils";
 
 export class VFModuleModelInfo implements ILevelNodeInfo {
   constructor(private _dynamicInputsService: DynamicInputsService,
               private _sharedTreeService: SharedTreeService,
               private _dialogService: DialogService,
-              private _vfModulePopupService: VfModulePopuopService,
+              private _vfModulePopupService: VfModulePopupService,
+              private _vfModuleUpgradePopupService: VfModuleUpgradePopupService,
               private _iframeService: IframeService,
+              private _featureFlagsService: FeatureFlagsService,
               private _store: NgRedux<AppState>,
               private _componentInfoService: ComponentInfoService) {
   }
@@ -68,20 +74,17 @@ export class VFModuleModelInfo implements ILevelNodeInfo {
 
   /***********************************************************
    * return vfModule model
-   * @param vfModuleModelId - current Model id
-   * @param instance
-   * @param serviceHierarchy - serviceHierarchy
+   * @param instanceModel - The model of the instance (usually extracted from
+   *        serviceHierarchy store)
    ************************************************************/
-  getModel = (vfModuleModelId: string, instance, serviceHierarchy): any => {
-    if (!_.isNil(serviceHierarchy)) {
-      if (!_.isNil(serviceHierarchy[this.name]) && !_.isNil(serviceHierarchy[this.name][vfModuleModelId])) {
-        return serviceHierarchy[this.name][vfModuleModelId];
-      }
+  getModel = (instanceModel: any): Partial<VfModule> => {
+    if (!_.isNil(instanceModel)) {
+      return new VfModule(instanceModel, this._featureFlagsService.getAllFlags());
     }
     return {};
   };
 
-  createNode(instance: VfModuleInstance, currentModel: VfModule, parentModel: VNFModel, modelName: string, index: number): VfModuleTreeNode {
+  createNode(instance: VfModuleInstance, currentModel: VfModule, parentModel: VNFModel, modelName: string, index: number, serviceModelId: string): VfModuleTreeNode {
     let dynamicModelName = Object.keys(instance)[index];
     instance = instance[Object.keys(instance)[index]];
     const isEcompGeneratedNaming: boolean = this.isEcompGeneratedNaming(currentModel, parentModel);
@@ -91,24 +94,24 @@ export class VFModuleModelInfo implements ILevelNodeInfo {
 
     newVfModule.missingData = this._sharedTreeService.hasMissingData(instance, newVfModule.dynamicInputs, isEcompGeneratedNaming, []);
     newVfModule.typeName = this.typeName;
-    newVfModule.menuActions = this.getMenuAction(<any>newVfModule, currentModel.uuid);
+    newVfModule.menuActions = this.getMenuAction(<any>newVfModule, serviceModelId);
     newVfModule.isFailed = _.isNil(instance.isFailed) ? false : instance.isFailed;
-    newVfModule.statusMessage = !_.isNil(instance.statusMessage) ? instance.statusMessage: "";
+    newVfModule.statusMessage = !_.isNil(instance.statusMessage) ? instance.statusMessage : "";
 
     newVfModule = this._sharedTreeService.addingStatusProperty(newVfModule);
     return newVfModule;
   }
 
-  createInstanceTreeNode(instance: VfModuleInstance, currentModel: VfModule, parentModel: VNFModel, modelName: string): VfModuleTreeNode | VfModuleTreeNode[] {
+  createInstanceTreeNode(instance: any, model: any, parentModel: any, storeKey: string, serviceModelId: string): any {
     let numberOfChilds = Object.keys(instance).length;
     if (numberOfChilds > 1) {
       let result: VfModuleTreeNode[] = [];
       for (let i = 0; i < numberOfChilds; i++) {
-        result.push(this.createNode(instance, currentModel, parentModel, modelName, i));
+        result.push(this.createNode(instance, model, parentModel, storeKey, i, serviceModelId));
       }
       return result;
     } else {
-      return this.createNode(instance, currentModel, parentModel, modelName, 0);
+      return this.createNode(instance, model, parentModel, storeKey, 0, serviceModelId);
     }
   }
 
@@ -171,7 +174,7 @@ export class VFModuleModelInfo implements ILevelNodeInfo {
 
   getDefaultVNF(node: ITreeNode, serviceModelId: string): string {
     let keys = _.keys(_.pickBy(this._store.getState().service.serviceInstance[serviceModelId].vnfs, vnf => {
-      return (vnf.originalName == node.data.name);
+      return (this._sharedTreeService.modelUniqueId(vnf) === node.data.modelUniqueId);
     }));
     return keys.length === 1 ? this._store.getState().service.serviceInstance[serviceModelId].vnfs[keys[0]].vnfStoreKey : null;
   }
@@ -182,12 +185,16 @@ export class VFModuleModelInfo implements ILevelNodeInfo {
    * @param serviceModelId - current service id
    ************************************************************/
   getNodeCount(node: ITreeNode, serviceModelId: string): number {
+    const vnfs = this._store.getState().service.serviceInstance[serviceModelId].vnfs;
     let count: number = 0;
     if (!_.isNil(this._store.getState().service.serviceInstance) && !_.isNil(this._store.getState().service.serviceInstance[serviceModelId])) {
-      const vnfs = this._store.getState().service.serviceInstance[serviceModelId].vnfs;
-
-      for (let vnfKey in vnfs) {
-        count += this.countNumberOfVFModule(vnfs[vnfKey], node);
+      const selectedVNF: string = this._sharedTreeService.getSelectedVNF();
+      if (selectedVNF) {
+        count += this.countNumberOfVFModule(vnfs[selectedVNF], node);
+      }else {
+        for (let vnfKey in vnfs) {
+          count += this.countNumberOfVFModule(vnfs[vnfKey], node);
+        }
       }
       return count;
     }
@@ -199,7 +206,7 @@ export class VFModuleModelInfo implements ILevelNodeInfo {
     let count = 0;
     for (let vfModuleKey in vnf['vfModules']) {
       for (let vfModule in vnf['vfModules'][vfModuleKey]) {
-        if (vnf['vfModules'][vfModuleKey][vfModule]['modelInfo'].modelCustomizationId === node.data.modelUniqueId) {
+        if (this._sharedTreeService.modelUniqueId(vnf['vfModules'][vfModuleKey][vfModule]) === node.data.modelUniqueId) {
           const vfModuleObj = vnf['vfModules'][vfModuleKey][vfModule];
           if (!(!_.isNil(vfModuleObj) && !_.isNil(vfModuleObj.action) && vfModuleObj.action.split('_').pop() === 'Delete')) count++;
         }
@@ -211,11 +218,8 @@ export class VFModuleModelInfo implements ILevelNodeInfo {
   getCountVFModuleOfSelectedVNF(node: ITreeNode, vnfStoreKey: string, serviceModelId: string): number {
     let count: number = 0;
     if (!_.isNil(this._store.getState().service.serviceInstance) && !_.isNil(this._store.getState().service.serviceInstance[serviceModelId])) {
-      const vnfs = this._store.getState().service.serviceInstance[serviceModelId].vnfs;
-
-      for (let vnfKey in vnfs) {
-        count += this.countNumberOfVFModule(vnfs[vnfKey], node);
-      }
+      const vnf = this._store.getState().service.serviceInstance[serviceModelId].vnfs[vnfStoreKey];
+      count += this.countNumberOfVFModule(vnf, node);
       return count;
     }
     return count;
@@ -232,7 +236,7 @@ export class VFModuleModelInfo implements ILevelNodeInfo {
     if (selectedVNF) {
       return this.showVFModuleOnSelectedVNF(node, selectedVNF, serviceModelId);
     } else {
-      const optionalSelected = this.getOptionalVNFs(serviceModelId, node.parent.data.name);
+      const optionalSelected = this.getOptionalVNFs(serviceModelId, node.parent.data.modelUniqueId);
       if (optionalSelected.length === 1) {
         return this.showVFModuleOnSelectedVNF(node, optionalSelected[0].vnfStoreKey, serviceModelId);
       } else {
@@ -243,23 +247,23 @@ export class VFModuleModelInfo implements ILevelNodeInfo {
 
 
   showVFModuleOnSelectedVNF(node: ITreeNode, selectedVNF: string, serviceModelId: string): AvailableNodeIcons {
-
-    if (!_.isNil(this._store.getState().service.serviceInstance[serviceModelId].vnfs[selectedVNF]) && node.parent.data.name === this._store.getState().service.serviceInstance[serviceModelId].vnfs[selectedVNF].originalName) {
+    if (!_.isNil(this._store.getState().service.serviceInstance[serviceModelId].vnfs[selectedVNF])
+        && node.parent.data.modelUniqueId === this._sharedTreeService.modelUniqueId(this._store.getState().service.serviceInstance[serviceModelId].vnfs[selectedVNF])) {
       const existingVFModules = this.getCountVFModuleOfSelectedVNF(node, selectedVNF, serviceModelId);
       const reachedLimit = this.isVFModuleReachedLimit(node, this._store.getState().service.serviceHierarchy, serviceModelId, existingVFModules);
-      const showAddIcon = this._sharedTreeService.shouldShowAddIcon()&& !reachedLimit;
+      const showAddIcon = this._sharedTreeService.shouldShowAddIcon() && !reachedLimit;
       return new AvailableNodeIcons(showAddIcon, reachedLimit);
     }
     return new AvailableNodeIcons(false, false);
 
   }
 
-  getOptionalVNFs(serviceUUID: string, vnfOriginalModelName: string): any[] {
+  getOptionalVNFs(serviceUUID: string, vnfModelUniqueId: string): any[] {
     let result = [];
     if (!_.isNil(this._store.getState().service.serviceInstance) && !_.isNil(this._store.getState().service.serviceInstance[serviceUUID])) {
       const serviceVNFsInstances = this._store.getState().service.serviceInstance[serviceUUID].vnfs;
       for (let vnfKey in serviceVNFsInstances) {
-        if (serviceVNFsInstances[vnfKey].originalName === vnfOriginalModelName) {
+        if (this._sharedTreeService.modelUniqueId(serviceVNFsInstances[vnfKey]) === vnfModelUniqueId) {
           serviceVNFsInstances[vnfKey].vnfStoreKey = vnfKey;
           result.push(serviceVNFsInstances[vnfKey]);
         }
@@ -297,13 +301,16 @@ export class VFModuleModelInfo implements ILevelNodeInfo {
   }
 
   isVFModuleReachedLimit(node: any, serviceHierarchy: any, serviceModelId: string, currentNodeCount: number): boolean {
-    let maxNodes: number = 1;
+    const flags = this._featureFlagsService.getAllFlags();
     let vnfModules = serviceHierarchy[serviceModelId].vfModules;
-    if (vnfModules[node.data.name]) {
-      maxNodes = vnfModules[node.data.name].properties.maxCountInstances || 1;
+    const maxInstances = vnfModules[node.data.name]
+      ? Utils.getMaxVfModule(vnfModules[node.data.name].properties, flags)
+      : null;
+    if (_.isNil(maxInstances)) {
+      return false;
     }
-    return !(maxNodes > currentNodeCount);
 
+    return !(maxInstances > currentNodeCount);
   }
 
   getMenuAction(node: ITreeNode, serviceModelId: string): { [methodName: string]: { method: Function, visible: Function, enable: Function } } {
@@ -344,22 +351,22 @@ export class VFModuleModelInfo implements ILevelNodeInfo {
       },
       delete: {
         method: (node, serviceModelId) => {
-          this._store.dispatch(deleteActionVfModuleInstance(node.data.dynamicModelName, node.parent.data.vnfStoreKey, serviceModelId))
+          this._store.dispatch(deleteActionVfModuleInstance(node.data.dynamicModelName, node.parent.data.vnfStoreKey, serviceModelId, node.data.modelName))
         },
-        visible: (node) => this._sharedTreeService.shouldShowDelete(node),
-        enable: (node) => this._sharedTreeService.shouldShowDelete(node)
+        visible: (node) => this._sharedTreeService.shouldShowDelete(node, serviceModelId),
+        enable: (node) => this._sharedTreeService.shouldShowDelete(node, serviceModelId)
       },
       undoDelete: {
         method: (node, serviceModelId) => {
-          this._store.dispatch(undoDeleteVfModuleInstance(node.data.dynamicModelName, node.parent.data.vnfStoreKey, serviceModelId))
+          this._store.dispatch(undoDeleteVfModuleInstance(node.data.dynamicModelName, node.parent.data.vnfStoreKey, serviceModelId));
+          this._store.dispatch(deleteVFModuleField(node.data.modelName,  node.parent.data.vnfStoreKey, node.data.servicedId ,node.data.dynamicModelName, 'retainAssignments'));
         },
         visible: (node) => this._sharedTreeService.shouldShowUndoDelete(node),
-        enable: (node, serviceModelId) => this._sharedTreeService.shouldShowUndoDelete(node) && this._sharedTreeService.shouldShowDelete(node.parent) && !this._sharedTreeService.isServiceOnDeleteMode(serviceModelId)
+        enable: (node, serviceModelId) => this._sharedTreeService.shouldShowUndoDelete(node) && this._sharedTreeService.shouldShowDelete(node.parent, serviceModelId) && !this._sharedTreeService.isServiceOnDeleteMode(serviceModelId)
       },
-      upgrade : {
-        method : (node, serviceModelId) => {
-          this._sharedTreeService.upgradeBottomUp(node, serviceModelId);
-          this._store.dispatch(upgradeVFModule(node.data.modelName,  node.parent.data.vnfStoreKey, serviceModelId, node.data.dynamicModelName));
+      upgrade: {
+        method: (node, serviceModelId) => {
+          this.upgradeVFM(serviceModelId, node);
         },
         visible: (node,serviceModelId) => {
           return this._sharedTreeService.shouldShowUpgrade(node, serviceModelId);
@@ -371,7 +378,7 @@ export class VFModuleModelInfo implements ILevelNodeInfo {
       undoUpgrade: {
         method: (node, serviceModelId) => {
           this._sharedTreeService.undoUpgradeBottomUp(node, serviceModelId);
-          this._store.dispatch(undoUgradeVFModule(node.data.modelName,  node.parent.data.vnfStoreKey, serviceModelId, node.data.dynamicModelName));
+          this._store.dispatch(undoUgradeVFModule(node.data.modelName, node.parent.data.vnfStoreKey, serviceModelId, node.data.dynamicModelName));
         },
         visible: (node) => {
           return this._sharedTreeService.shouldShowUndoUpgrade(node);
@@ -383,7 +390,31 @@ export class VFModuleModelInfo implements ILevelNodeInfo {
     };
   }
 
-  updatePosition(that , node, instanceId, parentStoreKey): void {
+  private upgradeVFM(serviceModelId, node) {
+    if (FeatureFlagsService.getFlagState(Features.FLAG_2002_VFM_UPGRADE_ADDITIONAL_OPTIONS, this._store)) {
+      this._iframeService.addClassOpenModal('content');
+      this._dialogService.addDialog(GenericFormPopupComponent, {
+        type: PopupType.VF_MODULE_UPGRADE,
+        uuidData: <any>{
+          serviceId: serviceModelId,
+          modelName: node.data.modelName,
+          vFModuleStoreKey: node.data.dynamicModelName,
+          vnfStoreKey: node.parent.data.vnfStoreKey,
+          modelId: node.data.modelId,
+          type: node.data.type,
+          popupService: this._vfModuleUpgradePopupService,
+          vfModule : _.cloneDeep(node)
+        },
+        node,
+        isUpdateMode: true
+      });
+    } else {
+      this._sharedTreeService.upgradeBottomUp(node, serviceModelId);
+      this._store.dispatch(upgradeVFModule(node.data.modelName,  node.parent.data.vnfStoreKey, serviceModelId ,node.data.dynamicModelName));
+    }
+  }
+
+  updatePosition(that, node, instanceId, parentStoreKey): void {
     that.store.dispatch(updateVFModulePosition(node, instanceId, parentStoreKey));
   }
 
@@ -392,15 +423,15 @@ export class VFModuleModelInfo implements ILevelNodeInfo {
     return (!_.isNil(instance) && !_.isNil(instance[deepDynamicName])) ? instance[deepDynamicName].position : null;
   }
 
-  getInfo(model, instance): ModelInformationItem[] {
-    const modelInformation = !_.isEmpty(model) && !_.isEmpty(model.properties) ? [
-      ModelInformationItem.createInstance("Base module", model.properties.baseModule),
-      ModelInformationItem.createInstance("Min instances", !_.isNull(model.properties.minCountInstances)? String(model.properties.minCountInstances): null),
-      ModelInformationItem.createInstance("Max instances", !_.isNull(model.properties.maxCountInstances)? String(model.properties.maxCountInstances): null),
-      ModelInformationItem.createInstance("Initial instances count", !_.isNull(model.properties.initialCount)? String(model.properties.initialCount): null)
+  getInfo(model:Partial<VfModule>, instance): ModelInformationItem[] {
+    const modelInformation = !_.isEmpty(model) ? [
+      ModelInformationItem.createInstance("Base module", model.baseModule),
+      ModelInformationItem.createInstance("Min instances", !_.isNull(model.min) ? String(model.min) : null),
+      this._sharedTreeService.createMaximumToInstantiateModelInformationItem(model),
+      ModelInformationItem.createInstance("Initial instances count", !_.isNull(model.initial) ? String(model.initial) : null)
     ] : [];
 
-    const instanceInfo =  [];
+    const instanceInfo = [];
     const result = [modelInformation, instanceInfo];
     return _.uniq(_.flatten(result));
   }