]> git.proxmox.com Git - ceph.git/blob - ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/services/task-wrapper.service.ts
import 15.2.0 Octopus source
[ceph.git] / ceph / src / pybind / mgr / dashboard / frontend / src / app / shared / services / task-wrapper.service.ts
1 import { Injectable } from '@angular/core';
2
3 import { Observable, Subscriber } from 'rxjs';
4
5 import { NotificationType } from '../enum/notification-type.enum';
6 import { CdNotificationConfig } from '../models/cd-notification';
7 import { ExecutingTask } from '../models/executing-task';
8 import { FinishedTask } from '../models/finished-task';
9 import { NotificationService } from './notification.service';
10 import { SummaryService } from './summary.service';
11 import { TaskManagerService } from './task-manager.service';
12 import { TaskMessageService } from './task-message.service';
13
14 @Injectable({
15 providedIn: 'root'
16 })
17 export class TaskWrapperService {
18 constructor(
19 private notificationService: NotificationService,
20 private summaryService: SummaryService,
21 private taskMessageService: TaskMessageService,
22 private taskManagerService: TaskManagerService
23 ) {}
24
25 wrapTaskAroundCall({ task, call }: { task: FinishedTask; call: Observable<any> }) {
26 return new Observable((observer: Subscriber<any>) => {
27 call.subscribe(
28 (resp) => {
29 if (resp.status === 202) {
30 this._handleExecutingTasks(task);
31 } else {
32 this.summaryService.refresh();
33 task.success = true;
34 this.notificationService.notifyTask(task);
35 }
36 },
37 (resp) => {
38 task.success = false;
39 task.exception = resp.error;
40 observer.error(resp);
41 },
42 () => {
43 observer.complete();
44 }
45 );
46 });
47 }
48
49 _handleExecutingTasks(task: FinishedTask) {
50 const notification = new CdNotificationConfig(
51 NotificationType.info,
52 this.taskMessageService.getRunningTitle(task)
53 );
54 notification.isFinishedTask = true;
55 this.notificationService.show(notification);
56
57 const executingTask = new ExecutingTask(task.name, task.metadata);
58 this.summaryService.addRunningTask(executingTask);
59
60 this.taskManagerService.subscribe(
61 executingTask.name,
62 executingTask.metadata,
63 (asyncTask: FinishedTask) => {
64 this.notificationService.notifyTask(asyncTask);
65 }
66 );
67 }
68 }