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 { Permission } from '~/app/shared/models/permissions';
9 import { AuthStorageService } from '~/app/shared/services/auth-storage.service';
10 import { TaskWrapperService } from '~/app/shared/services/task-wrapper.service';
11 import { FinishedTask } from '~/app/shared/models/finished-task';
12 import { ActivatedRoute, Router } from '@angular/router';
13 import { InitiatorRequest, NvmeofService } from '~/app/shared/api/nvmeof.service';
15 import { Icons } from '~/app/shared/enum/icons.enum';
18 selector: 'cd-nvmeof-initiators-form',
19 templateUrl: './nvmeof-initiators-form.component.html',
20 styleUrls: ['./nvmeof-initiators-form.component.scss'],
23 export class NvmeofInitiatorsFormComponent implements OnInit {
25 permission: Permission;
26 initiatorForm: CdFormGroup;
30 remove: boolean = false;
32 removeHosts: { name: string; value: boolean; id: number }[] = [];
36 private authStorageService: AuthStorageService,
37 public actionLabels: ActionLabelsI18n,
38 private nvmeofService: NvmeofService,
39 private taskWrapperService: TaskWrapperService,
40 private router: Router,
41 private route: ActivatedRoute,
42 private formBuilder: CdFormBuilder
44 this.permission = this.authStorageService.getPermissions().nvmeof;
45 this.resource = $localize`Initiator`;
46 this.pageURL = 'block/nvmeof/subsystems';
49 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-\.]+)*)$/;
50 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}$/;
53 customNQNValidator = CdValidators.custom(
56 !!nqnInput && !(this.NQN_REGEX.test(nqnInput) || this.NQN_REGEX_UUID.test(nqnInput))
60 this.route.queryParams.subscribe((params) => {
61 this.group = params?.['group'];
64 this.action = this.actionLabels.ADD;
65 this.route.params.subscribe((params: { subsystem_nqn: string }) => {
66 this.subsystemNQN = params.subsystem_nqn;
71 this.initiatorForm = new CdFormGroup({
72 allowAnyHost: new UntypedFormControl(false),
73 addHost: new CdFormGroup({
74 addHostCheck: new UntypedFormControl(false),
75 addedHosts: this.formBuilder.array(
80 (hosts: string[]) => !!hosts.length && new Set(hosts)?.size !== hosts.length
88 get addedHosts(): UntypedFormArray {
89 return this.initiatorForm.get('addHost.addedHosts') as UntypedFormArray;
94 newHostFormGroup = this.formBuilder.control('', [this.customNQNValidator, Validators.required]);
95 this.addedHosts.push(newHostFormGroup);
98 removeHost(index: number) {
99 this.addedHosts.removeAt(index);
103 const addHostCheck = this.initiatorForm.get('addHost.addHostCheck').value;
105 while (this.addedHosts.length !== 0) {
106 this.addedHosts.removeAt(0);
114 const component = this;
115 const allowAnyHost: boolean = this.initiatorForm.getValue('allowAnyHost');
116 const hosts: string[] = this.addedHosts.value;
117 let taskUrl = `nvmeof/initiator/${URLVerbs.ADD}`;
119 const request: InitiatorRequest = {
120 host_nqn: hosts.join(','),
126 request['host_nqn'] = hosts.join(',');
128 this.taskWrapperService
129 .wrapTaskAroundCall({
130 task: new FinishedTask(taskUrl, {
131 nqn: this.subsystemNQN
133 call: this.nvmeofService.addSubsystemInitiators(this.subsystemNQN, request)
137 component.initiatorForm.setErrors({ cdSubmitButton: true });
140 this.router.navigate([this.pageURL, { outlets: { modal: null } }]);