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.
Files changed (108) hide show
  1. package/LICENSE +202 -0
  2. package/package.json +25 -28
  3. package/dist/src/interfaces.js +0 -12
  4. package/dist/src/lib/cluster/cluster_master.js +0 -246
  5. package/dist/src/lib/cluster/node_master.js +0 -355
  6. package/dist/src/lib/cluster/services/api.js +0 -663
  7. package/dist/src/lib/cluster/services/assets.js +0 -224
  8. package/dist/src/lib/cluster/services/cluster/backends/kubernetesV2/index.js +0 -192
  9. package/dist/src/lib/cluster/services/cluster/backends/kubernetesV2/interfaces.js +0 -2
  10. package/dist/src/lib/cluster/services/cluster/backends/kubernetesV2/k8s.js +0 -419
  11. package/dist/src/lib/cluster/services/cluster/backends/kubernetesV2/k8sDeploymentResource.js +0 -60
  12. package/dist/src/lib/cluster/services/cluster/backends/kubernetesV2/k8sJobResource.js +0 -55
  13. package/dist/src/lib/cluster/services/cluster/backends/kubernetesV2/k8sResource.js +0 -357
  14. package/dist/src/lib/cluster/services/cluster/backends/kubernetesV2/k8sServiceResource.js +0 -37
  15. package/dist/src/lib/cluster/services/cluster/backends/kubernetesV2/k8sState.js +0 -60
  16. package/dist/src/lib/cluster/services/cluster/backends/kubernetesV2/utils.js +0 -170
  17. package/dist/src/lib/cluster/services/cluster/backends/native/dispatch.js +0 -13
  18. package/dist/src/lib/cluster/services/cluster/backends/native/index.js +0 -526
  19. package/dist/src/lib/cluster/services/cluster/backends/native/messaging.js +0 -548
  20. package/dist/src/lib/cluster/services/cluster/backends/state-utils.js +0 -26
  21. package/dist/src/lib/cluster/services/cluster/index.js +0 -13
  22. package/dist/src/lib/cluster/services/execution.js +0 -435
  23. package/dist/src/lib/cluster/services/index.js +0 -6
  24. package/dist/src/lib/cluster/services/interfaces.js +0 -2
  25. package/dist/src/lib/cluster/services/jobs.js +0 -458
  26. package/dist/src/lib/config/default-sysconfig.js +0 -25
  27. package/dist/src/lib/config/index.js +0 -20
  28. package/dist/src/lib/config/schemas/system.js +0 -360
  29. package/dist/src/lib/storage/analytics.js +0 -86
  30. package/dist/src/lib/storage/assets.js +0 -401
  31. package/dist/src/lib/storage/backends/elasticsearch_store.js +0 -496
  32. package/dist/src/lib/storage/backends/mappings/analytics.js +0 -20
  33. package/dist/src/lib/storage/backends/mappings/asset.js +0 -32
  34. package/dist/src/lib/storage/backends/mappings/ex.js +0 -53
  35. package/dist/src/lib/storage/backends/mappings/job.js +0 -42
  36. package/dist/src/lib/storage/backends/mappings/state.js +0 -16
  37. package/dist/src/lib/storage/backends/s3_store.js +0 -237
  38. package/dist/src/lib/storage/execution.js +0 -302
  39. package/dist/src/lib/storage/index.js +0 -7
  40. package/dist/src/lib/storage/jobs.js +0 -81
  41. package/dist/src/lib/storage/state.js +0 -254
  42. package/dist/src/lib/utils/api_utils.js +0 -128
  43. package/dist/src/lib/utils/asset_utils.js +0 -94
  44. package/dist/src/lib/utils/date_utils.js +0 -52
  45. package/dist/src/lib/utils/encoding_utils.js +0 -27
  46. package/dist/src/lib/utils/events.js +0 -4
  47. package/dist/src/lib/utils/file_utils.js +0 -124
  48. package/dist/src/lib/utils/id_utils.js +0 -15
  49. package/dist/src/lib/utils/port_utils.js +0 -32
  50. package/dist/src/lib/workers/assets/index.js +0 -3
  51. package/dist/src/lib/workers/assets/loader-executable.js +0 -40
  52. package/dist/src/lib/workers/assets/loader.js +0 -73
  53. package/dist/src/lib/workers/assets/spawn.js +0 -55
  54. package/dist/src/lib/workers/context/execution-context.js +0 -12
  55. package/dist/src/lib/workers/context/terafoundation-context.js +0 -8
  56. package/dist/src/lib/workers/execution-controller/execution-analytics.js +0 -188
  57. package/dist/src/lib/workers/execution-controller/index.js +0 -1024
  58. package/dist/src/lib/workers/execution-controller/recovery.js +0 -151
  59. package/dist/src/lib/workers/execution-controller/scheduler.js +0 -390
  60. package/dist/src/lib/workers/execution-controller/slice-analytics.js +0 -96
  61. package/dist/src/lib/workers/helpers/job.js +0 -80
  62. package/dist/src/lib/workers/helpers/op-analytics.js +0 -22
  63. package/dist/src/lib/workers/helpers/terafoundation.js +0 -34
  64. package/dist/src/lib/workers/helpers/worker-shutdown.js +0 -147
  65. package/dist/src/lib/workers/metrics/index.js +0 -108
  66. package/dist/src/lib/workers/worker/index.js +0 -378
  67. package/dist/src/lib/workers/worker/slice.js +0 -122
  68. package/dist/test/config/schemas/system_schema-spec.js +0 -26
  69. package/dist/test/lib/cluster/services/cluster/backends/kubernetes/v2/k8s-v2-spec.js +0 -458
  70. package/dist/test/lib/cluster/services/cluster/backends/kubernetes/v2/k8sResource-v2-spec.js +0 -818
  71. package/dist/test/lib/cluster/services/cluster/backends/kubernetes/v2/k8sState-multicluster-v2-spec.js +0 -67
  72. package/dist/test/lib/cluster/services/cluster/backends/kubernetes/v2/k8sState-v2-spec.js +0 -84
  73. package/dist/test/lib/cluster/services/cluster/backends/kubernetes/v2/utils-v2-spec.js +0 -320
  74. package/dist/test/lib/cluster/services/cluster/backends/state-utils-spec.js +0 -37
  75. package/dist/test/node_master-spec.js +0 -194
  76. package/dist/test/services/api-spec.js +0 -79
  77. package/dist/test/services/assets-spec.js +0 -158
  78. package/dist/test/services/messaging-spec.js +0 -440
  79. package/dist/test/storage/assets_storage-spec.js +0 -95
  80. package/dist/test/storage/s3_store-spec.js +0 -149
  81. package/dist/test/test.config.js +0 -23
  82. package/dist/test/test.setup.js +0 -6
  83. package/dist/test/utils/api_utils-spec.js +0 -25
  84. package/dist/test/utils/asset_utils-spec.js +0 -141
  85. package/dist/test/utils/elastic_utils-spec.js +0 -25
  86. package/dist/test/workers/execution-controller/execution-controller-spec.js +0 -371
  87. package/dist/test/workers/execution-controller/execution-special-test-cases-spec.js +0 -519
  88. package/dist/test/workers/execution-controller/execution-test-cases-spec.js +0 -343
  89. package/dist/test/workers/execution-controller/recovery-spec.js +0 -160
  90. package/dist/test/workers/execution-controller/scheduler-spec.js +0 -249
  91. package/dist/test/workers/execution-controller/slice-analytics-spec.js +0 -121
  92. package/dist/test/workers/fixtures/ops/example-op/processor.js +0 -20
  93. package/dist/test/workers/fixtures/ops/example-op/schema.js +0 -19
  94. package/dist/test/workers/fixtures/ops/example-reader/fetcher.js +0 -20
  95. package/dist/test/workers/fixtures/ops/example-reader/schema.js +0 -41
  96. package/dist/test/workers/fixtures/ops/example-reader/slicer.js +0 -37
  97. package/dist/test/workers/fixtures/ops/new-op/processor.js +0 -29
  98. package/dist/test/workers/fixtures/ops/new-op/schema.js +0 -18
  99. package/dist/test/workers/fixtures/ops/new-reader/fetcher.js +0 -19
  100. package/dist/test/workers/fixtures/ops/new-reader/schema.js +0 -23
  101. package/dist/test/workers/fixtures/ops/new-reader/slicer.js +0 -13
  102. package/dist/test/workers/helpers/configs.js +0 -128
  103. package/dist/test/workers/helpers/execution-controller-helper.js +0 -49
  104. package/dist/test/workers/helpers/index.js +0 -5
  105. package/dist/test/workers/helpers/test-context.js +0 -210
  106. package/dist/test/workers/helpers/zip-directory.js +0 -25
  107. package/dist/test/workers/worker/slice-spec.js +0 -333
  108. package/dist/test/workers/worker/worker-spec.js +0 -356
@@ -1,194 +0,0 @@
1
- import { EventEmitter } from 'node:events';
2
- import { debugLogger } from '@terascope/core-utils';
3
- import { Server as SocketServer } from 'socket.io';
4
- import { nodeMaster } from '../src/lib/cluster/node_master.js';
5
- process.env.assignment = 'node_master';
6
- describe('Node master', () => {
7
- let eventEmitter;
8
- const logger = debugLogger('node-master-spec');
9
- const jobJson = {
10
- name: 'Data Generator',
11
- lifecycle: 'persistent',
12
- workers: 1,
13
- assets: ['elasticsearch', 'standard'],
14
- apis: [
15
- {
16
- _name: 'elasticsearch_sender_api',
17
- index: 'example-logs',
18
- type: 'events',
19
- size: 5000
20
- }
21
- ],
22
- operations: [
23
- {
24
- _op: 'data_generator',
25
- size: 5000
26
- },
27
- {
28
- _op: 'elasticsearch_bulk',
29
- _api_name: 'elasticsearch_sender_api'
30
- }
31
- ]
32
- };
33
- const context = {
34
- sysconfig: {
35
- teraslice: {
36
- master_hostname: 'localhost',
37
- port: 9999,
38
- shutdown_timeout: 400,
39
- workers: 10,
40
- assets_directory: '',
41
- slicer_port_range: '5678:5700',
42
- action_timeout: 500
43
- },
44
- _nodeName: 'testNodeName'
45
- },
46
- apis: {
47
- foundation: {
48
- makeLogger: () => logger,
49
- getSystemEvents: () => eventEmitter
50
- },
51
- registerAPI: () => { }
52
- },
53
- cluster: {},
54
- logger,
55
- __test_job: JSON.stringify(jobJson),
56
- __test_assignment: 'worker'
57
- };
58
- const fakeClusterMaster = new SocketServer({
59
- path: '/native-clustering'
60
- });
61
- fakeClusterMaster.on('connection', (socket) => {
62
- socket.on('node:state', (data) => {
63
- eventEmitter.emit('node:state', data);
64
- });
65
- socket.on('node:online', (data) => {
66
- eventEmitter.emit('node:online', data);
67
- });
68
- socket.on('messaging:response', (data) => {
69
- eventEmitter.emit('messaging:response', data);
70
- });
71
- });
72
- fakeClusterMaster.listen(9999);
73
- function waitForEvent(eventName, fn) {
74
- return new Promise((resolve) => {
75
- eventEmitter.once(eventName, (data) => {
76
- resolve(data);
77
- });
78
- if (fn) {
79
- fn();
80
- }
81
- });
82
- }
83
- // act like the pid
84
- let processCounter = 0;
85
- let delayRemoval = false;
86
- class ProcessWorker {
87
- _isDead = false;
88
- connected = true;
89
- process;
90
- id;
91
- constructor(envConfig) {
92
- processCounter += 1;
93
- for (const [key, value] of Object.entries(envConfig)) {
94
- this[key] = value;
95
- }
96
- this.process = {
97
- connected: this.connected,
98
- pid: processCounter,
99
- _msgSent: null,
100
- kill: (signal) => {
101
- this._isDead = true;
102
- this.connected = false;
103
- if (delayRemoval && signal === 'SIGTERM') {
104
- setTimeout(() => eventEmitter.emit('deleteWorker', this.id), 500);
105
- }
106
- else {
107
- eventEmitter.emit('deleteWorker', this.id);
108
- }
109
- }
110
- };
111
- this.connected = true;
112
- }
113
- kill(signal) {
114
- this.process.kill(signal);
115
- }
116
- isDead() {
117
- return this._isDead;
118
- }
119
- }
120
- function makeWorker(config) {
121
- return new ProcessWorker(config);
122
- }
123
- function setUpNodeMaster() {
124
- const newEmitter = new EventEmitter();
125
- eventEmitter = newEmitter;
126
- const startingWorkers = {
127
- workers: {
128
- worker1: makeWorker({
129
- id: 'worker1',
130
- ex_id: '1234',
131
- job_id: '5678',
132
- assignment: 'worker'
133
- }),
134
- worker2: makeWorker({
135
- id: 'worker2',
136
- ex_id: '1234',
137
- job_id: '5678',
138
- assignment: 'slicer'
139
- }),
140
- worker3: makeWorker({
141
- id: 'worker3',
142
- ex_id: '1234',
143
- job_id: '5678',
144
- assignment: 'worker'
145
- }),
146
- worker4: makeWorker({
147
- id: 'worker4',
148
- ex_id: '1212',
149
- job_id: '2323',
150
- assets: [{ id: 1234567890 }],
151
- assignment: 'worker'
152
- })
153
- }
154
- };
155
- context.apis.foundation.getSystemEvents = () => newEmitter;
156
- context.cluster = Object.assign(Object.create(newEmitter), startingWorkers);
157
- eventEmitter.on('deleteWorker', (id) => delete context.cluster.workers[id]);
158
- return nodeMaster(context);
159
- }
160
- function waitFor(timeout) {
161
- return new Promise((resolve) => {
162
- setTimeout(() => {
163
- resolve(true);
164
- }, timeout);
165
- });
166
- }
167
- function sendMsg(data) {
168
- fakeClusterMaster.emit('networkMessage', data);
169
- }
170
- beforeEach(() => {
171
- delayRemoval = false;
172
- });
173
- afterAll(() => fakeClusterMaster.close());
174
- it('can load without throwing', () => {
175
- expect(() => setUpNodeMaster()).not.toThrow();
176
- });
177
- it('can remove workers', async () => {
178
- setUpNodeMaster();
179
- const networkMsg = {
180
- ex_id: '1234',
181
- response: true,
182
- to: 'node_master',
183
- message: 'cluster:workers:remove',
184
- __source: 'cluster_master',
185
- payload: { workers: 1 }
186
- };
187
- delayRemoval = true;
188
- await waitForEvent('node:online');
189
- await Promise.all([sendMsg(networkMsg), waitFor(700)]);
190
- const processesAlive = Object.keys(context.cluster.workers).length;
191
- expect(processesAlive).toEqual(3);
192
- });
193
- });
194
- //# sourceMappingURL=node_master-spec.js.map
@@ -1,79 +0,0 @@
1
- import got from 'got';
2
- import express from 'express';
3
- import { TestContext } from '@terascope/job-components';
4
- import { findPort } from '../../src/lib/utils/port_utils.js';
5
- import { ApiService } from '../../src/lib/cluster/services/api.js';
6
- import { getPackageJSON } from '../../src/lib/utils/file_utils.js';
7
- describe('HTTP API', () => {
8
- const { version } = getPackageJSON();
9
- const app = express();
10
- const assetsUrl = 'http://example.asset:1234';
11
- const context = new TestContext('http-api');
12
- context.stores = {
13
- stateStorage: {},
14
- executionStorage: {},
15
- jobsStorage: {},
16
- };
17
- context.services = {
18
- clusterService: {},
19
- executionService: {},
20
- jobsService: {},
21
- };
22
- let api;
23
- let port;
24
- let baseUrl;
25
- let server;
26
- beforeAll(async () => {
27
- port = await findPort();
28
- baseUrl = `http://localhost:${port}`;
29
- api = new ApiService(context, { assetsUrl, app });
30
- await api.initialize();
31
- await new Promise((resolve, reject) => {
32
- server = app.listen(port, (err) => {
33
- if (err)
34
- reject(err);
35
- else
36
- resolve(true);
37
- });
38
- });
39
- await api.initialize();
40
- });
41
- afterAll(async () => {
42
- if (api) {
43
- await api.shutdown();
44
- }
45
- if (server) {
46
- await new Promise((resolve, reject) => {
47
- server.close((err) => {
48
- if (err)
49
- reject(err);
50
- else
51
- resolve(true);
52
- });
53
- });
54
- }
55
- });
56
- describe('GET /', () => {
57
- it('should the correct response', async () => {
58
- let response;
59
- try {
60
- response = await got(baseUrl, {
61
- responseType: 'json',
62
- throwHttpErrors: true
63
- });
64
- expect(response.body).toMatchObject({
65
- arch: context.arch,
66
- clustering_type: context.sysconfig.teraslice.cluster_manager_type,
67
- name: context.sysconfig.teraslice.name,
68
- node_version: process.version,
69
- platform: context.platform,
70
- teraslice_version: `v${version}`
71
- });
72
- }
73
- catch (err) {
74
- expect(err.stack).toBeNil();
75
- }
76
- });
77
- });
78
- });
79
- //# sourceMappingURL=api-spec.js.map
@@ -1,158 +0,0 @@
1
- import { TestContext } from '@terascope/job-components';
2
- import fs from 'node:fs';
3
- import got from 'got';
4
- import { createClient } from '@terascope/opensearch-client';
5
- import { createS3Client } from '@terascope/file-asset-apis';
6
- import { AssetsService } from '../../src/lib/cluster/services/assets';
7
- import { SEARCH_TEST_HOST, TEST_INDEX_PREFIX } from '../test.config';
8
- import { findPort } from '../../src/lib/utils/port_utils.js';
9
- describe('Assets Service', () => {
10
- const contextOptions = {
11
- assignment: 'assets_service',
12
- clients: [
13
- {
14
- type: 'elasticsearch-next',
15
- async createClient(customConfig, logger) {
16
- const { client } = await createClient(customConfig, logger);
17
- return { client, logger };
18
- },
19
- endpoint: 'default'
20
- },
21
- {
22
- type: 's3',
23
- createClient: async (customConfig, logger) => {
24
- const client = await createS3Client(customConfig, logger);
25
- return { client, logger };
26
- },
27
- endpoint: 'default'
28
- }
29
- ]
30
- };
31
- /// It's important to keep the test context name unique
32
- /// This is so we don't share indices and buckets with other test suites
33
- const context = new TestContext(`${TEST_INDEX_PREFIX}assets-spec-test`, contextOptions);
34
- context.sysconfig.terafoundation = Object.assign(context.sysconfig.terafoundation, {
35
- prom_metrics_enabled: false,
36
- prom_metrics_port: 3333,
37
- prom_metrics_add_default: true,
38
- connectors: {
39
- s3: {
40
- default: {
41
- endpoint: process.env.MINIO_HOST,
42
- accessKeyId: process.env.MINIO_ACCESS_KEY,
43
- secretAccessKey: process.env.MINIO_SECRET_KEY,
44
- forcePathStyle: true,
45
- sslEnabled: false,
46
- region: 'test-region'
47
- },
48
- },
49
- 'elasticsearch-next': {
50
- default: {
51
- node: [SEARCH_TEST_HOST]
52
- },
53
- },
54
- }
55
- });
56
- context.sysconfig.teraslice.asset_storage_connection_type = 's3';
57
- context.sysconfig.teraslice.asset_storage_connection = 'default';
58
- context.sysconfig.teraslice.asset_storage_bucket = 'assets-spec-test-bucket';
59
- context.sysconfig.teraslice.api_response_timeout = 30000;
60
- let service;
61
- beforeAll(async () => {
62
- /// Setting port for the asset service
63
- process.env.port = (await findPort()).toString();
64
- service = new AssetsService(context);
65
- await service.initialize();
66
- });
67
- afterAll(async () => {
68
- // Clean up asset process
69
- await service.shutdown();
70
- });
71
- describe('getS3AssetStatus function', () => {
72
- it('Should return correct info if given valid lists', async () => {
73
- const s3List = [
74
- { File: '123.zip', Size: '12345' },
75
- { File: 'abc.zip', Size: '56873' },
76
- { File: 'foo.zip', Size: '1' },
77
- ];
78
- const esList = [
79
- {
80
- _created: '500BC',
81
- id: '123',
82
- name: 'asset-123',
83
- version: '1.0.0',
84
- description: 'A description',
85
- node_version: 19,
86
- platform: '',
87
- arch: 'arm64'
88
- },
89
- {
90
- _created: '2020-12-20T17:16:44.036Z',
91
- id: 'abc',
92
- name: 'asset-abc',
93
- version: '1.0.0',
94
- description: 'A description',
95
- node_version: 19,
96
- platform: '',
97
- arch: ''
98
- },
99
- {
100
- _created: '2024-03-20T17:16:05.037Z',
101
- id: 'foo',
102
- name: 'foo-asset',
103
- version: '6.7.1',
104
- description: 'test',
105
- node_version: 18,
106
- platform: '',
107
- arch: ''
108
- }
109
- ];
110
- // Do this because getS3AssetStatus is a private function
111
- // @ts-expect-error
112
- const result = service.getS3AssetStatus(s3List, esList);
113
- expect(result[0].external_storage).toEqual('available');
114
- expect(result[1].external_storage).toEqual('available');
115
- expect(result[2].external_storage).toEqual('available');
116
- });
117
- it('Should return "missing" if id is not available in s3List', async () => {
118
- const s3List = [
119
- { File: '123.zip', Size: '12345' },
120
- { File: 'abc.zip', Size: '56873' },
121
- { File: 'foo.zip', Size: '1' },
122
- ];
123
- const esList = [
124
- {
125
- _created: '500BC',
126
- id: '50000',
127
- name: 'asset-123',
128
- version: '1.0.0',
129
- description: 'A description',
130
- node_version: 19,
131
- platform: '',
132
- arch: 'arm64'
133
- }
134
- ];
135
- // Do this because getS3AssetStatus is a private function
136
- // @ts-expect-error
137
- const result = service.getS3AssetStatus(s3List, esList);
138
- expect(result[0].external_storage).toEqual('missing');
139
- });
140
- });
141
- describe('Testing /txt/assets enpoint', () => {
142
- it('Should return proper table with specific format', async () => {
143
- const filePathOne = 'packages/teraslice/test/fixtures/assets/asset-with-long-description.zip';
144
- const filePathOneStream = fs.readFileSync(filePathOne);
145
- // Upload file to storage
146
- await service.assetsStorage.save(filePathOneStream);
147
- const resultTable = await got.get(`http://localhost:${process.env.port}/txt/assets`, {
148
- searchParams: {
149
- fields: 'name,version,id,description,node_version,platform,arch'
150
- }
151
- }).text();
152
- expect(resultTable).toEqual('name version id description node_version platform arch\n'
153
- + '--------------------------- ------- ---------------------------------------- ------------------------------ ------------ -------- ----\n'
154
- + 'asset-with-long-description 3.6.3 ba53aa515e20e0c7da93bd2a373b84819fba7b2a This description is longer tha 18 \n');
155
- });
156
- });
157
- });
158
- //# sourceMappingURL=assets-spec.js.map