@squiz/job-runner-lib 2.9.0 → 2.10.1
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/CHANGELOG.md +12 -0
- package/lib/domains/job/constants/RuntimeImage.constants.d.ts +3 -4
- package/lib/domains/job/constants/RuntimeImage.constants.spec.d.ts +5 -0
- package/lib/domains/job/errors/ConflictError.d.ts +14 -0
- package/lib/domains/job/errors/Error.constants.d.ts +4 -0
- package/lib/domains/job/errors/index.d.ts +1 -0
- package/lib/domains/job/model/Base/Base.d.ts +5 -0
- package/lib/domains/job/model/JobExecution/JobExecution.d.ts +15 -3
- package/lib/domains/job/repository/JobExecutionRepository/JobExecutionRepository.d.ts +3 -6
- package/lib/domains/job/utils/ResolveRuntimeImageTaskDefinitionArn/ResolveRuntimeImageTaskDefinitionArn.d.ts +1 -1
- package/lib/domains/job/utils/ResolveRuntimeImageTaskDefinitionArn/ResolveRuntimeImageTaskDefinitionArn.spec.d.ts +5 -0
- package/lib/domains/job/utils/ResolveRuntimeImageTaskDefinitionArn/ResolveRuntimeImageTaskDefinitionArn.types.d.ts +1 -1
- package/lib/index.js +11 -11
- package/lib/index.js.map +4 -4
- package/package.json +4 -3
- package/src/domains/job/constants/RuntimeImage.constants.spec.ts +26 -0
- package/src/domains/job/constants/RuntimeImage.constants.ts +5 -8
- package/src/domains/job/errors/ConflictError.ts +19 -0
- package/src/domains/job/errors/Error.constants.ts +4 -0
- package/src/domains/job/errors/index.ts +1 -0
- package/src/domains/job/manifest/mocks/JobManifest.mock.ts +2 -2
- package/src/domains/job/manifest/mocks/JobManifestDto.mock.ts +2 -2
- package/src/domains/job/manifest/mocks/JobManifestRecord.mock.ts +2 -2
- package/src/domains/job/manifest/mocks/JobManifestRequest.mock.ts +2 -2
- package/src/domains/job/model/Base/Base.ts +6 -0
- package/src/domains/job/model/JobExecution/JobExecution.ts +17 -3
- package/src/domains/job/model/JobExecution/mocks/JobExecution.mock.ts +1 -0
- package/src/domains/job/model/JobExecution/mocks/JobExecutionDto.mock.ts +3 -0
- package/src/domains/job/model/JobExecution/mocks/JobExecutionRecord.mock.ts +1 -0
- package/src/domains/job/repository/JobExecutionRepository/JobExecutionRepository.spec.ts +77 -16
- package/src/domains/job/repository/JobExecutionRepository/JobExecutionRepository.ts +19 -15
- package/src/domains/job/repository/JobExecutionRepository/utils/convertDynamoDbItemToJobExecution/convertDynamoDbItemToJobExecution.ts +1 -0
- package/src/domains/job/repository/JobManifestRepository/JobManifestRepository.spec.ts +24 -3
- package/src/domains/job/repository/JobRepository/JobRepository.spec.ts +24 -3
- package/src/domains/job/services/JobExecutionTaskService/JobExecutionTaskService.spec.ts +5 -6
- package/src/domains/job/services/JobExecutionTaskService/JobExecutionTaskService.ts +1 -1
- package/src/domains/job/utils/ResolveRuntimeImageTaskDefinitionArn/ResolveRuntimeImageTaskDefinitionArn.spec.ts +64 -0
- package/src/domains/job/utils/ResolveRuntimeImageTaskDefinitionArn/ResolveRuntimeImageTaskDefinitionArn.ts +2 -5
- package/src/domains/job/utils/ResolveRuntimeImageTaskDefinitionArn/ResolveRuntimeImageTaskDefinitionArn.types.ts +1 -1
- package/src/domains/manifest/utils/validateRuntimeImage.ts +5 -5
|
@@ -31,7 +31,7 @@ describe('JobExecutionTaskService', () => {
|
|
|
31
31
|
shortRegion: 'au',
|
|
32
32
|
shortEnvironment: 'dev',
|
|
33
33
|
clusterArn: `clusterArn`,
|
|
34
|
-
taskDefinitionArn: `
|
|
34
|
+
taskDefinitionArn: `defaultTaskDefinitionArn`,
|
|
35
35
|
taskDefinitionArnsByRuntimeImage: {
|
|
36
36
|
'node:20': 'node20TaskDefinitionArn',
|
|
37
37
|
'node:24': 'node24TaskDefinitionArn',
|
|
@@ -213,11 +213,11 @@ describe('JobExecutionTaskService', () => {
|
|
|
213
213
|
defaultRunJobTaskParams.jobExecution,
|
|
214
214
|
);
|
|
215
215
|
expect(mockEcsClient).toHaveReceivedCommandWith(RunTaskCommand, {
|
|
216
|
-
taskDefinition: defaultRunJobTaskParams.taskDefinitionArnsByRuntimeImage['node:
|
|
216
|
+
taskDefinition: defaultRunJobTaskParams.taskDefinitionArnsByRuntimeImage['node:24'],
|
|
217
217
|
});
|
|
218
218
|
});
|
|
219
219
|
|
|
220
|
-
it('should use the
|
|
220
|
+
it('should use the default task definition ARN when the node:24 map entry is missing', async () => {
|
|
221
221
|
const mockArn = `mock-arn`;
|
|
222
222
|
|
|
223
223
|
mockEcsClient.on(RunTaskCommand).resolves({ tasks: [{ taskArn: mockArn }] });
|
|
@@ -250,9 +250,8 @@ describe('JobExecutionTaskService', () => {
|
|
|
250
250
|
await expect(
|
|
251
251
|
jobExecutionTaskService.runJobExecutionTask({
|
|
252
252
|
...defaultRunJobTaskParams,
|
|
253
|
-
taskDefinitionArnsByRuntimeImage: {
|
|
254
|
-
|
|
255
|
-
},
|
|
253
|
+
taskDefinitionArnsByRuntimeImage: {},
|
|
254
|
+
taskDefinitionArn: '',
|
|
256
255
|
}),
|
|
257
256
|
).rejects.toThrow(RuntimeImageTaskDefinitionError);
|
|
258
257
|
expect(mockEcsClient).not.toHaveReceivedCommand(RunTaskCommand);
|
|
@@ -61,7 +61,7 @@ export class JobExecutionTaskService {
|
|
|
61
61
|
const taskDefinitionArn = resolveRuntimeImageTaskDefinitionArn({
|
|
62
62
|
image: jobManifest?.image,
|
|
63
63
|
taskDefinitionArnsByRuntimeImage: params.taskDefinitionArnsByRuntimeImage,
|
|
64
|
-
|
|
64
|
+
defaultTaskDefinitionArn: params.taskDefinitionArn,
|
|
65
65
|
});
|
|
66
66
|
const jobDetailsFileUrl = await this.createJobDetailsFile(params.tenantId, params.jobExecution, jobManifest);
|
|
67
67
|
const tags = getAwsTags({
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright Squiz Australia Pty Ltd. All Rights Reserved.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { RuntimeImageTaskDefinitionError } from '../../errors';
|
|
7
|
+
import { resolveRuntimeImageTaskDefinitionArn } from './ResolveRuntimeImageTaskDefinitionArn';
|
|
8
|
+
|
|
9
|
+
describe('resolveRuntimeImageTaskDefinitionArn', () => {
|
|
10
|
+
const taskDefinitionArnsByRuntimeImage = {
|
|
11
|
+
'node:24': 'node24TaskDefinitionArn',
|
|
12
|
+
};
|
|
13
|
+
const defaultTaskDefinitionArn = 'defaultTaskDefinitionArn';
|
|
14
|
+
|
|
15
|
+
it('resolves node:24 when the stored image is deprecated node:20', () => {
|
|
16
|
+
expect(
|
|
17
|
+
resolveRuntimeImageTaskDefinitionArn({
|
|
18
|
+
image: 'node:20',
|
|
19
|
+
taskDefinitionArnsByRuntimeImage,
|
|
20
|
+
defaultTaskDefinitionArn,
|
|
21
|
+
}),
|
|
22
|
+
).toEqual('node24TaskDefinitionArn');
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it('resolves node:24 when the stored image is missing', () => {
|
|
26
|
+
expect(
|
|
27
|
+
resolveRuntimeImageTaskDefinitionArn({
|
|
28
|
+
image: undefined,
|
|
29
|
+
taskDefinitionArnsByRuntimeImage,
|
|
30
|
+
defaultTaskDefinitionArn,
|
|
31
|
+
}),
|
|
32
|
+
).toEqual('node24TaskDefinitionArn');
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it('uses the default task definition ARN when the runtime map entry is missing', () => {
|
|
36
|
+
expect(
|
|
37
|
+
resolveRuntimeImageTaskDefinitionArn({
|
|
38
|
+
image: 'node:20',
|
|
39
|
+
taskDefinitionArnsByRuntimeImage: {},
|
|
40
|
+
defaultTaskDefinitionArn,
|
|
41
|
+
}),
|
|
42
|
+
).toEqual(defaultTaskDefinitionArn);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it('throws when the runtime image is unsupported', () => {
|
|
46
|
+
expect(() =>
|
|
47
|
+
resolveRuntimeImageTaskDefinitionArn({
|
|
48
|
+
image: 'node:26',
|
|
49
|
+
taskDefinitionArnsByRuntimeImage,
|
|
50
|
+
defaultTaskDefinitionArn,
|
|
51
|
+
}),
|
|
52
|
+
).toThrow(RuntimeImageTaskDefinitionError);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it('throws when no task definition ARN is configured for the runtime image', () => {
|
|
56
|
+
expect(() =>
|
|
57
|
+
resolveRuntimeImageTaskDefinitionArn({
|
|
58
|
+
image: 'node:24',
|
|
59
|
+
taskDefinitionArnsByRuntimeImage: {},
|
|
60
|
+
defaultTaskDefinitionArn: '',
|
|
61
|
+
}),
|
|
62
|
+
).toThrow(RuntimeImageTaskDefinitionError);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
@@ -4,7 +4,6 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import {
|
|
7
|
-
LEGACY_RUNTIME_IMAGE,
|
|
8
7
|
SUPPORTED_RUNTIME_IMAGES,
|
|
9
8
|
getRuntimeImageOrDefault,
|
|
10
9
|
isSupportedRuntimeImage,
|
|
@@ -15,7 +14,7 @@ import { ResolveRuntimeImageTaskDefinitionArnParams } from './ResolveRuntimeImag
|
|
|
15
14
|
export const resolveRuntimeImageTaskDefinitionArn = ({
|
|
16
15
|
image,
|
|
17
16
|
taskDefinitionArnsByRuntimeImage,
|
|
18
|
-
|
|
17
|
+
defaultTaskDefinitionArn,
|
|
19
18
|
}: ResolveRuntimeImageTaskDefinitionArnParams): string => {
|
|
20
19
|
const runtimeImage = getRuntimeImageOrDefault(image);
|
|
21
20
|
|
|
@@ -25,9 +24,7 @@ export const resolveRuntimeImageTaskDefinitionArn = ({
|
|
|
25
24
|
);
|
|
26
25
|
}
|
|
27
26
|
|
|
28
|
-
const taskDefinitionArn =
|
|
29
|
-
taskDefinitionArnsByRuntimeImage[runtimeImage] ||
|
|
30
|
-
(runtimeImage === LEGACY_RUNTIME_IMAGE ? legacyTaskDefinitionArn : undefined);
|
|
27
|
+
const taskDefinitionArn = taskDefinitionArnsByRuntimeImage[runtimeImage] || defaultTaskDefinitionArn;
|
|
31
28
|
|
|
32
29
|
if (!taskDefinitionArn) {
|
|
33
30
|
throw new RuntimeImageTaskDefinitionError(
|
|
@@ -16,16 +16,16 @@ export const validateAndDefaultRuntimeImage = (image: string | null | undefined)
|
|
|
16
16
|
return RECOMMENDED_RUNTIME_IMAGE;
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
if (
|
|
19
|
+
if (isDeprecatedRuntimeImage(image)) {
|
|
20
20
|
throw new ManifestValidationError(
|
|
21
|
-
`
|
|
21
|
+
`Runtime image "${image}" is deprecated and can no longer be used for new uploads. ` +
|
|
22
|
+
`Please use the recommended runtime image "${RECOMMENDED_RUNTIME_IMAGE}".`,
|
|
22
23
|
);
|
|
23
24
|
}
|
|
24
25
|
|
|
25
|
-
if (
|
|
26
|
+
if (!isSupportedRuntimeImage(image)) {
|
|
26
27
|
throw new ManifestValidationError(
|
|
27
|
-
`
|
|
28
|
-
`Please use the recommended runtime image "${RECOMMENDED_RUNTIME_IMAGE}".`,
|
|
28
|
+
`Unsupported runtime image "${image}". Supported images are: ${SUPPORTED_RUNTIME_IMAGES.join(', ')}`,
|
|
29
29
|
);
|
|
30
30
|
}
|
|
31
31
|
|