From: Stephan Müller Date: Wed, 8 Aug 2018 11:19:27 +0000 (+0200) Subject: mgr/dashboard: Rename to taskMessageService X-Git-Tag: v14.0.1~552^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=7f804e3fab41dda846d606a206433ecb7ab07e2a;p=ceph.git mgr/dashboard: Rename to taskMessageService Renames taskManagerMessageService to taskMessageService. Signed-off-by: Stephan Müller --- diff --git a/src/pybind/mgr/dashboard/frontend/src/app/core/navigation/task-manager/task-manager.component.ts b/src/pybind/mgr/dashboard/frontend/src/app/core/navigation/task-manager/task-manager.component.ts index 4e17c704a1f49..3eb58985ee67e 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/core/navigation/task-manager/task-manager.component.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/core/navigation/task-manager/task-manager.component.ts @@ -3,7 +3,7 @@ import { Component, OnInit } from '@angular/core'; import { ExecutingTask } from '../../../shared/models/executing-task'; import { FinishedTask } from '../../../shared/models/finished-task'; import { SummaryService } from '../../../shared/services/summary.service'; -import { TaskManagerMessageService } from '../../../shared/services/task-manager-message.service'; +import { TaskMessageService } from '../../../shared/services/task-message.service'; @Component({ selector: 'cd-task-manager', @@ -18,7 +18,7 @@ export class TaskManagerComponent implements OnInit { constructor( private summaryService: SummaryService, - private taskMessageManager: TaskManagerMessageService + private taskMessageService: TaskMessageService ) {} ngOnInit() { @@ -33,14 +33,14 @@ export class TaskManagerComponent implements OnInit { _handleTasks(executingTasks: ExecutingTask[], finishedTasks: FinishedTask[]) { for (const excutingTask of executingTasks) { - excutingTask.description = this.taskMessageManager.getRunningTitle(excutingTask); + excutingTask.description = this.taskMessageService.getRunningTitle(excutingTask); } for (const finishedTask of finishedTasks) { if (finishedTask.success === false) { - finishedTask.description = this.taskMessageManager.getErrorTitle(finishedTask); - finishedTask.errorMessage = this.taskMessageManager.getErrorMessage(finishedTask); + finishedTask.description = this.taskMessageService.getErrorTitle(finishedTask); + finishedTask.errorMessage = this.taskMessageService.getErrorMessage(finishedTask); } else { - finishedTask.description = this.taskMessageManager.getSuccessTitle(finishedTask); + finishedTask.description = this.taskMessageService.getSuccessTitle(finishedTask); } } this.executingTasks = executingTasks; diff --git a/src/pybind/mgr/dashboard/frontend/src/app/shared/services/notification.service.spec.ts b/src/pybind/mgr/dashboard/frontend/src/app/shared/services/notification.service.spec.ts index 763a086b71ef3..204a9e1c5379e 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/shared/services/notification.service.spec.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/shared/services/notification.service.spec.ts @@ -7,7 +7,7 @@ import { configureTestBed } from '../../../testing/unit-test-helper'; import { NotificationType } from '../enum/notification-type.enum'; import { FinishedTask } from '../models/finished-task'; import { NotificationService } from './notification.service'; -import { TaskManagerMessageService } from './task-manager-message.service'; +import { TaskMessageService } from './task-message.service'; describe('NotificationService', () => { let notificationService: NotificationService; @@ -20,7 +20,7 @@ describe('NotificationService', () => { configureTestBed({ providers: [ NotificationService, - TaskManagerMessageService, + TaskMessageService, { provide: ToastsManager, useValue: toastFakeService } ] }); diff --git a/src/pybind/mgr/dashboard/frontend/src/app/shared/services/notification.service.ts b/src/pybind/mgr/dashboard/frontend/src/app/shared/services/notification.service.ts index f736a1e41905b..9c03095ac119d 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/shared/services/notification.service.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/shared/services/notification.service.ts @@ -8,7 +8,7 @@ import { NotificationType } from '../enum/notification-type.enum'; import { CdNotification } from '../models/cd-notification'; import { FinishedTask } from '../models/finished-task'; import { ServicesModule } from './services.module'; -import { TaskManagerMessageService } from './task-manager-message.service'; +import { TaskMessageService } from './task-message.service'; @Injectable({ providedIn: ServicesModule @@ -22,10 +22,7 @@ export class NotificationService { KEY = 'cdNotifications'; - constructor( - public toastr: ToastsManager, - private taskManagerMessageService: TaskManagerMessageService - ) { + constructor(public toastr: ToastsManager, private taskMessageService: TaskMessageService) { const stringNotifications = localStorage.getItem(this.KEY); let notifications: CdNotification[] = []; @@ -97,15 +94,12 @@ export class NotificationService { notifyTask(finishedTask: FinishedTask, success: boolean = true) { if (finishedTask.success && success) { - this.show( - NotificationType.success, - this.taskManagerMessageService.getSuccessTitle(finishedTask) - ); + this.show(NotificationType.success, this.taskMessageService.getSuccessTitle(finishedTask)); } else { this.show( NotificationType.error, - this.taskManagerMessageService.getErrorTitle(finishedTask), - this.taskManagerMessageService.getErrorMessage(finishedTask) + this.taskMessageService.getErrorTitle(finishedTask), + this.taskMessageService.getErrorMessage(finishedTask) ); } } diff --git a/src/pybind/mgr/dashboard/frontend/src/app/shared/services/task-manager-message.service.spec.ts b/src/pybind/mgr/dashboard/frontend/src/app/shared/services/task-manager-message.service.spec.ts deleted file mode 100644 index aeb36234077a5..0000000000000 --- a/src/pybind/mgr/dashboard/frontend/src/app/shared/services/task-manager-message.service.spec.ts +++ /dev/null @@ -1,150 +0,0 @@ -import * as _ from 'lodash'; - -import { FinishedTask } from '../models/finished-task'; -import { TaskException } from '../models/task-exception'; -import { TaskManagerMessageService, TaskMessageOperation } from './task-manager-message.service'; - -describe('TaskManagerMessageService', () => { - let service: TaskManagerMessageService; - let finishedTask: FinishedTask; - - beforeEach(() => { - service = new TaskManagerMessageService(); - finishedTask = new FinishedTask(); - }); - - it('should be created', () => { - expect(service).toBeTruthy(); - }); - - it('should get default description', () => { - expect(service.getErrorTitle(finishedTask)).toBe('Failed to execute unknown task'); - }); - - it('should get default running message', () => { - expect(service.getRunningTitle(finishedTask)).toBe('Executing unknown task'); - }); - - it('should get default running message with a set component', () => { - finishedTask.metadata = { component: 'rbd' }; - expect(service.getRunningTitle(finishedTask)).toBe('Executing RBD'); - }); - - it('should getSuccessMessage', () => { - expect(service.getSuccessTitle(finishedTask)).toBe('Executed unknown task'); - }); - - describe('defined tasks messages', () => { - const testMessages = (operation: TaskMessageOperation, involves: string) => { - expect(service.getRunningTitle(finishedTask)).toBe(operation.running + ' ' + involves); - expect(service.getErrorTitle(finishedTask)).toBe( - 'Failed to ' + operation.failure + ' ' + involves - ); - expect(service.getSuccessTitle(finishedTask)).toBe(operation.success + ' ' + involves); - }; - - const testCreate = (involves: string) => { - testMessages(new TaskMessageOperation('Creating', 'create', 'Created'), involves); - }; - - const testUpdate = (involves: string) => { - testMessages(new TaskMessageOperation('Updating', 'update', 'Updated'), involves); - }; - - const testDelete = (involves: string) => { - testMessages(new TaskMessageOperation('Deleting', 'delete', 'Deleted'), involves); - }; - - const testErrorCode = (code: number, msg: string) => { - finishedTask.exception = _.assign(new TaskException(), { - code: code - }); - expect(service.getErrorMessage(finishedTask)).toBe(msg); - }; - - describe('rbd tasks', () => { - let defaultMsg: string; - let childMsg: string; - let destinationMsg: string; - let snapMsg: string; - - beforeEach(() => { - const metadata = { - pool_name: 'somePool', - image_name: 'someImage', - snapshot_name: 'someSnapShot', - dest_pool_name: 'someDestinationPool', - dest_image_name: 'someDestinationImage', - child_pool_name: 'someChildPool', - child_image_name: 'someChildImage' - }; - defaultMsg = `RBD '${metadata.pool_name}/${metadata.image_name}'`; - childMsg = `RBD '${metadata.child_pool_name}/${metadata.child_image_name}'`; - destinationMsg = `RBD '${metadata.dest_pool_name}/${metadata.dest_image_name}'`; - snapMsg = `RBD snapshot '${metadata.pool_name}/${metadata.image_name}@${ - metadata.snapshot_name - }'`; - finishedTask.metadata = metadata; - }); - - it('tests rbd/create messages', () => { - finishedTask.name = 'rbd/create'; - testCreate(defaultMsg); - testErrorCode(17, `Name is already used by ${defaultMsg}.`); - }); - - it('tests rbd/edit messages', () => { - finishedTask.name = 'rbd/edit'; - testUpdate(defaultMsg); - testErrorCode(17, `Name is already used by ${defaultMsg}.`); - }); - - it('tests rbd/delete messages', () => { - finishedTask.name = 'rbd/delete'; - testDelete(defaultMsg); - testErrorCode(39, `${defaultMsg} contains snapshots.`); - }); - - it('tests rbd/clone messages', () => { - finishedTask.name = 'rbd/clone'; - testMessages(new TaskMessageOperation('Cloning', 'clone', 'Cloned'), childMsg); - testErrorCode(17, `Name is already used by ${childMsg}.`); - testErrorCode(22, `Snapshot of ${childMsg} must be protected.`); - }); - - it('tests rbd/copy messages', () => { - finishedTask.name = 'rbd/copy'; - testMessages(new TaskMessageOperation('Copying', 'copy', 'Copied'), destinationMsg); - testErrorCode(17, `Name is already used by ${destinationMsg}.`); - }); - - it('tests rbd/flatten messages', () => { - finishedTask.name = 'rbd/flatten'; - testMessages(new TaskMessageOperation('Flattening', 'flatten', 'Flattened'), defaultMsg); - }); - - it('tests rbd/snap/create messages', () => { - finishedTask.name = 'rbd/snap/create'; - testCreate(snapMsg); - testErrorCode(17, `Name is already used by ${snapMsg}.`); - }); - - it('tests rbd/snap/edit messages', () => { - finishedTask.name = 'rbd/snap/edit'; - testUpdate(snapMsg); - testErrorCode(16, `Cannot unprotect ${snapMsg} because it contains child images.`); - }); - - it('tests rbd/snap/delete messages', () => { - finishedTask.name = 'rbd/snap/delete'; - testDelete(snapMsg); - testErrorCode(16, `Cannot delete ${snapMsg} because it's protected.`); - }); - - it('tests rbd/snap/rollback messages', () => { - finishedTask.name = 'rbd/snap/rollback'; - testMessages(new TaskMessageOperation('Rolling back', 'rollback', 'Rolled back'), snapMsg); - }); - }); - }); -}); diff --git a/src/pybind/mgr/dashboard/frontend/src/app/shared/services/task-manager-message.service.ts b/src/pybind/mgr/dashboard/frontend/src/app/shared/services/task-manager-message.service.ts deleted file mode 100644 index f8210fb9eb825..0000000000000 --- a/src/pybind/mgr/dashboard/frontend/src/app/shared/services/task-manager-message.service.ts +++ /dev/null @@ -1,167 +0,0 @@ -import { Injectable } from '@angular/core'; - -import { Components } from '../enum/components.enum'; -import { FinishedTask } from '../models/finished-task'; -import { Task } from '../models/task'; -import { ServicesModule } from './services.module'; - -export class TaskMessageOperation { - running: string; - failure: string; - success: string; - - constructor(running: string, failure: string, success: string) { - this.running = running; - this.failure = failure; - this.success = success; - } -} - -class TaskManagerMessage { - operation: TaskMessageOperation; - involves: (object) => string; - errors: (metadata) => object; - - failure(metadata): string { - return `Failed to ${this.operation.failure} ${this.involves(metadata)}`; - } - - running(metadata): string { - return `${this.operation.running} ${this.involves(metadata)}`; - } - - success(metadata): string { - return `${this.operation.success} ${this.involves(metadata)}`; - } - - constructor( - operation: TaskMessageOperation, - involves: (metadata) => string, - errors?: (metadata) => object - ) { - this.operation = operation; - this.involves = involves; - this.errors = errors || (() => ({})); - } -} - -@Injectable({ - providedIn: ServicesModule -}) -export class TaskManagerMessageService { - defaultMessage = new TaskManagerMessage( - new TaskMessageOperation('Executing', 'execute', 'Executed'), - (metadata) => { - return (metadata && (Components[metadata.component] || metadata.component)) || 'unknown task'; - }, - () => { - return {}; - } - ); - - commonOperations = { - create: new TaskMessageOperation('Creating', 'create', 'Created'), - update: new TaskMessageOperation('Updating', 'update', 'Updated'), - delete: new TaskMessageOperation('Deleting', 'delete', 'Deleted') - }; - - rbd = { - default: (metadata) => `RBD '${metadata.pool_name}/${metadata.image_name}'`, - child: (metadata) => `RBD '${metadata.child_pool_name}/${metadata.child_image_name}'`, - destination: (metadata) => `RBD '${metadata.dest_pool_name}/${metadata.dest_image_name}'`, - snapshot: (metadata) => - `RBD snapshot '${metadata.pool_name}/${metadata.image_name}@${metadata.snapshot_name}'` - }; - - messages = { - 'rbd/create': new TaskManagerMessage( - this.commonOperations.create, - this.rbd.default, - (metadata) => ({ - '17': `Name is already used by ${this.rbd.default(metadata)}.` - }) - ), - 'rbd/edit': new TaskManagerMessage( - this.commonOperations.update, - this.rbd.default, - (metadata) => ({ - '17': `Name is already used by ${this.rbd.default(metadata)}.` - }) - ), - 'rbd/delete': new TaskManagerMessage( - this.commonOperations.delete, - this.rbd.default, - (metadata) => ({ - '39': `${this.rbd.default(metadata)} contains snapshots.` - }) - ), - 'rbd/clone': new TaskManagerMessage( - new TaskMessageOperation('Cloning', 'clone', 'Cloned'), - this.rbd.child, - (metadata) => ({ - '17': `Name is already used by ${this.rbd.child(metadata)}.`, - '22': `Snapshot of ${this.rbd.child(metadata)} must be protected.` - }) - ), - 'rbd/copy': new TaskManagerMessage( - new TaskMessageOperation('Copying', 'copy', 'Copied'), - this.rbd.destination, - (metadata) => ({ - '17': `Name is already used by ${this.rbd.destination(metadata)}.` - }) - ), - 'rbd/flatten': new TaskManagerMessage( - new TaskMessageOperation('Flattening', 'flatten', 'Flattened'), - this.rbd.default - ), - 'rbd/snap/create': new TaskManagerMessage( - this.commonOperations.create, - this.rbd.snapshot, - (metadata) => ({ - '17': `Name is already used by ${this.rbd.snapshot(metadata)}.` - }) - ), - 'rbd/snap/edit': new TaskManagerMessage( - this.commonOperations.update, - this.rbd.snapshot, - (metadata) => ({ - '16': `Cannot unprotect ${this.rbd.snapshot(metadata)} because it contains child images.` - }) - ), - 'rbd/snap/delete': new TaskManagerMessage( - this.commonOperations.delete, - this.rbd.snapshot, - (metadata) => ({ - '16': `Cannot delete ${this.rbd.snapshot(metadata)} because it's protected.` - }) - ), - 'rbd/snap/rollback': new TaskManagerMessage( - new TaskMessageOperation('Rolling back', 'rollback', 'Rolled back'), - this.rbd.snapshot - ) - }; - - constructor() {} - - _getTaskTitle(task: Task) { - return this.messages[task.name] || this.defaultMessage; - } - - getSuccessTitle(task: FinishedTask) { - return this._getTaskTitle(task).success(task.metadata); - } - - getErrorMessage(task: FinishedTask) { - return ( - this._getTaskTitle(task).errors(task.metadata)[task.exception.code] || task.exception.detail - ); - } - - getErrorTitle(task: Task) { - return this._getTaskTitle(task).failure(task.metadata); - } - - getRunningTitle(task: Task) { - return this._getTaskTitle(task).running(task.metadata); - } -} diff --git a/src/pybind/mgr/dashboard/frontend/src/app/shared/services/task-message.service.spec.ts b/src/pybind/mgr/dashboard/frontend/src/app/shared/services/task-message.service.spec.ts new file mode 100644 index 0000000000000..af4fb6681ff9b --- /dev/null +++ b/src/pybind/mgr/dashboard/frontend/src/app/shared/services/task-message.service.spec.ts @@ -0,0 +1,150 @@ +import * as _ from 'lodash'; + +import { FinishedTask } from '../models/finished-task'; +import { TaskException } from '../models/task-exception'; +import { TaskMessageOperation, TaskMessageService } from './task-message.service'; + +describe('TaskManagerMessageService', () => { + let service: TaskMessageService; + let finishedTask: FinishedTask; + + beforeEach(() => { + service = new TaskMessageService(); + finishedTask = new FinishedTask(); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); + + it('should get default description', () => { + expect(service.getErrorTitle(finishedTask)).toBe('Failed to execute unknown task'); + }); + + it('should get default running message', () => { + expect(service.getRunningTitle(finishedTask)).toBe('Executing unknown task'); + }); + + it('should get default running message with a set component', () => { + finishedTask.metadata = { component: 'rbd' }; + expect(service.getRunningTitle(finishedTask)).toBe('Executing RBD'); + }); + + it('should getSuccessMessage', () => { + expect(service.getSuccessTitle(finishedTask)).toBe('Executed unknown task'); + }); + + describe('defined tasks messages', () => { + const testMessages = (operation: TaskMessageOperation, involves: string) => { + expect(service.getRunningTitle(finishedTask)).toBe(operation.running + ' ' + involves); + expect(service.getErrorTitle(finishedTask)).toBe( + 'Failed to ' + operation.failure + ' ' + involves + ); + expect(service.getSuccessTitle(finishedTask)).toBe(operation.success + ' ' + involves); + }; + + const testCreate = (involves: string) => { + testMessages(new TaskMessageOperation('Creating', 'create', 'Created'), involves); + }; + + const testUpdate = (involves: string) => { + testMessages(new TaskMessageOperation('Updating', 'update', 'Updated'), involves); + }; + + const testDelete = (involves: string) => { + testMessages(new TaskMessageOperation('Deleting', 'delete', 'Deleted'), involves); + }; + + const testErrorCode = (code: number, msg: string) => { + finishedTask.exception = _.assign(new TaskException(), { + code: code + }); + expect(service.getErrorMessage(finishedTask)).toBe(msg); + }; + + describe('rbd tasks', () => { + let defaultMsg: string; + let childMsg: string; + let destinationMsg: string; + let snapMsg: string; + + beforeEach(() => { + const metadata = { + pool_name: 'somePool', + image_name: 'someImage', + snapshot_name: 'someSnapShot', + dest_pool_name: 'someDestinationPool', + dest_image_name: 'someDestinationImage', + child_pool_name: 'someChildPool', + child_image_name: 'someChildImage' + }; + defaultMsg = `RBD '${metadata.pool_name}/${metadata.image_name}'`; + childMsg = `RBD '${metadata.child_pool_name}/${metadata.child_image_name}'`; + destinationMsg = `RBD '${metadata.dest_pool_name}/${metadata.dest_image_name}'`; + snapMsg = `RBD snapshot '${metadata.pool_name}/${metadata.image_name}@${ + metadata.snapshot_name + }'`; + finishedTask.metadata = metadata; + }); + + it('tests rbd/create messages', () => { + finishedTask.name = 'rbd/create'; + testCreate(defaultMsg); + testErrorCode(17, `Name is already used by ${defaultMsg}.`); + }); + + it('tests rbd/edit messages', () => { + finishedTask.name = 'rbd/edit'; + testUpdate(defaultMsg); + testErrorCode(17, `Name is already used by ${defaultMsg}.`); + }); + + it('tests rbd/delete messages', () => { + finishedTask.name = 'rbd/delete'; + testDelete(defaultMsg); + testErrorCode(39, `${defaultMsg} contains snapshots.`); + }); + + it('tests rbd/clone messages', () => { + finishedTask.name = 'rbd/clone'; + testMessages(new TaskMessageOperation('Cloning', 'clone', 'Cloned'), childMsg); + testErrorCode(17, `Name is already used by ${childMsg}.`); + testErrorCode(22, `Snapshot of ${childMsg} must be protected.`); + }); + + it('tests rbd/copy messages', () => { + finishedTask.name = 'rbd/copy'; + testMessages(new TaskMessageOperation('Copying', 'copy', 'Copied'), destinationMsg); + testErrorCode(17, `Name is already used by ${destinationMsg}.`); + }); + + it('tests rbd/flatten messages', () => { + finishedTask.name = 'rbd/flatten'; + testMessages(new TaskMessageOperation('Flattening', 'flatten', 'Flattened'), defaultMsg); + }); + + it('tests rbd/snap/create messages', () => { + finishedTask.name = 'rbd/snap/create'; + testCreate(snapMsg); + testErrorCode(17, `Name is already used by ${snapMsg}.`); + }); + + it('tests rbd/snap/edit messages', () => { + finishedTask.name = 'rbd/snap/edit'; + testUpdate(snapMsg); + testErrorCode(16, `Cannot unprotect ${snapMsg} because it contains child images.`); + }); + + it('tests rbd/snap/delete messages', () => { + finishedTask.name = 'rbd/snap/delete'; + testDelete(snapMsg); + testErrorCode(16, `Cannot delete ${snapMsg} because it's protected.`); + }); + + it('tests rbd/snap/rollback messages', () => { + finishedTask.name = 'rbd/snap/rollback'; + testMessages(new TaskMessageOperation('Rolling back', 'rollback', 'Rolled back'), snapMsg); + }); + }); + }); +}); diff --git a/src/pybind/mgr/dashboard/frontend/src/app/shared/services/task-message.service.ts b/src/pybind/mgr/dashboard/frontend/src/app/shared/services/task-message.service.ts new file mode 100644 index 0000000000000..444f274cc78ce --- /dev/null +++ b/src/pybind/mgr/dashboard/frontend/src/app/shared/services/task-message.service.ts @@ -0,0 +1,155 @@ +import { Injectable } from '@angular/core'; + +import { Components } from '../enum/components.enum'; +import { FinishedTask } from '../models/finished-task'; +import { Task } from '../models/task'; +import { ServicesModule } from './services.module'; + +export class TaskMessageOperation { + running: string; + failure: string; + success: string; + + constructor(running: string, failure: string, success: string) { + this.running = running; + this.failure = failure; + this.success = success; + } +} + +class TaskMessage { + operation: TaskMessageOperation; + involves: (object) => string; + errors: (metadata) => object; + + failure(metadata): string { + return `Failed to ${this.operation.failure} ${this.involves(metadata)}`; + } + + running(metadata): string { + return `${this.operation.running} ${this.involves(metadata)}`; + } + + success(metadata): string { + return `${this.operation.success} ${this.involves(metadata)}`; + } + + constructor( + operation: TaskMessageOperation, + involves: (metadata) => string, + errors?: (metadata) => object + ) { + this.operation = operation; + this.involves = involves; + this.errors = errors || (() => ({})); + } +} + +@Injectable({ + providedIn: ServicesModule +}) +export class TaskMessageService { + defaultMessage = new TaskMessage( + new TaskMessageOperation('Executing', 'execute', 'Executed'), + (metadata) => { + return (metadata && (Components[metadata.component] || metadata.component)) || 'unknown task'; + }, + () => { + return {}; + } + ); + + commonOperations = { + create: new TaskMessageOperation('Creating', 'create', 'Created'), + update: new TaskMessageOperation('Updating', 'update', 'Updated'), + delete: new TaskMessageOperation('Deleting', 'delete', 'Deleted') + }; + + rbd = { + default: (metadata) => `RBD '${metadata.pool_name}/${metadata.image_name}'`, + child: (metadata) => `RBD '${metadata.child_pool_name}/${metadata.child_image_name}'`, + destination: (metadata) => `RBD '${metadata.dest_pool_name}/${metadata.dest_image_name}'`, + snapshot: (metadata) => + `RBD snapshot '${metadata.pool_name}/${metadata.image_name}@${metadata.snapshot_name}'` + }; + + messages = { + 'rbd/create': new TaskMessage(this.commonOperations.create, this.rbd.default, (metadata) => ({ + '17': `Name is already used by ${this.rbd.default(metadata)}.` + })), + 'rbd/edit': new TaskMessage(this.commonOperations.update, this.rbd.default, (metadata) => ({ + '17': `Name is already used by ${this.rbd.default(metadata)}.` + })), + 'rbd/delete': new TaskMessage(this.commonOperations.delete, this.rbd.default, (metadata) => ({ + '39': `${this.rbd.default(metadata)} contains snapshots.` + })), + 'rbd/clone': new TaskMessage( + new TaskMessageOperation('Cloning', 'clone', 'Cloned'), + this.rbd.child, + (metadata) => ({ + '17': `Name is already used by ${this.rbd.child(metadata)}.`, + '22': `Snapshot of ${this.rbd.child(metadata)} must be protected.` + }) + ), + 'rbd/copy': new TaskMessage( + new TaskMessageOperation('Copying', 'copy', 'Copied'), + this.rbd.destination, + (metadata) => ({ + '17': `Name is already used by ${this.rbd.destination(metadata)}.` + }) + ), + 'rbd/flatten': new TaskMessage( + new TaskMessageOperation('Flattening', 'flatten', 'Flattened'), + this.rbd.default + ), + 'rbd/snap/create': new TaskMessage( + this.commonOperations.create, + this.rbd.snapshot, + (metadata) => ({ + '17': `Name is already used by ${this.rbd.snapshot(metadata)}.` + }) + ), + 'rbd/snap/edit': new TaskMessage( + this.commonOperations.update, + this.rbd.snapshot, + (metadata) => ({ + '16': `Cannot unprotect ${this.rbd.snapshot(metadata)} because it contains child images.` + }) + ), + 'rbd/snap/delete': new TaskMessage( + this.commonOperations.delete, + this.rbd.snapshot, + (metadata) => ({ + '16': `Cannot delete ${this.rbd.snapshot(metadata)} because it's protected.` + }) + ), + 'rbd/snap/rollback': new TaskMessage( + new TaskMessageOperation('Rolling back', 'rollback', 'Rolled back'), + this.rbd.snapshot + ) + }; + + constructor() {} + + _getTaskTitle(task: Task) { + return this.messages[task.name] || this.defaultMessage; + } + + getSuccessTitle(task: FinishedTask) { + return this._getTaskTitle(task).success(task.metadata); + } + + getErrorMessage(task: FinishedTask) { + return ( + this._getTaskTitle(task).errors(task.metadata)[task.exception.code] || task.exception.detail + ); + } + + getErrorTitle(task: Task) { + return this._getTaskTitle(task).failure(task.metadata); + } + + getRunningTitle(task: Task) { + return this._getTaskTitle(task).running(task.metadata); + } +} diff --git a/src/pybind/mgr/dashboard/frontend/src/app/shared/services/task-wrapper.service.ts b/src/pybind/mgr/dashboard/frontend/src/app/shared/services/task-wrapper.service.ts index 9e91cab8e5418..5ac34a6324c93 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/shared/services/task-wrapper.service.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/shared/services/task-wrapper.service.ts @@ -9,8 +9,8 @@ import { FinishedTask } from '../models/finished-task'; import { NotificationService } from './notification.service'; import { ServicesModule } from './services.module'; import { SummaryService } from './summary.service'; -import { TaskManagerMessageService } from './task-manager-message.service'; import { TaskManagerService } from './task-manager.service'; +import { TaskMessageService } from './task-message.service'; @Injectable({ providedIn: ServicesModule @@ -19,7 +19,7 @@ export class TaskWrapperService { constructor( private notificationService: NotificationService, private summaryService: SummaryService, - private taskManagerMessageService: TaskManagerMessageService, + private taskMessageService: TaskMessageService, private taskManagerService: TaskManagerService ) {} @@ -50,8 +50,7 @@ export class TaskWrapperService { _handleExecutingTasks(task: FinishedTask) { this.notificationService.show( NotificationType.info, - this.taskManagerMessageService.getRunningTitle(task), - this.taskManagerMessageService.getErrorTitle(task) + this.taskMessageService.getRunningTitle(task) ); const executingTask = new ExecutingTask(task.name, task.metadata);