]> git.proxmox.com Git - ceph.git/blame - ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/services/service-form/service-form.component.spec.ts
buildsys: switch source download to quincy
[ceph.git] / ceph / src / pybind / mgr / dashboard / frontend / src / app / ceph / cluster / services / service-form / service-form.component.spec.ts
CommitLineData
adb31ebb
TL
1import { HttpClientTestingModule } from '@angular/common/http/testing';
2import { ComponentFixture, TestBed } from '@angular/core/testing';
3import { ReactiveFormsModule } from '@angular/forms';
522d829b 4import { By } from '@angular/platform-browser';
adb31ebb
TL
5import { RouterTestingModule } from '@angular/router/testing';
6
a4b75251 7import { NgbActiveModal, NgbTypeaheadModule } from '@ng-bootstrap/ng-bootstrap';
f67539c2 8import _ from 'lodash';
adb31ebb
TL
9import { ToastrModule } from 'ngx-toastr';
10
f67539c2
TL
11import { CephServiceService } from '~/app/shared/api/ceph-service.service';
12import { CdFormGroup } from '~/app/shared/forms/cd-form-group';
13import { SharedModule } from '~/app/shared/shared.module';
14import { configureTestBed, FormHelper } from '~/testing/unit-test-helper';
adb31ebb
TL
15import { ServiceFormComponent } from './service-form.component';
16
17describe('ServiceFormComponent', () => {
18 let component: ServiceFormComponent;
19 let fixture: ComponentFixture<ServiceFormComponent>;
20 let cephServiceService: CephServiceService;
21 let form: CdFormGroup;
22 let formHelper: FormHelper;
23
24 configureTestBed({
25 declarations: [ServiceFormComponent],
a4b75251 26 providers: [NgbActiveModal],
adb31ebb
TL
27 imports: [
28 HttpClientTestingModule,
f67539c2 29 NgbTypeaheadModule,
adb31ebb
TL
30 ReactiveFormsModule,
31 RouterTestingModule,
32 SharedModule,
33 ToastrModule.forRoot()
f67539c2 34 ]
adb31ebb
TL
35 });
36
37 beforeEach(() => {
38 fixture = TestBed.createComponent(ServiceFormComponent);
39 component = fixture.componentInstance;
a4b75251 40 component.ngOnInit();
adb31ebb
TL
41 form = component.serviceForm;
42 formHelper = new FormHelper(form);
43 fixture.detectChanges();
44 });
45
46 it('should create', () => {
47 expect(component).toBeTruthy();
48 });
49
50 describe('should test form', () => {
51 beforeEach(() => {
f67539c2 52 cephServiceService = TestBed.inject(CephServiceService);
adb31ebb
TL
53 spyOn(cephServiceService, 'create').and.stub();
54 });
55
56 it('should test placement (host)', () => {
57 formHelper.setValue('service_type', 'crash');
58 formHelper.setValue('placement', 'hosts');
59 formHelper.setValue('hosts', ['mgr0', 'mon0', 'osd0']);
60 formHelper.setValue('count', 2);
61 component.onSubmit();
62 expect(cephServiceService.create).toHaveBeenCalledWith({
63 service_type: 'crash',
64 placement: {
65 hosts: ['mgr0', 'mon0', 'osd0'],
66 count: 2
67 },
68 unmanaged: false
69 });
70 });
71
72 it('should test placement (label)', () => {
73 formHelper.setValue('service_type', 'mgr');
74 formHelper.setValue('placement', 'label');
75 formHelper.setValue('label', 'foo');
76 component.onSubmit();
77 expect(cephServiceService.create).toHaveBeenCalledWith({
78 service_type: 'mgr',
79 placement: {
80 label: 'foo'
81 },
82 unmanaged: false
83 });
84 });
85
86 it('should submit valid count', () => {
87 formHelper.setValue('count', 1);
88 component.onSubmit();
89 formHelper.expectValid('count');
90 });
91
92 it('should submit invalid count (1)', () => {
93 formHelper.setValue('count', 0);
94 component.onSubmit();
95 formHelper.expectError('count', 'min');
96 });
97
98 it('should submit invalid count (2)', () => {
99 formHelper.setValue('count', 'abc');
100 component.onSubmit();
101 formHelper.expectError('count', 'pattern');
102 });
103
104 it('should test unmanaged', () => {
522d829b
TL
105 formHelper.setValue('service_type', 'mgr');
106 formHelper.setValue('service_id', 'svc');
adb31ebb
TL
107 formHelper.setValue('placement', 'label');
108 formHelper.setValue('label', 'bar');
adb31ebb
TL
109 formHelper.setValue('unmanaged', true);
110 component.onSubmit();
111 expect(cephServiceService.create).toHaveBeenCalledWith({
522d829b
TL
112 service_type: 'mgr',
113 service_id: 'svc',
adb31ebb
TL
114 placement: {},
115 unmanaged: true
116 });
117 });
118
119 it('should test various services', () => {
120 _.forEach(
121 [
122 'alertmanager',
123 'crash',
124 'grafana',
125 'mds',
126 'mgr',
127 'mon',
128 'node-exporter',
129 'prometheus',
130 'rbd-mirror'
131 ],
132 (serviceType) => {
133 formHelper.setValue('service_type', serviceType);
134 component.onSubmit();
135 expect(cephServiceService.create).toHaveBeenCalledWith({
136 service_type: serviceType,
137 placement: {},
138 unmanaged: false
139 });
140 }
141 );
142 });
143
144 describe('should test service nfs', () => {
145 beforeEach(() => {
146 formHelper.setValue('service_type', 'nfs');
adb31ebb
TL
147 });
148
a4b75251 149 it('should submit nfs', () => {
adb31ebb
TL
150 component.onSubmit();
151 expect(cephServiceService.create).toHaveBeenCalledWith({
152 service_type: 'nfs',
153 placement: {},
a4b75251 154 unmanaged: false
adb31ebb
TL
155 });
156 });
157 });
158
159 describe('should test service rgw', () => {
160 beforeEach(() => {
161 formHelper.setValue('service_type', 'rgw');
522d829b 162 formHelper.setValue('service_id', 'svc');
adb31ebb
TL
163 });
164
165 it('should test rgw valid service id', () => {
522d829b 166 formHelper.setValue('service_id', 'svc.realm.zone');
adb31ebb 167 formHelper.expectValid('service_id');
522d829b 168 formHelper.setValue('service_id', 'svc');
adb31ebb
TL
169 formHelper.expectValid('service_id');
170 });
171
172 it('should test rgw invalid service id', () => {
522d829b
TL
173 formHelper.setValue('service_id', '.');
174 formHelper.expectError('service_id', 'rgwPattern');
175 formHelper.setValue('service_id', 'svc.');
adb31ebb 176 formHelper.expectError('service_id', 'rgwPattern');
522d829b 177 formHelper.setValue('service_id', 'svc.realm');
adb31ebb 178 formHelper.expectError('service_id', 'rgwPattern');
522d829b 179 formHelper.setValue('service_id', 'svc.realm.');
adb31ebb 180 formHelper.expectError('service_id', 'rgwPattern');
522d829b
TL
181 formHelper.setValue('service_id', '.svc.realm');
182 formHelper.expectError('service_id', 'rgwPattern');
183 formHelper.setValue('service_id', 'svc.realm.zone.');
adb31ebb
TL
184 formHelper.expectError('service_id', 'rgwPattern');
185 });
186
522d829b
TL
187 it('should submit rgw with realm and zone', () => {
188 formHelper.setValue('service_id', 'svc.my-realm.my-zone');
189 component.onSubmit();
190 expect(cephServiceService.create).toHaveBeenCalledWith({
191 service_type: 'rgw',
192 service_id: 'svc',
193 rgw_realm: 'my-realm',
194 rgw_zone: 'my-zone',
195 placement: {},
196 unmanaged: false,
197 ssl: false
198 });
199 });
200
201 it('should submit rgw with port and ssl enabled', () => {
adb31ebb
TL
202 formHelper.setValue('rgw_frontend_port', 1234);
203 formHelper.setValue('ssl', true);
204 component.onSubmit();
205 expect(cephServiceService.create).toHaveBeenCalledWith({
206 service_type: 'rgw',
522d829b 207 service_id: 'svc',
adb31ebb
TL
208 placement: {},
209 unmanaged: false,
210 rgw_frontend_port: 1234,
211 rgw_frontend_ssl_certificate: '',
adb31ebb
TL
212 ssl: true
213 });
214 });
215
216 it('should submit valid rgw port (1)', () => {
217 formHelper.setValue('rgw_frontend_port', 1);
218 component.onSubmit();
219 formHelper.expectValid('rgw_frontend_port');
220 });
221
222 it('should submit valid rgw port (2)', () => {
223 formHelper.setValue('rgw_frontend_port', 65535);
224 component.onSubmit();
225 formHelper.expectValid('rgw_frontend_port');
226 });
227
228 it('should submit invalid rgw port (1)', () => {
229 formHelper.setValue('rgw_frontend_port', 0);
230 component.onSubmit();
231 formHelper.expectError('rgw_frontend_port', 'min');
232 });
233
234 it('should submit invalid rgw port (2)', () => {
235 formHelper.setValue('rgw_frontend_port', 65536);
236 component.onSubmit();
237 formHelper.expectError('rgw_frontend_port', 'max');
238 });
239
240 it('should submit invalid rgw port (3)', () => {
241 formHelper.setValue('rgw_frontend_port', 'abc');
242 component.onSubmit();
243 formHelper.expectError('rgw_frontend_port', 'pattern');
244 });
245
246 it('should submit rgw w/o port', () => {
247 formHelper.setValue('ssl', false);
248 component.onSubmit();
249 expect(cephServiceService.create).toHaveBeenCalledWith({
250 service_type: 'rgw',
522d829b 251 service_id: 'svc',
adb31ebb
TL
252 placement: {},
253 unmanaged: false,
254 ssl: false
255 });
256 });
522d829b
TL
257
258 it('should not show private key field', () => {
259 formHelper.setValue('ssl', true);
260 fixture.detectChanges();
261 const ssl_key = fixture.debugElement.query(By.css('#ssl_key'));
262 expect(ssl_key).toBeNull();
263 });
264
265 it('should test .pem file', () => {
266 const pemCert = `
267-----BEGIN CERTIFICATE-----
268iJ5IbgzlKPssdYwuAEI3yPZxX/g5vKBrgcyD3LttLL/DlElq/1xCnwVrv7WROSNu
269-----END CERTIFICATE-----
270-----BEGIN CERTIFICATE-----
271mn/S7BNBEC7AGe5ajmN+8hBTGdACUXe8rwMNrtTy/MwBZ0VpJsAAjJh+aptZh5yB
272-----END CERTIFICATE-----
273-----BEGIN RSA PRIVATE KEY-----
274x4Ea7kGVgx9kWh5XjWz9wjZvY49UKIT5ppIAWPMbLl3UpfckiuNhTA==
275-----END RSA PRIVATE KEY-----`;
276 formHelper.setValue('ssl', true);
277 formHelper.setValue('ssl_cert', pemCert);
278 fixture.detectChanges();
279 formHelper.expectValid('ssl_cert');
280 });
adb31ebb
TL
281 });
282
283 describe('should test service iscsi', () => {
284 beforeEach(() => {
285 formHelper.setValue('service_type', 'iscsi');
286 formHelper.setValue('pool', 'xyz');
287 formHelper.setValue('api_user', 'user');
288 formHelper.setValue('api_password', 'password');
289 formHelper.setValue('ssl', false);
290 });
291
292 it('should submit iscsi', () => {
293 component.onSubmit();
294 expect(cephServiceService.create).toHaveBeenCalledWith({
295 service_type: 'iscsi',
296 placement: {},
297 unmanaged: false,
298 pool: 'xyz',
299 api_user: 'user',
300 api_password: 'password',
301 api_secure: false
302 });
303 });
304
305 it('should submit iscsi with trusted ips', () => {
306 formHelper.setValue('ssl', true);
f67539c2 307 formHelper.setValue('trusted_ip_list', ' 172.16.0.5, 192.1.1.10 ');
adb31ebb
TL
308 component.onSubmit();
309 expect(cephServiceService.create).toHaveBeenCalledWith({
310 service_type: 'iscsi',
311 placement: {},
312 unmanaged: false,
313 pool: 'xyz',
314 api_user: 'user',
315 api_password: 'password',
316 api_secure: true,
317 ssl_cert: '',
318 ssl_key: '',
f67539c2 319 trusted_ip_list: '172.16.0.5, 192.1.1.10'
adb31ebb
TL
320 });
321 });
322
323 it('should submit iscsi with port', () => {
324 formHelper.setValue('api_port', 456);
325 component.onSubmit();
326 expect(cephServiceService.create).toHaveBeenCalledWith({
327 service_type: 'iscsi',
328 placement: {},
329 unmanaged: false,
330 pool: 'xyz',
331 api_user: 'user',
332 api_password: 'password',
333 api_secure: false,
334 api_port: 456
335 });
336 });
337
338 it('should submit valid iscsi port (1)', () => {
339 formHelper.setValue('api_port', 1);
340 component.onSubmit();
341 formHelper.expectValid('api_port');
342 });
343
344 it('should submit valid iscsi port (2)', () => {
345 formHelper.setValue('api_port', 65535);
346 component.onSubmit();
347 formHelper.expectValid('api_port');
348 });
349
350 it('should submit invalid iscsi port (1)', () => {
351 formHelper.setValue('api_port', 0);
352 component.onSubmit();
353 formHelper.expectError('api_port', 'min');
354 });
355
356 it('should submit invalid iscsi port (2)', () => {
357 formHelper.setValue('api_port', 65536);
358 component.onSubmit();
359 formHelper.expectError('api_port', 'max');
360 });
361
362 it('should submit invalid iscsi port (3)', () => {
363 formHelper.setValue('api_port', 'abc');
364 component.onSubmit();
365 formHelper.expectError('api_port', 'pattern');
366 });
367 });
b3b6e05e
TL
368
369 describe('should test service ingress', () => {
370 beforeEach(() => {
371 formHelper.setValue('service_type', 'ingress');
372 formHelper.setValue('backend_service', 'rgw.foo');
373 formHelper.setValue('virtual_ip', '192.168.20.1/24');
374 formHelper.setValue('ssl', false);
375 });
376
377 it('should submit ingress', () => {
378 component.onSubmit();
379 expect(cephServiceService.create).toHaveBeenCalledWith({
380 service_type: 'ingress',
381 placement: {},
382 unmanaged: false,
383 backend_service: 'rgw.foo',
384 service_id: 'rgw.foo',
385 virtual_ip: '192.168.20.1/24',
386 virtual_interface_networks: null,
387 ssl: false
388 });
389 });
390
391 it('should pre-populate the service id', () => {
392 component.prePopulateId();
393 const prePopulatedID = component.serviceForm.getValue('service_id');
394 expect(prePopulatedID).toBe('rgw.foo');
395 });
396
397 it('should submit valid frontend and monitor port', () => {
398 // min value
399 formHelper.setValue('frontend_port', 1);
400 formHelper.setValue('monitor_port', 1);
401 component.onSubmit();
402 formHelper.expectValid('frontend_port');
403 formHelper.expectValid('monitor_port');
404
405 // max value
406 formHelper.setValue('frontend_port', 65535);
407 formHelper.setValue('monitor_port', 65535);
408 component.onSubmit();
409 formHelper.expectValid('frontend_port');
410 formHelper.expectValid('monitor_port');
411 });
412
413 it('should submit invalid frontend and monitor port', () => {
414 // min
415 formHelper.setValue('frontend_port', 0);
416 formHelper.setValue('monitor_port', 0);
417 component.onSubmit();
418 formHelper.expectError('frontend_port', 'min');
419 formHelper.expectError('monitor_port', 'min');
420
421 // max
422 formHelper.setValue('frontend_port', 65536);
423 formHelper.setValue('monitor_port', 65536);
424 component.onSubmit();
425 formHelper.expectError('frontend_port', 'max');
426 formHelper.expectError('monitor_port', 'max');
427
428 // pattern
429 formHelper.setValue('frontend_port', 'abc');
430 formHelper.setValue('monitor_port', 'abc');
431 component.onSubmit();
432 formHelper.expectError('frontend_port', 'pattern');
433 formHelper.expectError('monitor_port', 'pattern');
434 });
435 });
a4b75251
TL
436
437 describe('check edit fields', () => {
438 beforeEach(() => {
439 component.editing = true;
440 });
441
442 it('should check whether edit field is correctly loaded', () => {
443 const cephServiceSpy = spyOn(cephServiceService, 'list').and.callThrough();
444 component.ngOnInit();
445 expect(cephServiceSpy).toBeCalledTimes(2);
446 expect(component.action).toBe('Edit');
447 const serviceType = fixture.debugElement.query(By.css('#service_type')).nativeElement;
448 const serviceId = fixture.debugElement.query(By.css('#service_id')).nativeElement;
449 expect(serviceType.disabled).toBeTruthy();
450 expect(serviceId.disabled).toBeTruthy();
451 });
452 });
adb31ebb
TL
453 });
454});