1 import { Injectable } from '@angular/core';
3 import { I18n } from '@ngx-translate/i18n-polyfill';
5 import { Components } from '../enum/components.enum';
6 import { FinishedTask } from '../models/finished-task';
7 import { Task } from '../models/task';
8 import { ServicesModule } from './services.module';
10 export class TaskMessageOperation {
15 constructor(running: string, failure: string, success: string) {
16 this.running = running;
17 this.failure = failure;
18 this.success = success;
25 operation: TaskMessageOperation;
26 involves: (object) => string;
27 errors: (metadata) => object;
29 failure(metadata): string {
30 return this.i18n('Failed to {{failure}} {{metadata}}', {
31 failure: this.operation.failure,
32 metadata: this.involves(metadata)
36 running(metadata): string {
37 return `${this.operation.running} ${this.involves(metadata)}`;
40 success(metadata): string {
41 return `${this.operation.success} ${this.involves(metadata)}`;
46 operation: TaskMessageOperation,
47 involves: (metadata) => string,
48 errors?: (metadata) => object
51 this.operation = operation;
52 this.involves = involves;
53 this.errors = errors || (() => ({}));
58 providedIn: ServicesModule
60 export class TaskMessageService {
61 constructor(private i18n: I18n) {}
63 defaultMessage = this.newTaskMessage(
64 new TaskMessageOperation(this.i18n('Executing'), this.i18n('execute'), this.i18n('Executed')),
67 (metadata && (Components[metadata.component] || metadata.component)) ||
68 this.i18n('unknown task')
77 create: new TaskMessageOperation(
78 this.i18n('Creating'),
82 update: new TaskMessageOperation(
83 this.i18n('Updating'),
87 delete: new TaskMessageOperation(
88 this.i18n('Deleting'),
95 default: (metadata) =>
96 this.i18n(`RBD '{{id}}'`, {
97 id: `${metadata.pool_name}/${metadata.image_name}`
100 this.i18n(`RBD '{{id}}'`, {
101 id: `${metadata.child_pool_name}/${metadata.child_image_name}`
103 destination: (metadata) =>
104 this.i18n(`RBD '{{id}}'`, {
105 id: `${metadata.dest_pool_name}/${metadata.dest_image_name}`
107 snapshot: (metadata) =>
108 this.i18n(`RBD snapshot '{{id}}'`, {
109 id: `${metadata.pool_name}/${metadata.image_name}@${metadata.snapshot_name}`
115 this.i18n(`mirror mode for pool '{{id}}'`, {
116 id: `${metadata.pool_name}`
118 pool_peer: (metadata) =>
119 this.i18n(`mirror peer for pool '{{id}}'`, {
120 id: `${metadata.pool_name}`
126 'pool/create': this.newTaskMessage(
127 this.commonOperations.create,
128 (metadata) => this.pool(metadata),
130 '17': this.i18n('Name is already used by {{pool_name}}.', {
131 pool_name: this.pool(metadata)
135 'pool/edit': this.newTaskMessage(
136 this.commonOperations.update,
137 (metadata) => this.pool(metadata),
139 '17': this.i18n('Name is already used by {{pool_name}}.', {
140 pool_name: this.pool(metadata)
144 'pool/delete': this.newTaskMessage(this.commonOperations.delete, (metadata) =>
147 // Erasure code profile tasks
148 'ecp/create': this.newTaskMessage(
149 this.commonOperations.create,
150 (metadata) => this.ecp(metadata),
152 '17': this.i18n('Name is already used by {{name}}.', {
153 name: this.ecp(metadata)
157 'ecp/delete': this.newTaskMessage(this.commonOperations.delete, (metadata) =>
161 'rbd/create': this.newTaskMessage(
162 this.commonOperations.create,
165 '17': this.i18n('Name is already used by {{rbd_name}}.', {
166 rbd_name: this.rbd.default(metadata)
170 'rbd/edit': this.newTaskMessage(this.commonOperations.update, this.rbd.default, (metadata) => ({
171 '17': this.i18n('Name is already used by {{rbd_name}}.', {
172 rbd_name: this.rbd.default(metadata)
175 'rbd/delete': this.newTaskMessage(
176 this.commonOperations.delete,
179 '39': this.i18n('{{rbd_name}} contains snapshots.', {
180 rbd_name: this.rbd.default(metadata)
184 'rbd/clone': this.newTaskMessage(
185 new TaskMessageOperation(this.i18n('Cloning'), this.i18n('clone'), this.i18n('Cloned')),
188 '17': this.i18n('Name is already used by {{rbd_name}}.', {
189 rbd_name: this.rbd.child(metadata)
191 '22': this.i18n('Snapshot of {{rbd_name}} must be protected.', {
192 rbd_name: this.rbd.child(metadata)
196 'rbd/copy': this.newTaskMessage(
197 new TaskMessageOperation(this.i18n('Copying'), this.i18n('copy'), this.i18n('Copied')),
198 this.rbd.destination,
200 '17': this.i18n('Name is already used by {{rbd_name}}.', {
201 rbd_name: this.rbd.destination(metadata)
205 'rbd/flatten': this.newTaskMessage(
206 new TaskMessageOperation(
207 this.i18n('Flattening'),
208 this.i18n('flatten'),
209 this.i18n('Flattened')
213 // RBD snapshot tasks
214 'rbd/snap/create': this.newTaskMessage(
215 this.commonOperations.create,
218 '17': this.i18n('Name is already used by {{snap_name}}.', {
219 snap_name: this.rbd.snapshot(metadata)
223 'rbd/snap/edit': this.newTaskMessage(
224 this.commonOperations.update,
227 '16': this.i18n('Cannot unprotect {{snap_name}} because it contains child images.', {
228 snap_name: this.rbd.snapshot(metadata)
232 'rbd/snap/delete': this.newTaskMessage(
233 this.commonOperations.delete,
236 '16': this.i18n(`Cannot delete {{snap_name}} because it's protected.`, {
237 snap_name: this.rbd.snapshot(metadata)
241 'rbd/snap/rollback': this.newTaskMessage(
242 new TaskMessageOperation(
243 this.i18n('Rolling back'),
244 this.i18n('rollback'),
245 this.i18n('Rolled back')
250 'rbd/trash/move': this.newTaskMessage(
251 new TaskMessageOperation(this.i18n('Moving'), this.i18n('move'), this.i18n('Moved')),
253 this.i18n(`image '{{id}}' to trash`, {
254 id: `${metadata.pool_name}/${metadata.image_name}`
257 2: this.i18n('Could not find image.')
260 'rbd/trash/restore': this.newTaskMessage(
261 new TaskMessageOperation(this.i18n('Restoring'), this.i18n('restore'), this.i18n('Restored')),
263 this.i18n(`image '{{id}}' into '{{new_id}}'`, {
264 id: `${metadata.pool_name}@${metadata.image_id}`,
265 new_id: `${metadata.pool_name}/${metadata.new_image_name}`
268 17: this.i18n(`Image name '{{id}}' is already in use.`, {
269 id: `${metadata.pool_name}/${metadata.new_image_name}`
273 'rbd/trash/remove': this.newTaskMessage(
274 new TaskMessageOperation(this.i18n('Deleting'), this.i18n('delete'), this.i18n('Deleted')),
276 this.i18n(`image '{{id}}'`, {
277 id: `${metadata.pool_name}/${metadata.image_name}@${metadata.image_id}`
280 'rbd/trash/purge': this.newTaskMessage(
281 new TaskMessageOperation(this.i18n('Purging'), this.i18n('purge'), this.i18n('Purged')),
283 let message = this.i18n('all pools');
284 if (metadata.pool_name) {
285 message = `'${metadata.pool_name}'`;
287 return this.i18n('images from {{message}}', {
292 // RBD mirroring tasks
293 'rbd/mirroring/pool/edit': this.newTaskMessage(
294 this.commonOperations.update,
295 this.rbd_mirroring.pool,
297 16: this.i18n('Cannot disable mirroring because it contains a peer.')
300 'rbd/mirroring/peer/add': this.newTaskMessage(
301 this.commonOperations.create,
302 this.rbd_mirroring.pool_peer,
305 'rbd/mirroring/peer/edit': this.newTaskMessage(
306 this.commonOperations.update,
307 this.rbd_mirroring.pool_peer,
310 'rbd/mirroring/peer/delete': this.newTaskMessage(
311 this.commonOperations.delete,
312 this.rbd_mirroring.pool_peer,
315 // iSCSI target tasks
316 'iscsi/target/create': this.newTaskMessage(this.commonOperations.create, (metadata) =>
317 this.iscsiTarget(metadata)
319 'iscsi/target/edit': this.newTaskMessage(this.commonOperations.update, (metadata) =>
320 this.iscsiTarget(metadata)
322 'iscsi/target/delete': this.newTaskMessage(this.commonOperations.delete, (metadata) =>
323 this.iscsiTarget(metadata)
325 'nfs/create': this.newTaskMessage(this.commonOperations.create, (metadata) =>
328 'nfs/edit': this.newTaskMessage(this.commonOperations.update, (metadata) => this.nfs(metadata)),
329 'nfs/delete': this.newTaskMessage(this.commonOperations.delete, (metadata) =>
335 operation: TaskMessageOperation,
336 involves: (metadata) => string,
337 errors?: (metadata) => object
339 return new TaskMessage(this.i18n, operation, involves, errors);
343 return this.i18n(`pool '{{pool_name}}'`, {
344 pool_name: metadata.pool_name
349 return this.i18n(`erasure code profile '{{name}}'`, { name: metadata.name });
352 iscsiTarget(metadata) {
353 return this.i18n(`target '{{target_iqn}}'`, { target_iqn: metadata.target_iqn });
357 return this.i18n(`NFS {{nfs_id}}`, {
358 nfs_id: `'${metadata.cluster_id}:${metadata.export_id ? metadata.export_id : metadata.path}'`
362 _getTaskTitle(task: Task) {
363 return this.messages[task.name] || this.defaultMessage;
366 getSuccessTitle(task: FinishedTask) {
367 return this._getTaskTitle(task).success(task.metadata);
370 getErrorMessage(task: FinishedTask) {
372 this._getTaskTitle(task).errors(task.metadata)[task.exception.code] || task.exception.detail
376 getErrorTitle(task: Task) {
377 return this._getTaskTitle(task).failure(task.metadata);
380 getRunningTitle(task: Task) {
381 return this._getTaskTitle(task).running(task.metadata);
384 getRunningText(task: Task) {
385 return this._getTaskTitle(task).operation.running;