teraslice 3.0.0 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -6,7 +6,7 @@ import { RecoveryCleanupType } from '@terascope/job-components';
|
|
|
6
6
|
import { parseErrorInfo, parseList, logError, TSError, startsWith, pWhile, isKey } from '@terascope/core-utils';
|
|
7
7
|
import { ExecutionStatusEnum } from '@terascope/types';
|
|
8
8
|
import { makeLogger } from '../../workers/helpers/terafoundation.js';
|
|
9
|
-
import { makeTable, sendError, handleTerasliceRequest, getSearchOptions, createJobActiveQuery, addDeletedToQuery } from '../../utils/api_utils.js';
|
|
9
|
+
import { makeTable, sendError, handleTerasliceRequest, getSearchOptions, createJobActiveQuery, addDeletedToQuery, addFilterToQuery } from '../../utils/api_utils.js';
|
|
10
10
|
import { getPackageJSON } from '../../utils/file_utils.js';
|
|
11
11
|
const terasliceVersion = getPackageJSON().version;
|
|
12
12
|
function validateCleanupType(cleanupType) {
|
|
@@ -221,12 +221,13 @@ export class ApiService {
|
|
|
221
221
|
});
|
|
222
222
|
v1routes.get('/jobs', (req, res) => {
|
|
223
223
|
const { active = '', deleted = 'false', ex } = req.query;
|
|
224
|
-
const { size, from, sort } = getSearchOptions(req);
|
|
224
|
+
const { size, from, sort, filter } = getSearchOptions(req);
|
|
225
225
|
const requestHandler = handleTerasliceRequest(req, res, 'Could not retrieve list of jobs');
|
|
226
226
|
requestHandler(() => {
|
|
227
227
|
validateGetDeletedOption(deleted);
|
|
228
|
-
|
|
229
|
-
|
|
228
|
+
let partialQuery = createJobActiveQuery(active);
|
|
229
|
+
partialQuery = addDeletedToQuery(deleted, partialQuery);
|
|
230
|
+
const query = addFilterToQuery(partialQuery, filter);
|
|
230
231
|
return typeof ex === 'string'
|
|
231
232
|
? this.jobsService.getJobsWithExInfo(query, from, size, sort, ex.split(','))
|
|
232
233
|
: this.jobsStorage.search(query, from, size, sort);
|
|
@@ -356,21 +357,20 @@ export class ApiService {
|
|
|
356
357
|
});
|
|
357
358
|
v1routes.get([
|
|
358
359
|
'/jobs/:jobId/errors',
|
|
359
|
-
'/jobs/:jobId/errors/:exId',
|
|
360
360
|
'/ex/:exId/errors',
|
|
361
361
|
'/ex/errors',
|
|
362
362
|
], (req, res) => {
|
|
363
|
-
const { size, from, sort } = getSearchOptions(req);
|
|
363
|
+
const { size, from, sort, filter } = getSearchOptions(req);
|
|
364
364
|
const requestHandler = handleTerasliceRequest(req, res, 'Could not get errors for job');
|
|
365
365
|
requestHandler(async () => {
|
|
366
366
|
const exId = await this._getExIdFromRequest(req, true);
|
|
367
|
-
const query = `state:error AND ex_id:"${exId}"
|
|
367
|
+
const query = addFilterToQuery(`state:error AND ex_id:"${exId}"`, filter);
|
|
368
368
|
return this.stateStorage.search(query, from, size, sort);
|
|
369
369
|
});
|
|
370
370
|
});
|
|
371
371
|
v1routes.get('/ex', (req, res) => {
|
|
372
372
|
const { status = '', deleted = 'false' } = req.query;
|
|
373
|
-
const { size, from, sort } = getSearchOptions(req);
|
|
373
|
+
const { size, from, sort, filter } = getSearchOptions(req);
|
|
374
374
|
const requestHandler = handleTerasliceRequest(req, res, 'Could not retrieve list of execution contexts');
|
|
375
375
|
requestHandler(async () => {
|
|
376
376
|
validateGetDeletedOption(deleted);
|
|
@@ -380,7 +380,8 @@ export class ApiService {
|
|
|
380
380
|
const statusTerms = statuses.map((s) => `_status:"${s}"`).join(' OR ');
|
|
381
381
|
partialQuery += ` AND (${statusTerms})`;
|
|
382
382
|
}
|
|
383
|
-
|
|
383
|
+
partialQuery = addDeletedToQuery(deleted, partialQuery);
|
|
384
|
+
const query = addFilterToQuery(partialQuery, filter);
|
|
384
385
|
return this.executionStorage.search(query, from, size, sort);
|
|
385
386
|
});
|
|
386
387
|
});
|
|
@@ -439,7 +440,7 @@ export class ApiService {
|
|
|
439
440
|
});
|
|
440
441
|
this.app.get('/txt/jobs', (req, res) => {
|
|
441
442
|
const { active = '', deleted = 'false' } = req.query;
|
|
442
|
-
const { size, from, sort } = getSearchOptions(req);
|
|
443
|
+
const { size, from, sort, filter } = getSearchOptions(req);
|
|
443
444
|
const defaults = ['job_id', 'name', 'active', 'lifecycle', 'slicers', 'workers', '_created', '_updated'];
|
|
444
445
|
const requestHandler = handleTerasliceRequest(req, res, 'Could not get all jobs');
|
|
445
446
|
requestHandler(async () => {
|
|
@@ -447,15 +448,16 @@ export class ApiService {
|
|
|
447
448
|
if (deleted !== 'false') {
|
|
448
449
|
defaults.push('_deleted_on');
|
|
449
450
|
}
|
|
450
|
-
|
|
451
|
-
|
|
451
|
+
let partialQuery = createJobActiveQuery(active);
|
|
452
|
+
partialQuery = addDeletedToQuery(deleted, partialQuery);
|
|
453
|
+
const query = addFilterToQuery(partialQuery, filter);
|
|
452
454
|
const jobs = await this.jobsStorage.search(query, from, size, sort);
|
|
453
455
|
return makeTable(req, defaults, jobs);
|
|
454
456
|
});
|
|
455
457
|
});
|
|
456
458
|
this.app.get('/txt/ex', (req, res) => {
|
|
457
459
|
const { deleted = 'false' } = req.query;
|
|
458
|
-
const { size, from, sort } = getSearchOptions(req);
|
|
460
|
+
const { size, from, sort, filter } = getSearchOptions(req);
|
|
459
461
|
const defaults = ['name', 'lifecycle', 'slicers', 'workers', '_status', 'ex_id', 'job_id', '_created', '_updated'];
|
|
460
462
|
const requestHandler = handleTerasliceRequest(req, res, 'Could not get all executions');
|
|
461
463
|
requestHandler(async () => {
|
|
@@ -463,8 +465,9 @@ export class ApiService {
|
|
|
463
465
|
if (deleted !== 'false') {
|
|
464
466
|
defaults.push('_deleted_on');
|
|
465
467
|
}
|
|
466
|
-
|
|
467
|
-
|
|
468
|
+
let partialQuery = 'ex_id:*';
|
|
469
|
+
partialQuery = addDeletedToQuery(deleted, partialQuery);
|
|
470
|
+
const query = addFilterToQuery(partialQuery, filter);
|
|
468
471
|
const exs = await this.executionStorage.search(query, from, size, sort);
|
|
469
472
|
return makeTable(req, defaults, exs);
|
|
470
473
|
});
|
|
@@ -90,7 +90,8 @@ export function getSearchOptions(req, defaultSort = '_updated:desc') {
|
|
|
90
90
|
const sort = req.query.sort || defaultSort;
|
|
91
91
|
const size = parseQueryInt(req, 'size', 100);
|
|
92
92
|
const from = parseQueryInt(req, 'from', 0);
|
|
93
|
-
|
|
93
|
+
const filter = req.query.filter || '';
|
|
94
|
+
return { size, from, sort, filter };
|
|
94
95
|
}
|
|
95
96
|
export function logTerasliceRequest(req) {
|
|
96
97
|
const queryInfo = Object.entries(req.query)
|
|
@@ -114,4 +115,14 @@ export function addDeletedToQuery(deleted, query) {
|
|
|
114
115
|
}
|
|
115
116
|
return `${query} AND _deleted:true`;
|
|
116
117
|
}
|
|
118
|
+
/**
|
|
119
|
+
* Combines a base query from an endpoint with an optional filter using AND from lucene.
|
|
120
|
+
* @param query - The base Lucene query string
|
|
121
|
+
* @param filter - Optional filter query to append. getSearchOptions() will return an empty string
|
|
122
|
+
* if no filter is present.
|
|
123
|
+
* @returns The combined query, or original query if filter is empty
|
|
124
|
+
*/
|
|
125
|
+
export function addFilterToQuery(query, filter) {
|
|
126
|
+
return filter ? `(${query}) AND (${filter})` : query;
|
|
127
|
+
}
|
|
117
128
|
//# sourceMappingURL=api_utils.js.map
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "teraslice",
|
|
3
3
|
"displayName": "Teraslice",
|
|
4
|
-
"version": "3.
|
|
4
|
+
"version": "3.1.0",
|
|
5
5
|
"description": "Distributed computing platform for processing JSON data",
|
|
6
6
|
"homepage": "https://github.com/terascope/teraslice#readme",
|
|
7
7
|
"bugs": {
|
|
@@ -62,7 +62,8 @@
|
|
|
62
62
|
"semver": "~7.7.2",
|
|
63
63
|
"socket.io": "~4.8.1",
|
|
64
64
|
"socket.io-client": "~4.8.1",
|
|
65
|
-
"terafoundation": "~2.0.
|
|
65
|
+
"terafoundation": "~2.0.1",
|
|
66
|
+
"terafoundation_kafka_connector": "~2.0.0",
|
|
66
67
|
"uuid": "~13.0.0"
|
|
67
68
|
},
|
|
68
69
|
"devDependencies": {
|