]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: Rename to taskMessageService 23315/head
authorStephan Müller <smueller@suse.com>
Wed, 8 Aug 2018 11:19:27 +0000 (13:19 +0200)
committerStephan Müller <smueller@suse.com>
Thu, 16 Aug 2018 14:38:04 +0000 (16:38 +0200)
Renames taskManagerMessageService to taskMessageService.

Signed-off-by: Stephan Müller <smueller@suse.com>
src/pybind/mgr/dashboard/frontend/src/app/core/navigation/task-manager/task-manager.component.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/services/notification.service.spec.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/services/notification.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/services/task-manager-message.service.spec.ts [deleted file]
src/pybind/mgr/dashboard/frontend/src/app/shared/services/task-manager-message.service.ts [deleted file]
src/pybind/mgr/dashboard/frontend/src/app/shared/services/task-message.service.spec.ts [new file with mode: 0644]
src/pybind/mgr/dashboard/frontend/src/app/shared/services/task-message.service.ts [new file with mode: 0644]
src/pybind/mgr/dashboard/frontend/src/app/shared/services/task-wrapper.service.ts

index 4e17c704a1f493e094a244c8530baf754c411e88..3eb58985ee67ef3ebd9fdc45eecad2a5fd4a9260 100644 (file)
@@ -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;
index 763a086b71ef3da2886a1101259d4636a91f49b7..204a9e1c5379ed8d7432eeb4acc3b98617c6916b 100644 (file)
@@ -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 }
     ]
   });
index f736a1e41905b4d5e7086e234dfd506279d2e7b7..9c03095ac119de0978b5b8005b880d2a0df1f35e 100644 (file)
@@ -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 (file)
index aeb3623..0000000
+++ /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 (file)
index f8210fb..0000000
+++ /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 (file)
index 0000000..af4fb66
--- /dev/null
@@ -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 (file)
index 0000000..444f274
--- /dev/null
@@ -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);
+  }
+}
index 9e91cab8e54188a94fa7024fb24737ab113ec67e..5ac34a6324c938f5599349044c736321d144436c 100644 (file)
@@ -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);