Refactor Generic Generators
[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
24 export enum FormControlNames {
25   INSTANCE_NAME = 'instanceName',
26   VOLUME_GROUP_NAME = 'volumeGroupName',
27   LCPCLOUD_REGION_ID = 'lcpCloudRegionId',
28   LEGACY_REGION = 'legacyRegion',
29   TENANT_ID = 'tenantId',
30   ROLLBACK_ON_FAILURE = 'rollbackOnFailure',
31 }
32
33
34 @Injectable()
35 export class VfModuleControlGenerator {
36   aaiService: AaiService;
37   vfModuleModel: VfModule;
38   isUpdateMode : boolean;
39
40   constructor(private genericFormService: GenericFormService,
41               private _basicControlGenerator: ControlGeneratorUtil,
42               private _sharedControllersService: SharedControllersService,
43               private store: NgRedux<AppState>,
44               private http: HttpClient,
45               private _aaiService: AaiService,
46               private _logService: LogService) {
47     this.aaiService = _aaiService;
48   }
49
50   getVfModuleInstance = (serviceId: string, vnfStoreKey: string, UUIDData: Object, isUpdateMode: boolean): VfModuleInstance => {
51     let vfModuleInstance: VfModuleInstance = null;
52     if (isUpdateMode && this.store.getState().service.serviceInstance[serviceId] &&
53       _.has(this.store.getState().service.serviceInstance[serviceId].vnfs, vnfStoreKey) &&
54       _.has(this.store.getState().service.serviceInstance[serviceId].vnfs[vnfStoreKey].vfModules, UUIDData['modelName'])) {
55        vfModuleInstance = Object.assign({},this.store.getState().service.serviceInstance[serviceId].vnfs[vnfStoreKey].vfModules[UUIDData['modelName']][UUIDData['vFModuleStoreKey']]);
56     }
57     return vfModuleInstance;
58   };
59
60   extractVfAccordingToVfModuleUuid(serviceId: string, UUIDData: Object): VfModule {
61     const vfModule = this.store.getState().service.serviceHierarchy[serviceId].vfModules[UUIDData['modelName']];
62     this.vfModuleModel = vfModule;
63     return vfModule;
64   }
65
66   getMacroFormControls(serviceId: string, vnfStoreKey: string, vfModuleStoreKey: string, uuidData : Object, isUpdateMode: boolean): FormControlModel[] {
67     this.isUpdateMode = isUpdateMode;
68     this.extractVfAccordingToVfModuleUuid(serviceId, uuidData);
69     if (_.isNil(serviceId) || _.isNil(vnfStoreKey) || _.isNil(vfModuleStoreKey)) {
70       if(isUpdateMode){
71         this._logService.error('should provide serviceId, vfModuleStoreKey, vnfStoreKey', serviceId);
72         return [];
73       }
74     }
75
76     const vfModuleInstance = this._basicControlGenerator.retrieveInstanceIfUpdateMode(this.store, this.getVfModuleInstance(serviceId, vnfStoreKey, uuidData, isUpdateMode));
77     const vfModuleModel = this.vfModuleModel;
78     const vnf: VnfInstance = this.store.getState().service.serviceInstance[serviceId].vnfs[vnfStoreKey];
79     const vnfModelName: string = vnf.originalName;
80     const vnfModel = new VNFModel(this.store.getState().service.serviceHierarchy[serviceId].vnfs[vnfModelName]);
81
82     let result: FormControlModel[] = [];
83
84     if (!_.isNil(vfModuleModel)) {
85       result = this.pushInstanceAndVGToForm(result, vfModuleInstance, serviceId, vnfModel, false);
86     }
87     if(this.store.getState().global.flags['FLAG_SUPPLEMENTARY_FILE']) {
88       result = this._basicControlGenerator.concatSupplementaryFile(result, vfModuleInstance);
89     }
90     return result;
91   }
92
93   pushInstanceAndVGToForm(result: FormControlModel[], vfModuleElement: any, serviceId: string, vnfModel: any, isALaCarte: boolean) :FormControlModel[]{
94     result.push(this.getInstanceName(vfModuleElement, serviceId, vnfModel.isEcompGeneratedNaming));
95     if (this.vfModuleModel.volumeGroupAllowed) {
96       result.push(this.getVolumeGroupData(vfModuleElement, serviceId, vnfModel.isEcompGeneratedNaming, isALaCarte));
97     }
98     return result;
99   }
100
101   getAlaCarteFormControls(serviceId: string, vnfStoreKey: string, vfModuleStoreKey: string, uuidData : Object, isUpdateMode: boolean): FormControlModel[] {
102     this.isUpdateMode = isUpdateMode;
103     this.extractVfAccordingToVfModuleUuid(serviceId, uuidData);
104     if (_.isNil(serviceId) || _.isNil(vnfStoreKey) || _.isNil(vfModuleStoreKey)) {
105       if(isUpdateMode){
106         this._logService.error('should provide serviceId, vfModuleStoreKey, vnfStoreKey', serviceId);
107         return [];
108       }
109     }
110     const vnf: VnfInstance = this.store.getState().service.serviceInstance[serviceId].vnfs[vnfStoreKey] ;
111     const vnfModelName: string = vnf.originalName;
112     const vnfModel = new VNFModel(this.store.getState().service.serviceHierarchy[serviceId].vnfs[vnfModelName]);
113
114     const vfModuleInstance = this._basicControlGenerator.retrieveInstanceIfUpdateMode(this.store, this.getVfModuleInstance(serviceId, vnfStoreKey, uuidData, isUpdateMode));
115     let result: FormControlModel[] = [];
116     this.pushInstanceAndVGToForm(result, vfModuleInstance, serviceId, vnfModel, true);
117     result.push(this._sharedControllersService.getLcpRegionControl(serviceId, vfModuleInstance, result));
118     result.push(this._sharedControllersService.getLegacyRegion(vfModuleInstance));
119     result.push(this._sharedControllersService.getTenantControl(serviceId, vfModuleInstance));
120     result.push(this._sharedControllersService.getRollbackOnFailureControl(vfModuleInstance));
121     result.push(this._sharedControllersService.getSDNCControl(vfModuleInstance));
122     if(this.store.getState().global.flags['FLAG_SUPPLEMENTARY_FILE']) {
123       result = this._basicControlGenerator.concatSupplementaryFile(result, vfModuleInstance);
124     }
125     return result;
126   }
127
128   getInstanceName(instance: any, serviceId: string, isEcompGeneratedNaming: boolean): FormControlModel {
129     let formControlModel:FormControlModel = this._sharedControllersService.getInstanceNameController(instance, serviceId, isEcompGeneratedNaming, this.vfModuleModel);
130     formControlModel.onBlur = (event, form : FormGroup) => {
131         if(!_.isNil(form.controls['volumeGroupName'])&& event.target.value.length > 0){
132           form.controls['volumeGroupName'].setValue(event.target.value + "_vol");
133         }
134       };
135
136     return formControlModel;
137   }
138
139   getDefaultVolumeGroupName(instance: any, isEcompGeneratedNaming: boolean): string {
140     if ((!_.isNil(instance) && instance.volumeGroupName))  {
141       return instance.volumeGroupName;
142     }
143     if (isEcompGeneratedNaming) {
144       return null;
145     }
146     return this._basicControlGenerator.getDefaultInstanceName(instance, this.vfModuleModel) + "_vol";
147   }
148
149   getVolumeGroupData(instance: any, serviceId: string, isEcompGeneratedNaming: boolean, isALaCarte: boolean): FormControlModel {
150     let validations: ValidatorModel[] = [
151       new ValidatorModel(ValidatorOptions.pattern, 'Instance name may include only alphanumeric characters and underscore.', ControlGeneratorUtil.INSTANCE_NAME_REG_EX),
152       new ValidatorModel(CustomValidatorOptions.uniqueInstanceNameValidator, 'Volume Group instance name is already in use, please pick another name', [this.store, serviceId, instance && instance.volumeGroupName])
153     ];
154
155     return new InputFormControl({
156       controlName: 'volumeGroupName',
157       displayName: 'Volume Group Name',
158       dataTestId: 'volumeGroupName',
159       validations: validations,
160       tooltip : 'When filled, VID will create a Volume Group by this name and associate with this module.\n' +
161                 'When empty, the module is created without a Volume Group.',
162       isVisible: this.shouldVGNameBeVisible(isEcompGeneratedNaming,isALaCarte),
163       value: this.getDefaultVolumeGroupName(instance, isEcompGeneratedNaming),
164       onKeypress: (event) => {
165         const pattern:RegExp = ControlGeneratorUtil.INSTANCE_NAME_REG_EX;
166         if (pattern) {
167           if (!pattern.test(event['key'])) {
168             event.preventDefault();
169           }
170         }
171         return event;
172       }
173     });
174   }
175
176   private shouldVGNameBeVisible(isEcompGeneratedNaming: boolean, isALaCarte: boolean) {
177     if((!isALaCarte && !isEcompGeneratedNaming) || isALaCarte){
178       return true;
179     }
180     return false;
181
182   }
183 }