diff --git a/.env.unix.example b/.env.unix.example index b0ad6ff0532fd9d5d74c99b95cee0ea66122cfcd..9f087cb8e2d40cb0db81f208e98eedfce68ab9c9 100644 --- a/.env.unix.example +++ b/.env.unix.example @@ -12,6 +12,7 @@ METADATA_PASSWORD=dbrepo AUTH_DB=keycloak AUTH_USERNAME=root AUTH_PASSWORD=dbrepo +BROKER_ENDPOINT=http://broker-service:15672/api/broker BROKER_USERNAME=fda BROKER_PASSWORD=fda KEYCLOAK_ADMIN=fda diff --git a/Makefile b/Makefile index b6a203169d6e3e44903d5178e4ce8e49a2354fa3..1a9b8773511c017bdce71d269443dfc6950a723e 100644 --- a/Makefile +++ b/Makefile @@ -163,6 +163,8 @@ coverage-frontend: build-frontend test-frontend: build-frontend yarn --cwd ./dbrepo-ui install yarn --cwd ./dbrepo-ui run test:unit || true + yarn --cwd ./dbrepo-ui playwright install + yarn --cwd ./dbrepo-ui run test:e2e || true yarn --cwd ./dbrepo-ui run coverage || true test-clients: diff --git a/dbrepo-broker-service/Dockerfile b/dbrepo-broker-service/Dockerfile index caef7401ec51119dd66b94c4ae0a3cf184021fed..78bc9bb462d61dda0def30fbd5ac70b45cde95f1 100644 --- a/dbrepo-broker-service/Dockerfile +++ b/dbrepo-broker-service/Dockerfile @@ -13,5 +13,3 @@ RUN rabbitmq-plugins enable --offline rabbitmq_prometheus rabbitmq_mqtt rabbitmq EXPOSE 5672 EXPOSE 15672 - -HEALTHCHECK --interval=10s --timeout=5s --retries=12 CMD wget --spider http://localhost:15672/broker/ diff --git a/dbrepo-broker-service/rabbitmq.conf b/dbrepo-broker-service/rabbitmq.conf index 23942bcede8a6ab13812d91beea5aac8583c956b..a2b3bf521b37b6a880d4e86dfc5932f6ee4614d8 100644 --- a/dbrepo-broker-service/rabbitmq.conf +++ b/dbrepo-broker-service/rabbitmq.conf @@ -11,7 +11,7 @@ default_permissions.write = .* listeners.tcp.1 = 0.0.0.0:5672 # management ui (https://www.rabbitmq.com/management.html#path-prefix) -management.path_prefix = /broker +management.path_prefix = /api/broker # logging log.console = true diff --git a/dbrepo-metadata-service/Dockerfile b/dbrepo-metadata-service/Dockerfile index e9587b40feac829f8b1b7d0676779a758c7f29da..6e9c922e45aaa46bf1988cc766cd0e2b8eb9e119 100644 --- a/dbrepo-metadata-service/Dockerfile +++ b/dbrepo-metadata-service/Dockerfile @@ -36,7 +36,7 @@ ENV ADMIN_MAIL="noreply@localhost" ENV BASE_URL="http://localhost" ENV GRANT_PRIVILEGES="SELECT, CREATE, CREATE VIEW, CREATE ROUTINE, CREATE TEMPORARY TABLES, LOCK TABLES, INDEX, TRIGGER, INSERT, UPDATE, DELETE" ENV BROKER_CONSUMERS=2 -ENV BROKER_ENDPOINT="http://broker-service:15672" +ENV BROKER_ENDPOINT="http://broker-service:15672/api/broker" ENV BROKER_USERNAME=fda ENV BROKER_PASSWORD=fda ENV DELETED_RECORD=persistent diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/BrokerServiceGatewayImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/BrokerServiceGatewayImpl.java index 52de16e2f364e3ea6f4896763dc0514cc0331a64..de50b0538a1f3a8f8f7e7358d9351b12330a452d 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/BrokerServiceGatewayImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/BrokerServiceGatewayImpl.java @@ -47,16 +47,12 @@ public class BrokerServiceGatewayImpl implements BrokerServiceGateway { this.gatewayConfig = gatewayConfig; } - private String parseUrl(String path) { - final String url = "/api" + path; - log.debug("parse url: {}", url); - return url; - } - @Override public void createVirtualHost(CreateVirtualHostDto data) throws BrokerVirtualHostCreationException { - final ResponseEntity<Void> response = restTemplate.exchange(parseUrl("/vhost"), HttpMethod.POST, - new HttpEntity<>(data), Void.class); + final String url = "/api/vhost"; + log.trace("POST {}{}", gatewayConfig.getBrokerEndpoint(), url); + final ResponseEntity<Void> response = restTemplate.exchange(url, HttpMethod.POST, new HttpEntity<>(data), + Void.class); if (!response.getStatusCode().equals(HttpStatus.CREATED)) { log.error("Failed to create virtual host: {}", response.getStatusCode()); throw new BrokerVirtualHostCreationException("Failed to create virtual host"); @@ -67,8 +63,10 @@ public class BrokerServiceGatewayImpl implements BrokerServiceGateway { @Override public void grantPermission(String username, ExchangeUpdatePermissionsDto data) throws BrokerVirtualHostGrantException { - final ResponseEntity<Void> response = restTemplate.exchange(parseUrl("/topic-permissions/dbrepo/" + username), HttpMethod.PUT, - new HttpEntity<>(data), Void.class); + final String url = "/api/topic-permissions/dbrepo/" + username; + log.trace("PUT {}{}", gatewayConfig.getBrokerEndpoint(), url); + final ResponseEntity<Void> response = restTemplate.exchange(url, HttpMethod.PUT, new HttpEntity<>(data), + Void.class); if (!response.getStatusCode().equals(HttpStatus.CREATED) && !response.getStatusCode().equals(HttpStatus.NO_CONTENT)) { log.error("Failed to grant exchange: {}", response.getStatusCode()); throw new BrokerVirtualHostGrantException("Failed to grant exchange"); @@ -82,8 +80,10 @@ public class BrokerServiceGatewayImpl implements BrokerServiceGateway { .passwordHash("") .tags("") .build(); - final ResponseEntity<Void> response = restTemplate.exchange(parseUrl("/users/" + username), HttpMethod.PUT, - new HttpEntity<>(data), Void.class); + final String url = "/api/users/" + username; + log.trace("PUT {}{}", gatewayConfig.getBrokerEndpoint(), url); + final ResponseEntity<Void> response = restTemplate.exchange(url, HttpMethod.PUT, new HttpEntity<>(data), + Void.class); if (!response.getStatusCode().equals(HttpStatus.CREATED) && !response.getStatusCode().equals(HttpStatus.NO_CONTENT)) { log.error("Failed to create user: {}", response.getStatusCode()); throw new BrokerVirtualHostCreationException("Failed to create user"); @@ -94,8 +94,10 @@ public class BrokerServiceGatewayImpl implements BrokerServiceGateway { @Override public void grantPermission(String username, GrantVirtualHostPermissionsDto data) throws BrokerVirtualHostGrantException { - final ResponseEntity<Void> response = restTemplate.exchange(parseUrl("/permissions/dbrepo/" + username), HttpMethod.PUT, - new HttpEntity<>(data), Void.class); + final String url = "/api/permissions/dbrepo/" + username; + log.trace("PUT {}{}", gatewayConfig.getBrokerEndpoint(), url); + final ResponseEntity<Void> response = restTemplate.exchange(url, HttpMethod.PUT, new HttpEntity<>(data), + Void.class); if (!response.getStatusCode().equals(HttpStatus.CREATED) && !response.getStatusCode().equals(HttpStatus.NO_CONTENT)) { log.error("Failed to grant virtual host: {}", response.getStatusCode()); throw new BrokerVirtualHostGrantException("Failed to grant virtual host"); @@ -105,16 +107,10 @@ public class BrokerServiceGatewayImpl implements BrokerServiceGateway { @Override public List<ConsumerDto> findAllConsumers() { - final StringBuilder urlBuilder = new StringBuilder(gatewayConfig.getBrokerEndpoint()) - .append("/api"); - if (Arrays.stream(environment.getActiveProfiles()).noneMatch(p -> p.equals("junit"))) { - urlBuilder.append("/broker"); - } - urlBuilder.append("/consumers/") - .append(VIRTUAL_SERVER); + final String url = "/api/consumers/" + VIRTUAL_SERVER; log.trace("gateway broker find all consumers, virtual server={}", VIRTUAL_SERVER); - final URI findUri = URI.create(urlBuilder.toString()); - final ResponseEntity<List<ConsumerDto>> response = restTemplate.exchange(findUri, HttpMethod.GET, + log.trace("GET {}{}", gatewayConfig.getBrokerEndpoint(), url); + final ResponseEntity<List<ConsumerDto>> response = restTemplate.exchange(URI.create(url), HttpMethod.GET, HttpEntity.EMPTY, new ParameterizedTypeReference<>() { }); return response.getBody(); diff --git a/dbrepo-ui/config.js b/dbrepo-ui/config.js index 1ccca7b563eec4b1a6cf57d9325cb53b30fb229c..480968cd52d0b6053437b3251a50f34b22ce5555 100644 --- a/dbrepo-ui/config.js +++ b/dbrepo-ui/config.js @@ -1,21 +1,21 @@ const config = {} -config.title = process.env.TITLE || null -config.icon = process.env.ICON || null -config.brokerUsername = process.env.BROKER_USERNAME || null -config.brokerPassword = process.env.BROKER_PASSWORD || null -config.brokerLoginUrl = process.env.BROKER_LOGIN_URL || null -config.keycloakLoginUrl = process.env.KEYCLOAK_LOGIN_URL || null -config.sharedFilesystem = process.env.SHARED_FILESYSTEM || null -config.version = process.env.VERSION || null -config.logo = process.env.LOGO || null -config.tokenMax = process.env.TOKEN_MAX || null -config.searchUsername = process.env.SEARCH_USERNAME || null -config.searchPassword = process.env.SEARCH_PASSWORD || null -config.clientId = process.env.DBREPO_CLIENT_ID || null -config.clientSecret = process.env.DBREPO_CLIENT_SECRET || null -config.defaultPublisher = process.env.DEFAULT_PID_PUBLISHER || null -config.doiUrl = process.env.DOI_URL || null -config.uploadPath = process.env.UPLOAD_PATH || null +config.title = process.env.TITLE || 'Database Repository' +config.icon = process.env.ICON || '/favicon.ico' +config.brokerUsername = process.env.BROKER_USERNAME || 'fda' +config.brokerPassword = process.env.BROKER_PASSWORD || 'fda' +config.brokerLoginUrl = process.env.BROKER_LOGIN_URL || '/broker/' +config.keycloakLoginUrl = process.env.KEYCLOAK_LOGIN_URL || '/api/auth/' +config.sharedFilesystem = process.env.SHARED_FILESYSTEM || '/tmp' +config.version = process.env.VERSION || 'latest' +config.logo = process.env.LOGO || '/logo.png' +config.tokenMax = process.env.TOKEN_MAX || 5 +config.searchUsername = process.env.SEARCH_USERNAME || 'admin' +config.searchPassword = process.env.SEARCH_PASSWORD || 'admin' +config.clientId = process.env.DBREPO_CLIENT_ID || 'dbrepo-client' +config.clientSecret = process.env.DBREPO_CLIENT_SECRET || 'MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG' +config.defaultPublisher = process.env.DEFAULT_PID_PUBLISHER || 'Example University' +config.doiUrl = process.env.DOI_URL || 'https://doi.org' +config.uploadPath = process.env.UPLOAD_PATH || '/tmp/' module.exports = config diff --git a/dbrepo-ui/package.json b/dbrepo-ui/package.json index 61548c8c365411c283009ea84c387b58ec219161..d9fc5ed0314786876d03ee1fe8f4fb74fcd94f64 100644 --- a/dbrepo-ui/package.json +++ b/dbrepo-ui/package.json @@ -3,7 +3,7 @@ "version": "1.0.0", "private": true, "scripts": { - "dev": "NODE_ENV=development nuxt --port 3001", + "dev": "NODE_ENV=development nuxt --dotenv ../.env --port 3001", "docker": "nuxt > /dev/null", "build": "nuxt build", "start": "nuxt start", diff --git a/dbrepo-ui/pages/login.vue b/dbrepo-ui/pages/login.vue index 4ffb24e8e72363cb563a02d83745a175b48612c0..d99b9622e9ed480642cabf9a0c164e37eef15265 100644 --- a/dbrepo-ui/pages/login.vue +++ b/dbrepo-ui/pages/login.vue @@ -51,19 +51,12 @@ Login </v-btn> </v-card-actions> + <v-card-subtitle class="text-right"> + <a v-if="rabbitMqUrl" color="orange" class="mr-1" plain :href="rabbitMqUrl">RabbitMQ Admin</a> + <a v-if="keycloakUrl" color="secondary" class="ml-1" plain :href="keycloakUrl">Keycloak Admin</a> + </v-card-subtitle> </v-card> </v-form> - <v-toolbar v-if="!token" flat> - <v-spacer /> - <v-toolbar-title> - <v-btn v-if="rabbitMqUrl" color="orange" plain :href="rabbitMqUrl"> - <v-icon left>mdi-rabbit</v-icon> RabbitMQ - </v-btn> - <v-btn v-if="keycloakUrl" color="secondary" plain :href="keycloakUrl"> - <v-icon left>mdi-key</v-icon> Keycloak - </v-btn> - </v-toolbar-title> - </v-toolbar> </div> </template> diff --git a/docker-compose.yml b/docker-compose.yml index bd8b3eb5e6173903aa54ea3a4290f3491718769e..32d7641a39a1defaead81925c3146706761e47f9 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -223,6 +223,11 @@ services: ports: - "5672:5672" - "15672:15672" + healthcheck: + test: wget -qO- localhost:15672/api/broker | grep "RabbitMQ" || exit 1 + interval: 10s + timeout: 5s + retries: 12 depends_on: dbrepo-authentication-service: condition: service_healthy