1 <div class="col-sm-12 col-lg-6">
2 <form name="targetForm"
4 [formGroup]="targetForm"
8 <div i18n="form title|Example: Create Pool@@formTitle"
9 class="card-header">{{ action | titlecase }} {{ resource | upperFirst }}</div>
11 <div class="card-body">
13 <div class="form-group row">
14 <label class="col-form-label col-sm-3"
16 <ng-container i18n>Target IQN</ng-container>
17 <span class="required"></span>
19 <div class="col-sm-9">
20 <div class="input-group">
21 <input class="form-control"
25 formControlName="target_iqn" />
26 <span class="input-group-append">
27 <button class="btn btn-light"
30 (click)="targetSettingsModal()">
31 <i [ngClass]="[icons.deepCheck]"
32 aria-hidden="true"></i>
37 <span class="invalid-feedback"
38 *ngIf="targetForm.showError('target_iqn', formDir, 'required')"
39 i18n>This field is required.</span>
41 <span class="invalid-feedback"
42 *ngIf="targetForm.showError('target_iqn', formDir, 'pattern')"
43 i18n>IQN has wrong pattern.</span>
45 <span class="invalid-feedback"
46 *ngIf="targetForm.showError('target_iqn', formDir, 'iqn')">
47 <ng-container i18n>An IQN has the following notation
48 'iqn.$year-$month.$reversedAddress:$definedName'</ng-container>
50 <ng-container i18n>For example: iqn.2016-06.org.dashboard:storage:disk.sn-a8675309</ng-container>
53 href="https://en.wikipedia.org/wiki/ISCSI#Addressing"
54 i18n>More information</a>
57 <span class="form-text text-muted"
58 *ngIf="hasAdvancedSettings(targetForm.getValue('target_controls'))"
59 i18n>This target has modified advanced settings.</span>
65 <div class="form-group row">
66 <label class="col-form-label col-sm-3"
68 <ng-container i18n>Portals</ng-container>
69 <span class="required"></span>
71 <div class="col-sm-9">
73 <ng-container *ngFor="let portal of portals.value; let i = index">
74 <div class="input-group cd-mb">
75 <input class="cd-form-control"
79 <span class="input-group-append">
80 <button class="btn btn-light"
82 (click)="removePortal(i, portal)">
83 <i [ngClass]="[icons.destroy]"
84 aria-hidden="true"></i>
90 <span class="invalid-feedback"
91 *ngIf="targetForm.showError('portals', formDir, 'minGateways')"
92 i18n>At least {{ minimum_gateways }} gateways are required.</span>
95 <div class="col-md-12">
96 <cd-select [data]="portals.value"
97 [options]="portalsSelections"
98 [messages]="messages.portals"
99 (selection)="onPortalSelection($event)"
100 elemClass="btn btn-light float-right">
101 <i [ngClass]="[icons.add]"></i>
102 <ng-container i18n>Add portal</ng-container>
112 <div class="form-group row">
113 <label class="col-form-label col-sm-3"
116 <div class="col-sm-9">
117 <ng-container *ngFor="let image of targetForm.getValue('disks'); let i = index">
118 <div class="input-group cd-mb">
119 <input class="cd-form-control"
123 <span class="input-group-append">
124 <button class="btn btn-light"
126 (click)="imageSettingsModal(image)">
127 <i [ngClass]="[icons.deepCheck]"
128 aria-hidden="true"></i>
130 <button class="btn btn-light"
132 (click)="removeImage(i, image)">
133 <i [ngClass]="[icons.destroy]"
134 aria-hidden="true"></i>
140 <span class="form-text text-muted">
141 <ng-container *ngIf="backstores.length > 1"
142 i18n>Backstore: {{ imagesSettings[image].backstore | iscsiBackstore }}. </ng-container>
144 <ng-container *ngIf="hasAdvancedSettings(imagesSettings[image][imagesSettings[image].backstore])"
145 i18n>This image has modified settings.</ng-container>
149 <span class="invalid-feedback"
150 *ngIf="targetForm.showError('disks', formDir, 'required')"
151 i18n>At least 1 image is required.</span>
154 <div class="col-md-12">
155 <cd-select [data]="disks.value"
156 [options]="imagesSelections"
157 [messages]="messages.images"
158 (selection)="onImageSelection($event)"
159 elemClass="btn btn-light float-right">
160 <i [ngClass]="[icons.add]"></i>
161 <ng-container i18n>Add image</ng-container>
171 <div class="form-group row">
172 <div class="offset-sm-3 col-sm-9">
173 <div class="custom-control custom-checkbox">
174 <input type="checkbox"
175 class="custom-control-input"
176 formControlName="acl_enabled"
179 <label for="acl_enabled"
180 class="custom-control-label"
181 i18n>ACL authentication</label>
189 <div class="form-group row"
190 *ngIf="targetForm.getValue('acl_enabled')">
191 <label class="col-form-label col-sm-3"
193 i18n>Initiators</label>
194 <div class="col-sm-9"
195 formArrayName="initiators">
196 <div class="card mb-2"
197 *ngFor="let initiator of initiators.controls; let ii = index"
198 [formGroupName]="ii">
199 <div class="card-header">
200 <ng-container i18n>Initiator</ng-container>: {{ initiator.getValue('client_iqn') }}
201 <button type="button"
203 (click)="removeInitiator(ii)">
204 <i [ngClass]="[icons.deepCheck]"></i>
207 <div class="card-body">
208 <!-- Initiator: Name -->
209 <div class="form-group row">
210 <label class="col-form-label col-sm-3"
212 <ng-container i18n>Client IQN</ng-container>
213 <span class="required"></span>
215 <div class="col-sm-9">
216 <input class="form-control"
218 formControlName="client_iqn"
219 (blur)="updatedInitiatorSelector()">
221 <span class="invalid-feedback"
222 *ngIf="initiator.showError('client_iqn', formDir, 'notUnique')"
223 i18n>Initiator IQN needs to be unique.</span>
225 <span class="invalid-feedback"
226 *ngIf="initiator.showError('client_iqn', formDir, 'required')"
227 i18n>This field is required.</span>
229 <span class="invalid-feedback"
230 *ngIf="initiator.showError('client_iqn', formDir, 'pattern')"
231 i18n>IQN has wrong pattern.</span>
235 <ng-container formGroupName="auth">
236 <!-- Initiator: User -->
237 <div class="form-group row">
238 <label class="col-form-label col-sm-3"
241 <div class="col-sm-9">
242 <input [id]="'user' + ii"
244 formControlName="user"
246 <span class="invalid-feedback"
247 *ngIf="initiator.showError('user', formDir, 'required')"
248 i18n>This field is required.</span>
250 <span class="invalid-feedback"
251 *ngIf="initiator.showError('user', formDir, 'pattern')"
252 i18n>Usernames must have a length of 8 to 64 characters and
253 can only contain letters, '.', '@', '-', '_' or ':'.</span>
257 <!-- Initiator: Password -->
258 <div class="form-group row">
259 <label class="col-form-label col-sm-3"
261 i18n>Password</label>
262 <div class="col-sm-9">
263 <div class="input-group">
264 <input [id]="'password' + ii"
266 formControlName="password"
269 <span class="input-group-append">
270 <button type="button"
271 class="btn btn-light"
272 [cdPasswordButton]="'password' + ii">
274 <button type="button"
275 class="btn btn-light"
276 [cdCopy2ClipboardButton]="'password' + ii">
280 <span class="invalid-feedback"
281 *ngIf="initiator.showError('password', formDir, 'required')"
282 i18n>This field is required.</span>
284 <span class="invalid-feedback"
285 *ngIf="initiator.showError('password', formDir, 'pattern')"
286 i18n>Passwords must have a length of 12 to 16 characters
287 and can only contain letters, '@', '-', '_' or '/'.</span>
292 <!-- Initiator: mutual_user -->
293 <div class="form-group row">
294 <label class="col-form-label col-sm-3"
296 <ng-container i18n>Mutual User</ng-container>
298 <div class="col-sm-9">
299 <input [id]="'mutual_user' + ii"
301 formControlName="mutual_user"
304 <span class="invalid-feedback"
305 *ngIf="initiator.showError('mutual_user', formDir, 'required')"
306 i18n>This field is required.</span>
308 <span class="invalid-feedback"
309 *ngIf="initiator.showError('mutual_user', formDir, 'pattern')"
310 i18n>Usernames must have a length of 8 to 64 characters and
311 can only contain letters, '.', '@', '-', '_' or ':'.</span>
315 <!-- Initiator: mutual_password -->
316 <div class="form-group row">
317 <label class="col-form-label col-sm-3"
318 for="mutual_password"
319 i18n>Mutual Password</label>
320 <div class="col-sm-9">
321 <div class="input-group">
322 <input [id]="'mutual_password' + ii"
324 formControlName="mutual_password"
327 <span class="input-group-append">
328 <button type="button"
329 class="btn btn-light"
330 [cdPasswordButton]="'mutual_password' + ii">
332 <button type="button"
333 class="btn btn-light"
334 [cdCopy2ClipboardButton]="'mutual_password' + ii">
338 <span class="invalid-feedback"
339 *ngIf="initiator.showError('mutual_password', formDir, 'required')"
340 i18n>This field is required.</span>
342 <span class="invalid-feedback"
343 *ngIf="initiator.showError('mutual_password', formDir, 'pattern')"
344 i18n>Passwords must have a length of 12 to 16 characters and
345 can only contain letters, '@', '-', '_' or '/'.</span>
350 <!-- Initiator: Images -->
351 <div class="form-group row">
352 <label class="col-form-label col-sm-3"
355 <div class="col-sm-9">
356 <ng-container *ngFor="let image of initiator.getValue('luns'); let li = index">
357 <div class="input-group cd-mb">
358 <input class="cd-form-control"
362 <span class="input-group-append">
363 <button class="btn btn-light"
365 (click)="removeInitiatorImage(initiator, li, ii, image)">
366 <i [ngClass]="[icons.destroy]"
367 aria-hidden="true"></i>
373 <span *ngIf="initiator.getValue('cdIsInGroup')"
374 i18n>Initiator belongs to a group. Images will be configure in the group.</span>
377 *ngIf="!initiator.getValue('cdIsInGroup')">
378 <div class="col-md-12">
379 <cd-select [data]="initiator.getValue('luns')"
380 [options]="imagesInitiatorSelections[ii]"
381 [messages]="messages.initiatorImage"
382 elemClass="btn btn-light float-right">
383 <i [ngClass]="[icons.add]"></i>
384 <ng-container i18n>Add image</ng-container>
394 <div class="col-md-12">
395 <span class="form-text text-muted"
396 *ngIf="initiators.controls.length === 0"
397 i18n>No items added.</span>
399 <button (click)="addInitiator(); false"
400 class="btn btn-light float-right">
401 <i [ngClass]="[icons.add]"></i>
402 <ng-container i18n>Add initiator</ng-container>
412 <div class="form-group row"
413 *ngIf="targetForm.getValue('acl_enabled')">
414 <label class="col-form-label col-sm-3"
417 <div class="col-sm-9"
418 formArrayName="groups">
419 <div class="card mb-2"
420 *ngFor="let group of groups.controls; let gi = index"
421 [formGroupName]="gi">
422 <div class="card-header">
423 <ng-container i18n>Group</ng-container>: {{ group.getValue('group_id') }}
424 <button type="button"
426 (click)="groups.removeAt(gi)">
427 <i [ngClass]="[icons.destroy]"></i>
430 <div class="card-body">
431 <!-- Group: group_id -->
432 <div class="form-group row">
433 <label class="col-form-label col-sm-3"
435 <ng-container i18n>Name</ng-container>
436 <span class="required"></span>
438 <div class="col-sm-9">
439 <input class="form-control"
441 formControlName="group_id">
445 <!-- Group: members -->
446 <div class="form-group row">
447 <label class="col-form-label col-sm-3"
449 <ng-container i18n>Initiators</ng-container>
451 <div class="col-sm-9">
452 <ng-container *ngFor="let member of group.getValue('members'); let i = index">
453 <div class="input-group cd-mb">
454 <input class="cd-form-control"
458 <span class="input-group-append">
459 <button class="btn btn-light"
461 (click)="removeGroupInitiator(group, i, gi)">
462 <i [ngClass]="[icons.destroy]"
463 aria-hidden="true"></i>
470 <div class="col-md-12">
471 <cd-select [data]="group.getValue('members')"
472 [options]="groupMembersSelections[gi]"
473 [messages]="messages.groupInitiator"
474 (selection)="onGroupMemberSelection($event)"
475 elemClass="btn btn-light float-right">
476 <i [ngClass]="[icons.add]"></i>
477 <ng-container i18n>Add initiator</ng-container>
486 <!-- Group: disks -->
487 <div class="form-group row">
488 <label class="col-form-label col-sm-3"
490 <ng-container i18n>Images</ng-container>
492 <div class="col-sm-9">
493 <ng-container *ngFor="let disk of group.getValue('disks'); let i = index">
494 <div class="input-group cd-mb">
495 <input class="cd-form-control"
499 <span class="input-group-append">
500 <button class="btn btn-light"
502 (click)="removeGroupDisk(group, i, gi)">
503 <i [ngClass]="[icons.destroy]"
504 aria-hidden="true"></i>
511 <div class="col-md-12">
512 <cd-select [data]="group.getValue('disks')"
513 [options]="groupDiskSelections[gi]"
514 [messages]="messages.initiatorImage"
515 elemClass="btn btn-light float-right">
516 <i [ngClass]="[icons.add]"></i>
517 <ng-container i18n>Add image</ng-container>
529 <div class="col-md-12">
530 <span class="form-text text-muted"
531 *ngIf="groups.controls.length === 0"
532 i18n>No items added.</span>
534 <button (click)="addGroup(); false"
535 class="btn btn-light float-right">
536 <i [ngClass]="[icons.add]"></i>
537 <ng-container i18n>Add group</ng-container>
545 <div class="card-footer">
546 <div class="button-group text-right">
547 <cd-submit-button (submitAction)="submit()"
548 i18n="form action button|Example: Create Pool@@formActionButton"
549 [form]="formDir">{{ action | titlecase }} {{ resource | upperFirst }}</cd-submit-button>
550 <cd-back-button></cd-back-button>