NodeInfo::getModel expects the instance-model
[vid.git] / vid-webpack-master / src / app / drawingBoard / service-planning / objectsToTree / models / vnf / vnf.model.info.spec.ts
1 import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing";
2 import {getTestBed, TestBed} from "@angular/core/testing";
3 import {MockNgRedux, NgReduxTestingModule} from "@angular-redux/store/testing";
4 import {VnfModelInfo} from "./vnf.model.info";
5 import {DynamicInputsService} from "../../dynamicInputs.service";
6 import {VFModuleModelInfo} from "../vfModule/vfModule.model.info";
7 import {VNFModel} from "../../../../../shared/models/vnfModel";
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";
12 import {DialogService} from "ng2-bootstrap-modal";
13 import {VfModulePopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popup.service";
14 import {VnfPopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service";
15 import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service";
16 import {DuplicateService} from "../../../duplicate/duplicate.service";
17 import {IframeService} from "../../../../../shared/utils/iframe.service";
18 import {ServiceInfoService} from "../../../../../shared/server/serviceInfo/serviceInfo.service";
19 import {AuditInfoModalComponent} from "../../../../../shared/components/auditInfoModal/auditInfoModal.component";
20 import {ModelInformationItem} from "../../../../../shared/components/model-information/model-information.component";
21 import {ComponentInfoService} from "../../../component-info/component-info.service";
22 import {AaiService} from "../../../../../shared/services/aaiService/aai.service";
23 import {HttpClient, HttpHandler} from "@angular/common/http";
24 import {FeatureFlagsService} from "../../../../../shared/services/featureFlag/feature-flags.service";
25 import {VfModuleUpgradePopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vfModuleUpgrade/vfModule.upgrade.popuop.service";
26
27 class MockFeatureFlagsService extends  FeatureFlagsService{
28   getAllFlags(): { [p: string]: boolean } {
29     return {};
30   }
31 }
32
33 describe('Vnf Model Info', () => {
34  let injector;
35  let httpMock: HttpTestingController;
36  let  _dynamicInputsService : DynamicInputsService;
37  let  _sharedTreeService : SharedTreeService;
38  let _serviceInfoService: ServiceInfoService;
39  let _defaultDataGeneratorService : DefaultDataGeneratorService;
40  let _dialogService : DialogService;
41  let _vfModulePopupService : VfModulePopupService;
42  let _vfModuleUpgradePopupService : VfModuleUpgradePopupService;
43  let _vnfPopupService : VnfPopupService;
44  let _duplicateService : DuplicateService;
45  let _iframeService : IframeService;
46  let _componentInfoService : ComponentInfoService;
47  let _featureFlagsService : FeatureFlagsService;
48
49   let _store : NgRedux<AppState>;
50   let vnfModel: VnfModelInfo;
51   beforeEach(() => {
52     TestBed.configureTestingModule({
53       imports: [HttpClientTestingModule, NgReduxTestingModule],
54       providers: [
55         MockNgRedux,
56         DynamicInputsService,
57         DialogService,
58         VfModulePopupService,
59         VfModuleUpgradePopupService,
60         VnfPopupService,
61         DefaultDataGeneratorService,
62         SharedTreeService,
63         DuplicateService,
64         AaiService,
65         HttpClient,
66         HttpHandler,
67         {provide: FeatureFlagsService, useClass: MockFeatureFlagsService},
68         ComponentInfoService,
69         IframeService]
70     }).compileComponents();
71
72     injector = getTestBed();
73     _sharedTreeService = injector.get(SharedTreeService);
74     _store = injector.get(NgRedux);
75     _featureFlagsService = injector.get(FeatureFlagsService);
76
77     vnfModel = new VnfModelInfo(
78       _dynamicInputsService,
79       _sharedTreeService,
80       _defaultDataGeneratorService,
81       _dialogService,
82       _vnfPopupService,
83       _vfModulePopupService,
84       _vfModuleUpgradePopupService,
85       _duplicateService,
86       null,
87       _iframeService,
88       _componentInfoService,
89       _featureFlagsService,
90       _store);
91
92
93   });
94
95   test('VnfModelInfo should be defined', () => {
96     expect(VnfModelInfo).toBeDefined();
97   });
98
99   test('VnfModelInfo should defined extra details', () => {
100     expect(vnfModel.name).toEqual('vnfs');
101     expect(vnfModel.type).toEqual('VNF');
102     expect(vnfModel.childNames).toEqual(['vfModules']);
103   });
104
105   test('isEcompGeneratedNaming should return true if isEcompGeneratedNaming is "true" ', () => {
106     let isEcompGeneratedNaming: boolean = vnfModel.isEcompGeneratedNaming(<any>{
107       properties: {
108         ecomp_generated_naming: 'true'
109       }
110     });
111     expect(isEcompGeneratedNaming).toBeTruthy();
112   });
113
114   test('isEcompGeneratedNaming should return false if isEcompGeneratedNaming is "false"', () => {
115     let isEcompGeneratedNaming: boolean = vnfModel.isEcompGeneratedNaming({
116       properties: {
117         ecomp_generated_naming: 'false'
118       }
119     });
120     expect(isEcompGeneratedNaming).toBeFalsy();
121   });
122
123   test('isEcompGeneratedNaming should return false if isEcompGeneratedNaming is not defined', () => {
124     let isEcompGeneratedNaming: boolean = vnfModel.isEcompGeneratedNaming({
125       properties: {
126       }
127     });
128     expect(isEcompGeneratedNaming).toBeFalsy();
129   });
130
131
132   test('getTooltip should return "VF"', () => {
133     let tooltip: string = vnfModel.getTooltip();
134     expect(tooltip).toEqual('VF');
135   });
136
137   test('getType should return "VF"', () => {
138     let tooltip: string = vnfModel.getType();
139     expect(tooltip).toEqual('VF');
140   });
141
142   test('getNextLevelObject should vfModule level object', () => {
143     let nextLevel: VFModuleModelInfo = vnfModel.getNextLevelObject();
144     expect(nextLevel.type).toEqual('Module');
145   });
146
147   test('getModel should return VNF model', () => {
148     expect(vnfModel.getModel({})).toBeInstanceOf(VNFModel);
149   });
150
151   test('showNodeIcons should return false if reachLimit of max', ()=>{
152     let serviceId : string = 'servicedId';
153     let node = {
154       data : {
155         id : 'vnfId',
156         name : 'vnfName',
157         modelCustomizationId : "modelCustomizationId",
158         modelUniqueId: "modelCustomizationId"
159       }
160     };
161     jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
162       global:{},
163       service : {
164         serviceHierarchy : {
165           'servicedId' : {
166             'vnfs' : {
167               modelCustomizationId : "modelCustomizationId",
168               'modelInfo': {
169                 modelCustomizationId : "modelCustomizationId"
170               },
171               'vnfName' : {
172                 'properties' : {
173                   'max_instances' : 1
174                 }
175               }
176             }
177           }
178         },
179         serviceInstance : {
180           'servicedId' : {
181             'existingVNFCounterMap' : {
182               'modelCustomizationId' : 1
183             },
184             'vnfs' : {
185               'vnfName' :{
186
187               }
188             }
189           }
190         }
191       }
192     });
193
194     let result = vnfModel.showNodeIcons(<any>node, serviceId);
195     expect(result).toEqual(new AvailableNodeIcons(false , true));
196   });
197
198   test('showNodeIcons should return true if not reachLimit of max', ()=>{
199     let serviceId : string = 'servicedId';
200     let node = {
201       data : {
202         id : 'vnfId',
203         name : 'vnfName'
204       }
205     };
206     jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
207       global:{
208         drawingBoardStatus: "EDIT"
209       },
210       service : {
211         serviceHierarchy : {
212           'servicedId' : {
213             'vnfs' : {
214               'vnfName' : {
215                 'properties' : {
216                   'max_instances' : 2
217                 }
218               }
219             }
220           }
221         },
222         serviceInstance : {
223           'servicedId' : {
224             'existingVNFCounterMap' : {
225               'vnfId' : 1
226             },
227             'vnfs' : {
228               'vnfName' :{
229
230               }
231             }
232           }
233         }
234       }
235     });
236
237     let result = vnfModel.showNodeIcons(<any>node, serviceId);
238     expect(result).toEqual(new AvailableNodeIcons(true , false));
239   });
240
241   test('getNodeCount should return number of nodes', ()=>{
242     let serviceId : string = 'servicedId';
243     jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
244       global : {},
245       service : {
246         serviceHierarchy : {
247           'servicedId' : {
248             'vnfs' : {
249               'vnfName' : {
250                 'properties' : {
251                   'max_instances' : 1
252                 }
253               }
254             }
255           }
256         },
257         serviceInstance : {
258           'servicedId' : {
259             'existingVNFCounterMap' : {
260               'modelCustomizationId' : 1
261             },
262             'vnfs' : {
263               'vnfName' :{
264                 'originalName' : 'vnfName'
265               }
266             }
267           }
268         }
269       }
270     });
271
272     let node = {
273       data : {
274         id : 'vnfId',
275         name : 'vnfName',
276         modelCustomizationId : "modelCustomizationId",
277         modelUniqueId:  "modelCustomizationId"
278       }
279     };
280     let result = vnfModel.getNodeCount(<any>node , serviceId);
281     expect(result).toEqual(1);
282
283     node.data.modelCustomizationId = 'vnfId_notExist';
284     node.data.modelUniqueId = 'vnfId_notExist';
285     result = vnfModel.getNodeCount(<any>node , serviceId);
286     expect(result).toEqual(0);
287
288     result = vnfModel.getNodeCount(<any>node , serviceId + '_notExist');
289     expect(result).toEqual(0);
290   });
291
292   test('getMenuAction: edit', ()=>{
293     let node = {"modelId":"d6557200-ecf2-4641-8094-5393ae3aae60","missingData":true,"action":"None","inMaint":true,"name":"jlfBwIks283yKlCD8","modelName":"VF_vGeraldine 0","type":"VF","isEcompGeneratedNaming":true,"networkStoreKey":"VF_vGeraldine 0:004","vnfStoreKey":"VF_vGeraldine 0:004","typeName":"VNF"};
294     let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
295     let result = vnfModel.getMenuAction(<any>node, serviceModelId);
296     spyOn(result['edit'], 'method');
297     expect(result['edit']).toBeDefined();
298     expect(result['edit'].visible).toBeTruthy();
299     expect(result['edit'].enable).toBeTruthy();
300     result['edit']['method'](node, serviceModelId);
301     expect(result['edit']['method']).toHaveBeenCalledWith(node, serviceModelId);
302   });
303
304   test('member should defined edit method', () => {
305     let node = {
306       data : {
307         "modelId": "d6557200-ecf2-4641-8094-5393ae3aae60",
308         "missingData": true,
309         "action": "None",
310         "inMaint": true,
311         "name": "jlfBwIks283yKlCD8",
312         "modelName": "VF_vGeraldine 0",
313         "type": "VF",
314         "userProvidedNaming": false,
315         "networkStoreKey": "VF_vGeraldine 0:004",
316         "vnfStoreKey": "VF_vGeraldine 0:004",
317         "typeName": "VNF"
318       },
319       type : 'VNF'
320
321     };
322     let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
323
324     let menuActions = vnfModel.getMenuAction(<any>node, serviceModelId);
325     spyOn(menuActions['edit'], 'method');
326     expect(menuActions['edit']).toBeDefined();
327     expect(menuActions['edit'].visible(node)).toBeFalsy();
328     menuActions['edit']['method'](node, serviceModelId);
329     expect(menuActions['edit']['method']).toHaveBeenCalledWith(node, serviceModelId);
330   });
331
332   test('getMenuAction: duplicate', ()=>{
333     jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
334       "global": {
335       "name": null,
336         "type": "UPDATE_DRAWING_BOARD_STATUS",
337         "drawingBoardStatus": "CREATE"
338       }
339     });
340     let node = {
341       data : {
342         "modelId": "d6557200-ecf2-4641-8094-5393ae3aae60",
343         "missingData": true,
344         "action": "None",
345         "inMaint": true,
346         "name": "jlfBwIks283yKlCD8",
347         "modelName": "VF_vGeraldine 0",
348         "type": "VF",
349         "isEcompGeneratedNaming":true,
350         "networkStoreKey": "VF_vGeraldine 0:004",
351         "vnfStoreKey": "VF_vGeraldine 0:004",
352         "typeName": "VNF"
353       },
354       type : 'VNF'
355
356     };
357     let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
358     let menuActions = vnfModel.getMenuAction(<any>node, serviceModelId);
359     spyOn(menuActions['duplicate'], 'method');
360     expect(menuActions['duplicate']).toBeDefined();
361     expect(menuActions['duplicate'].visible(node)).toBeFalsy();
362     menuActions['duplicate']['method'](node, serviceModelId);
363     expect(menuActions['duplicate']['method']).toHaveBeenCalledWith(node, serviceModelId);
364   });
365
366   test('getMenuAction: remove', ()=>{
367     let node = {
368       data : {
369         "modelId": "d6557200-ecf2-4641-8094-5393ae3aae60",
370         "missingData": true,
371         "action": "None",
372         "inMaint": true,
373         "name": "jlfBwIks283yKlCD8",
374         "modelName": "VF_vGeraldine 0",
375         "type": "VF",
376         "isEcompGeneratedNaming":true,
377         "networkStoreKey": "VF_vGeraldine 0:004",
378         "vnfStoreKey": "VF_vGeraldine 0:004",
379         "typeName": "VNF"
380       },
381       type : 'VNF'
382
383     };
384     let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
385
386     let menuActions = vnfModel.getMenuAction(<any>node, serviceModelId);
387     spyOn(menuActions['remove'], 'method');
388     expect(menuActions['remove']).toBeDefined();
389     expect(menuActions['remove'].visible(node)).toBeFalsy();
390     menuActions['remove']['method'](node, serviceModelId);
391     expect(menuActions['remove']['method']).toHaveBeenCalledWith(node, serviceModelId);
392   });
393
394   test('getMenuAction: delete', ()=>{
395     let node = {"modelId":"d6557200-ecf2-4641-8094-5393ae3aae60","missingData":true,"action":"None","inMaint":true,"name":"jlfBwIks283yKlCD8","modelName":"VF_vGeraldine 0","type":"VF","isEcompGeneratedNaming":true,"networkStoreKey":"VF_vGeraldine 0:004","vnfStoreKey":"VF_vGeraldine 0:004","typeName":"VNF"};
396     let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
397     let result = vnfModel.getMenuAction(<any>node, serviceModelId);
398     spyOn(result['delete'], 'method');
399     expect(result['delete']).toBeDefined();
400     expect(result['delete'].visible).toBeTruthy();
401     expect(result['delete'].enable).toBeTruthy();
402     result['delete']['method'](node, serviceModelId);
403     expect(result['delete']['method']).toHaveBeenCalledWith(node, serviceModelId);
404   });
405
406
407   test('getMenuAction: undoDelete', ()=>{
408     let node = {"modelId":"d6557200-ecf2-4641-8094-5393ae3aae60","missingData":true,"action":"None","inMaint":true,"name":"jlfBwIks283yKlCD8","modelName":"VF_vGeraldine 0","type":"VF","isEcompGeneratedNaming":true,"networkStoreKey":"VF_vGeraldine 0:004","vnfStoreKey":"VF_vGeraldine 0:004","typeName":"VNF"};
409     let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
410     let result = vnfModel.getMenuAction(<any>node, serviceModelId);
411     spyOn(result['undoDelete'], 'method');
412     expect(result['undoDelete']).toBeDefined();
413     expect(result['undoDelete'].visible).toBeDefined();
414     expect(result['undoDelete'].enable).toBeDefined();
415     result['undoDelete']['method'](node, serviceModelId);
416     expect(result['undoDelete']['method']).toHaveBeenCalledWith(node, serviceModelId);
417   });
418
419   test('getMenuAction: showAuditInfo', ()=>{
420     jest.spyOn(_sharedTreeService, 'isRetryMode').mockReturnValue(true);
421
422     jest.spyOn(AuditInfoModalComponent.openInstanceAuditInfoModal, 'next');
423     let node = {
424       data : {
425         "modelId": "6b528779-44a3-4472-bdff-9cd15ec93450",
426         "action": "Create",
427         "type": "VF",
428         "vnfStoreKey": "MSOTEST103a",
429         "typeName": "VNF",
430         "isFailed": true,
431       },
432       type : 'VNF'
433
434     };
435     let serviceModelId = "6b528779-44a3-4472-bdff-9cd15ec93450";
436     let result = vnfModel.getMenuAction(<any>node, serviceModelId);
437     spyOn(result['showAuditInfo'], 'method');
438     expect(result['showAuditInfo']).toBeDefined();
439     expect(result['showAuditInfo'].visible(node)).toBeTruthy();
440     expect(result['showAuditInfo'].enable(node)).toBeTruthy();
441     result['showAuditInfo']['method'](node, serviceModelId);
442
443   });
444
445   test('Info for vnf should be correct', () => {
446     const model = getVNFModel();
447     const instance = getVNFInstance();
448     let actualVNFInfo = vnfModel.getInfo(model,instance);
449     let expectedVNFInfo = [
450       ModelInformationItem.createInstance('Min instances', "0"),
451       ModelInformationItem.createInstance('Max instances',"1"),
452       ModelInformationItem.createInstance('NF type',undefined),
453       ModelInformationItem.createInstance('NF role',undefined)
454     ];
455     expect(actualVNFInfo).toEqual(expectedVNFInfo);
456   });
457
458   test('Info for vnf in left side - model only - should be correct', () => {
459     const model = getVNFModel();
460     let actualVNFInfo = vnfModel.getInfo(model,null);
461     let expectedVNFInfo = [
462       ModelInformationItem.createInstance('Min instances', "0"),
463       ModelInformationItem.createInstance('Max instances',"1")
464     ];
465     expect(actualVNFInfo).toEqual(expectedVNFInfo);
466   });
467
468   test('When there is no max Max instances text is: Unlimited (default)', () => {
469     let actualVNFInfo = vnfModel.getInfo({just:"not empty"},null);
470     const maxInstancesItem = actualVNFInfo.find((item)=> item.label == 'Max instances');
471     expect(maxInstancesItem.values[0]).toEqual('Unlimited (default)');
472   });
473
474   function getVNFModel(){
475     return {
476       "name":"VF_vGeraldine",
477       "version":"2.0",
478       "description":"VSP_vGeraldine",
479       "uuid":"d6557200-ecf2-4641-8094-5393ae3aae60",
480       "invariantUuid":"4160458e-f648-4b30-a176-43881ffffe9e",
481       "max":1,
482       "min":0,
483       "customizationUuid":"91415b44-753d-494c-926a-456a9172bbb9",
484       "isEcompGeneratedNaming":true,
485       "type":"VF",
486       "modelCustomizationName":"VF_vGeraldine 0",
487       "vfcInstanceGroups":{},
488       "properties":{
489         "gpb2_Internal2_mac":"00:11:22:EF:AC:DF",
490         "sctp-a-ipv6-egress_rule_application":"any",
491         "sctp-b-ipv6-egress_src_start_port":"0",
492         "Internal2_allow_transit":"true",
493         "sctp-b-IPv6_ethertype":"IPv6",
494         "ncb2_Internal1_mac":"00:11:22:EF:AC:DF",
495         "sctp-b-ingress_rule_protocol":"icmp","sctp-b-ingress_action":"pass",
496         "sctp-a-egress_rule_application":"any",
497         "sctp-b-ipv6-ingress-src_start_port":"0.0",
498         "ncb1_Internal2_mac":"00:11:22:EF:AC:DF","sctp-b-egress_src_addresses":"local",
499         "fsb_volume_size_0":"320.0",
500         "sctp-a-ipv6-ingress-dst_start_port":"0",
501         "sctp-a-ipv6-ingress_ethertype":"IPv4","sctp-b-ipv6-ingress_rule_application":"any",
502         "domain_name":"default-domain",
503         "sctp-a-egress_src_addresses":"local",
504         "sctp-b-egress-src_start_port":"0.0",
505         "sctp-a-ingress_rule_protocol":"icmp",
506         "sctp-b-display_name":"epc-sctp-b-ipv4v6-sec-group",
507         "sctp-b-ipv6-ingress-dst_end_port":"65535",
508         "sctp-a-ingress_ethertype":"IPv4",
509         "sctp-a-egress-src_start_port":"0.0",
510         "sctp-b-dst_subnet_prefix_v6":"::",
511         "nf_naming":"{ecomp_generated_naming=true}",
512         "sctp-a-ipv6-ingress_src_subnet_prefix":"0.0.0.0"
513         }
514     };
515
516   }
517
518   function getVNFInstance(){
519     return {
520       "action":"None",
521       "instanceName":"4O61SmpFAdCm1oVEs",
522       "instanceId":"66cbb3b5-c823-470c-9520-4e0b85112250",
523       "orchStatus":null,
524       "productFamilyId":null,
525       "lcpCloudRegionId":null,
526       "tenantId":null,
527       "modelInfo":{
528         "modelCustomizationName":"VF_vGeraldine 0",
529         "modelInvariantId":"vnf-instance-model-invariant-id",
530         "modelVersionId":"d6557200-ecf2-4641-8094-5393ae3aae60",
531         "modelType":"vnf"
532       },
533       "instanceType":"7538ifdSoTccmbEkr",
534       "provStatus":null,
535       "inMaint":true,
536       "uuid":"d6557200-ecf2-4641-8094-5393ae3aae60",
537       "originalName":"VF_vGeraldine 0",
538       "legacyRegion":null,
539       "lineOfBusiness":null,
540       "platformName":null,
541       "trackById":"VF_vGeraldine 0:004",
542       "vfModules":{
543         "vf_vgeraldine0..VfVgeraldine..vflorence_vlc..module-1":{
544           "vf_vgeraldine0..VfVgeraldine..vflorence_vlc..module-1:008":{
545             "action":"None",
546             "instanceName":"ss820f_0918_db",
547             "instanceId":"2c1ca484-cbc2-408b-ab86-25a2c15ce280",
548             "orchStatus":"deleted",
549             "productFamilyId":null,
550             "lcpCloudRegionId":null,
551             "tenantId":null,
552             "modelInfo":{
553               "modelCustomizationName":"VfVgeraldine..vflorence_vlc..module-1",
554               "modelCustomizationId":"b200727a-1bf9-4e7c-bd06-b5f4c9d920b9",
555               "modelInvariantId":"09edc9ef-85d0-4b26-80de-1f569d49e750",
556               "modelVersionId":"522159d5-d6e0-4c2a-aa44-5a542a12a830",
557               "modelType":"vfModule"
558             },
559             "instanceType":null,
560             "provStatus":null,
561             "inMaint":true,
562             "uuid":"522159d5-d6e0-4c2a-aa44-5a542a12a830",
563             "originalName":"VfVgeraldine..vflorence_vlc..module-1",
564             "legacyRegion":null,
565             "lineOfBusiness":null,
566             "platformName":null,
567             "trackById":"vf_vgeraldine0..VfVgeraldine..vflorence_vlc..module-1:008",
568             "isBase":false,
569             "volumeGroupName":null
570           }
571         },
572         "dc229cd8-c132-4455-8517-5c1787c18b14":{
573           "dc229cd8-c132-4455-8517-5c1787c18b14:009":{
574             "action":"None",
575             "instanceName":"ss820f_0918_base",
576             "instanceId":"3ef042c4-259f-45e0-9aba-0989bd8d1cc5",
577             "orchStatus":"Assigned",
578             "productFamilyId":null,
579             "lcpCloudRegionId":null,
580             "tenantId":null,
581             "modelInfo":{
582               "modelCustomizationId":"8ad8670b-0541-4499-8101-275bbd0e8b6a",
583               "modelInvariantId":"1e463c9c-404d-4056-ba56-28fd102608de",
584               "modelVersionId":"dc229cd8-c132-4455-8517-5c1787c18b14",
585               "modelType":"vfModule"
586             },
587             "instanceType":null,
588             "provStatus":null,
589             "inMaint":false,
590             "uuid":"dc229cd8-c132-4455-8517-5c1787c18b14",
591             "originalName":null,
592             "legacyRegion":null,
593             "lineOfBusiness":null,
594             "platformName":null,
595             "trackById":"dc229cd8-c132-4455-8517-5c1787c18b14:009",
596             "isBase":true,
597             "volumeGroupName":null
598           }
599         }
600       },
601       "networks":{
602
603       }
604     };
605   }
606
607 });