Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ Start the server
|`JOB_DEFINITIONS_JOB_NEW` |Job name. |Ingestion_New |
|`JOB_DEFINITIONS_JOB_UPDATE` |Job name. |Ingestion_Update |
|`JOB_DEFINITIONS_JOB_SWAP_UPDATE` |Job name. |Ingestion_Swap_Update |
|`JOB_DEFINITIONS_JOB_UPDATE_DELETE_CACHE`|Job name. |Update_Delete_Cache |
|`JOB_DEFINITIONS_JOB_SWAP_DELETE_CACHE`|Job name. |Swap_Delete_Cache |
|`JOB_DEFINITIONS_TASK_INIT` |Task name. |init |
|`JOB_DEFINITIONS_TASK_MERGE` |Task name. |merge |
|`JOB_DEFINITIONS_TASK_TILES_DELETION`|Task name. |tiles-deletion |
Expand Down
8 changes: 4 additions & 4 deletions config/custom-environment-variables.json
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,8 @@
"update": "JOB_DEFINITIONS_JOB_UPDATE",
"swapUpdate": "JOB_DEFINITIONS_JOB_SWAP_UPDATE",
"export": "JOB_DEFINITIONS_JOB_EXPORT",
"seed": "JOB_DEFINITIONS_JOB_SEED",
"updateCacheDeletion": "JOB_DEFINITIONS_JOB_UPDATE_DELETE_CACHE",
"swapCacheDeletion": "JOB_DEFINITIONS_JOB_SWAP_DELETE_CACHE",
"deleteLayer": "JOB_DEFINITIONS_JOB_DELETE_LAYER"
},
"tasks": {
Expand All @@ -80,7 +81,6 @@
"polygonParts": "JOB_DEFINITIONS_TASK_POLYGON_PARTS",
"export": "JOB_DEFINITIONS_TASK_EXPORT",
"finalize": "JOB_DEFINITIONS_TASK_FINALIZE",
"seed": "JOB_DEFINITIONS_TASK_SEED",
"delete": "JOB_DEFINITIONS_TASK_DELETE"
},
"suspendingTaskTypes": {
Expand All @@ -97,8 +97,8 @@
"__name": "EXPORT_TASKS_FLOW",
"__format": "json"
},
"seedTasksFlow": {
"__name": "SEED_TASKS_FLOW",
"deleteCacheTasksFlow": {
"__name": "DELETE_CACHE_TASKS_FLOW",
"__format": "json"
},
"deleteLayerTasksFlow": {
Expand Down
6 changes: 3 additions & 3 deletions config/default.json
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,8 @@
"update": "Ingestion_Update",
"swapUpdate": "Ingestion_Swap_Update",
"export": "Export",
"seed": "TilesSeeding",
"updateCacheDeletion": "Update_Delete_Cache",
"swapCacheDeletion": "Swap_Delete_Cache",
"deleteLayer": "Delete_Layer"
},
"tasks": {
Expand All @@ -64,7 +65,6 @@
"createTasks": "create-tasks",
"export": "tilesExporting",
"finalize": "finalize",
"seed": "TilesSeeding",
"tilesDeletion": "tiles-deletion",
"delete": "delete"
},
Expand All @@ -73,7 +73,7 @@
"taskFlowManager": {
"ingestionTasksFlow": ["validation", "create-merge-tasks", "tilesMerging", "finalize"],
"exportTasksFlow": ["init", "tilesExporting", "polygon-parts", "finalize"],
"seedTasksFlow": ["TilesSeeding"],
"deleteCacheTasksFlow": ["tiles-deletion"],
"deleteLayerTasksFlow": ["delete", "tiles-deletion"]
}
}
6 changes: 3 additions & 3 deletions helm/templates/configmap.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@ data:
JOB_DEFINITIONS_JOB_UPDATE: {{ $jobDefinitions.jobs.update.type | quote }}
JOB_DEFINITIONS_JOB_SWAP_UPDATE: {{ $jobDefinitions.jobs.swapUpdate.type | quote }}
JOB_DEFINITIONS_JOB_EXPORT: {{ $jobDefinitions.jobs.export.type | quote }}
JOB_DEFINITIONS_JOB_SEED: {{ $jobDefinitions.jobs.seed.type | quote }}
JOB_DEFINITIONS_JOB_UPDATE_DELETE_CACHE: {{ $jobDefinitions.jobs.updateCacheDeletion.type | quote }}
JOB_DEFINITIONS_JOB_SWAP_DELETE_CACHE: {{ $jobDefinitions.jobs.swapCacheDeletion.type | quote }}
JOB_DEFINITIONS_JOB_DELETE_LAYER: {{ $jobDefinitions.jobs.deleteLayer.type | quote }}
JOB_DEFINITIONS_TASK_INIT: {{ $jobDefinitions.tasks.init.type | quote }}
JOB_DEFINITIONS_TASK_VALIDATION: {{ $jobDefinitions.tasks.validation.type | quote }}
Expand All @@ -42,12 +43,11 @@ data:
JOB_DEFINITIONS_TASK_CREATE_TASKS: {{ $jobDefinitions.tasks.createTasks.type | quote }}
JOB_DEFINITIONS_TASK_EXPORT: {{ $jobDefinitions.tasks.export.type | quote }}
JOB_DEFINITIONS_TASK_FINALIZE: {{ $jobDefinitions.tasks.finalize.type | quote }}
JOB_DEFINITIONS_TASK_SEED: {{ $jobDefinitions.tasks.seed.type | quote }}
JOB_DEFINITIONS_TASK_DELETE: {{ $jobDefinitions.tasks.delete.type | quote }}
JOB_DEFINITIONS_SUSPENDING_TASKS: {{ $suspendingTaskTypes | quote }}
INGESTION_TASKS_FLOW: {{ .Values.taskFlowManager.ingestionTasksFlow | toJson | quote }}
EXPORT_TASKS_FLOW: {{ .Values.taskFlowManager.exportTasksFlow | toJson | quote }}
SEED_TASKS_FLOW: {{ .Values.taskFlowManager.seedTasksFlow | toJson | quote }}
DELETE_CACHE_TASKS_FLOW: {{ .Values.taskFlowManager.deleteCacheTasksFlow | toJson | quote }}
DELETE_LAYER_TASKS_FLOW: {{ .Values.taskFlowManager.deleteLayerTasksFlow | toJson | quote }}
{{- with .Values.configManagement }}
CONFIG_NAME: {{ .name | quote }}
Expand Down
10 changes: 5 additions & 5 deletions helm/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,9 @@ jobDefinitions:
type: ''
export:
type: ''
seed:
updateCacheDeletion:
type: ''
swapCacheDeletion:
type: ''
deleteLayer:
type: ''
Expand All @@ -115,8 +117,6 @@ jobDefinitions:
type: ''
export:
type: ''
seed:
type: ''
delete:
type: ''

Expand All @@ -132,8 +132,8 @@ taskFlowManager:
- tilesExporting
- polygon-parts
- finalize
seedTasksFlow:
- TilesSeeding
deleteCacheTasksFlow:
- tiles-deletion
deleteLayerTasksFlow:
- delete
- tiles-deletion
Expand Down
4 changes: 2 additions & 2 deletions src/common/interfaces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@ export interface IJobDefinitionsConfig {
update: string;
swapUpdate: string;
export: string;
seed: string;
updateCacheDeletion: string;
swapCacheDeletion: string;
deleteLayer: string;
};
tasks: {
Expand All @@ -32,7 +33,6 @@ export interface IJobDefinitionsConfig {
validation: string;
init: string;
export: string;
seed: string;
tilesDeletion: string;
Comment thread
CL-SHLOMIKONCHA marked this conversation as resolved.
delete: string;
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { SERVICES } from '../../../common/constants';
import { JobHandler } from '../jobHandler';

@injectable()
export class SeedJobHandler extends JobHandler {
export class DeleteCacheJobHandler extends JobHandler {
protected readonly tasksFlow: TaskTypes;
protected readonly excludedTypes: TaskTypes;
protected readonly blockedDuplicationTypes: TaskTypes;
Expand All @@ -20,8 +20,8 @@ export class SeedJobHandler extends JobHandler {
task: ITaskResponse<unknown>
) {
super(logger, config, jobManagerClient, job, task);
this.tasksFlow = this.config.get('taskFlowManager.seedTasksFlow') as unknown as TaskTypes;
this.excludedTypes = [this.jobDefinitions.tasks.seed];
this.tasksFlow = this.config.get('taskFlowManager.deleteCacheTasksFlow') as unknown as TaskTypes;
this.excludedTypes = [this.jobDefinitions.tasks.tilesDeletion];
this.blockedDuplicationTypes = [];

this.initializeTaskOperations();
Expand Down
7 changes: 4 additions & 3 deletions src/tasks/handlers/jobHandlerFactory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import type { IJobDefinitionsConfig } from '../../common/interfaces';
import type { JobHandler } from './jobHandler';
import { IngestionJobHandler } from './ingestion/ingestionHandler';
import { ExportJobHandler } from './export/exportHandler';
import { SeedJobHandler } from './seed/seedHandler';
import { DeleteCacheJobHandler } from './deleteCache/deleteCacheHandler';
import { DeleteLayerJobHandler } from './deleteLayer/deleteLayerHandler';

export function getJobHandler(
Expand All @@ -29,8 +29,9 @@ export function getJobHandler(
case jobDefinitions.jobs.export: {
return new ExportJobHandler(logger, config, jobManagerClient, job, task);
}
case jobDefinitions.jobs.seed: {
return new SeedJobHandler(logger, config, jobManagerClient, job, task);
case jobDefinitions.jobs.updateCacheDeletion:
case jobDefinitions.jobs.swapCacheDeletion: {
return new DeleteCacheJobHandler(logger, config, jobManagerClient, job, task);
}
case jobDefinitions.jobs.deleteLayer: {
return new DeleteLayerJobHandler(logger, config, jobManagerClient, job, task);
Expand Down
115 changes: 115 additions & 0 deletions tests/integration/tasks/deleteCache/taskManager.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
import nock, { cleanAll, isDone, pendingMocks } from 'nock';
import { OperationStatus } from '@map-colonies/mc-priority-queue';
import { StatusCodes as httpStatusCodes } from 'http-status-codes';
import { trace } from '@opentelemetry/api';
import { jsLogger } from '@map-colonies/js-logger';
import { initConfig } from '../../../../src/common/config';
import { configMock } from '../../../mocks/configMock';
import { getApp } from '../../../../src/app';
import type { IJobManagerConfig, IJobDefinitionsConfig } from '../../../../src/common/interfaces';
import { getDeleteCacheJobMock, getTaskMock } from '../../../mocks/jobMocks';
import { calculateJobPercentage } from '../../../../src/utils/jobUtils';
import { SERVICES } from '../../../../src/common/constants';
import { registerExternalValues } from '../../../../src/containerConfig';
import { TasksRequestSender } from '../helpers/requestSender';
import { getTestContainerConfig, resetContainer } from '../helpers/containerConfig';

describe('tasks', function () {
let requestSender: TasksRequestSender;
let jobManagerConfigMock: IJobManagerConfig;
let jobDefinitionsConfig: IJobDefinitionsConfig;

beforeAll(async function () {
await initConfig(true);
});

beforeEach(async function () {
const [app] = await getApp({
override: [...(await getTestContainerConfig())],
useChild: true,
});

await registerExternalValues({
override: [
{ token: SERVICES.LOGGER, provider: { useValue: await jsLogger({ enabled: false }) } },
{ token: SERVICES.CONFIG, provider: { useValue: configMock } },
{ token: SERVICES.TRACER, provider: { useValue: trace.getTracer('testTracer') } },
],
});

requestSender = new TasksRequestSender(app);
jobManagerConfigMock = configMock.get('jobManagement.config') as unknown as IJobManagerConfig;
jobDefinitionsConfig = configMock.get('jobDefinitions') as IJobDefinitionsConfig;
cleanAll();
});

afterEach(function () {
resetContainer();
jest.restoreAllMocks();
if (!isDone()) {
throw new Error(`Not all nock interceptors were used: ${JSON.stringify(pendingMocks())}`);
}
});

const deleteCacheJobTypes = [{ jobTypeKey: 'updateCacheDeletion' as const }, { jobTypeKey: 'swapCacheDeletion' as const }];

describe('Happy Path', function () {
it.each(deleteCacheJobTypes)(
'should return 200 when getting completed but not last tiles-deletion task - $jobTypeKey',
async ({ jobTypeKey }) => {
// mocks
const mockJob = getDeleteCacheJobMock(jobDefinitionsConfig.jobs[jobTypeKey]);
const mockTask = getTaskMock(mockJob.id, { type: jobDefinitionsConfig.tasks.tilesDeletion, status: OperationStatus.COMPLETED });
nock(jobManagerConfigMock.jobManagerBaseUrl).post('/tasks/find', { id: mockTask.id }).reply(httpStatusCodes.OK, [mockTask]);
nock(jobManagerConfigMock.jobManagerBaseUrl)
.get(`/jobs/${mockJob.id}`)
.query({ shouldReturnTasks: false })
.reply(httpStatusCodes.OK, mockJob);
const taskPercentage = calculateJobPercentage(mockJob.completedTasks, mockJob.taskCount);
nock(jobManagerConfigMock.jobManagerBaseUrl).put(`/jobs/${mockJob.id}`, { percentage: taskPercentage }).reply(httpStatusCodes.OK);
// action
const response = await requestSender.handleTaskNotification(mockTask.id);
// expectation
expect(response.status).toBe(httpStatusCodes.OK);
expect(response).toSatisfyApiSpec();
}
);

it.each(deleteCacheJobTypes)('should return 200 when getting last completed tiles-deletion task - $jobTypeKey', async ({ jobTypeKey }) => {
// mocks
const mockJob = getDeleteCacheJobMock(jobDefinitionsConfig.jobs[jobTypeKey], { completedTasks: 5, taskCount: 5 });
const mockTask = getTaskMock(mockJob.id, { type: jobDefinitionsConfig.tasks.tilesDeletion, status: OperationStatus.COMPLETED });
nock(jobManagerConfigMock.jobManagerBaseUrl).post('/tasks/find', { id: mockTask.id }).reply(httpStatusCodes.OK, [mockTask]);
nock(jobManagerConfigMock.jobManagerBaseUrl).get(`/jobs/${mockJob.id}`).query({ shouldReturnTasks: false }).reply(httpStatusCodes.OK, mockJob);
nock(jobManagerConfigMock.jobManagerBaseUrl)
.put(`/jobs/${mockJob.id}`, { percentage: 100, status: OperationStatus.COMPLETED })
.reply(httpStatusCodes.OK);
// action
const response = await requestSender.handleTaskNotification(mockTask.id);
// expectation
expect(response.status).toBe(httpStatusCodes.OK);
expect(response).toSatisfyApiSpec();
});

it.each(deleteCacheJobTypes)(
'should return 200 and fail the job when getting failed tiles-deletion task - $jobTypeKey',
async ({ jobTypeKey }) => {
// mocks
const reason = 'Tiles deletion failed due to storage error';
const mockJob = getDeleteCacheJobMock(jobDefinitionsConfig.jobs[jobTypeKey]);
const mockTask = getTaskMock(mockJob.id, { type: jobDefinitionsConfig.tasks.tilesDeletion, status: OperationStatus.FAILED, reason });
nock(jobManagerConfigMock.jobManagerBaseUrl).post('/tasks/find', { id: mockTask.id }).reply(httpStatusCodes.OK, [mockTask]);
nock(jobManagerConfigMock.jobManagerBaseUrl)
.get(`/jobs/${mockJob.id}`)
.query({ shouldReturnTasks: false })
.reply(httpStatusCodes.OK, mockJob);
nock(jobManagerConfigMock.jobManagerBaseUrl).put(`/jobs/${mockJob.id}`, { status: OperationStatus.FAILED, reason }).reply(httpStatusCodes.OK);
// action
const response = await requestSender.handleTaskNotification(mockTask.id);
// expectation
expect(response.status).toBe(httpStatusCodes.OK);
expect(response).toSatisfyApiSpec();
}
);
});
});
Loading
Loading