From bb123ab9857d16811b468c2c0690c73193e54bf8 Mon Sep 17 00:00:00 2001 From: Martin Weise <martin.weise@tuwien.ac.at> Date: Sat, 13 Mar 2021 10:24:34 +0100 Subject: [PATCH] added service tests --- .../database/CreateDatabaseContainerDto.java | 2 + fda-container-managing-service/pom.xml | 23 +++++- .../FdaContainerManagingApplication.java | 3 +- .../DatabaseContainerController.java | 14 ++-- .../java/at/tuwien/BaseIntegrationTest.java | 78 ++++++++++++++++++ .../java/at/tuwien/docker/DockerTest.java | 24 ++++++ .../EndpointTest.java | 13 ++- .../integration/BaseIntegrationTest.java | 8 -- .../mapper/DatabaseContainerMappingTest.java | 4 - .../java/at/tuwien/service/ServiceTest.java | 79 +++++++++++++++++++ .../java/at/tuwien/entity/Architecture.java | 5 ++ .../{entities => entity}/Auditable.java | 6 +- .../java/at/tuwien/entity/ContainerImage.java | 37 +++++++++ .../DatabaseContainer.java | 14 +++- .../exception/ImageNotFoundException.java | 17 ++++ .../mapper/DatabaseContainerMapper.java | 11 ++- .../repositories/MetadataRepository.java | 9 --- .../repository/ContainerRepository.java | 12 +++ .../at/tuwien/repository/ImageRepository.java | 15 ++++ .../at/tuwien/service/ContainerService.java | 75 ++++++++---------- .../java/at/tuwien/service/ImageService.java | 24 ++++++ 21 files changed, 390 insertions(+), 83 deletions(-) create mode 100644 fda-container-managing-service/rest-service/src/test/java/at/tuwien/BaseIntegrationTest.java create mode 100644 fda-container-managing-service/rest-service/src/test/java/at/tuwien/docker/DockerTest.java rename fda-container-managing-service/rest-service/src/test/java/at/tuwien/{integration => endpoint}/EndpointTest.java (56%) delete mode 100644 fda-container-managing-service/rest-service/src/test/java/at/tuwien/integration/BaseIntegrationTest.java create mode 100644 fda-container-managing-service/rest-service/src/test/java/at/tuwien/service/ServiceTest.java create mode 100644 fda-container-managing-service/services/src/main/java/at/tuwien/entity/Architecture.java rename fda-container-managing-service/services/src/main/java/at/tuwien/{entities => entity}/Auditable.java (90%) create mode 100644 fda-container-managing-service/services/src/main/java/at/tuwien/entity/ContainerImage.java rename fda-container-managing-service/services/src/main/java/at/tuwien/{entities => entity}/DatabaseContainer.java (67%) create mode 100644 fda-container-managing-service/services/src/main/java/at/tuwien/exception/ImageNotFoundException.java delete mode 100644 fda-container-managing-service/services/src/main/java/at/tuwien/repositories/MetadataRepository.java create mode 100644 fda-container-managing-service/services/src/main/java/at/tuwien/repository/ContainerRepository.java create mode 100644 fda-container-managing-service/services/src/main/java/at/tuwien/repository/ImageRepository.java create mode 100644 fda-container-managing-service/services/src/main/java/at/tuwien/service/ImageService.java diff --git a/fda-container-managing-service/api/src/main/java/at/tuwien/api/dto/database/CreateDatabaseContainerDto.java b/fda-container-managing-service/api/src/main/java/at/tuwien/api/dto/database/CreateDatabaseContainerDto.java index c7377b7474..7a1e7b4aa8 100644 --- a/fda-container-managing-service/api/src/main/java/at/tuwien/api/dto/database/CreateDatabaseContainerDto.java +++ b/fda-container-managing-service/api/src/main/java/at/tuwien/api/dto/database/CreateDatabaseContainerDto.java @@ -11,4 +11,6 @@ public class CreateDatabaseContainerDto { private String databaseName; + private String image; + } diff --git a/fda-container-managing-service/pom.xml b/fda-container-managing-service/pom.xml index cbdccd7bab..b219a6553c 100644 --- a/fda-container-managing-service/pom.xml +++ b/fda-container-managing-service/pom.xml @@ -25,6 +25,7 @@ <java.version>11</java.version> <spring-cloud.version>Hoxton.SR8</spring-cloud.version> <mapstruct.version>1.4.2.Final</mapstruct.version> + <docker.version>3.2.7</docker.version> </properties> <dependencies> @@ -58,6 +59,24 @@ </exclusion> </exclusions> </dependency> + <dependency> + <groupId>org.testcontainers</groupId> + <artifactId>postgresql</artifactId> + <version>1.15.2</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.testcontainers</groupId> + <artifactId>mysql</artifactId> + <version>1.15.2</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.testcontainers</groupId> + <artifactId>mongodb</artifactId> + <version>1.15.2</version> + <scope>test</scope> + </dependency> <!-- DTO --> <dependency> <groupId>io.springfox</groupId> @@ -73,12 +92,12 @@ <dependency> <groupId>com.github.docker-java</groupId> <artifactId>docker-java-api</artifactId> - <version>3.2.1</version> + <version>${docker.version}</version> </dependency> <dependency> <groupId>com.github.docker-java</groupId> <artifactId>docker-java</artifactId> - <version>3.2.1</version> + <version>${docker.version}</version> </dependency> <!-- Mapping --> <dependency> diff --git a/fda-container-managing-service/rest-service/src/main/java/at/tuwien/FdaContainerManagingApplication.java b/fda-container-managing-service/rest-service/src/main/java/at/tuwien/FdaContainerManagingApplication.java index cb205fe01a..ee3720f419 100644 --- a/fda-container-managing-service/rest-service/src/main/java/at/tuwien/FdaContainerManagingApplication.java +++ b/fda-container-managing-service/rest-service/src/main/java/at/tuwien/FdaContainerManagingApplication.java @@ -3,14 +3,13 @@ package at.tuwien; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.domain.EntityScan; -import org.springframework.context.annotation.ComponentScan; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import springfox.documentation.swagger2.annotations.EnableSwagger2; @SpringBootApplication @EnableJpaAuditing -@EnableJpaRepositories(basePackages = {"at.tuwien.repositories"}) +@EnableJpaRepositories(basePackages = {"at.tuwien.repository"}) @EntityScan(basePackages = {"at.tuwien.entities"}) @EnableSwagger2 public class FdaContainerManagingApplication { diff --git a/fda-container-managing-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseContainerController.java b/fda-container-managing-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseContainerController.java index dde2c15dab..51bc3e673a 100644 --- a/fda-container-managing-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseContainerController.java +++ b/fda-container-managing-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseContainerController.java @@ -5,7 +5,8 @@ import at.tuwien.api.dto.container.DatabaseContainerBriefDto; import at.tuwien.api.dto.container.DatabaseContainerDto; import at.tuwien.api.dto.database.CreateDatabaseContainerDto; import at.tuwien.api.dto.database.CreateDatabaseResponseDto; -import at.tuwien.entities.DatabaseContainer; +import at.tuwien.entity.DatabaseContainer; +import at.tuwien.exception.ImageNotFoundException; import at.tuwien.mapper.DatabaseContainerMapper; import at.tuwien.service.ContainerService; import io.swagger.annotations.ApiOperation; @@ -44,19 +45,20 @@ public class DatabaseContainerController { @PostMapping("/database") @ApiOperation("Create a new database container") - public ResponseEntity<CreateDatabaseResponseDto> create(@RequestBody CreateDatabaseContainerDto data) { - final String containerId = containerService.createDatabaseContainer(data); - log.debug("Create new database {} in container {} with id {}", data.getDatabaseName(), data.getContainerName(), containerId); + public ResponseEntity<CreateDatabaseResponseDto> create(@RequestBody CreateDatabaseContainerDto data) + throws ImageNotFoundException { + final DatabaseContainer container = containerService.create(data); + log.debug("Create new database {} in container {} with id {}", data.getDatabaseName(), data.getContainerName(), container.getContainerId()); return ResponseEntity.status(HttpStatus.CREATED) .body(CreateDatabaseResponseDto.builder() - .containerId(containerId) + .containerId(container.getContainerId()) .build()); } @GetMapping("/database/{id}") @ApiOperation("Get info of database container") public DatabaseContainerDto findById(@RequestParam String id) { - return databaseContaineMapper.databaseContainerToDataBaseContainerDto(containerService.getDatabaseById(id)); + return databaseContaineMapper.databaseContainerToDataBaseContainerDto(containerService.getById(id)); } diff --git a/fda-container-managing-service/rest-service/src/test/java/at/tuwien/BaseIntegrationTest.java b/fda-container-managing-service/rest-service/src/test/java/at/tuwien/BaseIntegrationTest.java new file mode 100644 index 0000000000..3b9aa41e8e --- /dev/null +++ b/fda-container-managing-service/rest-service/src/test/java/at/tuwien/BaseIntegrationTest.java @@ -0,0 +1,78 @@ +package at.tuwien; + +import at.tuwien.entity.Architecture; +import at.tuwien.entity.ContainerImage; +import at.tuwien.entity.DatabaseContainer; +import org.springframework.test.context.TestPropertySource; + +import java.math.BigInteger; +import java.time.Instant; + +import static java.time.temporal.ChronoUnit.DAYS; +import static java.time.temporal.ChronoUnit.HOURS; + +@TestPropertySource(locations = "classpath:application.properties") +public abstract class BaseIntegrationTest { + + public final String IMAGE_1_REPOSITORY = "postgres"; + public final String IMAGE_1_TAG = "13-alpine"; + public final String IMAGE_1_HASH = "83b40f2726e5"; + public final BigInteger IMAGE_1_SIZE = new BigInteger("160000000"); + public final Instant IMAGE_1_BUILT = Instant.now().minus(40, HOURS); + + public final String IMAGE_2_REPOSITORY = "redis"; + public final String IMAGE_2_TAG = "latest"; + public final String IMAGE_2_HASH = "f877e80bb9ef"; + public final BigInteger IMAGE_2_SIZE = new BigInteger("105000000"); + public final Instant IMAGE_2_BUILT = Instant.now().minus(9, DAYS); + + public final ContainerImage IMAGE_1 = ContainerImage.builder() + .repository(IMAGE_1_REPOSITORY) + .tag(IMAGE_1_TAG) + .hash(IMAGE_1_HASH) + .size(IMAGE_1_SIZE) + .built(IMAGE_1_BUILT) + .architecture(Architecture.LINUX_AMD64) + .build(); + + public final ContainerImage IMAGE_2 = ContainerImage.builder() + .repository(IMAGE_2_REPOSITORY) + .tag(IMAGE_2_TAG) + .hash(IMAGE_2_HASH) + .size(IMAGE_2_SIZE) + .built(IMAGE_2_BUILT) + .architecture(Architecture.LINUX_AMD64) + .build(); + + public final String CONTAINER_1_ID = "deadbeef"; + public final ContainerImage CONTAINER_1_IMAGE = IMAGE_1; + public final String CONTAINER_1_DATABASE = "univie"; + public final String CONTAINER_1_IP = "231.145.98.83"; + public final Instant CONTAINER_1_CREATED = Instant.now().minus(1, HOURS); + + public final String CONTAINER_2_ID = "0ff1ce"; + public final ContainerImage CONTAINER_2_IMAGE = IMAGE_2; + public final String CONTAINER_2_DATABASE = "tuw"; + public final String CONTAINER_2_IP = "233.145.99.83"; + public final Instant CONTAINER_2_CREATED = Instant.now().minus(1, HOURS); + + public final DatabaseContainer CONTAINER_1 = DatabaseContainer.builder() + .containerId(CONTAINER_1_ID) + .databaseName(CONTAINER_1_DATABASE) + .ipAddress(CONTAINER_1_IP) + .image(CONTAINER_1_IMAGE) + .containerId(CONTAINER_1_ID) + .containerCreated(CONTAINER_1_CREATED) + .build(); + + public final DatabaseContainer CONTAINER_2 = DatabaseContainer.builder() + .containerId(CONTAINER_2_ID) + .databaseName(CONTAINER_2_DATABASE) + .ipAddress(CONTAINER_2_IP) + .image(CONTAINER_2_IMAGE) + .containerId(CONTAINER_2_ID) + .containerCreated(CONTAINER_2_CREATED) + .build(); + + +} diff --git a/fda-container-managing-service/rest-service/src/test/java/at/tuwien/docker/DockerTest.java b/fda-container-managing-service/rest-service/src/test/java/at/tuwien/docker/DockerTest.java new file mode 100644 index 0000000000..91e7fb80f5 --- /dev/null +++ b/fda-container-managing-service/rest-service/src/test/java/at/tuwien/docker/DockerTest.java @@ -0,0 +1,24 @@ +package at.tuwien.docker; + +import org.junit.ClassRule; +import org.junit.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.testcontainers.containers.PostgreSQLContainer; + +@ExtendWith(SpringExtension.class) +@SpringBootTest +public class DockerTest { + + @ClassRule + public static PostgreSQLContainer postgreSQLContainer = new PostgreSQLContainer("postgres:13") + .withDatabaseName("integration-tests-db") + .withUsername("sa") + .withPassword("sa"); + + @Test + public void contextLoads() { + // + } +} diff --git a/fda-container-managing-service/rest-service/src/test/java/at/tuwien/integration/EndpointTest.java b/fda-container-managing-service/rest-service/src/test/java/at/tuwien/endpoint/EndpointTest.java similarity index 56% rename from fda-container-managing-service/rest-service/src/test/java/at/tuwien/integration/EndpointTest.java rename to fda-container-managing-service/rest-service/src/test/java/at/tuwien/endpoint/EndpointTest.java index 98a0e5313d..3828f9080b 100644 --- a/fda-container-managing-service/rest-service/src/test/java/at/tuwien/integration/EndpointTest.java +++ b/fda-container-managing-service/rest-service/src/test/java/at/tuwien/endpoint/EndpointTest.java @@ -1,18 +1,23 @@ -package at.tuwien.integration; +package at.tuwien.endpoint; +import at.tuwien.BaseIntegrationTest; +import at.tuwien.service.ContainerService; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.junit.jupiter.SpringExtension; + @ExtendWith(SpringExtension.class) @SpringBootTest -@AutoConfigureMockMvc public class EndpointTest extends BaseIntegrationTest { + @MockBean + private ContainerService containerService; + @Test - public void contextLoads() { + public void listAllDatabases_success() { // } } diff --git a/fda-container-managing-service/rest-service/src/test/java/at/tuwien/integration/BaseIntegrationTest.java b/fda-container-managing-service/rest-service/src/test/java/at/tuwien/integration/BaseIntegrationTest.java deleted file mode 100644 index 14e0f9ffa0..0000000000 --- a/fda-container-managing-service/rest-service/src/test/java/at/tuwien/integration/BaseIntegrationTest.java +++ /dev/null @@ -1,8 +0,0 @@ -package at.tuwien.integration; - -import org.springframework.test.context.TestPropertySource; - -@TestPropertySource(locations = "classpath:application.properties") -public abstract class BaseIntegrationTest { - -} diff --git a/fda-container-managing-service/rest-service/src/test/java/at/tuwien/mapper/DatabaseContainerMappingTest.java b/fda-container-managing-service/rest-service/src/test/java/at/tuwien/mapper/DatabaseContainerMappingTest.java index 99fec744b9..178b61a249 100644 --- a/fda-container-managing-service/rest-service/src/test/java/at/tuwien/mapper/DatabaseContainerMappingTest.java +++ b/fda-container-managing-service/rest-service/src/test/java/at/tuwien/mapper/DatabaseContainerMappingTest.java @@ -1,18 +1,14 @@ package at.tuwien.mapper; -import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.command.InspectContainerResponse; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit.jupiter.SpringExtension; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.mockito.Mockito.when; @ExtendWith(SpringExtension.class) @SpringBootTest diff --git a/fda-container-managing-service/rest-service/src/test/java/at/tuwien/service/ServiceTest.java b/fda-container-managing-service/rest-service/src/test/java/at/tuwien/service/ServiceTest.java new file mode 100644 index 0000000000..82b1104213 --- /dev/null +++ b/fda-container-managing-service/rest-service/src/test/java/at/tuwien/service/ServiceTest.java @@ -0,0 +1,79 @@ +package at.tuwien.service; + +import at.tuwien.BaseIntegrationTest; +import at.tuwien.api.dto.database.CreateDatabaseContainerDto; +import at.tuwien.entity.DatabaseContainer; +import at.tuwien.exception.ImageNotFoundException; +import at.tuwien.repository.ContainerRepository; +import at.tuwien.repository.ImageRepository; +import org.junit.jupiter.api.Assertions; +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.test.context.junit.jupiter.SpringExtension; + +import java.util.List; + +import static org.mockito.Mockito.when; + +@ExtendWith(SpringExtension.class) +@SpringBootTest +public class ServiceTest extends BaseIntegrationTest { + + @MockBean + private ContainerRepository containerRepository; + + @MockBean + private ImageRepository imageRepository; + + @Autowired + private ContainerService containerService; + + @Test + public void getAllTest_succeeds() { + when(containerRepository.findAll()) + .thenReturn(List.of(CONTAINER_1, CONTAINER_2)); + + final List<DatabaseContainer> response = containerService.getAll(); + Assertions.assertEquals(2, response.size()); + Assertions.assertEquals(CONTAINER_1, response.get(0)); + Assertions.assertEquals(CONTAINER_2, response.get(1)); + } + + @Test + public void getById_succeeds() { + when(containerRepository.findByContainerId(CONTAINER_1_ID)) + .thenReturn(CONTAINER_1); + + final DatabaseContainer response = containerService.getById(CONTAINER_1_ID); + Assertions.assertEquals(CONTAINER_1, response); + } + + @Test + public void getById_fails() { + when(containerRepository.findByContainerId(CONTAINER_1_ID)) + .thenReturn(null); + + final DatabaseContainer response = containerService.getById(CONTAINER_1_ID); + Assertions.assertNull(response); + } + + @Test + public void create_succeeds() { + when(imageRepository.findByImage(IMAGE_1_REPOSITORY, IMAGE_1_TAG)) + .thenReturn(IMAGE_1); + + final DatabaseContainer response = containerService.getById(CONTAINER_1_ID); + Assertions.assertNull(response); + } + + @Test + public void create_noImage_fails() { + final CreateDatabaseContainerDto containerDto = new CreateDatabaseContainerDto(); + containerDto.setImage("postgres:latest"); + + Assertions.assertThrows(ImageNotFoundException.class, () -> containerService.create(containerDto)); + } +} diff --git a/fda-container-managing-service/services/src/main/java/at/tuwien/entity/Architecture.java b/fda-container-managing-service/services/src/main/java/at/tuwien/entity/Architecture.java new file mode 100644 index 0000000000..234008b074 --- /dev/null +++ b/fda-container-managing-service/services/src/main/java/at/tuwien/entity/Architecture.java @@ -0,0 +1,5 @@ +package at.tuwien.entity; + +public enum Architecture { + LINUX_AMD64, LINUX_ARM64, LINUX_RISCV64, LINUX_PPC64LE, LINUX_S390X, LINUX_386, LINUX_ARM_V7, LINUX_ARM_V8 +} diff --git a/fda-container-managing-service/services/src/main/java/at/tuwien/entities/Auditable.java b/fda-container-managing-service/services/src/main/java/at/tuwien/entity/Auditable.java similarity index 90% rename from fda-container-managing-service/services/src/main/java/at/tuwien/entities/Auditable.java rename to fda-container-managing-service/services/src/main/java/at/tuwien/entity/Auditable.java index eef245f8f6..db1840b0f3 100644 --- a/fda-container-managing-service/services/src/main/java/at/tuwien/entities/Auditable.java +++ b/fda-container-managing-service/services/src/main/java/at/tuwien/entity/Auditable.java @@ -1,8 +1,6 @@ -package at.tuwien.entities; +package at.tuwien.entity; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; +import lombok.*; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Parameter; import org.springframework.data.annotation.CreatedDate; diff --git a/fda-container-managing-service/services/src/main/java/at/tuwien/entity/ContainerImage.java b/fda-container-managing-service/services/src/main/java/at/tuwien/entity/ContainerImage.java new file mode 100644 index 0000000000..6d1bccd05c --- /dev/null +++ b/fda-container-managing-service/services/src/main/java/at/tuwien/entity/ContainerImage.java @@ -0,0 +1,37 @@ +package at.tuwien.entity; + +import lombok.*; + +import javax.persistence.Column; +import javax.persistence.Entity; +import java.math.BigInteger; +import java.time.Instant; + +@Entity +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true, onlyExplicitlyIncluded = true) +@ToString(callSuper = true, onlyExplicitlyIncluded = true) +public class ContainerImage extends Auditable { + + @Column(nullable = false) + private String repository; + + @Column(nullable = false) + private String tag; + + @Column(nullable = false) + private String hash; + + @Column(nullable = false) + private Instant built; + + @Column(nullable = false) + private BigInteger size; + + @Column(nullable = false) + private Architecture architecture; + +} diff --git a/fda-container-managing-service/services/src/main/java/at/tuwien/entities/DatabaseContainer.java b/fda-container-managing-service/services/src/main/java/at/tuwien/entity/DatabaseContainer.java similarity index 67% rename from fda-container-managing-service/services/src/main/java/at/tuwien/entities/DatabaseContainer.java rename to fda-container-managing-service/services/src/main/java/at/tuwien/entity/DatabaseContainer.java index 8c8947ab18..971061cdcf 100644 --- a/fda-container-managing-service/services/src/main/java/at/tuwien/entities/DatabaseContainer.java +++ b/fda-container-managing-service/services/src/main/java/at/tuwien/entity/DatabaseContainer.java @@ -1,17 +1,22 @@ -package at.tuwien.entities; +package at.tuwien.entity; import lombok.*; import javax.persistence.Column; import javax.persistence.Entity; +import javax.persistence.OneToOne; +import javax.persistence.Transient; import java.time.Instant; @Entity @Data +@Builder +@NoArgsConstructor +@AllArgsConstructor @EqualsAndHashCode(callSuper = true, onlyExplicitlyIncluded = true) @ToString(callSuper = true, onlyExplicitlyIncluded = true) -public class DatabaseContainer extends Auditable{ +public class DatabaseContainer extends Auditable { @Column(nullable = false) private String containerId; @@ -25,7 +30,10 @@ public class DatabaseContainer extends Auditable{ @Column(nullable = false) private String databaseName; - @Column + @OneToOne(optional = false) + private ContainerImage image; + + @Transient private String status; @Column diff --git a/fda-container-managing-service/services/src/main/java/at/tuwien/exception/ImageNotFoundException.java b/fda-container-managing-service/services/src/main/java/at/tuwien/exception/ImageNotFoundException.java new file mode 100644 index 0000000000..56d20915ec --- /dev/null +++ b/fda-container-managing-service/services/src/main/java/at/tuwien/exception/ImageNotFoundException.java @@ -0,0 +1,17 @@ +package at.tuwien.exception; + +public class ImageNotFoundException extends Exception { + + public ImageNotFoundException(String message) { + super(message); + } + + public ImageNotFoundException(String message, Throwable thr) { + super(message, thr); + } + + public ImageNotFoundException(Throwable thr) { + super(thr); + } + +} diff --git a/fda-container-managing-service/services/src/main/java/at/tuwien/mapper/DatabaseContainerMapper.java b/fda-container-managing-service/services/src/main/java/at/tuwien/mapper/DatabaseContainerMapper.java index d23a617cbf..9556ed83fc 100644 --- a/fda-container-managing-service/services/src/main/java/at/tuwien/mapper/DatabaseContainerMapper.java +++ b/fda-container-managing-service/services/src/main/java/at/tuwien/mapper/DatabaseContainerMapper.java @@ -2,9 +2,10 @@ package at.tuwien.mapper; import at.tuwien.api.dto.container.DatabaseContainerBriefDto; import at.tuwien.api.dto.container.DatabaseContainerDto; +import at.tuwien.entity.ContainerImage; import com.github.dockerjava.api.command.InspectContainerResponse; import com.github.dockerjava.api.model.Container; -import at.tuwien.entities.DatabaseContainer; +import at.tuwien.entity.DatabaseContainer; import com.github.dockerjava.api.model.NetworkSettings; import org.mapstruct.Mapper; import org.mapstruct.Mapping; @@ -30,6 +31,14 @@ public interface DatabaseContainerMapper { return data.getNetworks().get("bridge").getIpAddress(); } + default ContainerImage imageToContainerImage(String image) { + int index = image.indexOf(":"); + return new ContainerImage().builder() + .repository(image.substring(0,index)) + .tag(image.substring(index+1)) + .build(); + } + DatabaseContainer containerToDatabaseContainer(Container data); DatabaseContainerBriefDto databaseContainerToDataBaseContainerBriefDto(DatabaseContainer data); diff --git a/fda-container-managing-service/services/src/main/java/at/tuwien/repositories/MetadataRepository.java b/fda-container-managing-service/services/src/main/java/at/tuwien/repositories/MetadataRepository.java deleted file mode 100644 index 5c7fc6ba05..0000000000 --- a/fda-container-managing-service/services/src/main/java/at/tuwien/repositories/MetadataRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package at.tuwien.repositories; - -import at.tuwien.entities.DatabaseContainer; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface MetadataRepository extends JpaRepository<DatabaseContainer, String> { -} diff --git a/fda-container-managing-service/services/src/main/java/at/tuwien/repository/ContainerRepository.java b/fda-container-managing-service/services/src/main/java/at/tuwien/repository/ContainerRepository.java new file mode 100644 index 0000000000..db8398e973 --- /dev/null +++ b/fda-container-managing-service/services/src/main/java/at/tuwien/repository/ContainerRepository.java @@ -0,0 +1,12 @@ +package at.tuwien.repository; + +import at.tuwien.entity.DatabaseContainer; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ContainerRepository extends JpaRepository<DatabaseContainer, Long> { + + DatabaseContainer findByContainerId(String id); + +} diff --git a/fda-container-managing-service/services/src/main/java/at/tuwien/repository/ImageRepository.java b/fda-container-managing-service/services/src/main/java/at/tuwien/repository/ImageRepository.java new file mode 100644 index 0000000000..1a8991617d --- /dev/null +++ b/fda-container-managing-service/services/src/main/java/at/tuwien/repository/ImageRepository.java @@ -0,0 +1,15 @@ +package at.tuwien.repository; + +import at.tuwien.entity.ContainerImage; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +@Repository +public interface ImageRepository extends JpaRepository<ContainerImage, Long> { + + @Query(value = "select distinct tag from ContainerImage where repository = :repo and tag = :tag") + ContainerImage findByImage(@Param("repo") String repository, @Param("tag") String tag); + +} diff --git a/fda-container-managing-service/services/src/main/java/at/tuwien/service/ContainerService.java b/fda-container-managing-service/services/src/main/java/at/tuwien/service/ContainerService.java index 63b3cf9a68..9debf34648 100644 --- a/fda-container-managing-service/services/src/main/java/at/tuwien/service/ContainerService.java +++ b/fda-container-managing-service/services/src/main/java/at/tuwien/service/ContainerService.java @@ -1,68 +1,63 @@ package at.tuwien.service; import at.tuwien.api.dto.database.CreateDatabaseContainerDto; -import com.github.dockerjava.api.DockerClient; -import com.github.dockerjava.api.command.InspectContainerResponse; -import com.github.dockerjava.api.model.Container; -import com.github.dockerjava.api.model.HostConfig; -import com.github.dockerjava.api.model.PortBinding; -import com.github.dockerjava.api.model.RestartPolicy; -import at.tuwien.entities.DatabaseContainer; +import at.tuwien.entity.ContainerImage; +import at.tuwien.entity.DatabaseContainer; +import at.tuwien.exception.ImageNotFoundException; import at.tuwien.mapper.DatabaseContainerMapper; +import at.tuwien.repository.ContainerRepository; +import at.tuwien.repository.ImageRepository; +import com.github.dockerjava.api.DockerClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.util.SocketUtils; import java.util.List; -import java.util.stream.Collectors; @Service public class ContainerService { private final DockerClient dockerClient; + private final ContainerRepository containerRepository; + private final ImageRepository imageRepository; private final DatabaseContainerMapper databaseContainerMapper; @Autowired - public ContainerService(DockerClient dockerClient, DatabaseContainerMapper databaseContainerMapper) { + public ContainerService(DockerClient dockerClient, ContainerRepository containerRepository, + ImageRepository imageRepository, DatabaseContainerMapper databaseContainerMapper) { this.dockerClient = dockerClient; + this.containerRepository = containerRepository; + this.imageRepository = imageRepository; this.databaseContainerMapper = databaseContainerMapper; } - public String createDatabaseContainer(CreateDatabaseContainerDto dto) { - int availableTcpPort = SocketUtils.findAvailableTcpPort(8180, 8500); - HostConfig hostConfig = HostConfig.newHostConfig() - .withPortBindings(PortBinding.parse(availableTcpPort + ":5432")) - .withRestartPolicy(RestartPolicy.alwaysRestart()); - -// CreateContainerResponse container = dockerClient.createContainerCmd("rdr-postgres:1.0") -// .withName(dto.getContainerName()) -// .withEnv("POSTGRES_DB=" + dto.getDatabaseName(), "POSTGRES_PASSWORD=postgres") -// .withHostConfig(hostConfig).exec(); -// dockerClient.startContainerCmd(container.getId()).exec(); -// return container.getId(); - return "deadbeef"; + public DatabaseContainer create(CreateDatabaseContainerDto containerDto) throws ImageNotFoundException { + final int index = containerDto.getImage().indexOf(":"); + final String repositoryName = containerDto.getImage().substring(0,index); + final String tagName = containerDto.getImage().substring(index+1); + final ContainerImage image = imageRepository.findByImage(repositoryName, tagName); + if (image == null) { + throw new ImageNotFoundException("image was not found in metadata database."); + } +// int availableTcpPort = SocketUtils.findAvailableTcpPort(8180, 8500); +// HostConfig hostConfig = HostConfig.newHostConfig() +// .withPortBindings(PortBinding.parse(availableTcpPort + ":5432")) +// .withRestartPolicy(RestartPolicy.alwaysRestart()); +// +//// CreateContainerResponse container = dockerClient.createContainerCmd("rdr-postgres:1.0") +//// .withName(dto.getContainerName()) +//// .withEnv("POSTGRES_DB=" + dto.getDatabaseName(), "POSTGRES_PASSWORD=postgres") +//// .withHostConfig(hostConfig).exec(); +//// dockerClient.startContainerCmd(container.getId()).exec(); +//// return container.getId(); + return new DatabaseContainer(); } - /** - * Get specific information for container by id - * - * @param containerID The id - * @return The specific information - */ - public DatabaseContainer getDatabaseById(String containerID) { - final InspectContainerResponse container = dockerClient.inspectContainerCmd(containerID).exec(); - return databaseContainerMapper.inspectContainerResponseToDatabaseContainer(container); + public DatabaseContainer getById(String containerId) { + return containerRepository.findByContainerId(containerId); } public List<DatabaseContainer> getAll() { - final List<Container> containers = dockerClient.listContainersCmd() - .withShowAll(true) -// .withAncestorFilter(databaseProperties.getDatabaseImages()) - .exec(); - return containers.stream() - .map(databaseContainerMapper::containerToDatabaseContainer) - .collect(Collectors.toList()); + return containerRepository.findAll(); } - } diff --git a/fda-container-managing-service/services/src/main/java/at/tuwien/service/ImageService.java b/fda-container-managing-service/services/src/main/java/at/tuwien/service/ImageService.java new file mode 100644 index 0000000000..659f46fa91 --- /dev/null +++ b/fda-container-managing-service/services/src/main/java/at/tuwien/service/ImageService.java @@ -0,0 +1,24 @@ +package at.tuwien.service; + +import at.tuwien.entity.ContainerImage; +import at.tuwien.repository.ImageRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class ImageService { + + private final ImageRepository imageRepository; + + @Autowired + public ImageService(ImageRepository imageRepository) { + this.imageRepository = imageRepository; + } + + public List<ContainerImage> getAll() { + return imageRepository.findAll(); + } + +} -- GitLab