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