]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/blob
b0316782099a852d77b0d21b7a26566fda42d333
[ceph.git] /
1 import { Component, OnInit } from '@angular/core';
2 import { UntypedFormArray, UntypedFormControl, Validators } from '@angular/forms';
3
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';
14
15 import { Icons } from '~/app/shared/enum/icons.enum';
16
17 @Component({
18   selector: 'cd-nvmeof-initiators-form',
19   templateUrl: './nvmeof-initiators-form.component.html',
20   styleUrls: ['./nvmeof-initiators-form.component.scss'],
21   standalone: false
22 })
23 export class NvmeofInitiatorsFormComponent implements OnInit {
24   icons = Icons;
25   permission: Permission;
26   initiatorForm: CdFormGroup;
27   action: string;
28   resource: string;
29   pageURL: string;
30   remove: boolean = false;
31   subsystemNQN: string;
32   removeHosts: { name: string; value: boolean; id: number }[] = [];
33   group: string;
34
35   constructor(
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
43   ) {
44     this.permission = this.authStorageService.getPermissions().nvmeof;
45     this.resource = $localize`Initiator`;
46     this.pageURL = 'block/nvmeof/subsystems';
47   }
48
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}$/;
51   ALLOW_ALL_HOST = '*';
52
53   customNQNValidator = CdValidators.custom(
54     'pattern',
55     (nqnInput: string) =>
56       !!nqnInput && !(this.NQN_REGEX.test(nqnInput) || this.NQN_REGEX_UUID.test(nqnInput))
57   );
58
59   ngOnInit() {
60     this.route.queryParams.subscribe((params) => {
61       this.group = params?.['group'];
62     });
63     this.createForm();
64     this.action = this.actionLabels.ADD;
65     this.route.params.subscribe((params: { subsystem_nqn: string }) => {
66       this.subsystemNQN = params.subsystem_nqn;
67     });
68   }
69
70   createForm() {
71     this.initiatorForm = new CdFormGroup({
72       allowAnyHost: new UntypedFormControl(false),
73       addHost: new CdFormGroup({
74         addHostCheck: new UntypedFormControl(false),
75         addedHosts: this.formBuilder.array(
76           [],
77           [
78             CdValidators.custom(
79               'duplicate',
80               (hosts: string[]) => !!hosts.length && new Set(hosts)?.size !== hosts.length
81             )
82           ]
83         )
84       })
85     });
86   }
87
88   get addedHosts(): UntypedFormArray {
89     return this.initiatorForm.get('addHost.addedHosts') as UntypedFormArray;
90   }
91
92   addHost() {
93     let newHostFormGroup;
94     newHostFormGroup = this.formBuilder.control('', [this.customNQNValidator, Validators.required]);
95     this.addedHosts.push(newHostFormGroup);
96   }
97
98   removeHost(index: number) {
99     this.addedHosts.removeAt(index);
100   }
101
102   setAddHostCheck() {
103     const addHostCheck = this.initiatorForm.get('addHost.addHostCheck').value;
104     if (!addHostCheck) {
105       while (this.addedHosts.length !== 0) {
106         this.addedHosts.removeAt(0);
107       }
108     } else {
109       this.addHost();
110     }
111   }
112
113   onSubmit() {
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}`;
118
119     const request: InitiatorRequest = {
120       host_nqn: hosts.join(','),
121       gw_group: this.group
122     };
123
124     if (allowAnyHost) {
125       hosts.push('*');
126       request['host_nqn'] = hosts.join(',');
127     }
128     this.taskWrapperService
129       .wrapTaskAroundCall({
130         task: new FinishedTask(taskUrl, {
131           nqn: this.subsystemNQN
132         }),
133         call: this.nvmeofService.addSubsystemInitiators(this.subsystemNQN, request)
134       })
135       .subscribe({
136         error() {
137           component.initiatorForm.setErrors({ cdSubmitButton: true });
138         },
139         complete: () => {
140           this.router.navigate([this.pageURL, { outlets: { modal: null } }]);
141         }
142       });
143   }
144 }