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