teraslice 3.3.0 → 3.3.2
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.
- package/LICENSE +202 -0
- package/package.json +25 -28
- package/dist/src/interfaces.js +0 -12
- package/dist/src/lib/cluster/cluster_master.js +0 -246
- package/dist/src/lib/cluster/node_master.js +0 -355
- package/dist/src/lib/cluster/services/api.js +0 -663
- package/dist/src/lib/cluster/services/assets.js +0 -224
- package/dist/src/lib/cluster/services/cluster/backends/kubernetesV2/index.js +0 -192
- package/dist/src/lib/cluster/services/cluster/backends/kubernetesV2/interfaces.js +0 -2
- package/dist/src/lib/cluster/services/cluster/backends/kubernetesV2/k8s.js +0 -419
- package/dist/src/lib/cluster/services/cluster/backends/kubernetesV2/k8sDeploymentResource.js +0 -60
- package/dist/src/lib/cluster/services/cluster/backends/kubernetesV2/k8sJobResource.js +0 -55
- package/dist/src/lib/cluster/services/cluster/backends/kubernetesV2/k8sResource.js +0 -357
- package/dist/src/lib/cluster/services/cluster/backends/kubernetesV2/k8sServiceResource.js +0 -37
- package/dist/src/lib/cluster/services/cluster/backends/kubernetesV2/k8sState.js +0 -60
- package/dist/src/lib/cluster/services/cluster/backends/kubernetesV2/utils.js +0 -170
- package/dist/src/lib/cluster/services/cluster/backends/native/dispatch.js +0 -13
- package/dist/src/lib/cluster/services/cluster/backends/native/index.js +0 -526
- package/dist/src/lib/cluster/services/cluster/backends/native/messaging.js +0 -548
- package/dist/src/lib/cluster/services/cluster/backends/state-utils.js +0 -26
- package/dist/src/lib/cluster/services/cluster/index.js +0 -13
- package/dist/src/lib/cluster/services/execution.js +0 -435
- package/dist/src/lib/cluster/services/index.js +0 -6
- package/dist/src/lib/cluster/services/interfaces.js +0 -2
- package/dist/src/lib/cluster/services/jobs.js +0 -458
- package/dist/src/lib/config/default-sysconfig.js +0 -25
- package/dist/src/lib/config/index.js +0 -20
- package/dist/src/lib/config/schemas/system.js +0 -360
- package/dist/src/lib/storage/analytics.js +0 -86
- package/dist/src/lib/storage/assets.js +0 -401
- package/dist/src/lib/storage/backends/elasticsearch_store.js +0 -496
- package/dist/src/lib/storage/backends/mappings/analytics.js +0 -20
- package/dist/src/lib/storage/backends/mappings/asset.js +0 -32
- package/dist/src/lib/storage/backends/mappings/ex.js +0 -53
- package/dist/src/lib/storage/backends/mappings/job.js +0 -42
- package/dist/src/lib/storage/backends/mappings/state.js +0 -16
- package/dist/src/lib/storage/backends/s3_store.js +0 -237
- package/dist/src/lib/storage/execution.js +0 -302
- package/dist/src/lib/storage/index.js +0 -7
- package/dist/src/lib/storage/jobs.js +0 -81
- package/dist/src/lib/storage/state.js +0 -254
- package/dist/src/lib/utils/api_utils.js +0 -128
- package/dist/src/lib/utils/asset_utils.js +0 -94
- package/dist/src/lib/utils/date_utils.js +0 -52
- package/dist/src/lib/utils/encoding_utils.js +0 -27
- package/dist/src/lib/utils/events.js +0 -4
- package/dist/src/lib/utils/file_utils.js +0 -124
- package/dist/src/lib/utils/id_utils.js +0 -15
- package/dist/src/lib/utils/port_utils.js +0 -32
- package/dist/src/lib/workers/assets/index.js +0 -3
- package/dist/src/lib/workers/assets/loader-executable.js +0 -40
- package/dist/src/lib/workers/assets/loader.js +0 -73
- package/dist/src/lib/workers/assets/spawn.js +0 -55
- package/dist/src/lib/workers/context/execution-context.js +0 -12
- package/dist/src/lib/workers/context/terafoundation-context.js +0 -8
- package/dist/src/lib/workers/execution-controller/execution-analytics.js +0 -188
- package/dist/src/lib/workers/execution-controller/index.js +0 -1024
- package/dist/src/lib/workers/execution-controller/recovery.js +0 -151
- package/dist/src/lib/workers/execution-controller/scheduler.js +0 -390
- package/dist/src/lib/workers/execution-controller/slice-analytics.js +0 -96
- package/dist/src/lib/workers/helpers/job.js +0 -80
- package/dist/src/lib/workers/helpers/op-analytics.js +0 -22
- package/dist/src/lib/workers/helpers/terafoundation.js +0 -34
- package/dist/src/lib/workers/helpers/worker-shutdown.js +0 -147
- package/dist/src/lib/workers/metrics/index.js +0 -108
- package/dist/src/lib/workers/worker/index.js +0 -378
- package/dist/src/lib/workers/worker/slice.js +0 -122
- package/dist/test/config/schemas/system_schema-spec.js +0 -26
- package/dist/test/lib/cluster/services/cluster/backends/kubernetes/v2/k8s-v2-spec.js +0 -458
- package/dist/test/lib/cluster/services/cluster/backends/kubernetes/v2/k8sResource-v2-spec.js +0 -818
- package/dist/test/lib/cluster/services/cluster/backends/kubernetes/v2/k8sState-multicluster-v2-spec.js +0 -67
- package/dist/test/lib/cluster/services/cluster/backends/kubernetes/v2/k8sState-v2-spec.js +0 -84
- package/dist/test/lib/cluster/services/cluster/backends/kubernetes/v2/utils-v2-spec.js +0 -320
- package/dist/test/lib/cluster/services/cluster/backends/state-utils-spec.js +0 -37
- package/dist/test/node_master-spec.js +0 -194
- package/dist/test/services/api-spec.js +0 -79
- package/dist/test/services/assets-spec.js +0 -158
- package/dist/test/services/messaging-spec.js +0 -440
- package/dist/test/storage/assets_storage-spec.js +0 -95
- package/dist/test/storage/s3_store-spec.js +0 -149
- package/dist/test/test.config.js +0 -23
- package/dist/test/test.setup.js +0 -6
- package/dist/test/utils/api_utils-spec.js +0 -25
- package/dist/test/utils/asset_utils-spec.js +0 -141
- package/dist/test/utils/elastic_utils-spec.js +0 -25
- package/dist/test/workers/execution-controller/execution-controller-spec.js +0 -371
- package/dist/test/workers/execution-controller/execution-special-test-cases-spec.js +0 -519
- package/dist/test/workers/execution-controller/execution-test-cases-spec.js +0 -343
- package/dist/test/workers/execution-controller/recovery-spec.js +0 -160
- package/dist/test/workers/execution-controller/scheduler-spec.js +0 -249
- package/dist/test/workers/execution-controller/slice-analytics-spec.js +0 -121
- package/dist/test/workers/fixtures/ops/example-op/processor.js +0 -20
- package/dist/test/workers/fixtures/ops/example-op/schema.js +0 -19
- package/dist/test/workers/fixtures/ops/example-reader/fetcher.js +0 -20
- package/dist/test/workers/fixtures/ops/example-reader/schema.js +0 -41
- package/dist/test/workers/fixtures/ops/example-reader/slicer.js +0 -37
- package/dist/test/workers/fixtures/ops/new-op/processor.js +0 -29
- package/dist/test/workers/fixtures/ops/new-op/schema.js +0 -18
- package/dist/test/workers/fixtures/ops/new-reader/fetcher.js +0 -19
- package/dist/test/workers/fixtures/ops/new-reader/schema.js +0 -23
- package/dist/test/workers/fixtures/ops/new-reader/slicer.js +0 -13
- package/dist/test/workers/helpers/configs.js +0 -128
- package/dist/test/workers/helpers/execution-controller-helper.js +0 -49
- package/dist/test/workers/helpers/index.js +0 -5
- package/dist/test/workers/helpers/test-context.js +0 -210
- package/dist/test/workers/helpers/zip-directory.js +0 -25
- package/dist/test/workers/worker/slice-spec.js +0 -333
- package/dist/test/workers/worker/worker-spec.js +0 -356
|
@@ -1,249 +0,0 @@
|
|
|
1
|
-
import { jest } from '@jest/globals';
|
|
2
|
-
import { v4 as uuidv4 } from 'uuid';
|
|
3
|
-
import { pDelay, once, times } from '@terascope/core-utils';
|
|
4
|
-
import { TestContext } from '../helpers/test-context.js';
|
|
5
|
-
import { Scheduler } from '../../../src/lib/workers/execution-controller/scheduler.js';
|
|
6
|
-
describe('Scheduler', () => {
|
|
7
|
-
const slicers = 3;
|
|
8
|
-
const countPerSlicer = 200;
|
|
9
|
-
let expectedCount;
|
|
10
|
-
let testContext;
|
|
11
|
-
let scheduler;
|
|
12
|
-
let stateStorage;
|
|
13
|
-
let executionStorage;
|
|
14
|
-
function getSlices() {
|
|
15
|
-
const slices = [];
|
|
16
|
-
return new Promise((resolve) => {
|
|
17
|
-
const intervalId = setInterval(() => {
|
|
18
|
-
if (scheduler.isFinished) {
|
|
19
|
-
clearInterval(intervalId);
|
|
20
|
-
resolve(slices);
|
|
21
|
-
}
|
|
22
|
-
else {
|
|
23
|
-
const result = scheduler.getSlices(100);
|
|
24
|
-
if (result.length > 0) {
|
|
25
|
-
slices.push(...result);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
}, 1);
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
beforeEach(async () => {
|
|
32
|
-
expectedCount = slicers * countPerSlicer;
|
|
33
|
-
testContext = new TestContext({
|
|
34
|
-
assignment: 'execution_controller',
|
|
35
|
-
slicers,
|
|
36
|
-
newOps: true,
|
|
37
|
-
countPerSlicer
|
|
38
|
-
});
|
|
39
|
-
await testContext.initialize();
|
|
40
|
-
scheduler = new Scheduler(testContext.context, testContext.executionContext);
|
|
41
|
-
stateStorage = {
|
|
42
|
-
async getStartingPoints(exId, numSlicers) {
|
|
43
|
-
if (numSlicers !== slicers) {
|
|
44
|
-
throw new Error(`Got invalid slicer ids, ${numSlicers.join(' ')}`);
|
|
45
|
-
}
|
|
46
|
-
},
|
|
47
|
-
createState: () => pDelay(0),
|
|
48
|
-
createSlices: async (exId, slices) => {
|
|
49
|
-
if (!exId || typeof exId !== 'string' || exId !== testContext.exId) {
|
|
50
|
-
throw new Error(`Got invalid ex_id ${exId}`);
|
|
51
|
-
}
|
|
52
|
-
await pDelay(0);
|
|
53
|
-
return slices.length;
|
|
54
|
-
}
|
|
55
|
-
};
|
|
56
|
-
executionStorage = {
|
|
57
|
-
async get() {
|
|
58
|
-
return { slicers };
|
|
59
|
-
},
|
|
60
|
-
setStatus: jest.fn(() => pDelay(0)),
|
|
61
|
-
};
|
|
62
|
-
testContext.attachCleanup(() => scheduler.shutdown());
|
|
63
|
-
});
|
|
64
|
-
afterEach(() => testContext.cleanup());
|
|
65
|
-
describe('when testing a normal execution', () => {
|
|
66
|
-
beforeEach(() => scheduler.initialize(stateStorage, executionStorage));
|
|
67
|
-
it('should be constructed wih the correct values', async () => {
|
|
68
|
-
expect(scheduler.slicersDone).toBeFalse();
|
|
69
|
-
expect(scheduler.ready).toBeFalse();
|
|
70
|
-
expect(scheduler.paused).toBeTrue();
|
|
71
|
-
expect(scheduler.stopped).toBeFalse();
|
|
72
|
-
expect(scheduler.queueLength).toEqual(0);
|
|
73
|
-
expect(scheduler.isFinished).toBeFalse();
|
|
74
|
-
});
|
|
75
|
-
it('should be able to reenqueue a slice', () => {
|
|
76
|
-
scheduler.enqueueSlices([
|
|
77
|
-
{
|
|
78
|
-
slice_id: 1
|
|
79
|
-
},
|
|
80
|
-
{
|
|
81
|
-
slice_id: 2
|
|
82
|
-
}
|
|
83
|
-
]);
|
|
84
|
-
scheduler.enqueueSlice({ slice_id: 1 });
|
|
85
|
-
scheduler.enqueueSlice({
|
|
86
|
-
slice_id: 3
|
|
87
|
-
}, true);
|
|
88
|
-
const slices = scheduler.getSlices(100);
|
|
89
|
-
expect(slices).toEqual([
|
|
90
|
-
{
|
|
91
|
-
slice_id: 3
|
|
92
|
-
},
|
|
93
|
-
{
|
|
94
|
-
slice_id: 1
|
|
95
|
-
},
|
|
96
|
-
{
|
|
97
|
-
slice_id: 2
|
|
98
|
-
}
|
|
99
|
-
]);
|
|
100
|
-
});
|
|
101
|
-
it(`should be able to schedule ${expectedCount} slices`, async () => {
|
|
102
|
-
let slices = [];
|
|
103
|
-
await Promise.all([
|
|
104
|
-
scheduler.run(),
|
|
105
|
-
getSlices().then((_slices) => {
|
|
106
|
-
slices = _slices;
|
|
107
|
-
})
|
|
108
|
-
]);
|
|
109
|
-
expect(scheduler.paused).toBeFalse();
|
|
110
|
-
expect(scheduler.slicersDone).toBeTrue();
|
|
111
|
-
expect(scheduler.queueLength).toEqual(0);
|
|
112
|
-
expect(slices).toHaveLength(expectedCount);
|
|
113
|
-
expect(scheduler.isFinished).toBeTrue();
|
|
114
|
-
});
|
|
115
|
-
it('should handle pause and resume correctly', async () => {
|
|
116
|
-
let slices = [];
|
|
117
|
-
const pause = once(() => {
|
|
118
|
-
scheduler.pause();
|
|
119
|
-
setTimeout(() => scheduler.start(), 10);
|
|
120
|
-
});
|
|
121
|
-
scheduler.events.on('slicer:done', pause);
|
|
122
|
-
await Promise.all([
|
|
123
|
-
scheduler.run(),
|
|
124
|
-
getSlices().then((_slices) => {
|
|
125
|
-
slices = _slices;
|
|
126
|
-
})
|
|
127
|
-
]);
|
|
128
|
-
expect(slices).toHaveLength(expectedCount);
|
|
129
|
-
expect(scheduler.isFinished).toBeTrue();
|
|
130
|
-
expect(scheduler.slicersDone).toBeTrue();
|
|
131
|
-
});
|
|
132
|
-
it('should handle stop correctly', async () => {
|
|
133
|
-
let slices = [];
|
|
134
|
-
scheduler.events.once('slicer:done', () => scheduler.stop());
|
|
135
|
-
await Promise.all([
|
|
136
|
-
scheduler.run(),
|
|
137
|
-
getSlices().then((_slices) => {
|
|
138
|
-
slices = _slices;
|
|
139
|
-
})
|
|
140
|
-
]);
|
|
141
|
-
// be more flexible
|
|
142
|
-
const min = expectedCount - slicers * 8;
|
|
143
|
-
const max = expectedCount + slicers * 8;
|
|
144
|
-
expect(slices.length).toBeWithin(min, max);
|
|
145
|
-
expect(scheduler.isFinished).toBeTrue();
|
|
146
|
-
expect(scheduler.stopped).toBeTrue();
|
|
147
|
-
expect(scheduler.slicersDone).toBeFalse();
|
|
148
|
-
});
|
|
149
|
-
});
|
|
150
|
-
describe('when testing recovery', () => {
|
|
151
|
-
let recoveryRecords;
|
|
152
|
-
let emitDone;
|
|
153
|
-
let exitAfterComplete = false;
|
|
154
|
-
beforeEach(() => {
|
|
155
|
-
emitDone = once(() => {
|
|
156
|
-
scheduler.events.emit('execution:recovery:complete', []);
|
|
157
|
-
});
|
|
158
|
-
// @ts-expect-error
|
|
159
|
-
scheduler.recoverExecution = true;
|
|
160
|
-
scheduler.recovering = true;
|
|
161
|
-
// @ts-expect-error
|
|
162
|
-
scheduler.recover = {
|
|
163
|
-
initialize() {
|
|
164
|
-
return Promise.resolve();
|
|
165
|
-
},
|
|
166
|
-
shutdown() {
|
|
167
|
-
return Promise.resolve();
|
|
168
|
-
},
|
|
169
|
-
// @ts-expect-error
|
|
170
|
-
handle() {
|
|
171
|
-
return recoveryRecords.length === 0;
|
|
172
|
-
},
|
|
173
|
-
getSlices(max = 1) {
|
|
174
|
-
const result = recoveryRecords.splice(0, max);
|
|
175
|
-
if (!recoveryRecords.length) {
|
|
176
|
-
emitDone();
|
|
177
|
-
}
|
|
178
|
-
return result;
|
|
179
|
-
},
|
|
180
|
-
recoveryComplete() {
|
|
181
|
-
if (!recoveryRecords.length) {
|
|
182
|
-
emitDone();
|
|
183
|
-
return true;
|
|
184
|
-
}
|
|
185
|
-
return false;
|
|
186
|
-
},
|
|
187
|
-
sliceCount() {
|
|
188
|
-
return 10;
|
|
189
|
-
},
|
|
190
|
-
exitAfterComplete() {
|
|
191
|
-
return exitAfterComplete;
|
|
192
|
-
}
|
|
193
|
-
};
|
|
194
|
-
return scheduler.initialize(stateStorage, executionStorage);
|
|
195
|
-
});
|
|
196
|
-
it('should handle recovery correctly and exit', async () => {
|
|
197
|
-
recoveryRecords = times(countPerSlicer * slicers, () => ({
|
|
198
|
-
slice_id: uuidv4(),
|
|
199
|
-
slicer_id: 1,
|
|
200
|
-
slicer_order: 0,
|
|
201
|
-
request: {
|
|
202
|
-
id: `recover-${Math.random()}`
|
|
203
|
-
},
|
|
204
|
-
_created: new Date().toISOString()
|
|
205
|
-
}));
|
|
206
|
-
let slices = [];
|
|
207
|
-
expectedCount += recoveryRecords.length;
|
|
208
|
-
await Promise.all([
|
|
209
|
-
scheduler.run(),
|
|
210
|
-
getSlices().then((_slices) => {
|
|
211
|
-
slices = _slices;
|
|
212
|
-
})
|
|
213
|
-
]);
|
|
214
|
-
expect(slices).toHaveLength(expectedCount);
|
|
215
|
-
expect(scheduler.ready).toBeTrue();
|
|
216
|
-
expect(scheduler.isFinished).toBeTrue();
|
|
217
|
-
expect(scheduler.stopped).toBeFalse();
|
|
218
|
-
expect(scheduler.recovering).toBeFalse();
|
|
219
|
-
expect(scheduler.slicersDone).toBeTrue();
|
|
220
|
-
});
|
|
221
|
-
it('should handle recovery with cleanup type correctly and not exit', async () => {
|
|
222
|
-
exitAfterComplete = true;
|
|
223
|
-
recoveryRecords = times(countPerSlicer, () => ({
|
|
224
|
-
slice_id: uuidv4(),
|
|
225
|
-
slicer_id: 1,
|
|
226
|
-
slicer_order: 0,
|
|
227
|
-
request: {
|
|
228
|
-
id: `recover-${Math.random()}`
|
|
229
|
-
},
|
|
230
|
-
_created: new Date().toISOString()
|
|
231
|
-
}));
|
|
232
|
-
let slices = [];
|
|
233
|
-
expectedCount = recoveryRecords.length;
|
|
234
|
-
await Promise.all([
|
|
235
|
-
scheduler.run(),
|
|
236
|
-
getSlices().then((_slices) => {
|
|
237
|
-
slices = _slices;
|
|
238
|
-
})
|
|
239
|
-
]);
|
|
240
|
-
expect(slices).toHaveLength(expectedCount);
|
|
241
|
-
expect(scheduler.ready).toBeFalse();
|
|
242
|
-
expect(scheduler.isFinished).toBeTrue();
|
|
243
|
-
expect(scheduler.stopped).toBeFalse();
|
|
244
|
-
expect(scheduler.recovering).toBeFalse();
|
|
245
|
-
expect(scheduler.slicersDone).toBeTrue();
|
|
246
|
-
});
|
|
247
|
-
});
|
|
248
|
-
});
|
|
249
|
-
//# sourceMappingURL=scheduler-spec.js.map
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
import events from 'node:events';
|
|
2
|
-
import { SliceAnalytics } from '../../../src/lib/workers/execution-controller/slice-analytics.js';
|
|
3
|
-
const eventEmitter = new events.EventEmitter();
|
|
4
|
-
describe('slice_analytics', () => {
|
|
5
|
-
const logMessages = [];
|
|
6
|
-
const logger = {
|
|
7
|
-
error() { },
|
|
8
|
-
info(msg) {
|
|
9
|
-
logMessages.push(msg);
|
|
10
|
-
},
|
|
11
|
-
warn() { },
|
|
12
|
-
trace() { },
|
|
13
|
-
debug() { }
|
|
14
|
-
};
|
|
15
|
-
const context = {
|
|
16
|
-
apis: {
|
|
17
|
-
foundation: {
|
|
18
|
-
makeLogger: () => logger,
|
|
19
|
-
getSystemEvents: () => eventEmitter
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
};
|
|
23
|
-
const executionContext = {
|
|
24
|
-
config: {
|
|
25
|
-
slicers: 2,
|
|
26
|
-
operations: [{ _op: 'config1' }, { _op: 'config2' }, { _op: 'config3' }]
|
|
27
|
-
},
|
|
28
|
-
ex_id: '1234',
|
|
29
|
-
job_id: '5678'
|
|
30
|
-
};
|
|
31
|
-
const analytics = new SliceAnalytics(context, executionContext);
|
|
32
|
-
it('addStats transfers message stats to the statsContainer', () => {
|
|
33
|
-
const statsObj = analytics.getStats();
|
|
34
|
-
const data = { time: [234, 125, 1300], size: [2300, 4600], memory: [1234, 4567] };
|
|
35
|
-
const data2 = { time: [346, 325, 1102], size: [1120, 2240], memory: [12345, 56789] };
|
|
36
|
-
expect(statsObj.size[0]).toMatchObject({
|
|
37
|
-
min: 0,
|
|
38
|
-
max: 0,
|
|
39
|
-
sum: 0,
|
|
40
|
-
total: 0,
|
|
41
|
-
average: 0,
|
|
42
|
-
});
|
|
43
|
-
expect(statsObj.time[0]).toMatchObject({
|
|
44
|
-
min: 0,
|
|
45
|
-
max: 0,
|
|
46
|
-
sum: 0,
|
|
47
|
-
total: 0,
|
|
48
|
-
average: 0,
|
|
49
|
-
});
|
|
50
|
-
expect(statsObj.memory[0]).toMatchObject({
|
|
51
|
-
min: 0,
|
|
52
|
-
max: 0,
|
|
53
|
-
sum: 0,
|
|
54
|
-
total: 0,
|
|
55
|
-
average: 0,
|
|
56
|
-
});
|
|
57
|
-
analytics.addStats(data);
|
|
58
|
-
expect(statsObj.size[0]).toMatchObject({
|
|
59
|
-
min: 2300,
|
|
60
|
-
max: 2300,
|
|
61
|
-
sum: 2300,
|
|
62
|
-
total: 1,
|
|
63
|
-
average: 2300,
|
|
64
|
-
});
|
|
65
|
-
expect(statsObj.time[0]).toMatchObject({
|
|
66
|
-
min: 234,
|
|
67
|
-
max: 234,
|
|
68
|
-
sum: 234,
|
|
69
|
-
total: 1,
|
|
70
|
-
average: 234,
|
|
71
|
-
});
|
|
72
|
-
expect(statsObj.memory[0]).toMatchObject({
|
|
73
|
-
min: 1234,
|
|
74
|
-
max: 1234,
|
|
75
|
-
sum: 1234,
|
|
76
|
-
total: 1,
|
|
77
|
-
average: 1234,
|
|
78
|
-
});
|
|
79
|
-
analytics.addStats(data2);
|
|
80
|
-
expect(statsObj.size[0]).toMatchObject({
|
|
81
|
-
min: 1120,
|
|
82
|
-
max: 2300,
|
|
83
|
-
sum: 3420,
|
|
84
|
-
total: 2,
|
|
85
|
-
average: 1710,
|
|
86
|
-
});
|
|
87
|
-
expect(statsObj.time[0]).toMatchObject({
|
|
88
|
-
min: 234,
|
|
89
|
-
max: 346,
|
|
90
|
-
sum: 580,
|
|
91
|
-
total: 2,
|
|
92
|
-
average: 290,
|
|
93
|
-
});
|
|
94
|
-
expect(statsObj.memory[0]).toMatchObject({
|
|
95
|
-
min: 1234,
|
|
96
|
-
max: 12345,
|
|
97
|
-
sum: 13579,
|
|
98
|
-
total: 2,
|
|
99
|
-
average: 6789.5,
|
|
100
|
-
});
|
|
101
|
-
});
|
|
102
|
-
it('statsContainer takes in job.operations and returns an object for the number of ops', () => {
|
|
103
|
-
const results = analytics.getStats();
|
|
104
|
-
expect(results).toBeDefined();
|
|
105
|
-
expect(results.time).toBeDefined();
|
|
106
|
-
expect(results.size).toBeDefined();
|
|
107
|
-
expect(Array.isArray(results.time)).toBe(true);
|
|
108
|
-
expect(Array.isArray(results.size)).toBe(true);
|
|
109
|
-
expect(results.time.length).toEqual(3);
|
|
110
|
-
expect(results.size.length).toEqual(3);
|
|
111
|
-
expect(results.memory.length).toEqual(3);
|
|
112
|
-
});
|
|
113
|
-
it('analyzeStats will log results', () => {
|
|
114
|
-
analytics.analyzeStats();
|
|
115
|
-
expect(logMessages.shift()).toEqual('calculating statistics');
|
|
116
|
-
expect(logMessages.shift()).toContain('operation config1');
|
|
117
|
-
expect(logMessages.shift()).toContain('operation config2');
|
|
118
|
-
expect(logMessages.shift()).toContain('operation config3');
|
|
119
|
-
});
|
|
120
|
-
});
|
|
121
|
-
//# sourceMappingURL=slice-analytics-spec.js.map
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { BatchProcessor } from '@terascope/job-components';
|
|
2
|
-
const defaultResults = Array.from(Array(10)).map(() => ({ hi: true }));
|
|
3
|
-
export default class ExampleBatch extends BatchProcessor {
|
|
4
|
-
async onBatch(_batch) {
|
|
5
|
-
const errorAt = this.opConfig.errorAt ?? [];
|
|
6
|
-
// @ts-expect-error
|
|
7
|
-
if (this.context._opCalls == null) {
|
|
8
|
-
// @ts-expect-error
|
|
9
|
-
this.context._opCalls = -1;
|
|
10
|
-
}
|
|
11
|
-
// @ts-expect-error
|
|
12
|
-
this.context._opCalls += 1;
|
|
13
|
-
// @ts-expect-error
|
|
14
|
-
if (errorAt.includes(this.context._opCalls)) {
|
|
15
|
-
return Promise.reject(new Error('Bad news bears'));
|
|
16
|
-
}
|
|
17
|
-
return this.opConfig.results ?? defaultResults;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
//# sourceMappingURL=processor.js.map
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { BaseSchema } from '@terascope/job-components';
|
|
2
|
-
const defaultResults = Array.from(Array(10)).map(() => ({ hi: true }));
|
|
3
|
-
export default class Schema extends BaseSchema {
|
|
4
|
-
build() {
|
|
5
|
-
return {
|
|
6
|
-
errorAt: {
|
|
7
|
-
doc: 'An array of indexes to error at',
|
|
8
|
-
default: [],
|
|
9
|
-
format: 'Array'
|
|
10
|
-
},
|
|
11
|
-
results: {
|
|
12
|
-
doc: 'Op results to return',
|
|
13
|
-
default: defaultResults,
|
|
14
|
-
format: 'Array'
|
|
15
|
-
},
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
//# sourceMappingURL=schema.js.map
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { Fetcher } from '@terascope/job-components';
|
|
2
|
-
const defaultResults = Array.from(Array(10)).map(() => ({ hi: true }));
|
|
3
|
-
export default class ExampleBatch extends Fetcher {
|
|
4
|
-
async fetch() {
|
|
5
|
-
const errorAt = this.opConfig.errorAt ?? [];
|
|
6
|
-
// @ts-expect-error
|
|
7
|
-
if (this.context._readerCalls == null) {
|
|
8
|
-
// @ts-expect-error
|
|
9
|
-
this.context._readerCalls = -1;
|
|
10
|
-
}
|
|
11
|
-
// @ts-expect-error
|
|
12
|
-
this.context._readerCalls += 1;
|
|
13
|
-
// @ts-expect-error
|
|
14
|
-
if (errorAt.includes(this.context._readerCalls)) {
|
|
15
|
-
return Promise.reject(new Error('Bad news bears'));
|
|
16
|
-
}
|
|
17
|
-
return this.opConfig.results ?? defaultResults;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
//# sourceMappingURL=fetcher.js.map
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { BaseSchema } from '@terascope/job-components';
|
|
2
|
-
const defaultResults = Array.from(Array(10)).map(() => ({ hi: true }));
|
|
3
|
-
const defaultSlicerResults = [{ howdy: true }, null];
|
|
4
|
-
const defaultSlicerQueueLength = '10';
|
|
5
|
-
export default class Schema extends BaseSchema {
|
|
6
|
-
build() {
|
|
7
|
-
return {
|
|
8
|
-
errorAt: {
|
|
9
|
-
doc: 'An array of indexes to error at',
|
|
10
|
-
default: [],
|
|
11
|
-
format: 'Array'
|
|
12
|
-
},
|
|
13
|
-
results: {
|
|
14
|
-
doc: 'Reader results to return',
|
|
15
|
-
default: defaultResults,
|
|
16
|
-
format: 'Array'
|
|
17
|
-
},
|
|
18
|
-
slicerQueueLength: {
|
|
19
|
-
doc: 'A string for the slicer queue length, anything but QUEUE_MINIMUM_SIZE will be converted to a number',
|
|
20
|
-
default: defaultSlicerQueueLength,
|
|
21
|
-
format: 'String'
|
|
22
|
-
},
|
|
23
|
-
slicerErrorAt: {
|
|
24
|
-
doc: 'An array of indexes to error at when newSlicer is invoked',
|
|
25
|
-
default: [],
|
|
26
|
-
format: 'Array'
|
|
27
|
-
},
|
|
28
|
-
slicerResults: {
|
|
29
|
-
doc: 'Slicer results to return',
|
|
30
|
-
default: defaultSlicerResults,
|
|
31
|
-
format: 'Array'
|
|
32
|
-
},
|
|
33
|
-
updateMetadata: {
|
|
34
|
-
doc: 'Update the metadata on the slicer execution',
|
|
35
|
-
default: false,
|
|
36
|
-
format: Boolean
|
|
37
|
-
}
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
//# sourceMappingURL=schema.js.map
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { ParallelSlicer } from '@terascope/job-components';
|
|
2
|
-
import { get } from '@terascope/core-utils';
|
|
3
|
-
const defaultSlicerResults = [{ howdy: true }, null];
|
|
4
|
-
export default class ExampleSlicer extends ParallelSlicer {
|
|
5
|
-
async newSlicer(_id) {
|
|
6
|
-
const slicerResults = get(this.opConfig, 'slicerResults', defaultSlicerResults);
|
|
7
|
-
const errorAt = get(this.opConfig, 'slicerErrorAt', []);
|
|
8
|
-
const updateMetadata = get(this.opConfig, 'updateMetadata', false);
|
|
9
|
-
// @ts-expect-error
|
|
10
|
-
if (!this.context._slicerCalls) {
|
|
11
|
-
// @ts-expect-error
|
|
12
|
-
this.context._slicerCalls = -1;
|
|
13
|
-
}
|
|
14
|
-
let sliceCalls = 0;
|
|
15
|
-
return async () => {
|
|
16
|
-
// @ts-expect-error
|
|
17
|
-
this.context._slicerCalls += 1;
|
|
18
|
-
// @ts-expect-error
|
|
19
|
-
if (errorAt.includes(this.context._slicerCalls)) {
|
|
20
|
-
return Promise.reject(new Error('Bad news bears'));
|
|
21
|
-
}
|
|
22
|
-
const result = slicerResults.shift();
|
|
23
|
-
sliceCalls++;
|
|
24
|
-
if (updateMetadata) {
|
|
25
|
-
await this.context.apis.executionContext.setMetadata('slice_calls', sliceCalls);
|
|
26
|
-
}
|
|
27
|
-
if (result && result.error) {
|
|
28
|
-
throw new Error(result.error);
|
|
29
|
-
}
|
|
30
|
-
return result;
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
isRecoverable() {
|
|
34
|
-
return true;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
//# sourceMappingURL=slicer.js.map
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { BatchProcessor } from '@terascope/job-components';
|
|
2
|
-
export default class ExampleBatch extends BatchProcessor {
|
|
3
|
-
initialized;
|
|
4
|
-
shutdownCalled;
|
|
5
|
-
async initialize() {
|
|
6
|
-
this.initialized = true;
|
|
7
|
-
this.logger.debug('example map initalized', this.opConfig);
|
|
8
|
-
return super.initialize();
|
|
9
|
-
}
|
|
10
|
-
async shutdown() {
|
|
11
|
-
this.shutdownCalled = true;
|
|
12
|
-
return super.shutdown();
|
|
13
|
-
}
|
|
14
|
-
async onBatch(batch) {
|
|
15
|
-
if (this.opConfig.failOnSliceRetry) {
|
|
16
|
-
throw new Error('Fail slices');
|
|
17
|
-
}
|
|
18
|
-
return batch.map((data) => {
|
|
19
|
-
data.touchedAt = new Date().toISOString();
|
|
20
|
-
return data;
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
onSliceRetry() {
|
|
24
|
-
if (this.opConfig.failOnSliceRetry) {
|
|
25
|
-
throw new Error('I will not allow it');
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
//# sourceMappingURL=processor.js.map
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { BaseSchema } from '@terascope/job-components';
|
|
2
|
-
export default class Schema extends BaseSchema {
|
|
3
|
-
build() {
|
|
4
|
-
return {
|
|
5
|
-
example: {
|
|
6
|
-
default: 'examples are quick and easy',
|
|
7
|
-
doc: 'A random example schema property',
|
|
8
|
-
format: 'String',
|
|
9
|
-
},
|
|
10
|
-
failOnSliceRetry: {
|
|
11
|
-
default: false,
|
|
12
|
-
doc: 'fail on slice retry',
|
|
13
|
-
format: Boolean,
|
|
14
|
-
}
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
//# sourceMappingURL=schema.js.map
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { Fetcher } from '@terascope/job-components';
|
|
2
|
-
export default class ExampleFetcher extends Fetcher {
|
|
3
|
-
async fetch() {
|
|
4
|
-
const { countPerFetch } = this.opConfig;
|
|
5
|
-
const result = [];
|
|
6
|
-
for (let i = 0; i < countPerFetch; i++) {
|
|
7
|
-
result.push({
|
|
8
|
-
id: i,
|
|
9
|
-
data: [
|
|
10
|
-
Math.random(),
|
|
11
|
-
Math.random(),
|
|
12
|
-
Math.random(),
|
|
13
|
-
]
|
|
14
|
-
});
|
|
15
|
-
}
|
|
16
|
-
return result;
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
//# sourceMappingURL=fetcher.js.map
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { BaseSchema } from '@terascope/job-components';
|
|
2
|
-
export default class Schema extends BaseSchema {
|
|
3
|
-
build() {
|
|
4
|
-
return {
|
|
5
|
-
example: {
|
|
6
|
-
default: 'examples are quick and easy',
|
|
7
|
-
doc: 'A random example schema property',
|
|
8
|
-
format: 'String',
|
|
9
|
-
},
|
|
10
|
-
countPerSlicer: {
|
|
11
|
-
default: 10,
|
|
12
|
-
doc: 'The number of slices for the slicer to create',
|
|
13
|
-
format: 'Number',
|
|
14
|
-
},
|
|
15
|
-
countPerFetch: {
|
|
16
|
-
default: 10,
|
|
17
|
-
doc: 'The number of records to return from the fetcher',
|
|
18
|
-
format: 'Number',
|
|
19
|
-
}
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
//# sourceMappingURL=schema.js.map
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { ParallelSlicer } from '@terascope/job-components';
|
|
2
|
-
import { pDelay, times } from '@terascope/core-utils';
|
|
3
|
-
export default class ExampleSlicer extends ParallelSlicer {
|
|
4
|
-
async newSlicer(id) {
|
|
5
|
-
const { countPerSlicer } = this.opConfig;
|
|
6
|
-
const records = times(countPerSlicer, (i) => ({ id: `slicer-${id}-${i}` }));
|
|
7
|
-
return async () => {
|
|
8
|
-
await pDelay(0);
|
|
9
|
-
return records.shift();
|
|
10
|
-
};
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
//# sourceMappingURL=slicer.js.map
|