From 3fe5e8d42cabded3097444abebc545f9de7e9416 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 21 Mar 2024 09:14:49 +0000 Subject: [PATCH 01/24] fix(deps): update dependency bootstrap to v5.3.3 --- ui/package.json | 2 +- ui/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ui/package.json b/ui/package.json index f11da6056..7235eada4 100644 --- a/ui/package.json +++ b/ui/package.json @@ -12,7 +12,7 @@ }, "dependencies": { "@popperjs/core": "2.11.8", - "bootstrap": "5.3.2", + "bootstrap": "5.3.3", "bootstrap-icons": "1.11.3", "vue": "3.3.8", "vue-router": "^4.0.13" diff --git a/ui/yarn.lock b/ui/yarn.lock index ff6f17a65..28803c387 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -1254,10 +1254,10 @@ bootstrap-icons@1.11.3: resolved "https://registry.yarnpkg.com/bootstrap-icons/-/bootstrap-icons-1.11.3.tgz#03f9cb754ec005c52f9ee616e2e84a82cab3084b" integrity sha512-+3lpHrCw/it2/7lBL15VR0HEumaBss0+f/Lb6ZvHISn1mlK83jjFpooTLsMWbIjJMDjDjOExMsTxnXSIT4k4ww== -bootstrap@5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.3.2.tgz#97226583f27aae93b2b28ab23f4c114757ff16ae" - integrity sha512-D32nmNWiQHo94BKHLmOrdjlL05q1c8oxbtBphQFb9Z5to6eGRDCm0QgeaZ4zFBHzfg2++rqa2JkqCcxDy0sH0g== +bootstrap@5.3.3: + version "5.3.3" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.3.3.tgz#de35e1a765c897ac940021900fcbb831602bac38" + integrity sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg== brace-expansion@^1.1.7: version "1.1.11" From 57e6232969692a008e8a8bdc4c195549349cc7b5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 4 Apr 2024 03:08:13 +0000 Subject: [PATCH 02/24] chore(deps): update dependency vite to v4.5.3 [security] --- ui/package.json | 2 +- ui/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ui/package.json b/ui/package.json index f11da6056..dd34902b0 100644 --- a/ui/package.json +++ b/ui/package.json @@ -35,6 +35,6 @@ "ts-node": "10.9.2", "tslib": "2.6.2", "typescript": "4.9.5", - "vite": "4.5.2" + "vite": "4.5.3" } } diff --git a/ui/yarn.lock b/ui/yarn.lock index ff6f17a65..a0fcd91e9 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -3321,10 +3321,10 @@ v8-to-istanbul@^9.0.1: "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^2.0.0" -vite@4.5.2: - version "4.5.2" - resolved "https://registry.yarnpkg.com/vite/-/vite-4.5.2.tgz#d6ea8610e099851dad8c7371599969e0f8b97e82" - integrity sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w== +vite@4.5.3: + version "4.5.3" + resolved "https://registry.yarnpkg.com/vite/-/vite-4.5.3.tgz#d88a4529ea58bae97294c7e2e6f0eab39a50fb1a" + integrity sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg== dependencies: esbuild "^0.18.10" postcss "^8.4.27" From bf3a2ad6e45a9ed4734e085f7c90930a7c1c6c78 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 12 Apr 2024 05:31:56 +0000 Subject: [PATCH 03/24] chore(deps): update dependency idna to v3.7 [security] --- scripts/upgrade/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/upgrade/requirements.txt b/scripts/upgrade/requirements.txt index 82922ae53..1409a9a5d 100644 --- a/scripts/upgrade/requirements.txt +++ b/scripts/upgrade/requirements.txt @@ -6,7 +6,7 @@ cffi==1.16.0; python_version >= '3.8' charset-normalizer==3.3.2; python_full_version >= '3.7.0' deprecated==1.2.14; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' fusionauth-client==1.49.1 -idna==3.6; python_version >= '3.5' +idna==3.7; python_version >= '3.5' minio==7.2.5 numpy==1.24.4; python_version >= '3.8' pandas==2.0.3; python_version >= '3.8' From 26516d5f550fabbf90ca98592863a7f4acb36243 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 2 May 2024 13:45:01 +0000 Subject: [PATCH 04/24] chore(deps): update babel monorepo --- ui/package.json | 4 ++-- ui/yarn.lock | 61 ++++++++++++++++--------------------------------- 2 files changed, 22 insertions(+), 43 deletions(-) diff --git a/ui/package.json b/ui/package.json index e1e1929ba..0af736ac2 100644 --- a/ui/package.json +++ b/ui/package.json @@ -18,8 +18,8 @@ "vue-router": "^4.0.13" }, "devDependencies": { - "@babel/core": "7.23.7", - "@babel/preset-typescript": "7.23.3", + "@babel/core": "7.24.5", + "@babel/preset-typescript": "7.24.1", "@types/jest": "29.5.12", "@types/node": "20.9.0", "@types/vue": "^2.0.0", diff --git a/ui/yarn.lock b/ui/yarn.lock index 2effe94a0..bc8e2ec47 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -23,28 +23,7 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a" integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ== -"@babel/core@7.23.7": - version "7.23.7" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.7.tgz#4d8016e06a14b5f92530a13ed0561730b5c6483f" - integrity sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.23.5" - "@babel/generator" "^7.23.6" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.23.7" - "@babel/parser" "^7.23.6" - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.7" - "@babel/types" "^7.23.6" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9": +"@babel/core@7.24.5", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.5.tgz#15ab5b98e101972d171aeef92ac70d8d6718f06a" integrity sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA== @@ -65,7 +44,7 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.23.6", "@babel/generator@^7.24.5", "@babel/generator@^7.7.2": +"@babel/generator@^7.24.5", "@babel/generator@^7.7.2": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.5.tgz#e5afc068f932f05616b66713e28d0f04e99daeb3" integrity sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA== @@ -160,7 +139,7 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.24.5", "@babel/helper-plugin-utils@^7.8.0": +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.24.5", "@babel/helper-plugin-utils@^7.8.0": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz#a924607dd254a65695e5bd209b98b902b3b2f11a" integrity sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ== @@ -205,12 +184,12 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62" integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA== -"@babel/helper-validator-option@^7.22.15", "@babel/helper-validator-option@^7.23.5": +"@babel/helper-validator-option@^7.23.5": version "7.23.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== -"@babel/helpers@^7.23.7", "@babel/helpers@^7.24.5": +"@babel/helpers@^7.24.5": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.5.tgz#fedeb87eeafa62b621160402181ad8585a22a40a" integrity sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q== @@ -229,7 +208,7 @@ js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.0", "@babel/parser@^7.23.6", "@babel/parser@^7.23.9", "@babel/parser@^7.24.0", "@babel/parser@^7.24.4", "@babel/parser@^7.24.5": +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.0", "@babel/parser@^7.23.9", "@babel/parser@^7.24.0", "@babel/parser@^7.24.4", "@babel/parser@^7.24.5": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.5.tgz#4a4d5ab4315579e5398a82dcf636ca80c3392790" integrity sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg== @@ -269,7 +248,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.23.3", "@babel/plugin-syntax-jsx@^7.7.2": +"@babel/plugin-syntax-jsx@^7.24.1", "@babel/plugin-syntax-jsx@^7.7.2": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz#3f6ca04b8c841811dbc3c5c5f837934e0d626c10" integrity sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA== @@ -332,7 +311,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-modules-commonjs@^7.2.0", "@babel/plugin-transform-modules-commonjs@^7.23.3": +"@babel/plugin-transform-modules-commonjs@^7.2.0", "@babel/plugin-transform-modules-commonjs@^7.24.1": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz#e71ba1d0d69e049a22bf90b3867e263823d3f1b9" integrity sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw== @@ -341,7 +320,7 @@ "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-simple-access" "^7.22.5" -"@babel/plugin-transform-typescript@^7.23.3": +"@babel/plugin-transform-typescript@^7.24.1": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.5.tgz#bcba979e462120dc06a75bd34c473a04781931b8" integrity sha512-E0VWu/hk83BIFUWnsKZ4D81KXjN5L3MobvevOHErASk9IPwKHOkTgvqzvNo1yP/ePJWqqK2SpUR5z+KQbl6NVw== @@ -351,16 +330,16 @@ "@babel/helper-plugin-utils" "^7.24.5" "@babel/plugin-syntax-typescript" "^7.24.1" -"@babel/preset-typescript@7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz#14534b34ed5b6d435aa05f1ae1c5e7adcc01d913" - integrity sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ== +"@babel/preset-typescript@7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.24.1.tgz#89bdf13a3149a17b3b2a2c9c62547f06db8845ec" + integrity sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-option" "^7.22.15" - "@babel/plugin-syntax-jsx" "^7.23.3" - "@babel/plugin-transform-modules-commonjs" "^7.23.3" - "@babel/plugin-transform-typescript" "^7.23.3" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-validator-option" "^7.23.5" + "@babel/plugin-syntax-jsx" "^7.24.1" + "@babel/plugin-transform-modules-commonjs" "^7.24.1" + "@babel/plugin-transform-typescript" "^7.24.1" "@babel/template@^7.22.15", "@babel/template@^7.24.0", "@babel/template@^7.3.3": version "7.24.0" @@ -371,7 +350,7 @@ "@babel/parser" "^7.24.0" "@babel/types" "^7.24.0" -"@babel/traverse@^7.23.7", "@babel/traverse@^7.24.5": +"@babel/traverse@^7.24.5": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.5.tgz#972aa0bc45f16983bf64aa1f877b2dd0eea7e6f8" integrity sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA== @@ -387,7 +366,7 @@ debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.6", "@babel/types@^7.24.0", "@babel/types@^7.24.5", "@babel/types@^7.3.3": +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.0", "@babel/types@^7.24.5", "@babel/types@^7.3.3": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.5.tgz#7661930afc638a5383eb0c4aee59b74f38db84d7" integrity sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ== From f1871386c141b0bdc73c8d66336208b42cd7c5b0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 18 Jun 2024 02:37:20 +0000 Subject: [PATCH 05/24] chore(deps): update dependency urllib3 to v2.2.2 [security] --- scripts/upgrade/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/upgrade/requirements.txt b/scripts/upgrade/requirements.txt index 82922ae53..7dc7d4fd4 100644 --- a/scripts/upgrade/requirements.txt +++ b/scripts/upgrade/requirements.txt @@ -19,5 +19,5 @@ simple-term-menu==1.6.4; python_version ~= '3.5' six==1.16.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' typing-extensions==4.10.0; python_version >= '3.8' tzdata==2024.1; python_version >= '2' -urllib3==2.2.1; python_version >= '3.8' +urllib3==2.2.2; python_version >= '3.8' wrapt==1.16.0; python_version >= '3.6' From 47f8fba08dab4715bbb6de41f9a8e8d887b2d129 Mon Sep 17 00:00:00 2001 From: mkslofstra Date: Fri, 21 Jun 2024 15:09:51 +0200 Subject: [PATCH 06/24] refactor(RockConnection): replace resttemplate with restclient (WIP) --- .../org/molgenis/r/rock/RockConnection.java | 144 ++++++++++++------ 1 file changed, 98 insertions(+), 46 deletions(-) diff --git a/r/src/main/java/org/molgenis/r/rock/RockConnection.java b/r/src/main/java/org/molgenis/r/rock/RockConnection.java index d77c4b6a5..b5be12331 100644 --- a/r/src/main/java/org/molgenis/r/rock/RockConnection.java +++ b/r/src/main/java/org/molgenis/r/rock/RockConnection.java @@ -17,6 +17,7 @@ import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.client.ResponseExtractor; +import org.springframework.web.client.RestClient; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; @@ -24,65 +25,86 @@ public class RockConnection implements RServerConnection { private static final Logger logger = LoggerFactory.getLogger(RockConnection.class); + public static final String FILE_DOWNLOAD_FAILED = "File download failed: "; + public static final MediaType MEDIATYPE_APPLICATION_RSCRIPT = + MediaType.valueOf("application/x-rscript"); + private static final String UPLOAD_FAILED = "File upload failed: "; + private static final String UPLOAD_ENDPOINT = "/_upload"; + private static final String EVAL_ENDPOINT = "/_eval"; + public static final String DOWNLOAD_ENDPOINT = "/_download"; + private static final String PATH = "path"; + private static final String OVERWRITE = "overwrite"; + private static final String FILE = "file"; private String rockSessionId; private final RockApplication application; + private final RestClient restClient; public RockConnection(RockApplication application) throws RServerException { this.application = application; + this.restClient = getRestClient(); openSession(); } @Override - public RServerResult eval(String expr, boolean serialized) throws RServerException { - RestTemplate restTemplate = new RestTemplate(); - HttpHeaders headers = createHeaders(); - headers.setContentType(MediaType.valueOf("application/x-rscript")); - - String serverUrl = getRSessionResourceUrl("/_eval"); + public RServerResult eval(String expr, boolean serialized) { + String serverUrl = getRSessionResourceUrl(EVAL_ENDPOINT); if (serialized) { - // accept application/octet-stream - headers.setAccept( - Lists.newArrayList(MediaType.APPLICATION_OCTET_STREAM, MediaType.APPLICATION_JSON)); - ResponseEntity response = - restTemplate.exchange( - serverUrl, HttpMethod.POST, new HttpEntity<>(expr, headers), byte[].class); - return new RockResult(response.getBody()); + RestClient.RequestBodySpec request = + createRequestForPost(serverUrl, expr, MEDIATYPE_APPLICATION_RSCRIPT); + byte[] responseBody = + request + .headers( + httpHeaders -> { + httpHeaders.setAccept( + Lists.newArrayList( + MediaType.APPLICATION_OCTET_STREAM, MediaType.APPLICATION_JSON)); + }) + .retrieve() + .body(byte[].class); + return new RockResult(responseBody); } else { + RestTemplate restTemplate = new RestTemplate(); + HttpHeaders headers = createHeaders(); + headers.setContentType(MEDIATYPE_APPLICATION_RSCRIPT); headers.setAccept(Lists.newArrayList(MediaType.APPLICATION_JSON)); ResponseEntity response = restTemplate.exchange( serverUrl, HttpMethod.POST, new HttpEntity<>(expr, headers), String.class); String jsonSource = response.getBody(); return new RockResult(jsonSource); + // RestClient.RequestBodySpec request = createRequestForPost(serverUrl, expr, + // MEDIATYPE_APPLICATION_RSCRIPT); + // String responseBody = request.headers(httpHeaders -> { + // httpHeaders.setAccept(Lists.newArrayList(MediaType.APPLICATION_JSON)); + // }).retrieve().body(String.class); + // return new RockResult(responseBody); } } @Override public void writeFile(String fileName, InputStream in) throws RServerException { try { - HttpHeaders headers = createHeaders(); - headers.setContentType(MediaType.MULTIPART_FORM_DATA); MultiValueMap body = new LinkedMultiValueMap<>(); - body.add("file", new MultiPartInputStreamResource(in, fileName)); - HttpEntity> requestEntity = new HttpEntity<>(body, headers); + body.add(FILE, new MultiPartInputStreamResource(in, fileName)); - String serverUrl = getRSessionResourceUrl("/_upload"); + String serverUrl = getRSessionResourceUrl(UPLOAD_ENDPOINT); UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(serverUrl) - .queryParam("path", fileName) - .queryParam("overwrite", true); + .queryParam(PATH, fileName) + .queryParam(OVERWRITE, true); + + ResponseEntity response = + postToRestClient(builder.toUriString(), body, MediaType.MULTIPART_FORM_DATA) + .toBodilessEntity(); - RestTemplate restTemplate = new RestTemplate(); - ResponseEntity response = - restTemplate.postForEntity(builder.toUriString(), requestEntity, String.class); if (!response.getStatusCode().is2xxSuccessful()) { logger.error("File upload to {} failed: {}", serverUrl, response.getStatusCode()); - throw new RockServerException("File upload failed: " + response.getStatusCode()); + throw new RockServerException(UPLOAD_FAILED + response.getStatusCode()); } } catch (RestClientException e) { - throw new RockServerException("File upload failed", e); + throw new RockServerException(UPLOAD_FAILED, e); } } @@ -93,9 +115,15 @@ public void readFile(String fileName, Consumer inputStreamConsumer) HttpHeaders headers = createHeaders(); headers.setAccept(Collections.singletonList(MediaType.ALL)); - String serverUrl = getRSessionResourceUrl("/_download"); + String serverUrl = getRSessionResourceUrl(DOWNLOAD_ENDPOINT); + UriComponentsBuilder builder = - UriComponentsBuilder.fromHttpUrl(serverUrl).queryParam("path", fileName); + UriComponentsBuilder.fromHttpUrl(serverUrl).queryParam(PATH, fileName); + // RestClient.ResponseSpec response = restClient.get() + // .uri(builder.build().toUri()) + // .headers(httpHeaders -> { + // headers.setAccept(Collections.singletonList(MediaType.ALL)); + // }).retrieve(); RestTemplate restTemplate = new RestTemplate(); restTemplate.execute( @@ -103,18 +131,17 @@ public void readFile(String fileName, Consumer inputStreamConsumer) HttpMethod.GET, request -> request.getHeaders().putAll(headers), (ResponseExtractor) - response -> { - if (!response.getStatusCode().is2xxSuccessful()) { - logger.error( - "File download from {} failed: {}", serverUrl, response.getStatusCode()); - throw new RuntimeException("File download failed: " + response.getStatusText()); + resp -> { + if (!resp.getStatusCode().is2xxSuccessful()) { + logger.error("File download from {} failed: {}", serverUrl, resp.getStatusCode()); + throw new RuntimeException(FILE_DOWNLOAD_FAILED + resp.getStatusText()); } else { - inputStreamConsumer.accept(response.getBody()); + inputStreamConsumer.accept(resp.getBody()); } return null; }); } catch (RestClientException e) { - throw new RockServerException("File download failed", e); + throw new RockServerException(FILE_DOWNLOAD_FAILED, e); } } @@ -141,14 +168,13 @@ public boolean close() { private void openSession() throws RServerException { try { - RestTemplate restTemplate = new RestTemplate(); - ResponseEntity response = - restTemplate.exchange( - getRSessionsResourceUrl(), - HttpMethod.POST, - new HttpEntity<>(createHeaders()), - RockSessionInfo.class); - RockSessionInfo info = response.getBody(); + RockSessionInfo info = + postToRestClient( + getRSessionsResourceUrl(), + new LinkedMultiValueMap<>(), + MediaType.APPLICATION_JSON) + .body(RockSessionInfo.class); + assert info != null; this.rockSessionId = info.getId(); } catch (RestClientException e) { throw new RockServerException("Failure when opening a Rock R session", e); @@ -163,17 +189,43 @@ private String getRSessionResourceUrl(String path) { return String.format("%s/r/session/%s%s", application.getUrl(), rockSessionId, path); } + private String getAuthHeader() { + String auth = application.getUser() + ":" + application.getPassword(); + byte[] encodedAuth = Base64.getEncoder().encode(auth.getBytes(StandardCharsets.UTF_8)); + return "Basic " + new String(encodedAuth); + } + private HttpHeaders createHeaders() { return new HttpHeaders() { { - String auth = application.getUser() + ":" + application.getPassword(); - byte[] encodedAuth = Base64.getEncoder().encode(auth.getBytes(StandardCharsets.UTF_8)); - String authHeader = "Basic " + new String(encodedAuth); - add("Authorization", authHeader); + add("Authorization", getAuthHeader()); } }; } + private RestClient getRestClient() { + String serverUrl = getRSessionResourceUrl(UPLOAD_ENDPOINT); + String authHeader = getAuthHeader(); + return RestClient.builder() + .baseUrl(serverUrl) + .defaultHeaders( + httpHeaders -> { + httpHeaders.setBasicAuth(authHeader); + httpHeaders.set(HttpHeaders.AUTHORIZATION, authHeader); + }) + .build(); + } + + private RestClient.RequestBodySpec createRequestForPost( + String uriString, Object body, MediaType contentType) { + return restClient.post().uri(uriString).contentType(contentType).body(body); + } + + private RestClient.ResponseSpec postToRestClient( + String uriString, Object body, MediaType contentType) { + return createRequestForPost(uriString, body, contentType).retrieve(); + } + private static class MultiPartInputStreamResource extends InputStreamResource { private final String fileName; From d009b0508af2abb835292118bfdacb0b90052967 Mon Sep 17 00:00:00 2001 From: mkslofstra Date: Tue, 25 Jun 2024 15:58:56 +0200 Subject: [PATCH 07/24] refactor(RockConnection): Replace RestTemplate with RestClient --- .../org/molgenis/r/rock/RockConnection.java | 70 ++++++++----------- 1 file changed, 30 insertions(+), 40 deletions(-) diff --git a/r/src/main/java/org/molgenis/r/rock/RockConnection.java b/r/src/main/java/org/molgenis/r/rock/RockConnection.java index b5be12331..5dd8fb082 100644 --- a/r/src/main/java/org/molgenis/r/rock/RockConnection.java +++ b/r/src/main/java/org/molgenis/r/rock/RockConnection.java @@ -4,6 +4,7 @@ import com.google.common.collect.Lists; import java.io.InputStream; import java.nio.charset.StandardCharsets; +import java.time.Duration; import java.util.Base64; import java.util.Collections; import java.util.function.Consumer; @@ -12,14 +13,14 @@ import org.molgenis.r.RServerResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.boot.web.client.ClientHttpRequestFactories; +import org.springframework.boot.web.client.ClientHttpRequestFactorySettings; import org.springframework.core.io.InputStreamResource; import org.springframework.http.*; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; -import org.springframework.web.client.ResponseExtractor; import org.springframework.web.client.RestClient; import org.springframework.web.client.RestClientException; -import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; public class RockConnection implements RServerConnection { @@ -65,21 +66,17 @@ public RServerResult eval(String expr, boolean serialized) { .body(byte[].class); return new RockResult(responseBody); } else { - RestTemplate restTemplate = new RestTemplate(); - HttpHeaders headers = createHeaders(); - headers.setContentType(MEDIATYPE_APPLICATION_RSCRIPT); - headers.setAccept(Lists.newArrayList(MediaType.APPLICATION_JSON)); - ResponseEntity response = - restTemplate.exchange( - serverUrl, HttpMethod.POST, new HttpEntity<>(expr, headers), String.class); - String jsonSource = response.getBody(); - return new RockResult(jsonSource); - // RestClient.RequestBodySpec request = createRequestForPost(serverUrl, expr, - // MEDIATYPE_APPLICATION_RSCRIPT); - // String responseBody = request.headers(httpHeaders -> { - // httpHeaders.setAccept(Lists.newArrayList(MediaType.APPLICATION_JSON)); - // }).retrieve().body(String.class); - // return new RockResult(responseBody); + RestClient.RequestBodySpec request = + createRequestForPost(serverUrl, expr, MEDIATYPE_APPLICATION_RSCRIPT); + RestClient.ResponseSpec resp = + request + .headers( + httpHeaders -> { + httpHeaders.setAccept(Lists.newArrayList(MediaType.APPLICATION_JSON)); + }) + .retrieve(); + String responseBody = resp.body(String.class); + return new RockResult(responseBody); } } @@ -119,24 +116,17 @@ public void readFile(String fileName, Consumer inputStreamConsumer) UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(serverUrl).queryParam(PATH, fileName); - // RestClient.ResponseSpec response = restClient.get() - // .uri(builder.build().toUri()) - // .headers(httpHeaders -> { - // headers.setAccept(Collections.singletonList(MediaType.ALL)); - // }).retrieve(); - - RestTemplate restTemplate = new RestTemplate(); - restTemplate.execute( - builder.build().toUri(), - HttpMethod.GET, - request -> request.getHeaders().putAll(headers), - (ResponseExtractor) - resp -> { - if (!resp.getStatusCode().is2xxSuccessful()) { - logger.error("File download from {} failed: {}", serverUrl, resp.getStatusCode()); - throw new RuntimeException(FILE_DOWNLOAD_FAILED + resp.getStatusText()); + restClient + .get() + .uri(builder.build().toUri()) + .exchange( + (request, response) -> { + if (!response.getStatusCode().is2xxSuccessful()) { + logger.error( + "File download from {} failed: {}", serverUrl, response.getStatusCode()); + throw new RuntimeException(FILE_DOWNLOAD_FAILED + response.getStatusText()); } else { - inputStreamConsumer.accept(resp.getBody()); + inputStreamConsumer.accept(response.getBody()); } return null; }); @@ -150,12 +140,7 @@ public boolean close() { if (Strings.isNullOrEmpty(rockSessionId)) return true; try { - RestTemplate restTemplate = new RestTemplate(); - restTemplate.exchange( - getRSessionResourceUrl(""), - HttpMethod.DELETE, - new HttpEntity<>(createHeaders()), - Void.class); + restClient.delete().uri(getRSessionResourceUrl("")).retrieve().toBodilessEntity(); this.rockSessionId = null; return true; } catch (RestClientException e) { @@ -206,8 +191,13 @@ private HttpHeaders createHeaders() { private RestClient getRestClient() { String serverUrl = getRSessionResourceUrl(UPLOAD_ENDPOINT); String authHeader = getAuthHeader(); + ClientHttpRequestFactorySettings settings = + ClientHttpRequestFactorySettings.DEFAULTS + .withConnectTimeout(Duration.ofSeconds(300L)) + .withReadTimeout(Duration.ofSeconds(900L)); return RestClient.builder() .baseUrl(serverUrl) + .requestFactory(ClientHttpRequestFactories.get(settings)) .defaultHeaders( httpHeaders -> { httpHeaders.setBasicAuth(authHeader); From f68a3f0d2dc16b7873fc0588b52e958deca52068 Mon Sep 17 00:00:00 2001 From: mkslofstra Date: Tue, 25 Jun 2024 15:59:38 +0200 Subject: [PATCH 08/24] chore: use apache to do http calls to rock --- r/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/r/build.gradle b/r/build.gradle index 75202bc72..15a5e9154 100644 --- a/r/build.gradle +++ b/r/build.gradle @@ -35,6 +35,7 @@ dependencies { implementation 'com.google.auto.value:auto-value-annotations:1.10.4' implementation 'org.apache.commons:commons-text:1.11.0' implementation 'org.json:json:20240303' + implementation 'org.apache.httpcomponents.client5:httpclient5:5.3.1' //test testImplementation('org.springframework.boot:spring-boot-starter-test') { From d4e186807271a5225aa1406ea1d42c2022c867ba Mon Sep 17 00:00:00 2001 From: mkslofstra Date: Tue, 25 Jun 2024 16:20:08 +0200 Subject: [PATCH 09/24] chore: remove unused function --- .../java/org/molgenis/r/rock/RockConnection.java | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/r/src/main/java/org/molgenis/r/rock/RockConnection.java b/r/src/main/java/org/molgenis/r/rock/RockConnection.java index 5dd8fb082..171f17891 100644 --- a/r/src/main/java/org/molgenis/r/rock/RockConnection.java +++ b/r/src/main/java/org/molgenis/r/rock/RockConnection.java @@ -6,7 +6,6 @@ import java.nio.charset.StandardCharsets; import java.time.Duration; import java.util.Base64; -import java.util.Collections; import java.util.function.Consumer; import org.molgenis.r.RServerConnection; import org.molgenis.r.RServerException; @@ -109,9 +108,6 @@ public void writeFile(String fileName, InputStream in) throws RServerException { public void readFile(String fileName, Consumer inputStreamConsumer) throws RServerException { try { - HttpHeaders headers = createHeaders(); - headers.setAccept(Collections.singletonList(MediaType.ALL)); - String serverUrl = getRSessionResourceUrl(DOWNLOAD_ENDPOINT); UriComponentsBuilder builder = @@ -180,14 +176,6 @@ private String getAuthHeader() { return "Basic " + new String(encodedAuth); } - private HttpHeaders createHeaders() { - return new HttpHeaders() { - { - add("Authorization", getAuthHeader()); - } - }; - } - private RestClient getRestClient() { String serverUrl = getRSessionResourceUrl(UPLOAD_ENDPOINT); String authHeader = getAuthHeader(); From 07359f62d00594847281f579df81cb140e74b2f2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 6 Jul 2024 03:59:15 +0000 Subject: [PATCH 10/24] chore(deps): update dependency certifi to v2024.7.4 [security] --- scripts/upgrade/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/upgrade/requirements.txt b/scripts/upgrade/requirements.txt index 82922ae53..b12f93be6 100644 --- a/scripts/upgrade/requirements.txt +++ b/scripts/upgrade/requirements.txt @@ -1,7 +1,7 @@ -i https://pypi.org/simple argon2-cffi==23.1.0; python_version >= '3.7' argon2-cffi-bindings==21.2.0; python_version >= '3.6' -certifi==2024.2.2; python_version >= '3.6' +certifi==2024.7.4; python_version >= '3.6' cffi==1.16.0; python_version >= '3.8' charset-normalizer==3.3.2; python_full_version >= '3.7.0' deprecated==1.2.14; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' From 22a497ffc2b3b20215722554504d1dad120f6e7d Mon Sep 17 00:00:00 2001 From: mkslofstra Date: Tue, 13 Aug 2024 15:36:09 +0200 Subject: [PATCH 11/24] fix: throw proper error message when workspace over 2GBs closes #772 --- .../storage/ArmadilloStorageService.java | 37 ++++++++++--------- .../armadillo/storage/ArmadilloWorkspace.java | 7 +++- .../storage/ArmadilloStorageServiceTest.java | 10 +++++ .../storage/ArmadilloWorkspaceTest.java | 11 ++++++ 4 files changed, 46 insertions(+), 19 deletions(-) diff --git a/armadillo/src/main/java/org/molgenis/armadillo/storage/ArmadilloStorageService.java b/armadillo/src/main/java/org/molgenis/armadillo/storage/ArmadilloStorageService.java index 0f3d6c8ee..bfe107835 100644 --- a/armadillo/src/main/java/org/molgenis/armadillo/storage/ArmadilloStorageService.java +++ b/armadillo/src/main/java/org/molgenis/armadillo/storage/ArmadilloStorageService.java @@ -227,24 +227,27 @@ public void saveWorkspace(InputStream is, Principal principal, String id) { // Load root dir File drive = new File("/"); long usableSpace = drive.getUsableSpace(); - - ArmadilloWorkspace workspace = storageService.getWorkSpace(is); - long fileSize = workspace.getSize(); - if (usableSpace > fileSize * 2L) { - try { - storageService.save( - workspace.createInputStream(), - getUserBucketName(principal), - getWorkspaceObjectName(id), - APPLICATION_OCTET_STREAM); - } catch (StorageException e) { - throw new StorageException(e); + try { + ArmadilloWorkspace workspace = storageService.getWorkSpace(is); + long fileSize = workspace.getSize(); + if (usableSpace > fileSize * 2L) { + try { + storageService.save( + workspace.createInputStream(), + getUserBucketName(principal), + getWorkspaceObjectName(id), + APPLICATION_OCTET_STREAM); + } catch (StorageException e) { + throw new StorageException(e); + } + } else { + throw new StorageException( + format( + "Can't save workspace: workspace too big (%s), not enough space left on device. Try to make your workspace smaller and/or contact the administrator to increase diskspace.", + getHumanReadableByteCount(fileSize))); } - } else { - throw new StorageException( - format( - "Can't save workspace: workspace too big (%s), not enough space left on device. Try to make your workspace smaller and/or contact the administrator to increase diskspace.", - getHumanReadableByteCount(fileSize))); + } catch (StorageException e) { + throw new StorageException(e.getMessage().replace("load", "save")); } } diff --git a/armadillo/src/main/java/org/molgenis/armadillo/storage/ArmadilloWorkspace.java b/armadillo/src/main/java/org/molgenis/armadillo/storage/ArmadilloWorkspace.java index 7315dcec8..86f6ae1a5 100644 --- a/armadillo/src/main/java/org/molgenis/armadillo/storage/ArmadilloWorkspace.java +++ b/armadillo/src/main/java/org/molgenis/armadillo/storage/ArmadilloWorkspace.java @@ -8,6 +8,7 @@ public class ArmadilloWorkspace { byte[] content; + public static String workspaceTooBigError = "Unable to load workspace. Maximum supported workspace size is 2GB"; public ArmadilloWorkspace(InputStream is) { content = toByteArray(is); @@ -16,8 +17,10 @@ public ArmadilloWorkspace(InputStream is) { private byte[] toByteArray(InputStream is) { try { return IOUtils.toByteArray(is); - } catch (IOException e) { - throw new StorageException("Unable to read workspace"); + } catch (OutOfMemoryError e) { + throw new StorageException(workspaceTooBigError); + } catch (Exception e) { + throw new StorageException("Unable to load workspace, because: " + e); } } diff --git a/armadillo/src/test/java/org/molgenis/armadillo/storage/ArmadilloStorageServiceTest.java b/armadillo/src/test/java/org/molgenis/armadillo/storage/ArmadilloStorageServiceTest.java index 7d05eb009..9448de2f6 100644 --- a/armadillo/src/test/java/org/molgenis/armadillo/storage/ArmadilloStorageServiceTest.java +++ b/armadillo/src/test/java/org/molgenis/armadillo/storage/ArmadilloStorageServiceTest.java @@ -518,6 +518,16 @@ void testSaveWorkspaceReturnsErrorWhenTooBig() { StorageException.class, () -> armadilloStorage.saveWorkspace(is, principal, "test")); } + @Test + void testSaveWorkspaceReturnsErrorWhenBiggerThan2Gbs() { + when(storageService.getWorkSpace(is)).thenThrow(new StorageException(ArmadilloWorkspace.workspaceTooBigError)); + try { + armadilloStorage.saveWorkspace(is, principal, "test"); + } catch (StorageException e) { + assertEquals("Unable to save workspace. Maximum supported workspace size is 2GB", e.getMessage()); + } + } + @Test void testSaveWorkspaceChecksBucketName() { ArmadilloWorkspace workspaceMock = mock(ArmadilloWorkspace.class); diff --git a/armadillo/src/test/java/org/molgenis/armadillo/storage/ArmadilloWorkspaceTest.java b/armadillo/src/test/java/org/molgenis/armadillo/storage/ArmadilloWorkspaceTest.java index 815985399..0d0a1636b 100644 --- a/armadillo/src/test/java/org/molgenis/armadillo/storage/ArmadilloWorkspaceTest.java +++ b/armadillo/src/test/java/org/molgenis/armadillo/storage/ArmadilloWorkspaceTest.java @@ -28,4 +28,15 @@ void testGetByteOfInputStreamThrowsError() throws IOException { when(isMock.read(any(byte[].class))).thenThrow(IOException.class); assertThrows(StorageException.class, () -> new ArmadilloWorkspace(isMock)); } + + @Test + void testGetByteOfInputStreamThrowsMemoryError() throws IOException { + InputStream isMock = mock(InputStream.class); + when(isMock.read(any(byte[].class))).thenThrow(OutOfMemoryError.class); + try { + new ArmadilloWorkspace(isMock); + } catch(StorageException e) { + assertEquals(ArmadilloWorkspace.workspaceTooBigError, e.getMessage()); + } + } } From 3a6745303c836e536fefb99e792fecbb1074ba36 Mon Sep 17 00:00:00 2001 From: mkslofstra Date: Thu, 15 Aug 2024 10:27:31 +0200 Subject: [PATCH 12/24] chore: appease sonar gods --- .../org/molgenis/armadillo/storage/ArmadilloWorkspace.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/armadillo/src/main/java/org/molgenis/armadillo/storage/ArmadilloWorkspace.java b/armadillo/src/main/java/org/molgenis/armadillo/storage/ArmadilloWorkspace.java index 86f6ae1a5..c37d6807a 100644 --- a/armadillo/src/main/java/org/molgenis/armadillo/storage/ArmadilloWorkspace.java +++ b/armadillo/src/main/java/org/molgenis/armadillo/storage/ArmadilloWorkspace.java @@ -1,14 +1,13 @@ package org.molgenis.armadillo.storage; import java.io.ByteArrayInputStream; -import java.io.IOException; import java.io.InputStream; import org.apache.commons.io.IOUtils; import org.molgenis.armadillo.exceptions.StorageException; public class ArmadilloWorkspace { byte[] content; - public static String workspaceTooBigError = "Unable to load workspace. Maximum supported workspace size is 2GB"; + public static final String workspaceTooBigError = "Unable to load workspace. Maximum supported workspace size is 2GB"; public ArmadilloWorkspace(InputStream is) { content = toByteArray(is); From 37be1ac8fd86f5711a084bc547d875e8189c5c5a Mon Sep 17 00:00:00 2001 From: mkslofstra Date: Thu, 15 Aug 2024 10:41:09 +0200 Subject: [PATCH 13/24] chore: change name of constant for consistency --- .../org/molgenis/armadillo/storage/ArmadilloWorkspace.java | 4 ++-- .../armadillo/storage/ArmadilloStorageServiceTest.java | 2 +- .../molgenis/armadillo/storage/ArmadilloWorkspaceTest.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/armadillo/src/main/java/org/molgenis/armadillo/storage/ArmadilloWorkspace.java b/armadillo/src/main/java/org/molgenis/armadillo/storage/ArmadilloWorkspace.java index c37d6807a..c1280bf83 100644 --- a/armadillo/src/main/java/org/molgenis/armadillo/storage/ArmadilloWorkspace.java +++ b/armadillo/src/main/java/org/molgenis/armadillo/storage/ArmadilloWorkspace.java @@ -7,7 +7,7 @@ public class ArmadilloWorkspace { byte[] content; - public static final String workspaceTooBigError = "Unable to load workspace. Maximum supported workspace size is 2GB"; + public static final String WORKSPACE_TOO_BIG_ERROR = "Unable to load workspace. Maximum supported workspace size is 2GB"; public ArmadilloWorkspace(InputStream is) { content = toByteArray(is); @@ -17,7 +17,7 @@ private byte[] toByteArray(InputStream is) { try { return IOUtils.toByteArray(is); } catch (OutOfMemoryError e) { - throw new StorageException(workspaceTooBigError); + throw new StorageException(WORKSPACE_TOO_BIG_ERROR); } catch (Exception e) { throw new StorageException("Unable to load workspace, because: " + e); } diff --git a/armadillo/src/test/java/org/molgenis/armadillo/storage/ArmadilloStorageServiceTest.java b/armadillo/src/test/java/org/molgenis/armadillo/storage/ArmadilloStorageServiceTest.java index 9448de2f6..3a67537ad 100644 --- a/armadillo/src/test/java/org/molgenis/armadillo/storage/ArmadilloStorageServiceTest.java +++ b/armadillo/src/test/java/org/molgenis/armadillo/storage/ArmadilloStorageServiceTest.java @@ -520,7 +520,7 @@ void testSaveWorkspaceReturnsErrorWhenTooBig() { @Test void testSaveWorkspaceReturnsErrorWhenBiggerThan2Gbs() { - when(storageService.getWorkSpace(is)).thenThrow(new StorageException(ArmadilloWorkspace.workspaceTooBigError)); + when(storageService.getWorkSpace(is)).thenThrow(new StorageException(ArmadilloWorkspace.WORKSPACE_TOO_BIG_ERROR)); try { armadilloStorage.saveWorkspace(is, principal, "test"); } catch (StorageException e) { diff --git a/armadillo/src/test/java/org/molgenis/armadillo/storage/ArmadilloWorkspaceTest.java b/armadillo/src/test/java/org/molgenis/armadillo/storage/ArmadilloWorkspaceTest.java index 0d0a1636b..8b6e22b85 100644 --- a/armadillo/src/test/java/org/molgenis/armadillo/storage/ArmadilloWorkspaceTest.java +++ b/armadillo/src/test/java/org/molgenis/armadillo/storage/ArmadilloWorkspaceTest.java @@ -36,7 +36,7 @@ void testGetByteOfInputStreamThrowsMemoryError() throws IOException { try { new ArmadilloWorkspace(isMock); } catch(StorageException e) { - assertEquals(ArmadilloWorkspace.workspaceTooBigError, e.getMessage()); + assertEquals(ArmadilloWorkspace.WORKSPACE_TOO_BIG_ERROR, e.getMessage()); } } } From 5efa78d2326d59b0b4b3660f9024ccaaeb99978b Mon Sep 17 00:00:00 2001 From: mkslofstra Date: Thu, 15 Aug 2024 10:46:28 +0200 Subject: [PATCH 14/24] refactor: reduce code complexity --- .../storage/ArmadilloStorageService.java | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/armadillo/src/main/java/org/molgenis/armadillo/storage/ArmadilloStorageService.java b/armadillo/src/main/java/org/molgenis/armadillo/storage/ArmadilloStorageService.java index bfe107835..2252aa7d4 100644 --- a/armadillo/src/main/java/org/molgenis/armadillo/storage/ArmadilloStorageService.java +++ b/armadillo/src/main/java/org/molgenis/armadillo/storage/ArmadilloStorageService.java @@ -223,6 +223,17 @@ private static Workspace toWorkspace(ObjectMetadata item) { .build(); } + private void trySaveWorkspace (ArmadilloWorkspace workspace, Principal principal, String id) { + try { + storageService.save( + workspace.createInputStream(), + getUserBucketName(principal), + getWorkspaceObjectName(id), + APPLICATION_OCTET_STREAM); + } catch (StorageException e) { + throw new StorageException(e); + } + } public void saveWorkspace(InputStream is, Principal principal, String id) { // Load root dir File drive = new File("/"); @@ -231,15 +242,7 @@ public void saveWorkspace(InputStream is, Principal principal, String id) { ArmadilloWorkspace workspace = storageService.getWorkSpace(is); long fileSize = workspace.getSize(); if (usableSpace > fileSize * 2L) { - try { - storageService.save( - workspace.createInputStream(), - getUserBucketName(principal), - getWorkspaceObjectName(id), - APPLICATION_OCTET_STREAM); - } catch (StorageException e) { - throw new StorageException(e); - } + trySaveWorkspace(workspace, principal, id); } else { throw new StorageException( format( From a7e58f7c9b536f4d5d12a9812650b0aa5fb7dd6b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 4 Sep 2024 22:23:29 +0000 Subject: [PATCH 15/24] chore(deps): update dependency @types/node to v20.16.5 --- ui/package.json | 2 +- ui/yarn.lock | 15 ++++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/ui/package.json b/ui/package.json index e1e1929ba..22c38e88a 100644 --- a/ui/package.json +++ b/ui/package.json @@ -21,7 +21,7 @@ "@babel/core": "7.23.7", "@babel/preset-typescript": "7.23.3", "@types/jest": "29.5.12", - "@types/node": "20.9.0", + "@types/node": "20.16.5", "@types/vue": "^2.0.0", "@vitejs/plugin-vue": "4.4.1", "@vue/test-utils": "2.4.5", diff --git a/ui/yarn.lock b/ui/yarn.lock index 2effe94a0..37c7ff169 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -920,12 +920,12 @@ dependencies: undici-types "~5.26.4" -"@types/node@20.9.0": - version "20.9.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.9.0.tgz#bfcdc230583aeb891cf51e73cfdaacdd8deae298" - integrity sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw== +"@types/node@20.16.5": + version "20.16.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.16.5.tgz#d43c7f973b32ffdf9aa7bd4f80e1072310fd7a53" + integrity sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA== dependencies: - undici-types "~5.26.4" + undici-types "~6.19.2" "@types/stack-utils@^2.0.0": version "2.0.3" @@ -3373,6 +3373,11 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +undici-types@~6.19.2: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== + universalify@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" From c0334562305d68f16baaf3e8b19fff9751921ae5 Mon Sep 17 00:00:00 2001 From: mkslofstra Date: Mon, 9 Sep 2024 14:30:18 +0200 Subject: [PATCH 16/24] feat: expose actuator/prometheus endpoint --- .../armadillo/info/RProcessEndpoint.java | 28 +++++++++++-------- .../armadillo/metadata/ProfileService.java | 10 ++++++- .../armadillo/security/AuthConfig.java | 1 + 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/armadillo/src/main/java/org/molgenis/armadillo/info/RProcessEndpoint.java b/armadillo/src/main/java/org/molgenis/armadillo/info/RProcessEndpoint.java index 07323a0fb..0a681a0fa 100644 --- a/armadillo/src/main/java/org/molgenis/armadillo/info/RProcessEndpoint.java +++ b/armadillo/src/main/java/org/molgenis/armadillo/info/RProcessEndpoint.java @@ -15,6 +15,8 @@ import org.springframework.boot.actuate.endpoint.annotation.ReadOperation; import org.springframework.stereotype.Component; +import static org.molgenis.armadillo.security.RunAs.runAsSystem; + @Component @Endpoint(id = "rserveProcesses") public class RProcessEndpoint { @@ -40,18 +42,20 @@ public List getRServeEnvironments() { } T doWithConnection(String environmentName, Function action) { - var environment = - profileService.getAll().stream() - .filter(it -> environmentName.equals(it.getName())) - .map(ProfileConfig::toEnvironmentConfigProps) - .findFirst() - .orElseThrow(); - RServerConnection connection = connect(environment); - try { - return action.apply(connection); - } finally { - connection.close(); - } + return runAsSystem(() -> { + var environment = + profileService.getAll().stream() + .filter(it -> environmentName.equals(it.getName())) + .map(ProfileConfig::toEnvironmentConfigProps) + .findFirst() + .orElseThrow(); + RServerConnection connection = connect(environment); + try { + return action.apply(connection); + } finally { + connection.close(); + } + }); } RServerConnection connect(EnvironmentConfigProps environment) { diff --git a/armadillo/src/main/java/org/molgenis/armadillo/metadata/ProfileService.java b/armadillo/src/main/java/org/molgenis/armadillo/metadata/ProfileService.java index 5331a42ff..bc28a72f1 100644 --- a/armadillo/src/main/java/org/molgenis/armadillo/metadata/ProfileService.java +++ b/armadillo/src/main/java/org/molgenis/armadillo/metadata/ProfileService.java @@ -13,7 +13,6 @@ import org.springframework.stereotype.Service; @Service -@PreAuthorize("hasRole('ROLE_SU')") public class ProfileService { private final ProfilesLoader loader; @@ -35,15 +34,18 @@ public ProfileService( * Initialization separated from constructor so that it can be called in WebMvc tests * after mocks have been initialized. */ + @PreAuthorize("hasRole('ROLE_SU')") public void initialize() { settings = loader.load(); bootstrap(); } + @PreAuthorize("hasRole('ROLE_SU')") public List getAll() { return new ArrayList<>(settings.getProfiles().values()); } + @PreAuthorize("hasRole('ROLE_SU')") public ProfileConfig getByName(String profileName) { if (!settings.getProfiles().containsKey(profileName)) { throw new UnknownProfileException(profileName); @@ -51,6 +53,7 @@ public ProfileConfig getByName(String profileName) { return settings.getProfiles().get(profileName); } + @PreAuthorize("hasRole('ROLE_SU')") public void upsert(ProfileConfig profileConfig) { String profileName = profileConfig.getName(); settings @@ -70,12 +73,14 @@ public void upsert(ProfileConfig profileConfig) { save(); } + @PreAuthorize("hasRole('ROLE_SU')") public void addToWhitelist(String profileName, String pack) { getByName(profileName).getPackageWhitelist().add(pack); flushProfileBeans(profileName); save(); } + @PreAuthorize("hasRole('ROLE_SU')") public void delete(String profileName) { if (profileName.equals(DEFAULT)) { throw new DefaultProfileDeleteException(); @@ -86,14 +91,17 @@ public void delete(String profileName) { save(); } + @PreAuthorize("hasRole('ROLE_SU')") private void flushProfileBeans(String profileName) { profileScope.removeAllProfileBeans(profileName); } + @PreAuthorize("hasRole('ROLE_SU')") private void save() { settings = loader.save(settings); } + @PreAuthorize("hasRole('ROLE_SU')") private void bootstrap() { if (settings == null) { return; diff --git a/armadillo/src/main/java/org/molgenis/armadillo/security/AuthConfig.java b/armadillo/src/main/java/org/molgenis/armadillo/security/AuthConfig.java index 67e215504..43215ce30 100644 --- a/armadillo/src/main/java/org/molgenis/armadillo/security/AuthConfig.java +++ b/armadillo/src/main/java/org/molgenis/armadillo/security/AuthConfig.java @@ -75,6 +75,7 @@ protected SecurityFilterChain oauthAndBasic(HttpSecurity http) throws Exception "/v3/**", "/swagger-ui/**", "/ui/**", + "/actuator/prometheus", "/swagger-ui.html") .permitAll() .requestMatchers(EndpointRequest.to(InfoEndpoint.class, HealthEndpoint.class)) From 956863f5334de8ccaebe8ff1c81f00abf16eb317 Mon Sep 17 00:00:00 2001 From: mkslofstra Date: Tue, 10 Sep 2024 12:42:58 +0200 Subject: [PATCH 17/24] fix: do runassystem only on the method involved and revert changes in profileservice --- .../armadillo/info/RProcessEndpoint.java | 26 +++++++++---------- .../armadillo/metadata/ProfileService.java | 10 +------ 2 files changed, 13 insertions(+), 23 deletions(-) diff --git a/armadillo/src/main/java/org/molgenis/armadillo/info/RProcessEndpoint.java b/armadillo/src/main/java/org/molgenis/armadillo/info/RProcessEndpoint.java index 0a681a0fa..0f0a430fc 100644 --- a/armadillo/src/main/java/org/molgenis/armadillo/info/RProcessEndpoint.java +++ b/armadillo/src/main/java/org/molgenis/armadillo/info/RProcessEndpoint.java @@ -42,20 +42,18 @@ public List getRServeEnvironments() { } T doWithConnection(String environmentName, Function action) { - return runAsSystem(() -> { - var environment = - profileService.getAll().stream() - .filter(it -> environmentName.equals(it.getName())) - .map(ProfileConfig::toEnvironmentConfigProps) - .findFirst() - .orElseThrow(); - RServerConnection connection = connect(environment); - try { - return action.apply(connection); - } finally { - connection.close(); - } - }); + var environment = + runAsSystem(profileService::getAll).stream() + .filter(it -> environmentName.equals(it.getName())) + .map(ProfileConfig::toEnvironmentConfigProps) + .findFirst() + .orElseThrow(); + RServerConnection connection = connect(environment); + try { + return action.apply(connection); + } finally { + connection.close(); + } } RServerConnection connect(EnvironmentConfigProps environment) { diff --git a/armadillo/src/main/java/org/molgenis/armadillo/metadata/ProfileService.java b/armadillo/src/main/java/org/molgenis/armadillo/metadata/ProfileService.java index bc28a72f1..5331a42ff 100644 --- a/armadillo/src/main/java/org/molgenis/armadillo/metadata/ProfileService.java +++ b/armadillo/src/main/java/org/molgenis/armadillo/metadata/ProfileService.java @@ -13,6 +13,7 @@ import org.springframework.stereotype.Service; @Service +@PreAuthorize("hasRole('ROLE_SU')") public class ProfileService { private final ProfilesLoader loader; @@ -34,18 +35,15 @@ public ProfileService( * Initialization separated from constructor so that it can be called in WebMvc tests * after mocks have been initialized. */ - @PreAuthorize("hasRole('ROLE_SU')") public void initialize() { settings = loader.load(); bootstrap(); } - @PreAuthorize("hasRole('ROLE_SU')") public List getAll() { return new ArrayList<>(settings.getProfiles().values()); } - @PreAuthorize("hasRole('ROLE_SU')") public ProfileConfig getByName(String profileName) { if (!settings.getProfiles().containsKey(profileName)) { throw new UnknownProfileException(profileName); @@ -53,7 +51,6 @@ public ProfileConfig getByName(String profileName) { return settings.getProfiles().get(profileName); } - @PreAuthorize("hasRole('ROLE_SU')") public void upsert(ProfileConfig profileConfig) { String profileName = profileConfig.getName(); settings @@ -73,14 +70,12 @@ public void upsert(ProfileConfig profileConfig) { save(); } - @PreAuthorize("hasRole('ROLE_SU')") public void addToWhitelist(String profileName, String pack) { getByName(profileName).getPackageWhitelist().add(pack); flushProfileBeans(profileName); save(); } - @PreAuthorize("hasRole('ROLE_SU')") public void delete(String profileName) { if (profileName.equals(DEFAULT)) { throw new DefaultProfileDeleteException(); @@ -91,17 +86,14 @@ public void delete(String profileName) { save(); } - @PreAuthorize("hasRole('ROLE_SU')") private void flushProfileBeans(String profileName) { profileScope.removeAllProfileBeans(profileName); } - @PreAuthorize("hasRole('ROLE_SU')") private void save() { settings = loader.save(settings); } - @PreAuthorize("hasRole('ROLE_SU')") private void bootstrap() { if (settings == null) { return; From 3904a605195b111583accbb4d7605494605d07c4 Mon Sep 17 00:00:00 2001 From: marikaris Date: Thu, 12 Sep 2024 14:55:44 +0200 Subject: [PATCH 18/24] Revert "fix(deps): update dependency bootstrap to v5.3.3" --- ui/package.json | 2 +- ui/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ui/package.json b/ui/package.json index b58762a10..e1e1929ba 100644 --- a/ui/package.json +++ b/ui/package.json @@ -12,7 +12,7 @@ }, "dependencies": { "@popperjs/core": "2.11.8", - "bootstrap": "5.3.3", + "bootstrap": "5.3.2", "bootstrap-icons": "1.11.3", "vue": "3.3.8", "vue-router": "^4.0.13" diff --git a/ui/yarn.lock b/ui/yarn.lock index 076fa8725..2effe94a0 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -1341,10 +1341,10 @@ bootstrap-icons@1.11.3: resolved "https://registry.yarnpkg.com/bootstrap-icons/-/bootstrap-icons-1.11.3.tgz#03f9cb754ec005c52f9ee616e2e84a82cab3084b" integrity sha512-+3lpHrCw/it2/7lBL15VR0HEumaBss0+f/Lb6ZvHISn1mlK83jjFpooTLsMWbIjJMDjDjOExMsTxnXSIT4k4ww== -bootstrap@5.3.3: - version "5.3.3" - resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.3.3.tgz#de35e1a765c897ac940021900fcbb831602bac38" - integrity sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg== +bootstrap@5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.3.2.tgz#97226583f27aae93b2b28ab23f4c114757ff16ae" + integrity sha512-D32nmNWiQHo94BKHLmOrdjlL05q1c8oxbtBphQFb9Z5to6eGRDCm0QgeaZ4zFBHzfg2++rqa2JkqCcxDy0sH0g== brace-expansion@^1.1.7: version "1.1.11" From 618df5f59560253197ae5e9d11ec8b4cc4ba3e30 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 17 Sep 2024 12:53:31 +0000 Subject: [PATCH 19/24] chore(deps): update dependency @types/jest to v29.5.13 --- ui/package.json | 2 +- ui/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ui/package.json b/ui/package.json index d45882eef..44f269d88 100644 --- a/ui/package.json +++ b/ui/package.json @@ -20,7 +20,7 @@ "devDependencies": { "@babel/core": "7.24.5", "@babel/preset-typescript": "7.24.1", - "@types/jest": "29.5.12", + "@types/jest": "29.5.13", "@types/node": "20.16.5", "@types/vue": "^2.0.0", "@vitejs/plugin-vue": "4.4.1", diff --git a/ui/yarn.lock b/ui/yarn.lock index 4eed3d8d7..c40b77842 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -875,10 +875,10 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@29.5.12": - version "29.5.12" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.12.tgz#7f7dc6eb4cf246d2474ed78744b05d06ce025544" - integrity sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw== +"@types/jest@29.5.13": + version "29.5.13" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.13.tgz#8bc571659f401e6a719a7bf0dbcb8b78c71a8adc" + integrity sha512-wd+MVEZCHt23V0/L642O5APvspWply/rGY5BcW4SUETo2UzPU3Z26qr8jC2qxpimI2jjx9h7+2cj2FwIr01bXg== dependencies: expect "^29.0.0" pretty-format "^29.0.0" From 84d2ca1a5b41476c6976c56042d1d99939d81a39 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 17 Sep 2024 13:35:55 +0000 Subject: [PATCH 20/24] chore(deps): update dependency @vue/test-utils to v2.4.6 --- ui/package.json | 2 +- ui/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ui/package.json b/ui/package.json index d45882eef..85821d9b7 100644 --- a/ui/package.json +++ b/ui/package.json @@ -24,7 +24,7 @@ "@types/node": "20.16.5", "@types/vue": "^2.0.0", "@vitejs/plugin-vue": "4.4.1", - "@vue/test-utils": "2.4.5", + "@vue/test-utils": "2.4.6", "@vue/vue3-jest": "29.2.6", "babel-jest": "29.7.0", "jest": "29.7.0", diff --git a/ui/yarn.lock b/ui/yarn.lock index 4eed3d8d7..b2414e89a 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -1124,10 +1124,10 @@ resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.4.26.tgz#f17854fb1faf889854aed4b23b60e86a8cab6403" integrity sha512-Fg4zwR0GNnjzodMt3KRy2AWGMKQXByl56+4HjN87soxLNU9P5xcJkstAlIeEF3cU6UYOzmJl1tV0dVPGIljCnQ== -"@vue/test-utils@2.4.5": - version "2.4.5" - resolved "https://registry.yarnpkg.com/@vue/test-utils/-/test-utils-2.4.5.tgz#010aa4debe6602d83dc75f233b397092742105a2" - integrity sha512-oo2u7vktOyKUked36R93NB7mg2B+N7Plr8lxp2JBGwr18ch6EggFjixSCdIVVLkT6Qr0z359Xvnafc9dcKyDUg== +"@vue/test-utils@2.4.6": + version "2.4.6" + resolved "https://registry.yarnpkg.com/@vue/test-utils/-/test-utils-2.4.6.tgz#7d534e70c4319d2a587d6a3b45a39e9695ade03c" + integrity sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow== dependencies: js-beautify "^1.14.9" vue-component-type-helpers "^2.0.0" From b9056ba822f0893b90f346885d48e255bbb4346e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 17 Sep 2024 13:44:52 +0000 Subject: [PATCH 21/24] Update dependency bootstrap to v5.3.3 --- ui/package.json | 2 +- ui/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ui/package.json b/ui/package.json index d45882eef..24002ef6f 100644 --- a/ui/package.json +++ b/ui/package.json @@ -12,7 +12,7 @@ }, "dependencies": { "@popperjs/core": "2.11.8", - "bootstrap": "5.3.2", + "bootstrap": "5.3.3", "bootstrap-icons": "1.11.3", "vue": "3.3.8", "vue-router": "^4.0.13" diff --git a/ui/yarn.lock b/ui/yarn.lock index 4eed3d8d7..2eccd978e 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -1320,10 +1320,10 @@ bootstrap-icons@1.11.3: resolved "https://registry.yarnpkg.com/bootstrap-icons/-/bootstrap-icons-1.11.3.tgz#03f9cb754ec005c52f9ee616e2e84a82cab3084b" integrity sha512-+3lpHrCw/it2/7lBL15VR0HEumaBss0+f/Lb6ZvHISn1mlK83jjFpooTLsMWbIjJMDjDjOExMsTxnXSIT4k4ww== -bootstrap@5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.3.2.tgz#97226583f27aae93b2b28ab23f4c114757ff16ae" - integrity sha512-D32nmNWiQHo94BKHLmOrdjlL05q1c8oxbtBphQFb9Z5to6eGRDCm0QgeaZ4zFBHzfg2++rqa2JkqCcxDy0sH0g== +bootstrap@5.3.3: + version "5.3.3" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.3.3.tgz#de35e1a765c897ac940021900fcbb831602bac38" + integrity sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg== brace-expansion@^1.1.7: version "1.1.11" From 373292db043ff7d3bf0b06e89d65aa12181ce8a7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 17 Sep 2024 16:15:19 +0000 Subject: [PATCH 22/24] chore(deps): update eclipse-temurin docker tag --- .circleci/config.yml | 2 +- Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index ca74465ec..727043ae7 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -9,7 +9,7 @@ version: 2.1 jobs: build: docker: - - image: eclipse-temurin:17.0.10_7-jdk-jammy + - image: eclipse-temurin:17.0.12_7-jdk-jammy working_directory: ~/repo resource_class: large diff --git a/Dockerfile b/Dockerfile index 2d633cc55..edfa5e891 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 eclipse-temurin:17.0.10_7-jdk-focal +FROM --platform=linux/amd64 eclipse-temurin:17.0.12_7-jdk-focal VOLUME /data VOLUME /config VOLUME /logs From efa4759927d04a0fec0ce0fa04f13bdcb4f2c1b1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 18 Sep 2024 04:33:06 +0000 Subject: [PATCH 23/24] fix(deps): update dependency io.swagger.core.v3:swagger-annotations to v2.2.23 --- armadillo/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/armadillo/build.gradle b/armadillo/build.gradle index 5bb9ef61d..62e6cdaf7 100644 --- a/armadillo/build.gradle +++ b/armadillo/build.gradle @@ -46,7 +46,7 @@ dependencies { //other implementation 'org.rosuda.REngine:REngine:2.1.0' implementation 'org.rosuda.REngine:Rserve:1.8.1' - implementation 'io.swagger.core.v3:swagger-annotations:2.2.20' + implementation 'io.swagger.core.v3:swagger-annotations:2.2.23' implementation 'com.google.auto.value:auto-value-annotations:1.10.4' implementation 'org.obiba.datashield:ds4j-core:2.1.0' implementation 'org.obiba.datashield:ds4j-r:2.1.0' From deb8fb59e9e4a9278075ef68b3133b8316cc4dd5 Mon Sep 17 00:00:00 2001 From: RubenOPS <152260548+RubenOPS@users.noreply.github.com> Date: Wed, 18 Sep 2024 15:31:37 +0200 Subject: [PATCH 24/24] Update installing.md --- docs/ops/installing.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/ops/installing.md b/docs/ops/installing.md index 23b364a17..3e649b567 100644 --- a/docs/ops/installing.md +++ b/docs/ops/installing.md @@ -47,6 +47,12 @@ The values needed are: You need a SSL certificate to configuring the front-end proxy and make the browser use **https** before putting data on the server. +If SELinux is enabled, run the following command to ensure that the application can connect to required services: + +```bash +setsebool -P httpd_can_network_connect on +``` + ## Installing Armadillo as service We run Armadillo in production as a Linux service on Ubuntu, ensuring it gets restarted when the server is rebooted. You might be able to reproduce also on CentOS (using yum instead of apt). @@ -184,4 +190,4 @@ For questions on other linux release you can email molgenis-operations@umcg.nl ## What's next? * [For the server owner or data manager who need to put data on to the server](https://molgenis.github.io/molgenis-r-armadillo/) -* [For the researcher who want to start analyzing the data on the server](https://molgenis.github.io/molgenis-r-datashield/) \ No newline at end of file +* [For the researcher who want to start analyzing the data on the server](https://molgenis.github.io/molgenis-r-datashield/)