a-la-carte services e2e test - add more 2 VfModules
[vid.git] / vid-webpack-master / src / app / shared / components / genericFormPopup / genericFormServices / vfModule / vfModule.popuop.service.ts
1 import {Injectable} from "@angular/core";
2 import {FormPopupDetails, PopupType} from "../../../../models/formControlModels/formPopupDetails.model";
3 import {BasicControlGenerator} from "../../../genericForm/formControlsServices/basic.control.generator";
4 import {AppState} from "../../../../store/reducers";
5 import {NgRedux} from "@angular-redux/store";
6 import {ITreeNode} from "angular-tree-component/dist/defs/api";
7 import {ModelInformationItem} from "../../../model-information/model-information.component";
8 import {Constants} from "../../../../utils/constants";
9 import {AaiService} from "../../../../services/aaiService/aai.service";
10 import {ServiceModel} from "../../../../models/serviceModel";
11 import {FormGroup} from "@angular/forms";
12 import {ModelInfo} from "../../../../models/modelInfo";
13 import {IframeService} from "../../../../utils/iframe.service";
14 import {GenericPopupInterface} from "../generic-popup.interface";
15 import {Subject} from "rxjs/Subject";
16 import {DefaultDataGeneratorService} from "../../../../services/defaultDataServiceGenerator/default.data.generator.service";
17 import {BasicPopupService} from "../basic.popup.service";
18 import {VfModuleInstance} from "../../../../models/vfModuleInstance";
19 import {VfModuleControlGenerator} from "../../../genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator";
20 import {FormControlModel} from "../../../../models/formControlModels/formControl.model";
21 import * as _ from 'lodash';
22 import {createVFModuleInstance, updateVFModuleInstance} from "../../../../storeUtil/utils/vfModule/vfModule.actions";
23
24 @Injectable()
25 export class VfModulePopuopService implements GenericPopupInterface {
26   dynamicInputs: any;
27   instance: any;
28   model: any;
29   serviceModel: ServiceModel;
30   modelInformations: ModelInformationItem[] = [];
31   uuidData: Object;
32   closeDialogEvent: Subject<any> = new Subject<any>();
33   isUpdateMode: boolean;
34
35
36   constructor(private _basicControlGenerator: BasicControlGenerator,
37               private _vfModuleControlGenerator: VfModuleControlGenerator,
38               private _iframeService: IframeService,
39               private _defaultDataGeneratorService: DefaultDataGeneratorService,
40               private _aaiService: AaiService,
41               private _basicPopupService : BasicPopupService,
42               private _store: NgRedux<AppState>) {
43
44   }
45
46   getInstance(serviceId: string, vnfStoreKey: string, vfModuleStoreKey: string): any {
47     if (_.isNil(vnfStoreKey) || _.isNil(vfModuleStoreKey)) {
48       return new VfModuleInstance();
49     }
50     const vfModules = this._store.getState().service.serviceInstance[serviceId].vnfs[vnfStoreKey].vfModules;
51     return vfModules[this.uuidData['modelName']][vfModuleStoreKey];
52   }
53
54   getDynamicInputs(UUIDData : Object) : FormControlModel[]{
55     let dynamic = this._defaultDataGeneratorService.getArbitraryInputs(this._store.getState().service.serviceHierarchy[UUIDData['serviceId']].vfModules[UUIDData['modelName']].inputs);
56     return this.getVFModuleDynamicInputs(dynamic, UUIDData);
57   }
58
59   getVFModuleDynamicInputs(dynamicInputs : any, UUIDData : Object) : FormControlModel[] {
60     let result : FormControlModel[] = [];
61     if(dynamicInputs) {
62       let vfModuleInstance = null;
63       if (_.has(this._store.getState().service.serviceInstance[UUIDData['serviceId']].vnfs, UUIDData['vnfStoreKey']) &&
64         _.has(this._store.getState().service.serviceInstance[UUIDData['serviceId']].vnfs[UUIDData['vnfStoreKey']].vfModules, UUIDData['modelName'])) {
65         vfModuleInstance = Object.assign({},this._store.getState().service.serviceInstance[UUIDData['serviceId']].vnfs[UUIDData['vnfStoreKey']].vfModules[UUIDData['modelName']][UUIDData['vfModuleStoreKey']]);
66       }
67       result = this._basicControlGenerator.getDynamicInputs(dynamicInputs, vfModuleInstance);
68     }
69     return result;
70   }
71
72
73   getGenericFormPopupDetails(serviceId: string, vnfStoreKey: string, vfModuleStoreKey: string, node: ITreeNode, uuidData: Object, isUpdateMode: boolean): FormPopupDetails {
74
75     this.uuidData = uuidData;
76     this.instance = this.getInstance(serviceId, vnfStoreKey, vfModuleStoreKey);
77     this.getModelInformation(serviceId, uuidData['modelName']);
78
79     return new FormPopupDetails(this,
80       PopupType.VFMODULE,
81       uuidData,
82       this.getTitle(isUpdateMode),
83       this.getSubLeftTitle(),
84       this.getSubRightTitle(),
85       this.getControls(serviceId, vnfStoreKey, vfModuleStoreKey, isUpdateMode),
86       this.getDynamicInputs(uuidData),
87       this.modelInformations,
88       (that, form: FormGroup) => {that.onSubmit(that, form);},
89       (that: any, form: FormGroup) => {that.onCancel(that, form); }
90     );
91   }
92
93   getModelInformation(serviceId: string, modelName: string) {
94     this._aaiService.getServiceModelById(serviceId).subscribe((result: any) => {
95       this.serviceModel = new ServiceModel(result);
96
97       this.model = this._basicPopupService.getModelFromResponse(result, 'vfModules', modelName);
98       const serviceInstance = this._store.getState().service.serviceInstance[serviceId];
99       this.modelInformations = [
100         new ModelInformationItem("Subscriber Name", "subscriberName", [this._basicPopupService.extractSubscriberNameBySubscriberId(serviceInstance.globalSubscriberId)], "", true),
101         new ModelInformationItem("Service Name", "serviceModelName", [this.serviceModel.name], "", true),
102         new ModelInformationItem("Service Instance Name", "serviceName", [serviceInstance.instanceName], "", false),
103         new ModelInformationItem("Model Name", "modelName", [this.model.name], "", true),
104         new ModelInformationItem("Model version", "modelVersion", [this.model.version], "", true),
105         new ModelInformationItem("Description", "description", [this.model.description]),
106         new ModelInformationItem("Category", "category", [this.model.category]),
107         new ModelInformationItem("Sub Category", "subCategory", [this.model.subCategory]),
108         new ModelInformationItem("UUID", "uuid", [this.model.uuid], Constants.ServicePopup.TOOLTIP_UUID, true),
109         new ModelInformationItem("Invariant UUID", "invariantUuid", [this.model.invariantUuid], Constants.ServicePopup.TOOLTIP_INVARIANT_UUID, true),
110         new ModelInformationItem("Service type", "serviceType", [this.serviceModel.serviceType]),
111         new ModelInformationItem("Service role", "serviceRole", [this.serviceModel.serviceRole]),
112         new ModelInformationItem("Minimum to instantiate", "min", this.model.min == undefined ? ['0'] : [this.model.min.toString()], "", true),
113         new ModelInformationItem("Maximum to instantiate", "max", this.model.max == undefined ? ['1'] : [this.model.max.toString()], "", true),
114         new ModelInformationItem("Recommended to instantiate", "initial", [this.model.initial])
115       ];
116     });
117   }
118
119   getControls(serviceId: string, vnfStoreKey: string, vfModuleStoreKey: string, isUpdateMode: boolean) {
120     if (this._store.getState().service.serviceHierarchy[serviceId].service.vidNotions.instantiationType === 'Macro') {
121       return this._vfModuleControlGenerator.getMacroFormControls(serviceId, vnfStoreKey, vfModuleStoreKey, this.uuidData, isUpdateMode);
122     } else {
123       return this._vfModuleControlGenerator.getAlaCarteFormControls(serviceId, vnfStoreKey, vfModuleStoreKey,  this.uuidData, isUpdateMode);
124     }
125   }
126
127
128   onSubmit(that, form: FormGroup) {
129     form.value['instanceParams'] = form.value['instanceParams'] && [form.value['instanceParams']];
130     if (!_.isNil(form.controls['supplementaryFile_hidden_content']) && form.controls['supplementaryFile_hidden_content'].value) {
131       form.value['supplementaryFileContent'] = JSON.parse(form.controls['supplementaryFile_hidden_content'].value);
132       if (!_.isNil(form.controls['supplementaryFile_hidden'].value)) {
133         form.value['supplementaryFileName'] = form.controls['supplementaryFile_hidden'].value.name;
134       }
135       else {
136         form.value['supplementaryFileName'] = that.instance.supplementaryFileName;
137       }
138     }
139     else {
140       delete form.value['supplementaryFileContent'];
141       delete form.value['supplementaryFileName'];
142     }
143     that.storeVFModule(that, form.value);
144     window.parent.postMessage({
145       eventId: 'submitIframe',
146       data: {
147         serviceModelId: that.serviceModel.uuid
148       }
149     }, "*");
150     this.onCancel(that, form);
151   }
152
153
154   onCancel(that, form) {
155     form.reset();
156     that._iframeService.removeClassCloseModal('content');
157     this.closeDialogEvent.next(that);
158   }
159
160   storeVFModule = (that, formValues: any): void => {
161     formValues.modelInfo = new ModelInfo(that.model);
162     formValues.uuid = formValues.modelInfo.uuid;
163     formValues.isMissingData = false;
164     const vnf =  that._store.getState().service.serviceInstance[that.uuidData.serviceId].vnfs[that.uuidData.vnfStoreKey];
165
166     if (!that.uuidData.vFModuleStoreKey) {
167       this._store.dispatch(createVFModuleInstance(formValues, that.uuidData.modelName, that.uuidData.serviceId, 0, that.uuidData.vnfStoreKey));
168     } else {
169       this._store.dispatch(updateVFModuleInstance(formValues, that.uuidData.modelName, that.uuidData.serviceId, that.uuidData.vFModuleStoreKey, that.uuidData.vnfStoreKey));
170     }
171   };
172
173   getTitle(isUpdateMode : boolean) : string {
174     return isUpdateMode ? 'Edit Module (Heat stack)' : 'Set new Module (Heat stack)';
175   }
176
177   getSubLeftTitle(): string {
178     return this.model.name;
179   }
180
181   getSubRightTitle(): string {
182     return "Module (Heat stack) Instance Details";
183   }
184 }