1 import { Component, OnInit } from '@angular/core';
2 import { UntypedFormArray, UntypedFormControl, Validators } from '@angular/forms';
4 import { CdFormBuilder } from '~/app/shared/forms/cd-form-builder';
5 import { ActionLabelsI18n, URLVerbs } from '~/app/shared/constants/app.constants';
6 import { CdFormGroup } from '~/app/shared/forms/cd-form-group';
7 import { CdValidators } from '~/app/shared/forms/cd-validators';
8 import { Icons } from '~/app/shared/enum/icons.enum';
9 import { Permission } from '~/app/shared/models/permissions';
10 import { AuthStorageService } from '~/app/shared/services/auth-storage.service';
11 import { TaskWrapperService } from '~/app/shared/services/task-wrapper.service';
12 import { FinishedTask } from '~/app/shared/models/finished-task';
13 import { ActivatedRoute, Router } from '@angular/router';
14 import { InitiatorRequest, NvmeofService } from '~/app/shared/api/nvmeof.service';
17 selector: 'cd-nvmeof-initiators-form',
18 templateUrl: './nvmeof-initiators-form.component.html',
19 styleUrls: ['./nvmeof-initiators-form.component.scss'],
22 export class NvmeofInitiatorsFormComponent implements OnInit {
24 permission: Permission;
25 initiatorForm: CdFormGroup;
29 remove: boolean = false;
31 removeHosts: { name: string; value: boolean; id: number }[] = [];
35 private authStorageService: AuthStorageService,
36 public actionLabels: ActionLabelsI18n,
37 private nvmeofService: NvmeofService,
38 private taskWrapperService: TaskWrapperService,
39 private router: Router,
40 private route: ActivatedRoute,
41 private formBuilder: CdFormBuilder
43 this.permission = this.authStorageService.getPermissions().nvmeof;
44 this.resource = $localize`Initiator`;
45 this.pageURL = 'block/nvmeof/subsystems';
48 NQN_REGEX = /^nqn\.(19|20)\d\d-(0[1-9]|1[0-2])\.\D{2,3}(\.[A-Za-z0-9-]+)+(:[A-Za-z0-9-\.]+(:[A-Za-z0-9-\.]+)*)$/;
49 NQN_REGEX_UUID = /^nqn\.2014-08\.org\.nvmexpress:uuid:[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;
52 customNQNValidator = CdValidators.custom(
55 !!nqnInput && !(this.NQN_REGEX.test(nqnInput) || this.NQN_REGEX_UUID.test(nqnInput))
59 this.route.queryParams.subscribe((params) => {
60 this.group = params?.['group'];
63 this.action = this.actionLabels.ADD;
64 this.route.params.subscribe((params: { subsystem_nqn: string }) => {
65 this.subsystemNQN = params.subsystem_nqn;
70 this.initiatorForm = new CdFormGroup({
71 allowAnyHost: new UntypedFormControl(false),
72 addHost: new CdFormGroup({
73 addHostCheck: new UntypedFormControl(false),
74 addedHosts: this.formBuilder.array(
79 (hosts: string[]) => !!hosts.length && new Set(hosts)?.size !== hosts.length
87 get addedHosts(): UntypedFormArray {
88 return this.initiatorForm.get('addHost.addedHosts') as UntypedFormArray;
93 newHostFormGroup = this.formBuilder.control('', [this.customNQNValidator, Validators.required]);
94 this.addedHosts.push(newHostFormGroup);
97 removeHost(index: number) {
98 this.addedHosts.removeAt(index);
102 const addHostCheck = this.initiatorForm.get('addHost.addHostCheck').value;
104 while (this.addedHosts.length !== 0) {
105 this.addedHosts.removeAt(0);
113 const component = this;
114 const allowAnyHost: boolean = this.initiatorForm.getValue('allowAnyHost');
115 const hosts: string[] = this.addedHosts.value;
116 let taskUrl = `nvmeof/initiator/${URLVerbs.ADD}`;
118 const request: InitiatorRequest = {
119 host_nqn: hosts.join(','),
125 request['host_nqn'] = hosts.join(',');
127 this.taskWrapperService
128 .wrapTaskAroundCall({
129 task: new FinishedTask(taskUrl, {
130 nqn: this.subsystemNQN
132 call: this.nvmeofService.addSubsystemInitiators(this.subsystemNQN, request)
136 component.initiatorForm.setErrors({ cdSubmitButton: true });
139 this.router.navigate([this.pageURL, { outlets: { modal: null } }]);