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