1 <cd-modal [pageURL]="pageURL"
2 [modalRef]="activeModal">
3 <span class="modal-title"
4 i18n>{{ action | titlecase }} {{ resource | upperFirst }}</span>
5 <ng-container class="modal-content">
7 [formGroup]="serviceForm"
9 <div class="modal-body">
10 <cd-alert-panel *ngIf="serviceForm.controls.service_type.value === 'rgw' && showRealmCreationForm"
14 <a class="text-decoration-underline"
15 (click)="createMultisiteSetup()">
16 Click here</a> to create a new Realm/Zone Group/Zone
19 <cd-alert-panel *ngIf="serviceForm.controls.service_type.value === 'oauth2-proxy'"
23 Authentication must be enabled in an active `mgtm-gateway` service to enable Single Sign-On(SSO) with `oauth2-proxy`
27 <div class="form-group row">
28 <label class="cd-col-form-label required"
31 <div class="cd-col-form-input">
32 <select id="service_type"
35 formControlName="service_type"
36 (change)="onServiceTypeChange($event.target.value)">
38 [ngValue]="null">-- Select a service type --</option>
39 <option *ngFor="let serviceType of serviceTypes"
40 [value]="serviceType">
44 <span class="invalid-feedback"
45 *ngIf="serviceForm.showError('service_type', frm, 'required')"
46 i18n>This field is required.</span>
50 <!-- backend_service -->
51 <div *ngIf="serviceForm.controls.service_type.value === 'ingress'"
52 class="form-group row">
54 class="cd-col-form-label"
55 [ngClass]="{'required': ['ingress'].includes(serviceForm.controls.service_type.value)}"
56 for="backend_service">Backend Service</label>
57 <div class="cd-col-form-input">
58 <select id="backend_service"
59 name="backend_service"
61 formControlName="backend_service"
62 (change)="prePopulateId()">
63 <option *ngIf="services === null"
65 i18n>Loading...</option>
66 <option *ngIf="services !== null && services.length === 0"
68 i18n>-- No service available --</option>
69 <option *ngIf="services !== null && services.length > 0"
71 i18n>-- Select an existing service --</option>
72 <option *ngFor="let service of services"
73 [value]="service.service_name">{{ service.service_name }}</option>
75 <span class="invalid-feedback"
76 *ngIf="serviceForm.showError('backend_service', frm, 'required')"
77 i18n>This field is required.</span>
83 <div class="form-group row"
84 *ngIf="serviceForm.controls.service_type.value === 'nvmeof'">
86 class="cd-col-form-label required"
87 for="pool">Block Pool</label>
88 <div class="cd-col-form-input">
92 formControlName="pool"
93 (change)="onBlockPoolChange()">
94 <option *ngIf="rbdPools === null"
96 i18n>Loading...</option>
97 <option *ngIf="rbdPools && rbdPools.length === 0"
99 i18n>-- No block pools available --</option>
100 <option *ngIf="rbdPools && rbdPools.length > 0"
102 i18n>-- Select a pool --</option>
103 <option *ngFor="let pool of rbdPools"
104 [value]="pool.pool_name">{{ pool.pool_name }}</option>
107 An RBD application-enabled pool in which the gateway configuration can be managed.
109 <span class="invalid-feedback"
110 *ngIf="serviceForm.showError('pool', frm, 'required')"
111 i18n>This field is required.</span>
116 <div class="form-group row"
117 *ngIf="serviceForm.controls.service_type.value === 'nvmeof'">
118 <label class="cd-col-form-label required"
120 <span i18n>Group Name</span>
122 <div class="cd-col-form-input">
123 <div class="input-group">
127 formControlName="group"
128 (change)="onNvmeofGroupChange($event.target.value)">
131 The name of the gateway group.
133 <span class="invalid-feedback"
134 *ngIf="serviceForm.showError('service_id', frm, 'required')"
135 i18n>This field is required.</span>
140 <div class="form-group row"
141 *ngIf="serviceForm.controls.service_type.value !== 'snmp-gateway'">
142 <label class="cd-col-form-label"
143 [ngClass]="{'required': ['mds', 'rgw', 'nfs', 'iscsi', 'nvmeof', 'smb', 'ingress'].includes(serviceForm.controls.service_type.value)}"
145 <span i18n>Service Name</span>
147 <div class="cd-col-form-input">
148 <div class="input-group">
149 <span class="input-group-text"
150 *ngIf="serviceForm.controls.service_type.value && ['mds', 'rgw', 'nfs', 'iscsi', 'nvmeof', 'smb', 'ingress'].includes(serviceForm.controls.service_type.value)"
152 i18n>{{serviceForm.controls.service_type.value}}.
154 <input id="service_id"
157 formControlName="service_id">
159 <span class="invalid-feedback"
160 *ngIf="serviceForm.showError('service_id', frm, 'required')"
161 i18n>This field is required.</span>
162 <span class="invalid-feedback"
163 *ngIf="serviceForm.showError('service_id', frm, 'uniqueName')"
164 i18n>This service id is already in use.</span>
165 <span class="invalid-feedback"
166 *ngIf="serviceForm.showError('service_id', frm, 'mdsPattern')"
167 i18n>MDS service id must start with a letter and contain alphanumeric characters or '.', '-', and '_'</span>
171 <div class="form-group row"
172 *ngIf="serviceForm.controls.service_type.value === 'rgw'">
173 <label class="cd-col-form-label"
176 <div class="cd-col-form-input">
177 <select class="form-select"
179 formControlName="realm_name"
181 [attr.disabled]="realmList.length === 0 || editing ? true : null">
182 <option *ngIf="realmList.length === 0"
184 selected>-- No realm available --</option>
185 <option *ngFor="let realm of realmList"
186 [value]="realm.name">
193 <div class="form-group row"
194 *ngIf="serviceForm.controls.service_type.value === 'rgw'">
195 <label class="cd-col-form-label"
197 i18n>Zone Group</label>
198 <div class="cd-col-form-input">
199 <select class="form-select"
201 formControlName="zonegroup_name"
202 name="zonegroup_name"
203 [attr.disabled]="zonegroupList.length === 0 || editing ? true : null">
204 <option *ngFor="let zonegroup of zonegroupList"
205 [value]="zonegroup.name">
212 <div class="form-group row"
213 *ngIf="serviceForm.controls.service_type.value === 'rgw'">
214 <label class="cd-col-form-label"
217 <div class="cd-col-form-input">
218 <select class="form-select"
220 formControlName="zone_name"
222 [attr.disabled]="zoneList.length === 0 || editing ? true : null">
223 <option *ngFor="let zone of zoneList"
232 <div class="form-group row">
233 <div class="cd-col-form-offset">
234 <div class="custom-control custom-checkbox">
235 <input class="custom-control-input"
238 formControlName="unmanaged">
239 <label class="custom-control-label m-0"
241 i18n>Unmanaged</label>
242 <cd-help-text i18n>If Unmanaged is selected, the orchestrator will not stop or stop any daemons associated with this service. Placement and all other properties will be ignored.</cd-help-text>
248 <div *ngIf="!serviceForm.controls.unmanaged.value"
249 class="form-group row">
250 <label class="cd-col-form-label"
252 i18n>Placement</label>
253 <div class="cd-col-form-input">
254 <select id="placement"
256 formControlName="placement"
257 (change)="onPlacementChange($event.target.value)">
259 value="hosts">Hosts</option>
261 value="label">Label</option>
267 <div *ngIf="!serviceForm.controls.unmanaged.value && serviceForm.controls.placement.value === 'label'"
268 class="form-group row">
270 class="cd-col-form-label"
271 for="label">Label</label>
272 <div class="cd-col-form-input">
276 formControlName="label"
277 [ngbTypeahead]="searchLabels"
278 (focus)="labelFocus.next($any($event).target.value)"
279 (click)="labelClick.next($any($event).target.value)">
280 <span class="invalid-feedback"
281 *ngIf="serviceForm.showError('label', frm, 'required')"
282 i18n>This field is required.</span>
287 <div *ngIf="!serviceForm.controls.unmanaged.value && serviceForm.controls.placement.value === 'hosts'"
288 class="form-group row">
289 <label class="cd-col-form-label"
292 <div class="cd-col-form-input">
293 <cd-select-badges id="hosts"
294 [data]="serviceForm.controls.hosts.value"
295 [options]="hosts.options"
296 [messages]="hosts.messages">
302 <div *ngIf="!serviceForm.controls.unmanaged.value"
303 class="form-group row">
304 <label class="cd-col-form-label"
306 <span i18n>Count</span>
308 <div class="cd-col-form-input">
312 formControlName="count"
314 <cd-help-text i18n>Number of deamons that will be deployed</cd-help-text>
315 <span class="invalid-feedback"
316 *ngIf="serviceForm.showError('count', frm, 'min')"
317 i18n>The value must be at least 1.</span>
318 <span class="invalid-feedback"
319 *ngIf="serviceForm.showError('count', frm, 'pattern')"
320 i18n>The entered value needs to be a number.</span>
325 <ng-container *ngIf="!serviceForm.controls.unmanaged.value && serviceForm.controls.service_type.value === 'rgw'">
326 <!-- rgw_frontend_port -->
327 <div class="form-group row">
329 class="cd-col-form-label"
330 for="rgw_frontend_port">Port</label>
331 <div class="cd-col-form-input">
332 <input id="rgw_frontend_port"
335 formControlName="rgw_frontend_port"
338 <span class="invalid-feedback"
339 *ngIf="serviceForm.showError('rgw_frontend_port', frm, 'pattern')"
340 i18n>The entered value needs to be a number.</span>
341 <span class="invalid-feedback"
342 *ngIf="serviceForm.showError('rgw_frontend_port', frm, 'min')"
343 i18n>The value must be at least 1.</span>
344 <span class="invalid-feedback"
345 *ngIf="serviceForm.showError('rgw_frontend_port', frm, 'max')"
346 i18n>The value cannot exceed 65535.</span>
353 <div class="form-group row"
354 *ngIf="serviceForm.controls.service_type.value === 'iscsi'">
356 class="cd-col-form-label required"
357 for="pool">Pool</label>
358 <div class="cd-col-form-input">
362 formControlName="pool">
363 <option *ngIf="pools === null"
365 i18n>Loading...</option>
366 <option *ngIf="pools && pools.length === 0"
368 i18n>-- No pools available --</option>
369 <option *ngIf="pools && pools.length > 0"
371 i18n>-- Select a pool --</option>
372 <option *ngFor="let pool of pools"
373 [value]="pool.pool_name">{{ pool.pool_name }}</option>
375 <span class="invalid-feedback"
376 *ngIf="serviceForm.showError('pool', frm, 'required')"
377 i18n>This field is required.</span>
381 <!-- fields in iSCSI which are hidden when unmanaged is true -->
382 <ng-container *ngIf="!serviceForm.controls.unmanaged.value && serviceForm.controls.service_type.value === 'iscsi'">
383 <!-- trusted_ip_list -->
384 <div class="form-group row">
385 <label class="cd-col-form-label"
386 for="trusted_ip_list">
387 <span i18n>Trusted IPs</span>
389 <span i18n>Comma separated list of IP addresses.</span>
391 <span i18n>Please add the <b>Ceph Manager</b> IP addresses here, otherwise the iSCSI gateways can't be reached.</span>
394 <div class="cd-col-form-input">
395 <input id="trusted_ip_list"
398 formControlName="trusted_ip_list">
403 <div class="form-group row">
405 class="cd-col-form-label"
406 for="api_port">Port</label>
407 <div class="cd-col-form-input">
411 formControlName="api_port"
414 <span class="invalid-feedback"
415 *ngIf="serviceForm.showError('api_port', frm, 'pattern')"
416 i18n>The entered value needs to be a number.</span>
417 <span class="invalid-feedback"
418 *ngIf="serviceForm.showError('api_port', frm, 'min')"
419 i18n>The value must be at least 1.</span>
420 <span class="invalid-feedback"
421 *ngIf="serviceForm.showError('api_port', frm, 'max')"
422 i18n>The value cannot exceed 65535.</span>
427 <div class="form-group row">
429 class="cd-col-form-label"
430 [ngClass]="{'required': ['iscsi'].includes(serviceForm.controls.service_type.value)}"
431 for="api_user">User</label>
432 <div class="cd-col-form-input">
436 formControlName="api_user">
437 <span class="invalid-feedback"
438 *ngIf="serviceForm.showError('api_user', frm, 'required')"
439 i18n>This field is required.</span>
443 <!-- api_password -->
444 <div class="form-group row">
446 class="cd-col-form-label"
447 [ngClass]="{'required': ['iscsi'].includes(serviceForm.controls.service_type.value)}"
448 for="api_password">Password</label>
449 <div class="cd-col-form-input">
450 <div class="input-group">
451 <input id="api_password"
454 autocomplete="new-password"
455 formControlName="api_password">
456 <button type="button"
457 class="btn btn-light"
458 cdPasswordButton="api_password">
460 <cd-copy-2-clipboard-button source="api_password">
461 </cd-copy-2-clipboard-button>
462 <span class="invalid-feedback"
463 *ngIf="serviceForm.showError('api_password', frm, 'required')"
464 i18n>This field is required.</span>
471 <ng-container *ngIf="serviceForm.controls.service_type.value === 'smb'">
472 <div class="form-group row">
473 <label class="cd-col-form-label required"
478 <span>A short name identifying the SMB “cluster”. In this case a cluster is simply a management unit of one or more Samba services sharing a common configuration,
479 and may not provide actual clustering or availability mechanisms.</span>
482 <div class="cd-col-form-input">
483 <input id="cluster_id"
486 formControlName="cluster_id"
489 <span class="invalid-feedback"
490 *ngIf="serviceForm.showError('cluster_id', frm, 'required')"
491 i18n>This field is required.</span>
495 <div class="form-group row">
496 <label class="cd-col-form-label required"
498 <span i18n>Config URI</span>
500 Configuration source that should be loaded by the samba-container as the primary configuration file.
503 <div class="cd-col-form-input">
504 <input id="config_uri"
507 formControlName="config_uri"
508 placeholder="rados://.smb/foo/scc.toml"
510 <span class="invalid-feedback"
511 *ngIf="serviceForm.showError('config_uri', frm, 'required')"
512 i18n>This field is required.</span>
513 <span class="invalid-feedback"
514 *ngIf="serviceForm.showError('config_uri', frm, 'configUriPattern')"
515 i18n>The value must start with either 'http:', 'https:', 'rados:' or 'rados:mon-config-key:'</span>
519 <div class="form-group row"
520 formGroupName="features">
521 <label class="cd-col-form-label"
525 <span>Pre-defined terms enabling specific deployment characteristics.</span>
528 <div class="cd-col-form-input">
529 <div class="custom-control custom-checkbox"
530 *ngFor="let feature of smbFeaturesList">
531 <input class="custom-control-input"
535 formControlName="{{feature}}">
536 <label class="custom-control-label"
544 <div class="form-group row">
545 <label class="cd-col-form-label"
547 <span i18n>Custom DNS</span>
549 <span>Comma separated list of DNSs.</span>
551 <span>A list of IP addresses that will be used as the DNS servers for a Samba container.</span>
554 <div class="cd-col-form-input">
555 <input id="custom_dns"
558 formControlName="custom_dns"
559 placeholder="192.168.76.204"
564 <div class="form-group row">
565 <label class="cd-col-form-label"
567 <span i18n>Join sources</span>
569 <span>Comma separated list of URIs.</span>
571 <span>A list of values that will be used to identify where authentication data that will be used to perform domain joins are located.</span>
574 <div class="cd-col-form-input">
575 <input id="join_sources"
578 formControlName="join_sources"
579 placeholder="rados:mon-config-key:smb/config/foo/join1.json"
584 <div class="form-group row">
585 <label class="cd-col-form-label"
587 <span i18n>User sources</span>
589 <span>Comma separated list of URIs.</span>
591 <span>A list of pseudo-uris containing data the samba-container can use to create users (and/or
592 groups). A ceph based samba container may typically use a rados uri
593 or a mon config-key store uri </span>
596 <div class="cd-col-form-input">
597 <input id="user_sources"
600 formControlName="user_sources"
601 placeholder="rados:mon-config-key:smb/config/foo/join2.json"
606 <div class="form-group row">
607 <label class="cd-col-form-label"
608 for="include_ceph_users">
609 <span i18n>Ceph users</span>
611 <span>Comma separated list of Ceph users.</span>
613 <span>A list of cephx user names that the Samba Containers may use.</span>
616 <div class="cd-col-form-input">
617 <input id="include_ceph_users"
620 formControlName="include_ceph_users"
621 placeholder="client.smb.fs.cluster.foo"
629 <ng-container *ngIf="serviceForm.controls.service_type.value === 'ingress'">
631 <div class="form-group row">
632 <label class="cd-col-form-label"
633 [ngClass]="{'required': ['ingress'].includes(serviceForm.controls.service_type.value)}"
635 <span i18n>Virtual IP</span>
637 <span i18n>The virtual IP address and subnet (in CIDR notation) where the ingress service will be available.</span>
640 <div class="cd-col-form-input">
641 <input id="virtual_ip"
644 formControlName="virtual_ip">
645 <span class="invalid-feedback"
646 *ngIf="serviceForm.showError('virtual_ip', frm, 'required')"
647 i18n>This field is required.</span>
651 <!-- frontend_port -->
652 <div class="form-group row">
653 <label class="cd-col-form-label"
654 [ngClass]="{'required': ['ingress'].includes(serviceForm.controls.service_type.value)}"
656 <span i18n>Frontend Port</span>
658 <span i18n>The port used to access the ingress service.</span>
661 <div class="cd-col-form-input">
662 <input id="frontend_port"
665 formControlName="frontend_port"
668 <span class="invalid-feedback"
669 *ngIf="serviceForm.showError('frontend_port', frm, 'pattern')"
670 i18n>The entered value needs to be a number.</span>
671 <span class="invalid-feedback"
672 *ngIf="serviceForm.showError('frontend_port', frm, 'min')"
673 i18n>The value must be at least 1.</span>
674 <span class="invalid-feedback"
675 *ngIf="serviceForm.showError('frontend_port', frm, 'max')"
676 i18n>The value cannot exceed 65535.</span>
677 <span class="invalid-feedback"
678 *ngIf="serviceForm.showError('frontend_port', frm, 'required')"
679 i18n>This field is required.</span>
683 <!-- monitor_port -->
684 <div class="form-group row">
685 <label class="cd-col-form-label"
686 [ngClass]="{'required': ['ingress'].includes(serviceForm.controls.service_type.value)}"
688 <span i18n>Monitor Port</span>
690 <span i18n>The port used by haproxy for load balancer status.</span>
693 <div class="cd-col-form-input">
694 <input id="monitor_port"
697 formControlName="monitor_port"
700 <span class="invalid-feedback"
701 *ngIf="serviceForm.showError('monitor_port', frm, 'pattern')"
702 i18n>The entered value needs to be a number.</span>
703 <span class="invalid-feedback"
704 *ngIf="serviceForm.showError('monitor_port', frm, 'min')"
705 i18n>The value must be at least 1.</span>
706 <span class="invalid-feedback"
707 *ngIf="serviceForm.showError('monitor_port', frm, 'max')"
708 i18n>The value cannot exceed 65535.</span>
709 <span class="invalid-feedback"
710 *ngIf="serviceForm.showError('monitor_port', frm, 'required')"
711 i18n>This field is required.</span>
714 <!-- virtual_interface_networks -->
715 <div class="form-group row"
716 *ngIf="!serviceForm.controls.unmanaged.value">
717 <label class="cd-col-form-label"
718 for="virtual_interface_networks">
719 <span i18n>CIDR Networks</span>
721 <span i18n>A list of networks to identify which network interface to use for the virtual IP address.</span>
724 <div class="cd-col-form-input">
725 <input id="virtual_interface_networks"
728 formControlName="virtual_interface_networks">
733 <!-- SNMP-Gateway -->
734 <ng-container *ngIf="serviceForm.controls.service_type.value === 'snmp-gateway'">
735 <!-- snmp-version -->
736 <div class="form-group row">
737 <label class="cd-col-form-label required"
740 <div class="cd-col-form-input">
741 <select id="snmp_version"
744 formControlName="snmp_version"
745 (change)="clearValidations()">
747 [ngValue]="null">-- Select SNMP version --</option>
748 <option *ngFor="let snmpVersion of ['V2c', 'V3']"
749 [value]="snmpVersion">{{ snmpVersion }}</option>
751 <span class="invalid-feedback"
752 *ngIf="serviceForm.showError('snmp_version', frm, 'required')"
753 i18n>This field is required.</span>
757 <div class="form-group row">
758 <label class="cd-col-form-label required"
759 for="snmp_destination">
760 <span i18n>Destination</span>
762 <span i18n>Must be of the format hostname:port.</span>
765 <div class="cd-col-form-input">
766 <input id="snmp_destination"
769 formControlName="snmp_destination">
770 <span class="invalid-feedback"
771 *ngIf="serviceForm.showError('snmp_destination', frm, 'required')"
772 i18n>This field is required.</span>
773 <span class="invalid-feedback"
774 *ngIf="serviceForm.showError('snmp_destination', frm, 'snmpDestinationPattern')"
775 i18n>The value does not match the pattern: <strong>hostname:port</strong></span>
778 <!-- Engine id for snmp V3 -->
779 <div class="form-group row"
780 *ngIf="serviceForm.controls.snmp_version.value === 'V3'">
781 <label class="cd-col-form-label required"
783 <span i18n>Engine Id</span>
785 <span i18n>Unique identifier for the device (in hex).</span>
788 <div class="cd-col-form-input">
789 <input id="engine_id"
792 formControlName="engine_id">
793 <span class="invalid-feedback"
794 *ngIf="serviceForm.showError('engine_id', frm, 'required')"
795 i18n>This field is required.</span>
796 <span class="invalid-feedback"
797 *ngIf="serviceForm.showError('engine_id', frm, 'snmpEngineIdPattern')"
798 i18n>The value does not match the pattern: <strong>Must be in hexadecimal and length must be multiple of 2 with min value = 10 amd max value = 64.</strong></span>
801 <!-- Auth protocol for snmp V3 -->
802 <div class="form-group row"
803 *ngIf="serviceForm.controls.snmp_version.value === 'V3'">
804 <label class="cd-col-form-label required"
806 i18n>Auth Protocol</label>
807 <div class="cd-col-form-input">
808 <select id="auth_protocol"
811 formControlName="auth_protocol">
813 [ngValue]="null">-- Select auth protocol --</option>
814 <option *ngFor="let authProtocol of ['SHA', 'MD5']"
815 [value]="authProtocol">
819 <span class="invalid-feedback"
820 *ngIf="serviceForm.showError('auth_protocol', frm, 'required')"
821 i18n>This field is required.</span>
824 <!-- Privacy protocol for snmp V3 -->
825 <div class="form-group row"
826 *ngIf="serviceForm.controls.snmp_version.value === 'V3'">
827 <label class="cd-col-form-label"
828 for="privacy_protocol"
829 i18n>Privacy Protocol</label>
830 <div class="cd-col-form-input">
831 <select id="privacy_protocol"
832 name="privacy_protocol"
834 formControlName="privacy_protocol">
836 [ngValue]="null">-- Select privacy protocol --</option>
837 <option *ngFor="let privacyProtocol of ['DES', 'AES']"
838 [value]="privacyProtocol">
839 {{ privacyProtocol }}
846 <legend i18n>Credentials</legend>
847 <!-- snmp v2c snmp_community -->
848 <div class="form-group row"
849 *ngIf="serviceForm.controls.snmp_version.value === 'V2c'">
850 <label class="cd-col-form-label required"
851 for="snmp_community">
852 <span i18n>SNMP Community</span>
854 <div class="cd-col-form-input">
855 <input id="snmp_community"
858 formControlName="snmp_community">
859 <span class="invalid-feedback"
860 *ngIf="serviceForm.showError('snmp_community', frm, 'required')"
861 i18n>This field is required.</span>
864 <!-- snmp v3 auth username -->
865 <div class="form-group row"
866 *ngIf="serviceForm.controls.snmp_version.value === 'V3'">
867 <label class="cd-col-form-label required"
868 for="snmp_v3_auth_username">
869 <span i18n>Username</span>
871 <div class="cd-col-form-input">
872 <input id="snmp_v3_auth_username"
875 formControlName="snmp_v3_auth_username">
876 <span class="invalid-feedback"
877 *ngIf="serviceForm.showError('snmp_v3_auth_username', frm, 'required')"
878 i18n>This field is required.</span>
881 <!-- snmp v3 auth password -->
882 <div class="form-group row"
883 *ngIf="serviceForm.controls.snmp_version.value === 'V3'">
884 <label class="cd-col-form-label required"
885 for="snmp_v3_auth_password">
886 <span i18n>Password</span>
888 <div class="cd-col-form-input">
889 <input id="snmp_v3_auth_password"
892 formControlName="snmp_v3_auth_password">
893 <span class="invalid-feedback"
894 *ngIf="serviceForm.showError('snmp_v3_auth_password', frm, 'required')"
895 i18n>This field is required.</span>
898 <!-- snmp v3 priv password -->
899 <div class="form-group row"
900 *ngIf="serviceForm.controls.snmp_version.value === 'V3' && serviceForm.controls.privacy_protocol.value !== null && serviceForm.controls.privacy_protocol.value !== undefined">
901 <label class="cd-col-form-label required"
902 for="snmp_v3_priv_password">
903 <span i18n>Encryption</span>
905 <div class="cd-col-form-input">
906 <input id="snmp_v3_priv_password"
909 formControlName="snmp_v3_priv_password">
910 <span class="invalid-feedback"
911 *ngIf="serviceForm.showError('snmp_v3_priv_password', frm, 'required')"
912 i18n>This field is required.</span>
918 <!-- oauth2-proxy -->
919 <ng-container *ngIf="serviceForm.controls.service_type.value === 'oauth2-proxy'">
920 <!-- provider_display_name -->
921 <div class="form-group row">
922 <label class="cd-col-form-label required"
923 for="provider_display_name">
924 <span i18n>Provider display name</span>
926 <div class="cd-col-form-input">
927 <input id="provider_display_name"
930 formControlName="provider_display_name"
931 placeholder="My OIDC Provider"
933 <cd-help-text i18n>The display name for the identity provider (IdP) in the UI.</cd-help-text>
934 <span class="invalid-feedback"
935 *ngIf="serviceForm.showError('provider_display_name', frm, 'required')"
936 i18n>This field is required.</span>
940 <div class="form-group row">
941 <label class="cd-col-form-label required"
943 <span i18n>Client ID</span>
945 <div class="cd-col-form-input">
946 <input id="client_id"
949 formControlName="client_id"
950 placeholder="oauth2-client">
951 <cd-help-text i18n>The client ID for authenticating with the IdP.</cd-help-text>
952 <span class="invalid-feedback"
953 *ngIf="serviceForm.showError('client_id', frm, 'required')"
954 i18n>This field is required.</span>
957 <!-- client_secret -->
958 <div class="form-group row">
959 <label class="cd-col-form-label required"
961 <span i18n>Client secret</span>
963 <div class="cd-col-form-input">
964 <div class="input-group">
965 <input id="client_secret"
968 formControlName="client_secret">
969 <span class="input-group-append">
970 <button type="button"
971 class="btn btn-light"
972 cdPasswordButton="client_secret">
974 <cd-copy-2-clipboard-button source="client_secret">
975 </cd-copy-2-clipboard-button>
978 <cd-help-text i18n>The client secret for authenticating with the IdP.</cd-help-text>
979 <span class="invalid-feedback"
980 *ngIf="serviceForm.showError('client_secret', frm, 'required')"
981 i18n>This field is required.</span>
984 <!-- oidc_issuer_url -->
985 <div class="form-group row">
986 <label class="cd-col-form-label required"
987 for="oidc_issuer_url">
988 <span i18n>OIDC Issuer URL</span>
990 <div class="cd-col-form-input">
991 <input id="oidc_issuer_url"
994 formControlName="oidc_issuer_url"
995 placeholder="https://<IdPs-domain>/realms/<realm-name>">
996 <cd-help-text i18n>The URL of the OpenID Connect (OIDC) issuer.</cd-help-text>
997 <span class="invalid-feedback"
998 *ngIf="serviceForm.showError('oidc_issuer_url', frm, 'required')"
999 i18n>This field is required.</span>
1000 <span class="invalid-feedback"
1001 *ngIf="serviceForm.showError('oidc_issuer_url', frm, 'validUrl')"
1002 i18n>Invalid url.</span>
1005 <!-- https_address -->
1006 <div class="form-group row">
1007 <label class="cd-col-form-label"
1008 for="https_address">
1009 <span i18n>Https address</span>
1011 <div class="cd-col-form-input">
1012 <input id="https_address"
1013 class="form-control"
1015 formControlName="https_address"
1016 placeholder="0.0.0.0:4180">
1017 <cd-help-text i18n>The address for HTTPS connections as [IP|Hostname]:port.</cd-help-text>
1018 <span class="invalid-feedback"
1019 *ngIf="serviceForm.showError('https_address', frm, 'invalidAddress')"
1020 i18n>Format must be [IP|Hostname]:port and the port between 0 and 65535</span>
1023 <!-- redirect_url -->
1024 <div class="form-group row">
1025 <label class="cd-col-form-label"
1027 <span i18n>Redirect URL</span>
1029 <div class="cd-col-form-input">
1030 <input id="redirect_url"
1031 class="form-control"
1033 formControlName="redirect_url"
1034 placeholder="https://<IP|Hostname>:4180/oauth2/callback">
1035 <cd-help-text i18n>The URL the oauth2-proxy service will redirect to after a successful login.</cd-help-text>
1038 <!-- Allowlist_domains -->
1039 <div class="form-group row">
1040 <label class="cd-col-form-label"
1041 for="allowlist_domains">
1042 <span i18n>Allowlist domains</span>
1044 <div class="cd-col-form-input">
1045 <input id="allowlist_domains"
1046 class="form-control"
1048 formControlName="allowlist_domains"
1049 placeholder="domain1.com,192.168.100.1:8080">
1050 <cd-help-text i18n>Comma separated list of domains to be allowed to redirect to, used for login or logout.</cd-help-text>
1055 <!-- RGW, Ingress, iSCSI & Oauth2-proxy -->
1056 <ng-container *ngIf="!serviceForm.controls.unmanaged.value && ['rgw', 'iscsi', 'ingress', 'oauth2-proxy'].includes(serviceForm.controls.service_type.value)">
1058 <div class="form-group row">
1059 <div class="cd-col-form-offset">
1060 <div class="custom-control custom-checkbox">
1061 <input class="custom-control-input"
1064 formControlName="ssl">
1065 <label class="custom-control-label"
1073 <div *ngIf="serviceForm.controls.ssl.value"
1074 class="form-group row">
1075 <label class="cd-col-form-label"
1077 <span i18n>Certificate</span>
1078 <cd-helper i18n>The SSL certificate in PEM format.</cd-helper>
1080 <div class="cd-col-form-input">
1081 <textarea id="ssl_cert"
1082 class="form-control resize-vertical text-monospace text-pre"
1083 formControlName="ssl_cert"
1087 (change)="fileUpload($event.target.files, 'ssl_cert')">
1088 <span class="invalid-feedback"
1089 *ngIf="serviceForm.showError('ssl_cert', frm, 'required')"
1090 i18n>This field is required.</span>
1091 <span class="invalid-feedback"
1092 *ngIf="serviceForm.showError('ssl_cert', frm, 'pattern')"
1093 i18n>Invalid SSL certificate.</span>
1098 <div *ngIf="serviceForm.controls.ssl.value && !(['rgw', 'ingress'].includes(serviceForm.controls.service_type.value))"
1099 class="form-group row">
1100 <label class="cd-col-form-label"
1102 <span i18n>Private key</span>
1103 <cd-helper i18n>The SSL private key in PEM format.</cd-helper>
1105 <div class="cd-col-form-input">
1106 <textarea id="ssl_key"
1107 class="form-control resize-vertical text-monospace text-pre"
1108 formControlName="ssl_key"
1112 (change)="fileUpload($event.target.files,'ssl_key')">
1113 <span class="invalid-feedback"
1114 *ngIf="serviceForm.showError('ssl_key', frm, 'required')"
1115 i18n>This field is required.</span>
1116 <span class="invalid-feedback"
1117 *ngIf="serviceForm.showError('ssl_key', frm, 'pattern')"
1118 i18n>Invalid SSL private key.</span>
1123 <ng-container *ngIf="serviceForm.controls.service_type.value === 'grafana'">
1124 <div class="form-group row">
1125 <label class="cd-col-form-label"
1127 <span i18n>Grafana Port</span>
1129 <span i18n>The default port used by grafana.</span>
1132 <div class="cd-col-form-input">
1133 <input id="grafana_port"
1134 class="form-control"
1136 formControlName="grafana_port"
1139 <span class="invalid-feedback"
1140 *ngIf="serviceForm.showError('grafana_port', frm, 'pattern')"
1141 i18n>The entered value needs to be a number.</span>
1142 <span class="invalid-feedback"
1143 *ngIf="serviceForm.showError('grafana_port', frm, 'min')"
1144 i18n>The value must be at least 1.</span>
1145 <span class="invalid-feedback"
1146 *ngIf="serviceForm.showError('grafana_port', frm, 'max')"
1147 i18n>The value cannot exceed 65535.</span>
1148 <span class="invalid-feedback"
1149 *ngIf="serviceForm.showError('grafana_port', frm, 'required')"
1150 i18n>This field is required.</span>
1154 <div class="form-group row">
1156 class="cd-col-form-label"
1157 for="grafana_admin_password">
1158 <span>Grafana Password</span>
1159 <cd-helper>The password of the default Grafana Admin. Set once on first-run.</cd-helper>
1161 <div class="cd-col-form-input">
1162 <div class="input-group">
1163 <input id="grafana_admin_password"
1164 class="form-control"
1166 autocomplete="new-password"
1167 [attr.disabled]="editing ? true:null"
1168 formControlName="grafana_admin_password">
1169 <span class="input-group-append">
1170 <button type="button"
1171 class="btn btn-light"
1172 cdPasswordButton="grafana_admin_password">
1174 <cd-copy-2-clipboard-button source="grafana_admin_password">
1175 </cd-copy-2-clipboard-button>
1183 <div class="modal-footer">
1184 <div class="text-right">
1185 <cd-form-button-panel (submitActionEvent)="onSubmit()"
1186 [form]="serviceForm"
1187 [submitText]="(action | titlecase) + ' ' + (resource | upperFirst)"></cd-form-button-panel>