Upgrade vfModule popup: show modelVersionId and invariantiD from instance or model.
[vid.git] / vid-webpack-master / src / app / drawingBoard / service-planning / objectsToTree / shared.tree.service.ts
index 83691cf..1e85127 100644 (file)
@@ -19,7 +19,6 @@ import {NodeInstance} from "../../../shared/models/nodeInstance";
 
 @Injectable()
 export class SharedTreeService {
-  private _sharedTreeService: SharedTreeService;
   constructor(private _store: NgRedux<AppState>) {
   }
 
@@ -54,8 +53,18 @@ export class SharedTreeService {
       : (nodeInstance.modelInfo.modelCustomizationId || nodeInstance.modelInfo.modelInvariantId);
   };
 
-  modelUniqueNameOrId = (instance): string =>
-    instance.originalName ? instance.originalName : this.modelUniqueId(instance);
+  modelUniqueNameOrId = (instance): string => {
+    if (_.isNil(instance)) {
+      return null;
+    }
+
+    const innerInstance = _.find(instance) || {};
+
+    return instance.originalName
+      || this.modelUniqueId(instance)
+      || innerInstance.originalName
+      || this.modelUniqueId(innerInstance);
+  };
 
   /**
    * Finds a model inside a full service model
@@ -63,12 +72,12 @@ export class SharedTreeService {
    * @param modelTypeName "vnfs" | "networks" | "vfModules" | "collectionResources" | ...
    * @param modelUniqueNameOrId Either an entry name (i.e. "originalName"), modelCustomizationId or modelInvariantId.
    *                      Note that modelInvariantId will work only where model lacks a modelCustomizationId.
-   * @param modeName An optional entry name (i.e. "originalName"); will not try to use as id
+   * @param modelName An optional entry name (i.e. "originalName"); will not try to use as id
    */
-  modelByIdentifiers = (serviceModelFromHierarchy, modelTypeName: string, modelUniqueNameOrId: string, modeName?: string): any => {
+  modelByIdentifiers = (serviceModelFromHierarchy, modelTypeName: string, modelUniqueNameOrId: string, modelName?: string): any => {
     const logErrorAndReturnUndefined = () =>
       console.info(`modelByIdentifiers: could not find a model matching query`, {
-        modelTypeName, modelUniqueNameOrId, modeName, serviceModelFromHierarchy
+        modelTypeName, modelUniqueNameOrId, modelName, serviceModelFromHierarchy
       });
 
     if (_.isNil(serviceModelFromHierarchy)) return logErrorAndReturnUndefined();
@@ -77,7 +86,7 @@ export class SharedTreeService {
     if (_.isNil(modelsOfType)) return logErrorAndReturnUndefined();
 
     const modelIfModelIdentifierIsEntryName = modelsOfType[modelUniqueNameOrId];
-    const modelIfModeNameExists = _.isNil(modeName) ? null : modelsOfType[modeName];
+    const modelIfModeNameExists = _.isNil(modelName) ? null : modelsOfType[modelName];
 
     if (!_.isNil(modelIfModelIdentifierIsEntryName)) {
       return modelIfModelIdentifierIsEntryName;
@@ -207,28 +216,64 @@ export class SharedTreeService {
    * should return true if customer can upgrade a VFM *
    ****************************************************/
   shouldShowUpgrade(node, serviceModelId): boolean {
-    if (FeatureFlagsService.getFlagState(Features.FLAG_FLASH_REPLACE_VF_MODULE, this._store) &&
-      (this.isThereAnUpdatedLatestVersion(serviceModelId)) || this.isDiffCustomizationUuid(node, serviceModelId)) {
-      return this.shouldShowButtonGeneric(node, VNFMethods.UPGRADE, serviceModelId);
+      return (this.isVfMoudleCouldBeUpgraded(node, serviceModelId))
+        && this.shouldShowButtonGeneric(node, VNFMethods.UPGRADE, serviceModelId) ;
     }
-    else {
-      return false
+
+  isVfMoudleCouldBeUpgraded(node, serviceModelId): boolean{
+    return (FeatureFlagsService.getFlagState(Features.FLAG_FLASH_REPLACE_VF_MODULE, this._store) &&
+      (this.isThereAnUpdatedLatestVersion(serviceModelId) || this.isVfModuleCustomizationIdNotExistsOnModel(node, serviceModelId)))
+  }
+
+  isVfModuleCustomizationIdNotExistsOnModel(vfModuleNode, serviceModelId) {
+
+    // prevent undefined
+    if (_.isNil(vfModuleNode.data) || _.isNil(vfModuleNode.data.modelCustomizationId)) {
+      return false;
     }
+
+    let vfModulesHierarchyByGivenModelId = this._store.getState().service.serviceHierarchy[serviceModelId].vfModules;
+    return  !_.some(vfModulesHierarchyByGivenModelId, vfmodel => vfmodel.customizationUuid === vfModuleNode.data.modelCustomizationId);
   }
 
 
-  isDiffCustomizationUuid(node, serviceModelId) : boolean {
-    const vfModuleServiceHierarchy =  this.getVfModuleHierarchyThroughParentModelName(node, serviceModelId);
-    if(_.isNil(vfModuleServiceHierarchy)){
-      return true;
+  isVfmoduleAlmostPartOfModelOnlyCustomizationUuidDiffer(vfModuleNode, serviceModelId) : boolean {
+    /*
+    for `true`, should all:
+    1. parent vnf found by model-mane
+    2. vfmodule found by invariant
+    3. vfmodule diff by customization
+     */
+
+    if (_.isNil(vfModuleNode.data)) {
+      return false;
+    }
+
+    const vnfHierarchy = this.getParentVnfHierarchy(vfModuleNode, serviceModelId);
+    if (_.isNil(vnfHierarchy)) {
+      return false;
+    }
+
+    const vfModuleHierarchyByInvariantId =  this.getVfModuleHFromVnfHierarchyByInvariantId(vfModuleNode, vnfHierarchy);
+    if(_.isNil(vfModuleHierarchyByInvariantId)){
+      return false;
     }
-    return node.data && !_.isNil(vfModuleServiceHierarchy) && vfModuleServiceHierarchy.customizationUuid  && (vfModuleServiceHierarchy.customizationUuid !== node.data.modelCustomizationId);
+
+    return vfModuleHierarchyByInvariantId.customizationUuid
+      && (vfModuleHierarchyByInvariantId.customizationUuid !== vfModuleNode.data.modelCustomizationId);
   }
 
-  getVfModuleHierarchyThroughParentModelName(node, serviceModelId) {
-    if(node.parent && node.parent.data && node.data){
-      const vnfHierarchy =  this._store.getState().service.serviceHierarchy[serviceModelId].vnfs[node.parent.data.modelName];
-      return vnfHierarchy ? vnfHierarchy.vfModules[node.data.modelName] : null;
+  getParentVnfHierarchy(vfModuleNode, serviceModelId) {
+    if (vfModuleNode.parent && vfModuleNode.parent.data) {
+      return this._store.getState().service.serviceHierarchy[serviceModelId].vnfs[vfModuleNode.parent.data.modelName];
+    } else {
+      return null;
+    }
+  }
+
+  getVfModuleHFromVnfHierarchyByInvariantId(vfModuleNode, parentVnfHierarchy) {
+    if(vfModuleNode.data.modelInvariantId && parentVnfHierarchy && parentVnfHierarchy.vfModules){
+      return _.find(parentVnfHierarchy.vfModules, o => o.invariantUuid === vfModuleNode.data.modelInvariantId);
     }
     return null;
   }
@@ -421,22 +466,55 @@ export class SharedTreeService {
     AuditInfoModalComponent.openInstanceAuditInfoModal.next({
       instanceId: serviceModelId,
       type: instanceType,
-      model: modelInfoService.getModel(node.data.modelName, instance, this._store.getState().service.serviceHierarchy[serviceModelId]),
+      model: modelInfoService.getModel(
+        this.modelByIdentifiers(
+          this._store.getState().service.serviceHierarchy[serviceModelId],
+          modelInfoService.name,
+          this.modelUniqueNameOrId(instance), node.data.modelName
+        )
+      ),
       instance
     });
   }
 
+  getModelVersionEitherFromInstanceOrFromHierarchy(selectedNodeData, model): string | undefined {
+    return this.getNamedFieldFromInstanceOrFromHierarchy(selectedNodeData, "modelVersion", model, "version");
+  }
+
+  getModelCustomizationIdEitherFromInstanceOrFromHierarchy(selectedNodeData, model): string | undefined {
+    return this.getNamedFieldFromInstanceOrFromHierarchy(selectedNodeData, "modelCustomizationId", model, "customizationUuid");
+  }
+
+  getModelInvariantIdEitherFromInstanceOrFromHierarchy(selectedNodeData, model): string | undefined {
+    return this.getNamedFieldFromInstanceOrFromHierarchy(selectedNodeData, "modelInvariantId", model, "invariantUuid");
+  }
+
+  getModelVersionIdEitherFromInstanceOrFromHierarchy(selectedNodeData, model): string | undefined {
+    return this.getNamedFieldFromInstanceOrFromHierarchy (selectedNodeData, "modelVersionId", model, "uuid");
+  }
+
+
+
+  getNamedFieldFromInstanceOrFromHierarchy(selectedNodeData, instanceModelInfoFieldName, model, modelFieldName): string | undefined {
+    if (instanceModelInfoFieldName && selectedNodeData && selectedNodeData.instanceModelInfo
+      && selectedNodeData.instanceModelInfo[instanceModelInfoFieldName]) {
+      return selectedNodeData.instanceModelInfo[instanceModelInfoFieldName];
+    } else if (modelFieldName && model && model[modelFieldName]) {
+      return model[modelFieldName];
+    }
+    return undefined;
+  }
 
-  addGeneralInfoItems(modelInfoSpecificItems: ModelInformationItem[], type: ComponentInfoType, model, instance):ComponentInfoModel {
+  addGeneralInfoItems(modelInfoSpecificItems: ModelInformationItem[], type: ComponentInfoType, model, selectedNodeData):ComponentInfoModel {
     let modelInfoItems: ModelInformationItem[] = [
-      ModelInformationItem.createInstance("Model version", model ? model.version : null),
-      ModelInformationItem.createInstance("Model customization ID", model ? model.customizationUuid : null),
-      ModelInformationItem.createInstance("Instance ID", instance ? instance.instanceId : null),
-      ModelInformationItem.createInstance("Instance type", instance ? instance.instanceType : null),
-      ModelInformationItem.createInstance("In maintenance", instance? instance.inMaint : null),
+      ModelInformationItem.createInstance("Model version", this.getModelVersionEitherFromInstanceOrFromHierarchy(selectedNodeData, model)),
+      ModelInformationItem.createInstance("Model customization ID", this.getModelCustomizationIdEitherFromInstanceOrFromHierarchy(selectedNodeData, model)),
+      ModelInformationItem.createInstance("Instance ID", selectedNodeData ? selectedNodeData.instanceId : null),
+      ModelInformationItem.createInstance("Instance type", selectedNodeData ? selectedNodeData.instanceType : null),
+      ModelInformationItem.createInstance("In maintenance", selectedNodeData? selectedNodeData.inMaint : null),
     ];
     modelInfoItems = modelInfoItems.concat(modelInfoSpecificItems);
-    return this.getComponentInfoModelByModelInformationItems(modelInfoItems, type, instance);
+    return this.getComponentInfoModelByModelInformationItems(modelInfoItems, type, selectedNodeData);
   }
 
   getComponentInfoModelByModelInformationItems(modelInfoItems: ModelInformationItem[], type: ComponentInfoType, instance){