1 import { HttpClientTestingModule } from '@angular/common/http/testing';
2 import { TestBed } from '@angular/core/testing';
4 import _ from 'lodash';
6 import { configureTestBed } from '~/testing/unit-test-helper';
7 import { RbdService } from '../api/rbd.service';
8 import { FinishedTask } from '../models/finished-task';
9 import { TaskException } from '../models/task-exception';
10 import { TaskMessageOperation, TaskMessageService } from './task-message.service';
12 describe('TaskManagerMessageService', () => {
13 let service: TaskMessageService;
14 let finishedTask: FinishedTask;
17 providers: [TaskMessageService, RbdService],
18 imports: [HttpClientTestingModule]
22 service = TestBed.inject(TaskMessageService);
23 finishedTask = new FinishedTask();
24 finishedTask.duration = 30;
27 it('should be created', () => {
28 expect(service).toBeTruthy();
31 it('should get default description', () => {
32 expect(service.getErrorTitle(finishedTask)).toBe('Failed to execute unknown task');
35 it('should get default running message', () => {
36 expect(service.getRunningTitle(finishedTask)).toBe('Executing unknown task');
39 it('should get default running message with a set component', () => {
40 finishedTask.metadata = { component: 'rbd' };
41 expect(service.getRunningTitle(finishedTask)).toBe('Executing RBD');
44 it('should getSuccessMessage', () => {
45 expect(service.getSuccessTitle(finishedTask)).toBe('Executed unknown task');
48 describe('defined tasks messages', () => {
49 let defaultMsg: string;
50 const testMessages = (operation: TaskMessageOperation, involves: string) => {
51 expect(service.getRunningTitle(finishedTask)).toBe(operation.running + ' ' + involves);
52 expect(service.getErrorTitle(finishedTask)).toBe(
53 'Failed to ' + operation.failure + ' ' + involves
55 expect(service.getSuccessTitle(finishedTask)).toBe(`${operation.success} ${involves}`);
58 const testCreate = (involves: string) => {
59 testMessages(new TaskMessageOperation('Creating', 'create', 'Created'), involves);
62 const testUpdate = (involves: string) => {
63 testMessages(new TaskMessageOperation('Updating', 'update', 'Updated'), involves);
66 const testDelete = (involves: string) => {
67 testMessages(new TaskMessageOperation('Deleting', 'delete', 'Deleted'), involves);
70 const testImport = (involves: string) => {
71 testMessages(new TaskMessageOperation('Importing', 'import', 'Imported'), involves);
74 const testErrorCode = (code: number, msg: string) => {
75 finishedTask.exception = _.assign(new TaskException(), {
78 expect(service.getErrorMessage(finishedTask)).toBe(msg);
81 describe('pool tasks', () => {
86 defaultMsg = `pool '${metadata.pool_name}'`;
87 finishedTask.metadata = metadata;
90 it('tests pool/create messages', () => {
91 finishedTask.name = 'pool/create';
92 testCreate(defaultMsg);
93 testErrorCode(17, `Name is already used by ${defaultMsg}.`);
96 it('tests pool/edit messages', () => {
97 finishedTask.name = 'pool/edit';
98 testUpdate(defaultMsg);
99 testErrorCode(17, `Name is already used by ${defaultMsg}.`);
102 it('tests pool/delete messages', () => {
103 finishedTask.name = 'pool/delete';
104 testDelete(defaultMsg);
108 describe('erasure code profile tasks', () => {
113 defaultMsg = `erasure code profile '${metadata.name}'`;
114 finishedTask.metadata = metadata;
117 it('tests ecp/create messages', () => {
118 finishedTask.name = 'ecp/create';
119 testCreate(defaultMsg);
120 testErrorCode(17, `Name is already used by ${defaultMsg}.`);
123 it('tests ecp/delete messages', () => {
124 finishedTask.name = 'ecp/delete';
125 testDelete(defaultMsg);
129 describe('crush rule tasks', () => {
134 defaultMsg = `crush rule '${metadata.name}'`;
135 finishedTask.metadata = metadata;
138 it('tests crushRule/create messages', () => {
139 finishedTask.name = 'crushRule/create';
140 testCreate(defaultMsg);
141 testErrorCode(17, `Name is already used by ${defaultMsg}.`);
144 it('tests crushRule/delete messages', () => {
145 finishedTask.name = 'crushRule/delete';
146 testDelete(defaultMsg);
150 describe('rbd tasks', () => {
151 let metadata: Record<string, any>;
152 let childMsg: string;
153 let destinationMsg: string;
158 pool_name: 'somePool',
159 image_name: 'someImage',
161 image_spec: 'somePool/someImage',
162 image_id_spec: 'somePool/12345',
163 snapshot_name: 'someSnapShot',
164 dest_pool_name: 'someDestinationPool',
165 dest_image_name: 'someDestinationImage',
166 child_pool_name: 'someChildPool',
167 child_image_name: 'someChildImage',
168 new_image_name: 'someImage2'
170 defaultMsg = `RBD '${metadata.pool_name}/${metadata.image_name}'`;
171 childMsg = `RBD '${metadata.child_pool_name}/${metadata.child_image_name}'`;
172 destinationMsg = `RBD '${metadata.dest_pool_name}/${metadata.dest_image_name}'`;
173 snapMsg = `RBD snapshot '${metadata.pool_name}/${metadata.image_name}@${metadata.snapshot_name}'`;
174 finishedTask.metadata = metadata;
177 it('tests rbd/create messages', () => {
178 finishedTask.name = 'rbd/create';
179 testCreate(defaultMsg);
180 testErrorCode(17, `Name is already used by ${defaultMsg}.`);
183 it('tests rbd/edit messages', () => {
184 finishedTask.name = 'rbd/edit';
185 testUpdate(defaultMsg);
186 testErrorCode(17, `Name is already used by ${defaultMsg}.`);
189 it('tests rbd/delete messages', () => {
190 finishedTask.name = 'rbd/delete';
191 testDelete(defaultMsg);
192 testErrorCode(16, `${defaultMsg} is busy.`);
193 testErrorCode(39, `${defaultMsg} contains snapshots.`);
196 it('tests rbd/clone messages', () => {
197 finishedTask.name = 'rbd/clone';
198 testMessages(new TaskMessageOperation('Cloning', 'clone', 'Cloned'), childMsg);
199 testErrorCode(17, `Name is already used by ${childMsg}.`);
200 testErrorCode(22, `Snapshot of ${childMsg} must be protected.`);
203 it('tests rbd/copy messages', () => {
204 finishedTask.name = 'rbd/copy';
205 testMessages(new TaskMessageOperation('Copying', 'copy', 'Copied'), destinationMsg);
206 testErrorCode(17, `Name is already used by ${destinationMsg}.`);
209 it('tests rbd/flatten messages', () => {
210 finishedTask.name = 'rbd/flatten';
211 testMessages(new TaskMessageOperation('Flattening', 'flatten', 'Flattened'), defaultMsg);
214 it('tests rbd/snap/create messages', () => {
215 finishedTask.name = 'rbd/snap/create';
217 testErrorCode(17, `Name is already used by ${snapMsg}.`);
220 it('tests rbd/snap/edit messages', () => {
221 finishedTask.name = 'rbd/snap/edit';
223 testErrorCode(16, `Cannot unprotect ${snapMsg} because it contains child images.`);
226 it('tests rbd/snap/delete messages', () => {
227 finishedTask.name = 'rbd/snap/delete';
229 testErrorCode(16, `Cannot delete ${snapMsg} because it's protected.`);
232 it('tests rbd/snap/rollback messages', () => {
233 finishedTask.name = 'rbd/snap/rollback';
234 testMessages(new TaskMessageOperation('Rolling back', 'rollback', 'Rolled back'), snapMsg);
237 it('tests rbd/trash/move messages', () => {
238 finishedTask.name = 'rbd/trash/move';
240 new TaskMessageOperation('Moving', 'move', 'Moved'),
241 `image '${metadata.image_spec}' to trash`
243 testErrorCode(2, `Could not find image.`);
246 it('tests rbd/trash/restore messages', () => {
247 finishedTask.name = 'rbd/trash/restore';
249 new TaskMessageOperation('Restoring', 'restore', 'Restored'),
250 `image '${metadata.image_id_spec}' into '${metadata.new_image_name}'`
252 testErrorCode(17, `Image name '${metadata.new_image_name}' is already in use.`);
255 it('tests rbd/trash/remove messages', () => {
256 finishedTask.name = 'rbd/trash/remove';
257 testDelete(`image '${metadata.image_id_spec}'`);
260 it('tests rbd/trash/purge messages', () => {
261 finishedTask.name = 'rbd/trash/purge';
263 new TaskMessageOperation('Purging', 'purge', 'Purged'),
264 `images from '${metadata.pool_name}'`
268 describe('rbd tasks', () => {
275 pool_name: 'somePool'
277 modeMsg = `mirror mode for pool '${metadata.pool_name}'`;
278 peerMsg = `mirror peer for pool '${metadata.pool_name}'`;
279 finishedTask.metadata = metadata;
281 it('tests rbd/mirroring/site_name/edit messages', () => {
282 finishedTask.name = 'rbd/mirroring/site_name/edit';
283 testUpdate('mirroring site name');
285 it('tests rbd/mirroring/bootstrap/create messages', () => {
286 finishedTask.name = 'rbd/mirroring/bootstrap/create';
287 testCreate('bootstrap token');
289 it('tests rbd/mirroring/bootstrap/import messages', () => {
290 finishedTask.name = 'rbd/mirroring/bootstrap/import';
291 testImport('bootstrap token');
293 it('tests rbd/mirroring/pool/edit messages', () => {
294 finishedTask.name = 'rbd/mirroring/pool/edit';
296 testErrorCode(16, 'Cannot disable mirroring because it contains a peer.');
298 it('tests rbd/mirroring/peer/edit messages', () => {
299 finishedTask.name = 'rbd/mirroring/peer/edit';
302 it('tests rbd/mirroring/peer/add messages', () => {
303 finishedTask.name = 'rbd/mirroring/peer/add';
306 it('tests rbd/mirroring/peer/delete messages', () => {
307 finishedTask.name = 'rbd/mirroring/peer/delete';