]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/blob
f4b165b2eea8880976ec0f906ed18edb29a59b1a
[ceph-ci.git] /
1 import { Component, OnInit } from '@angular/core';
2 import { FormControl, Validators } from '@angular/forms';
3
4 import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
5 import * as _ from 'lodash';
6
7 import { ConfigurationService } from '../../../../shared/api/configuration.service';
8 import { OsdService } from '../../../../shared/api/osd.service';
9 import { ConfigOptionTypes } from '../../../../shared/components/config-option/config-option.types';
10 import { NotificationType } from '../../../../shared/enum/notification-type.enum';
11 import { CdFormGroup } from '../../../../shared/forms/cd-form-group';
12 import { Permissions } from '../../../../shared/models/permissions';
13 import { AuthStorageService } from '../../../../shared/services/auth-storage.service';
14 import { NotificationService } from '../../../../shared/services/notification.service';
15
16 @Component({
17   selector: 'cd-osd-recv-speed-modal',
18   templateUrl: './osd-recv-speed-modal.component.html',
19   styleUrls: ['./osd-recv-speed-modal.component.scss']
20 })
21 export class OsdRecvSpeedModalComponent implements OnInit {
22   osdRecvSpeedForm: CdFormGroup;
23   permissions: Permissions;
24
25   priorities: any[] = [];
26   priorityAttrs = {};
27
28   constructor(
29     public activeModal: NgbActiveModal,
30     private authStorageService: AuthStorageService,
31     private configService: ConfigurationService,
32     private notificationService: NotificationService,
33     private osdService: OsdService
34   ) {
35     this.permissions = this.authStorageService.getPermissions();
36     this.priorities = this.osdService.osdRecvSpeedModalPriorities.KNOWN_PRIORITIES;
37     this.osdRecvSpeedForm = new CdFormGroup({
38       priority: new FormControl(null, { validators: [Validators.required] }),
39       customizePriority: new FormControl(false)
40     });
41     this.priorityAttrs = {
42       osd_max_backfills: {
43         text: $localize`Max Backfills`,
44         desc: '',
45         patternHelpText: '',
46         maxValue: undefined,
47         minValue: undefined
48       },
49       osd_recovery_max_active: {
50         text: $localize`Recovery Max Active`,
51         desc: '',
52         patternHelpText: '',
53         maxValue: undefined,
54         minValue: undefined
55       },
56       osd_recovery_max_single_start: {
57         text: $localize`Recovery Max Single Start`,
58         desc: '',
59         patternHelpText: '',
60         maxValue: undefined,
61         minValue: undefined
62       },
63       osd_recovery_sleep: {
64         text: $localize`Recovery Sleep`,
65         desc: '',
66         patternHelpText: '',
67         maxValue: undefined,
68         minValue: undefined
69       }
70     };
71
72     Object.keys(this.priorityAttrs).forEach((configOptionName) => {
73       this.osdRecvSpeedForm.addControl(
74         configOptionName,
75         new FormControl(null, { validators: [Validators.required] })
76       );
77     });
78   }
79
80   ngOnInit() {
81     this.configService.filter(Object.keys(this.priorityAttrs)).subscribe((data: any) => {
82       const config_option_values = this.getCurrentValues(data);
83       this.detectPriority(config_option_values.values, (priority: any) => {
84         this.setPriority(priority);
85       });
86       this.setDescription(config_option_values.configOptions);
87       this.setValidators(config_option_values.configOptions);
88     });
89   }
90
91   detectPriority(configOptionValues: any, callbackFn: Function) {
92     const priority = _.find(this.priorities, (p) => {
93       return _.isEqual(p.values, configOptionValues);
94     });
95
96     this.osdRecvSpeedForm.controls.customizePriority.setValue(false);
97
98     if (priority) {
99       return callbackFn(priority);
100     }
101
102     if (Object.entries(configOptionValues).length === 4) {
103       this.osdRecvSpeedForm.controls.customizePriority.setValue(true);
104       return callbackFn(
105         Object({ name: 'custom', text: $localize`Custom`, values: configOptionValues })
106       );
107     }
108
109     return callbackFn(this.priorities[0]);
110   }
111
112   getCurrentValues(configOptions: any) {
113     const currentValues: Record<string, any> = { values: {}, configOptions: [] };
114     configOptions.forEach((configOption: any) => {
115       currentValues.configOptions.push(configOption);
116
117       if ('value' in configOption) {
118         configOption.value.forEach((value: any) => {
119           if (value.section === 'osd') {
120             currentValues.values[configOption.name] = Number(value.value);
121           }
122         });
123       } else if ('default' in configOption && configOption.default !== null) {
124         currentValues.values[configOption.name] = Number(configOption.default);
125       }
126     });
127     return currentValues;
128   }
129
130   setDescription(configOptions: Array<any>) {
131     configOptions.forEach((configOption) => {
132       if (configOption.desc !== '') {
133         this.priorityAttrs[configOption.name].desc = configOption.desc;
134       }
135     });
136   }
137
138   setPriority(priority: any) {
139     const customPriority = _.find(this.priorities, (p) => {
140       return p.name === 'custom';
141     });
142
143     if (priority.name === 'custom') {
144       if (!customPriority) {
145         this.priorities.push(priority);
146       }
147     } else {
148       if (customPriority) {
149         this.priorities.splice(this.priorities.indexOf(customPriority), 1);
150       }
151     }
152
153     this.osdRecvSpeedForm.controls.priority.setValue(priority.name);
154     Object.entries(priority.values).forEach(([name, value]) => {
155       this.osdRecvSpeedForm.controls[name].setValue(value);
156     });
157   }
158
159   setValidators(configOptions: Array<any>) {
160     configOptions.forEach((configOption) => {
161       const typeValidators = ConfigOptionTypes.getTypeValidators(configOption);
162       if (typeValidators) {
163         typeValidators.validators.push(Validators.required);
164
165         if ('max' in typeValidators && typeValidators.max !== '') {
166           this.priorityAttrs[configOption.name].maxValue = typeValidators.max;
167         }
168
169         if ('min' in typeValidators && typeValidators.min !== '') {
170           this.priorityAttrs[configOption.name].minValue = typeValidators.min;
171         }
172
173         this.priorityAttrs[configOption.name].patternHelpText = typeValidators.patternHelpText;
174         this.osdRecvSpeedForm.controls[configOption.name].setValidators(typeValidators.validators);
175       } else {
176         this.osdRecvSpeedForm.controls[configOption.name].setValidators(Validators.required);
177       }
178     });
179   }
180
181   onCustomizePriorityChange() {
182     const values = {};
183     Object.keys(this.priorityAttrs).forEach((configOptionName) => {
184       values[configOptionName] = this.osdRecvSpeedForm.getValue(configOptionName);
185     });
186
187     if (this.osdRecvSpeedForm.getValue('customizePriority')) {
188       const customPriority = {
189         name: 'custom',
190         text: $localize`Custom`,
191         values: values
192       };
193       this.setPriority(customPriority);
194     } else {
195       this.detectPriority(values, (priority: any) => {
196         this.setPriority(priority);
197       });
198     }
199   }
200
201   onPriorityChange(selectedPriorityName: string) {
202     const selectedPriority =
203       _.find(this.priorities, (p) => {
204         return p.name === selectedPriorityName;
205       }) || this.priorities[0];
206     // Uncheck the 'Customize priority values' checkbox.
207     this.osdRecvSpeedForm.get('customizePriority').setValue(false);
208     // Set the priority profile values.
209     this.setPriority(selectedPriority);
210   }
211
212   submitAction() {
213     const options = {};
214     Object.keys(this.priorityAttrs).forEach((configOptionName) => {
215       options[configOptionName] = {
216         section: 'osd',
217         value: this.osdRecvSpeedForm.getValue(configOptionName)
218       };
219     });
220
221     this.configService.bulkCreate({ options: options }).subscribe(
222       () => {
223         this.notificationService.show(
224           NotificationType.success,
225           $localize`Updated OSD recovery speed priority '${this.osdRecvSpeedForm.getValue(
226             'priority'
227           )}'`
228         );
229         this.activeModal.close();
230       },
231       () => {
232         this.activeModal.close();
233       }
234     );
235   }
236 }