diff --git a/Makefile b/Makefile index 1de82865aa2cd00d37ad3879f346d41ab7cab89b..e3c832ef22945416a0d34c70bcfa4ec742c55ef1 100644 --- a/Makefile +++ b/Makefile @@ -193,31 +193,31 @@ pull-metadata: test-backend: test-authentication-service test-container-service test-database-service test-discovery-service test-gateway-service test-query-service test-table-service test-identifier-service test-metadata-service -test-authentication-service: +test-authentication-service: build-backend-metadata-db mvn -f ./fda-authentication-service/pom.xml clean test verify -test-identifier-service: +test-identifier-service: build-backend-metadata-db mvn -f ./fda-identifier-service/pom.xml clean test verify -test-container-service: +test-container-service: build-backend-metadata-db mvn -f ./fda-container-service/pom.xml clean test verify -test-database-service: +test-database-service: build-backend-metadata-db mvn -f ./fda-database-service/pom.xml clean test verify -test-discovery-service: +test-discovery-service: build-backend-metadata-db mvn -f ./fda-discovery-service/pom.xml clean test verify -test-gateway-service: +test-gateway-service: build-backend-metadata-db mvn -f ./fda-gateway-service/pom.xml clean test verify -test-query-service: +test-query-service: build-backend-metadata-db mvn -f ./fda-query-service/pom.xml clean test verify -test-table-service: +test-table-service: build-backend-metadata-db mvn -f ./fda-table-service/pom.xml clean test verify -test-metadata-service: +test-metadata-service: build-backend-metadata-db mvn -f ./fda-metadata-service/pom.xml clean test verify coverage-frontend: clean build-frontend diff --git a/fda-authentication-service/rest-service/src/test/resources/application.properties b/fda-authentication-service/rest-service/src/test/resources/application.properties index 88c58a85e34098a6ef1eddde183d20544dc6fb1c..bcce0036c92b680a401f6973bcc0e8894579cd1a 100644 --- a/fda-authentication-service/rest-service/src/test/resources/application.properties +++ b/fda-authentication-service/rest-service/src/test/resources/application.properties @@ -15,4 +15,7 @@ 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 +spring.jpa.show-sql=false + +# disable mail health check +management.health.mail.enabled=false \ No newline at end of file diff --git a/fda-container-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java b/fda-container-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java index 2797e45b87ea35e0c8c2530c9e10307ef9186b2b..bca4a202830065e4a2d7018a430f9e3e28db61d1 100644 --- a/fda-container-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java +++ b/fda-container-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java @@ -8,6 +8,8 @@ import at.tuwien.entities.container.image.ContainerImageEnvironmentItem; import at.tuwien.entities.container.image.ContainerImageEnvironmentItemType; import at.tuwien.entities.user.RoleType; import at.tuwien.entities.user.User; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.test.context.TestPropertySource; import java.time.Instant; @@ -24,6 +26,7 @@ public abstract class BaseUnitTest { public final static Boolean USER_1_THEME_DARK = false; public final static String USER_1_PASSWORD = "p455w0rdh45h"; public final static RoleType USER_1_ROLE_TYPE = RoleType.ROLE_RESEARCHER; + public final static GrantedAuthority USER_1_AUTHORITY = new SimpleGrantedAuthority("ROLE_RESEARCHER"); public final static User USER_1 = User.builder() .username(USER_1_USERNAME) @@ -34,6 +37,55 @@ public abstract class BaseUnitTest { .roles(List.of(USER_1_ROLE_TYPE)) .build(); + public final static String USER_2_USERNAME = "dev"; + public final static String USER_2_EMAIL = "dev@gmail.com"; + public final static Boolean USER_2_EMAIL_VERIFIED = false; + public final static Boolean USER_2_THEME_DARK = false; + public final static String USER_2_PASSWORD = "p455w0rdh45"; + public final static RoleType USER_2_ROLE_TYPE = RoleType.ROLE_DEVELOPER; + public final static GrantedAuthority USER_2_AUTHORITY = new SimpleGrantedAuthority("ROLE_DEVELOPER"); + + public final static User USER_2 = User.builder() + .username(USER_2_USERNAME) + .email(USER_2_EMAIL) + .emailVerified(USER_2_EMAIL_VERIFIED) + .themeDark(USER_2_THEME_DARK) + .password(USER_2_PASSWORD) + .roles(List.of(USER_2_ROLE_TYPE)) + .build(); + + public final static String USER_3_USERNAME = "steward"; + public final static String USER_3_EMAIL = "steward@gmail.com"; + public final static Boolean USER_3_EMAIL_VERIFIED = false; + public final static Boolean USER_3_THEME_DARK = false; + public final static String USER_3_PASSWORD = "p455w0rdh45"; + public final static RoleType USER_3_ROLE_TYPE = RoleType.ROLE_DATA_STEWARD; + public final static GrantedAuthority USER_3_AUTHORITY = new SimpleGrantedAuthority("ROLE_DATA_STEWARD"); + + public final static User USER_3 = User.builder() + .username(USER_3_USERNAME) + .email(USER_3_EMAIL) + .emailVerified(USER_3_EMAIL_VERIFIED) + .themeDark(USER_3_THEME_DARK) + .password(USER_3_PASSWORD) + .roles(List.of(USER_3_ROLE_TYPE)) + .build(); + + public final static String USER_4_USERNAME = "nobody"; + public final static String USER_4_EMAIL = "nobody@gmail.com"; + public final static Boolean USER_4_EMAIL_VERIFIED = false; + public final static Boolean USER_4_THEME_DARK = false; + public final static String USER_4_PASSWORD = "p455w0rdh45"; + + public final static User USER_4 = User.builder() + .username(USER_4_USERNAME) + .email(USER_4_EMAIL) + .emailVerified(USER_4_EMAIL_VERIFIED) + .themeDark(USER_4_THEME_DARK) + .password(USER_4_PASSWORD) + .roles(List.of()) + .build(); + public final static Long IMAGE_1_ID = 1L; public final static String IMAGE_1_REPOSITORY = "mariadb"; public final static String IMAGE_1_TAG = "10.5"; @@ -90,10 +142,8 @@ public abstract class BaseUnitTest { .jdbcMethod(IMAGE_1_JDBC) .dialect(IMAGE_1_DIALECT) .driverClass(IMAGE_1_DRIVER) - .containers(List.of()) .compiled(IMAGE_1_BUILT) .size(IMAGE_1_SIZE) - .environment(IMAGE_1_ENV) .defaultPort(IMAGE_1_PORT) .build(); @@ -141,7 +191,6 @@ public abstract class BaseUnitTest { .jdbcMethod(IMAGE_2_JDBC) .dialect(IMAGE_2_DIALECT) .driverClass(IMAGE_2_DRIVER) - .containers(List.of()) .compiled(IMAGE_2_BUILT) .size(IMAGE_2_SIZE) .environment(IMAGE_2_ENV) @@ -151,51 +200,54 @@ public abstract class BaseUnitTest { public final static Long CONTAINER_1_ID = 1L; public final static String CONTAINER_1_HASH = "deadbeef"; public final static String CONTAINER_1_NAME = "fda-userdb-u01"; - public final static String CONTAINER_1_INTERNALNAME = "fda-userdb-u01"; + public final static String CONTAINER_1_INTERNALNAME = "dbrepo-userdb-fda-userdb-u01"; public final static String CONTAINER_1_DATABASE = "univie"; public final static String CONTAINER_1_IP = "172.28.0.5"; public final static Instant CONTAINER_1_CREATED = Instant.now().minus(1, HOURS); - public final static Long CONTAINER_2_ID = 2L; - public final static String CONTAINER_2_HASH = "deadbeef"; - public final static String CONTAINER_2_NAME = "fda-userdb-u02"; - public final static String CONTAINER_2_INTERNALNAME = "fda-userdb-u02"; - public final static String CONTAINER_2_DATABASE = "univie"; - public final static String CONTAINER_2_IP = "172.28.0.6"; - public final static Instant CONTAINER_2_CREATED = Instant.now().minus(2, HOURS); - - public final static Long CONTAINER_3_ID = 3L; - public final static String CONTAINER_3_HASH = "deadbeef"; - public final static String CONTAINER_3_NAME = "fda-userdb-u03"; - public final static String CONTAINER_3_INTERNALNAME = "fda-userdb-u03"; - public final static String CONTAINER_3_DATABASE = "u03"; - public final static String CONTAINER_3_IP = "173.38.0.7"; - public final static Instant CONTAINER_3_CREATED = Instant.now().minus(2, HOURS); - public final static Container CONTAINER_1 = Container.builder() .id(CONTAINER_1_ID) .name(CONTAINER_1_NAME) .internalName(CONTAINER_1_INTERNALNAME) .image(IMAGE_1) .hash(CONTAINER_1_HASH) + .ipAddress(CONTAINER_1_IP) .created(CONTAINER_1_CREATED) .build(); + public final static Long CONTAINER_2_ID = 2L; + public final static String CONTAINER_2_HASH = "deadbeef"; + public final static String CONTAINER_2_NAME = "fda-userdb-u02"; + public final static String CONTAINER_2_INTERNALNAME = "dbrepo-userdb-fda-userdb-u02"; + public final static String CONTAINER_2_DATABASE = "univie"; + public final static String CONTAINER_2_IP = "172.28.0.6"; + public final static Instant CONTAINER_2_CREATED = Instant.now().minus(2, HOURS); + public final static Container CONTAINER_2 = Container.builder() .id(CONTAINER_2_ID) .name(CONTAINER_2_NAME) .internalName(CONTAINER_2_INTERNALNAME) .image(IMAGE_1) .hash(CONTAINER_2_HASH) + .ipAddress(CONTAINER_2_IP) .created(CONTAINER_2_CREATED) .build(); + public final static Long CONTAINER_3_ID = 3L; + public final static String CONTAINER_3_HASH = "deadbeef"; + public final static String CONTAINER_3_NAME = "fda-userdb-u03"; + public final static String CONTAINER_3_INTERNALNAME = "dbrepo-userdb-fda-userdb-u03"; + public final static String CONTAINER_3_DATABASE = "u03"; + public final static String CONTAINER_3_IP = "173.38.0.7"; + public final static Instant CONTAINER_3_CREATED = Instant.now().minus(2, HOURS); + public final static Container CONTAINER_3 = Container.builder() .id(CONTAINER_3_ID) .name(CONTAINER_3_NAME) .internalName(CONTAINER_3_INTERNALNAME) .image(IMAGE_1) .hash(CONTAINER_3_HASH) + .ipAddress(CONTAINER_3_IP) .created(CONTAINER_3_CREATED) .build(); diff --git a/fda-container-service/rest-service/src/test/java/at/tuwien/config/DockerUtil.java b/fda-container-service/rest-service/src/test/java/at/tuwien/config/DockerUtil.java index f1d082e9bbd2365bddae2d0d927425cab415e2e8..3d2d8fe81e3b2d188e8709cd38950bb7f70fc6aa 100644 --- a/fda-container-service/rest-service/src/test/java/at/tuwien/config/DockerUtil.java +++ b/fda-container-service/rest-service/src/test/java/at/tuwien/config/DockerUtil.java @@ -2,7 +2,9 @@ package at.tuwien.config; import at.tuwien.entities.container.Container; import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.InspectContainerResponse; +import com.github.dockerjava.api.model.HostConfig; import lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; @@ -13,13 +15,27 @@ import java.util.Objects; @Configuration public class DockerUtil { + private final HostConfig hostConfig; private final DockerClient dockerClient; @Autowired - public DockerUtil(DockerClient dockerClient) { + public DockerUtil(HostConfig hostConfig, DockerClient dockerClient) { + this.hostConfig = hostConfig; this.dockerClient = dockerClient; } + public void createContainer(Container container) { + final CreateContainerResponse create = dockerClient.createContainerCmd(container.getImage().getRepository() + ":" + container.getImage().getTag()) + .withHostConfig(hostConfig.withNetworkMode("fda-userdb")) + .withName(container.getInternalName()) + .withIpv4Address(container.getIpAddress()) + .withHostName(container.getInternalName()) + .withEnv("MARIADB_USER=mariadb", "MARIADB_PASSWORD=mariadb", "MARIADB_ROOT_PASSWORD=mariadb", "MARIADB_DATABASE=weather") + .exec(); + container.setHash(create.getId()); + log.trace("container {} needs to be started", container.getHash()); + } + public void startContainer(Container container) throws InterruptedException { final InspectContainerResponse inspect = dockerClient.inspectContainerCmd(container.getHash()) .exec(); diff --git a/fda-container-service/rest-service/src/test/java/at/tuwien/endpoint/ContainerEndpointUnitTest.java b/fda-container-service/rest-service/src/test/java/at/tuwien/endpoint/ContainerEndpointUnitTest.java deleted file mode 100644 index 8be30d7e90f8f3d8f0dd91e0b39a574996eb8e5e..0000000000000000000000000000000000000000 --- a/fda-container-service/rest-service/src/test/java/at/tuwien/endpoint/ContainerEndpointUnitTest.java +++ /dev/null @@ -1,314 +0,0 @@ -package at.tuwien.endpoint; - -import at.tuwien.BaseUnitTest; -import at.tuwien.api.container.*; -import at.tuwien.auth.PermissionEvaluatorImpl; -import at.tuwien.config.ReadyConfig; -import at.tuwien.endpoints.ContainerEndpoint; -import at.tuwien.exception.*; -import at.tuwien.repository.jpa.ImageRepository; -import at.tuwien.service.impl.ContainerServiceImpl; -import org.apache.http.auth.BasicUserPrincipal; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.security.test.context.support.WithMockUser; -import org.springframework.security.test.context.support.WithUserDetails; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import javax.persistence.Basic; -import java.security.Principal; -import java.util.List; -import java.util.Objects; -import java.util.Optional; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.*; - -@ExtendWith(SpringExtension.class) -@SpringBootTest -public class ContainerEndpointUnitTest extends BaseUnitTest { - - @MockBean - private ReadyConfig readyConfig; - - @MockBean - private ContainerServiceImpl containerService; - - @MockBean - private ImageRepository imageRepository; - - @MockBean - private PermissionEvaluatorImpl permissionEvaluator; - - @Autowired - private ContainerEndpoint containerEndpoint; - - @Test - public void listAllDatabases_succeeds() { - when(containerService.getAll()) - .thenReturn(List.of(CONTAINER_1)); - - final ResponseEntity<List<ContainerBriefDto>> response = containerEndpoint.findAll(null); - - /* test */ - assertEquals(HttpStatus.OK, response.getStatusCode()); - assertEquals(1, Objects.requireNonNull(response.getBody()).size()); - } - - @Test - @WithMockUser(roles = "RESEARCHER") - public void create_succeeds() throws ImageNotFoundException, DockerClientException, UserNotFoundException, ContainerAlreadyExistsException { - final ContainerCreateRequestDto request = ContainerCreateRequestDto.builder() - .name(CONTAINER_1_NAME) - .repository(IMAGE_1.getRepository()) - .tag(IMAGE_1.getTag()) - .build(); - final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); - - /* mock */ - when(containerService.create(request, principal)) - .thenReturn(CONTAINER_1); - - final ResponseEntity<ContainerBriefDto> response = containerEndpoint.create(request, principal); - - /* test */ - assertEquals(HttpStatus.CREATED, response.getStatusCode()); - assertEquals(CONTAINER_1_NAME, Objects.requireNonNull(response.getBody()).getName()); - } - - @Disabled - @Test - public void create_noImage_fails() throws DockerClientException, ImageNotFoundException, UserNotFoundException, ContainerAlreadyExistsException { - final ContainerCreateRequestDto request = ContainerCreateRequestDto.builder() - .name(CONTAINER_1_NAME) - .repository("image") - .tag("notexisting") - .build(); - final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); - - /* mock */ - when(imageRepository.findByRepositoryAndTag(request.getRepository(), request.getTag())) - .thenReturn(Optional.empty()); - - final ResponseEntity<ContainerBriefDto> response = containerEndpoint.create(request, principal); - - /* test */ - assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); - } - - @Disabled - @WithMockUser(username = "not3x1st1ng", roles = {"ROLE_RESEARCHER"}) - @Test - public void create_docker_fails() throws DockerClientException, ImageNotFoundException, UserNotFoundException, ContainerAlreadyExistsException { - final ContainerCreateRequestDto request = ContainerCreateRequestDto.builder() - .name(CONTAINER_1_NAME) - .repository(IMAGE_1.getRepository()) - .tag(IMAGE_1.getTag()) - .build(); - final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); - - /* mock */ - when(imageRepository.findByRepositoryAndTag(request.getRepository(), request.getTag())) - .thenReturn(Optional.of(IMAGE_1)); - - final ResponseEntity<ContainerBriefDto> response = containerEndpoint.create(request, principal); - - /* test */ - assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); - } - - @Test - public void findById_succeeds() throws ContainerNotFoundException, DockerClientException, ContainerNotRunningException { - when(containerService.find(CONTAINER_1_ID)) - .thenReturn(CONTAINER_1); - - /* test */ - final ResponseEntity<ContainerDto> response = containerEndpoint.findById(CONTAINER_1_ID); - assertEquals(HttpStatus.OK, response.getStatusCode()); - } - - @Test - public void findById_notFound_fails() throws ContainerNotFoundException, DockerClientException, ContainerNotRunningException { - doThrow(ContainerNotFoundException.class) - .when(containerService) - .inspect(CONTAINER_1_ID); - - /* test */ - assertThrows(ContainerNotFoundException.class, () -> { - containerEndpoint.findById(CONTAINER_1_ID); - }); - } - - @Test - public void findById_docker_fails() throws ContainerNotFoundException, DockerClientException, ContainerNotRunningException { - doThrow(DockerClientException.class) - .when(containerService) - .inspect(CONTAINER_1_ID); - - /* test */ - assertThrows(DockerClientException.class, () -> { - containerEndpoint.findById(CONTAINER_1_ID); - }); - } - - @Test - public void findById_notRunning_fails() throws ContainerNotFoundException, DockerClientException, ContainerNotRunningException { - doThrow(ContainerNotRunningException.class) - .when(containerService) - .inspect(CONTAINER_1_ID); - - /* test */ - assertThrows(ContainerNotRunningException.class, () -> { - containerEndpoint.findById(CONTAINER_1_ID); - }); - } - - @Test - @WithMockUser(roles = "RESEARCHER") - public void modify_start_succeeds() throws DockerClientException, ContainerNotFoundException { - final ContainerChangeDto request = ContainerChangeDto.builder() - .action(ContainerActionTypeDto.START) - .build(); - when(containerService.start(CONTAINER_1_ID)) - .thenReturn(CONTAINER_1); - - /* test */ - final ResponseEntity<ContainerBriefDto> response = containerEndpoint.modify(CONTAINER_1_ID, request); - assertEquals(HttpStatus.ACCEPTED, response.getStatusCode()); - assertEquals(CONTAINER_1_ID, Objects.requireNonNull(response.getBody()).getId()); - } - - @Test - @WithMockUser(roles = "RESEARCHER") - public void modify_stop_succeeds() throws DockerClientException, ContainerNotFoundException, ContainerStillRunningException { - final ContainerChangeDto request = ContainerChangeDto.builder() - .action(ContainerActionTypeDto.STOP) - .build(); - when(containerService.stop(CONTAINER_1_ID)) - .thenReturn(CONTAINER_1); - - /* test */ - final ResponseEntity<ContainerBriefDto> response = containerEndpoint.modify(CONTAINER_1_ID, request); - assertEquals(HttpStatus.ACCEPTED, response.getStatusCode()); - assertEquals(CONTAINER_1_ID, Objects.requireNonNull(response.getBody()).getId()); - } - - @Test - @WithMockUser(roles = "RESEARCHER") - public void modify_startDocker_fails() throws DockerClientException, ContainerNotFoundException { - final ContainerChangeDto request = ContainerChangeDto.builder() - .action(ContainerActionTypeDto.START) - .build(); - when(containerService.start(CONTAINER_1_ID)) - .thenThrow(DockerClientException.class); - - /* test */ - assertThrows(DockerClientException.class, () -> { - containerEndpoint.modify(CONTAINER_1_ID, request); - }); - } - - @Test - @WithMockUser(roles = "RESEARCHER") - public void modify_stopDocker_fails() throws DockerClientException, ContainerNotFoundException { - final ContainerChangeDto request = ContainerChangeDto.builder() - .action(ContainerActionTypeDto.STOP) - .build(); - when(containerService.stop(CONTAINER_1_ID)) - .thenThrow(DockerClientException.class); - - /* test */ - assertThrows(DockerClientException.class, () -> { - containerEndpoint.modify(CONTAINER_1_ID, request); - }); - } - - @Test - @WithMockUser(roles = "RESEARCHER") - public void modify_stopNoContainer_fails() throws DockerClientException, ContainerNotFoundException { - final ContainerChangeDto request = ContainerChangeDto.builder() - .action(ContainerActionTypeDto.STOP) - .build(); - when(containerService.stop(CONTAINER_1_ID)) - .thenThrow(ContainerNotFoundException.class); - - /* test */ - assertThrows(ContainerNotFoundException.class, () -> { - containerEndpoint.modify(CONTAINER_1_ID, request); - }); - } - - @Test - @WithMockUser(roles = "RESEARCHER") - public void delete_noContainer_fails() throws ContainerStillRunningException, DockerClientException, ContainerNotFoundException { - doThrow(new ContainerNotFoundException("no container")) - .when(containerService) - .remove(CONTAINER_1_ID); - - doReturn(true) - .when(permissionEvaluator) - .hasPermission(any(), eq(CONTAINER_1_ID), eq("DELETE_CONTAINER")); - - /* test */ - assertThrows(ContainerNotFoundException.class, () -> { - containerEndpoint.delete(CONTAINER_1_ID); - }); - } - - @Test - @WithMockUser(roles = "RESEARCHER") - public void delete_success() throws DockerClientException, ContainerStillRunningException, ContainerNotFoundException { - doNothing() - .when(containerService) - .remove(CONTAINER_1_ID); - - doReturn(true) - .when(permissionEvaluator) - .hasPermission(any(), eq(CONTAINER_1_ID), eq("DELETE_CONTAINER")); - - /* test */ - final ResponseEntity<?> response = containerEndpoint.delete(CONTAINER_1_ID); - assertEquals(HttpStatus.OK, response.getStatusCode()); - } - - @Test - @WithMockUser(roles = "RESEARCHER") - public void delete_docker_fails() throws ContainerStillRunningException, DockerClientException, ContainerNotFoundException { - doThrow(new DockerClientException("docker failed")) - .when(containerService) - .remove(CONTAINER_1_ID); - - doReturn(true) - .when(permissionEvaluator) - .hasPermission(any(), eq(CONTAINER_1_ID), eq("DELETE_CONTAINER")); - - /* test */ - assertThrows(DockerClientException.class, () -> { - containerEndpoint.delete(CONTAINER_1_ID); - }); - } - - @Test - @WithMockUser(roles = "RESEARCHER") - public void delete_dockerStillRunning_fails() throws ContainerStillRunningException, DockerClientException, ContainerNotFoundException { - doThrow(new ContainerStillRunningException("container running")) - .when(containerService) - .remove(CONTAINER_1_ID); - - doReturn(true) - .when(permissionEvaluator) - .hasPermission(any(), eq(CONTAINER_1_ID), eq("DELETE_CONTAINER")); - - /* test */ - assertThrows(ContainerStillRunningException.class, () -> { - containerEndpoint.delete(CONTAINER_1_ID); - }); - } -} diff --git a/fda-container-service/rest-service/src/test/java/at/tuwien/endpoint/ImageEndpointUnitTest.java b/fda-container-service/rest-service/src/test/java/at/tuwien/endpoint/ImageEndpointUnitTest.java deleted file mode 100644 index a493798a86c5d0b237ece8732324af3347569b1a..0000000000000000000000000000000000000000 --- a/fda-container-service/rest-service/src/test/java/at/tuwien/endpoint/ImageEndpointUnitTest.java +++ /dev/null @@ -1,214 +0,0 @@ -package at.tuwien.endpoint; - -import at.tuwien.BaseUnitTest; -import at.tuwien.api.container.image.ImageBriefDto; -import at.tuwien.api.container.image.ImageChangeDto; -import at.tuwien.api.container.image.ImageCreateDto; -import at.tuwien.api.container.image.ImageDto; -import at.tuwien.config.ReadyConfig; -import at.tuwien.endpoints.ImageEndpoint; -import at.tuwien.exception.*; -import at.tuwien.service.impl.ImageServiceImpl; -import org.apache.http.auth.BasicUserPrincipal; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.security.test.context.support.WithMockUser; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import java.security.Principal; -import java.util.List; -import java.util.Objects; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.*; - -@ExtendWith(SpringExtension.class) -@SpringBootTest -public class ImageEndpointUnitTest extends BaseUnitTest { - - @MockBean - private ReadyConfig readyConfig; - - @MockBean - private ImageServiceImpl imageService; - - @Autowired - private ImageEndpoint imageEndpoint; - - @Test - public void findAll_succeeds() { - when(imageService.getAll()) - .thenReturn(List.of(IMAGE_1)); - - /* test */ - final ResponseEntity<List<ImageBriefDto>> response = imageEndpoint.findAll(); - assertEquals(HttpStatus.OK, response.getStatusCode()); - assertEquals(1, Objects.requireNonNull(response.getBody()).size()); - } - - @Test - @WithMockUser(roles = "DEVELOPER") - public void create_succeeds() - throws ImageNotFoundException, DockerClientException, ImageAlreadyExistsException, UserNotFoundException { - final ImageCreateDto request = ImageCreateDto.builder() - .repository(IMAGE_1_REPOSITORY) - .tag(IMAGE_1_TAG) - .defaultPort(IMAGE_1_PORT) - .environment(IMAGE_1_ENV_DTO) - .build(); - final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); - - /* mock */ - when(imageService.create(request, principal)) - .thenReturn(IMAGE_1); - - /* test */ - final ResponseEntity<ImageDto> response = imageEndpoint.create(request, principal); - assertEquals(HttpStatus.CREATED, response.getStatusCode()); - assertEquals(IMAGE_1_REPOSITORY, Objects.requireNonNull(response.getBody()).getRepository()); - assertEquals(IMAGE_1_TAG, Objects.requireNonNull(response.getBody()).getTag()); - } - - @Test - @WithMockUser(roles = "DEVELOPER") - public void create_duplicate_fails() - throws ImageNotFoundException, DockerClientException, ImageAlreadyExistsException, UserNotFoundException { - final ImageCreateDto request = ImageCreateDto.builder() - .repository(IMAGE_1_REPOSITORY) - .tag(IMAGE_1_TAG) - .defaultPort(IMAGE_1_PORT) - .environment(IMAGE_1_ENV_DTO) - .build(); - final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); - - /* mock */ - given(imageService.create(request, principal)) - .willAnswer(invocation -> { - throw new ImageAlreadyExistsException("duplicate"); - }); - - /* test */ - assertThrows(ImageAlreadyExistsException.class, () -> { - imageEndpoint.create(request, principal); - }); - } - - @Test - @WithMockUser(roles = "DEVELOPER") - public void create_notExists_fails() - throws ImageNotFoundException, DockerClientException, ImageAlreadyExistsException, UserNotFoundException { - final ImageCreateDto request = ImageCreateDto.builder() - .repository(IMAGE_1_REPOSITORY) - .tag(IMAGE_1_TAG) - .defaultPort(IMAGE_1_PORT) - .environment(IMAGE_1_ENV_DTO) - .build(); - final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); - - /* mock */ - given(imageService.create(request, principal)) - .willAnswer(invocation -> { - throw new ImageNotFoundException("not existing in docker hub"); - }); - - /* test */ - assertThrows(ImageNotFoundException.class, () -> { - imageEndpoint.create(request, principal); - }); - } - - @Test - public void findById_succeeds() throws ImageNotFoundException { - - /* mock */ - when(imageService.find(IMAGE_1_ID)) - .thenReturn(IMAGE_1); - - /* test */ - final ResponseEntity<ImageDto> response = imageEndpoint.findById(IMAGE_1_ID); - assertEquals(HttpStatus.OK, response.getStatusCode()); - } - - @Test - public void findById_notFound_fails() throws ImageNotFoundException { - - /* mock */ - given(imageService.find(IMAGE_1_ID)) - .willAnswer(invocation -> { - throw new ImageNotFoundException("not existing in docker hub"); - }); - - /* test */ - assertThrows(ImageNotFoundException.class, () -> { - imageEndpoint.findById(IMAGE_1_ID); - }); - } - - @Test - @WithMockUser(roles = "DEVELOPER") - public void delete_success() throws ImageNotFoundException, PersistenceException { - - /* mock */ - doNothing() - .when(imageService) - .delete(IMAGE_1_ID); - - /* test */ - final ResponseEntity<?> response = imageEndpoint.delete(IMAGE_1_ID); - assertEquals(HttpStatus.OK, response.getStatusCode()); - } - - @Test - @WithMockUser(roles = "DEVELOPER") - public void delete_fails() throws ImageNotFoundException, PersistenceException { - - /* mock */ - doThrow(new ImageNotFoundException("not found")) - .when(imageService) - .delete(IMAGE_1_ID); - - /* test */ - assertThrows(ImageNotFoundException.class, () -> { - imageEndpoint.delete(IMAGE_1_ID); - }); - } - - @Test - @WithMockUser(roles = "DEVELOPER") - public void update_succeeds() throws ImageNotFoundException, DockerClientException { - final ImageChangeDto request = ImageChangeDto.builder() - .defaultPort(1111) - .build(); - - /* test */ - final ResponseEntity<ImageDto> response = imageEndpoint.update(IMAGE_1_ID, request); - assertEquals(HttpStatus.ACCEPTED, response.getStatusCode()); - } - - @Test - @WithMockUser(roles = "DEVELOPER") - public void update_notFound_fails() throws ImageNotFoundException, DockerClientException { - final ImageChangeDto request = ImageChangeDto.builder() - .defaultPort(1111) - .environment(IMAGE_1_ENV_DTO) - .build(); - - /* mock */ - given(imageService.update(IMAGE_1_ID, request)) - .willAnswer(invocation -> { - throw new ImageNotFoundException("not existing in docker hub"); - }); - - /* test */ - assertThrows(ImageNotFoundException.class, () -> { - imageEndpoint.update(IMAGE_1_ID, request); - }); - } -} diff --git a/fda-container-service/rest-service/src/test/java/at/tuwien/mapper/BaseMappingTest.java b/fda-container-service/rest-service/src/test/java/at/tuwien/mapper/BaseMappingTest.java deleted file mode 100644 index 0ed93482e34f9262300863a8f9a08e5949ced292..0000000000000000000000000000000000000000 --- a/fda-container-service/rest-service/src/test/java/at/tuwien/mapper/BaseMappingTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package at.tuwien.mapper; - -import com.github.dockerjava.api.command.InspectContainerResponse; -import com.github.dockerjava.api.model.ContainerNetwork; -import com.github.dockerjava.api.model.NetworkSettings; -import lombok.SneakyThrows; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.test.context.TestPropertySource; - -import java.lang.reflect.Field; -import java.util.Map; - -@TestPropertySource(locations = "classpath:application.properties") -public abstract class BaseMappingTest { - - @Configuration - @ComponentScan(basePackages = {"at.tuwien"}) - public static class BaseMappingContext { - } - - final String CONTAINER_ID = "deadbeef"; - final String CONTAINER_NETWORK_IP = "154.234.88.15"; - - @SneakyThrows - final InspectContainerResponse mockInspectResponse() { - final InspectContainerResponse responseC = new InspectContainerResponse(); - final Object response = responseC.getClass().getConstructor().newInstance(); - final Field idField = responseC.getClass().getDeclaredField("id"); - idField.setAccessible(true); - idField.set(response, CONTAINER_ID); - final Field networkSettingsField = responseC.getClass().getDeclaredField("networkSettings"); - networkSettingsField.setAccessible(true); - - // define the network and address - final ContainerNetwork networkC = new ContainerNetwork(); - final Object network = networkC.getClass().getConstructor().newInstance(); - final Field ipField = networkC.getClass().getDeclaredField("ipAddress"); - ipField.setAccessible(true); - ipField.set(network, CONTAINER_NETWORK_IP); - final Map<String, ContainerNetwork> map = Map.of("fda-userdb", (ContainerNetwork) network); - - // add to network settings - final NetworkSettings settingsC = new NetworkSettings(); - final Object settings = settingsC.getClass().getConstructor().newInstance(); - final Field networksField = settingsC.getClass().getDeclaredField("networks"); - networksField.setAccessible(true); - networksField.set(settings, map); - networkSettingsField.set(response, settings); - - return (InspectContainerResponse) response; - } - -} diff --git a/fda-container-service/rest-service/src/test/java/at/tuwien/mapper/ContainerMappingTest.java b/fda-container-service/rest-service/src/test/java/at/tuwien/mapper/ContainerMappingTest.java deleted file mode 100644 index bca70d34b278b97ec933f1a5eaa5e225ed307995..0000000000000000000000000000000000000000 --- a/fda-container-service/rest-service/src/test/java/at/tuwien/mapper/ContainerMappingTest.java +++ /dev/null @@ -1,35 +0,0 @@ -package at.tuwien.mapper; - -import at.tuwien.config.ReadyConfig; -import com.github.dockerjava.api.command.InspectContainerResponse; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.test.context.junit.jupiter.SpringExtension; - - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; - -@ExtendWith(SpringExtension.class) -@SpringBootTest -public class ContainerMappingTest extends BaseMappingTest { - - @MockBean - private ReadyConfig readyConfig; - - @Test - public void inspectContainerResponseToDatabaseContainerMappingTest_succeeds() { - final InspectContainerResponse response = mockInspectResponse(); - - assertNotNull(response, "response must not be null"); - assertEquals(CONTAINER_ID, response.getId()); - assertNotNull(response.getNetworkSettings(), "networkSettings must not be null"); - assertNotNull(response.getNetworkSettings().getNetworks(), "networkSettings.networks must not be null"); - assertNotNull(response.getNetworkSettings().getNetworks().get("fda-userdb"), "networkSettings.networks['fda-userdb'] must not be null"); - assertNotNull(response.getNetworkSettings().getNetworks().get("fda-userdb").getIpAddress(), "networkSettings.networks['fda-userdb'].ipAddress must not be null"); - assertEquals(CONTAINER_NETWORK_IP, response.getNetworkSettings().getNetworks().get("fda-userdb").getIpAddress()); - } - -} diff --git a/fda-container-service/rest-service/src/test/java/at/tuwien/service/ContainerServiceIntegrationTest.java b/fda-container-service/rest-service/src/test/java/at/tuwien/service/ContainerServiceIntegrationTest.java index 7dea52ef1dd0d9ef701dba5f8bf800a924b85f52..ca676c7f5a34b135a408b2bbb040c176024c29e8 100644 --- a/fda-container-service/rest-service/src/test/java/at/tuwien/service/ContainerServiceIntegrationTest.java +++ b/fda-container-service/rest-service/src/test/java/at/tuwien/service/ContainerServiceIntegrationTest.java @@ -5,19 +5,19 @@ import at.tuwien.api.container.ContainerCreateRequestDto; import at.tuwien.config.DockerUtil; import at.tuwien.config.ReadyConfig; import at.tuwien.entities.container.Container; -import at.tuwien.entities.container.image.ContainerImage; import at.tuwien.exception.*; +import at.tuwien.repository.jpa.ContainerImageEnvironmentItemRepository; import at.tuwien.repository.jpa.ContainerRepository; import at.tuwien.repository.jpa.ImageRepository; import at.tuwien.repository.jpa.UserRepository; -import at.tuwien.service.impl.ContainerServiceImpl; import com.github.dockerjava.api.DockerClient; -import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.exception.NotModifiedException; -import com.github.dockerjava.api.model.*; +import com.github.dockerjava.api.model.Network; import lombok.extern.log4j.Log4j2; import org.apache.http.auth.BasicUserPrincipal; -import org.junit.jupiter.api.*; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @@ -25,48 +25,45 @@ import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit.jupiter.SpringExtension; -import org.springframework.transaction.annotation.Transactional; - import java.security.Principal; import java.util.List; +import java.util.Optional; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; @Log4j2 @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) -@ExtendWith(SpringExtension.class) @SpringBootTest +@ExtendWith(SpringExtension.class) public class ContainerServiceIntegrationTest extends BaseUnitTest { @MockBean private ReadyConfig readyConfig; @MockBean - private UserService userService; - - @Autowired - private UserRepository userRepository; + private ContainerRepository containerRepository; @Autowired - private ContainerServiceImpl containerService; + private ImageRepository imageRepository; @Autowired - private HostConfig hostConfig; + private ContainerImageEnvironmentItemRepository containerImageEnvironmentItemRepository; @Autowired private DockerClient dockerClient; @Autowired - private ImageRepository imageRepository; + private ContainerService containerService; @Autowired - private ContainerRepository containerRepository; + private DockerUtil dockerUtil; @Autowired - private DockerUtil dockerUtil; + private UserRepository userRepository; - @Transactional @BeforeEach public void beforeEach() { afterEach(); @@ -86,41 +83,14 @@ public class ContainerServiceIntegrationTest extends BaseUnitTest { .withEnableIpv6(false) .exec(); - /* create weather container */ - final CreateContainerResponse request = dockerClient.createContainerCmd(IMAGE_1_REPOSITORY + ":" + IMAGE_1_TAG) - .withHostConfig(hostConfig.withNetworkMode("fda-userdb")) - .withName(CONTAINER_1_INTERNALNAME) - .withIpv4Address(CONTAINER_1_IP) - .withHostName(CONTAINER_1_INTERNALNAME) - .withEnv("MARIADB_USER=mariadb", "MARIADB_PASSWORD=mariadb", "MARIADB_ROOT_PASSWORD=mariadb", "MARIADB_DATABASE=weather") - .exec(); - - /* set hash */ - CONTAINER_1.setHash(request.getId()); - /* mock data */ - log.debug("save image {}", ContainerImage.builder() - .id(IMAGE_1_ID) - .repository(IMAGE_1_REPOSITORY) - .tag(IMAGE_1_TAG) - .hash(IMAGE_1_HASH) - .jdbcMethod(IMAGE_1_JDBC) - .dialect(IMAGE_1_DIALECT) - .driverClass(IMAGE_1_DRIVER) - .containers(List.of()) - .compiled(IMAGE_1_BUILT) - .size(IMAGE_1_SIZE) - .environment(IMAGE_1_ENV) - .defaultPort(IMAGE_1_PORT) - .build()); + userRepository.save(USER_1); imageRepository.save(IMAGE_1); - log.debug("save container {}", CONTAINER_1); - containerRepository.save(CONTAINER_1); - log.debug("save container {}", CONTAINER_2); - containerRepository.save(CONTAINER_2); + containerImageEnvironmentItemRepository.saveAll(IMAGE_1_ENV); + IMAGE_1.setEnvironment(IMAGE_1_ENV); + containerImageEnvironmentItemRepository.saveAll(IMAGE_1_ENV); } - @Transactional @AfterEach public void afterEach() { /* stop containers and remove them */ @@ -160,7 +130,10 @@ public class ContainerServiceIntegrationTest extends BaseUnitTest { final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); /* mock */ - userRepository.save(USER_1); + when(containerRepository.findByInternalName(CONTAINER_1_INTERNALNAME)) + .thenReturn(Optional.empty()); + when(containerRepository.save(any(Container.class))) + .thenReturn(CONTAINER_1); /* test */ final Container container = containerService.create(request, principal); @@ -169,45 +142,7 @@ public class ContainerServiceIntegrationTest extends BaseUnitTest { } @Test - public void create_multiple_succeeds() - throws DockerClientException, ImageNotFoundException, ContainerAlreadyExistsException, - UserNotFoundException { - final ContainerCreateRequestDto request1 = ContainerCreateRequestDto.builder() - .repository(IMAGE_1_REPOSITORY) - .tag(IMAGE_1_TAG) - .name(CONTAINER_1_NAME) - .build(); - final ContainerCreateRequestDto request2 = ContainerCreateRequestDto.builder() - .repository(IMAGE_1_REPOSITORY) - .tag(IMAGE_1_TAG) - .name(CONTAINER_2_NAME) - .build(); - final ContainerCreateRequestDto request3 = ContainerCreateRequestDto.builder() - .repository(IMAGE_1_REPOSITORY) - .tag(IMAGE_1_TAG) - .name(CONTAINER_3_NAME) - .build(); - final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); - - /* mock */ - userRepository.save(USER_1); - - /* test */ - final Container container1 = containerService.create(request1, principal); - assertEquals(CONTAINER_1_NAME, container1.getName()); - assertEquals(1, userRepository.findAll().size()); - final Container container2 = containerService.create(request2, principal); - assertEquals(CONTAINER_2_NAME, container2.getName()); - assertEquals(1, userRepository.findAll().size()); - final Container container3 = containerService.create(request3, principal); - assertEquals(CONTAINER_3_NAME, container3.getName()); - assertEquals(1, userRepository.findAll().size()); - } - - @Test - public void create_conflictingNames_fails() - throws DockerClientException, ImageNotFoundException, ContainerAlreadyExistsException, - UserNotFoundException { + public void create_conflictingNames_fails() { final ContainerCreateRequestDto request = ContainerCreateRequestDto.builder() .repository(IMAGE_1_REPOSITORY) .tag(IMAGE_1_TAG) @@ -216,8 +151,8 @@ public class ContainerServiceIntegrationTest extends BaseUnitTest { final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); /* mock */ - userRepository.save(USER_1); - containerService.create(request, principal); + when(containerRepository.findByInternalName(CONTAINER_1_INTERNALNAME)) + .thenReturn(Optional.of(CONTAINER_1)); /* test */ assertThrows(ContainerAlreadyExistsException.class, () -> { @@ -226,38 +161,15 @@ public class ContainerServiceIntegrationTest extends BaseUnitTest { } @Test - public void remove_hashNotFound_fails() { - final Container CONTAINER = Container.builder() - .id(CONTAINER_3_ID) - .name(CONTAINER_3_NAME) - .internalName(CONTAINER_3_INTERNALNAME) - .image(IMAGE_1) - .hash("deadbeef") - .created(CONTAINER_3_CREATED) - .build(); - - /* mock */ - final Container container = containerRepository.save(CONTAINER); - log.debug("inserted container with id {}", container.getId()); - - /* test */ - assertThrows(DockerClientException.class, () -> { - containerService.remove(CONTAINER_3_ID); - }); - } - - @Test - public void remove_alreadyRemoved_fails() throws DockerClientException, ContainerStillRunningException, - ContainerNotFoundException { + public void remove_alreadyRemoved_fails() { /* mock */ - containerService.remove(CONTAINER_1_ID); - final Container container = containerRepository.save(CONTAINER_1); - log.debug("re-inserting container with id {}", container.getId()); + when(containerRepository.findById(CONTAINER_1_ID)) + .thenReturn(Optional.empty()); /* test */ - assertThrows(DockerClientException.class, () -> { - containerService.remove(container.getId()); + assertThrows(ContainerNotFoundException.class, () -> { + containerService.remove(CONTAINER_1_ID); }); } @@ -270,6 +182,8 @@ public class ContainerServiceIntegrationTest extends BaseUnitTest { .build(); final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); + /* mock */ + /* test */ assertThrows(ImageNotFoundException.class, () -> { containerService.create(request, principal); @@ -280,9 +194,11 @@ public class ContainerServiceIntegrationTest extends BaseUnitTest { @Test public void findById_notFound_fails() { + /* mock */ + /* test */ assertThrows(ContainerNotFoundException.class, () -> { - containerService.find(CONTAINER_3_ID); + containerService.find(CONTAINER_1_ID); }); } @@ -290,7 +206,9 @@ public class ContainerServiceIntegrationTest extends BaseUnitTest { public void change_start_succeeds() throws DockerClientException, ContainerNotFoundException { /* mock */ - dockerUtil.stopContainer(CONTAINER_1); + when(containerRepository.findById(CONTAINER_1_ID)) + .thenReturn(Optional.of(CONTAINER_1)); + dockerUtil.createContainer(CONTAINER_1); /* test */ containerService.start(CONTAINER_1_ID); @@ -300,6 +218,9 @@ public class ContainerServiceIntegrationTest extends BaseUnitTest { public void change_stop_succeeds() throws DockerClientException, InterruptedException, ContainerNotFoundException { /* mock */ + when(containerRepository.findById(CONTAINER_1_ID)) + .thenReturn(Optional.of(CONTAINER_1)); + dockerUtil.createContainer(CONTAINER_1); dockerUtil.startContainer(CONTAINER_1); /* test */ @@ -307,17 +228,38 @@ public class ContainerServiceIntegrationTest extends BaseUnitTest { } @Test - public void change_stop_notFoundDocker_fails() { + public void change_startSavedButNotFound_fails() { + + /* mock */ + when(containerRepository.findById(CONTAINER_1_ID)) + .thenReturn(Optional.of(CONTAINER_1)); + + /* test */ + assertThrows(DockerClientException.class, () -> { + containerService.start(CONTAINER_1_ID); + }); + } + + @Test + public void change_removeSavedButNotFound_fails() { + + /* mock */ + when(containerRepository.findById(CONTAINER_1_ID)) + .thenReturn(Optional.of(CONTAINER_1)); /* test */ assertThrows(DockerClientException.class, () -> { - containerService.stop(CONTAINER_2_ID); + containerService.remove(CONTAINER_1_ID); }); } @Test public void getAll_succeeds() { + /* mock */ + when(containerRepository.findAll()) + .thenReturn(List.of(CONTAINER_1, CONTAINER_2)); + /* test */ final List<Container> response = containerService.getAll(); assertEquals(2, response.size()); @@ -327,6 +269,9 @@ public class ContainerServiceIntegrationTest extends BaseUnitTest { public void remove_succeeds() throws DockerClientException, ContainerStillRunningException, ContainerNotFoundException { /* mock */ + when(containerRepository.findById(CONTAINER_1_ID)) + .thenReturn(Optional.of(CONTAINER_1)); + dockerUtil.createContainer(CONTAINER_1); dockerUtil.stopContainer(CONTAINER_1); /* test */ @@ -338,7 +283,7 @@ public class ContainerServiceIntegrationTest extends BaseUnitTest { /* test */ assertThrows(ContainerNotFoundException.class, () -> { - containerService.remove(9999999L); + containerService.remove(CONTAINER_1_ID); }); } @@ -346,6 +291,9 @@ public class ContainerServiceIntegrationTest extends BaseUnitTest { public void remove_stillRunning_fails() throws InterruptedException { /* mock */ + when(containerRepository.findById(CONTAINER_1_ID)) + .thenReturn(Optional.of(CONTAINER_1)); + dockerUtil.createContainer(CONTAINER_1); dockerUtil.startContainer(CONTAINER_1); /* test */ @@ -358,6 +306,9 @@ public class ContainerServiceIntegrationTest extends BaseUnitTest { public void change_alreadyRunning_fails() throws InterruptedException { /* mock */ + when(containerRepository.findById(CONTAINER_1_ID)) + .thenReturn(Optional.of(CONTAINER_1)); + dockerUtil.createContainer(CONTAINER_1); dockerUtil.startContainer(CONTAINER_1); /* test */ @@ -370,18 +321,24 @@ public class ContainerServiceIntegrationTest extends BaseUnitTest { public void change_startNotFound_fails() { /* mock */ - containerRepository.save(CONTAINER_3); + when(containerRepository.findById(CONTAINER_1_ID)) + .thenReturn(Optional.empty()); + dockerUtil.createContainer(CONTAINER_1); /* test */ - assertThrows(DockerClientException.class, () -> { - containerService.start(CONTAINER_3_ID); + assertThrows(ContainerNotFoundException.class, () -> { + containerService.start(CONTAINER_1_ID); }); } @Test - public void change_alreadyStopped_fails() { + public void change_alreadyStopped_fails() throws InterruptedException { /* mock */ + when(containerRepository.findById(CONTAINER_1_ID)) + .thenReturn(Optional.of(CONTAINER_1)); + dockerUtil.createContainer(CONTAINER_1); + dockerUtil.startContainer(CONTAINER_1); dockerUtil.stopContainer(CONTAINER_1); /* test */ @@ -391,10 +348,25 @@ public class ContainerServiceIntegrationTest extends BaseUnitTest { } @Test - public void change_stoppedNotFound_fails() { + public void change_stopNeverStarted_fails() { /* mock */ - dockerUtil.stopContainer(CONTAINER_1); + when(containerRepository.findById(CONTAINER_1_ID)) + .thenReturn(Optional.of(CONTAINER_1)); + dockerUtil.createContainer(CONTAINER_1); + + /* test */ + assertThrows(DockerClientException.class, () -> { + containerService.stop(CONTAINER_1_ID); + }); + } + + @Test + public void change_stopSavedButNotFound_fails() { + + /* mock */ + when(containerRepository.findById(CONTAINER_1_ID)) + .thenReturn(Optional.of(CONTAINER_1)); /* test */ assertThrows(DockerClientException.class, () -> { @@ -407,6 +379,9 @@ public class ContainerServiceIntegrationTest extends BaseUnitTest { ContainerNotRunningException { /* mock */ + when(containerRepository.findById(CONTAINER_1_ID)) + .thenReturn(Optional.of(CONTAINER_1)); + dockerUtil.createContainer(CONTAINER_1); dockerUtil.startContainer(CONTAINER_1); /* test */ @@ -420,8 +395,10 @@ public class ContainerServiceIntegrationTest extends BaseUnitTest { @Test public void inspect_notFound_fails() { + /* mock */ + /* test */ - assertThrows(DockerClientException.class, () -> { + assertThrows(ContainerNotFoundException.class, () -> { containerService.inspect(CONTAINER_2_ID); }); } @@ -430,7 +407,9 @@ public class ContainerServiceIntegrationTest extends BaseUnitTest { public void inspect_notRunning_fails() { /* mock */ - dockerUtil.stopContainer(CONTAINER_1); + when(containerRepository.findById(CONTAINER_1_ID)) + .thenReturn(Optional.of(CONTAINER_1)); + dockerUtil.createContainer(CONTAINER_1); /* test */ assertThrows(ContainerNotRunningException.class, () -> { diff --git a/fda-container-service/rest-service/src/test/java/at/tuwien/service/ImageServiceIntegrationTest.java b/fda-container-service/rest-service/src/test/java/at/tuwien/service/ImageServiceIntegrationTest.java index 6d11f4dbdc131d3d9b971fc2ed83f12325c8eeaa..0eb9ba72ef782b73621335b18481c24acba61e16 100644 --- a/fda-container-service/rest-service/src/test/java/at/tuwien/service/ImageServiceIntegrationTest.java +++ b/fda-container-service/rest-service/src/test/java/at/tuwien/service/ImageServiceIntegrationTest.java @@ -4,8 +4,10 @@ import at.tuwien.BaseUnitTest; import at.tuwien.api.container.image.ImageCreateDto; import at.tuwien.config.ReadyConfig; import at.tuwien.exception.*; +import at.tuwien.repository.jpa.ContainerImageEnvironmentItemRepository; import at.tuwien.repository.jpa.ContainerRepository; import at.tuwien.repository.jpa.ImageRepository; +import at.tuwien.repository.jpa.UserRepository; import at.tuwien.service.impl.ImageServiceImpl; import lombok.extern.log4j.Log4j2; import org.apache.http.auth.BasicUserPrincipal; @@ -38,14 +40,22 @@ public class ImageServiceIntegrationTest extends BaseUnitTest { @Autowired private ImageRepository imageRepository; + @Autowired + private UserRepository userRepository; + + @Autowired + private ContainerImageEnvironmentItemRepository containerImageEnvironmentItemRepository; + @Autowired private ContainerRepository containerRepository; - @Transactional @BeforeEach public void beforeEach() { - log.debug("save container {}", CONTAINER_1); - containerRepository.save(CONTAINER_1); + userRepository.save(USER_1); + imageRepository.save(IMAGE_1); + containerImageEnvironmentItemRepository.saveAll(IMAGE_1_ENV); + IMAGE_1.setEnvironment(IMAGE_1_ENV); + containerImageEnvironmentItemRepository.saveAll(IMAGE_1_ENV); } @Test diff --git a/fda-container-service/rest-service/src/test/resources/application.properties b/fda-container-service/rest-service/src/test/resources/application.properties index 88c58a85e34098a6ef1eddde183d20544dc6fb1c..9e91f5d06816149f227fac67a310e4074f67c564 100644 --- a/fda-container-service/rest-service/src/test/resources/application.properties +++ b/fda-container-service/rest-service/src/test/resources/application.properties @@ -15,4 +15,7 @@ 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 +spring.jpa.show-sql=false + +# additional logging +logging.level.org.hibernate.SQL=DEBUG \ No newline at end of file diff --git a/fda-container-service/services/src/main/java/at/tuwien/repository/jpa/ContainerImageEnvironmentItemRepository.java b/fda-container-service/services/src/main/java/at/tuwien/repository/jpa/ContainerImageEnvironmentItemRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..aa1504a292588a11911b831d415bf1f864d9246d --- /dev/null +++ b/fda-container-service/services/src/main/java/at/tuwien/repository/jpa/ContainerImageEnvironmentItemRepository.java @@ -0,0 +1,10 @@ +package at.tuwien.repository.jpa; + +import at.tuwien.entities.container.image.ContainerImageEnvironmentItem; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ContainerImageEnvironmentItemRepository extends JpaRepository<ContainerImageEnvironmentItem, Long> { + +} diff --git a/fda-container-service/services/src/main/java/at/tuwien/repository/jpa/ContainerRepository.java b/fda-container-service/services/src/main/java/at/tuwien/repository/jpa/ContainerRepository.java index 6df0ccdf73fd0ad1f7d8af2a5c58acff79d2fee5..37b8abb7735952160ae69ddb85c748441050a575 100644 --- a/fda-container-service/services/src/main/java/at/tuwien/repository/jpa/ContainerRepository.java +++ b/fda-container-service/services/src/main/java/at/tuwien/repository/jpa/ContainerRepository.java @@ -4,9 +4,13 @@ import at.tuwien.entities.container.Container; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.Optional; + @Repository public interface ContainerRepository extends JpaRepository<Container, Long> { - Container findByHash(String id); + Optional<Container> findByHash(String hash); + + Optional<Container> findByInternalName(String internalName); } diff --git a/fda-container-service/services/src/main/java/at/tuwien/service/impl/ContainerServiceImpl.java b/fda-container-service/services/src/main/java/at/tuwien/service/impl/ContainerServiceImpl.java index 781da0442724a7de1034711315fd0804c4cf0dae..c5cbc523a9a0b671ce526efb025264f31ace729d 100644 --- a/fda-container-service/services/src/main/java/at/tuwien/service/impl/ContainerServiceImpl.java +++ b/fda-container-service/services/src/main/java/at/tuwien/service/impl/ContainerServiceImpl.java @@ -68,13 +68,19 @@ public class ContainerServiceImpl implements ContainerService { log.error("failed to get image with name {}:{}", createDto.getRepository(), createDto.getTag()); throw new ImageNotFoundException("image was not found in metadata database."); } - /* save to metadata database */ + /* entity */ final Integer availableTcpPort = SocketUtils.findAvailableTcpPort(10000); Container container = new Container(); container.setImage(image.get()); container.setPort(availableTcpPort); container.setName(createDto.getName()); container.setInternalName(containerMapper.containerToInternalContainerName(container)); + /* check duplicate */ + final Optional<Container> optional = containerRepository.findByInternalName(container.getInternalName()); + if (optional.isPresent()) { + log.error("Failed to create container with internal name {}", container.getInternalName()); + throw new ContainerAlreadyExistsException("Container name already exists"); + } /* create the volume */ final CreateVolumeResponse response = dockerClient.createVolumeCmd() .withName(container.getInternalName()) diff --git a/fda-database-service/rest-service/src/test/java/at/tuwien/service/AmqpServiceIntegrationTest.java b/fda-database-service/rest-service/src/test/java/at/tuwien/service/AmqpServiceIntegrationTest.java index f67533167f75aebce7f051e46de7407a1c78a967..4997244bf2aeb9735a0cbbbe035185b71016302e 100644 --- a/fda-database-service/rest-service/src/test/java/at/tuwien/service/AmqpServiceIntegrationTest.java +++ b/fda-database-service/rest-service/src/test/java/at/tuwien/service/AmqpServiceIntegrationTest.java @@ -1,6 +1,7 @@ package at.tuwien.service; import at.tuwien.BaseUnitTest; +import at.tuwien.config.IndexInitializer; import at.tuwien.config.ReadyConfig; import at.tuwien.exception.AmqpException; import at.tuwien.exception.BrokerVirtualHostCreationException; @@ -22,6 +23,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Profile; +import org.springframework.data.elasticsearch.core.ElasticsearchOperations; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.junit.jupiter.SpringExtension; @@ -35,14 +37,14 @@ import static at.tuwien.config.DockerConfig.hostConfig; @Log4j2 @SpringBootTest @ExtendWith(SpringExtension.class) -@ActiveProfiles("test-noelastic") public class AmqpServiceIntegrationTest extends BaseUnitTest { - private static final String AMQP_EXCHANGE = "fda"; - @MockBean private ReadyConfig readyConfig; + @MockBean + private IndexInitializer indexInitializer; + @Autowired private Channel channel; @@ -118,7 +120,7 @@ public class AmqpServiceIntegrationTest extends BaseUnitTest { } @Test - public void createExchange_succeeds() throws AmqpException, IOException, BrokerVirtualHostCreationException { + public void createExchange_succeeds() throws AmqpException, IOException { final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); /* mock */ diff --git a/fda-database-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java b/fda-database-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java index fb0c55c42be8ec859f0176891d146fde7f947877..e52d86c4db5beac6907ae014395b9b14197abf3c 100644 --- a/fda-database-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java +++ b/fda-database-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java @@ -3,6 +3,7 @@ package at.tuwien.service; import at.tuwien.BaseUnitTest; import at.tuwien.api.database.DatabaseCreateDto; import at.tuwien.config.DockerConfig; +import at.tuwien.config.IndexInitializer; import at.tuwien.config.ReadyConfig; import at.tuwien.entities.container.Container; import at.tuwien.entities.database.Database; @@ -45,6 +46,9 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest { @MockBean private ReadyConfig readyConfig; + @MockBean + private IndexInitializer indexInitializer; + @MockBean private Channel channel; diff --git a/fda-database-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java b/fda-database-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java index eba11700e14884b430a014642f1c1d1ce4eb6eef..32f3229c2242120b37871ae286b5a1aa5146c1d4 100644 --- a/fda-database-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java +++ b/fda-database-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java @@ -2,6 +2,7 @@ package at.tuwien.service; import at.tuwien.BaseUnitTest; import at.tuwien.api.database.DatabaseCreateDto; +import at.tuwien.config.IndexInitializer; import at.tuwien.config.ReadyConfig; import at.tuwien.entities.container.Container; import at.tuwien.entities.database.Database; @@ -39,12 +40,14 @@ import static org.mockito.Mockito.*; @Log4j2 @SpringBootTest @ExtendWith(SpringExtension.class) -@ActiveProfiles("test-noelastic") public class DatabaseServiceUnitTest extends BaseUnitTest { @MockBean private ReadyConfig readyConfig; + @MockBean + private IndexInitializer indexInitializer; + @MockBean private Channel channel; diff --git a/fda-database-service/rest-service/src/test/resources/application.properties b/fda-database-service/rest-service/src/test/resources/application.properties index 727187fbfe6b863eb9dfc2acfc908e55b80d33b5..2040f94bc4b7e511582fe2d0be97a4ef5c0e1af4 100644 --- a/fda-database-service/rest-service/src/test/resources/application.properties +++ b/fda-database-service/rest-service/src/test/resources/application.properties @@ -17,7 +17,4 @@ spring.jpa.database-platform=org.hibernate.dialect.H2Dialect spring.jpa.hibernate.ddl-auto=create-drop spring.jpa.show-sql=false -# disable elasticsearch -spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchRestClientAutoConfiguration - spring.rabbitmq.host=broker-service \ No newline at end of file diff --git a/fda-database-service/services/src/main/java/at/tuwien/config/IndexInitializer.java b/fda-database-service/services/src/main/java/at/tuwien/config/IndexInitializer.java index 5c6544af42f09c3f6809edaeefd9d6b02f2fd91e..de9c6663d06bdf7ccfbae7fc8b594d31a924503e 100644 --- a/fda-database-service/services/src/main/java/at/tuwien/config/IndexInitializer.java +++ b/fda-database-service/services/src/main/java/at/tuwien/config/IndexInitializer.java @@ -4,8 +4,6 @@ import at.tuwien.entities.database.Database; import lombok.extern.log4j.Log4j2; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.event.EventListener; -import org.springframework.core.env.Environment; -import org.springframework.core.env.Profiles; import org.springframework.data.elasticsearch.core.ElasticsearchOperations; import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates; import org.springframework.stereotype.Component; @@ -14,19 +12,14 @@ import org.springframework.stereotype.Component; @Log4j2 public class IndexInitializer { - private final Environment environment; private final ElasticsearchOperations elasticsearchOperations; - public IndexInitializer(Environment environment, ElasticsearchOperations elasticsearchOperations) { - this.environment = environment; + public IndexInitializer(ElasticsearchOperations elasticsearchOperations) { this.elasticsearchOperations = elasticsearchOperations; } @EventListener(ApplicationReadyEvent.class) public void initIndex() { - if (environment.acceptsProfiles(Profiles.of("test-noelastic"))) { - return; - } log.debug("creating index"); IndexCoordinates indexCoordinates = IndexCoordinates.of("databaseindex"); if (!elasticsearchOperations.indexOps(indexCoordinates).exists()) { diff --git a/fda-identifier-service/rest-service/src/test/java/at/tuwien/service/IdentifierServiceIntegrationTest.java b/fda-identifier-service/rest-service/src/test/java/at/tuwien/service/IdentifierServiceIntegrationTest.java index 3ce48e11a5e94b3ed2d37f62965e42d26097116d..49818d1e618c88587a8628561810c3c3df84985c 100644 --- a/fda-identifier-service/rest-service/src/test/java/at/tuwien/service/IdentifierServiceIntegrationTest.java +++ b/fda-identifier-service/rest-service/src/test/java/at/tuwien/service/IdentifierServiceIntegrationTest.java @@ -235,6 +235,7 @@ public class IdentifierServiceIntegrationTest extends BaseUnitTest { } @Test + @Transactional(readOnly = true) public void update_succeeds() throws IdentifierNotFoundException { /* test */ diff --git a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/container/image/ContainerImageDate.java b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/container/image/ContainerImageDate.java index 48a8d47a4b3e23756fdf49ae3160bc0b45d16aba..35f755a7147f5e606f4dded54a78499f3ad87ced 100644 --- a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/container/image/ContainerImageDate.java +++ b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/container/image/ContainerImageDate.java @@ -36,7 +36,7 @@ public class ContainerImageDate { @org.springframework.data.annotation.Transient @ToString.Exclude - @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE) + @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.DETACH) @JoinColumn(name = "iid", insertable = false, updatable = false) private ContainerImage image; diff --git a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/container/image/ContainerImageEnvironmentItem.java b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/container/image/ContainerImageEnvironmentItem.java index 809766022d7485645550d56a4582595fcd9a03cf..208c2143cdbe26817ef19ee812eca4ba62c49406 100644 --- a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/container/image/ContainerImageEnvironmentItem.java +++ b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/container/image/ContainerImageEnvironmentItem.java @@ -46,6 +46,13 @@ public class ContainerImageEnvironmentItem { @Enumerated(EnumType.STRING) private ContainerImageEnvironmentItemType type; + @org.springframework.data.annotation.Transient + @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) + @JoinColumns({ + @JoinColumn(name = "iid", referencedColumnName = "id", insertable = false, updatable = false) + }) + private ContainerImage image; + @Column(nullable = false, updatable = false) @CreatedDate private Instant created; diff --git a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/View.java b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/View.java index 14466a12bd8d992f339a6367f96455fd5a67cae8..056311dedf7ae868176ea99e6d2613cbddd3d8b5 100644 --- a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/View.java +++ b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/View.java @@ -46,7 +46,7 @@ public class View { private User creator; @org.springframework.data.annotation.Transient - @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE) + @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.DETACH) @JoinColumn(name = "vdbid", insertable = false, updatable = false) private Database database; diff --git a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/table/Table.java b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/table/Table.java index c19555325c5f5baa2564deb10b048aba0f33b9d7..3dd66a573cb2f4b4b21acd21d868038e5b7ee07f 100644 --- a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/table/Table.java +++ b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/table/Table.java @@ -63,11 +63,11 @@ public class Table { @org.springframework.data.annotation.Transient @ToString.Exclude - @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE) + @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.DETACH) @JoinColumn(name = "tdbid", insertable = false, updatable = false) private Database database; - @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.MERGE, mappedBy = "table") + @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.DETACH, mappedBy = "table") @OrderBy("ordinalPosition") private List<TableColumn> columns; diff --git a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java index 18412a2792a1f9f9a37c560a77fc00015de5b437..8ea2472b4bf0c5cd82bcdd21d4129515a38a1d8c 100644 --- a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java +++ b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java @@ -52,13 +52,13 @@ public class TableColumn implements Comparable<TableColumn> { private Long dfid; @ToString.Exclude - @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE) + @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.DETACH) @JoinColumn(name = "dfid", referencedColumnName = "id", insertable = false, updatable = false) private ContainerImageDate dateFormat; @org.springframework.data.annotation.Transient @ToString.Exclude - @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE) + @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.DETACH) @JoinColumns({ @JoinColumn(name = "tid", referencedColumnName = "id", insertable = false, updatable = false), @JoinColumn(name = "cdbid", referencedColumnName = "tdbid", insertable = false, updatable = false) @@ -117,7 +117,7 @@ public class TableColumn implements Comparable<TableColumn> { @CreatedDate private Instant created; - @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE) + @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.DETACH) @JoinTable(name = "mdb_columns_concepts", joinColumns = { @JoinColumn(name = "cid", referencedColumnName = "id", insertable = false, updatable = false), diff --git a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/table/columns/concepts/Concept.java b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/table/columns/concepts/Concept.java index 733b2c6b146340798d87381f979cc8e433c715b5..01f0334edc5de67f4a7bef976a5a44a2add1a330 100644 --- a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/table/columns/concepts/Concept.java +++ b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/database/table/columns/concepts/Concept.java @@ -29,7 +29,7 @@ public class Concept { @org.springframework.data.annotation.Transient @ToString.Exclude - @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.MERGE) + @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.DETACH) @JoinTable(name = "mdb_columns_concepts", joinColumns = @JoinColumn(name = "uri"), inverseJoinColumns = { diff --git a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/identifier/Identifier.java b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/identifier/Identifier.java index 2fd30300602a791c7ea64856564685e496e2a824..14e2762a4d74330a57c1135f4b266c96e14f4408 100644 --- a/fda-metadata-db/entities/src/main/java/at/tuwien/entities/identifier/Identifier.java +++ b/fda-metadata-db/entities/src/main/java/at/tuwien/entities/identifier/Identifier.java @@ -71,7 +71,7 @@ public class Identifier { @Enumerated(EnumType.STRING) private LanguageType language; - @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE) + @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.DETACH) @JoinColumns({ @JoinColumn(name = "License", referencedColumnName = "identifier") }) @@ -118,7 +118,7 @@ public class Identifier { @Enumerated(EnumType.STRING) private VisibilityType visibility = VisibilityType.SELF; - @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.MERGE) + @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.DETACH) @JoinColumns({ @JoinColumn(name = "iid", referencedColumnName = "id", insertable = false, updatable = false) }) diff --git a/fda-metadata-db/querystore/src/main/java/at/tuwien/querystore/Query.java b/fda-metadata-db/querystore/src/main/java/at/tuwien/querystore/Query.java index 7e29b0f91ecbd10dd5e9f81a2c5a9d5498d39a5c..3565d547b25dd01edce92ab8203861b2ad26a0fd 100644 --- a/fda-metadata-db/querystore/src/main/java/at/tuwien/querystore/Query.java +++ b/fda-metadata-db/querystore/src/main/java/at/tuwien/querystore/Query.java @@ -79,7 +79,7 @@ public class Query implements Serializable { @javax.persistence.Column(nullable = false) private Long createdBy; - @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.MERGE) + @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.DETACH) private List<at.tuwien.querystore.Table> tables; @javax.persistence.Column(name = "last_modified") diff --git a/fda-metadata-db/querystore/src/main/java/at/tuwien/querystore/Table.java b/fda-metadata-db/querystore/src/main/java/at/tuwien/querystore/Table.java index c4628e1185ebbae3eb3cb39d6c45644853668f85..88f672568f499b42102d2ff06d2794d56ad973c0 100644 --- a/fda-metadata-db/querystore/src/main/java/at/tuwien/querystore/Table.java +++ b/fda-metadata-db/querystore/src/main/java/at/tuwien/querystore/Table.java @@ -35,7 +35,7 @@ public class Table implements Serializable { @javax.persistence.Column(nullable = false) private Long dbid; - @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.MERGE) + @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.DETACH) private List<at.tuwien.querystore.Column> columns; @javax.persistence.Column(nullable = false, updatable = false)