From 54a85a54d82d3c2c0f6a507d62517b229d756d02 Mon Sep 17 00:00:00 2001
From: Martin Weise <martin.weise@tuwien.ac.at>
Date: Fri, 11 Apr 2025 14:58:02 +0200
Subject: [PATCH] Updated the config

Signed-off-by: Martin Weise <martin.weise@tuwien.ac.at>
---
 .gitlab-ci.yml                                |  54 ---------------
 .../target/create-event-listener.jar          | Bin 10140 -> 10139 bytes
 .../at/ifs/dbrepo/config/MariaDbConfig.java   |   2 +-
 .../dbrepo/config/MariaDbContainerConfig.java |  16 ++++-
 .../ifs/dbrepo/config/MariadbConfigTest.java  |  63 ++++++++++++++++++
 dbrepo-ui/components/table/TableToolbar.vue   |  18 +----
 helm/dbrepo/files/create-event-listener.jar   | Bin 10140 -> 10139 bytes
 .../tuwien/ifs/dbrepo/core/test/BaseTest.java |   2 +-
 8 files changed, 81 insertions(+), 74 deletions(-)
 create mode 100644 dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/MariadbConfigTest.java

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 50443dc1ad..0ab6774c25 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -439,60 +439,6 @@ test-dashboard-service:
       junit: ./dbrepo-dashboard-service/coverage.xml
   coverage: '/TOTAL.*?([0-9]{1,3})%/'
 
-test-dashboard-service-init:
-  image: docker.io/python:${PYTHON_VERSION}-alpine${ALPINE_VERSION}
-  stage: test
-  only:
-    - merge_requests
-    - master
-  variables:
-    PIPENV_PIPFILE: "./dbrepo-dashboard-service/init/Pipfile"
-  needs:
-    - build-dashboard-service
-  dependencies:
-    - build-dashboard-service
-  script:
-    - "pip install pipenv"
-    - "pipenv install gunicorn && pipenv install --dev --system --deploy"
-    - cd ./dbrepo-dashboard-service/init/ && coverage run --rcfile=.coveragerc -m pytest tests/test_app.py && coverage html && coverage xml && coverage report > ./coverage.txt
-    - "cat ./coverage.txt | grep -o 'TOTAL[^%]*%'"
-  artifacts:
-    when: always
-    paths:
-      - ./dbrepo-dashboard-service/init/coverage.xml
-      - ./dbrepo-dashboard-service/init/coverage.txt
-    expire_in: 1 days
-    reports:
-      junit: ./dbrepo-dashboard-service/init/coverage.xml
-  coverage: '/TOTAL.*?([0-9]{1,3})%/'
-
-test-search-service-init:
-  image: docker.io/python:${PYTHON_VERSION}-alpine${ALPINE_VERSION}
-  stage: test
-  only:
-    - merge_requests
-    - master
-  variables:
-    PIPENV_PIPFILE: "./dbrepo-search-service/init/Pipfile"
-  needs:
-    - build-search-service
-  dependencies:
-    - build-search-service
-  script:
-    - "pip install pipenv"
-    - "pipenv install gunicorn && pipenv install --dev --system --deploy"
-    - cd ./dbrepo-search-service/init/ && coverage run --rcfile=.coveragerc -m pytest tests/test_unit_app.py && coverage html && coverage xml && coverage report > ./coverage.txt
-    - "cat ./coverage.txt | grep -o 'TOTAL[^%]*%'"
-  artifacts:
-    when: always
-    paths:
-      - ./dbrepo-search-service/coverage.xml
-      - ./dbrepo-search-service/coverage.txt
-    expire_in: 1 days
-    reports:
-      junit: ./dbrepo-search-service/coverage.xml
-  coverage: '/TOTAL.*?([0-9]{1,3})%/'
-
 test-python-lib:
   image: docker.io/python:${PYTHON_VERSION}-alpine${ALPINE_VERSION}
   stage: test
diff --git a/dbrepo-auth-service/listeners/target/create-event-listener.jar b/dbrepo-auth-service/listeners/target/create-event-listener.jar
index 2a6b125340f46d51901a493f0ed050373730761a..e6ee56c50203b9ba4e75d7964141c3c353ff933d 100644
GIT binary patch
delta 974
zcmbQ^Kigk8z?+#xgn@yBgP}9KJIXUk-K=n;uwwnephE@%d&`&opCIqS)WljPY@@+!
z#r&vtc8;p^Y@?IgPTZI7nl`cUit{AjZ>jfB-_|)eOUCwNc*(sGv((y)-HT^BD_p6m
z^0_G_wdKvZm1{FEY;2U6Cvf?e$gJ~U`__M7acFCx%v`0((ySs{AH|(nm-(dgeHU$?
zwe8O0?4Co}DfP!|FHhU&7Ztm6%Gu>pzw20U63zO?AmZNtbl(9X-M?qcS^v6e<kg?}
zKe>2w)RG+UE#Fs8X+P{Z;|}*Kezvs?strpv?qv2~7Zzgu<&%#8u|NYW&eJkdFMhl;
zG)~xkczqvB_Iz9WQiarjS1C8%&0oNCK2{=n|MuT}^E)m$+r9YgU;id*YE4*Vch{{w
z;i<pUR>%gmRYs>fg)Y7GFi=$V%`S(QB_VI)AKYL$`|#l&gLxMgS&PRdCZF5lm3;5=
z1dXZc20oJl<&QJlzH`i<lX{XRbe(%MXWzN+X6trXe4owc$rm{7pmT}1?%D|oFM_=d
zjQZ>tK=HuEz`(%(j)%#c7?qhivL|0>)B{oMO!6Q~gGr64GkbCXlQxK|Wika(TbR5-
za*WL9K-5L%9;S}$&HvbVI6-tg%UmW9%_C4N2vXdwI2%N1C{5vnNB88TN|sEW*^`uI
z7#B~LRhCfb$nK6}KmtN=wgAIh$5V`xA2N$f&Q#_xMpwv;qVN|Z14Ckoet<V4lL#}!
zYaQ8>S18NKNHc+DN=nN!Q}a+1bY@R}pe)1aJo&G(9LS-vDl&`(lN(iJw2_SgIUQ~l
z0|SFToC9*;^2v=VcA&60s3ODkg=w-Nv({uzRUWXne15a6(qmv?&|zR;aDwY%U|7<4
zgn9BqW|zs8P=(z81pnOPU|?7$z`!7eqA-YMG9SCdWLY(ciT^(}@AhY6V7SK0z+i-;
zFoAb+K8wlZo2on@$7rj`F#YGBoX?^@xj@Z;an9t0YOWw3zEG24s#BcY%OpMdK9ktw
mGm3mruOc#~ut&(bWCjL?jSLJ7!YEcqPcBebV_UBT5(EG)JVXHi

delta 993
zcmbR3KgVA<z?+#xgn@yBgFz;(JL-zP)T*M1!ix32!G{$D_NJ@-Z?tDn@$E4)U(NpZ
zhhgyA@4Pv>ms?5_Cf};p_ciU4b+={U{(a+n#cA7!%})M*Sm&Cr)s57eWU;G=qh;3l
zZ>qc7<#czKWaU<s=m`I0G<@x|_Ge7~kIQ1AJIdtT+fS_NVd9$lWAj2O?`7KUx2HL~
zXTQ7n)$O5XebJM7JWKs2hizY%@;UOg?doqijkE4D9KD#kdF@6=@A}Vk9rg=$ZI=J^
z|4EGAJFjhOw|)hkx|^qd<`nm<GPbo0strpvYO~LaS-zt9#nZrfJ&O}c1gBYkG58dl
zoO+<IeZDN`HM^?17Y-*ETy(X2Bfo(2{9fa2)zaUT_X#X)xAFd2&;HHR^v|lTVxqj2
z>t}tsdcj}`&*xpMTe75g9^AVs`bJM9hv&++{RcMk&pLd#GS_CIYq`#z1NUSyKd+pZ
zBCffhiD&Z@n^4ct7?qQeOdPHgUvoaYoH<MGy>9H^r+4zDR4iR?vhZK5&6I3mag>j0
znppUS4-^qx3=A9$poo~ffl-A?I&JbbMm;8(w8?Bt@*ql`Nex8#GiigU8YWW^wVBDA
zNjhy3^Er_E3(P%CGHIK0c;_;K=r|T0P7uv4P%8*h+od=gM5!xH;e^Nb<ReO!Ai@7i
zGK@<m%P31INT+p2F(3gUI9q_>t>bCN$q$%CCTA$~WP{9r%P}x8FvB?@g})gY7!phL
z1H2iTM3~_|Lot~PMS~0zSVKu^d1h)Jn!d^Rm1P)RCjU{E1G!a3MTW6(a)XMDHa^q!
zQA}Skxk1Ga6h;SBWSG7(O%`C*n#`ff1NN=YZ<bYh3=9l93=9lTa9s=xOB#<dPkzAc
zGPy#P2W0OlRT-vWmdQ1|CX;2<coabX=l&=7=N1P8!#V*51~C+^pV%hnu}Dnb1JSCb
zCd0%aFu8_TeR95<0pr}s3)Eb}2JBw<APHnA2-~6<P_H<7p_=LB^NL(hZzA%kut&(b
aWCjL?jSLJ7!YG<#Cg-cGv29QS2?7B5zBdN|

diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/MariaDbConfig.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/MariaDbConfig.java
index 9a9f827a27..af4f12dc84 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/MariaDbConfig.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/MariaDbConfig.java
@@ -241,7 +241,7 @@ public class MariaDbConfig {
         log.trace("connect to database {}", jdbc);
         try (Connection connection = DriverManager.getConnection(jdbc, database.getContainer().getUsername(), database.getContainer().getPassword())) {
             final Statement statement = connection.createStatement();
-            statement.executeUpdate(query);
+            statement.execute(query);
         }
     }
 
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/MariaDbContainerConfig.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/MariaDbContainerConfig.java
index be54df64c4..215d0aa146 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/MariaDbContainerConfig.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/MariaDbContainerConfig.java
@@ -3,10 +3,13 @@ package at.ac.tuwien.ac.at.ifs.dbrepo.config;
 import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest;
 import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest;
 import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.testcontainers.containers.ContainerLaunchException;
 import org.testcontainers.containers.MariaDBContainer;
 import org.testcontainers.images.PullPolicy;
+import org.testcontainers.utility.DockerImageName;
 
 /**
  * This class configures the MariaDB container for the integration tests.
@@ -48,13 +51,22 @@ public class MariaDbContainerConfig extends BaseTest {
         }
 
         private CustomMariaDBContainer(String dockerImageName) {
-            super(dockerImageName);
+            super(DockerImageName.parse(dockerImageName).asCompatibleSubstituteFor("mariadb"));
         }
 
         @Override
         protected void configure() {
             super.configure();
-            this.addEnv("MYSQL_USER", "test"); // MariaDB does not allow this to be root
+            this.addEnv("MARIADB_EXTRA_FLAGS", "--max_connections=20 --max-statement-time=10");
+            if (this.getPassword() != null && !this.getPassword().isEmpty()) {
+                this.addEnv("MARIADB_ROOT_PASSWORD", this.getPassword());
+            } else {
+                if (!"root".equalsIgnoreCase(this.getUsername())) {
+                    throw new ContainerLaunchException("Empty password can be used only with the root user");
+                }
+                this.addEnv("MARIADB_ALLOW_EMPTY_PASSWORD", "yes");
+            }
+            this.setStartupAttempts(3);
         }
 
         @Override
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/MariadbConfigTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/MariadbConfigTest.java
new file mode 100644
index 0000000000..4068421d4f
--- /dev/null
+++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/MariadbConfigTest.java
@@ -0,0 +1,63 @@
+package at.ac.tuwien.ac.at.ifs.dbrepo.config;
+
+import at.ac.tuwien.ac.at.ifs.dbrepo.service.DatabaseService;
+import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest;
+import lombok.extern.log4j.Log4j2;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+import org.testcontainers.containers.MariaDBContainer;
+import org.testcontainers.junit.jupiter.Container;
+import org.testcontainers.junit.jupiter.Testcontainers;
+
+import java.sql.SQLException;
+import java.sql.SQLTimeoutException;
+
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+@Log4j2
+@SpringBootTest
+@ExtendWith(SpringExtension.class)
+@Testcontainers
+public class MariadbConfigTest extends BaseTest {
+
+    @Autowired
+    private DatabaseService databaseService;
+
+    @Container
+    private static MariaDBContainer<?> mariaDBContainer = MariaDbContainerConfig.getContainer();
+
+    @BeforeAll
+    public static void beforeAll() throws InterruptedException {
+        Thread.sleep(1000) /* wait for test container some more */;
+    }
+
+    @BeforeEach
+    public void beforeEach() throws SQLException, InterruptedException {
+        /* metadata database */
+        MariaDbConfig.dropDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_INTERNAL_NAME);
+        MariaDbConfig.createInitDatabase(DATABASE_1_PRIVILEGED_DTO);
+        Thread.sleep(1000) /* wait for test container some more */;
+    }
+
+    @Test
+    public void longRunningQuery_succeeds() throws SQLException {
+
+        /* test */
+        MariaDbConfig.execute(DATABASE_1_PRIVILEGED_DTO, "SELECT SLEEP(8);"); // -2
+    }
+
+    @Test
+    public void tooLongRunningQuery_succeeds() {
+
+        /* test */
+        assertThrows(SQLTimeoutException.class, () -> {
+            MariaDbConfig.execute(DATABASE_1_PRIVILEGED_DTO, "SELECT SLEEP(12);"); // +2
+        });
+    }
+
+}
diff --git a/dbrepo-ui/components/table/TableToolbar.vue b/dbrepo-ui/components/table/TableToolbar.vue
index 7311e0afd5..72d20ebdc2 100644
--- a/dbrepo-ui/components/table/TableToolbar.vue
+++ b/dbrepo-ui/components/table/TableToolbar.vue
@@ -30,14 +30,6 @@
         :text="$t('toolbars.database.import-csv.permanent') + ($vuetify.display.mdAndUp ? ' ' + $t('toolbars.database.import-csv.xl') : '')"
         class="mr-2"
         :to="`/database/${$route.params.database_id}/table/${$route.params.table_id}/import`" />
-      <v-btn
-        v-if="canExecuteQuery"
-        :prepend-icon="$vuetify.display.mdAndUp ? 'mdi-wrench' : null"
-        color="secondary"
-        variant="flat"
-        :text="($vuetify.display.mdAndUp ? $t('toolbars.database.create-subset.xl') + ' ' : '') + $t('toolbars.database.create-subset.permanent')"
-        class="mr-2"
-        :to="`/database/${$route.params.database_id}/subset/create?tid=${$route.params.table_id}`" />
       <v-btn
         v-if="canCreateView"
         :prepend-icon="$vuetify.display.mdAndUp ? 'mdi-view-carousel' : null"
@@ -124,21 +116,15 @@ export default {
       }
       return this.roles.includes('update-table') && this.table.owner.id === this.cacheUser.uid
     },
-    canExecuteQuery () {
-      if (!this.roles || !this.table || !this.cacheUser) {
-        return false
-      }
-      return this.hasReadAccess && this.roles.includes('execute-query')
-    },
     isOwner () {
       const databaseService = useDatabaseService()
       return databaseService.isOwner(this.database, this.cacheUser)
     },
     canCreateView () {
-      if (!this.roles || !this.table || !this.cacheUser) {
+      if (!this.roles || !this.cacheUser || !this.isOwner) {
         return false
       }
-      return this.isOwner && this.roles.includes('create-database-view')
+      return this.roles.includes('create-database-view')
     },
     canViewData () {
       if (!this.table) {
diff --git a/helm/dbrepo/files/create-event-listener.jar b/helm/dbrepo/files/create-event-listener.jar
index 2a6b125340f46d51901a493f0ed050373730761a..e6ee56c50203b9ba4e75d7964141c3c353ff933d 100644
GIT binary patch
delta 974
zcmbQ^Kigk8z?+#xgn@yBgP}9KJIXUk-K=n;uwwnephE@%d&`&opCIqS)WljPY@@+!
z#r&vtc8;p^Y@?IgPTZI7nl`cUit{AjZ>jfB-_|)eOUCwNc*(sGv((y)-HT^BD_p6m
z^0_G_wdKvZm1{FEY;2U6Cvf?e$gJ~U`__M7acFCx%v`0((ySs{AH|(nm-(dgeHU$?
zwe8O0?4Co}DfP!|FHhU&7Ztm6%Gu>pzw20U63zO?AmZNtbl(9X-M?qcS^v6e<kg?}
zKe>2w)RG+UE#Fs8X+P{Z;|}*Kezvs?strpv?qv2~7Zzgu<&%#8u|NYW&eJkdFMhl;
zG)~xkczqvB_Iz9WQiarjS1C8%&0oNCK2{=n|MuT}^E)m$+r9YgU;id*YE4*Vch{{w
z;i<pUR>%gmRYs>fg)Y7GFi=$V%`S(QB_VI)AKYL$`|#l&gLxMgS&PRdCZF5lm3;5=
z1dXZc20oJl<&QJlzH`i<lX{XRbe(%MXWzN+X6trXe4owc$rm{7pmT}1?%D|oFM_=d
zjQZ>tK=HuEz`(%(j)%#c7?qhivL|0>)B{oMO!6Q~gGr64GkbCXlQxK|Wika(TbR5-
za*WL9K-5L%9;S}$&HvbVI6-tg%UmW9%_C4N2vXdwI2%N1C{5vnNB88TN|sEW*^`uI
z7#B~LRhCfb$nK6}KmtN=wgAIh$5V`xA2N$f&Q#_xMpwv;qVN|Z14Ckoet<V4lL#}!
zYaQ8>S18NKNHc+DN=nN!Q}a+1bY@R}pe)1aJo&G(9LS-vDl&`(lN(iJw2_SgIUQ~l
z0|SFToC9*;^2v=VcA&60s3ODkg=w-Nv({uzRUWXne15a6(qmv?&|zR;aDwY%U|7<4
zgn9BqW|zs8P=(z81pnOPU|?7$z`!7eqA-YMG9SCdWLY(ciT^(}@AhY6V7SK0z+i-;
zFoAb+K8wlZo2on@$7rj`F#YGBoX?^@xj@Z;an9t0YOWw3zEG24s#BcY%OpMdK9ktw
mGm3mruOc#~ut&(bWCjL?jSLJ7!YEcqPcBebV_UBT5(EG)JVXHi

delta 993
zcmbR3KgVA<z?+#xgn@yBgFz;(JL-zP)T*M1!ix32!G{$D_NJ@-Z?tDn@$E4)U(NpZ
zhhgyA@4Pv>ms?5_Cf};p_ciU4b+={U{(a+n#cA7!%})M*Sm&Cr)s57eWU;G=qh;3l
zZ>qc7<#czKWaU<s=m`I0G<@x|_Ge7~kIQ1AJIdtT+fS_NVd9$lWAj2O?`7KUx2HL~
zXTQ7n)$O5XebJM7JWKs2hizY%@;UOg?doqijkE4D9KD#kdF@6=@A}Vk9rg=$ZI=J^
z|4EGAJFjhOw|)hkx|^qd<`nm<GPbo0strpvYO~LaS-zt9#nZrfJ&O}c1gBYkG58dl
zoO+<IeZDN`HM^?17Y-*ETy(X2Bfo(2{9fa2)zaUT_X#X)xAFd2&;HHR^v|lTVxqj2
z>t}tsdcj}`&*xpMTe75g9^AVs`bJM9hv&++{RcMk&pLd#GS_CIYq`#z1NUSyKd+pZ
zBCffhiD&Z@n^4ct7?qQeOdPHgUvoaYoH<MGy>9H^r+4zDR4iR?vhZK5&6I3mag>j0
znppUS4-^qx3=A9$poo~ffl-A?I&JbbMm;8(w8?Bt@*ql`Nex8#GiigU8YWW^wVBDA
zNjhy3^Er_E3(P%CGHIK0c;_;K=r|T0P7uv4P%8*h+od=gM5!xH;e^Nb<ReO!Ai@7i
zGK@<m%P31INT+p2F(3gUI9q_>t>bCN$q$%CCTA$~WP{9r%P}x8FvB?@g})gY7!phL
z1H2iTM3~_|Lot~PMS~0zSVKu^d1h)Jn!d^Rm1P)RCjU{E1G!a3MTW6(a)XMDHa^q!
zQA}Skxk1Ga6h;SBWSG7(O%`C*n#`ff1NN=YZ<bYh3=9l93=9lTa9s=xOB#<dPkzAc
zGPy#P2W0OlRT-vWmdQ1|CX;2<coabX=l&=7=N1P8!#V*51~C+^pV%hnu}Dnb1JSCb
zCd0%aFu8_TeR95<0pr}s3)Eb}2JBw<APHnA2-~6<P_H<7p_=LB^NL(hZzA%kut&(b
aWCjL?jSLJ7!YG<#Cg-cGv29QS2?7B5zBdN|

diff --git a/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/test/BaseTest.java b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/test/BaseTest.java
index 3a714d0fa8..78269ab308 100644
--- a/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/test/BaseTest.java
+++ b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/test/BaseTest.java
@@ -133,7 +133,7 @@ import static java.time.temporal.ChronoUnit.MINUTES;
 public class BaseTest {
 
     public final static String MINIO_IMAGE = "minio/minio:RELEASE.2024-06-06T09-36-42Z";
-    public final static String MARIADB_IMAGE = "mariadb:11.3.2";
+    public final static String MARIADB_IMAGE = "bitnami/mariadb:11.3.2";
     public final static String RABBITMQ_IMAGE = "rabbitmq:3.13.7";
     public final static String KEYCLOAK_IMAGE = "quay.io/keycloak/keycloak:26.0.4";
 
-- 
GitLab