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';
16 selector: 'cd-nvmeof-initiators-form',
17 templateUrl: './nvmeof-initiators-form.component.html',
18 styleUrls: ['./nvmeof-initiators-form.component.scss'],
21 export class NvmeofInitiatorsFormComponent implements OnInit {
22 permission: Permission;
23 initiatorForm: CdFormGroup;
27 remove: boolean = false;
29 removeHosts: { name: string; value: boolean; id: number }[] = [];
33 private authStorageService: AuthStorageService,
34 public actionLabels: ActionLabelsI18n,
35 private nvmeofService: NvmeofService,
36 private taskWrapperService: TaskWrapperService,
37 private router: Router,
38 private route: ActivatedRoute,
39 private formBuilder: CdFormBuilder
41 this.permission = this.authStorageService.getPermissions().nvmeof;
42 this.resource = $localize`Initiator`;
43 this.pageURL = 'block/nvmeof/subsystems';
46 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-\.]+)*)$/;
47 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}$/;
50 customNQNValidator = CdValidators.custom(
53 !!nqnInput && !(this.NQN_REGEX.test(nqnInput) || this.NQN_REGEX_UUID.test(nqnInput))
57 this.route.queryParams.subscribe((params) => {
58 this.group = params?.['group'];
61 this.action = this.actionLabels.ADD;
62 this.route.params.subscribe((params: { subsystem_nqn: string }) => {
63 this.subsystemNQN = params.subsystem_nqn;
68 this.initiatorForm = new CdFormGroup({
69 allowAnyHost: new UntypedFormControl(false),
70 addHost: new CdFormGroup({
71 addHostCheck: new UntypedFormControl(false),
72 addedHosts: this.formBuilder.array(
77 (hosts: string[]) => !!hosts.length && new Set(hosts)?.size !== hosts.length
85 get addedHosts(): UntypedFormArray {
86 return this.initiatorForm.get('addHost.addedHosts') as UntypedFormArray;
91 newHostFormGroup = this.formBuilder.control('', [this.customNQNValidator, Validators.required]);
92 this.addedHosts.push(newHostFormGroup);
95 removeHost(index: number) {
96 this.addedHosts.removeAt(index);
100 const addHostCheck = this.initiatorForm.get('addHost.addHostCheck').value;
102 while (this.addedHosts.length !== 0) {
103 this.addedHosts.removeAt(0);
111 const component = this;
112 const allowAnyHost: boolean = this.initiatorForm.getValue('allowAnyHost');
113 const hosts: string[] = this.addedHosts.value;
114 let taskUrl = `nvmeof/initiator/${URLVerbs.ADD}`;
116 const request: InitiatorRequest = {
117 host_nqn: hosts.join(','),
123 request['host_nqn'] = hosts.join(',');
125 this.taskWrapperService
126 .wrapTaskAroundCall({
127 task: new FinishedTask(taskUrl, {
128 nqn: this.subsystemNQN
130 call: this.nvmeofService.addSubsystemInitiators(this.subsystemNQN, request)
134 component.initiatorForm.setErrors({ cdSubmitButton: true });
137 this.router.navigate([this.pageURL, { outlets: { modal: null } }]);