]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/blob
58f46ae230450e53126e4e0aa88f8bc3794d7fda
[ceph-ci.git] /
1 <cd-modal [modalRef]="activeModal">
2   <ng-container i18n="form title"
3                 class="modal-title">{{ action | titlecase }} {{ resource | upperFirst }}</ng-container>
4
5   <ng-container class="modal-content">
6     <form #frm="ngForm"
7           [formGroup]="form"
8           novalidate>
9       <div class="modal-body">
10         <div class="form-group row">
11           <label class="cd-col-form-label"
12                  for="name"
13                  i18n>Name</label>
14           <div class="cd-col-form-input">
15             <input type="text"
16                    id="name"
17                    name="name"
18                    class="form-control"
19                    placeholder="Name..."
20                    formControlName="name"
21                    autofocus>
22             <span class="invalid-feedback"
23                   *ngIf="form.showError('name', frm, 'required')"
24                   i18n>This field is required!</span>
25             <span class="invalid-feedback"
26                   *ngIf="form.showError('name', frm, 'pattern')"
27                   i18n>The name can only consist of alphanumeric characters, dashes and underscores.</span>
28             <span class="invalid-feedback"
29                   *ngIf="form.showError('name', frm, 'uniqueName')"
30                   i18n>The chosen erasure code profile name is already in use.</span>
31           </div>
32         </div>
33
34         <div class="form-group row">
35           <label for="plugin"
36                  class="cd-col-form-label">
37             <span class="required"
38                   i18n>Plugin</span>
39             <cd-helper [html]="tooltips.plugins[plugin].description">
40             </cd-helper>
41           </label>
42           <div class="cd-col-form-input">
43             <select class="form-select"
44                     id="plugin"
45                     name="plugin"
46                     formControlName="plugin">
47               <option *ngIf="!plugins"
48                       ngValue=""
49                       i18n>Loading...</option>
50               <option *ngFor="let plugin of plugins"
51                       [ngValue]="plugin">
52                 {{ plugin }}
53               </option>
54             </select>
55             <span class="invalid-feedback"
56                   *ngIf="form.showError('name', frm, 'required')"
57                   i18n>This field is required!</span>
58           </div>
59         </div>
60
61         <div class="form-group row">
62           <label for="k"
63                  class="cd-col-form-label">
64             <span class="required"
65                   i18n>Data chunks (k)</span>
66             <cd-helper [html]="tooltips.k">
67             </cd-helper>
68           </label>
69           <div class="cd-col-form-input">
70             <input type="number"
71                    id="k"
72                    name="k"
73                    class="form-control"
74                    ng-model="$ctrl.erasureCodeProfile.k"
75                    placeholder="Data chunks..."
76                    formControlName="k"
77                    min="2">
78             <span class="invalid-feedback"
79                   *ngIf="form.showError('k', frm, 'required')"
80                   i18n>This field is required!</span>
81             <span class="invalid-feedback"
82                   *ngIf="form.showError('k', frm, 'min')"
83                   i18n>Must be equal to or greater than 2.</span>
84             <span class="invalid-feedback"
85                   *ngIf="form.showError('k', frm, 'max')"
86                   i18n>Chunks (k+m) have exceeded the available OSDs of {{deviceCount}}.</span>
87             <span class="invalid-feedback"
88                   *ngIf="form.showError('k', frm, 'unequal')"
89                   i18n>For an equal distribution k has to be a multiple of (k+m)/l.</span>
90             <span class="invalid-feedback"
91                   *ngIf="form.showError('k', frm, 'kLowerM')"
92                   i18n>K has to be equal to or greater than m in order to recover data correctly through c.</span>
93             <span *ngIf="plugin === 'lrc'"
94                   class="form-text text-muted"
95                   i18n>Distribution factor: {{lrcMultiK}}</span>
96           </div>
97         </div>
98
99         <div class="form-group row">
100           <label for="m"
101                  class="cd-col-form-label">
102             <span class="required"
103                   i18n>Coding chunks (m)</span>
104             <cd-helper [html]="tooltips.m">
105             </cd-helper>
106           </label>
107           <div class="cd-col-form-input">
108             <input type="number"
109                    id="m"
110                    name="m"
111                    class="form-control"
112                    placeholder="Coding chunks..."
113                    formControlName="m"
114                    min="1">
115             <span class="invalid-feedback"
116                   *ngIf="form.showError('m', frm, 'required')"
117                   i18n>This field is required!</span>
118             <span class="invalid-feedback"
119                   *ngIf="form.showError('m', frm, 'min')"
120                   i18n>Must be equal to or greater than 1.</span>
121             <span class="invalid-feedback"
122                   *ngIf="form.showError('m', frm, 'max')"
123                   i18n>Chunks (k+m) have exceeded the available OSDs of {{deviceCount}}.</span>
124           </div>
125         </div>
126
127         <div class="form-group row"
128              *ngIf="plugin === 'shec'">
129           <label for="c"
130                  class="cd-col-form-label">
131             <span class="required"
132                   i18n>Durability estimator (c)</span>
133             <cd-helper [html]="tooltips.plugins.shec.c">
134             </cd-helper>
135           </label>
136           <div class="cd-col-form-input">
137             <input type="number"
138                    id="c"
139                    name="c"
140                    class="form-control"
141                    placeholder="Coding chunks..."
142                    formControlName="c"
143                    min="1">
144             <span class="invalid-feedback"
145                   *ngIf="form.showError('c', frm, 'min')"
146                   i18n>Must be equal to or greater than 1.</span>
147             <span class="invalid-feedback"
148                   *ngIf="form.showError('c', frm, 'cGreaterM')"
149                   i18n>C has to be equal to or lower than m as m defines the amount of chunks that can be used.</span>
150           </div>
151         </div>
152
153         <div class="form-group row"
154              *ngIf="plugin === 'clay'">
155           <label for="d"
156                  class="cd-col-form-label">
157             <span class="required"
158                   i18n>Helper chunks (d)</span>
159             <cd-helper [html]="tooltips.plugins.clay.d">
160             </cd-helper>
161           </label>
162           <div class="cd-col-form-input">
163             <div class="input-group">
164               <input type="number"
165                      id="d"
166                      name="d"
167                      class="form-control"
168                      placeholder="Helper chunks..."
169                      formControlName="d">
170               <button class="btn btn-light"
171                       id="d-calc-btn"
172                       ngbTooltip="Set d manually or use the plugin's default calculation that maximizes d."
173                       i18n-ngbTooltip
174                       type="button"
175                       (click)="toggleDCalc()">
176                 <i [ngClass]="dCalc ? icons.unlock : icons.lock"
177                    aria-hidden="true"></i>
178               </button>
179             </div>
180             <span class="form-text text-muted"
181                   *ngIf="dCalc"
182                   i18n>D is automatically updated on k and m changes</span>
183             <ng-container
184               *ngIf="!dCalc">
185               <span class="form-text text-muted"
186                     *ngIf="getDMin() < getDMax()"
187                     i18n>D can be set from {{getDMin()}} to {{getDMax()}}</span>
188               <span class="form-text text-muted"
189                     *ngIf="getDMin() === getDMax()"
190                     i18n>D can only be set to {{getDMax()}}</span>
191             </ng-container>
192             <span class="invalid-feedback"
193                   *ngIf="form.showError('d', frm, 'dMin')"
194                   i18n>D has to be greater than k ({{getDMin()}}).</span>
195             <span class="invalid-feedback"
196                   *ngIf="form.showError('d', frm, 'dMax')"
197                   i18n>D has to be lower than k + m ({{getDMax()}}).</span>
198           </div>
199         </div>
200
201         <div class="form-group row"
202              *ngIf="plugin === PLUGIN.LRC">
203           <label class="cd-col-form-label"
204                  for="l">
205             <span class="required"
206                   i18n>Locality (l)</span>
207             <cd-helper [html]="tooltips.plugins.lrc.l">
208             </cd-helper>
209           </label>
210           <div class="cd-col-form-input">
211             <input type="number"
212                    id="l"
213                    name="l"
214                    class="form-control"
215                    placeholder="Coding chunks..."
216                    formControlName="l"
217                    min="1">
218             <span class="invalid-feedback"
219                   *ngIf="form.showError('l', frm, 'required')"
220                   i18n>This field is required!</span>
221             <span class="invalid-feedback"
222                   *ngIf="form.showError('l', frm, 'min')"
223                   i18n>Must be equal to or greater than 1.</span>
224             <span class="invalid-feedback"
225                   *ngIf="form.showError('l', frm, 'unequal')"
226                   i18n>Can't split up chunks (k+m) correctly with the current locality.</span>
227             <span class="form-text text-muted"
228                   i18n>Locality groups: {{lrcGroups}}</span>
229           </div>
230         </div>
231
232         <div class="form-group row">
233           <label for="crushFailureDomain"
234                  class="cd-col-form-label">
235             <ng-container i18n>Crush failure domain</ng-container>
236             <cd-helper [html]="tooltips.crushFailureDomain">
237             </cd-helper>
238           </label>
239           <div class="cd-col-form-input">
240             <select class="form-select"
241                     id="crushFailureDomain"
242                     name="crushFailureDomain"
243                     formControlName="crushFailureDomain">
244               <option *ngIf="!failureDomains"
245                       ngValue=""
246                       i18n>Loading...</option>
247               <option *ngFor="let domain of failureDomainKeys"
248                       [ngValue]="domain">
249                 {{ domain }} ( {{failureDomains[domain].length}} )
250               </option>
251             </select>
252           </div>
253         </div>
254
255         <div class="form-group row">
256           <label for="crushNumFailureDomains"
257                  class="cd-col-form-label">
258             <ng-container i18n>Crush num failure domain</ng-container>
259             <cd-helper [html]="tooltips.crushNumFailureDomains">
260             </cd-helper>
261           </label>
262           <div class="cd-col-form-input">
263             <input type="number"
264                    id="crushNumFailureDomains"
265                    name="crushNumFailureDomains"
266                    class="form-control"
267                    formControlName="crushNumFailureDomains"
268                    min="0">
269             <span class="invalid-feedback"
270                   *ngIf="form.showError('crushNumFailureDomains', frm, 'required')"
271                   i18n>This field is required when crush osds per failure domain is set!</span>
272           </div>
273         </div>
274
275         <div class="form-group row">
276           <label for="crushOsdsPerFailureDomain"
277                  class="cd-col-form-label">
278             <ng-container i18n>Crush osds per failure domain</ng-container>
279             <cd-helper [html]="tooltips.crushOsdsPerFailureDomain">
280             </cd-helper>
281           </label>
282           <div class="cd-col-form-input">
283             <input type="number"
284                    id="crushOsdsPerFailureDomain"
285                    name="crushOsdsPerFailureDomain"
286                    class="form-control"
287                    formControlName="crushOsdsPerFailureDomain"
288                    min="0">
289             <span class="invalid-feedback"
290                   *ngIf="form.showError('crushOsdsPerFailureDomain', frm, 'required')"
291                   i18n>This field is required when crush num failure domain is set!</span>
292           </div>
293         </div>
294
295         <div class="form-group row"
296              *ngIf="plugin === PLUGIN.LRC">
297           <label for="crushLocality"
298                  class="cd-col-form-label">
299             <ng-container i18n>Crush Locality</ng-container>
300             <cd-helper [html]="tooltips.plugins.lrc.crushLocality">
301             </cd-helper>
302           </label>
303           <div class="cd-col-form-input">
304             <select class="form-select"
305                     id="crushLocality"
306                     name="crushLocality"
307                     formControlName="crushLocality">
308               <option *ngIf="!failureDomains"
309                       ngValue=""
310                       i18n>Loading...</option>
311               <option *ngIf="failureDomainKeys.length > 0"
312                       ngValue=""
313                       i18n>None</option>
314               <option *ngFor="let domain of failureDomainKeys"
315                       [ngValue]="domain">
316                 {{ domain }} ( {{failureDomains[domain].length}} )
317               </option>
318             </select>
319           </div>
320         </div>
321
322         <div class="form-group row"
323              *ngIf="PLUGIN.CLAY === plugin">
324           <label for="scalar_mds"
325                  class="cd-col-form-label">
326             <ng-container i18n>Scalar mds</ng-container>
327             <cd-helper [html]="tooltips.plugins.clay.scalar_mds">
328             </cd-helper>
329           </label>
330           <div class="cd-col-form-input">
331             <select class="form-select"
332                     id="scalar_mds"
333                     name="scalar_mds"
334                     formControlName="scalar_mds">
335               <option *ngFor="let plugin of [PLUGIN.JERASURE, PLUGIN.ISA, PLUGIN.SHEC]"
336                       [ngValue]="plugin">
337                 {{ plugin }}
338               </option>
339             </select>
340           </div>
341         </div>
342
343         <div class="form-group row"
344              *ngIf="[PLUGIN.JERASURE, PLUGIN.ISA, PLUGIN.CLAY].includes(plugin)">
345           <label for="technique"
346                  class="cd-col-form-label">
347             <ng-container i18n>Technique</ng-container>
348             <cd-helper [html]="tooltips.plugins[plugin].technique">
349             </cd-helper>
350           </label>
351           <div class="cd-col-form-input">
352             <select class="form-select"
353                     id="technique"
354                     name="technique"
355                     formControlName="technique">
356               <option *ngFor="let technique of techniques"
357                       [ngValue]="technique">
358                 {{ technique }}
359               </option>
360             </select>
361           </div>
362         </div>
363
364         <div class="form-group row"
365              *ngIf="plugin === PLUGIN.JERASURE">
366           <label for="packetSize"
367                  class="cd-col-form-label">
368             <ng-container i18n>Packetsize</ng-container>
369             <cd-helper [html]="tooltips.plugins.jerasure.packetSize">
370             </cd-helper>
371           </label>
372           <div class="cd-col-form-input">
373             <input type="number"
374                    id="packetSize"
375                    name="packetSize"
376                    class="form-control"
377                    placeholder="Packetsize..."
378                    formControlName="packetSize"
379                    min="1">
380             <span class="invalid-feedback"
381                   *ngIf="form.showError('packetSize', frm, 'min')"
382                   i18n>Must be equal to or greater than 1.</span>
383           </div>
384         </div>
385
386         <div class="form-group row">
387           <label for="crushRoot"
388                  class="cd-col-form-label">
389             <ng-container i18n>Crush root</ng-container>
390             <cd-helper [html]="tooltips.crushRoot">
391             </cd-helper>
392           </label>
393           <div class="cd-col-form-input">
394             <select class="form-select"
395                     id="crushRoot"
396                     name="crushRoot"
397                     formControlName="crushRoot">
398               <option *ngIf="!buckets"
399                       ngValue=""
400                       i18n>Loading...</option>
401               <option *ngFor="let bucket of buckets"
402                       [ngValue]="bucket">
403                 {{ bucket.name }}
404               </option>
405             </select>
406           </div>
407         </div>
408
409         <div class="form-group row">
410           <label for="crushDeviceClass"
411                  class="cd-col-form-label">
412             <ng-container i18n>Crush device class</ng-container>
413           </label>
414           <div class="cd-col-form-input">
415             <select class="form-select"
416                     id="crushDeviceClass"
417                     name="crushDeviceClass"
418                     formControlName="crushDeviceClass">
419               <option ngValue=""
420                       i18n>All devices</option>
421               <option *ngFor="let deviceClass of devices"
422                       [ngValue]="deviceClass">
423                 {{ deviceClass }}
424               </option>
425             </select>
426             <cd-help-text>
427               <span i18n>{{tooltips.crushDeviceClass}}</span>
428             </cd-help-text>
429             <span class="form-text text-muted"
430                   i18n>Available OSDs: {{deviceCount}}</span>
431           </div>
432         </div>
433
434         <div class="form-group row">
435           <label for="directory"
436                  class="cd-col-form-label">
437             <ng-container i18n>Directory</ng-container>
438             <cd-helper [html]="tooltips.directory">
439             </cd-helper>
440           </label>
441           <div class="cd-col-form-input">
442             <input type="text"
443                    id="directory"
444                    name="directory"
445                    class="form-control"
446                    placeholder="Path..."
447                    formControlName="directory">
448           </div>
449         </div>
450       </div>
451
452       <div class="modal-footer">
453         <cd-form-button-panel (submitActionEvent)="onSubmit()"
454                               [form]="form"
455                               [submitText]="(action | titlecase) + ' ' + (resource | upperFirst)"></cd-form-button-panel>
456       </div>
457     </form>
458   </ng-container>
459 </cd-modal>