</div>
</div>
+ <div class="form-group row">
+ <label for="crushNumFailureDomains"
+ class="cd-col-form-label">
+ <ng-container i18n>Crush num failure domain</ng-container>
+ <cd-helper [html]="tooltips.crushNumFailureDomains">
+ </cd-helper>
+ </label>
+ <div class="cd-col-form-input">
+ <input type="number"
+ id="crushNumFailureDomains"
+ name="crushNumFailureDomains"
+ class="form-control"
+ formControlName="crushNumFailureDomains"
+ min="0">
+ <span class="invalid-feedback"
+ *ngIf="form.showError('crushNumFailureDomains', frm, 'required')"
+ i18n>This field is required when crush osds per failure domain is set!</span>
+ </div>
+ </div>
+
+ <div class="form-group row">
+ <label for="crushOsdsPerFailureDomain"
+ class="cd-col-form-label">
+ <ng-container i18n>Crush osds per failure domain</ng-container>
+ <cd-helper [html]="tooltips.crushOsdsPerFailureDomain">
+ </cd-helper>
+ </label>
+ <div class="cd-col-form-input">
+ <input type="number"
+ id="crushOsdsPerFailureDomain"
+ name="crushOsdsPerFailureDomain"
+ class="form-control"
+ formControlName="crushOsdsPerFailureDomain"
+ min="0">
+ <span class="invalid-feedback"
+ *ngIf="form.showError('crushOsdsPerFailureDomain', frm, 'required')"
+ i18n>This field is required when crush num failure domain is set!</span>
+ </div>
+ </div>
+
<div class="form-group row"
*ngIf="plugin === PLUGIN.LRC">
<label for="crushLocality"
[Validators.required, CdValidators.custom('max', () => this.baseValueValidation())]
],
crushFailureDomain: '', // Will be preselected
+ crushNumFailureDomains: [
+ 0,
+ CdValidators.requiredIf({ crushOsdsPerFailureDomain: { op: 'minValue', arg1: 1 } })
+ ],
+ crushOsdsPerFailureDomain: [
+ 0,
+ CdValidators.requiredIf({ crushNumFailureDomains: { op: 'minValue', arg1: 1 } })
+ ],
crushRoot: null, // Will be preselected
crushDeviceClass: '', // Will be preselected
directory: '',
private extendJson(name: string, ecp: ErasureCodeProfile) {
const differentApiAttributes = {
crushFailureDomain: 'crush-failure-domain',
+ crushNumFailureDomains: 'crush-num-failure-domains',
+ crushOsdsPerFailureDomain: 'crush-osds-per-failure-domain',
crushRoot: 'crush-root',
crushDeviceClass: 'crush-device-class',
packetSize: 'packetsize',
<select class="form-select"
id="erasureProfile"
name="erasureProfile"
- formControlName="erasureProfile">
+ formControlName="erasureProfile"
+ (change)="erasureProfileChange()">
<option *ngIf="!ecProfiles"
ngValue=""
i18n>Loading...</option>
for="crushRule"
i18n>Crush ruleset</label>
<div class="cd-col-form-input">
- <span class="form-text text-muted"
+ <span *ngIf="!msrCrush; else msrCrushText"
+ class="form-text text-muted"
i18n>A new crush ruleset will be implicitly created.</span>
+ <ng-template #msrCrushText>
+ <span class="form-text text-muted"
+ i18n>A new crush MSR ruleset will be implicitly created.
+ When crush-osds-per-failure-domain or crush-num-failure-domains is specified</span>
+ </ng-template>
</div>
</div>
<div class="form-group row"
crushUsage: string[] = undefined; // Will only be set if a rule is used by some pool
ecpUsage: string[] = undefined; // Will only be set if a rule is used by some pool
crushRuleMaxSize = 10;
+ msrCrush: boolean = false;
private modalSubscription: Subscription;
this.listenToChanges();
this.setComplexValidators();
});
+ this.erasureProfileChange();
}
private initInfo(info: PoolFormInfo) {
appSelection() {
this.form.get('name').updateValueAndValidity({ emitEvent: false, onlySelf: true });
}
+
+ erasureProfileChange() {
+ const profile = this.form.get('erasureProfile').value;
+ if (profile) {
+ this.msrCrush =
+ profile['crush-num-failure-domains'] > 0 || profile['crush-osds-per-failure-domain'] > 0;
+ }
+ }
}
domain. For instance, if the failure domain is host no two chunks will be stored on the same
host. It is used to create a CRUSH rule step such as step chooseleaf host.`,
+ crushNumFailureDomains: $localize` Number of failure domains to map. Results in a CRUSH MSR rule being created.
+ Must be specified if crush-osds-per-failure-domain is specified.`,
+
+ crushOsdsPerFailureDomain: $localize`Maximum number of OSDs to place in each failure domain --
+ defaults to 1. Using a value greater than one will cause a CRUSH MSR rule to be created.
+ Must be specified if crush-num-failure-domains is specified.`,
+
crushDeviceClass: $localize`Restrict placement to devices of a specific class
(e.g., ssd or hdd), using the crush device class names in the CRUSH map.`,
result = value.length >= prerequisite['arg1'];
}
break;
+ case 'minValue':
+ if (_.isNumber(value)) {
+ result = value >= prerequisite['arg1'];
+ }
}
return result;
}
'crush-root'?: string;
'crush-locality'?: string;
'crush-failure-domain'?: string;
+ 'crush-num-failure-domains'?: number;
+ 'crush-osds-per-failure-domain'?: number;
'crush-device-class'?: string;
'directory'?: string;
}