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 c7377b747416ffdcb1b3bcd6b8784ab941196497..7a1e7b4aa83e167c4bda09384eed4766b5b52cec 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 cbdccd7bab81ab5c2992125821de618f8765b8d1..b219a6553cacd7988660cbb3c12d103f2c0f2d98 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 cb205fe01aab9d46ac9ed6ba4b83277e508deb1c..ee3720f419be849d035744ba4ad20f0268bbe9e7 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 dde2c15dab1f3489591a62552763146179bd5c00..51bc3e673a3fdf0cb7c1937cffa603c0c447704d 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 0000000000000000000000000000000000000000..3b9aa41e8e20294280068bb674cd7d32537fe32b --- /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 0000000000000000000000000000000000000000..91e7fb80f538efebb06adfaa1cb46e77dc8e1ee1 --- /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 98a0e5313d2d065d19200c136fe1353833ebd624..3828f9080b90fdd28551a69c7043cc01e46265b8 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 14e0f9ffa035abb1b62e7933b42f83e68615997a..0000000000000000000000000000000000000000 --- 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 99fec744b93ee7671c052f8e383b0d74563c5998..178b61a2497e3740b3467a1465a8c167d4589867 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 0000000000000000000000000000000000000000..82b1104213aab40b4102f6080fe04f26603561c2 --- /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 0000000000000000000000000000000000000000..234008b07484f09549998ca1e3838f3ad478063f --- /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 eef245f8f6a183f6b868bd1d05550260b196ce7e..db1840b0f3d6ab45f941907f6c0610ce506757f4 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 0000000000000000000000000000000000000000..6d1bccd05c81eef19cba695b330f53d7414a3c7b --- /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 8c8947ab180bfa9d7055e357c6eff89c8ee79940..971061cdcff2aa2c569767a9c3a028f01e816fb9 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 0000000000000000000000000000000000000000..56d20915ec5dc03a69578e711bf2c69bcc17a362 --- /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 d23a617cbf2df9fc53f07e9984273c7dbdde989e..9556ed83fcb9b8cd23f97af2bb6b4926b85aaf61 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 5c7fc6ba05db3d9562f9e4a60750333006c53a94..0000000000000000000000000000000000000000 --- 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 0000000000000000000000000000000000000000..db8398e973eedbfb458a9f645632ccf9ac2651a6 --- /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 0000000000000000000000000000000000000000..1a8991617df6a93da4bcdb5fc59d5c89014663ca --- /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 63b3cf9a68fd0faacba20ce889e449d69e81304c..9debf346489c2551f8a0c5dbe6fa2417130dda3f 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 0000000000000000000000000000000000000000..659f46fa912e3af792fae3a595eaba98cc47e6ee --- /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(); + } + +}