-
Notifications
You must be signed in to change notification settings - Fork 20
/
Copy pathpreferred-jobs.js
141 lines (132 loc) · 4.88 KB
/
preferred-jobs.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
const queuePosition = require('@hkube/consts').queuePositions;
const queueRunner = require('../queue-runner');
const validator = require('../validation');
const InvalidDataError = require('../errors/InvalidDataError');
const PagingBase = require('./pagingBase');
class PreferredJobs extends PagingBase {
getPreferredJobsList() {
return queueRunner.preferredQueue.queue.map(job => {
const { score, calculated, next, ...rest } = job;
return rest;
});
}
_filteredFlatJobList(filter) {
let filteredList;
if (filter) {
filteredList = queueRunner.preferredQueue.queue.filter(job => {
if (filter.pipelineName) {
return job.pipelineName === filter.pipelineName;
}
if (filter.tag) {
return job.tags?.findIndex((tag) => tag === filter.tag) > -1;
}
return true;
});
}
else filteredList = queueRunner.preferredQueue.queue;
return filteredList.map(job => {
const { score, calculated, next, ...rest } = job;
return rest;
});
}
getPreferredAggregatedByPipeline() {
const returnList = this.getPreferredJobsList().reduce((rv, job) => {
// eslint-disable-next-line no-param-reassign
if (rv.length > 0) {
if (rv[rv.length - 1].name === job.pipelineName) {
// eslint-disable-next-line no-param-reassign
rv[rv.length - 1].count += 1;
return rv;
}
}
rv.push({ name: job.pipelineName, count: 1, fromJob: job.jobId });
return rv;
}, []);
return returnList;
}
getPreferredAggregatedByTags() {
const returnList = this.getPreferredJobsList().reduce((rv, job) => {
// eslint-disable-next-line no-param-reassign
if (rv.length > 0) {
if (rv[rv.length - 1].name === job.tags.toString()) {
// eslint-disable-next-line no-param-reassign
rv[rv.length - 1].count += 1;
return rv;
}
}
rv.push({ name: job.tags.toString(), count: 1, fromJob: job.jobId });
return rv;
}, []);
return returnList;
}
deletePreferredJobs(jobIds) {
const deletedJobs = jobIds.map(jobId => {
const deletedArr = queueRunner.preferredQueue.dequeue({ jobId });
if (deletedArr.length > 0) {
const job = deletedArr[0];
queueRunner.queue.enqueue(job);
}
return deletedArr.length > 0 ? deletedArr[0] : null;
}).filter(job => job !== null);
return deletedJobs;
}
query(job, tag, pipelineName, jobId) {
if (jobId) {
return job.jobId === jobId;
}
if (pipelineName) {
return job.pipelineName === pipelineName;
}
if (tag) {
return job.tags?.includes(tag);
}
return false;
}
getIndex(position, tag, pipelineName, jobId) {
let index;
if (position === queuePosition.BEFORE) {
index = queueRunner.preferredQueue.queue.findIndex(job => this.query(job, tag, pipelineName, jobId));
if (index === -1) {
index = 0;
}
}
if (position === queuePosition.AFTER) {
index = queueRunner.preferredQueue.queue.slice(0).reverse().findIndex(job => this.query(job, tag, pipelineName, jobId));
if (index === -1) {
index = 0;
}
else {
index = queueRunner.preferredQueue.queue.length - index;
}
}
if (position === queuePosition.FIRST) {
index = 0;
}
if (position === queuePosition.LAST) {
index = queueRunner.preferredQueue.queue.length;
}
return index;
}
async addPreferredJobs(addedJobs) {
validator.preference.validatePreferenceRequest(addedJobs);
const { jobs, position, query } = addedJobs;
const { tag, pipelineName, jobId } = query || {};
const index = this.getIndex(position, tag, pipelineName, jobId);
const allDequeued = [];
await Promise.all(jobs.reverse().map(async id => {
const dequeued = queueRunner.queue.dequeue({ jobId: id });
if (dequeued.length > 0) {
allDequeued.push(dequeued[0]);
queueRunner.preferredQueue.queue.splice(index, 0, { ...dequeued[0], score: 1 });
}
return id;
}));
if (allDequeued.length === 0) {
throw new InvalidDataError('None of the jobs exist in the general queue');
}
else {
return allDequeued;
}
}
}
module.exports = new PreferredJobs();