Merge "Product family ID on VNF should be mandatory"
[vid.git] / vid-webpack-master / src / app / shared / components / genericForm / formControlsServices / vfModuleGenerator / vfModule.control.generator.ts
1 import {Injectable} from "@angular/core";
2 import {GenericFormService} from "../../generic-form.service";
3 import {AaiService} from "../../../../services/aaiService/aai.service";
4 import {NgRedux} from "@angular-redux/store";
5 import {HttpClient} from "@angular/common/http";
6 import {ControlGeneratorUtil} from "../control.generator.util.service";
7 import {
8   CustomValidatorOptions,
9   FormControlModel,
10   ValidatorModel,
11   ValidatorOptions
12 } from "../../../../models/formControlModels/formControl.model";
13 import {LogService} from "../../../../utils/log/log.service";
14 import {AppState} from "../../../../store/reducers";
15 import {FormGroup} from "@angular/forms";
16 import {InputFormControl} from "../../../../models/formControlModels/inputFormControl.model";
17 import {VfModuleInstance} from "../../../../models/vfModuleInstance";
18 import {VfModule} from "../../../../models/vfModule";
19 import {VNFModel} from "../../../../models/vnfModel";
20 import {VnfInstance} from "../../../../models/vnfInstance";
21 import * as _ from 'lodash';
22 import {SharedControllersService} from "../sharedControlles/shared.controllers.service";
23 import {SharedTreeService} from "../../../../../drawingBoard/service-planning/objectsToTree/shared.tree.service";
24
25 export enum FormControlNames {
26   INSTANCE_NAME = 'instanceName',
27   VOLUME_GROUP_NAME = 'volumeGroupName',
28   LCPCLOUD_REGION_ID = 'lcpCloudRegionId',
29   LEGACY_REGION = 'legacyRegion',
30   TENANT_ID = 'tenantId',
31   ROLLBACK_ON_FAILURE = 'rollbackOnFailure',
32 }
33
34
35 @Injectable()
36 export class VfModuleControlGenerator {
37   aaiService: AaiService;
38   vfModuleModel: VfModule;
39   isUpdateMode : boolean;
40
41   constructor(private genericFormService: GenericFormService,
42               private _basicControlGenerator: ControlGeneratorUtil,
43               private _sharedControllersService: SharedControllersService,
44               private _sharedTreeService: SharedTreeService,
45               private store: NgRedux<AppState>,
46               private http: HttpClient,
47               private _aaiService: AaiService,
48               private _logService: LogService) {
49     this.aaiService = _aaiService;
50   }
51
52   getVfModuleInstance = (serviceId: string, vnfStoreKey: string, UUIDData: Object, isUpdateMode: boolean): VfModuleInstance => {
53     let vfModuleInstance: VfModuleInstance = null;
54     if (isUpdateMode && this.store.getState().service.serviceInstance[serviceId] &&
55       _.has(this.store.getState().service.serviceInstance[serviceId].vnfs, vnfStoreKey) &&
56       _.has(this.store.getState().service.serviceInstance[serviceId].vnfs[vnfStoreKey].vfModules, UUIDData['modelName'])) {
57        vfModuleInstance = Object.assign({},this.store.getState().service.serviceInstance[serviceId].vnfs[vnfStoreKey].vfModules[UUIDData['modelName']][UUIDData['vFModuleStoreKey']]);
58     }
59     return vfModuleInstance;
60   };
61
62   extractVfAccordingToVfModuleUuid(serviceId: string, UUIDData: Object): VfModule {
63     const vfModule = this.store.getState().service.serviceHierarchy[serviceId].vfModules[UUIDData['modelName']];
64     this.vfModuleModel = vfModule;
65     return vfModule;
66   }
67
68   getMacroFormControls(serviceId: string, vnfStoreKey: string, vfModuleStoreKey: string, uuidData : Object, isUpdateMode: boolean): FormControlModel[] {
69     this.isUpdateMode = isUpdateMode;
70     this.extractVfAccordingToVfModuleUuid(serviceId, uuidData);
71     if (_.isNil(serviceId) || _.isNil(vnfStoreKey) || _.isNil(vfModuleStoreKey)) {
72       if(isUpdateMode){
73         this._logService.error('should provide serviceId, vfModuleStoreKey, vnfStoreKey', serviceId);
74         return [];
75       }
76     }
77
78     const vfModuleInstance = this._basicControlGenerator.retrieveInstanceIfUpdateMode(this.store, this.getVfModuleInstance(serviceId, vnfStoreKey, uuidData, isUpdateMode));
79     const vfModuleModel = this.vfModuleModel;
80     const vnf: VnfInstance = this.store.getState().service.serviceInstance[serviceId].vnfs[vnfStoreKey];
81     const vnfModel = this.newVNFModel(serviceId, vnf);
82
83     let result: FormControlModel[] = [];
84
85     if (!_.isNil(vfModuleModel)) {
86       result = this.pushInstanceAndVGToForm(result, vfModuleInstance, serviceId, vnfModel, false);
87     }
88     if(this.store.getState().global.flags['FLAG_SUPPLEMENTARY_FILE']) {
89       result = this._basicControlGenerator.concatSupplementaryFile(result, vfModuleInstance);
90     }
91     return result;
92   }
93
94   private newVNFModel(serviceId: string, vnf: VnfInstance) {
95     const vnfModelName: string = vnf.originalName;
96
97     const serviceModelFromHierarchy = this.store.getState().service.serviceHierarchy[serviceId];
98     const model = this._sharedTreeService.modelByIdentifier(serviceModelFromHierarchy, "vnfs", vnfModelName);
99     return new VNFModel(model);
100   }
101
102   pushInstanceAndVGToForm(result: FormControlModel[], vfModuleElement: any, serviceId: string, vnfModel: any, isALaCarte: boolean) :FormControlModel[]{
103     result.push(this.getInstanceName(vfModuleElement, serviceId, vnfModel.isEcompGeneratedNaming));
104     if (this.vfModuleModel.volumeGroupAllowed) {
105       result.push(this.getVolumeGroupData(vfModuleElement, serviceId, vnfModel.isEcompGeneratedNaming, isALaCarte));
106     }
107     return result;
108   }
109
110   getAlaCarteFormControls(serviceId: string, vnfStoreKey: string, vfModuleStoreKey: string, uuidData : Object, isUpdateMode: boolean): FormControlModel[] {
111     this.isUpdateMode = isUpdateMode;
112     this.extractVfAccordingToVfModuleUuid(serviceId, uuidData);
113     if (_.isNil(serviceId) || _.isNil(vnfStoreKey) || _.isNil(vfModuleStoreKey)) {
114       if(isUpdateMode){
115         this._logService.error('should provide serviceId, vfModuleStoreKey, vnfStoreKey', serviceId);
116         return [];
117       }
118     }
119     const vnf: VnfInstance = this.store.getState().service.serviceInstance[serviceId].vnfs[vnfStoreKey] ;
120     const vnfModel = this.newVNFModel(serviceId, vnf);
121
122     const vfModuleInstance = this._basicControlGenerator.retrieveInstanceIfUpdateMode(this.store, this.getVfModuleInstance(serviceId, vnfStoreKey, uuidData, isUpdateMode));
123     let result: FormControlModel[] = [];
124     this.pushInstanceAndVGToForm(result, vfModuleInstance, serviceId, vnfModel, true);
125     result.push(this._sharedControllersService.getLcpRegionControl(serviceId, vfModuleInstance, result));
126     result.push(this._sharedControllersService.getLegacyRegion(vfModuleInstance));
127     result.push(this._sharedControllersService.getTenantControl(serviceId, vfModuleInstance));
128     result.push(this._sharedControllersService.getRollbackOnFailureControl(vfModuleInstance));
129     result.push(this._sharedControllersService.getSDNCControl(vfModuleInstance));
130     if(this.store.getState().global.flags['FLAG_SUPPLEMENTARY_FILE']) {
131       result = this._basicControlGenerator.concatSupplementaryFile(result, vfModuleInstance);
132     }
133     return result;
134   }
135
136   getInstanceName(instance: any, serviceId: string, isEcompGeneratedNaming: boolean): FormControlModel {
137     let formControlModel:FormControlModel = this._sharedControllersService.getInstanceNameController(instance, serviceId, isEcompGeneratedNaming, this.vfModuleModel);
138     formControlModel.onBlur = (event, form : FormGroup) => {
139         if(!_.isNil(form.controls['volumeGroupName'])&& event.target.value.length > 0){
140           form.controls['volumeGroupName'].setValue(event.target.value + "_vol");
141         }
142       };
143
144     return formControlModel;
145   }
146
147   getDefaultVolumeGroupName(instance: any, isEcompGeneratedNaming: boolean): string {
148     if ((!_.isNil(instance) && instance.volumeGroupName))  {
149       return instance.volumeGroupName;
150     }
151     if (isEcompGeneratedNaming) {
152       return null;
153     }
154     return this._basicControlGenerator.getDefaultInstanceName(instance, this.vfModuleModel) + "_vol";
155   }
156
157   getVolumeGroupData(instance: any, serviceId: string, isEcompGeneratedNaming: boolean, isALaCarte: boolean): FormControlModel {
158     let validations: ValidatorModel[] = [
159       new ValidatorModel(ValidatorOptions.pattern, 'Instance name may include only alphanumeric characters and underscore.', ControlGeneratorUtil.INSTANCE_NAME_REG_EX),
160       new ValidatorModel(CustomValidatorOptions.uniqueInstanceNameValidator, 'Volume Group instance name is already in use, please pick another name', [this.store, serviceId, instance && instance.volumeGroupName])
161     ];
162
163     return new InputFormControl({
164       controlName: 'volumeGroupName',
165       displayName: 'Volume Group Name',
166       dataTestId: 'volumeGroupName',
167       validations: validations,
168       tooltip : 'When filled, VID will create a Volume Group by this name and associate with this module.\n' +
169                 'When empty, the module is created without a Volume Group.',
170       isVisible: this.shouldVGNameBeVisible(isEcompGeneratedNaming,isALaCarte),
171       value: this.getDefaultVolumeGroupName(instance, isEcompGeneratedNaming),
172       onKeypress: (event) => {
173         const pattern:RegExp = ControlGeneratorUtil.INSTANCE_NAME_REG_EX;
174         if (pattern) {
175           if (!pattern.test(event['key'])) {
176             event.preventDefault();
177           }
178         }
179         return event;
180       }
181     });
182   }
183
184   private shouldVGNameBeVisible(isEcompGeneratedNaming: boolean, isALaCarte: boolean) {
185     if((!isALaCarte && !isEcompGeneratedNaming) || isALaCarte){
186       return true;
187     }
188     return false;
189
190   }
191 }