diff --git a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/handlers/ApiExceptionHandler.java b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/handlers/ApiExceptionHandler.java index b15254702a491908482663163defb530e5cbcf6a..6aa48b157082afe6686fccca36b375723cc3b44b 100644 --- a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/handlers/ApiExceptionHandler.java +++ b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/handlers/ApiExceptionHandler.java @@ -94,6 +94,13 @@ public class ApiExceptionHandler extends ResponseEntityExceptionHandler { return generic_handle(e.getClass(), e.getLocalizedMessage()); } + @Hidden + @ResponseStatus(code = HttpStatus.LOCKED) + @ExceptionHandler(ContainerQuotaException.class) + public ResponseEntity<ApiErrorDto> handle(ContainerQuotaException e) { + return generic_handle(e.getClass(), e.getLocalizedMessage()); + } + @Hidden @ResponseStatus(code = HttpStatus.FORBIDDEN) @ExceptionHandler(CredentialsInvalidException.class) diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ContainerEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ContainerEndpoint.java index 3c6967b22c08f06fb368579ba7577c17edd1686b..62319662e24b78f9e456d1d0cabd8fd79639c85f 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ContainerEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ContainerEndpoint.java @@ -65,11 +65,11 @@ public class ContainerEndpoint { }) public ResponseEntity<List<ContainerBriefDto>> findAll(@RequestParam(required = false) Integer limit) { log.debug("endpoint find all containers, limit={}", limit); - final List<Container> containers = containerService.getAll(limit); - final List<ContainerBriefDto> dtos = containers.stream() + final List<ContainerBriefDto> dtos = containerService.getAll(limit) + .stream() .map(metadataMapper::containerToDatabaseContainerBriefDto) .collect(Collectors.toList()); - log.trace("find all containers resulted in containers {}", dtos); + log.debug("find all containers resulted in {} container(s)", dtos.size()); return ResponseEntity.ok() .body(dtos); } diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/ContainerEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/ContainerEndpointUnitTest.java index 7706e185bd3721fdddec7daed15ce8df628b0bad..ab3f4485b2cf35134c2d0ee126ee30af04636165 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/ContainerEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/ContainerEndpointUnitTest.java @@ -8,6 +8,7 @@ import at.tuwien.entities.container.Container; import at.tuwien.exception.*; import at.tuwien.service.impl.ContainerServiceImpl; import lombok.extern.log4j.Log4j2; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -37,6 +38,11 @@ public class ContainerEndpointUnitTest extends AbstractUnitTest { @Autowired private ContainerEndpoint containerEndpoint; + @BeforeEach + public void beforeEach() { + genesis(); + } + @Test @WithAnonymousUser public void findById_anonymous_succeeds() throws ContainerNotFoundException { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ImageServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ImageServiceUnitTest.java index bce3c7bc125636591d86a83311a4315ab677fba3..524c5715b4fd59e24c3f972a3acf2bd08453d99b 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ImageServiceUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ImageServiceUnitTest.java @@ -1,5 +1,6 @@ package at.tuwien.service; +import at.tuwien.exception.ImageInvalidException; import at.tuwien.exception.ImageNotFoundException; import at.tuwien.test.AbstractUnitTest; import at.tuwien.api.container.image.ImageChangeDto; @@ -82,8 +83,8 @@ public class ImageServiceUnitTest extends AbstractUnitTest { .build(); /* mock */ - when(imageRepository.save(any(ContainerImage.class))) - .thenThrow(ConstraintViolationException.class); + when(imageRepository.findByNameAndVersion(IMAGE_1_NAME, IMAGE_1_VERSION)) + .thenReturn(Optional.of(IMAGE_1)); /* test */ assertThrows(ImageAlreadyExistsException.class, () -> { @@ -91,6 +92,27 @@ public class ImageServiceUnitTest extends AbstractUnitTest { }); } + @Test + public void create_multipleDefaults_fails() { + final ImageCreateDto request = ImageCreateDto.builder() + .name(IMAGE_1_NAME) + .version("10.5") + .defaultPort(IMAGE_1_PORT) + .isDefault(true) + .build(); + + /* mock */ + when(imageRepository.findByNameAndVersion(IMAGE_1_NAME, IMAGE_1_VERSION)) + .thenReturn(Optional.empty()); + when(imageRepository.findByIsDefault(true)) + .thenReturn(Optional.of(IMAGE_1)); + + /* test */ + assertThrows(ImageInvalidException.class, () -> { + imageService.create(request, USER_1_PRINCIPAL); + }); + } + @Test public void update_succeeds() { final ImageServiceImpl mockImageService = mock(ImageServiceImpl.class); diff --git a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java index 40556f3f5bc59838bb16953453d8c0fb7539f916..6ade19c1ec0f6c742a97731d3a97482fea97923d 100644 --- a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java +++ b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java @@ -1146,6 +1146,7 @@ public abstract class BaseTest { .host(CONTAINER_2_HOST) .port(CONTAINER_2_PORT) .quota(CONTAINER_2_QUOTA) + .databases(List.of()) .privilegedUsername(CONTAINER_2_PRIVILEGED_USERNAME) .privilegedPassword(CONTAINER_2_PRIVILEGED_PASSWORD) .build(); @@ -1191,6 +1192,7 @@ public abstract class BaseTest { .host(CONTAINER_3_HOST) .port(CONTAINER_3_PORT) .quota(CONTAINER_3_QUOTA) + .databases(List.of()) .privilegedUsername(CONTAINER_3_PRIVILEGED_USERNAME) .privilegedPassword(CONTAINER_3_PRIVILEGED_PASSWORD) .build(); diff --git a/docker-compose.yml b/docker-compose.yml index 9fcad8c366fe46d31ad22f381c686afc0d27badb..96fb14f99510d4be52433188cf1b38b04f6228b6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,8 +1,6 @@ volumes: metadata-db-data: data-db-data: - data2-db-data: - data3-db-data: auth-db-data: broker-service-data: upload-service-data: @@ -53,42 +51,6 @@ services: logging: driver: json-file - dbrepo-data2-db: - restart: "no" - container_name: dbrepo-data2-db - hostname: data2-db - image: docker.io/bitnami/mariadb:10.5.26-debian-12-r2 - volumes: - - data2-db-data:/bitnami/mariadb - - "${SHARED_VOLUME:-/tmp}:/tmp" - environment: - MARIADB_ROOT_PASSWORD: "${DATA_DB_PASSWORD:-dbrepo}" - healthcheck: - test: mysqladmin ping --user=root --password="${DATA_DB_PASSWORD:-dbrepo}" --silent - interval: 10s - timeout: 5s - retries: 12 - logging: - driver: json-file - - dbrepo-data3-db: - restart: "no" - container_name: dbrepo-data3-db - hostname: data3-db - image: docker.io/bitnami/mariadb:11.4.3-debian-12-r1 - volumes: - - data3-db-data:/bitnami/mariadb - - "${SHARED_VOLUME:-/tmp}:/tmp" - environment: - MARIADB_ROOT_PASSWORD: "${DATA_DB_PASSWORD:-dbrepo}" - healthcheck: - test: mysqladmin ping --user=root --password="${DATA_DB_PASSWORD:-dbrepo}" --silent - interval: 10s - timeout: 5s - retries: 12 - logging: - driver: json-file - dbrepo-auth-db: restart: "no" container_name: dbrepo-auth-db