1 import { Component, OnInit } from '@angular/core';
2 import { UntypedFormControl, Validators } from '@angular/forms';
3 import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
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 { MAX_NAMESPACE, NvmeofService } from '~/app/shared/api/nvmeof.service';
16 selector: 'cd-nvmeof-subsystems-form',
17 templateUrl: './nvmeof-subsystems-form.component.html',
18 styleUrls: ['./nvmeof-subsystems-form.component.scss']
20 export class NvmeofSubsystemsFormComponent implements OnInit {
21 permission: Permission;
22 subsystemForm: CdFormGroup;
26 defaultMaxNamespace: number = MAX_NAMESPACE;
30 private authStorageService: AuthStorageService,
31 public actionLabels: ActionLabelsI18n,
32 public activeModal: NgbActiveModal,
33 private nvmeofService: NvmeofService,
34 private taskWrapperService: TaskWrapperService,
35 private router: Router,
36 private route: ActivatedRoute
38 this.permission = this.authStorageService.getPermissions().nvmeof;
39 this.resource = $localize`Subsystem`;
40 this.pageURL = 'block/nvmeof/subsystems';
43 DEFAULT_NQN = 'nqn.2001-07.com.ceph:' + Date.now();
44 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-\.]+)*)$/;
45 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}$/;
47 customNQNValidator = CdValidators.custom(
50 !!nqnInput && !(this.NQN_REGEX.test(nqnInput) || this.NQN_REGEX_UUID.test(nqnInput))
54 this.route.queryParams.subscribe((params) => {
55 this.group = params?.['group'];
58 this.action = this.actionLabels.CREATE;
62 this.subsystemForm = new CdFormGroup({
63 nqn: new UntypedFormControl(this.DEFAULT_NQN, {
65 this.customNQNValidator,
67 this.customNQNValidator,
70 (nqnInput: string) => new TextEncoder().encode(nqnInput).length > 223
75 this.nvmeofService.isSubsystemPresent,
83 max_namespaces: new UntypedFormControl(this.defaultMaxNamespace, {
85 CdValidators.number(false),
86 Validators.max(this.defaultMaxNamespace),
94 const component = this;
95 const nqn: string = this.subsystemForm.getValue('nqn');
96 const max_namespaces: number = Number(this.subsystemForm.getValue('max_namespaces'));
97 let taskUrl = `nvmeof/subsystem/${URLVerbs.CREATE}`;
102 gw_group: this.group,
106 if (!max_namespaces) {
107 delete request.max_namespaces;
109 this.taskWrapperService
110 .wrapTaskAroundCall({
111 task: new FinishedTask(taskUrl, {
114 call: this.nvmeofService.createSubsystem(request)
118 component.subsystemForm.setErrors({ cdSubmitButton: true });
121 this.router.navigate([this.pageURL, { outlets: { modal: null } }]);