]> git.proxmox.com Git - ceph.git/blob - ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/services/task-manager.service.ts
import ceph 16.2.6
[ceph.git] / ceph / src / pybind / mgr / dashboard / frontend / src / app / shared / services / task-manager.service.ts
1 import { Injectable } from '@angular/core';
2
3 import _ from 'lodash';
4
5 import { ExecutingTask } from '../models/executing-task';
6 import { FinishedTask } from '../models/finished-task';
7 import { Task } from '../models/task';
8 import { SummaryService } from './summary.service';
9
10 class TaskSubscription {
11 name: string;
12 metadata: object;
13 onTaskFinished: (finishedTask: FinishedTask) => any;
14
15 constructor(name: string, metadata: object, onTaskFinished: any) {
16 this.name = name;
17 this.metadata = metadata;
18 this.onTaskFinished = onTaskFinished;
19 }
20 }
21
22 @Injectable({
23 providedIn: 'root'
24 })
25 export class TaskManagerService {
26 subscriptions: Array<TaskSubscription> = [];
27
28 init(summaryService: SummaryService) {
29 return summaryService.subscribe((summary) => {
30 const executingTasks = summary.executing_tasks;
31 const finishedTasks = summary.finished_tasks;
32 const newSubscriptions: Array<TaskSubscription> = [];
33 for (const subscription of this.subscriptions) {
34 const finishedTask = <FinishedTask>this._getTask(subscription, finishedTasks);
35 const executingTask = <ExecutingTask>this._getTask(subscription, executingTasks);
36 if (finishedTask !== null && executingTask === null) {
37 subscription.onTaskFinished(finishedTask);
38 }
39 if (executingTask !== null) {
40 newSubscriptions.push(subscription);
41 }
42 this.subscriptions = newSubscriptions;
43 }
44 });
45 }
46
47 subscribe(name: string, metadata: object, onTaskFinished: (finishedTask: FinishedTask) => any) {
48 this.subscriptions.push(new TaskSubscription(name, metadata, onTaskFinished));
49 }
50
51 private _getTask(subscription: TaskSubscription, tasks: Array<Task>): Task {
52 for (const task of tasks) {
53 if (task.name === subscription.name && _.isEqual(task.metadata, subscription.metadata)) {
54 return task;
55 }
56 }
57 return null;
58 }
59 }