1 import { Component, OnInit } from '@angular/core';
2 import { FormControl, Validators } from '@angular/forms';
4 import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
5 import * as _ from 'lodash';
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';
17 selector: 'cd-osd-recv-speed-modal',
18 templateUrl: './osd-recv-speed-modal.component.html',
19 styleUrls: ['./osd-recv-speed-modal.component.scss']
21 export class OsdRecvSpeedModalComponent implements OnInit {
22 osdRecvSpeedForm: CdFormGroup;
23 permissions: Permissions;
25 priorities: any[] = [];
29 public activeModal: NgbActiveModal,
30 private authStorageService: AuthStorageService,
31 private configService: ConfigurationService,
32 private notificationService: NotificationService,
33 private osdService: OsdService
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)
41 this.priorityAttrs = {
43 text: $localize`Max Backfills`,
49 osd_recovery_max_active: {
50 text: $localize`Recovery Max Active`,
56 osd_recovery_max_single_start: {
57 text: $localize`Recovery Max Single Start`,
64 text: $localize`Recovery Sleep`,
72 Object.keys(this.priorityAttrs).forEach((configOptionName) => {
73 this.osdRecvSpeedForm.addControl(
75 new FormControl(null, { validators: [Validators.required] })
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);
86 this.setDescription(config_option_values.configOptions);
87 this.setValidators(config_option_values.configOptions);
91 detectPriority(configOptionValues: any, callbackFn: Function) {
92 const priority = _.find(this.priorities, (p) => {
93 return _.isEqual(p.values, configOptionValues);
96 this.osdRecvSpeedForm.controls.customizePriority.setValue(false);
99 return callbackFn(priority);
102 if (Object.entries(configOptionValues).length === 4) {
103 this.osdRecvSpeedForm.controls.customizePriority.setValue(true);
105 Object({ name: 'custom', text: $localize`Custom`, values: configOptionValues })
109 return callbackFn(this.priorities[0]);
112 getCurrentValues(configOptions: any) {
113 const currentValues: Record<string, any> = { values: {}, configOptions: [] };
114 configOptions.forEach((configOption: any) => {
115 currentValues.configOptions.push(configOption);
117 if ('value' in configOption) {
118 configOption.value.forEach((value: any) => {
119 if (value.section === 'osd') {
120 currentValues.values[configOption.name] = Number(value.value);
123 } else if ('default' in configOption && configOption.default !== null) {
124 currentValues.values[configOption.name] = Number(configOption.default);
127 return currentValues;
130 setDescription(configOptions: Array<any>) {
131 configOptions.forEach((configOption) => {
132 if (configOption.desc !== '') {
133 this.priorityAttrs[configOption.name].desc = configOption.desc;
138 setPriority(priority: any) {
139 const customPriority = _.find(this.priorities, (p) => {
140 return p.name === 'custom';
143 if (priority.name === 'custom') {
144 if (!customPriority) {
145 this.priorities.push(priority);
148 if (customPriority) {
149 this.priorities.splice(this.priorities.indexOf(customPriority), 1);
153 this.osdRecvSpeedForm.controls.priority.setValue(priority.name);
154 Object.entries(priority.values).forEach(([name, value]) => {
155 this.osdRecvSpeedForm.controls[name].setValue(value);
159 setValidators(configOptions: Array<any>) {
160 configOptions.forEach((configOption) => {
161 const typeValidators = ConfigOptionTypes.getTypeValidators(configOption);
162 if (typeValidators) {
163 typeValidators.validators.push(Validators.required);
165 if ('max' in typeValidators && typeValidators.max !== '') {
166 this.priorityAttrs[configOption.name].maxValue = typeValidators.max;
169 if ('min' in typeValidators && typeValidators.min !== '') {
170 this.priorityAttrs[configOption.name].minValue = typeValidators.min;
173 this.priorityAttrs[configOption.name].patternHelpText = typeValidators.patternHelpText;
174 this.osdRecvSpeedForm.controls[configOption.name].setValidators(typeValidators.validators);
176 this.osdRecvSpeedForm.controls[configOption.name].setValidators(Validators.required);
181 onCustomizePriorityChange() {
183 Object.keys(this.priorityAttrs).forEach((configOptionName) => {
184 values[configOptionName] = this.osdRecvSpeedForm.getValue(configOptionName);
187 if (this.osdRecvSpeedForm.getValue('customizePriority')) {
188 const customPriority = {
190 text: $localize`Custom`,
193 this.setPriority(customPriority);
195 this.detectPriority(values, (priority: any) => {
196 this.setPriority(priority);
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);
214 Object.keys(this.priorityAttrs).forEach((configOptionName) => {
215 options[configOptionName] = {
217 value: this.osdRecvSpeedForm.getValue(configOptionName)
221 this.configService.bulkCreate({ options: options }).subscribe(
223 this.notificationService.show(
224 NotificationType.success,
225 $localize`Updated OSD recovery speed priority '${this.osdRecvSpeedForm.getValue(
229 this.activeModal.close();
232 this.activeModal.close();