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