From ac5e307df8e6211f8dbf1a0add9d743b522f8f9a Mon Sep 17 00:00:00 2001 From: Martin Weise <martin.weise@tuwien.ac.at> Date: Sun, 7 May 2023 22:50:54 +0200 Subject: [PATCH] Improved images - Analyse service severely less CVEs - Semantics service too - Removed discovery service - Removed gateway service - Use nginx as gateway servic- Removed discovery service - Removed gateway service - Use nginx as gateway servicee --- .env.unix.example | 2 +- dbrepo-analyse-service/Dockerfile | 3 +- dbrepo-analyse-service/app.py | 7 - .../requirements.docker.txt | 8 - dbrepo-analyse-service/requirements.txt | 54 ++- dbrepo-authentication-service/Dockerfile | 4 +- .../docker-entrypoint.sh | 6 - .../service-register.sh | 86 ----- dbrepo-broker-service/Dockerfile | 3 - dbrepo-broker-service/docker-entrypoint.sh | 4 - dbrepo-broker-service/service-register.sh | 86 ----- .../src/main/resources/application-local.yml | 7 +- .../src/main/resources/application.yml | 7 +- dbrepo-database-service/Dockerfile | 2 +- .../src/main/resources/application-local.yml | 7 +- .../src/main/resources/application.yml | 5 - dbrepo-discovery-service/.gitignore | 36 -- .../.mvn/wrapper/MavenWrapperDownloader.java | 118 ------- .../.mvn/wrapper/maven-wrapper.jar | Bin 50710 -> 0 bytes .../.mvn/wrapper/maven-wrapper.properties | 2 - dbrepo-discovery-service/Dockerfile | 38 --- dbrepo-discovery-service/mvnw | 310 ------------------ dbrepo-discovery-service/mvnw.cmd | 182 ---------- dbrepo-discovery-service/pom.xml | 131 -------- dbrepo-discovery-service/report/pom.xml | 52 --- dbrepo-discovery-service/rest-service/pom.xml | 44 --- .../DbrepoDiscoveryServiceApplication.java | 15 - .../java/at/tuwien/config/GatewayConfig.java | 32 -- .../java/at/tuwien/config/JacksonConfig.java | 31 -- .../java/at/tuwien/config/ReadyConfig.java | 23 -- .../src/main/resources/application-local.yml | 54 --- .../src/main/resources/application.yml | 48 --- .../src/main/resources/config.properties | 0 .../src/test/java/at/tuwien/BaseUnitTest.java | 9 - .../at/tuwien/MockServiceIntegrationTest.java | 37 --- .../src/test/resources/application.properties | 11 - .../src/test/resources/schema.sql | 25 -- dbrepo-discovery-service/service_ready | 6 - dbrepo-discovery-service/services/pom.xml | 16 - .../java/at/tuwien/service/MockService.java | 12 - dbrepo-gateway-service/.gitignore | 33 -- .../.mvn/wrapper/MavenWrapperDownloader.java | 118 ------- .../.mvn/wrapper/maven-wrapper.jar | Bin 50710 -> 0 bytes .../.mvn/wrapper/maven-wrapper.properties | 2 - dbrepo-gateway-service/Dockerfile | 47 +-- dbrepo-gateway-service/README.md | 18 - dbrepo-gateway-service/dbrepo.conf | 271 +++++++++++++++ dbrepo-gateway-service/mvnw | 310 ------------------ dbrepo-gateway-service/mvnw.cmd | 182 ---------- dbrepo-gateway-service/pom.xml | 149 --------- dbrepo-gateway-service/report/pom.xml | 51 --- dbrepo-gateway-service/rest-service/pom.xml | 38 --- dbrepo-gateway-service/rest-service/ready | 0 .../DbrepoGatewayServiceApplication.java | 13 - .../java/at/tuwien/config/GatewayConfig.java | 83 ----- .../java/at/tuwien/config/JacksonConfig.java | 31 -- .../java/at/tuwien/config/ReadyConfig.java | 25 -- .../main/java/at/tuwien/config/WebConfig.java | 26 -- .../src/main/resources/application-local.yml | 42 --- .../src/main/resources/application.yml | 40 --- .../src/main/resources/config.properties | 0 .../src/test/resources/application.properties | 11 - dbrepo-gateway-service/root.crt | 20 -- dbrepo-gateway-service/server.keystore | Bin 45487 -> 0 bytes dbrepo-gateway-service/service_ready | 6 - dbrepo-identifier-service/Dockerfile | 2 +- .../src/main/resources/application-local.yml | 7 +- .../src/main/resources/application.yml | 5 - dbrepo-metadata-db/pom.xml | 19 +- dbrepo-metadata-service/Dockerfile | 2 +- .../src/main/resources/application-local.yml | 9 +- .../src/main/resources/application.yml | 5 - dbrepo-proxy/Dockerfile | 4 - dbrepo-proxy/dbrepo.conf | 44 --- dbrepo-query-service/Dockerfile | 2 +- .../src/main/resources/application-docker.yml | 0 .../src/main/resources/application-local.yml | 7 +- .../src/main/resources/application.yml | 5 - dbrepo-semantics-service/Dockerfile | 15 +- dbrepo-semantics-service/app.py | 6 - dbrepo-semantics-service/requirements.txt | 63 ++-- .../src/main/resources/application-local.yml | 7 +- .../src/main/resources/application.yml | 7 +- dbrepo-ui/README.md | 2 +- dbrepo-user-service/Dockerfile | 2 +- .../src/main/resources/application-local.yml | 7 +- .../src/main/resources/application.yml | 5 - docker-compose.dbrepo1.yml | 2 +- docker-compose.prod.yml | 2 +- docker-compose.yml | 78 ++--- 90 files changed, 420 insertions(+), 2926 deletions(-) delete mode 100644 dbrepo-analyse-service/requirements.docker.txt delete mode 100644 dbrepo-authentication-service/docker-entrypoint.sh delete mode 100755 dbrepo-authentication-service/service-register.sh delete mode 100755 dbrepo-broker-service/service-register.sh delete mode 100644 dbrepo-discovery-service/.gitignore delete mode 100644 dbrepo-discovery-service/.mvn/wrapper/MavenWrapperDownloader.java delete mode 100644 dbrepo-discovery-service/.mvn/wrapper/maven-wrapper.jar delete mode 100644 dbrepo-discovery-service/.mvn/wrapper/maven-wrapper.properties delete mode 100644 dbrepo-discovery-service/Dockerfile delete mode 100755 dbrepo-discovery-service/mvnw delete mode 100644 dbrepo-discovery-service/mvnw.cmd delete mode 100644 dbrepo-discovery-service/pom.xml delete mode 100644 dbrepo-discovery-service/report/pom.xml delete mode 100644 dbrepo-discovery-service/rest-service/pom.xml delete mode 100644 dbrepo-discovery-service/rest-service/src/main/java/at/tuwien/DbrepoDiscoveryServiceApplication.java delete mode 100644 dbrepo-discovery-service/rest-service/src/main/java/at/tuwien/config/GatewayConfig.java delete mode 100644 dbrepo-discovery-service/rest-service/src/main/java/at/tuwien/config/JacksonConfig.java delete mode 100644 dbrepo-discovery-service/rest-service/src/main/java/at/tuwien/config/ReadyConfig.java delete mode 100644 dbrepo-discovery-service/rest-service/src/main/resources/application-local.yml delete mode 100644 dbrepo-discovery-service/rest-service/src/main/resources/application.yml delete mode 100644 dbrepo-discovery-service/rest-service/src/main/resources/config.properties delete mode 100644 dbrepo-discovery-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java delete mode 100644 dbrepo-discovery-service/rest-service/src/test/java/at/tuwien/MockServiceIntegrationTest.java delete mode 100644 dbrepo-discovery-service/rest-service/src/test/resources/application.properties delete mode 100644 dbrepo-discovery-service/rest-service/src/test/resources/schema.sql delete mode 100644 dbrepo-discovery-service/service_ready delete mode 100644 dbrepo-discovery-service/services/pom.xml delete mode 100644 dbrepo-discovery-service/services/src/main/java/at/tuwien/service/MockService.java delete mode 100644 dbrepo-gateway-service/.gitignore delete mode 100644 dbrepo-gateway-service/.mvn/wrapper/MavenWrapperDownloader.java delete mode 100644 dbrepo-gateway-service/.mvn/wrapper/maven-wrapper.jar delete mode 100644 dbrepo-gateway-service/.mvn/wrapper/maven-wrapper.properties delete mode 100644 dbrepo-gateway-service/README.md create mode 100644 dbrepo-gateway-service/dbrepo.conf delete mode 100755 dbrepo-gateway-service/mvnw delete mode 100644 dbrepo-gateway-service/mvnw.cmd delete mode 100644 dbrepo-gateway-service/pom.xml delete mode 100644 dbrepo-gateway-service/report/pom.xml delete mode 100644 dbrepo-gateway-service/rest-service/pom.xml delete mode 100644 dbrepo-gateway-service/rest-service/ready delete mode 100644 dbrepo-gateway-service/rest-service/src/main/java/at/tuwien/DbrepoGatewayServiceApplication.java delete mode 100644 dbrepo-gateway-service/rest-service/src/main/java/at/tuwien/config/GatewayConfig.java delete mode 100644 dbrepo-gateway-service/rest-service/src/main/java/at/tuwien/config/JacksonConfig.java delete mode 100644 dbrepo-gateway-service/rest-service/src/main/java/at/tuwien/config/ReadyConfig.java delete mode 100644 dbrepo-gateway-service/rest-service/src/main/java/at/tuwien/config/WebConfig.java delete mode 100644 dbrepo-gateway-service/rest-service/src/main/resources/application-local.yml delete mode 100644 dbrepo-gateway-service/rest-service/src/main/resources/application.yml delete mode 100644 dbrepo-gateway-service/rest-service/src/main/resources/config.properties delete mode 100644 dbrepo-gateway-service/rest-service/src/test/resources/application.properties delete mode 100644 dbrepo-gateway-service/root.crt delete mode 100644 dbrepo-gateway-service/server.keystore delete mode 100644 dbrepo-gateway-service/service_ready delete mode 100644 dbrepo-proxy/Dockerfile delete mode 100644 dbrepo-proxy/dbrepo.conf delete mode 100644 dbrepo-query-service/rest-service/src/main/resources/application-docker.yml diff --git a/.env.unix.example b/.env.unix.example index eec8b3c7bd..0c0ec3bc05 100644 --- a/.env.unix.example +++ b/.env.unix.example @@ -15,7 +15,7 @@ KEYCLOAK_ADMIN=fda KEYCLOAK_ADMIN_PASSWORD=fda BROKER_CONSUMERS=2 WEBSITE=http://localhost -GATEWAY_ENDPOINT=http://gateway-service:9095 +GATEWAY_ENDPOINT=http://gateway-service TOKEN_MAX=5 LOG_LEVEL=trace # error, warning, info, debug, trace DOI_URL="https://doi.org" diff --git a/dbrepo-analyse-service/Dockerfile b/dbrepo-analyse-service/Dockerfile index 8f78283686..d442cb5f68 100644 --- a/dbrepo-analyse-service/Dockerfile +++ b/dbrepo-analyse-service/Dockerfile @@ -4,7 +4,7 @@ MAINTAINER Martin Weise <martin.weise@tuwien.ac.at> RUN apk update && apk --no-cache add build-base gcc python3-dev libpq-dev libffi-dev py3-pandas \ py3-sqlalchemy py3-requests py3-gevent py3-psycopg2 -COPY ./requirements.docker.txt ./requirements.txt +COPY ./requirements.txt ./requirements.txt RUN pip install -r ./requirements.txt WORKDIR /app @@ -14,7 +14,6 @@ ENV FLASK_RUN_HOST=0.0.0.0 ENV PORT_APP=5000 ENV FLASK_ENV=production ENV HOSTNAME=analyse-service -ENV EUREKA_SERVER=http://discovery-service:9090/eureka/ HEALTHCHECK --interval=10s --timeout=5s --retries=12 CMD ./service_ready diff --git a/dbrepo-analyse-service/app.py b/dbrepo-analyse-service/app.py index 38ea705005..2f4601669a 100644 --- a/dbrepo-analyse-service/app.py +++ b/dbrepo-analyse-service/app.py @@ -1,11 +1,9 @@ -import os from _csv import Error from flask import Flask, request, Response from determine_dt import determine_datatypes from determine_pk import determine_pk import logging -import py_eureka_client.eureka_client as eureka_client from flasgger import Swagger from flasgger.utils import swag_from from flasgger import LazyJSONEncoder @@ -148,11 +146,6 @@ def determinepk(): rest_server_port = 5000 -eureka_client.init(eureka_server=os.getenv('EUREKA_SERVER', 'http://localhost:9090/eureka/'), - app_name=os.getenv('HOSTNAME', 'analyse-service'), - instance_ip=os.getenv('HOSTNAME', 'analyse-service'), - instance_host=os.getenv('HOSTNAME', 'analyse-service'), - instance_port=rest_server_port) if __name__ == '__main__': http_server = WSGIServer(('', 5000), app) diff --git a/dbrepo-analyse-service/requirements.docker.txt b/dbrepo-analyse-service/requirements.docker.txt deleted file mode 100644 index bf69c5bd68..0000000000 --- a/dbrepo-analyse-service/requirements.docker.txt +++ /dev/null @@ -1,8 +0,0 @@ -messytables==0.15.2 -flask==2.3.2 -flasgger==0.9.5 -py-eureka-client==0.9.1 -docker==5.0.0 -prometheus_flask_exporter==0.21.0 -pytest==7.2.1 -coverage==7.1.0 \ No newline at end of file diff --git a/dbrepo-analyse-service/requirements.txt b/dbrepo-analyse-service/requirements.txt index 61e4283c6d..81e3eb1233 100644 --- a/dbrepo-analyse-service/requirements.txt +++ b/dbrepo-analyse-service/requirements.txt @@ -1,13 +1,49 @@ +attrs==23.1.0 +certifi==2023.5.7 +chardet==5.1.0 +charset-normalizer==2.0.12 +click==8.1.3 +coverage==7.1.0 +docker==5.0.0 +exceptiongroup==1.1.1 +flasgger==0.9.5 +Flask==2.2.2 +gevent==21.8.0 +greenlet==1.1.3.post0 +html5lib==1.1 +idna==3.4 +importlib-metadata==6.6.0 +iniconfig==2.0.0 +itsdangerous==2.1.2 +Jinja2==3.1.2 +json-table-schema==0.2.1 +jsonschema==4.17.3 +lxml==4.9.2 +MarkupSafe==2.1.2 messytables==0.15.2 +mistune==2.0.5 +numpy==1.24.3 +packaging==23.1 pandas==1.2.3 -flask==2.3.2 -flasgger==0.9.5 +pluggy==1.0.0 +prometheus-client==0.16.0 +prometheus-flask-exporter==0.21.0 psycopg2-binary==2.8.6 -py-eureka-client==0.9.1 -docker==5.0.0 -sqlalchemy==1.4.15 -requests==2.26.0 -gevent==21.8.0 -prometheus_flask_exporter==0.21.0 +pyrsistent==0.19.3 pytest==7.2.1 -coverage==7.1.0 \ No newline at end of file +python-dateutil==2.8.2 +python-magic==0.4.27 +pytz==2023.3 +PyYAML==6.0 +requests==2.26.0 +six==1.16.0 +SQLAlchemy==1.4.15 +tomli==2.0.1 +urllib3==1.26.15 +webencodings==0.5.1 +websocket-client==1.5.1 +Werkzeug==2.3.3 +xlrd==2.0.1 +zipp==3.15.0 +zope.event==4.6 +zope.interface==6.0 diff --git a/dbrepo-authentication-service/Dockerfile b/dbrepo-authentication-service/Dockerfile index 3344255912..579d599274 100644 --- a/dbrepo-authentication-service/Dockerfile +++ b/dbrepo-authentication-service/Dockerfile @@ -35,8 +35,6 @@ COPY ./dbrepo-realm.json /opt/keycloak/data/import/dbrepo-realm.json WORKDIR /app -COPY ./service-register.sh ./service-register.sh -COPY ./docker-entrypoint.sh ./docker-entrypoint.sh COPY ./healthcheck.sh ./healthcheck.sh ENV METADATA_USERNAME=root @@ -54,4 +52,4 @@ ENV KEYCLOAK_ADMIN_PASSWORD=fda HEALTHCHECK --interval=10s --timeout=5s --retries=12 CMD ["bash", "/app/healthcheck.sh"] -ENTRYPOINT ["bash", "/app/docker-entrypoint.sh"] +ENTRYPOINT ["/opt/keycloak/bin/kc.sh", "start-dev", "--import-realm"] diff --git a/dbrepo-authentication-service/docker-entrypoint.sh b/dbrepo-authentication-service/docker-entrypoint.sh deleted file mode 100644 index d8e0fdcd85..0000000000 --- a/dbrepo-authentication-service/docker-entrypoint.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash - -/app/service-register.sh authentication-service 8443 8080 -(while sleep 60; do bash /app/service-register.sh authentication-service 8443 8080; done) & - -/opt/keycloak/bin/kc.sh start-dev --import-realm diff --git a/dbrepo-authentication-service/service-register.sh b/dbrepo-authentication-service/service-register.sh deleted file mode 100755 index 2d7f64be97..0000000000 --- a/dbrepo-authentication-service/service-register.sh +++ /dev/null @@ -1,86 +0,0 @@ -#!/bin/bash - -# $1 is used as the host name. - -EUREKA_HOST="discovery-service" -EUREKA_PORT="9090" -EUREKA_URI="http://$EUREKA_HOST:$EUREKA_PORT" - -SERVICE_NAME="$1" -SERVICE_PROTOCOL="http" -SERVICE_HOST="$1" -SECURE_PORT="${2:-9000}" -SERVICE_PORT="${3:-9000}" - -SERVICE_URI="$SERVICE_PROTOCOL://$SERVICE_HOST:$SERVICE_PORT" -HOME_URI="$SERVICE_URI/realms/dbrepo" -HEALTH_URI="$SERVICE_URI/health" - -# This is the URL shown in the "status" field in the -# instances section of the eureka dashboard. -# -# It's up to you to decide what the URL points to. Some -# information or status endpoint might be good. -STATUS_URI="$SERVICE_URI/health" - -# This is the name displayed to the right of the status -# on the eureka dashbard. If the app (FAKE_SERVICE) is -# registered with more than one hostname, they will be -# displayed as a comma-separated list. This hostname -# is part of the heartbeat message. -# -# If you'll have more than one host per service, -# make sure they have different host names. -HOST_NAME="${1:-fake01}" - -# Everyone of these parameters seem to be required. I don't know -# anything about secureVipAddress and vipAddress. -# -# dataCenterInfo must have a name of "MyOwn" or "Amazon". -# -# status can be UP, DOWN, STARTING, OUT_OF_SERVICE, UNKNOWN. -# if the registration status is STARTING, then the service -# will never be evicted. Also, simply sending a Heartbeat -# does not change the status. -# -# The metadata fields can be any information you want associated -# with a service. I recommend keeping it short. -# - -cat <<EOF > /tmp/json.json -{ - "instance": { - "instanceId": "$SERVICE_NAME:$SERVICE_NAME:$SERVICE_PORT", - "hostName": "$HOST_NAME", - "app": "$SERVICE_NAME", - "ipAddr": "$SERVICE_HOST", - "status": "UP", - "dataCenterInfo": { - "@class": "com.netflix.appinfo.MyDataCenterInfo", - "name": "MyOwn" - }, - "healthCheckUrl": "$HEALTH_URI", - "homePageUrl": "$HOME_URI", - "leaseInfo": { - "evictionDurationInSecs": 90 - }, - "metadata": { - "zone": "default", - "management.port": "8443" - }, - "port": { - "\$": "$SERVICE_PORT", - "@enabled": "true" - }, - "securePort": { - "\$": "$SECURE_PORT", - "@enabled": "true" - }, - "vipAddress": "$SERVICE_HOST", - "secureVipAddress": "$SERVICE_HOST", - "statusPageUrl": "$STATUS_URI" - } -} -EOF - -curl --header "content-type: application/json" --data-binary @/tmp/json.json --silent $EUREKA_URI/eureka/apps/$SERVICE_NAME diff --git a/dbrepo-broker-service/Dockerfile b/dbrepo-broker-service/Dockerfile index 1b46c7899b..c6824832c3 100644 --- a/dbrepo-broker-service/Dockerfile +++ b/dbrepo-broker-service/Dockerfile @@ -16,12 +16,9 @@ COPY ./rabbitmq.conf /etc/rabbitmq/rabbitmq.conf WORKDIR /app COPY ./init.sh ./init.sh -COPY ./service-register.sh ./service-register.sh COPY ./service_ready /usr/bin/service_ready COPY ./docker-entrypoint.sh ./docker-entrypoint.sh -RUN chmod +x ./service-register.sh - HEALTHCHECK --interval=10s --timeout=5s --retries=12 CMD service_ready ENTRYPOINT [ "bash", "/app/docker-entrypoint.sh" ] \ No newline at end of file diff --git a/dbrepo-broker-service/docker-entrypoint.sh b/dbrepo-broker-service/docker-entrypoint.sh index 788bd0723f..b062814baf 100755 --- a/dbrepo-broker-service/docker-entrypoint.sh +++ b/dbrepo-broker-service/docker-entrypoint.sh @@ -6,8 +6,4 @@ bash ./init.sh # enable prometheus plugin (sleep 10; rabbitmq-plugins enable rabbitmq_prometheus rabbitmq_mqtt rabbitmq_auth_backend_oauth2 rabbitmq_auth_mechanism_ssl; touch /ready) & -# register with discovery service -/app/service-register.sh broker-service 15672 15672 -(while sleep 60; do /app/service-register.sh broker-service 15672 15672; done) & - rabbitmq-server \ No newline at end of file diff --git a/dbrepo-broker-service/service-register.sh b/dbrepo-broker-service/service-register.sh deleted file mode 100755 index 6cda6f4300..0000000000 --- a/dbrepo-broker-service/service-register.sh +++ /dev/null @@ -1,86 +0,0 @@ -#!/bin/bash - -# $1 is used as the host name. - -EUREKA_HOST="discovery-service" -EUREKA_PORT="9090" -EUREKA_URI="http://$EUREKA_HOST:$EUREKA_PORT" - -SERVICE_NAME="$1" -SERVICE_PROTOCOL="http" -SERVICE_HOST="$1" -SECURE_PORT="${2:-9000}" -SERVICE_PORT="${3:-9000}" - -SERVICE_URI="$SERVICE_PROTOCOL://$SERVICE_HOST:$SERVICE_PORT" -HOME_URI="$SERVICE_URI/realms/dbrepo" -HEALTH_URI="$SERVICE_URI/health" - -# This is the URL shown in the "status" field in the -# instances section of the eureka dashboard. -# -# It's up to you to decide what the URL points to. Some -# information or status endpoint might be good. -STATUS_URI="$SERVICE_URI/health" - -# This is the name displayed to the right of the status -# on the eureka dashbard. If the app (FAKE_SERVICE) is -# registered with more than one hostname, they will be -# displayed as a comma-separated list. This hostname -# is part of the heartbeat message. -# -# If you'll have more than one host per service, -# make sure they have different host names. -HOST_NAME="${1:-fake01}" - -# Everyone of these parameters seem to be required. I don't know -# anything about secureVipAddress and vipAddress. -# -# dataCenterInfo must have a name of "MyOwn" or "Amazon". -# -# status can be UP, DOWN, STARTING, OUT_OF_SERVICE, UNKNOWN. -# if the registration status is STARTING, then the service -# will never be evicted. Also, simply sending a Heartbeat -# does not change the status. -# -# The metadata fields can be any information you want associated -# with a service. I recommend keeping it short. -# - -cat <<EOF > /tmp/json.json -{ - "instance": { - "instanceId": "$SERVICE_NAME:$SERVICE_NAME:$SERVICE_PORT", - "hostName": "$HOST_NAME", - "app": "$SERVICE_NAME", - "ipAddr": "$SERVICE_HOST", - "status": "UP", - "dataCenterInfo": { - "@class": "com.netflix.appinfo.MyDataCenterInfo", - "name": "MyOwn" - }, - "healthCheckUrl": "$HEALTH_URI", - "homePageUrl": "$HOME_URI", - "leaseInfo": { - "evictionDurationInSecs": 90 - }, - "metadata": { - "zone": "default", - "management.port": "15672" - }, - "port": { - "\$": "$SERVICE_PORT", - "@enabled": "true" - }, - "securePort": { - "\$": "$SECURE_PORT", - "@enabled": "false" - }, - "vipAddress": "$SERVICE_HOST", - "secureVipAddress": "$SERVICE_HOST", - "statusPageUrl": "$STATUS_URI" - } -} -EOF - -curl --header "content-type: application/json" --data-binary @/tmp/json.json --silent $EUREKA_URI/eureka/apps/$SERVICE_NAME diff --git a/dbrepo-container-service/rest-service/src/main/resources/application-local.yml b/dbrepo-container-service/rest-service/src/main/resources/application-local.yml index ca57158d4d..5ffa215283 100644 --- a/dbrepo-container-service/rest-service/src/main/resources/application-local.yml +++ b/dbrepo-container-service/rest-service/src/main/resources/application-local.yml @@ -36,11 +36,6 @@ logging: root: warn at.tuwien.: trace org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug -eureka: - instance: - hostname: container-service - non-secure-port: 9091 - client.serviceUrl.defaultZone: http://localhost:9090/eureka/ fda: network: userdb mount.path: /tmp @@ -50,4 +45,4 @@ fda: public_key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqqnHQ2BWWW9vDNLRCcxD++xZg/16oqMo/c1l+lcFEjjAIJjJp/HqrPYU/U9GvquGE6PbVFtTzW1KcKawOW+FJNOA3CGo8Q1TFEfz43B8rZpKsFbJKvQGVv1Z4HaKPvLUm7iMm8Hv91cLduuoWx6Q3DPe2vg13GKKEZe7UFghF+0T9u8EKzA/XqQ0OiICmsmYPbwvf9N3bCKsB/Y10EYmZRb8IhCoV9mmO5TxgWgiuNeCTtNCv2ePYqL/U0WvyGFW0reasIK8eg3KrAUj8DpyOgPOVBn3lBGf+3KFSYi+0bwZbJZWqbC/Xlk20Go1YfeJPRIt7ImxD27R/lNjgDO/MwIDAQAB client_secret: client-secret client_id: dbrepo-client - gateway.endpoint: http://localhost:9095 \ No newline at end of file + gateway.endpoint: http://localhost \ No newline at end of file diff --git a/dbrepo-container-service/rest-service/src/main/resources/application.yml b/dbrepo-container-service/rest-service/src/main/resources/application.yml index 4d1061d164..d0b2927e65 100644 --- a/dbrepo-container-service/rest-service/src/main/resources/application.yml +++ b/dbrepo-container-service/rest-service/src/main/resources/application.yml @@ -36,11 +36,6 @@ logging: root: warn at.tuwien.: "${LOG_LEVEL}" org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug -eureka: - instance: - hostname: container-service - non-secure-port: 9091 - client.serviceUrl.defaultZone: http://discovery-service:9090/eureka/ fda: network: "${USER_NETWORK}" mount.path: "${SHARED_FILESYSTEM}" @@ -50,4 +45,4 @@ fda: public_key: "${JWT_PUBKEY}" client_secret: "${DBREPO_CLIENT_SECRET}" client_id: "${CLIENT_ID}" - gateway.endpoint: http://gateway-service:9095 \ No newline at end of file + gateway.endpoint: http://gateway-service \ No newline at end of file diff --git a/dbrepo-database-service/Dockerfile b/dbrepo-database-service/Dockerfile index b181da3570..a2d4257a25 100644 --- a/dbrepo-database-service/Dockerfile +++ b/dbrepo-database-service/Dockerfile @@ -29,7 +29,7 @@ ENV BROKER_PASSWORD=fda ENV SEARCH_ENDPOINT=search-service ENV SEARCH_USERNAME=elastic ENV SEARCH_PASSWORD=elastic -ENV GATEWAY_ENDPOINT=http://gateway-service:9095 +ENV GATEWAY_ENDPOINT=http://gateway-service ENV LOG_LEVEL=debug ENV DBREPO_CLIENT_SECRET=client-secret ENV CLIENT_ID=dbrepo-client diff --git a/dbrepo-database-service/rest-service/src/main/resources/application-local.yml b/dbrepo-database-service/rest-service/src/main/resources/application-local.yml index c6bb7a1caa..0fdd60eace 100644 --- a/dbrepo-database-service/rest-service/src/main/resources/application-local.yml +++ b/dbrepo-database-service/rest-service/src/main/resources/application-local.yml @@ -35,11 +35,6 @@ logging: root: warn at.tuwien.: info org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug -eureka: - instance: - hostname: database-service - non-secure-port: 9092 - client.serviceUrl.defaultZone: http://localhost:9090/eureka/ fda: elastic: endpoint: localhost:9200 @@ -51,4 +46,4 @@ fda: public_key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqqnHQ2BWWW9vDNLRCcxD++xZg/16oqMo/c1l+lcFEjjAIJjJp/HqrPYU/U9GvquGE6PbVFtTzW1KcKawOW+FJNOA3CGo8Q1TFEfz43B8rZpKsFbJKvQGVv1Z4HaKPvLUm7iMm8Hv91cLduuoWx6Q3DPe2vg13GKKEZe7UFghF+0T9u8EKzA/XqQ0OiICmsmYPbwvf9N3bCKsB/Y10EYmZRb8IhCoV9mmO5TxgWgiuNeCTtNCv2ePYqL/U0WvyGFW0reasIK8eg3KrAUj8DpyOgPOVBn3lBGf+3KFSYi+0bwZbJZWqbC/Xlk20Go1YfeJPRIt7ImxD27R/lNjgDO/MwIDAQAB client_secret: client-secret client_id: dbrepo-client - gateway.endpoint: http://localhost:9095 \ No newline at end of file + gateway.endpoint: http://localhost \ No newline at end of file diff --git a/dbrepo-database-service/rest-service/src/main/resources/application.yml b/dbrepo-database-service/rest-service/src/main/resources/application.yml index 434d09b0be..88ffaa9d7f 100644 --- a/dbrepo-database-service/rest-service/src/main/resources/application.yml +++ b/dbrepo-database-service/rest-service/src/main/resources/application.yml @@ -35,11 +35,6 @@ logging: root: warn at.tuwien.: "${LOG_LEVEL}" org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug -eureka: - instance: - hostname: database-service - non-secure-port: 9092 - client.serviceUrl.defaultZone: http://discovery-service:9090/eureka/ fda: elastic: endpoint: search-service:9200 diff --git a/dbrepo-discovery-service/.gitignore b/dbrepo-discovery-service/.gitignore deleted file mode 100644 index b60573d098..0000000000 --- a/dbrepo-discovery-service/.gitignore +++ /dev/null @@ -1,36 +0,0 @@ -HELP.md -target/ -!.mvn/wrapper/maven-wrapper.jar -!**/src/main/**/target/ -!**/src/test/**/target/ - -## Generated -rest-service/ready - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ -build/ -!**/src/main/**/build/ -!**/src/test/**/build/ - -### VS Code ### -.vscode/ diff --git a/dbrepo-discovery-service/.mvn/wrapper/MavenWrapperDownloader.java b/dbrepo-discovery-service/.mvn/wrapper/MavenWrapperDownloader.java deleted file mode 100644 index a45eb6ba26..0000000000 --- a/dbrepo-discovery-service/.mvn/wrapper/MavenWrapperDownloader.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright 2007-present the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import java.net.*; -import java.io.*; -import java.nio.channels.*; -import java.util.Properties; - -public class MavenWrapperDownloader { - - private static final String WRAPPER_VERSION = "0.5.6"; - /** - * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. - */ - private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" - + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; - - /** - * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to - * use instead of the default one. - */ - private static final String MAVEN_WRAPPER_PROPERTIES_PATH = - ".mvn/wrapper/maven-wrapper.properties"; - - /** - * Path where the maven-wrapper.jar will be saved to. - */ - private static final String MAVEN_WRAPPER_JAR_PATH = - ".mvn/wrapper/maven-wrapper.jar"; - - /** - * Name of the property which should be used to override the default download url for the wrapper. - */ - private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; - - public static void main(String args[]) { - System.out.println("- Downloader started"); - File baseDirectory = new File(args[0]); - System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); - - // If the maven-wrapper.properties exists, read it and check if it contains a custom - // wrapperUrl parameter. - File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); - String url = DEFAULT_DOWNLOAD_URL; - if (mavenWrapperPropertyFile.exists()) { - FileInputStream mavenWrapperPropertyFileInputStream = null; - try { - mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); - Properties mavenWrapperProperties = new Properties(); - mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); - url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); - } catch (IOException e) { - System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); - } finally { - try { - if (mavenWrapperPropertyFileInputStream != null) { - mavenWrapperPropertyFileInputStream.close(); - } - } catch (IOException e) { - // Ignore ... - } - } - } - System.out.println("- Downloading from: " + url); - - File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); - if (!outputFile.getParentFile().exists()) { - if (!outputFile.getParentFile().mkdirs()) { - System.out.println( - "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); - } - } - System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); - try { - downloadFileFromURL(url, outputFile); - System.out.println("Done"); - System.exit(0); - } catch (Throwable e) { - System.out.println("- Error downloading"); - e.printStackTrace(); - System.exit(1); - } - } - - private static void downloadFileFromURL(String urlString, File destination) throws Exception { - if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { - String username = System.getenv("MVNW_USERNAME"); - char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); - Authenticator.setDefault(new Authenticator() { - @Override - protected PasswordAuthentication getPasswordAuthentication() { - return new PasswordAuthentication(username, password); - } - }); - } - URL website = new URL(urlString); - ReadableByteChannel rbc; - rbc = Channels.newChannel(website.openStream()); - FileOutputStream fos = new FileOutputStream(destination); - fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); - fos.close(); - rbc.close(); - } - -} diff --git a/dbrepo-discovery-service/.mvn/wrapper/maven-wrapper.jar b/dbrepo-discovery-service/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index 2cc7d4a55c0cd0092912bf49ae38b3a9e3fd0054..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50710 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 diff --git a/dbrepo-discovery-service/.mvn/wrapper/maven-wrapper.properties b/dbrepo-discovery-service/.mvn/wrapper/maven-wrapper.properties deleted file mode 100644 index 642d572ce9..0000000000 --- a/dbrepo-discovery-service/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1,2 +0,0 @@ -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip -wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar diff --git a/dbrepo-discovery-service/Dockerfile b/dbrepo-discovery-service/Dockerfile deleted file mode 100644 index b216c09e09..0000000000 --- a/dbrepo-discovery-service/Dockerfile +++ /dev/null @@ -1,38 +0,0 @@ -###### FIRST STAGE ###### -FROM dbrepo-metadata-db:latest as dependency -MAINTAINER Martin Weise <martin.weise@tuwien.ac.at> - -###### SECOND STAGE ###### -FROM maven:slim as build - -COPY ./pom.xml ./ - -RUN mvn -fn -B dependency:go-offline > /dev/null - -COPY --from=dependency /root/.m2/repository/at/tuwien /root/.m2/repository/at/tuwien - -COPY ./rest-service ./rest-service -COPY ./services ./services -COPY ./report ./report - -# Make sure it compiles -RUN mvn -q clean package -DskipTests - -###### THIRD STAGE ###### -FROM openjdk:11-jre-slim as runtime - -ENV METADATA_DB=fda -ENV METADATA_USERNAME=postgres -ENV METADATA_PASSWORD=postgres -ENV LOG_LEVEL=debug - -COPY ./service_ready /usr/bin -RUN chmod +x /usr/bin/service_ready - -HEALTHCHECK --interval=10s --timeout=5s --retries=12 CMD service_ready - -COPY --from=build ./rest-service/target/rest-service-*.jar ./rest-service.jar - -EXPOSE 9090 - -ENTRYPOINT ["java", "-Dlog4j2.formatMsgNoLookups=true", "-jar", "./rest-service.jar"] diff --git a/dbrepo-discovery-service/mvnw b/dbrepo-discovery-service/mvnw deleted file mode 100755 index dea2123dcc..0000000000 --- a/dbrepo-discovery-service/mvnw +++ /dev/null @@ -1,310 +0,0 @@ -#!/bin/sh -# ---------------------------------------------------------------------------- -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# ---------------------------------------------------------------------------- - -# ---------------------------------------------------------------------------- -# Maven Start Up Batch script -# -# Required ENV vars: -# ------------------ -# JAVA_HOME - location of a JDK home dir -# -# Optional ENV vars -# ----------------- -# M2_HOME - location of maven2's installed home dir -# MAVEN_OPTS - parameters passed to the Java VM when running Maven -# e.g. to debug Maven itself, use -# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -# MAVEN_SKIP_RC - flag to disable loading of mavenrc files -# ---------------------------------------------------------------------------- - -if [ -z "$MAVEN_SKIP_RC" ] ; then - - if [ -f /etc/mavenrc ] ; then - . /etc/mavenrc - fi - - if [ -f "$HOME/.mavenrc" ] ; then - . "$HOME/.mavenrc" - fi - -fi - -# OS specific support. $var _must_ be set to either true or false. -cygwin=false; -darwin=false; -mingw=false -case "`uname`" in - CYGWIN*) cygwin=true ;; - MINGW*) mingw=true;; - Darwin*) darwin=true - # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home - # See https://developer.apple.com/library/mac/qa/qa1170/_index.html - if [ -z "$JAVA_HOME" ]; then - if [ -x "/usr/libexec/java_home" ]; then - export JAVA_HOME="`/usr/libexec/java_home`" - else - export JAVA_HOME="/Library/Java/Home" - fi - fi - ;; -esac - -if [ -z "$JAVA_HOME" ] ; then - if [ -r /etc/gentoo-release ] ; then - JAVA_HOME=`java-at.tuwien.gateway.config --jre-home` - fi -fi - -if [ -z "$M2_HOME" ] ; then - ## resolve links - $0 may be a link to maven's home - PRG="$0" - - # need this for relative symlinks - while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG="`dirname "$PRG"`/$link" - fi - done - - saveddir=`pwd` - - M2_HOME=`dirname "$PRG"`/.. - - # make it fully qualified - M2_HOME=`cd "$M2_HOME" && pwd` - - cd "$saveddir" - # echo Using m2 at $M2_HOME -fi - -# For Cygwin, ensure paths are in UNIX format before anything is touched -if $cygwin ; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --unix "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --unix "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --unix "$CLASSPATH"` -fi - -# For Mingw, ensure paths are in UNIX format before anything is touched -if $mingw ; then - [ -n "$M2_HOME" ] && - M2_HOME="`(cd "$M2_HOME"; pwd)`" - [ -n "$JAVA_HOME" ] && - JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" -fi - -if [ -z "$JAVA_HOME" ]; then - javaExecutable="`which javac`" - if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then - # readlink(1) is not available as standard on Solaris 10. - readLink=`which readlink` - if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then - if $darwin ; then - javaHome="`dirname \"$javaExecutable\"`" - javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" - else - javaExecutable="`readlink -f \"$javaExecutable\"`" - fi - javaHome="`dirname \"$javaExecutable\"`" - javaHome=`expr "$javaHome" : '\(.*\)/bin'` - JAVA_HOME="$javaHome" - export JAVA_HOME - fi - fi -fi - -if [ -z "$JAVACMD" ] ; then - if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - else - JAVACMD="`which java`" - fi -fi - -if [ ! -x "$JAVACMD" ] ; then - echo "Error: JAVA_HOME is not defined correctly." >&2 - echo " We cannot execute $JAVACMD" >&2 - exit 1 -fi - -if [ -z "$JAVA_HOME" ] ; then - echo "Warning: JAVA_HOME environment variable is not set." -fi - -CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher - -# traverses directory structure from process work directory to filesystem root -# first directory with .mvn subdirectory is considered project base directory -find_maven_basedir() { - - if [ -z "$1" ] - then - echo "Path not specified to find_maven_basedir" - return 1 - fi - - basedir="$1" - wdir="$1" - while [ "$wdir" != '/' ] ; do - if [ -d "$wdir"/.mvn ] ; then - basedir=$wdir - break - fi - # workaround for JBEAP-8937 (on Solaris 10/Sparc) - if [ -d "${wdir}" ]; then - wdir=`cd "$wdir/.."; pwd` - fi - # end of workaround - done - echo "${basedir}" -} - -# concatenates all lines of a file -concat_lines() { - if [ -f "$1" ]; then - echo "$(tr -s '\n' ' ' < "$1")" - fi -} - -BASE_DIR=`find_maven_basedir "$(pwd)"` -if [ -z "$BASE_DIR" ]; then - exit 1; -fi - -########################################################################################## -# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -# This allows using the maven wrapper in projects that prohibit checking in binary data. -########################################################################################## -if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found .mvn/wrapper/maven-wrapper.jar" - fi -else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." - fi - if [ -n "$MVNW_REPOURL" ]; then - jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - else - jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - fi - while IFS="=" read key value; do - case "$key" in (wrapperUrl) jarUrl="$value"; break ;; - esac - done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" - if [ "$MVNW_VERBOSE" = true ]; then - echo "Downloading from: $jarUrl" - fi - wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" - if $cygwin; then - wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` - fi - - if command -v wget > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found wget ... using wget" - fi - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - wget "$jarUrl" -O "$wrapperJarPath" - else - wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" - fi - elif command -v curl > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found curl ... using curl" - fi - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - curl -o "$wrapperJarPath" "$jarUrl" -f - else - curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f - fi - - else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Falling back to using Java to download" - fi - javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" - # For Cygwin, switch paths to Windows format before running javac - if $cygwin; then - javaClass=`cygpath --path --windows "$javaClass"` - fi - if [ -e "$javaClass" ]; then - if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Compiling MavenWrapperDownloader.java ..." - fi - # Compiling the Java class - ("$JAVA_HOME/bin/javac" "$javaClass") - fi - if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - # Running the downloader - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Running MavenWrapperDownloader.java ..." - fi - ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") - fi - fi - fi -fi -########################################################################################## -# End of extension -########################################################################################## - -export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} -if [ "$MVNW_VERBOSE" = true ]; then - echo $MAVEN_PROJECTBASEDIR -fi -MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" - -# For Cygwin, switch paths to Windows format before running java -if $cygwin; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --path --windows "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --windows "$CLASSPATH"` - [ -n "$MAVEN_PROJECTBASEDIR" ] && - MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` -fi - -# Provide a "standardized" way to retrieve the CLI args that will -# work with both Windows and non-Windows executions. -MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" -export MAVEN_CMD_LINE_ARGS - -WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -exec "$JAVACMD" \ - $MAVEN_OPTS \ - -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/dbrepo-discovery-service/mvnw.cmd b/dbrepo-discovery-service/mvnw.cmd deleted file mode 100644 index 4a6729c8ab..0000000000 --- a/dbrepo-discovery-service/mvnw.cmd +++ /dev/null @@ -1,182 +0,0 @@ -@REM ---------------------------------------------------------------------------- -@REM Licensed to the Apache Software Foundation (ASF) under one -@REM or more contributor license agreements. See the NOTICE file -@REM distributed with this work for additional information -@REM regarding copyright ownership. The ASF licenses this file -@REM to you under the Apache License, Version 2.0 (the -@REM "License"); you may not use this file except in compliance -@REM with the License. You may obtain a copy of the License at -@REM -@REM https://www.apache.org/licenses/LICENSE-2.0 -@REM -@REM Unless required by applicable law or agreed to in writing, -@REM software distributed under the License is distributed on an -@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -@REM KIND, either express or implied. See the License for the -@REM specific language governing permissions and limitations -@REM under the License. -@REM ---------------------------------------------------------------------------- - -@REM ---------------------------------------------------------------------------- -@REM Maven Start Up Batch script -@REM -@REM Required ENV vars: -@REM JAVA_HOME - location of a JDK home dir -@REM -@REM Optional ENV vars -@REM M2_HOME - location of maven2's installed home dir -@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending -@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven -@REM e.g. to debug Maven itself, use -@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files -@REM ---------------------------------------------------------------------------- - -@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' -@echo off -@REM set title of command window -title %0 -@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' -@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% - -@REM set %HOME% to equivalent of $HOME -if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") - -@REM Execute a user defined script before this one -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre -@REM check for pre script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" -if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" -:skipRcPre - -@setlocal - -set ERROR_CODE=0 - -@REM To isolate internal variables from possible post scripts, we use another setlocal -@setlocal - -@REM ==== START VALIDATION ==== -if not "%JAVA_HOME%" == "" goto OkJHome - -echo. -echo Error: JAVA_HOME not found in your environment. >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -:OkJHome -if exist "%JAVA_HOME%\bin\java.exe" goto init - -echo. -echo Error: JAVA_HOME is set to an invalid directory. >&2 -echo JAVA_HOME = "%JAVA_HOME%" >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -@REM ==== END VALIDATION ==== - -:init - -@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". -@REM Fallback to current working directory if not found. - -set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% -IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir - -set EXEC_DIR=%CD% -set WDIR=%EXEC_DIR% -:findBaseDir -IF EXIST "%WDIR%"\.mvn goto baseDirFound -cd .. -IF "%WDIR%"=="%CD%" goto baseDirNotFound -set WDIR=%CD% -goto findBaseDir - -:baseDirFound -set MAVEN_PROJECTBASEDIR=%WDIR% -cd "%EXEC_DIR%" -goto endDetectBaseDir - -:baseDirNotFound -set MAVEN_PROJECTBASEDIR=%EXEC_DIR% -cd "%EXEC_DIR%" - -:endDetectBaseDir - -IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.at.tuwien.gateway.config" goto endReadAdditionalConfig - -@setlocal EnableExtensions EnableDelayedExpansion -for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.at.tuwien.gateway.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a -@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% - -:endReadAdditionalConfig - -SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" -set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" -set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - -FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( - IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B -) - -@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -@REM This allows using the maven wrapper in projects that prohibit checking in binary data. -if exist %WRAPPER_JAR% ( - if "%MVNW_VERBOSE%" == "true" ( - echo Found %WRAPPER_JAR% - ) -) else ( - if not "%MVNW_REPOURL%" == "" ( - SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - ) - if "%MVNW_VERBOSE%" == "true" ( - echo Couldn't find %WRAPPER_JAR%, downloading it ... - echo Downloading from: %DOWNLOAD_URL% - ) - - powershell -Command "&{"^ - "$webclient = new-object System.Net.WebClient;"^ - "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ - "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ - "}"^ - "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ - "}" - if "%MVNW_VERBOSE%" == "true" ( - echo Finished downloading %WRAPPER_JAR% - ) -) -@REM End of extension - -@REM Provide a "standardized" way to retrieve the CLI args that will -@REM work with both Windows and non-Windows executions. -set MAVEN_CMD_LINE_ARGS=%* - -%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* -if ERRORLEVEL 1 goto error -goto end - -:error -set ERROR_CODE=1 - -:end -@endlocal & set ERROR_CODE=%ERROR_CODE% - -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost -@REM check for post script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" -if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" -:skipRcPost - -@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' -if "%MAVEN_BATCH_PAUSE%" == "on" pause - -if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% - -exit /B %ERROR_CODE% diff --git a/dbrepo-discovery-service/pom.xml b/dbrepo-discovery-service/pom.xml deleted file mode 100644 index c7b10ef2f4..0000000000 --- a/dbrepo-discovery-service/pom.xml +++ /dev/null @@ -1,131 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-parent</artifactId> - <version>2.3.10.RELEASE</version> - </parent> - - <groupId>at.tuwien</groupId> - <artifactId>dbrepo-discovery-service</artifactId> - <version>1.2.0</version> - <name>dbrepo-discovery-service</name> - <description>Demo project for Spring Boot</description> - - <packaging>pom</packaging> - <modules> - <module>report</module> - <module>rest-service</module> - <module>services</module> - </modules> - - <properties> - <java.version>11</java.version> - <spring-cloud.version>3.0.1</spring-cloud.version> - <jacoco.version>0.8.7</jacoco.version> - </properties> - - <dependencies> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-web</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.cloud</groupId> - <artifactId>spring-cloud-starter-bootstrap</artifactId> - <version>${spring-cloud.version}</version> - </dependency> - <dependency> - <groupId>org.springframework.cloud</groupId> - <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> - <version>${spring-cloud.version}</version> - </dependency> - <!-- Data Source --> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-data-jpa</artifactId> - </dependency> - <dependency> - <groupId>org.mariadb.jdbc</groupId> - <artifactId>mariadb-java-client</artifactId> - <version>${mariadb.version}</version> - </dependency> - <!-- Monitoring --> - <dependency> - <groupId>io.micrometer</groupId> - <artifactId>micrometer-registry-prometheus</artifactId> - <scope>runtime</scope> - </dependency> - <!-- IDE --> - <dependency> - <groupId>org.projectlombok</groupId> - <artifactId>lombok</artifactId> - </dependency> - <!-- Testing --> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-test</artifactId> - <scope>test</scope> - <exclusions> - <exclusion> - <groupId>org.junit.jupiter</groupId> - <artifactId>junit-vintage-engine</artifactId> - </exclusion> - </exclusions> - </dependency> - <dependency> - <groupId>com.h2database</groupId> - <artifactId>h2</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.jacoco</groupId> - <artifactId>jacoco-maven-plugin</artifactId> - <version>${jacoco.version}</version> - </dependency> - <dependency> - <groupId>at.tuwien</groupId> - <artifactId>dbrepo-metadata-db-test</artifactId> - <version>${project.version}</version> - <scope>test</scope> - </dependency> - </dependencies> - - <build> - <plugins> - <plugin> - <groupId>org.jacoco</groupId> - <artifactId>jacoco-maven-plugin</artifactId> - <version>${jacoco.version}</version> - <configuration> - <excludes> - <exclude>at/tuwien/utils/**/*</exclude> - <exclude>at/tuwien/seeder/**/*</exclude> - <exclude>at/tuwien/mapper/**/*</exclude> - <exclude>at/tuwien/exception/**/*</exclude> - <exclude>at/tuwien/config/**/*</exclude> - <exclude>**/DbrepoDiscoveryServiceApplication.class</exclude> - </excludes> - </configuration> - <executions> - <execution> - <id>default-prepare-agent</id> - <goals> - <goal>prepare-agent</goal> - </goals> - </execution> - <execution> - <id>report</id> - <phase>verify</phase> - <goals> - <goal>report</goal> - </goals> - </execution> - </executions> - </plugin> - </plugins> - </build> - -</project> diff --git a/dbrepo-discovery-service/report/pom.xml b/dbrepo-discovery-service/report/pom.xml deleted file mode 100644 index e5f5fcaad7..0000000000 --- a/dbrepo-discovery-service/report/pom.xml +++ /dev/null @@ -1,52 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <groupId>at.tuwien</groupId> - <artifactId>dbrepo-discovery-service</artifactId> - <version>1.2.0</version> - </parent> - - <artifactId>report</artifactId> - <version>1.2.0</version> - <name>dbrepo-discovery-service-report</name> - - <properties> - <jacoco.version>0.8.7</jacoco.version> - </properties> - - <dependencies> - <dependency> - <groupId>at.tuwien</groupId> - <artifactId>rest-service</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>at.tuwien</groupId> - <artifactId>services</artifactId> - <version>${project.version}</version> - </dependency> - </dependencies> - - <build> - <plugins> - <plugin> - <groupId>org.jacoco</groupId> - <artifactId>jacoco-maven-plugin</artifactId> - <version>${jacoco.version}</version> - <executions> - <execution> - <id>report-aggregate</id> - <phase>verify</phase> - <goals> - <goal>report-aggregate</goal> - </goals> - </execution> - </executions> - </plugin> - </plugins> - </build> - -</project> \ No newline at end of file diff --git a/dbrepo-discovery-service/rest-service/pom.xml b/dbrepo-discovery-service/rest-service/pom.xml deleted file mode 100644 index 453330597b..0000000000 --- a/dbrepo-discovery-service/rest-service/pom.xml +++ /dev/null @@ -1,44 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <groupId>at.tuwien</groupId> - <artifactId>dbrepo-discovery-service</artifactId> - <version>1.2.0</version> - </parent> - - <artifactId>rest-service</artifactId> - <version>1.2.0</version> - <name>dbrepo-discovery-service-discovery</name> - - <properties> - <jacoco.version>0.8.7</jacoco.version> - </properties> - - <build> - <plugins> - <plugin> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-maven-plugin</artifactId> - <executions> - <execution> - <goals> - <goal>repackage</goal><!-- to make it exuteable with $ java -jar ./app.jar --> - </goals> - </execution> - </executions> - </plugin> - </plugins> - </build> - - <dependencies> - <dependency> - <groupId>at.tuwien</groupId> - <artifactId>services</artifactId> - <version>${project.version}</version> - </dependency> - </dependencies> - -</project> \ No newline at end of file diff --git a/dbrepo-discovery-service/rest-service/src/main/java/at/tuwien/DbrepoDiscoveryServiceApplication.java b/dbrepo-discovery-service/rest-service/src/main/java/at/tuwien/DbrepoDiscoveryServiceApplication.java deleted file mode 100644 index 6561edd18f..0000000000 --- a/dbrepo-discovery-service/rest-service/src/main/java/at/tuwien/DbrepoDiscoveryServiceApplication.java +++ /dev/null @@ -1,15 +0,0 @@ -package at.tuwien; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; - -@SpringBootApplication -@EnableEurekaServer -public class DbrepoDiscoveryServiceApplication { - - public static void main(String[] args) { - SpringApplication.run(DbrepoDiscoveryServiceApplication.class, args); - } - -} diff --git a/dbrepo-discovery-service/rest-service/src/main/java/at/tuwien/config/GatewayConfig.java b/dbrepo-discovery-service/rest-service/src/main/java/at/tuwien/config/GatewayConfig.java deleted file mode 100644 index cb0c9ffc9e..0000000000 --- a/dbrepo-discovery-service/rest-service/src/main/java/at/tuwien/config/GatewayConfig.java +++ /dev/null @@ -1,32 +0,0 @@ -package at.tuwien.config; - -import lombok.Getter; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.client.support.BasicAuthenticationInterceptor; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.util.DefaultUriBuilderFactory; - -@Getter -@Configuration -public class GatewayConfig { - - @Value("${fda.gateway.endpoint}") - private String gatewayEndpoint; - - @Value("${spring.rabbitmq.username}") - private String brokerUsername; - - @Value("${spring.rabbitmq.password}") - private String brokerPassword; - - @Bean("brokerRestTemplate") - public RestTemplate brokerRestTemplate() { - final RestTemplate restTemplate = new RestTemplate(); - restTemplate.setUriTemplateHandler(new DefaultUriBuilderFactory(gatewayEndpoint)); - restTemplate.getInterceptors() - .add(new BasicAuthenticationInterceptor(brokerUsername, brokerPassword)); - return restTemplate; - } -} diff --git a/dbrepo-discovery-service/rest-service/src/main/java/at/tuwien/config/JacksonConfig.java b/dbrepo-discovery-service/rest-service/src/main/java/at/tuwien/config/JacksonConfig.java deleted file mode 100644 index fba7f99cf2..0000000000 --- a/dbrepo-discovery-service/rest-service/src/main/java/at/tuwien/config/JacksonConfig.java +++ /dev/null @@ -1,31 +0,0 @@ -package at.tuwien.config; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.Date; -import java.util.TimeZone; - -@Slf4j -@Configuration -public class JacksonConfig { - - @Bean - public ObjectMapper objectMapper() throws JsonProcessingException { - final ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.findAndRegisterModules(); - objectMapper.registerModule(new Jdk8Module()); - objectMapper.registerModule(new JavaTimeModule()); - objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); - objectMapper.setTimeZone(TimeZone.getTimeZone("UTC")); - log.debug("current time is {}", objectMapper.writeValueAsString(new Date())); - return objectMapper; - } - -} diff --git a/dbrepo-discovery-service/rest-service/src/main/java/at/tuwien/config/ReadyConfig.java b/dbrepo-discovery-service/rest-service/src/main/java/at/tuwien/config/ReadyConfig.java deleted file mode 100644 index 0bee3b961e..0000000000 --- a/dbrepo-discovery-service/rest-service/src/main/java/at/tuwien/config/ReadyConfig.java +++ /dev/null @@ -1,23 +0,0 @@ -package at.tuwien.config; - -import com.google.common.io.Files; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.event.ApplicationReadyEvent; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.event.EventListener; - -import java.io.File; -import java.io.IOException; - -@Configuration -public class ReadyConfig { - - @Value("${fda.ready.path}") - private String readyPath; - - @EventListener(ApplicationReadyEvent.class) - public void init() throws IOException { - Files.touch(new File(readyPath)); - } - -} diff --git a/dbrepo-discovery-service/rest-service/src/main/resources/application-local.yml b/dbrepo-discovery-service/rest-service/src/main/resources/application-local.yml deleted file mode 100644 index 1ab259ae3f..0000000000 --- a/dbrepo-discovery-service/rest-service/src/main/resources/application-local.yml +++ /dev/null @@ -1,54 +0,0 @@ -app.version: '@project.version@' -spring: - main.banner-mode: off - datasource: - url: jdbc:mariadb://localhost:3306/fda - driver-class-name: org.mariadb.jdbc.Driver - username: root - password: dbrepo - jpa: - show-sql: false - database-platform: org.hibernate.dialect.MariaDBDialect - hibernate: - ddl-auto: validate - use-new-id-generator-mappings: false - open-in-view: false - properties: - hibernate: - default_schema: fda - jdbc: - time_zone: UTC - application: - name: discovery-service - rabbitmq: - host: localhost - username: fda - password: fda - cloud: - loadbalancer.ribbon.enabled: false - gateway: - httpclient: - ssl: - useInsecureTrustManager: true -management.endpoints.web.exposure.include: health,info,prometheus -server: - port: 9090 -logging: - pattern.console: "%d %highlight(%-5level) %msg%n" - level: - root: warn - at.tuwien.: info - org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug -eureka: - client: - register-with-eureka: false - fetch-registry: false - serviceUrl.defaultZone: http://localhost:9090/eureka/ - instance: - hostname: discovery-service - non-secure-port-enabled: false - secure-port-enabled: true - secure-port: 9090 -fda: - ready.path: ./ready - gateway.endpoint: http://localhost:9095 \ No newline at end of file diff --git a/dbrepo-discovery-service/rest-service/src/main/resources/application.yml b/dbrepo-discovery-service/rest-service/src/main/resources/application.yml deleted file mode 100644 index 3d691f1015..0000000000 --- a/dbrepo-discovery-service/rest-service/src/main/resources/application.yml +++ /dev/null @@ -1,48 +0,0 @@ -app.version: '@project.version@' -spring: - main.banner-mode: off - datasource: - url: jdbc:mariadb://metadata-db:3306/fda - driver-class-name: org.mariadb.jdbc.Driver - username: "${METADATA_USERNAME}" - password: "${METADATA_PASSWORD}" - jpa: - show-sql: false - database-platform: org.hibernate.dialect.MariaDBDialect - hibernate: - ddl-auto: validate - open-in-view: false - properties: - hibernate: - jdbc: - time_zone: UTC - application: - name: discovery-service - rabbitmq: - host: broker-service - username: "${BROKER_USERNAME}" - password: "${BROKER_PASSWORD}" - cloud: - loadbalancer.ribbon.enabled: false -management.endpoints.web.exposure.include: health,info,prometheus -server: - port: 9090 -logging: - pattern.console: "%d %highlight(%-5level) %msg%n" - level: - root: warn - at.tuwien.: "${LOG_LEVEL}" - org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug -eureka: - client: - register-with-eureka: false - fetch-registry: false - serviceUrl.defaultZone: http://discovery-service:9090/eureka/ - instance: - hostname: discovery-service - non-secure-port-enabled: false - secure-port-enabled: true - secure-port: 9090 -fda: - ready.path: /ready - gateway.endpoint: "${GATEWAY_ENDPOINT}" \ No newline at end of file diff --git a/dbrepo-discovery-service/rest-service/src/main/resources/config.properties b/dbrepo-discovery-service/rest-service/src/main/resources/config.properties deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/dbrepo-discovery-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java b/dbrepo-discovery-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java deleted file mode 100644 index c5adb93d3d..0000000000 --- a/dbrepo-discovery-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java +++ /dev/null @@ -1,9 +0,0 @@ -package at.tuwien; - -import at.tuwien.test.BaseTest; -import org.springframework.test.context.TestPropertySource; - -@TestPropertySource(locations = "classpath:application.properties") -public abstract class BaseUnitTest extends BaseTest { - -} \ No newline at end of file diff --git a/dbrepo-discovery-service/rest-service/src/test/java/at/tuwien/MockServiceIntegrationTest.java b/dbrepo-discovery-service/rest-service/src/test/java/at/tuwien/MockServiceIntegrationTest.java deleted file mode 100644 index 329ae7be23..0000000000 --- a/dbrepo-discovery-service/rest-service/src/test/java/at/tuwien/MockServiceIntegrationTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package at.tuwien; - -import at.tuwien.config.H2Utils; -import at.tuwien.service.MockService; -import lombok.extern.log4j.Log4j2; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -import static org.junit.jupiter.api.Assertions.assertTrue; - - -@Log4j2 -@SpringBootTest -public class MockServiceIntegrationTest extends BaseUnitTest { - - @Autowired - private H2Utils h2Utils; - - @Autowired - private MockService mockService; - - @BeforeEach - public void beforeEach() { - h2Utils.runScript("schema.sql"); - } - - @Test - public void mock_succeeds() { - - /* test */ - final Boolean response = mockService.mock(); - assertTrue(response); - } - -} diff --git a/dbrepo-discovery-service/rest-service/src/test/resources/application.properties b/dbrepo-discovery-service/rest-service/src/test/resources/application.properties deleted file mode 100644 index 1caa687436..0000000000 --- a/dbrepo-discovery-service/rest-service/src/test/resources/application.properties +++ /dev/null @@ -1,11 +0,0 @@ -# enable local spring profile -spring.profiles.active=local - -# disable datasource -spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_ON_EXIT=FALSE;INIT=CREATE SCHEMA IF NOT EXISTS FDA -spring.datasource.driverClassName=org.h2.Driver -spring.datasource.username=sa -spring.datasource.password=password -spring.jpa.database-platform=org.hibernate.dialect.H2Dialect -spring.jpa.hibernate.ddl-auto=create-drop -spring.jpa.show-sql=false \ No newline at end of file diff --git a/dbrepo-discovery-service/rest-service/src/test/resources/schema.sql b/dbrepo-discovery-service/rest-service/src/test/resources/schema.sql deleted file mode 100644 index 906d8df808..0000000000 --- a/dbrepo-discovery-service/rest-service/src/test/resources/schema.sql +++ /dev/null @@ -1,25 +0,0 @@ -CREATE SCHEMA IF NOT EXISTS `fda`; -SET SCHEMA `fda`; -DROP TABLE IF EXISTS fda.mdb_concepts; -CREATE TABLE IF NOT EXISTS fda.mdb_concepts -( - uri VARCHAR(500) not null, - name VARCHAR(255), - created timestamp NOT NULL DEFAULT NOW(), - created_by bigint, - PRIMARY KEY (uri) -); -DROP TABLE IF EXISTS fda.mdb_units; -CREATE TABLE IF NOT EXISTS fda.mdb_units -( - uri VARCHAR(500) not null, - name VARCHAR(255), - created timestamp NOT NULL DEFAULT NOW(), - created_by bigint, - PRIMARY KEY (uri) -); --- Modified for H2 --- Assume id=1 is invalid --- Assume id=2 is still valid token --- CREATE VIEW IF NOT EXISTS fda.mdb_invalid_tokens AS --- (SELECT `id`, `token_hash`, `creator`, `created`, `expires`, `last_used` FROM fda.`mdb_tokens` WHERE `id` = 1); \ No newline at end of file diff --git a/dbrepo-discovery-service/service_ready b/dbrepo-discovery-service/service_ready deleted file mode 100644 index b2e4f9df68..0000000000 --- a/dbrepo-discovery-service/service_ready +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -if [ -f /ready ]; then - echo "service is ready and accepting connections" - exit 0 -fi -exit 1 \ No newline at end of file diff --git a/dbrepo-discovery-service/services/pom.xml b/dbrepo-discovery-service/services/pom.xml deleted file mode 100644 index 8ac4f5a15d..0000000000 --- a/dbrepo-discovery-service/services/pom.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <artifactId>dbrepo-discovery-service</artifactId> - <groupId>at.tuwien</groupId> - <version>1.2.0</version> - </parent> - - <artifactId>services</artifactId> - <version>1.2.0</version> - <name>dbrepo-discovery-service-services</name> - -</project> \ No newline at end of file diff --git a/dbrepo-discovery-service/services/src/main/java/at/tuwien/service/MockService.java b/dbrepo-discovery-service/services/src/main/java/at/tuwien/service/MockService.java deleted file mode 100644 index 521e25785d..0000000000 --- a/dbrepo-discovery-service/services/src/main/java/at/tuwien/service/MockService.java +++ /dev/null @@ -1,12 +0,0 @@ -package at.tuwien.service; - -import org.springframework.stereotype.Service; - -@Service -public class MockService { - - public Boolean mock() { - return true; - } - -} diff --git a/dbrepo-gateway-service/.gitignore b/dbrepo-gateway-service/.gitignore deleted file mode 100644 index 549e00a2a9..0000000000 --- a/dbrepo-gateway-service/.gitignore +++ /dev/null @@ -1,33 +0,0 @@ -HELP.md -target/ -!.mvn/wrapper/maven-wrapper.jar -!**/src/main/**/target/ -!**/src/test/**/target/ - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ -build/ -!**/src/main/**/build/ -!**/src/test/**/build/ - -### VS Code ### -.vscode/ diff --git a/dbrepo-gateway-service/.mvn/wrapper/MavenWrapperDownloader.java b/dbrepo-gateway-service/.mvn/wrapper/MavenWrapperDownloader.java deleted file mode 100644 index a45eb6ba26..0000000000 --- a/dbrepo-gateway-service/.mvn/wrapper/MavenWrapperDownloader.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright 2007-present the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import java.net.*; -import java.io.*; -import java.nio.channels.*; -import java.util.Properties; - -public class MavenWrapperDownloader { - - private static final String WRAPPER_VERSION = "0.5.6"; - /** - * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. - */ - private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" - + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; - - /** - * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to - * use instead of the default one. - */ - private static final String MAVEN_WRAPPER_PROPERTIES_PATH = - ".mvn/wrapper/maven-wrapper.properties"; - - /** - * Path where the maven-wrapper.jar will be saved to. - */ - private static final String MAVEN_WRAPPER_JAR_PATH = - ".mvn/wrapper/maven-wrapper.jar"; - - /** - * Name of the property which should be used to override the default download url for the wrapper. - */ - private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; - - public static void main(String args[]) { - System.out.println("- Downloader started"); - File baseDirectory = new File(args[0]); - System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); - - // If the maven-wrapper.properties exists, read it and check if it contains a custom - // wrapperUrl parameter. - File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); - String url = DEFAULT_DOWNLOAD_URL; - if (mavenWrapperPropertyFile.exists()) { - FileInputStream mavenWrapperPropertyFileInputStream = null; - try { - mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); - Properties mavenWrapperProperties = new Properties(); - mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); - url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); - } catch (IOException e) { - System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); - } finally { - try { - if (mavenWrapperPropertyFileInputStream != null) { - mavenWrapperPropertyFileInputStream.close(); - } - } catch (IOException e) { - // Ignore ... - } - } - } - System.out.println("- Downloading from: " + url); - - File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); - if (!outputFile.getParentFile().exists()) { - if (!outputFile.getParentFile().mkdirs()) { - System.out.println( - "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); - } - } - System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); - try { - downloadFileFromURL(url, outputFile); - System.out.println("Done"); - System.exit(0); - } catch (Throwable e) { - System.out.println("- Error downloading"); - e.printStackTrace(); - System.exit(1); - } - } - - private static void downloadFileFromURL(String urlString, File destination) throws Exception { - if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { - String username = System.getenv("MVNW_USERNAME"); - char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); - Authenticator.setDefault(new Authenticator() { - @Override - protected PasswordAuthentication getPasswordAuthentication() { - return new PasswordAuthentication(username, password); - } - }); - } - URL website = new URL(urlString); - ReadableByteChannel rbc; - rbc = Channels.newChannel(website.openStream()); - FileOutputStream fos = new FileOutputStream(destination); - fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); - fos.close(); - rbc.close(); - } - -} diff --git a/dbrepo-gateway-service/.mvn/wrapper/maven-wrapper.jar b/dbrepo-gateway-service/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index 2cc7d4a55c0cd0092912bf49ae38b3a9e3fd0054..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50710 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 diff --git a/dbrepo-gateway-service/.mvn/wrapper/maven-wrapper.properties b/dbrepo-gateway-service/.mvn/wrapper/maven-wrapper.properties deleted file mode 100644 index 642d572ce9..0000000000 --- a/dbrepo-gateway-service/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1,2 +0,0 @@ -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip -wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar diff --git a/dbrepo-gateway-service/Dockerfile b/dbrepo-gateway-service/Dockerfile index 7fd33750f7..6086e614d1 100644 --- a/dbrepo-gateway-service/Dockerfile +++ b/dbrepo-gateway-service/Dockerfile @@ -1,45 +1,4 @@ -###### FIRST STAGE ###### -FROM dbrepo-metadata-db:latest as dependency -MAINTAINER Martin Weise <martin.weise@tuwien.ac.at> +FROM nginx:alpine AS runtime +MAINTAINER Martin Weise <martin.weise@tuwien.ac.at -###### FIRST STAGE ###### -FROM maven:slim as build - -COPY ./pom.xml ./ - -RUN mvn -fn -B dependency:go-offline > /dev/null - -COPY --from=dependency /root/.m2/repository/at/tuwien /root/.m2/repository/at/tuwien - -COPY ./report ./report -COPY ./rest-service ./rest-service - -# Make sure it compiles -RUN mvn -q clean package -DskipTests - -###### SECOND STAGE ###### -FROM openjdk:11-jre-slim as runtime - -ENV METADATA_DB=fda -ENV METADATA_USERNAME=postgres -ENV METADATA_PASSWORD=postgres -ENV GATEWAY_ENDPOINT=http://gateway-service:9095 -ENV LOG_LEVEL=debug - -WORKDIR /app - -COPY ./server.keystore ./server.keystore -COPY ./root.crt /etc/ssl/certs/DBRepo_Root_CA.crt - -RUN cat /etc/ssl/certs/DBRepo_Root_CA.crt >> /etc/ssl/certs/ca-certificates.crt - -COPY ./service_ready /usr/bin -RUN chmod +x /usr/bin/service_ready - -HEALTHCHECK --interval=10s --timeout=5s --retries=12 CMD service_ready - -COPY --from=build ./rest-service/target/rest-service-*.jar ./rest-service.jar - -EXPOSE 9095 - -ENTRYPOINT ["java", "-Dlog4j2.formatMsgNoLookups=true", "-Djavax.net.ssl.trustStore=/app/server.keystore", "-Djavax.net.ssl.trustStorePassword=password", "-jar", "./rest-service.jar"] \ No newline at end of file +COPY ./dbrepo.conf /etc/nginx/conf.d/default.conf diff --git a/dbrepo-gateway-service/README.md b/dbrepo-gateway-service/README.md deleted file mode 100644 index 75fed4cae4..0000000000 --- a/dbrepo-gateway-service/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# Gateway Service - -## Actuator - -* Overview: [https://localhost:9095/actuator/](https://localhost:9095/actuator/) -* Info: [https://localhost:9095/actuator/info](https://localhost:9095/actuator/info) - -## Prometheus - -* Overview: [https://localhost:9095/actuator/prometheus](https://localhost:9095/actuator/prometheus) - -## Health - -* Overview: [https://localhost:9095/actuator/health/](https://localhost:9095/actuator/health/) - -# Routes - -* Overview: [https://localhost:9095/actuator/gateway/routes](https://localhost:9095/actuator/gateway/routes) \ No newline at end of file diff --git a/dbrepo-gateway-service/dbrepo.conf b/dbrepo-gateway-service/dbrepo.conf new file mode 100644 index 0000000000..08a12c1747 --- /dev/null +++ b/dbrepo-gateway-service/dbrepo.conf @@ -0,0 +1,271 @@ +client_max_body_size 2G; + +resolver 127.0.0.11 valid=30s; # docker dns + +upstream authentication { + server authentication-service:8444; +} + +upstream user { + server user-service:9098; +} + +upstream broker { + server broker-service:15672; +} + +upstream analyse { + server analyse-service:5000; +} + +upstream metadata { + server metadata-service:9099; +} + +upstream identifier { + server identifier-service:9096; +} + +upstream query { + server query-service:9093; +} + +upstream table { + server table-service:9094; +} + +upstream database { + server database-service:9094; +} + +upstream container { + server container-service:9092; +} + +upstream semantics { + server semantics-service:5010; +} + +upstream search { + server search-service:9200; +} + +upstream ui { + server ui:3000; +} + +server { + listen 80 default_server; + server_name _; + + location /api/auth { + rewrite /api/auth/(.*) /api/$1 break; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://authentication; + proxy_read_timeout 90; + } + + location /api/user { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://user; + proxy_read_timeout 90; + } + + location /api/broker { + rewrite /api/broker/(.*) /api/$1 break; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://broker; + proxy_read_timeout 90; + } + + location /api/analyse { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://analyse; + proxy_read_timeout 90; + } + + location /api/oai { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://metadata; + proxy_read_timeout 90; + } + + location /api/identifier { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://identifier; + proxy_read_timeout 90; + } + + location /pid { + rewrite /pid/(.*) /api/pid/$1 break; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://identifier; + proxy_read_timeout 90; + } + + location /api/container/[0-9]+/database/[0-9]+/query { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://query; + proxy_read_timeout 90; + } + + location /api/container/[0-9]+/database/[0-9]+/view { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://query; + proxy_read_timeout 90; + } + + location /api/container/[0-9]+/database/[0-9]+/table/[0-9]+/history { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://query; + proxy_read_timeout 90; + } + + location /api/container/[0-9]+/database/[0-9]+/table/[0-9]+/data { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://query; + proxy_read_timeout 90; + } + + location /api/container/[0-9]+/database/[0-9]+/table/[0-9]+/query { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://query; + proxy_read_timeout 90; + } + + location /api/container/[0-9]+/database/[0-9]+/table/[0-9]+/export { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://query; + proxy_read_timeout 90; + } + + location /api/container/[0-9]+/database/[0-9]+/table/[0-9]+/consumer { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://query; + proxy_read_timeout 90; + } + + location /api/container/[0-9]+/database/[0-9]+/version { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://query; + proxy_read_timeout 90; + } + + location /api/container/[0-9]+/database/[0-9]+/table { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://table; + proxy_read_timeout 90; + } + + location /api/container/[0-9]+/database { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://database; + proxy_read_timeout 90; + } + + location /api/container/[0-9]+/database/[0-9]+/access { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://database; + proxy_read_timeout 90; + } + + location /api/container { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://container; + proxy_read_timeout 90; + } + + location /api/image { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://container; + proxy_read_timeout 90; + } + + location /api/semantics { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://semantics; + proxy_read_timeout 90; + } + + location /retrieve { + rewrite /retrieve/(.*) /$1 break; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://search; + proxy_read_timeout 90; + } + + location / { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://ui; + proxy_read_timeout 90; + } +} diff --git a/dbrepo-gateway-service/mvnw b/dbrepo-gateway-service/mvnw deleted file mode 100755 index a16b5431b4..0000000000 --- a/dbrepo-gateway-service/mvnw +++ /dev/null @@ -1,310 +0,0 @@ -#!/bin/sh -# ---------------------------------------------------------------------------- -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# ---------------------------------------------------------------------------- - -# ---------------------------------------------------------------------------- -# Maven Start Up Batch script -# -# Required ENV vars: -# ------------------ -# JAVA_HOME - location of a JDK home dir -# -# Optional ENV vars -# ----------------- -# M2_HOME - location of maven2's installed home dir -# MAVEN_OPTS - parameters passed to the Java VM when running Maven -# e.g. to debug Maven itself, use -# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -# MAVEN_SKIP_RC - flag to disable loading of mavenrc files -# ---------------------------------------------------------------------------- - -if [ -z "$MAVEN_SKIP_RC" ] ; then - - if [ -f /etc/mavenrc ] ; then - . /etc/mavenrc - fi - - if [ -f "$HOME/.mavenrc" ] ; then - . "$HOME/.mavenrc" - fi - -fi - -# OS specific support. $var _must_ be set to either true or false. -cygwin=false; -darwin=false; -mingw=false -case "`uname`" in - CYGWIN*) cygwin=true ;; - MINGW*) mingw=true;; - Darwin*) darwin=true - # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home - # See https://developer.apple.com/library/mac/qa/qa1170/_index.html - if [ -z "$JAVA_HOME" ]; then - if [ -x "/usr/libexec/java_home" ]; then - export JAVA_HOME="`/usr/libexec/java_home`" - else - export JAVA_HOME="/Library/Java/Home" - fi - fi - ;; -esac - -if [ -z "$JAVA_HOME" ] ; then - if [ -r /etc/gentoo-release ] ; then - JAVA_HOME=`java-config --jre-home` - fi -fi - -if [ -z "$M2_HOME" ] ; then - ## resolve links - $0 may be a link to maven's home - PRG="$0" - - # need this for relative symlinks - while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG="`dirname "$PRG"`/$link" - fi - done - - saveddir=`pwd` - - M2_HOME=`dirname "$PRG"`/.. - - # make it fully qualified - M2_HOME=`cd "$M2_HOME" && pwd` - - cd "$saveddir" - # echo Using m2 at $M2_HOME -fi - -# For Cygwin, ensure paths are in UNIX format before anything is touched -if $cygwin ; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --unix "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --unix "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --unix "$CLASSPATH"` -fi - -# For Mingw, ensure paths are in UNIX format before anything is touched -if $mingw ; then - [ -n "$M2_HOME" ] && - M2_HOME="`(cd "$M2_HOME"; pwd)`" - [ -n "$JAVA_HOME" ] && - JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" -fi - -if [ -z "$JAVA_HOME" ]; then - javaExecutable="`which javac`" - if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then - # readlink(1) is not available as standard on Solaris 10. - readLink=`which readlink` - if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then - if $darwin ; then - javaHome="`dirname \"$javaExecutable\"`" - javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" - else - javaExecutable="`readlink -f \"$javaExecutable\"`" - fi - javaHome="`dirname \"$javaExecutable\"`" - javaHome=`expr "$javaHome" : '\(.*\)/bin'` - JAVA_HOME="$javaHome" - export JAVA_HOME - fi - fi -fi - -if [ -z "$JAVACMD" ] ; then - if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - else - JAVACMD="`which java`" - fi -fi - -if [ ! -x "$JAVACMD" ] ; then - echo "Error: JAVA_HOME is not defined correctly." >&2 - echo " We cannot execute $JAVACMD" >&2 - exit 1 -fi - -if [ -z "$JAVA_HOME" ] ; then - echo "Warning: JAVA_HOME environment variable is not set." -fi - -CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher - -# traverses directory structure from process work directory to filesystem root -# first directory with .mvn subdirectory is considered project base directory -find_maven_basedir() { - - if [ -z "$1" ] - then - echo "Path not specified to find_maven_basedir" - return 1 - fi - - basedir="$1" - wdir="$1" - while [ "$wdir" != '/' ] ; do - if [ -d "$wdir"/.mvn ] ; then - basedir=$wdir - break - fi - # workaround for JBEAP-8937 (on Solaris 10/Sparc) - if [ -d "${wdir}" ]; then - wdir=`cd "$wdir/.."; pwd` - fi - # end of workaround - done - echo "${basedir}" -} - -# concatenates all lines of a file -concat_lines() { - if [ -f "$1" ]; then - echo "$(tr -s '\n' ' ' < "$1")" - fi -} - -BASE_DIR=`find_maven_basedir "$(pwd)"` -if [ -z "$BASE_DIR" ]; then - exit 1; -fi - -########################################################################################## -# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -# This allows using the maven wrapper in projects that prohibit checking in binary data. -########################################################################################## -if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found .mvn/wrapper/maven-wrapper.jar" - fi -else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." - fi - if [ -n "$MVNW_REPOURL" ]; then - jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - else - jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - fi - while IFS="=" read key value; do - case "$key" in (wrapperUrl) jarUrl="$value"; break ;; - esac - done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" - if [ "$MVNW_VERBOSE" = true ]; then - echo "Downloading from: $jarUrl" - fi - wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" - if $cygwin; then - wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` - fi - - if command -v wget > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found wget ... using wget" - fi - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - wget "$jarUrl" -O "$wrapperJarPath" - else - wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" - fi - elif command -v curl > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found curl ... using curl" - fi - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - curl -o "$wrapperJarPath" "$jarUrl" -f - else - curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f - fi - - else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Falling back to using Java to download" - fi - javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" - # For Cygwin, switch paths to Windows format before running javac - if $cygwin; then - javaClass=`cygpath --path --windows "$javaClass"` - fi - if [ -e "$javaClass" ]; then - if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Compiling MavenWrapperDownloader.java ..." - fi - # Compiling the Java class - ("$JAVA_HOME/bin/javac" "$javaClass") - fi - if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - # Running the downloader - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Running MavenWrapperDownloader.java ..." - fi - ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") - fi - fi - fi -fi -########################################################################################## -# End of extension -########################################################################################## - -export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} -if [ "$MVNW_VERBOSE" = true ]; then - echo $MAVEN_PROJECTBASEDIR -fi -MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" - -# For Cygwin, switch paths to Windows format before running java -if $cygwin; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --path --windows "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --windows "$CLASSPATH"` - [ -n "$MAVEN_PROJECTBASEDIR" ] && - MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` -fi - -# Provide a "standardized" way to retrieve the CLI args that will -# work with both Windows and non-Windows executions. -MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" -export MAVEN_CMD_LINE_ARGS - -WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -exec "$JAVACMD" \ - $MAVEN_OPTS \ - -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/dbrepo-gateway-service/mvnw.cmd b/dbrepo-gateway-service/mvnw.cmd deleted file mode 100644 index c8d43372c9..0000000000 --- a/dbrepo-gateway-service/mvnw.cmd +++ /dev/null @@ -1,182 +0,0 @@ -@REM ---------------------------------------------------------------------------- -@REM Licensed to the Apache Software Foundation (ASF) under one -@REM or more contributor license agreements. See the NOTICE file -@REM distributed with this work for additional information -@REM regarding copyright ownership. The ASF licenses this file -@REM to you under the Apache License, Version 2.0 (the -@REM "License"); you may not use this file except in compliance -@REM with the License. You may obtain a copy of the License at -@REM -@REM https://www.apache.org/licenses/LICENSE-2.0 -@REM -@REM Unless required by applicable law or agreed to in writing, -@REM software distributed under the License is distributed on an -@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -@REM KIND, either express or implied. See the License for the -@REM specific language governing permissions and limitations -@REM under the License. -@REM ---------------------------------------------------------------------------- - -@REM ---------------------------------------------------------------------------- -@REM Maven Start Up Batch script -@REM -@REM Required ENV vars: -@REM JAVA_HOME - location of a JDK home dir -@REM -@REM Optional ENV vars -@REM M2_HOME - location of maven2's installed home dir -@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending -@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven -@REM e.g. to debug Maven itself, use -@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files -@REM ---------------------------------------------------------------------------- - -@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' -@echo off -@REM set title of command window -title %0 -@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' -@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% - -@REM set %HOME% to equivalent of $HOME -if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") - -@REM Execute a user defined script before this one -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre -@REM check for pre script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" -if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" -:skipRcPre - -@setlocal - -set ERROR_CODE=0 - -@REM To isolate internal variables from possible post scripts, we use another setlocal -@setlocal - -@REM ==== START VALIDATION ==== -if not "%JAVA_HOME%" == "" goto OkJHome - -echo. -echo Error: JAVA_HOME not found in your environment. >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -:OkJHome -if exist "%JAVA_HOME%\bin\java.exe" goto init - -echo. -echo Error: JAVA_HOME is set to an invalid directory. >&2 -echo JAVA_HOME = "%JAVA_HOME%" >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -@REM ==== END VALIDATION ==== - -:init - -@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". -@REM Fallback to current working directory if not found. - -set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% -IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir - -set EXEC_DIR=%CD% -set WDIR=%EXEC_DIR% -:findBaseDir -IF EXIST "%WDIR%"\.mvn goto baseDirFound -cd .. -IF "%WDIR%"=="%CD%" goto baseDirNotFound -set WDIR=%CD% -goto findBaseDir - -:baseDirFound -set MAVEN_PROJECTBASEDIR=%WDIR% -cd "%EXEC_DIR%" -goto endDetectBaseDir - -:baseDirNotFound -set MAVEN_PROJECTBASEDIR=%EXEC_DIR% -cd "%EXEC_DIR%" - -:endDetectBaseDir - -IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig - -@setlocal EnableExtensions EnableDelayedExpansion -for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a -@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% - -:endReadAdditionalConfig - -SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" -set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" -set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - -FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( - IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B -) - -@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -@REM This allows using the maven wrapper in projects that prohibit checking in binary data. -if exist %WRAPPER_JAR% ( - if "%MVNW_VERBOSE%" == "true" ( - echo Found %WRAPPER_JAR% - ) -) else ( - if not "%MVNW_REPOURL%" == "" ( - SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - ) - if "%MVNW_VERBOSE%" == "true" ( - echo Couldn't find %WRAPPER_JAR%, downloading it ... - echo Downloading from: %DOWNLOAD_URL% - ) - - powershell -Command "&{"^ - "$webclient = new-object System.Net.WebClient;"^ - "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ - "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ - "}"^ - "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ - "}" - if "%MVNW_VERBOSE%" == "true" ( - echo Finished downloading %WRAPPER_JAR% - ) -) -@REM End of extension - -@REM Provide a "standardized" way to retrieve the CLI args that will -@REM work with both Windows and non-Windows executions. -set MAVEN_CMD_LINE_ARGS=%* - -%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* -if ERRORLEVEL 1 goto error -goto end - -:error -set ERROR_CODE=1 - -:end -@endlocal & set ERROR_CODE=%ERROR_CODE% - -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost -@REM check for post script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" -if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" -:skipRcPost - -@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' -if "%MAVEN_BATCH_PAUSE%" == "on" pause - -if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% - -exit /B %ERROR_CODE% diff --git a/dbrepo-gateway-service/pom.xml b/dbrepo-gateway-service/pom.xml deleted file mode 100644 index addee3cef6..0000000000 --- a/dbrepo-gateway-service/pom.xml +++ /dev/null @@ -1,149 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-parent</artifactId> - <version>2.3.4.RELEASE</version> - </parent> - <groupId>at.tuwien</groupId> - <artifactId>dbrepo-gateway-service</artifactId> - <version>1.2.0</version> - <name>dbrepo-gateway-service</name> - <description>Service that proxies the API to the microservices</description> - <url>https://dbrepo-docs.ossdip.at</url> - <developers> - <developer> - <name>Martin Weise</name> - <email>martin.weise@tuwien.ac.at</email> - <organization>TU Wien</organization> - </developer> - </developers> - - <packaging>pom</packaging> - <modules> - <module>rest-service</module> - <module>report</module> - </modules> - - <properties> - <java.version>11</java.version> - <spring-cloud.version>Hoxton.SR10</spring-cloud.version><!-- SR11 not working yet --> - <swagger.version>2.1.7</swagger.version> - <springfox.version>3.0.0</springfox.version> - <jacoco.version>0.8.7</jacoco.version> - </properties> - - <dependencies> - <!-- Gate --> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-actuator</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-webflux</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.cloud</groupId> - <artifactId>spring-cloud-starter-gateway</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.cloud</groupId> - <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> - </dependency> - <!-- Embedded DataSource --> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-data-jpa</artifactId> - </dependency> - <dependency> - <groupId>com.h2database</groupId> - <artifactId>h2</artifactId> - <scope>runtime</scope> - </dependency> - <!-- Monitoring --> - <dependency> - <groupId>io.micrometer</groupId> - <artifactId>micrometer-registry-prometheus</artifactId> - <scope>runtime</scope> - </dependency> - <!-- IDE --> - <dependency> - <groupId>org.projectlombok</groupId> - <artifactId>lombok</artifactId> - </dependency> - <!-- Testing --> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-test</artifactId> - <scope>test</scope> - <exclusions> - <exclusion> - <groupId>org.junit.jupiter</groupId> - <artifactId>junit-vintage-engine</artifactId> - </exclusion> - </exclusions> - </dependency> - <dependency> - <groupId>org.jacoco</groupId> - <artifactId>jacoco-maven-plugin</artifactId> - <version>${jacoco.version}</version> - </dependency> - <dependency> - <groupId>at.tuwien</groupId> - <artifactId>dbrepo-metadata-db-test</artifactId> - <version>${project.version}</version> - <scope>test</scope> - </dependency> - </dependencies> - - <dependencyManagement> - <dependencies> - <dependency> - <groupId>org.springframework.cloud</groupId> - <artifactId>spring-cloud-dependencies</artifactId> - <version>${spring-cloud.version}</version> - <type>pom</type> - <scope>import</scope> - </dependency> - </dependencies> - </dependencyManagement> - - <build> - <plugins> - <plugin> - <groupId>org.jacoco</groupId> - <artifactId>jacoco-maven-plugin</artifactId> - <version>${jacoco.version}</version> - <configuration> - <excludes> - <exclude>at/tuwien/utils/**/*</exclude> - <exclude>at/tuwien/seeder/**/*</exclude> - <exclude>at/tuwien/mapper/**/*</exclude> - <exclude>at/tuwien/exception/**/*</exclude> - <exclude>at/tuwien/config/**/*</exclude> - <exclude>**/DbrepoGatewayServiceApplication.class</exclude> - </excludes> - </configuration> - <executions> - <execution> - <id>default-prepare-agent</id> - <goals> - <goal>prepare-agent</goal> - </goals> - </execution> - <execution> - <id>report</id> - <phase>verify</phase> - <goals> - <goal>report</goal> - </goals> - </execution> - </executions> - </plugin> - </plugins> - </build> - -</project> diff --git a/dbrepo-gateway-service/report/pom.xml b/dbrepo-gateway-service/report/pom.xml deleted file mode 100644 index 7c2e3a729c..0000000000 --- a/dbrepo-gateway-service/report/pom.xml +++ /dev/null @@ -1,51 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <groupId>at.tuwien</groupId> - <artifactId>dbrepo-gateway-service</artifactId> - <version>1.2.0</version> - </parent> - - <artifactId>report</artifactId> - <version>1.2.0</version> - <name>dbrepo-gateway-service-report</name> - <description> - This module is only intended for the pipeline coverage report. See the detailed report in the - respective modules - </description> - - <properties> - <jacoco.version>0.8.7</jacoco.version> - </properties> - - <dependencies> - <dependency> - <groupId>at.tuwien</groupId> - <artifactId>rest-service</artifactId> - <version>${project.version}</version> - </dependency> - </dependencies> - - <build> - <plugins> - <plugin> - <groupId>org.jacoco</groupId> - <artifactId>jacoco-maven-plugin</artifactId> - <version>${jacoco.version}</version> - <executions> - <execution> - <id>report-aggregate</id> - <phase>verify</phase> - <goals> - <goal>report-aggregate</goal> - </goals> - </execution> - </executions> - </plugin> - </plugins> - </build> - -</project> \ No newline at end of file diff --git a/dbrepo-gateway-service/rest-service/pom.xml b/dbrepo-gateway-service/rest-service/pom.xml deleted file mode 100644 index 6a543cd5ed..0000000000 --- a/dbrepo-gateway-service/rest-service/pom.xml +++ /dev/null @@ -1,38 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <groupId>at.tuwien</groupId> - <artifactId>dbrepo-gateway-service</artifactId> - <version>1.2.0</version> - </parent> - - <artifactId>rest-service</artifactId> - <version>1.2.0</version> - <name>dbrepo-gateway-service-rest-service</name> - - <properties> - <jacoco.version>0.8.7</jacoco.version> - </properties> - - <build> - <plugins> - <plugin> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-maven-plugin</artifactId> - <executions> - <execution> - <goals> - <goal>repackage</goal><!-- to make it exuteable with $ java -jar ./app.jar --> - </goals> - </execution> - </executions> - </plugin> - </plugins> - </build> - - <dependencies /> - -</project> \ No newline at end of file diff --git a/dbrepo-gateway-service/rest-service/ready b/dbrepo-gateway-service/rest-service/ready deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/dbrepo-gateway-service/rest-service/src/main/java/at/tuwien/DbrepoGatewayServiceApplication.java b/dbrepo-gateway-service/rest-service/src/main/java/at/tuwien/DbrepoGatewayServiceApplication.java deleted file mode 100644 index 821368936f..0000000000 --- a/dbrepo-gateway-service/rest-service/src/main/java/at/tuwien/DbrepoGatewayServiceApplication.java +++ /dev/null @@ -1,13 +0,0 @@ -package at.tuwien; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class DbrepoGatewayServiceApplication { - - public static void main(String[] args) { - SpringApplication.run(DbrepoGatewayServiceApplication.class, args); - } - -} diff --git a/dbrepo-gateway-service/rest-service/src/main/java/at/tuwien/config/GatewayConfig.java b/dbrepo-gateway-service/rest-service/src/main/java/at/tuwien/config/GatewayConfig.java deleted file mode 100644 index bb1450fde7..0000000000 --- a/dbrepo-gateway-service/rest-service/src/main/java/at/tuwien/config/GatewayConfig.java +++ /dev/null @@ -1,83 +0,0 @@ -package at.tuwien.config; - -import org.springframework.cloud.gateway.route.RouteLocator; -import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class GatewayConfig { - - @Bean - public RouteLocator routes(RouteLocatorBuilder builder) { - return builder.routes() - .route("authentication-service", r -> r.path("/api/auth/**") - .and() - .method("POST", "GET", "PUT", "DELETE") - .filters(f -> f.rewritePath("/api/auth/(?<segment>.*)", "/${segment}")) - .uri("lb://authentication-service")) - .route("user-service", r -> r.path("/api/user/**") - .and() - .method("POST", "GET", "PUT", "DELETE") - .and() - .uri("lb://user-service")) - .route("broker-service", r -> r.path("/api/broker/**") - .and() - .method("POST", "GET", "PUT", "DELETE") - .filters(f -> f.rewritePath("/api/broker/(?<segment>.*)", "/api/${segment}")) - .uri("lb://broker-service")) - .route("analyse-service", r -> r.path("/api/analyse/**") - .and() - .method("POST", "GET", "PUT", "DELETE") - .and() - .uri("lb://analyse-service")) - .route("metadata-service", r -> r.path("/api/oai/**") - .and() - .method("POST", "GET", "PUT", "DELETE") - .and() - .uri("lb://metadata-service")) - .route("identifier-service", r -> r.path("/api/pid/**", - "/api/identifier/**") - .and() - .method("POST", "GET", "PUT", "DELETE") - .and() - .uri("lb://identifier-service")) - .route("query-service", r -> r.path("/api/container/**/database/**/query/**", - "/api/container/**/database/**/view/**", - "/api/container/**/database/**/table/**/history/**", - "/api/container/**/database/**/table/**/data/**", - "/api/container/**/database/**/table/**/query/**", - "/api/container/**/database/**/table/**/export/**", - "/api/container/**/database/**/table/**/consumer", - "/api/container/**/database/**/version/**") - .and() - .method("POST", "GET", "PUT", "DELETE") - .and() - .uri("lb://query-service")) - .route("table-service", r -> r.path("/api/container/**/database/**/table/**") - .and() - .method("POST", "GET", "PUT", "DELETE") - .and() - .uri("lb://table-service")) - .route("database-service", r -> r.path("/api/container/**/database/**", - "/api/container/**/database/**/access/**") - .and() - .method("POST", "GET", "PUT", "DELETE") - .and() - .uri("lb://database-service")) - .route("container-service", r -> r.path("/api/container/**", - "/api/image/**") - .and() - .method("POST", "GET", "PUT", "DELETE") - .and() - .uri("lb://container-service")) - .route("semantics-service", r -> r.path("/api/semantics/**") - .and() - .method("POST", "GET", "PUT", "DELETE") - .and() - .uri("lb://semantics-service")) - .build(); - - } - -} diff --git a/dbrepo-gateway-service/rest-service/src/main/java/at/tuwien/config/JacksonConfig.java b/dbrepo-gateway-service/rest-service/src/main/java/at/tuwien/config/JacksonConfig.java deleted file mode 100644 index fba7f99cf2..0000000000 --- a/dbrepo-gateway-service/rest-service/src/main/java/at/tuwien/config/JacksonConfig.java +++ /dev/null @@ -1,31 +0,0 @@ -package at.tuwien.config; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.Date; -import java.util.TimeZone; - -@Slf4j -@Configuration -public class JacksonConfig { - - @Bean - public ObjectMapper objectMapper() throws JsonProcessingException { - final ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.findAndRegisterModules(); - objectMapper.registerModule(new Jdk8Module()); - objectMapper.registerModule(new JavaTimeModule()); - objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); - objectMapper.setTimeZone(TimeZone.getTimeZone("UTC")); - log.debug("current time is {}", objectMapper.writeValueAsString(new Date())); - return objectMapper; - } - -} diff --git a/dbrepo-gateway-service/rest-service/src/main/java/at/tuwien/config/ReadyConfig.java b/dbrepo-gateway-service/rest-service/src/main/java/at/tuwien/config/ReadyConfig.java deleted file mode 100644 index 2250fa5088..0000000000 --- a/dbrepo-gateway-service/rest-service/src/main/java/at/tuwien/config/ReadyConfig.java +++ /dev/null @@ -1,25 +0,0 @@ -package at.tuwien.config; - -import com.google.common.io.Files; -import lombok.extern.log4j.Log4j2; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.event.ApplicationReadyEvent; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.event.EventListener; - -import java.io.File; -import java.io.IOException; - -@Log4j2 -@Configuration -public class ReadyConfig { - - @Value("${fda.ready.path}") - private String readyPath; - - @EventListener(ApplicationReadyEvent.class) - public void init() throws IOException { - Files.touch(new File(readyPath)); - } - -} diff --git a/dbrepo-gateway-service/rest-service/src/main/java/at/tuwien/config/WebConfig.java b/dbrepo-gateway-service/rest-service/src/main/java/at/tuwien/config/WebConfig.java deleted file mode 100644 index e5aece5a24..0000000000 --- a/dbrepo-gateway-service/rest-service/src/main/java/at/tuwien/config/WebConfig.java +++ /dev/null @@ -1,26 +0,0 @@ -package at.tuwien.config; - -import org.springframework.cloud.client.loadbalancer.LoadBalanced; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.reactive.config.CorsRegistry; -import org.springframework.web.reactive.config.WebFluxConfigurer; -import org.springframework.web.reactive.function.client.WebClient; - -@Configuration -public class WebConfig implements WebFluxConfigurer { - - @Override - public void addCorsMappings(CorsRegistry registry) { - registry.addMapping("/**") - .allowedMethods("POST", "GET", "PUT", "DELETE") - .allowedOrigins("*"); - } - - @Bean - @LoadBalanced - public WebClient.Builder loadBalancedWebClientBuilder() { - return WebClient.builder(); - } - -} diff --git a/dbrepo-gateway-service/rest-service/src/main/resources/application-local.yml b/dbrepo-gateway-service/rest-service/src/main/resources/application-local.yml deleted file mode 100644 index 320e14ae2f..0000000000 --- a/dbrepo-gateway-service/rest-service/src/main/resources/application-local.yml +++ /dev/null @@ -1,42 +0,0 @@ -app.version: '@project.version@' -spring: - main.banner-mode: off - datasource: - url: jdbc:h2:mem:mydb - username: sa - password: password - driverClassName: org.h2.Driver - jpa: - show-sql: false - database-platform: org.hibernate.dialect.H2Dialect - hibernate: - ddl-auto: validate - use-new-id-generator-mappings: false - open-in-view: false - properties: - hibernate: - default_schema: fda - jdbc: - time_zone: UTC - application: - name: gateway-service - cloud: - loadbalancer.ribbon.enabled: false -management.endpoints.web.exposure.include: health,info,prometheus,gateway -server: - port: 9095 -logging: - pattern.console: "%d %highlight(%-5level) %msg%n" - level: - root: warn - at.tuwien.: info - org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug -eureka: - instance: - hostname: gateway-service - non-secure-port-enabled: false - secure-port-enabled: true - secure-port: 9095 - client.serviceUrl.defaultZone: http://localhost:9090/eureka/ -fda: - ready.path: ./ready \ No newline at end of file diff --git a/dbrepo-gateway-service/rest-service/src/main/resources/application.yml b/dbrepo-gateway-service/rest-service/src/main/resources/application.yml deleted file mode 100644 index 3c021d74d6..0000000000 --- a/dbrepo-gateway-service/rest-service/src/main/resources/application.yml +++ /dev/null @@ -1,40 +0,0 @@ -app.version: '@project.version@' -spring: - main.banner-mode: off - datasource: - url: jdbc:h2:mem:mydb - username: sa - password: password - driverClassName: org.h2.Driver - jpa: - show-sql: false - database-platform: org.hibernate.dialect.H2Dialect - hibernate: - ddl-auto: validate - open-in-view: false - properties: - hibernate: - jdbc: - time_zone: UTC - application: - name: gateway-service - cloud: - loadbalancer.ribbon.enabled: false -management.endpoints.web.exposure.include: health,info,prometheus,gateway -server: - port: 9095 -logging: - pattern.console: "%d %highlight(%-5level) %msg%n" - level: - root: warn - at.tuwien.: "${LOG_LEVEL}" - org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug -eureka: - instance: - hostname: gateway-service - non-secure-port-enabled: false - secure-port-enabled: true - secure-port: 9095 - client.serviceUrl.defaultZone: http://discovery-service:9090/eureka/ -fda: - ready.path: /ready \ No newline at end of file diff --git a/dbrepo-gateway-service/rest-service/src/main/resources/config.properties b/dbrepo-gateway-service/rest-service/src/main/resources/config.properties deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/dbrepo-gateway-service/rest-service/src/test/resources/application.properties b/dbrepo-gateway-service/rest-service/src/test/resources/application.properties deleted file mode 100644 index 1caa687436..0000000000 --- a/dbrepo-gateway-service/rest-service/src/test/resources/application.properties +++ /dev/null @@ -1,11 +0,0 @@ -# enable local spring profile -spring.profiles.active=local - -# disable datasource -spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_ON_EXIT=FALSE;INIT=CREATE SCHEMA IF NOT EXISTS FDA -spring.datasource.driverClassName=org.h2.Driver -spring.datasource.username=sa -spring.datasource.password=password -spring.jpa.database-platform=org.hibernate.dialect.H2Dialect -spring.jpa.hibernate.ddl-auto=create-drop -spring.jpa.show-sql=false \ No newline at end of file diff --git a/dbrepo-gateway-service/root.crt b/dbrepo-gateway-service/root.crt deleted file mode 100644 index 798a1f6734..0000000000 --- a/dbrepo-gateway-service/root.crt +++ /dev/null @@ -1,20 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDPzCCAiegAwIBAgIEHaMDRDANBgkqhkiG9w0BAQsFADBBMQswCQYDVQQGEwJB -VDEQMA4GA1UEChMHVFUgV2llbjEPMA0GA1UECxMGRFMtSUZTMQ8wDQYDVQQDEwZS -b290Q0EwHhcNMjMwNDAzMTczOTU5WhcNMzMwMjA5MTczOTU5WjBBMQswCQYDVQQG -EwJBVDEQMA4GA1UEChMHVFUgV2llbjEPMA0GA1UECxMGRFMtSUZTMQ8wDQYDVQQD -EwZSb290Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCK8FuP0bGt -QAvhZEjRWTQuCdE6vXpDWjvSoevZaSclgJ9SncDHtRzkH0x0ArVfIRZFtjSUEcHb -2r8mnOvqQ+9vs2azjTlacdPvezbhfgFFGIdrnHSm3RTB7smeOFceFkIvwiXT49+y -ZGkB/p0QCDoVYhgRxFNtZKBTYa0uJLQ7cM8LK2g66/yugJsB4zOlre1zPiWGY/5k -sWu780XVKpl9j6CR/xp3012bKlT/t7j7fKRamJYVYtW2guRQnl5J5AKRzlRGh84G -onNI5qiwS0gAZUajpL00lb2XxSkv11DY0743EOSsqOvUDr+5h4v7pXEt+O5aFvFN -ewRTHON1624fAgMBAAGjPzA9MB0GA1UdDgQWBBSdLp+I30uB4jAMP1PnZLolxbF/ -AzALBgNVHQ8EBAMCAgQwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC -AQEAIqrbs8mXC07a8VURnu3EFxO3dliDgxY1yQfB0VqMFL1yxGKXrVAJFLP/1MVr -HVx53vZd/KBNGUjhLfnj3vF+TpqnOoJ/QEDSJPuEnpfFPtx0tE3e3lQQlebIA8aM -m1iP2SJuKAYQUYOg1N9XXa+UPs9tWWrllY5dcYdHOK168eUwo1h6v0OOnaP7RvSn -457jewK6fJ3tUhox2Hu1JEowupYE5QhMiLwG30MGkf2pWkTNfz005LTzmgvfMSz7 -k1rfO9oKdVbxNYxZPdzKZRsnCfOka/MmYcXstjp5KKXLo4Z3LLs8N0GDWlKRvX9p -z2CJQ6CG+Aws4+J3mFOm2G9rIw== ------END CERTIFICATE----- diff --git a/dbrepo-gateway-service/server.keystore b/dbrepo-gateway-service/server.keystore deleted file mode 100644 index 1acf1f68ca7c367468fe2a81179d5fc9f295cfc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45487 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 diff --git a/dbrepo-gateway-service/service_ready b/dbrepo-gateway-service/service_ready deleted file mode 100644 index b2e4f9df68..0000000000 --- a/dbrepo-gateway-service/service_ready +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -if [ -f /ready ]; then - echo "service is ready and accepting connections" - exit 0 -fi -exit 1 \ No newline at end of file diff --git a/dbrepo-identifier-service/Dockerfile b/dbrepo-identifier-service/Dockerfile index b8343cc968..a8f39e3d7f 100644 --- a/dbrepo-identifier-service/Dockerfile +++ b/dbrepo-identifier-service/Dockerfile @@ -25,7 +25,7 @@ FROM openjdk:11-jre-slim as runtime ENV METADATA_DB=fda ENV METADATA_USERNAME=root ENV METADATA_PASSWORD=dbrepo -ENV GATEWAY_ENDPOINT=http://gateway-service:9095 +ENV GATEWAY_ENDPOINT=http://gateway-service ENV WEBSITE=http://localhost ENV LOG_LEVEL=debug ENV DBREPO_CLIENT_SECRET=client-secret diff --git a/dbrepo-identifier-service/rest-service/src/main/resources/application-local.yml b/dbrepo-identifier-service/rest-service/src/main/resources/application-local.yml index bb5c0681e3..20b898bb03 100644 --- a/dbrepo-identifier-service/rest-service/src/main/resources/application-local.yml +++ b/dbrepo-identifier-service/rest-service/src/main/resources/application-local.yml @@ -36,11 +36,6 @@ logging: at.tuwien.: trace at.tuwien.auth.UserPermissionEvaluator: trace org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug -eureka: - instance: - hostname: identifier-service - non-secure-port: 9096 - client.serviceUrl.defaultZone: http://localhost:9090/eureka/ fda: ready.path: ./ready jwt: @@ -48,7 +43,7 @@ fda: public_key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqqnHQ2BWWW9vDNLRCcxD++xZg/16oqMo/c1l+lcFEjjAIJjJp/HqrPYU/U9GvquGE6PbVFtTzW1KcKawOW+FJNOA3CGo8Q1TFEfz43B8rZpKsFbJKvQGVv1Z4HaKPvLUm7iMm8Hv91cLduuoWx6Q3DPe2vg13GKKEZe7UFghF+0T9u8EKzA/XqQ0OiICmsmYPbwvf9N3bCKsB/Y10EYmZRb8IhCoV9mmO5TxgWgiuNeCTtNCv2ePYqL/U0WvyGFW0reasIK8eg3KrAUj8DpyOgPOVBn3lBGf+3KFSYi+0bwZbJZWqbC/Xlk20Go1YfeJPRIt7ImxD27R/lNjgDO/MwIDAQAB client_secret: client-secret client_id: dbrepo-client - gateway.endpoint: http://localhost:9095 + gateway.endpoint: http://localhost website: http://localhost:3000 elastic: endpoint: localhost:9200 diff --git a/dbrepo-identifier-service/rest-service/src/main/resources/application.yml b/dbrepo-identifier-service/rest-service/src/main/resources/application.yml index 9d2031bd7e..f2531d6420 100644 --- a/dbrepo-identifier-service/rest-service/src/main/resources/application.yml +++ b/dbrepo-identifier-service/rest-service/src/main/resources/application.yml @@ -36,11 +36,6 @@ logging: at.tuwien.: "${LOG_LEVEL}" at.tuwien.auth.UserPermissionEvaluator: trace org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug -eureka: - instance: - hostname: identifier-service - non-secure-port: 9096 - client.serviceUrl.defaultZone: http://discovery-service:9090/eureka/ fda: ready.path: /ready jwt: diff --git a/dbrepo-metadata-db/pom.xml b/dbrepo-metadata-db/pom.xml index 5a0d2c25ae..c7f3b2990d 100644 --- a/dbrepo-metadata-db/pom.xml +++ b/dbrepo-metadata-db/pom.xml @@ -29,7 +29,7 @@ <maven.compiler.target>${java.version}</maven.compiler.target> <spring-cloud.version>Hoxton.SR8</spring-cloud.version> <mapstruct.version>1.4.2.Final</mapstruct.version> - <docker.version>3.2.7</docker.version> + <docker.version>3.3.0</docker.version> <testcontainers.version>1.15.2</testcontainers.version> <swagger.version>2.1.7</swagger.version> <springfox.version>3.0.0</springfox.version> @@ -47,17 +47,6 @@ <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> - <dependency> - <groupId>org.springframework.cloud</groupId> - <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> - <version>3.0.1</version> - <exclusions> - <exclusion> - <groupId>javax.ws.rs</groupId> - <artifactId>jsr311-api</artifactId> - </exclusion> - </exclusions> - </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> @@ -83,6 +72,12 @@ <artifactId>commons-io</artifactId> <version>${commons.version}</version> </dependency> + <!-- Utils --> + <dependency> + <groupId>com.google.guava</groupId> + <artifactId>guava</artifactId> + <version>31.1-jre</version> + </dependency> <!-- SQL Parser --> <dependency> <groupId>com.github.jsqlparser</groupId> diff --git a/dbrepo-metadata-service/Dockerfile b/dbrepo-metadata-service/Dockerfile index af0e2b6da4..ed2428b33a 100644 --- a/dbrepo-metadata-service/Dockerfile +++ b/dbrepo-metadata-service/Dockerfile @@ -24,7 +24,7 @@ FROM openjdk:11-jre-slim as runtime ENV METADATA_DB=fda ENV METADATA_USERNAME=root ENV METADATA_PASSWORD=dbrepo -ENV GATEWAY_ENDPOINT=http://gateway-service:9095 +ENV GATEWAY_ENDPOINT=http://gateway-service ENV PID_BASE="http://example.com/pid/" ENV REPOSITORY_NAME="Example Repository" ENV BASE_URL="http://example.com" diff --git a/dbrepo-metadata-service/rest-service/src/main/resources/application-local.yml b/dbrepo-metadata-service/rest-service/src/main/resources/application-local.yml index b5529e2975..eef6f76815 100644 --- a/dbrepo-metadata-service/rest-service/src/main/resources/application-local.yml +++ b/dbrepo-metadata-service/rest-service/src/main/resources/application-local.yml @@ -35,17 +35,10 @@ logging: root: warn at.tuwien.: trace org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug -eureka: - instance: - hostname: metadata-service - non-secure-port-enabled: false - secure-port-enabled: true - secure-port: 9099 - client.serviceUrl.defaultZone: http://localhost:9090/eureka/ fda: ready.path: ./ready pid.base: http://example.com/pid/ - gateway.endpoint: http://localhost:9095 + gateway.endpoint: http://localhost dbrepo: repository-name: TU Wien Database Repository base-url: http://dbrepo.ossdip.at/api/oai diff --git a/dbrepo-metadata-service/rest-service/src/main/resources/application.yml b/dbrepo-metadata-service/rest-service/src/main/resources/application.yml index 1a81f97ef8..74ee706193 100644 --- a/dbrepo-metadata-service/rest-service/src/main/resources/application.yml +++ b/dbrepo-metadata-service/rest-service/src/main/resources/application.yml @@ -35,11 +35,6 @@ logging: root: warn at.tuwien.: "${LOG_LEVEL}" org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug -eureka: - instance: - hostname: metadata-service - non-secure-port: 9099 - client.serviceUrl.defaultZone: http://discovery-service:9090/eureka/ fda: ready.path: ./ready pid.base: "${PID_BASE}" diff --git a/dbrepo-proxy/Dockerfile b/dbrepo-proxy/Dockerfile deleted file mode 100644 index 6086e614d1..0000000000 --- a/dbrepo-proxy/Dockerfile +++ /dev/null @@ -1,4 +0,0 @@ -FROM nginx:alpine AS runtime -MAINTAINER Martin Weise <martin.weise@tuwien.ac.at - -COPY ./dbrepo.conf /etc/nginx/conf.d/default.conf diff --git a/dbrepo-proxy/dbrepo.conf b/dbrepo-proxy/dbrepo.conf deleted file mode 100644 index ac95500234..0000000000 --- a/dbrepo-proxy/dbrepo.conf +++ /dev/null @@ -1,44 +0,0 @@ -client_max_body_size 2G; - -server { - listen 80 default_server; - server_name _; - - location /api { - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://gateway-service:9095; - proxy_read_timeout 90; - } - - location /pid { - rewrite /pid/(.*) /api/pid/$1 break; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://gateway-service:9095; - proxy_read_timeout 90; - } - - location /retrieve { - rewrite /retrieve/(.*) /$1 break; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://search-service:9200; - proxy_read_timeout 90; - } - - location / { - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://ui:3000/; - proxy_read_timeout 90; - } -} diff --git a/dbrepo-query-service/Dockerfile b/dbrepo-query-service/Dockerfile index a8114f56c6..7b32d8c70b 100644 --- a/dbrepo-query-service/Dockerfile +++ b/dbrepo-query-service/Dockerfile @@ -27,7 +27,7 @@ ENV METADATA_USERNAME=root ENV METADATA_PASSWORD=dbrepo ENV BROKER_USERNAME=fda ENV BROKER_PASSWORD=fda -ENV GATEWAY_ENDPOINT=http://gateway-service:9095 +ENV GATEWAY_ENDPOINT=http://gateway-service ENV SHARED_FILESYSTEM=/tmp ENV BROKER_CONSUMERS=2 ENV LOG_LEVEL=debug diff --git a/dbrepo-query-service/rest-service/src/main/resources/application-docker.yml b/dbrepo-query-service/rest-service/src/main/resources/application-docker.yml deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/dbrepo-query-service/rest-service/src/main/resources/application-local.yml b/dbrepo-query-service/rest-service/src/main/resources/application-local.yml index ac9c7fb360..59ec68cf1a 100644 --- a/dbrepo-query-service/rest-service/src/main/resources/application-local.yml +++ b/dbrepo-query-service/rest-service/src/main/resources/application-local.yml @@ -39,13 +39,8 @@ logging: root: warn at.tuwien.: trace org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug -eureka: - instance: - hostname: query-service - non-secure-port: 9093 - client.serviceUrl.defaultZone: http://discovery-service:9090/eureka/ fda: - gateway.endpoint: http://localhost:9095 + gateway.endpoint: http://localhost ready.path: ./ready jwt: issuer: https://localhost:8443/realms/dbrepo diff --git a/dbrepo-query-service/rest-service/src/main/resources/application.yml b/dbrepo-query-service/rest-service/src/main/resources/application.yml index df6ca210fb..c7860e13a4 100644 --- a/dbrepo-query-service/rest-service/src/main/resources/application.yml +++ b/dbrepo-query-service/rest-service/src/main/resources/application.yml @@ -35,11 +35,6 @@ logging: root: warn at.tuwien.: "${LOG_LEVEL}" org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug -eureka: - instance: - hostname: query-service - non-secure-port: 9093 - client.serviceUrl.defaultZone: http://discovery-service:9090/eureka/ fda: gateway.endpoint: "${GATEWAY_ENDPOINT}" ready.path: /ready diff --git a/dbrepo-semantics-service/Dockerfile b/dbrepo-semantics-service/Dockerfile index bb9426c7b0..07f4c1abb1 100644 --- a/dbrepo-semantics-service/Dockerfile +++ b/dbrepo-semantics-service/Dockerfile @@ -1,14 +1,19 @@ -FROM python:3.9-slim -MAINTAINER Cornelia Michlits <cornelia.michlits@tuwien.ac.at> +FROM python:3.9-alpine +MAINTAINER Martin Weise <martin.weise@tuwien.ac.at> -RUN apt-get update && apt-get install -y python3-dev libmariadb3 libmariadb-dev gcc +RUN apk update && apk --no-cache add build-base gcc python3-dev libpq-dev libffi-dev mariadb-dev mariadb-connector-c \ + mariadb-connector-c-dev py3-pandas py3-sqlalchemy py3-requests py3-gevent py3-psycopg2 + +COPY ./requirements.txt ./requirements.txt +RUN pip install -r ./requirements.txt + +WORKDIR /app ENV FLASK_APP=app.py ENV FLASK_RUN_HOST=0.0.0.0 ENV PORT_APP=5010 ENV FLASK_DEBUG=0 ENV HOSTNAME=semantics-service -ENV EUREKA_SERVER=http://discovery-service:9090/eureka/ ENV READY_FILE=/ready ENV LOG_LEVEL=debug ENV METADATA_DB=fda @@ -17,8 +22,6 @@ ENV METADATA_PASSWORD=dbrepo ENV JWT_ISSUER=http://localhost:8080/realms/dbrepo ENV JWT_PUBKEY=public-key -WORKDIR /app - COPY requirements.txt requirements.txt RUN pip install -r requirements.txt > /dev/null diff --git a/dbrepo-semantics-service/app.py b/dbrepo-semantics-service/app.py index 4e9c167c75..a2a2604caa 100644 --- a/dbrepo-semantics-service/app.py +++ b/dbrepo-semantics-service/app.py @@ -3,7 +3,6 @@ import logging import re from flask import Flask, request, jsonify from logging.config import dictConfig -import py_eureka_client.eureka_client as eureka_client from flasgger import Swagger from flasgger.utils import swag_from from flasgger import LazyJSONEncoder @@ -263,11 +262,6 @@ def get_ontologies(name): rest_server_port = int(os.getenv('PORT_APP', 5010)) rest_server_host = os.getenv('FLASK_RUN_HOST', '0.0.0.0') -eureka_client.init(eureka_server=os.getenv('EUREKA_SERVER', 'http://localhost:9090/eureka/'), - app_name=os.getenv('HOSTNAME', 'fda-units-service'), - instance_ip=os.getenv('HOSTNAME', 'fda-units-service'), - instance_host=os.getenv('HOSTNAME', 'fda-units-service'), - instance_port=rest_server_port) if __name__ == '__main__': http_server = WSGIServer((rest_server_host, rest_server_port), app) diff --git a/dbrepo-semantics-service/requirements.txt b/dbrepo-semantics-service/requirements.txt index bf2f5a864c..b3a686a9cd 100644 --- a/dbrepo-semantics-service/requirements.txt +++ b/dbrepo-semantics-service/requirements.txt @@ -1,40 +1,55 @@ -attrs==22.2.0 -certifi==2022.12.7 -charset-normalizer==2.1.1 +attrs==23.1.0 +certifi==2023.5.7 +chardet==5.1.0 +charset-normalizer==2.0.12 click==8.1.3 -dnspython==2.2.1 -docker==6.0.1 +coverage==7.1.0 +docker==5.0.0 +exceptiongroup==1.1.1 flasgger==0.9.5 Flask==2.2.2 -gevent==22.10.2 -greenlet==2.0.1 +Flask-JWT-Extended==4.4.4 +gevent==21.8.0 +greenlet==1.1.3.post0 +html5lib==1.1 idna==3.4 -ifaddr==0.2.0 -importlib-metadata==5.2.0 +importlib-metadata==6.6.0 +iniconfig==2.0.0 isodate==0.6.1 itsdangerous==2.1.2 Jinja2==3.1.2 +json-table-schema==0.2.1 jsonschema==4.17.3 +lxml==4.9.2 mariadb==1.0.10 -MarkupSafe==2.1.1 -mistune==2.0.4 -packaging==22.0 -prometheus-client==0.15.0 +MarkupSafe==2.1.2 +messytables==0.15.2 +mistune==2.0.5 +numpy==1.24.3 +packaging==23.1 +pandas==1.2.3 +pluggy==1.0.0 +prometheus-client==0.16.0 prometheus-flask-exporter==0.21.0 -py-eureka-client==0.11.7 +psycopg2-binary==2.8.6 +PyJWT==2.6.0 pyparsing==3.0.9 pyrsistent==0.19.3 +pytest==7.2.1 +python-dateutil==2.8.2 +python-magic==0.4.27 +pytz==2023.3 PyYAML==6.0 rdflib==6.2.0 -requests==2.28.1 +requests==2.26.0 six==1.16.0 -urllib3==1.26.13 -websocket-client==1.4.2 -Werkzeug==2.2.2 -zipp==3.11.0 +SQLAlchemy==1.4.15 +tomli==2.0.1 +urllib3==1.26.15 +webencodings==0.5.1 +websocket-client==1.5.1 +Werkzeug==2.3.3 +xlrd==2.0.1 +zipp==3.15.0 zope.event==4.6 -zope.interface==5.5.2 -html5lib==1.1 -pytest==7.2.1 -coverage==7.1.0 -Flask-JWT-Extended==4.4.4 \ No newline at end of file +zope.interface==6.0 diff --git a/dbrepo-table-service/rest-service/src/main/resources/application-local.yml b/dbrepo-table-service/rest-service/src/main/resources/application-local.yml index ea99819af3..325e6444db 100644 --- a/dbrepo-table-service/rest-service/src/main/resources/application-local.yml +++ b/dbrepo-table-service/rest-service/src/main/resources/application-local.yml @@ -35,11 +35,6 @@ logging: root: warn at.tuwien.: trace org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug -eureka: - instance: - hostname: table-service - non-secure-port: 9094 - client.serviceUrl.defaultZone: http://localhost:9090/eureka/ fda: ready.path: ./ready jwt: @@ -47,7 +42,7 @@ fda: public_key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqqnHQ2BWWW9vDNLRCcxD++xZg/16oqMo/c1l+lcFEjjAIJjJp/HqrPYU/U9GvquGE6PbVFtTzW1KcKawOW+FJNOA3CGo8Q1TFEfz43B8rZpKsFbJKvQGVv1Z4HaKPvLUm7iMm8Hv91cLduuoWx6Q3DPe2vg13GKKEZe7UFghF+0T9u8EKzA/XqQ0OiICmsmYPbwvf9N3bCKsB/Y10EYmZRb8IhCoV9mmO5TxgWgiuNeCTtNCv2ePYqL/U0WvyGFW0reasIK8eg3KrAUj8DpyOgPOVBn3lBGf+3KFSYi+0bwZbJZWqbC/Xlk20Go1YfeJPRIt7ImxD27R/lNjgDO/MwIDAQAB client_secret: client-secret client_id: dbrepo-client - gateway.endpoint: http://localhost:9095 + gateway.endpoint: http://localhost elastic: endpoint: localhost:9200 username: elastic diff --git a/dbrepo-table-service/rest-service/src/main/resources/application.yml b/dbrepo-table-service/rest-service/src/main/resources/application.yml index 24e4a65348..fbe68f3242 100644 --- a/dbrepo-table-service/rest-service/src/main/resources/application.yml +++ b/dbrepo-table-service/rest-service/src/main/resources/application.yml @@ -35,11 +35,6 @@ logging: root: warn at.tuwien.: "${LOG_LEVEL}" org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug -eureka: - instance: - hostname: table-service - non-secure-port: 9094 - client.serviceUrl.defaultZone: http://discovery-service:9090/eureka/ fda: ready.path: /ready jwt: @@ -47,7 +42,7 @@ fda: public_key: "${JWT_PUBKEY}" client_secret: "${DBREPO_CLIENT_SECRET}" client_id: "${CLIENT_ID}" - gateway.endpoint: http://gateway-service:9095 + gateway.endpoint: http://gateway-service elastic: endpoint: search-service:9200 username: elastic diff --git a/dbrepo-ui/README.md b/dbrepo-ui/README.md index 50b0454fef..c4f407ba90 100644 --- a/dbrepo-ui/README.md +++ b/dbrepo-ui/README.md @@ -44,7 +44,7 @@ See https://nuxtjs.org/ Configure the `.env` file for the IP and port running or run through terminal: ```bash -API=http://fda-gateway-service:9095 npm --prefix ./fda-ui run dev +API=http://fda-gateway-service npm --prefix ./fda-ui run dev ``` Of course you need to add `fda-gateway-service` to your `/etc/hosts` file for Docker "DNS" to your containers: diff --git a/dbrepo-user-service/Dockerfile b/dbrepo-user-service/Dockerfile index 58faa272f6..8473a7fc59 100644 --- a/dbrepo-user-service/Dockerfile +++ b/dbrepo-user-service/Dockerfile @@ -24,7 +24,7 @@ FROM openjdk:11-jre-slim as runtime ENV METADATA_DB=fda ENV METADATA_USERNAME=root ENV METADATA_PASSWORD=dbrepo -ENV GATEWAY_ENDPOINT=http://gateway-service:9095 +ENV GATEWAY_ENDPOINT=http://gateway-service ENV JWT_ISSUER=http://localhost:8080/realms/dbrepo ENV JWT_PUBKEY=public-key ENV LOG_LEVEL=debug diff --git a/dbrepo-user-service/rest-service/src/main/resources/application-local.yml b/dbrepo-user-service/rest-service/src/main/resources/application-local.yml index 6a5a1c57f8..c93c21664f 100644 --- a/dbrepo-user-service/rest-service/src/main/resources/application-local.yml +++ b/dbrepo-user-service/rest-service/src/main/resources/application-local.yml @@ -35,18 +35,13 @@ logging: root: warn at.tuwien.: trace org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug -eureka: - instance: - hostname: user-service - non-secure-port: 9098 - client.serviceUrl.defaultZone: http://localhost:9090/eureka/ fda: elastic: endpoint: localhost:9200 username: elastic password: elastic ready.path: ./ready - gateway.endpoint: http://localhost:9095 + gateway.endpoint: http://localhost default_role: default-researcher-roles jwt: issuer: https://localhost:8443/realms/dbrepo diff --git a/dbrepo-user-service/rest-service/src/main/resources/application.yml b/dbrepo-user-service/rest-service/src/main/resources/application.yml index f0606a3bf7..8c87174566 100644 --- a/dbrepo-user-service/rest-service/src/main/resources/application.yml +++ b/dbrepo-user-service/rest-service/src/main/resources/application.yml @@ -35,11 +35,6 @@ logging: root: warn at.tuwien.: "${LOG_LEVEL}" org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug -eureka: - instance: - hostname: user-service - non-secure-port: 9098 - client.serviceUrl.defaultZone: http://discovery-service:9090/eureka/ fda: elastic: endpoint: search-service:9200 diff --git a/docker-compose.dbrepo1.yml b/docker-compose.dbrepo1.yml index b85af3cd4f..626ed083c1 100644 --- a/docker-compose.dbrepo1.yml +++ b/docker-compose.dbrepo1.yml @@ -68,7 +68,7 @@ services: networks: core: ports: - - "9095:9095" + - "80:80" env_file: - .env depends_on: diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 8984baecab..32ec047479 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -68,7 +68,7 @@ services: networks: core: ports: - - "9095:9095" + - "80:80" env_file: - .env depends_on: diff --git a/docker-compose.yml b/docker-compose.yml index 5a3cd4022d..00b55f085c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -49,40 +49,6 @@ services: logging: driver: json-file - dbrepo-discovery-service: - restart: "no" - container_name: dbrepo-discovery-service - hostname: discovery-service - build: ./dbrepo-discovery-service - image: dbrepo-discovery-service - networks: - core: - ports: - - "9090:9090" - env_file: - - .env - logging: - driver: json-file - - dbrepo-gateway-service: - restart: "no" - container_name: dbrepo-gateway-service - hostname: gateway-service - build: ./dbrepo-gateway-service - image: dbrepo-gateway-service - networks: - core: - public: - ports: - - "9095:9095" - env_file: - - .env - depends_on: - dbrepo-discovery-service: - condition: service_healthy - logging: - driver: json-file - dbrepo-database-service: restart: "no" container_name: dbrepo-database-service @@ -144,8 +110,6 @@ services: volumes: - authentication-service-data:/opt/keycloak/data/ depends_on: - dbrepo-discovery-service: - condition: service_healthy dbrepo-metadata-db: condition: service_healthy logging: @@ -260,9 +224,6 @@ services: volumes: - "/tmp:/tmp" - /var/run/docker.sock:/var/run/docker.sock - depends_on: - dbrepo-discovery-service: - condition: service_healthy logging: driver: json-file @@ -302,8 +263,6 @@ services: - "/tmp:/tmp" - /var/run/docker.sock:/var/run/docker.sock depends_on: - dbrepo-discovery-service: - condition: service_healthy dbrepo-metadata-db: condition: service_healthy dbrepo-authentication-service: @@ -325,8 +284,6 @@ services: env_file: - .env depends_on: - dbrepo-discovery-service: - condition: service_healthy dbrepo-authentication-service: condition: service_healthy volumes: @@ -342,9 +299,6 @@ services: image: dbrepo-search-service networks: core: - depends_on: - dbrepo-discovery-service: - condition: service_healthy ports: - 9200:9200 - 9600:9600 @@ -376,12 +330,12 @@ services: logging: driver: json-file - dbrepo-proxy: + dbrepo-gateway-service: restart: "no" - container_name: dbrepo-proxy - hostname: proxy - build: ./dbrepo-proxy - image: dbrepo-proxy + container_name: dbrepo-gateway-service + hostname: gateway-service + build: ./dbrepo-gateway-service + image: dbrepo-gateway-service networks: core: public: @@ -393,11 +347,31 @@ services: env_file: - .env depends_on: + dbrepo-analyse-service: + condition: service_healthy + dbrepo-authentication-service: + condition: service_healthy + dbrepo-broker-service: + condition: service_healthy + dbrepo-container-service: + condition: service_healthy + dbrepo-database-service: + condition: service_healthy + dbrepo-identifier-service: + condition: service_healthy + dbrepo-metadata-service: + condition: service_healthy + dbrepo-query-service: + condition: service_healthy dbrepo-search-service: condition: service_started - dbrepo-gateway-service: + dbrepo-semantics-service: + condition: service_healthy + dbrepo-table-service: condition: service_healthy dbrepo-ui: condition: service_started + dbrepo-user-service: + condition: service_healthy logging: driver: json-file -- GitLab