From ca6eab8504f0258cd1271e6b6c938c5f5ec29899 Mon Sep 17 00:00:00 2001 From: George Raduta Date: Mon, 25 May 2026 16:10:45 +0200 Subject: [PATCH] Use existing middleware to check if existing detectors are still active --- Control/lib/api.js | 4 +++ .../deployment/api-post-deployment.test.js | 27 ++++++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/Control/lib/api.js b/Control/lib/api.js index ecfa63ee3..ab44267d9 100644 --- a/Control/lib/api.js +++ b/Control/lib/api.js @@ -26,6 +26,8 @@ const {logDeploymentRequestMiddleware} = require('./middleware/logDeploymentRequ const {minimumRoleMiddleware} = require('./middleware/minimumRole.middleware.js'); const {requireDetectorOrGlobalRoleMiddleware} = require('./middleware/requireDetectorOrGlobalRole.middleware.js'); const {validateConsulServiceMiddlewareFactory} = require('./middleware/validateConsulServiceMiddlewareFactory.js'); +/* eslint-disable max-len */ +const {verifyDetectorsAvailabilityMiddlewareFactory} = require('./middleware/verifyDetectorsAvailabilityMiddlewareFactory.middleware.js'); const { setDetectorsFromEnvironmentMiddlewareFactory @@ -176,6 +178,7 @@ module.exports.setup = (http, ws) => { const setDetectorsFromEnvironmentMiddleware = setDetectorsFromEnvironmentMiddlewareFactory(environmentService); const verifyLockOwnershipMiddleware = getDetectorsLockOwnershipMiddlewareFactory(lockService); const validateConsulServiceMiddleware = validateConsulServiceMiddlewareFactory(consulService); + const verifyDetectorsAvailabilityMiddleware = verifyDetectorsAvailabilityMiddlewareFactory(detectorService); ctrlProxy.methods.forEach( (method) => http.post(`/${method}`, coreMiddleware, (req, res) => ctrlService.executeCommand(req, res)), @@ -215,6 +218,7 @@ module.exports.setup = (http, ws) => { logDeploymentRequestMiddleware, minimumRoleMiddleware(Role.DETECTOR), verifyLockOwnershipMiddleware, + verifyDetectorsAvailabilityMiddleware, deploymentController.newAsyncDeploymentHandler.bind(deploymentController) ); diff --git a/Control/test/api/deployment/api-post-deployment.test.js b/Control/test/api/deployment/api-post-deployment.test.js index e737d9008..3880c175f 100644 --- a/Control/test/api/deployment/api-post-deployment.test.js +++ b/Control/test/api/deployment/api-post-deployment.test.js @@ -13,7 +13,7 @@ */ const request = require('supertest'); -const { DET_MID_TEST_TOKEN, GUEST_TEST_TOKEN, TEST_URL } = require('../generateToken.js'); +const { DET_MID_TEST_TOKEN, GLOBAL_TEST_TOKEN, GUEST_TEST_TOKEN, TEST_URL } = require('../generateToken.js'); const { DetectorLockAction } = require('../../../lib/common/lock/detectorLockAction.enum.js'); describe('POST /deploy', function () { @@ -91,4 +91,29 @@ describe('POST /deploy', function () { ODC: { name: 'ODC', state: 'FREE' } }); }); + + it('should reject deployment request due to detectors being currently active in ECS', async function () { + // Take the DCS lock with a GLOBAL user to pass the lock ownership middleware + await request(`${TEST_URL}/api/locks`) + .put(`/${DetectorLockAction.TAKE}/DCS?token=${GLOBAL_TEST_TOKEN}`) + .expect(200); + + await request(`${TEST_URL}/api`) + .post(`/deploy?token=${GLOBAL_TEST_TOKEN}`) + .send({ + workflowTemplate: 'test-template', + detectors: ['DCS'], + userVars: { foo: 'bar' } + }) + .expect(503, { + message: 'Requested detectors DCS are not available', + status: 503, + title: 'Service Unavailable' + }); + + // Release the DCS lock after the test so that tests are not chained + await request(`${TEST_URL}/api/locks`) + .put(`/${DetectorLockAction.RELEASE}/DCS?token=${GLOBAL_TEST_TOKEN}`) + .expect(200); + }); });