From a4118b5511381a1c447b168efa857a6703d2c181 Mon Sep 17 00:00:00 2001
From: Martin Weise <martin.weise@tuwien.ac.at>
Date: Mon, 28 Feb 2022 16:49:14 +0100
Subject: [PATCH] Fixed conflict, closes #137

Former-commit-id: aa052276434494b29a379cf170b73ba830395e33
---
 .fda-deployment/teardown                      |  4 ++--
 .../tuwien/endpoints/ContainerEndpoint.java   |  2 +-
 .../endpoint/ContainerEndpointUnitTest.java   |  6 +++---
 .../ContainerServiceIntegrationTest.java      |  4 ++--
 .../ContainerAlreadyExistsException.java      | 21 +++++++++++++++++++
 .../at/tuwien/service/ContainerService.java   |  2 +-
 .../service/impl/ContainerServiceImpl.java    |  4 ++--
 7 files changed, 32 insertions(+), 11 deletions(-)
 create mode 100644 fda-container-service/services/src/main/java/at/tuwien/exception/ContainerAlreadyExistsException.java

diff --git a/.fda-deployment/teardown b/.fda-deployment/teardown
index 3e6b1e5ba2..bda6f753d4 100755
--- a/.fda-deployment/teardown
+++ b/.fda-deployment/teardown
@@ -1,6 +1,6 @@
 #!/bin/bash
-docker container stop $(docker container ls -aq) || true
-docker container rm $(docker container ls -aq) || true
+docker container stop $(docker container ls -aq -f name=^/fda-.*) || true
+docker container rm $(docker container ls -aq -f name=^/fda-.*) || true
 docker volume rm $(docker volume ls -q) || true
 docker network rm fda-userdb || true
 docker network rm fda-public || true
\ No newline at end of file
diff --git a/fda-container-service/rest-service/src/main/java/at/tuwien/endpoints/ContainerEndpoint.java b/fda-container-service/rest-service/src/main/java/at/tuwien/endpoints/ContainerEndpoint.java
index 9eb1460800..fcbd14d942 100644
--- a/fda-container-service/rest-service/src/main/java/at/tuwien/endpoints/ContainerEndpoint.java
+++ b/fda-container-service/rest-service/src/main/java/at/tuwien/endpoints/ContainerEndpoint.java
@@ -64,7 +64,7 @@ public class ContainerEndpoint {
             @ApiResponse(code = 404, message = "The container was not found after creation."),
     })
     public ResponseEntity<ContainerBriefDto> create(@Valid @RequestBody ContainerCreateRequestDto data)
-            throws ImageNotFoundException, DockerClientException {
+            throws ImageNotFoundException, DockerClientException, ContainerAlreadyExistsException {
         final Container container = containerService.create(data);
         final ContainerBriefDto response = containerMapper.containerToDatabaseContainerBriefDto(container);
         return ResponseEntity.status(HttpStatus.CREATED)
diff --git a/fda-container-service/rest-service/src/test/java/at/tuwien/endpoint/ContainerEndpointUnitTest.java b/fda-container-service/rest-service/src/test/java/at/tuwien/endpoint/ContainerEndpointUnitTest.java
index cec3ce6acf..ef8d4d557b 100644
--- a/fda-container-service/rest-service/src/test/java/at/tuwien/endpoint/ContainerEndpointUnitTest.java
+++ b/fda-container-service/rest-service/src/test/java/at/tuwien/endpoint/ContainerEndpointUnitTest.java
@@ -54,7 +54,7 @@ public class ContainerEndpointUnitTest extends BaseUnitTest {
     }
 
     @Test
-    public void create_succeeds() throws ImageNotFoundException, DockerClientException {
+    public void create_succeeds() throws ImageNotFoundException, DockerClientException, ContainerAlreadyExistsException {
         final ContainerCreateRequestDto request = ContainerCreateRequestDto.builder()
                 .name(CONTAINER_1_NAME)
                 .repository(IMAGE_1.getRepository())
@@ -72,7 +72,7 @@ public class ContainerEndpointUnitTest extends BaseUnitTest {
 
     @Disabled
     @Test
-    public void create_noImage_fails() throws DockerClientException, ImageNotFoundException {
+    public void create_noImage_fails() throws DockerClientException, ImageNotFoundException, ContainerAlreadyExistsException {
         final ContainerCreateRequestDto request = ContainerCreateRequestDto.builder()
                 .name(CONTAINER_1_NAME)
                 .repository("image")
@@ -89,7 +89,7 @@ public class ContainerEndpointUnitTest extends BaseUnitTest {
 
     @Disabled
     @Test
-    public void create_docker_fails() throws DockerClientException, ImageNotFoundException {
+    public void create_docker_fails() throws DockerClientException, ImageNotFoundException, ContainerAlreadyExistsException {
         final ContainerCreateRequestDto request = ContainerCreateRequestDto.builder()
                 .name(CONTAINER_1_NAME)
                 .repository(IMAGE_1.getRepository())
diff --git a/fda-container-service/rest-service/src/test/java/at/tuwien/service/ContainerServiceIntegrationTest.java b/fda-container-service/rest-service/src/test/java/at/tuwien/service/ContainerServiceIntegrationTest.java
index ebbbc7bb99..a478b2a6c1 100644
--- a/fda-container-service/rest-service/src/test/java/at/tuwien/service/ContainerServiceIntegrationTest.java
+++ b/fda-container-service/rest-service/src/test/java/at/tuwien/service/ContainerServiceIntegrationTest.java
@@ -146,7 +146,7 @@ public class ContainerServiceIntegrationTest extends BaseUnitTest {
     }
 
     @Test
-    public void create_succeeds() throws DockerClientException, ImageNotFoundException {
+    public void create_succeeds() throws DockerClientException, ImageNotFoundException, ContainerAlreadyExistsException {
         final ContainerCreateRequestDto request = ContainerCreateRequestDto.builder()
                 .repository(IMAGE_1_REPOSITORY)
                 .tag(IMAGE_1_TAG)
@@ -159,7 +159,7 @@ public class ContainerServiceIntegrationTest extends BaseUnitTest {
     }
 
     @Test
-    public void create_conflictingNames_fails() throws DockerClientException, ImageNotFoundException {
+    public void create_conflictingNames_fails() throws DockerClientException, ImageNotFoundException, ContainerAlreadyExistsException {
         final ContainerCreateRequestDto request = ContainerCreateRequestDto.builder()
                 .repository(IMAGE_1_REPOSITORY)
                 .tag(IMAGE_1_TAG)
diff --git a/fda-container-service/services/src/main/java/at/tuwien/exception/ContainerAlreadyExistsException.java b/fda-container-service/services/src/main/java/at/tuwien/exception/ContainerAlreadyExistsException.java
new file mode 100644
index 0000000000..fb7031bfba
--- /dev/null
+++ b/fda-container-service/services/src/main/java/at/tuwien/exception/ContainerAlreadyExistsException.java
@@ -0,0 +1,21 @@
+package at.tuwien.exception;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+@ResponseStatus(code = HttpStatus.CONFLICT, reason = "Container name exists")
+public class ContainerAlreadyExistsException extends Exception {
+
+    public ContainerAlreadyExistsException(String message) {
+        super(message);
+    }
+
+    public ContainerAlreadyExistsException(String message, Throwable thr) {
+        super(message, thr);
+    }
+
+    public ContainerAlreadyExistsException(Throwable thr) {
+        super(thr);
+    }
+
+}
diff --git a/fda-container-service/services/src/main/java/at/tuwien/service/ContainerService.java b/fda-container-service/services/src/main/java/at/tuwien/service/ContainerService.java
index 346d7034df..1b0c7db406 100644
--- a/fda-container-service/services/src/main/java/at/tuwien/service/ContainerService.java
+++ b/fda-container-service/services/src/main/java/at/tuwien/service/ContainerService.java
@@ -9,7 +9,7 @@ import java.util.List;
 
 public interface ContainerService {
     @Transactional
-    Container create(ContainerCreateRequestDto createDto) throws ImageNotFoundException, DockerClientException;
+    Container create(ContainerCreateRequestDto createDto) throws ImageNotFoundException, DockerClientException, ContainerAlreadyExistsException;
 
     @Transactional
     Container stop(Long containerId) throws ContainerNotFoundException, DockerClientException;
diff --git a/fda-container-service/services/src/main/java/at/tuwien/service/impl/ContainerServiceImpl.java b/fda-container-service/services/src/main/java/at/tuwien/service/impl/ContainerServiceImpl.java
index 3662f91b11..d930f276d5 100644
--- a/fda-container-service/services/src/main/java/at/tuwien/service/impl/ContainerServiceImpl.java
+++ b/fda-container-service/services/src/main/java/at/tuwien/service/impl/ContainerServiceImpl.java
@@ -53,7 +53,7 @@ public class ContainerServiceImpl implements ContainerService {
 
     @Override
     @Transactional
-    public Container create(ContainerCreateRequestDto createDto) throws ImageNotFoundException, DockerClientException {
+    public Container create(ContainerCreateRequestDto createDto) throws ImageNotFoundException, DockerClientException, ContainerAlreadyExistsException {
         final Optional<ContainerImage> image = imageRepository.findByRepositoryAndTag(createDto.getRepository(), createDto.getTag());
         if (image.isEmpty()) {
             log.error("failed to get image with name {}:{}", createDto.getRepository(), createDto.getTag());
@@ -82,7 +82,7 @@ public class ContainerServiceImpl implements ContainerService {
                     .exec();
         } catch (ConflictException e) {
             log.error("Conflicting names {}", createDto.getName());
-            throw new DockerClientException("Unexpected behavior", e);
+            throw new ContainerAlreadyExistsException("Unexpected behavior", e);
         } catch (NotFoundException e) {
             log.error("The image {}:{} not available on the container service", createDto.getRepository(), createDto.getTag());
             log.debug("payload was {}", createDto);
-- 
GitLab