1 import { Component, OnInit } from '@angular/core';
2 import { FormControl, Validators } from '@angular/forms';
4 import { I18n } from '@ngx-translate/i18n-polyfill';
5 import * as _ from 'lodash';
6 import { BsModalRef } from 'ngx-bootstrap/modal';
7 import { forkJoin as observableForkJoin, of } from 'rxjs';
8 import { mergeMap } from 'rxjs/operators';
10 import { ConfigurationService } from '../../../../shared/api/configuration.service';
11 import { OsdService } from '../../../../shared/api/osd.service';
12 import { NotificationType } from '../../../../shared/enum/notification-type.enum';
13 import { CdFormGroup } from '../../../../shared/forms/cd-form-group';
14 import { NotificationService } from '../../../../shared/services/notification.service';
15 import { ConfigOptionTypes } from '../../configuration/configuration-form/configuration-form.types';
18 selector: 'cd-osd-recv-speed-modal',
19 templateUrl: './osd-recv-speed-modal.component.html',
20 styleUrls: ['./osd-recv-speed-modal.component.scss']
22 export class OsdRecvSpeedModalComponent implements OnInit {
23 osdRecvSpeedForm: CdFormGroup;
28 public bsModalRef: BsModalRef,
29 private configService: ConfigurationService,
30 private notificationService: NotificationService,
32 private osdService: OsdService
34 this.priorities = this.osdService.osdRecvSpeedModalPriorities.KNOWN_PRIORITIES;
35 this.osdRecvSpeedForm = new CdFormGroup({
36 priority: new FormControl(null, { validators: [Validators.required] }),
37 customizePriority: new FormControl(false)
39 this.priorityAttrs = {
41 text: this.i18n('Max Backfills'),
47 osd_recovery_max_active: {
48 text: this.i18n('Recovery Max Active'),
54 osd_recovery_max_single_start: {
55 text: this.i18n('Recovery Max Single Start'),
62 text: this.i18n('Recovery Sleep'),
70 Object.keys(this.priorityAttrs).forEach((configOptionName) => {
71 this.osdRecvSpeedForm.addControl(
73 new FormControl(null, { validators: [Validators.required] })
79 const observables = [];
80 Object.keys(this.priorityAttrs).forEach((configOptionName) => {
81 observables.push(this.configService.get(configOptionName));
84 observableForkJoin(observables)
86 mergeMap((configOptions) => {
87 const result = { values: {}, configOptions: [] };
88 configOptions.forEach((configOption) => {
89 result.configOptions.push(configOption);
91 if (configOption && 'value' in configOption) {
92 configOption.value.forEach((value) => {
93 if (value['section'] === 'osd') {
94 result.values[configOption.name] = Number(value.value);
102 .subscribe((resp) => {
103 this.getStoredPriority(resp.values, (priority) => {
104 this.setPriority(priority);
106 this.setDescription(resp.configOptions);
107 this.setValidators(resp.configOptions);
111 getStoredPriority(configOptionValues: any, callbackFn: Function) {
112 const priority = _.find(this.priorities, (p) => {
113 return _.isEqual(p.values, configOptionValues);
116 this.osdRecvSpeedForm.controls.customizePriority.setValue(false);
119 return callbackFn(priority);
122 if (Object.entries(configOptionValues).length === 4) {
123 this.osdRecvSpeedForm.controls.customizePriority.setValue(true);
125 Object({ name: 'custom', text: this.i18n('Custom'), values: configOptionValues })
129 return callbackFn(this.priorities[0]);
132 setDescription(configOptions: Array<any>) {
133 configOptions.forEach((configOption) => {
134 if (configOption.desc !== '') {
135 this.priorityAttrs[configOption.name].desc = configOption.desc;
140 setPriority(priority: any) {
141 const customPriority = _.find(this.priorities, (p) => {
142 return p.name === 'custom';
145 if (priority.name === 'custom') {
146 if (!customPriority) {
147 this.priorities.push(priority);
150 if (customPriority) {
151 this.priorities.splice(this.priorities.indexOf(customPriority), 1);
155 this.osdRecvSpeedForm.controls.priority.setValue(priority.name);
156 Object.entries(priority.values).forEach(([name, value]) => {
157 this.osdRecvSpeedForm.controls[name].setValue(value);
161 setValidators(configOptions: Array<any>) {
162 configOptions.forEach((configOption) => {
163 const typeValidators = ConfigOptionTypes.getTypeValidators(configOption);
164 if (typeValidators) {
165 typeValidators.validators.push(Validators.required);
167 if ('max' in typeValidators && typeValidators.max !== '') {
168 this.priorityAttrs[configOption.name].maxValue = typeValidators.max;
171 if ('min' in typeValidators && typeValidators.min !== '') {
172 this.priorityAttrs[configOption.name].minValue = typeValidators.min;
175 this.priorityAttrs[configOption.name].patternHelpText = typeValidators.patternHelpText;
176 this.osdRecvSpeedForm.controls[configOption.name].setValidators(typeValidators.validators);
178 this.osdRecvSpeedForm.controls[configOption.name].setValidators(Validators.required);
183 onCustomizePriorityChange() {
184 if (this.osdRecvSpeedForm.getValue('customizePriority')) {
186 Object.keys(this.priorityAttrs).forEach((configOptionName) => {
187 values[configOptionName] = this.osdRecvSpeedForm.getValue(configOptionName);
189 const customPriority = {
191 text: this.i18n('Custom'),
194 this.setPriority(customPriority);
196 Object.keys(this.priorityAttrs).forEach((configOptionName) => {
197 this.osdRecvSpeedForm.get(configOptionName).reset();
199 this.setPriority(this.priorities[0]);
203 onPriorityChange(selectedPriorityName) {
204 const selectedPriority =
205 _.find(this.priorities, (p) => {
206 return p.name === selectedPriorityName;
207 }) || this.priorities[0];
208 // Uncheck the 'Customize priority values' checkbox.
209 this.osdRecvSpeedForm.get('customizePriority').setValue(false);
210 // Set the priority profile values.
211 this.setPriority(selectedPriority);
216 Object.keys(this.priorityAttrs).forEach((configOptionName) => {
217 options[configOptionName] = {
219 value: this.osdRecvSpeedForm.getValue(configOptionName)
223 this.configService.bulkCreate({ options: options }).subscribe(
225 this.notificationService.show(
226 NotificationType.success,
227 this.i18n('OSD recovery speed priority "{{value}}" was set successfully.', {
228 value: this.osdRecvSpeedForm.getValue('priority')
230 this.i18n('OSD recovery speed priority')
232 this.bsModalRef.hide();
235 this.bsModalRef.hide();