From 760f0e16ce7f58d29037e847608383cf64c31adb Mon Sep 17 00:00:00 2001 From: Viktor Vorobev <vorobev@in.tum.de> Date: Tue, 13 Jun 2023 10:02:07 +0000 Subject: [PATCH] Merged in NRRPLT-8912 (pull request #48) [NRRPLT-8912][NRRPLT-8913] Fix local storage cloning and launching * [NRRPLT-8912][NRRPLT-8913] Fix local storage cloning and launching * [NRRPLT-8912] fixing execution tests * [NRRPLT-8919] Added new client and authentication page * [NRRPLT-8919] Added new client and authentication page * [NRRPLT-8919] .gitignore updated * [NRRPLT-8912]mock authentification for collab mode only * [NRRPLT-0000] fix integrity in package-lock Approved-by: jules.lecomte --- .dockerignore | 1 + .gitignore | 3 +++ package.json | 2 +- src/config.json.sample.docker | 2 +- src/config.json.sample.local | 2 +- src/config.json.sample.oidc | 21 +++++++++++++++++++ src/mocks/mock_experiments.json | 6 ++++-- src/mocks/mock_server-config.json | 4 +--- .../experiment-execution-service.test.js | 13 ++++++++++-- .../execution/experiment-execution-service.js | 5 +++-- .../experiment-storage-service.test.js | 16 +++++++------- .../public-experiments-service.test.js | 2 +- .../files/public-experiments-service.js | 4 ++-- 13 files changed, 58 insertions(+), 23 deletions(-) create mode 100644 src/config.json.sample.oidc diff --git a/.dockerignore b/.dockerignore index 9e8f950..52312c4 100644 --- a/.dockerignore +++ b/.dockerignore @@ -8,3 +8,4 @@ Jenkinsfile src/config.json* !src/config.json.sample.docker +!src/config.json.sample.oidc diff --git a/.gitignore b/.gitignore index 9abf327..ca0e1fe 100644 --- a/.gitignore +++ b/.gitignore @@ -56,3 +56,6 @@ coverage junit.xml src/config.json.local src/config.json.* + +!src/config.json.sample.docker +!src/config.json.sample.oidc diff --git a/package.json b/package.json index 18d2171..b8ed19b 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "src/services/experiments/files/remote-experiment-files-service.js" ] }, - "version": "0.1.0", + "version": "4.0.0", "private": true, "dependencies": { "@babel/runtime": "^7.20.13", diff --git a/src/config.json.sample.docker b/src/config.json.sample.docker index 6242f39..1cb3c67 100644 --- a/src/config.json.sample.docker +++ b/src/config.json.sample.docker @@ -6,7 +6,7 @@ }, "auth": { "enableOIDC": false, - "clientId": "nrp_test_frontend", + "clientId": "nrp-test-frontend", "url": "/authentication/loginpage?origin=FS" }, "mqtt": { diff --git a/src/config.json.sample.local b/src/config.json.sample.local index 6242f39..1cb3c67 100644 --- a/src/config.json.sample.local +++ b/src/config.json.sample.local @@ -6,7 +6,7 @@ }, "auth": { "enableOIDC": false, - "clientId": "nrp_test_frontend", + "clientId": "nrp-test-frontend", "url": "/authentication/loginpage?origin=FS" }, "mqtt": { diff --git a/src/config.json.sample.oidc b/src/config.json.sample.oidc new file mode 100644 index 0000000..08c86f8 --- /dev/null +++ b/src/config.json.sample.oidc @@ -0,0 +1,21 @@ +{ + "api": { + "proxy": { + "url": "http://localhost:9000/proxy" + } + }, + "auth": { + "enableOIDC": true, + "clientId": "nrp-test-frontend", + "url": "https://iam-int.ebrains.eu/auth/" + }, + "mqtt": { + "url": "localhost", + "port": "9000", + "topics": { + "base": "nrp_simulation", + "errors": "runtime_error", + "status": "status" + } + } +} diff --git a/src/mocks/mock_experiments.json b/src/mocks/mock_experiments.json index 48c26f0..0f8998f 100644 --- a/src/mocks/mock_experiments.json +++ b/src/mocks/mock_experiments.json @@ -1,11 +1,12 @@ [ { "uuid": "husky_braitenberg_unfilled_uuid", - "experimentId": "husky_braitenberg_unfilled_namedirectory%2Fsimulation_config.json", + "name": "husky_braitenberg_unfilled_namedirectory%2Fsimulation_config.json", "owned": true, "joinableServers": [], "configuration": { "maturity": "production", + "experimentId": "husky_braitenberg_unfilled_namedirectory%2Fsimulation_config.json", "SimulationName": "husky_simulation_0", "SimulationDescription": "Launches a Gazebo simulation with a Husky robot and a Nest sim with a Braitenberg model which controls the robot", "thumbnail": "/", @@ -47,11 +48,12 @@ }, { "uuid": "husky_braitenberg_cg_uuid", - "experimentId": "husky_braitenberg_cg_name%2Fsimulation_config.json", + "name": "husky_braitenberg_cg_name%2Fsimulation_config.json", "owned": true, "joinableServers": [], "configuration": { "maturity": "production", + "experimentId": "husky_braitenberg_unfilled_namedirectory%2Fsimulation_config.json", "SimulationName": "husky_simulation_1", "SimulationDescription": "Adaptation of the example `husky_braitenberg` in which a Computational Graph (CG) is used to process and rely data between Engines.", "SimulationTimeout": 20, diff --git a/src/mocks/mock_server-config.json b/src/mocks/mock_server-config.json index 88261c0..129183c 100644 --- a/src/mocks/mock_server-config.json +++ b/src/mocks/mock_server-config.json @@ -1,8 +1,6 @@ { "internalIp": "http://localhost:8080", - "gzweb": { - "nrp-services": "http://localhost:8080" - }, + "nrp-services": "http://localhost:8080", "serverJobLocation": "local", "id": "localhost" } \ No newline at end of file diff --git a/src/services/experiments/execution/__tests__/experiment-execution-service.test.js b/src/services/experiments/execution/__tests__/experiment-execution-service.test.js index ebbcf06..239e09c 100644 --- a/src/services/experiments/execution/__tests__/experiment-execution-service.test.js +++ b/src/services/experiments/execution/__tests__/experiment-execution-service.test.js @@ -13,12 +13,17 @@ import ExperimentExecutionService from '../../../../services/experiments/executi import SimulationService from '../../../../services/experiments/execution/running-simulation-service'; import ServerResourcesService from '../../../../services/experiments/execution/server-resources-service'; import { EXPERIMENT_STATE } from '../../../../services/experiments/experiment-constants.js'; +import config from '../../../../config.json'; +jest.mock('../../../authentication-service.js'); //jest.setTimeout(10000); beforeEach(() => { //jest.genMockFromModule('AuthenticationService'); //jest.mock('AuthenticationService'); + if (config.auth.enableOIDC) { + jest.mock('../../../authentication-service.js'); + } }); afterEach(() => { @@ -78,7 +83,7 @@ describe('ExperimentExecutionService', () => { jest.spyOn(ExperimentExecutionService.instance, 'launchExperimentOnServer').mockImplementation( // only the last server in the list will return a successful launch - (id,privateparam,serverID,serverConfig, progressCallback) => { + (id,privateparam,configFile,serverID,serverConfig, progressCallback) => { properServerID = serverID; return Promise.resolve(); } @@ -131,12 +136,16 @@ describe('ExperimentExecutionService', () => { let mockExperiment = { id: 'test-experiment-id', - devServer: 'test-dev-server-url' + devServer: 'test-dev-server-url', + configuration: { + configFile: 'test_config.json' + } }; await ExperimentExecutionService.instance.startNewExperiment(mockExperiment, true); expect(ExperimentExecutionService.instance.launchExperimentOnServer).toHaveBeenCalledWith( mockExperiment.id, undefined, + mockExperiment.configuration.configFile, mockExperiment.devServer, undefined, expect.any(Function) diff --git a/src/services/experiments/execution/experiment-execution-service.js b/src/services/experiments/execution/experiment-execution-service.js index 7a2e794..6f5af6c 100644 --- a/src/services/experiments/execution/experiment-execution-service.js +++ b/src/services/experiments/execution/experiment-execution-service.js @@ -45,7 +45,7 @@ class ExperimentExecutionService extends HttpService { ExperimentExecutionService.instance.emit(ExperimentExecutionService.EVENTS.START_EXPERIMENT, experiment); let serversToTry = experiment.devServer ? [experiment.devServer] - : (await ServerResourcesService.instance.getServerAvailability(false)) + : (await ServerResourcesService.instance.getServerAvailability(true)) .map(s => s.id); //TODO: placeholder, register actual progress callback later @@ -80,6 +80,7 @@ class ExperimentExecutionService extends HttpService { return await this.launchExperimentOnServer( experiment.id, experiment.private, + experiment.configuration.configFile, serverID, serverConfig, progressCallback @@ -188,7 +189,7 @@ class ExperimentExecutionService extends HttpService { .getServerConfig(simulation.server) .then((serverConfig) => { if (serverConfig) { - serverURL = serverConfig.gzweb['nrp-services']; + serverURL = serverConfig['nrp-services']; simulationID = simulation.runningSimulation.simulationID; } function updateSimulationState(state) { diff --git a/src/services/experiments/files/__tests__/experiment-storage-service.test.js b/src/services/experiments/files/__tests__/experiment-storage-service.test.js index a3649e8..9983911 100644 --- a/src/services/experiments/files/__tests__/experiment-storage-service.test.js +++ b/src/services/experiments/files/__tests__/experiment-storage-service.test.js @@ -129,7 +129,7 @@ describe('ExperimentStorageService', () => { // TODO: [NRRPLT-8681] test('gets a thumbnail image for experiments', async () => { let experiment = MockExperiments[0]; - const imageBlob = await ExperimentStorageService.instance.getThumbnail(experiment.experimentId, + const imageBlob = await ExperimentStorageService.instance.getThumbnail(experiment.name, experiment.configuration.thumbnail); expect(imageBlob).toBeDefined(); }); @@ -203,16 +203,16 @@ describe('ExperimentStorageService', () => { let data = []; let entityName = 'someEntity.txt'; - const res1 = await (await ExperimentStorageService.instance.setFile(MockExperiments[0].experimentId, entityName, data)).json(); - const res2 = await (await ExperimentStorageService.instance.setFile(MockExperiments[0].experimentId, entityName, data, false, 'application/json')).json(); - const res3 = await (await ExperimentStorageService.instance.setFile(MockExperiments[0].experimentId, entityName, data, true, 'application/octet-stream')).json(); - const res4 = await ExperimentStorageService.instance.setFile(MockExperiments[0].experimentId, entityName, data, true, 'throw-error'); + const res1 = await (await ExperimentStorageService.instance.setFile(MockExperiments[0].name, entityName, data)).json(); + const res2 = await (await ExperimentStorageService.instance.setFile(MockExperiments[0].name, entityName, data, false, 'application/json')).json(); + const res3 = await (await ExperimentStorageService.instance.setFile(MockExperiments[0].name, entityName, data, true, 'application/octet-stream')).json(); + const res4 = await ExperimentStorageService.instance.setFile(MockExperiments[0].name, entityName, data, true, 'throw-error'); // In total, only 3 requests should be sent (4th gives error) expect(ExperimentStorageService.instance.httpRequestPOST).toHaveBeenCalledTimes(3); // checking 1st call - let expectedArg = `${endpoints.proxy.storage.url}/${MockExperiments[0].experimentId}/${entityName}?byname=true`; + let expectedArg = `${endpoints.proxy.storage.url}/${MockExperiments[0].name}/${entityName}?byname=true`; expect(ExperimentStorageService.instance.httpRequestPOST).toHaveBeenNthCalledWith( 1, expectedArg, @@ -222,7 +222,7 @@ describe('ExperimentStorageService', () => { expect(res1.type).toEqual('text/plain'); // checking 2nd call - expectedArg = `${endpoints.proxy.storage.url}/${MockExperiments[0].experimentId}/${entityName}?byname=false`; + expectedArg = `${endpoints.proxy.storage.url}/${MockExperiments[0].name}/${entityName}?byname=false`; expect(ExperimentStorageService.instance.httpRequestPOST).toHaveBeenNthCalledWith( 2, expectedArg, @@ -232,7 +232,7 @@ describe('ExperimentStorageService', () => { expect(res2.type).toEqual('application/json'); // checking 3rd call - expectedArg = `${endpoints.proxy.storage.url}/${MockExperiments[0].experimentId}/${entityName}?byname=true`; + expectedArg = `${endpoints.proxy.storage.url}/${MockExperiments[0].name}/${entityName}?byname=true`; expect(ExperimentStorageService.instance.httpRequestPOST).toHaveBeenNthCalledWith( 3, expectedArg, diff --git a/src/services/experiments/files/__tests__/public-experiments-service.test.js b/src/services/experiments/files/__tests__/public-experiments-service.test.js index a5b0a69..5ea3ef1 100644 --- a/src/services/experiments/files/__tests__/public-experiments-service.test.js +++ b/src/services/experiments/files/__tests__/public-experiments-service.test.js @@ -160,7 +160,7 @@ describe('PublicExperimentsService', () => { await PublicExperimentsService.instance.cloneExperiment(MockExperiments[0]); expect(PublicExperimentsService.instance.httpRequestPOST).toBeCalledWith( - `${endpoints.proxy.storage.clone.url}/${MockExperiments[0].experimentId}` + `${endpoints.proxy.storage.clone.url}`, JSON.stringify({ expPath: `${MockExperiments[0].configuration.experimentId}` }) ); }); }); diff --git a/src/services/experiments/files/public-experiments-service.js b/src/services/experiments/files/public-experiments-service.js index 4696976..fca54fd 100644 --- a/src/services/experiments/files/public-experiments-service.js +++ b/src/services/experiments/files/public-experiments-service.js @@ -166,8 +166,8 @@ class PublicExperimentsService extends HttpProxyService { * @param {Object} experiment The Experiment configuration */ async cloneExperiment(experiment) { - let experimentConfigFilepath = experiment.experimentId; - this.httpRequestPOST(cloneURL+ '/' + experimentConfigFilepath); + let experimentConfigFilepath = experiment.configuration.experimentId; + this.httpRequestPOST(cloneURL, JSON.stringify({ expPath: experimentConfigFilepath })); } } -- GitLab