originalName may be model's "entry name", customizationId or invariantId 36/100536/2
authorIttay Stern <ittay.stern@att.com>
Tue, 21 Jan 2020 10:20:37 +0000 (12:20 +0200)
committerIttay Stern <ittay.stern@att.com>
Tue, 21 Jan 2020 13:48:40 +0000 (15:48 +0200)
The classic originalName is the "entry name". So two more options
were added through SharedTreeService::modelByIdentifier()
function.

Issue-ID: VID-724

Change-Id: I9f192d2b24c9c1659a95baabd21252bed392e9da
Signed-off-by: Ittay Stern <ittay.stern@att.com>
21 files changed:
vid-automation/src/test/resources/asyncInstantiation/templates__instance_from_template__set_without_modify1.json
vid-automation/src/test/resources/asyncInstantiation/templates__instance_template.json
vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/collectionResource/collectionResource.model.info.spec.ts
vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/collectionResource/collectionResource.model.info.ts
vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/configuration/configuration.model.info.spec.ts
vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/configuration/configuration.model.info.ts
vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/network/network.model.info.ts
vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/pnf/pnf.model.info.spec.ts
vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/pnf/pnf.model.info.ts
vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/relatedVnfMember/relatedVnfMember.info.model.ts
vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vfModule/vfModule.model.info.ts
vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vnf/vnf.model.info.ts
vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vnfGrouping/vnfGrouping.model.info.ts
vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vrf/vrf.model.info.ts
vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToTree.service.ts
vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/shared.tree.service.spec.ts
vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/shared.tree.service.ts
vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator.spec.ts
vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator.ts
vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.service.spec.ts
vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popup.service.spec.ts

index d2e1d6d..15d506b 100644 (file)
@@ -75,7 +75,7 @@
       "action": "Create",
       "instanceId": null,
       "instanceName": "hvf6arlba007",
-      "originalName": "vProbe_NC_VNF 0",
+      "originalName": "024a417d-ca46-40bf-95ce-809c6a269011",
       "vnfStoreKey": "vProbe_NC_VNF 0",
       "instanceParams": [
         {
       },
       "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89",
       "instanceName": "hvf6arlba008",
-      "originalName": "vProbe_NC_VNF 0",
+      "originalName": "024a417d-ca46-40bf-95ce-809c6a269011",
       "vnfStoreKey": "vProbe_NC_VNF 0_1",
       "action": "Create",
       "platformName": "xxx1",
index 296ad31..daccff0 100644 (file)
@@ -45,7 +45,7 @@
       },
       "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89",
       "instanceName": "hvf6arlba007",
-      "originalName": "vProbe_NC_VNF 0",
+      "originalName": "024a417d-ca46-40bf-95ce-809c6a269011",
       "action": "Create",
       "platformName": "xxx1",
       "lcpCloudRegionId": "hvf6",
       },
       "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89",
       "instanceName": "hvf6arlba008",
-      "originalName": "vProbe_NC_VNF 0",
+      "originalName": "024a417d-ca46-40bf-95ce-809c6a269011",
       "action": "Create",
       "platformName": "xxx1",
       "lcpCloudRegionId": "hvf6",
index f8ce819..f3f9518 100644 (file)
@@ -24,7 +24,7 @@ describe('Collection Resource Model Info', () => {
   let collectionResourceModel: CollectionResourceModelInfo;
   let  _sharedTreeService : SharedTreeService;
 
-  beforeEach(() => {
+  beforeEach(done => (async () => {
     TestBed.configureTestingModule({
       imports: [HttpClientTestingModule, NgReduxTestingModule],
       providers: [
@@ -38,16 +38,17 @@ describe('Collection Resource Model Info', () => {
         FeatureFlagsService,
         ComponentInfoService,
         IframeService]
-    }).compileComponents();
-
+    });
+    await TestBed.compileComponents();
     injector = getTestBed();
     _store = injector.get(NgRedux);
     _componentInfoService = injector.get(ComponentInfoService);
+    _sharedTreeService = injector.get(SharedTreeService);
 
     collectionResourceModel = new CollectionResourceModelInfo(_store, _sharedTreeService);
 
 
-  });
+  })().then(done).catch(done.fail));
 
   test('collection resource should be defined', () => {
     expect(collectionResourceModel).toBeDefined();
index 564e04b..339951d 100644 (file)
@@ -30,7 +30,7 @@ export class CollectionResourceModelInfo implements ILevelNodeInfo{
 
   getModel = (collectionResourceModelId: string, instance: CollectionResourceInstance, serviceHierarchy): CollectionResourceModel => {
     const originalModelName = instance.originalName ? instance.originalName : collectionResourceModelId;
-    return new CollectionResourceModel(serviceHierarchy[this.name][originalModelName]);
+    return new CollectionResourceModel(this._sharedTreeService.modelByIdentifier(serviceHierarchy, this.name, originalModelName));
   };
 
 
index 6b67de6..d1d6817 100644 (file)
@@ -1,11 +1,12 @@
 import {HttpClientTestingModule} from "@angular/common/http/testing";
-import {TestBed} from "@angular/core/testing";
+import {getTestBed, TestBed} from "@angular/core/testing";
 import {MockNgRedux, NgReduxTestingModule} from "@angular-redux/store/testing";
 import {DynamicInputsService} from "../../dynamicInputs.service";
 import {ConfigurationModelInfo} from "./configuration.model.info";
 import {SharedTreeService} from "../../shared.tree.service";
 
 describe('Vnf Model Info', () => {
+  let injector;
   let  _dynamicInputsService : DynamicInputsService;
   let  _sharedTreeService : SharedTreeService;
 
@@ -18,6 +19,9 @@ describe('Vnf Model Info', () => {
         DynamicInputsService]
     });
     await TestBed.compileComponents();
+
+    injector = getTestBed();
+    _sharedTreeService = injector.get(SharedTreeService);
   })().then(done).catch(done.fail));
 
   test('ConfigurationModelInfo should be defined', () => {
index 0d1a9aa..d9702b4 100644 (file)
@@ -31,10 +31,9 @@ export class ConfigurationModelInfo implements ILevelNodeInfo{
    * @param serviceHierarchy - serviceHierarchy
    ************************************************************/
   getModel = (configurationModelId : string, serviceHierarchy) : any =>{
-    if(!_.isNil(serviceHierarchy)){
-      if(!_.isNil(serviceHierarchy[this.name]) && !_.isNil(serviceHierarchy[this.name][configurationModelId])){
-        return serviceHierarchy[this.name][configurationModelId];
-      }
+    const model = this._sharedTreeService.modelByIdentifier(serviceHierarchy, this.name, configurationModelId);
+    if (!_.isNil(model)) {
+      return model;
     }
     return {};
   };
index b03d37f..7c240a9 100644 (file)
@@ -7,7 +7,10 @@ import {SharedTreeService} from "../../shared.tree.service";
 import {InputType} from "../../../../../shared/models/inputTypes";
 import {NgRedux} from "@angular-redux/store";
 import {AppState} from "../../../../../shared/store/reducers";
-import {GenericFormPopupComponent, PopupType} from "../../../../../shared/components/genericFormPopup/generic-form-popup.component";
+import {
+  GenericFormPopupComponent,
+  PopupType
+} from "../../../../../shared/components/genericFormPopup/generic-form-popup.component";
 import {DialogService} from "ng2-bootstrap-modal";
 import {NetworkPopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/network/network.popup.service";
 import * as _ from "lodash";
@@ -18,7 +21,11 @@ import {changeInstanceCounter, removeInstance} from "../../../../../shared/store
 import {IframeService} from "../../../../../shared/utils/iframe.service";
 import {DuplicateService} from "../../../duplicate/duplicate.service";
 import {ServiceInstanceActions} from "../../../../../shared/models/serviceInstanceActions";
-import {deleteActionNetworkInstance, undoDeleteActionNetworkInstance, updateNetworkPosition} from "../../../../../shared/storeUtil/utils/network/network.actions";
+import {
+  deleteActionNetworkInstance,
+  undoDeleteActionNetworkInstance,
+  updateNetworkPosition
+} from "../../../../../shared/storeUtil/utils/network/network.actions";
 import {IModalConfig} from "onap-ui-angular/dist/modals/models/modal-config";
 import {ComponentInfoType} from "../../../component-info/component-info-model";
 import {ModelInformationItem} from "../../../../../shared/components/model-information/model-information.component";
@@ -65,7 +72,9 @@ export class NetworkModelInfo implements ILevelNodeInfo {
    ************************************************************/
   getModel = (networkModelId: string, instance: NetworkInstance, serviceHierarchy): NetworkModel => {
     const originalModelName = instance.originalName ? instance.originalName : networkModelId;
-    return new NetworkModel(serviceHierarchy[this.name][originalModelName], this._featureFlagsService.getAllFlags());
+    return new NetworkModel(
+      this._sharedTreeService.modelByIdentifier(serviceHierarchy, this.name, originalModelName),
+      this._featureFlagsService.getAllFlags());
   };
 
 
index ca041e0..8a09372 100644 (file)
@@ -20,8 +20,9 @@ describe('PNF model info', () => {
   let injector;
   let _componentInfoService: ComponentInfoService;
   let _store: NgRedux<AppState>;
-  let pnfModel: PnfModelInfo =  new PnfModelInfo();
-  beforeEach(() => {
+  let _sharedTreeService;
+  let pnfModel: PnfModelInfo;
+  beforeEach(done => (async () => {
     TestBed.configureTestingModule({
       imports: [HttpClientTestingModule, NgReduxTestingModule],
       providers: [
@@ -35,12 +36,14 @@ describe('PNF model info', () => {
         FeatureFlagsService,
         ComponentInfoService,
         IframeService]
-    }).compileComponents();
-
+    });
+    await TestBed.compileComponents();
     injector = getTestBed();
     _store = injector.get(NgRedux);
+    _sharedTreeService = injector.get(SharedTreeService);
+    pnfModel = new PnfModelInfo(_sharedTreeService);
     _componentInfoService = injector.get(ComponentInfoService);
-  });
+  })().then(done).catch(done.fail));
 
   test('pnf model should be defined', () => {
     expect(pnfModel).toBeDefined();
index dc01b87..05e05a7 100644 (file)
@@ -6,11 +6,14 @@ import {AvailableNodeIcons} from "../../../available-models-tree/available-model
 import {PnfInstance} from "app/shared/models/pnfInstance";
 import {PNFModel} from "../../../../../shared/models/pnfModel";
 import {PnfTreeNode} from "../../../../../shared/models/pnfTreeNode";
+import {SharedTreeService} from "../../shared.tree.service";
 
 
 export class PnfModelInfo implements ILevelNodeInfo{
 
-  constructor(){}
+  constructor(
+    private _sharedTreeService: SharedTreeService,
+  ){}
 
   name: string = 'pnfs';
   type: string ='PNF';
@@ -30,7 +33,7 @@ export class PnfModelInfo implements ILevelNodeInfo{
 
   getModel = (pnfModelId: string, instance: PnfInstance, serviceHierarchy): PNFModel => {
     const originalModelName = instance.originalName ? instance.originalName : pnfModelId;
-    return new PNFModel(serviceHierarchy[this.name][originalModelName]);
+    return new PNFModel(this._sharedTreeService.modelByIdentifier(serviceHierarchy, this.name, originalModelName));
   };
 
   getNextLevelObject(): any { return null;  }
index c8807e8..86455ce 100644 (file)
@@ -55,7 +55,7 @@ export class RelatedVnfMemberInfoModel implements ILevelNodeInfo {
    ************************************************************/
   getModel = (vnfModelId: string, instance: VnfInstance, serviceHierarchy): VNFModel => {
     const originalModelName = instance.originalName ? instance.originalName : vnfModelId;
-    return new VNFModel(serviceHierarchy[this.name][originalModelName]);
+    return new VNFModel(this._sharedTreeService.modelByIdentifier(serviceHierarchy, this.name, originalModelName));
   };
 
 
index 36b5ed0..1b92eb8 100644 (file)
@@ -79,10 +79,9 @@ export class VFModuleModelInfo implements ILevelNodeInfo {
    * @param serviceHierarchy - serviceHierarchy
    ************************************************************/
   getModel = (vfModuleModelId: string, instance, serviceHierarchy): Partial<VfModule> => {
-    if (!_.isNil(serviceHierarchy)) {
-      if (!_.isNil(serviceHierarchy[this.name]) && !_.isNil(serviceHierarchy[this.name][vfModuleModelId])) {
-        return new VfModule(serviceHierarchy[this.name][vfModuleModelId], this._featureFlagsService.getAllFlags());
-      }
+    const model = this._sharedTreeService.modelByIdentifier(serviceHierarchy, this.name, vfModuleModelId);
+    if (!_.isNil(model)) {
+      return new VfModule(model, this._featureFlagsService.getAllFlags());
     }
     return {};
   };
index c3c33a1..1215bb8 100644 (file)
@@ -9,7 +9,10 @@ import {SharedTreeService} from "../../shared.tree.service";
 import {NgRedux} from "@angular-redux/store";
 import {AppState} from "../../../../../shared/store/reducers";
 import {DefaultDataGeneratorService} from "../../../../../shared/services/defaultDataServiceGenerator/default.data.generator.service";
-import {GenericFormPopupComponent, PopupType} from "../../../../../shared/components/genericFormPopup/generic-form-popup.component";
+import {
+  GenericFormPopupComponent,
+  PopupType
+} from "../../../../../shared/components/genericFormPopup/generic-form-popup.component";
 import {DialogService} from 'ng2-bootstrap-modal';
 import {VnfPopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service";
 import {VfModulePopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popup.service";
@@ -17,13 +20,18 @@ import {ITreeNode} from "angular-tree-component/dist/defs/api";
 import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service";
 import {DuplicateService} from "../../../duplicate/duplicate.service";
 import {DuplicateVnfComponent} from "../../../duplicate/duplicate-vnf.component";
-import {SdcUiServices} from "onap-ui-angular";
 import {IframeService} from "../../../../../shared/utils/iframe.service";
 import {changeInstanceCounter, removeInstance} from "../../../../../shared/storeUtil/utils/general/general.actions";
 import {MessageBoxData} from "../../../../../shared/components/messageBox/messageBox.data";
 import {MessageBoxService} from "../../../../../shared/components/messageBox/messageBox.service";
 import {ServiceInstanceActions} from "../../../../../shared/models/serviceInstanceActions";
-import {deleteActionVnfInstance, undoDeleteActionVnfInstance, undoUpgradeVnf, updateVnfPosition, upgradeVnf} from "../../../../../shared/storeUtil/utils/vnf/vnf.actions";
+import {
+  deleteActionVnfInstance,
+  undoDeleteActionVnfInstance,
+  undoUpgradeVnf,
+  updateVnfPosition,
+  upgradeVnf
+} from "../../../../../shared/storeUtil/utils/vnf/vnf.actions";
 import * as _ from 'lodash';
 import {IModalConfig} from "onap-ui-angular/dist/modals/models/modal-config";
 import {ComponentInfoType} from "../../../component-info/component-info-model";
@@ -81,7 +89,9 @@ export class VnfModelInfo implements ILevelNodeInfo {
    ************************************************************/
   getModel = (vnfModelId: string, instance: VnfInstance, serviceHierarchy): VNFModel => {
     const originalModelName = instance.originalName ? instance.originalName : vnfModelId;
-    return new VNFModel(serviceHierarchy[this.name][originalModelName], this._featureFlagsService.getAllFlags());
+    return new VNFModel(
+      this._sharedTreeService.modelByIdentifier(serviceHierarchy, this.name, originalModelName),
+      this._featureFlagsService.getAllFlags());
   };
 
 
index 148ce22..fa785bc 100644 (file)
@@ -97,7 +97,7 @@ export class VnfGroupingModelInfo implements ILevelNodeInfo {
 
   getModel(modelId: string, instance: any, serviceHierarchy): any {
     const originalModelName = instance.originalName ? instance.originalName : modelId;
-    return new VnfGroupModel(serviceHierarchy[this.name][originalModelName]);
+    return new VnfGroupModel(this._sharedTreeService.modelByIdentifier(serviceHierarchy, this.name, originalModelName));
   }
 
   hasMissingData(instance, dynamicInputs: any, isEcompGeneratedNaming: boolean): boolean {
index 3dbc60a..03f6021 100644 (file)
@@ -52,7 +52,7 @@ export class VrfModelInfo implements ILevelNodeInfo {
 
   getModel = (vrfModelId: string, instance: VrfInstance, serviceHierarchy): VrfModel => {
     const originalModelName = instance.originalName ? instance.originalName : vrfModelId;
-    return new VrfModel(serviceHierarchy[this.name][originalModelName]);
+    return new VrfModel(this._sharedTreeService.modelByIdentifier(serviceHierarchy, this.name, originalModelName));
   };
 
 
index 8eef4a0..a70b7ef 100644 (file)
@@ -23,7 +23,7 @@ import {AaiService} from "../../../shared/services/aaiService/aai.service";
 import {VrfModelInfo} from "./models/vrf/vrf.model.info";
 import {NetworkStepService} from "./models/vrf/vrfModal/networkStep/network.step.service";
 import {VpnStepService} from "./models/vrf/vrfModal/vpnStep/vpn.step.service";
-import { VfModuleUpgradePopupService } from "../../../shared/components/genericFormPopup/genericFormServices/vfModuleUpgrade/vfModule.upgrade.popuop.service";
+import {VfModuleUpgradePopupService} from "../../../shared/components/genericFormPopup/genericFormServices/vfModuleUpgrade/vfModule.upgrade.popuop.service";
 import {FeatureFlagsService} from "../../../shared/services/featureFlag/feature-flags.service";
 import {ModalService} from "../../../shared/components/customModal/services/modal.service";
 
@@ -56,7 +56,7 @@ export class ObjectToTreeService {
   getFirstLevelOptions(): ILevelNodeInfo[] {
     return [new VnfModelInfo(this._dynamicInputsService, this._sharedTreeService, this._defaultDataGeneratorService, this._dialogService, this._vnfPopupService, this._vfModulePopupService, this._vfModuleUpgradePopupService,this._duplicateService, this._modalService, this._iframeService, this._componentInfoService, this._featureFlagsService, this._store)
       , new NetworkModelInfo(this._dynamicInputsService, this._sharedTreeService, this._dialogService, this._networkPopupService, this._duplicateService, this._modalService, this._iframeService,  this._featureFlagsService, this._store),
-      new PnfModelInfo(),
+      new PnfModelInfo(this._sharedTreeService),
       new VrfModelInfo(this._store, this._sharedTreeService, this._dialogService, this._iframeService, this._featureFlagsService, this._networkStepService, this._vpnStepService),
       new CollectionResourceModelInfo(this._store, this._sharedTreeService),
       new ConfigurationModelInfo(this._dynamicInputsService, this._sharedTreeService),
index f89950c..87094e3 100644 (file)
@@ -166,6 +166,36 @@ describe('Shared Tree Service', () => {
     expect(MessageBoxService.openModal.next).toHaveBeenCalled();
   });
 
+  each([
+    ['volumeGroups by entry name', "volumeGroups",
+      "2017488_pasqualevpe0..2017488PasqualeVpe..PASQUALE_vRE_BV..module-1", "2017488PasqualeVpe..PASQUALE_vRE_BV..module-1"],
+    ['vfmodule by customizationUuid', "vfModules",
+      "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401", "2017488PasqualeVpe..PASQUALE_vRE_BV..module-1"],
+    ['vnf by customizationUuid', "vnfs",
+      "1da7b585-5e61-4993-b95e-8e6606c81e45", "2017-488_PASQUALE-vPE 0"],
+    ['vnfGroups by invariantUuid because no customizationUuid', "vnfGroups",
+      "4bb2e27e-ddab-4790-9c6d-1f731bc14a45", "groupingservicefortest..ResourceInstanceGroup..0"],
+  ]).test('modelByIdentifier should success: %s', (description, modelTypeName, modelUniqueIdOrName, expectedModelCustomizationName) => {
+    let serviceModelFromHierarchy =
+      getStore().service.serviceHierarchy["1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd"];
+
+    expect(service.modelByIdentifier(serviceModelFromHierarchy, modelTypeName, modelUniqueIdOrName))
+      .toHaveProperty("modelCustomizationName", expectedModelCustomizationName);
+  });
+
+  each([
+    ['vfmodule by invariantUuid when there is customizationUuid', "vfModules", "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1"],
+    ['network by non-existing modelUniqueIdOrName', "networks", "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1"],
+    ['collectionResource has no resource', "collectionResources", "whatever"],
+    ['non-existing model-type', "fooBar", "whatever"],
+  ]).test('modelByIdentifier should fail: %s', (description, modelTypeName, modelUniqueIdOrName) => {
+    let serviceModelFromHierarchy =
+      getStore().service.serviceHierarchy["1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd"];
+
+    expect(service.modelByIdentifier(serviceModelFromHierarchy, modelTypeName, modelUniqueIdOrName))
+      .toBeUndefined();
+  });
+
   test('openAuditInfoModal should open modal for failed instance', () => {
     jest.spyOn(AuditInfoModalComponent.openInstanceAuditInfoModal, 'next');
 
index 1115d1b..6c985ec 100644 (file)
@@ -54,6 +54,25 @@ export class SharedTreeService {
       : (nodeInstance.modelInfo.modelCustomizationId || nodeInstance.modelInfo.modelInvariantId);
   };
 
+  /**
+   * Finds a model inside a full service model
+   * @param serviceModelFromHierarchy
+   * @param modelTypeName "vnfs" | "networks" | "vfModules" | "collectionResources" | ...
+   * @param modelUniqueIdOrName Either an entry name (i.e. "originalName"), modelCustomizationId or modelInvariantId.
+   *                      Note that modelInvariantId will work only where model lacks a modelCustomizationId.
+   */
+  modelByIdentifier = (serviceModelFromHierarchy, modelTypeName: string, modelUniqueIdOrName: string): any => {
+    if (_.isNil(serviceModelFromHierarchy)) return undefined;
+
+    const modelsOfType = serviceModelFromHierarchy[modelTypeName];
+    if (_.isNil(modelsOfType)) return undefined;
+
+    const modelIfModelIdentifierIsEntryName = modelsOfType[modelUniqueIdOrName];
+    return _.isNil(modelIfModelIdentifierIsEntryName)
+      ? _.find(modelsOfType, o => (o.customizationUuid || o.invariantUuid) === modelUniqueIdOrName)
+      : modelIfModelIdentifierIsEntryName;
+  };
+
   hasMissingData(instance, dynamicInputs: any, isEcompGeneratedNaming: boolean, requiredFields: string[]): boolean {
     if (!isEcompGeneratedNaming && _.isEmpty(instance.instanceName)) {
       return true;
index f3d32b9..b3bb1fe 100644 (file)
@@ -6,12 +6,17 @@ import {AaiService} from "../../../../services/aaiService/aai.service";
 import {GenericFormService} from "../../generic-form.service";
 import {FormBuilder} from "@angular/forms";
 import {LogService} from "../../../../utils/log/log.service";
-import {FormControlModel, ValidatorModel, ValidatorOptions} from "../../../../models/formControlModels/formControl.model";
+import {
+  FormControlModel,
+  ValidatorModel,
+  ValidatorOptions
+} from "../../../../models/formControlModels/formControl.model";
 import {FormControlNames, VfModuleControlGenerator} from "./vfModule.control.generator";
 import {FeatureFlagsService} from "../../../../services/featureFlag/feature-flags.service";
 import {VfModuleInstance} from "../../../../models/vfModuleInstance";
 import {VfModule} from "../../../../models/vfModule";
 import {SharedControllersService} from "../sharedControlles/shared.controllers.service";
+import {SharedTreeService} from "../../../../../drawingBoard/service-planning/objectsToTree/shared.tree.service";
 
 class MockAppStore<T> {
   getState() {
@@ -925,6 +930,7 @@ describe('VFModule Control Generator', () => {
         AaiService,
         FormBuilder,
         LogService,
+        SharedTreeService,
         {provide:FeatureFlagsService, useClass: MockFeatureFlagsService},
         {provide: NgRedux, useClass: MockAppStore}]
     });
index 60ffc3e..b00312d 100644 (file)
@@ -20,6 +20,7 @@ import {VNFModel} from "../../../../models/vnfModel";
 import {VnfInstance} from "../../../../models/vnfInstance";
 import * as _ from 'lodash';
 import {SharedControllersService} from "../sharedControlles/shared.controllers.service";
+import {SharedTreeService} from "../../../../../drawingBoard/service-planning/objectsToTree/shared.tree.service";
 
 export enum FormControlNames {
   INSTANCE_NAME = 'instanceName',
@@ -40,6 +41,7 @@ export class VfModuleControlGenerator {
   constructor(private genericFormService: GenericFormService,
               private _basicControlGenerator: ControlGeneratorUtil,
               private _sharedControllersService: SharedControllersService,
+              private _sharedTreeService: SharedTreeService,
               private store: NgRedux<AppState>,
               private http: HttpClient,
               private _aaiService: AaiService,
@@ -76,8 +78,7 @@ export class VfModuleControlGenerator {
     const vfModuleInstance = this._basicControlGenerator.retrieveInstanceIfUpdateMode(this.store, this.getVfModuleInstance(serviceId, vnfStoreKey, uuidData, isUpdateMode));
     const vfModuleModel = this.vfModuleModel;
     const vnf: VnfInstance = this.store.getState().service.serviceInstance[serviceId].vnfs[vnfStoreKey];
-    const vnfModelName: string = vnf.originalName;
-    const vnfModel = new VNFModel(this.store.getState().service.serviceHierarchy[serviceId].vnfs[vnfModelName]);
+    const vnfModel = this.newVNFModel(serviceId, vnf);
 
     let result: FormControlModel[] = [];
 
@@ -90,6 +91,14 @@ export class VfModuleControlGenerator {
     return result;
   }
 
+  private newVNFModel(serviceId: string, vnf: VnfInstance) {
+    const vnfModelName: string = vnf.originalName;
+
+    const serviceModelFromHierarchy = this.store.getState().service.serviceHierarchy[serviceId];
+    const model = this._sharedTreeService.modelByIdentifier(serviceModelFromHierarchy, "vnfs", vnfModelName);
+    return new VNFModel(model);
+  }
+
   pushInstanceAndVGToForm(result: FormControlModel[], vfModuleElement: any, serviceId: string, vnfModel: any, isALaCarte: boolean) :FormControlModel[]{
     result.push(this.getInstanceName(vfModuleElement, serviceId, vnfModel.isEcompGeneratedNaming));
     if (this.vfModuleModel.volumeGroupAllowed) {
@@ -108,8 +117,7 @@ export class VfModuleControlGenerator {
       }
     }
     const vnf: VnfInstance = this.store.getState().service.serviceInstance[serviceId].vnfs[vnfStoreKey] ;
-    const vnfModelName: string = vnf.originalName;
-    const vnfModel = new VNFModel(this.store.getState().service.serviceHierarchy[serviceId].vnfs[vnfModelName]);
+    const vnfModel = this.newVNFModel(serviceId, vnf);
 
     const vfModuleInstance = this._basicControlGenerator.retrieveInstanceIfUpdateMode(this.store, this.getVfModuleInstance(serviceId, vnfStoreKey, uuidData, isUpdateMode));
     let result: FormControlModel[] = [];
index 9680c06..e69cd56 100644 (file)
@@ -24,6 +24,7 @@ import {VfModuleUpgradePopupService} from "./genericFormServices/vfModuleUpgrade
 import {SharedControllersService} from "../genericForm/formControlsServices/sharedControlles/shared.controllers.service";
 import {AppState} from "../../store/reducers";
 import each from 'jest-each';
+import {SharedTreeService} from "../../../drawingBoard/service-planning/objectsToTree/shared.tree.service";
 
 class MockAppStore<T>{
   getState() {
@@ -977,6 +978,7 @@ describe('Generic Form popup Service', () => {
         VfModuleUpgradePopupService,
         VfModuleControlGenerator,
         FeatureFlagsService,
+        SharedTreeService,
         {provide: ActivatedRoute, useClass: ActivatedRouteMock},
         {provide: NgRedux, useClass: MockAppStore}]
     });
index 8562652..b8a5922 100644 (file)
@@ -14,6 +14,7 @@ import {FeatureFlagsService} from "../../../../services/featureFlag/feature-flag
 import {getTestBed, TestBed} from "@angular/core/testing";
 import {SharedControllersService} from "../../../genericForm/formControlsServices/sharedControlles/shared.controllers.service";
 import {ModalService} from "../../../customModal/services/modal.service";
+import {SharedTreeService} from "../../../../../drawingBoard/service-planning/objectsToTree/shared.tree.service";
 
 class MockModalService<T> {}
 
@@ -1993,6 +1994,7 @@ describe('VFModule popup service', () => {
         AaiService,
         LogService,
         BasicPopupService,
+        SharedTreeService,
         {provide:FeatureFlagsService, useClass: MockFeatureFlagsService},
         {provide: NgRedux, useClass: MockReduxStore},
         {provide: HttpClient, useClass: MockAppStore},