@spotinst/spinnaker-deck
Version:
Spinnaker-Deck service, forked with support to Spotinst
108 lines (98 loc) • 3.51 kB
text/typescript
import { $log, $q, $timeout } from 'ngimport';
import { Subject } from 'rxjs';
import { REST } from 'core/api/ApiService';
import { ITask } from 'core/domain';
import { OrchestratedItemTransformer } from 'core/orchestratedItem/orchestratedItem.transformer';
export class TaskReader {
private static activeStatuses: string[] = ['RUNNING', 'SUSPENDED', 'NOT_STARTED'];
public static getTasks(applicationName: string, statuses: string[] = []): PromiseLike<ITask[]> {
return REST('/applications')
.path(applicationName, 'tasks')
.query({ statuses: statuses.join(',') })
.get()
.then((tasks: ITask[]) => {
tasks.forEach((task) => this.setTaskProperties(task));
return tasks.filter((task) => !task.getValueFor('dryRun'));
});
}
public static getRunningTasks(applicationName: string): PromiseLike<ITask[]> {
return this.getTasks(applicationName, this.activeStatuses);
}
public static getTask(taskId: string): PromiseLike<ITask> {
return REST('/tasks')
.path(taskId)
.get()
.then((task: ITask) => {
this.setTaskProperties(task);
if (task.execution) {
OrchestratedItemTransformer.defineProperties(task.execution);
if (task.execution.stages) {
task.execution.stages.forEach((stage: any) => OrchestratedItemTransformer.defineProperties(stage));
}
}
return task;
})
.catch((error: any): undefined => {
$log.warn('There was an issue retrieving taskId: ', taskId, error);
return undefined;
});
}
public static waitUntilTaskMatches(
task: ITask,
closure: (task: ITask) => boolean,
failureClosure?: (task: ITask) => boolean,
interval = 1000,
notifier?: Subject<void>,
): PromiseLike<ITask> {
const deferred = $q.defer<ITask>();
if (!task) {
deferred.reject(null);
} else if (closure(task)) {
deferred.resolve(task);
} else if (failureClosure && failureClosure(task)) {
deferred.reject(task);
} else {
task.poller = $timeout(() => {
this.getTask(task.id).then((updated) => {
this.updateTask(task, updated);
notifier?.next();
this.waitUntilTaskMatches(task, closure, failureClosure, interval, notifier).then(
deferred.resolve,
deferred.reject,
);
});
}, interval);
}
return deferred.promise;
}
public static waitUntilTaskCompletes(task: ITask, interval = 1000, notifier?: Subject<void>): PromiseLike<ITask> {
return this.waitUntilTaskMatches(
task,
(t) => t.isCompleted,
(t) => t.isFailed,
interval,
notifier,
);
}
/**
* When polling for a match, (most of) the new task's properties are copied into the original task; if you need
* some other property, you'll need to update this method
*/
private static updateTask(original: ITask, updated?: ITask): void {
if (!updated) {
return;
}
original.status = updated.status;
original.variables = updated.variables;
original.steps = updated.steps;
original.endTime = updated.endTime;
original.execution = updated.execution;
original.history = updated.history;
}
private static setTaskProperties(task: ITask): void {
OrchestratedItemTransformer.defineProperties(task);
if (task.steps && task.steps.length) {
task.steps.forEach((step) => OrchestratedItemTransformer.defineProperties(step));
}
}
}