Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
89 commits
Select commit Hold shift + click to select a range
41a6477
[feat] 볼륨관련 엔티티 추가
dolong2 Sep 1, 2025
bdb793b
[feat] 볼륨관련 모델 추가
dolong2 Sep 1, 2025
dd758b3
[feat] 볼륨관련 모델 엔티티 래핑 메서드 추가
dolong2 Sep 1, 2025
02d364e
[feat] 볼륨 관련 영속성 포트 추가
dolong2 Sep 1, 2025
5f7f0d9
[feat] 테스트 sql에 볼륨 관련 테이블 쿼리 추가
dolong2 Sep 1, 2025
5c6fceb
[feat] 볼륨 마운트에 readOnly 필드 추가
dolong2 Sep 1, 2025
d00e3aa
Merge pull request #703 from dolong2/feature/volume-entity
dolong2 Sep 1, 2025
7d232cb
[fix] 볼륨및 볼륨 마운트 엔티티 생성 쿼리에 not null 지정
dolong2 Sep 2, 2025
1c72a2e
[fix] 볼륨및 볼륨 마운트 테이블 연관관계에 cascade 옵션 추가
dolong2 Sep 2, 2025
d41a2c7
[fix] 볼륨 테이블의 workspace_id 컬럼을 not null로 수정
dolong2 Sep 2, 2025
58169a6
Merge pull request #706 from dolong2/fix/volume-table-query
dolong2 Sep 2, 2025
d2050e4
[del] 볼륨에서 physicalPath 제거
dolong2 Sep 3, 2025
fa16634
[feat] 볼륨 생성시 발생할 예외 추가
dolong2 Sep 3, 2025
b689e27
[feat] 중복 볼륨 존재여부 확인 메서드 추가
dolong2 Sep 3, 2025
7f6f878
[feat] 컨테이너 볼륨 생성 서비스 추가
dolong2 Sep 3, 2025
c17e61c
[feat] 볼륨 생성 요청 dto 추가
dolong2 Sep 3, 2025
e9cfbd5
[feat] 볼륨 생성 유스케이스 추가
dolong2 Sep 3, 2025
0c40dfe
[feat] 볼륨 생성 요청 객체 추가
dolong2 Sep 3, 2025
1b6a1f2
[feat] 볼륨 생성 엔드포인트 추가
dolong2 Sep 3, 2025
4d0872d
[feat] 볼륨 생성 유스케이스 테스트 추가
dolong2 Sep 3, 2025
8a98095
[feat] 볼륨 생성 웹어뎁터 테스트 추가
dolong2 Sep 3, 2025
470943f
Merge pull request #708 from dolong2/feature/create-volume-api
dolong2 Sep 3, 2025
b26eec9
[rename] 볼륨 생성 실패 예외 네이밍 수정
dolong2 Sep 4, 2025
92d559b
[feat] 볼륨 삭제에 필요한 예외 추가
dolong2 Sep 4, 2025
3872c2e
[feat] 컨테이너 볼륨 삭제 서비스 추가
dolong2 Sep 4, 2025
405ce0e
[feat] 볼륨 삭제 유스케이스 추가
dolong2 Sep 4, 2025
89f91f3
[feat] 볼륨 삭제 엔드포인트 추가
dolong2 Sep 4, 2025
c57f4ec
[feat] 볼륨 생성 요청에 pattern 적용
dolong2 Sep 4, 2025
f86bb3f
Merge pull request #710 from dolong2/feature/delete-volume-api
dolong2 Sep 4, 2025
257d768
[feat] 볼륨 수정 요청 dto 추가
dolong2 Sep 5, 2025
116654a
[feat] 볼륨 내용 복사 서비스 추가
dolong2 Sep 5, 2025
1e6bdb5
[feat] 볼륨 수정 유스케이스 추가
dolong2 Sep 5, 2025
6b3bf59
[feat] 볼륨 수정 요청 객체 추가
dolong2 Sep 5, 2025
ee11b1b
[feat] 볼륨 수정 엔드포인트 추가
dolong2 Sep 5, 2025
a0eebd4
[feat] 볼륨 복제 실패 예외 처리 로직 추가
dolong2 Sep 5, 2025
0f7e35b
[feat] 볼륨 수정 테스트 케이스 추가
dolong2 Sep 5, 2025
7f721cd
Merge pull request #712 from dolong2/feature/update-volume-api
dolong2 Sep 5, 2025
cf34758
[feat] 볼륨 삭제 유스케이스에 볼륨의 워크스페이스 소속 검증 로직 추가
dolong2 Sep 6, 2025
565028b
[feat] 볼륨 수정 유스케이스에 볼륨의 워크스페이스 소속 검증 로직 추가
dolong2 Sep 6, 2025
ac84452
[test] 워크스페이스 소속 관련 테스트 케이스 추가
dolong2 Sep 6, 2025
6a41bc4
[test] 테스트 케이스 수정
dolong2 Sep 6, 2025
d5581a6
[test] 테스트 케이스 수정
dolong2 Sep 7, 2025
a4bd5f2
Merge pull request #714 from dolong2/refac/volume-usecase
dolong2 Sep 7, 2025
c405b70
[feat] 워크스페이스로 볼륨을 조회하는 쿼리 메서드 추가
dolong2 Sep 9, 2025
b139d33
[feat] 볼륨 목록 응답 dto 추가
dolong2 Sep 9, 2025
057922d
[feat] 볼륨 목록 조회 유스케이스 추가
dolong2 Sep 9, 2025
5539798
[feat] 볼륨 목록 응답 객체 추가
dolong2 Sep 9, 2025
845f37e
[feat] 볼륨 목록 조회 엔드포인트 추가
dolong2 Sep 9, 2025
08c7cb9
[feat] 볼륨 단일 조회 응답 dto 추가
dolong2 Sep 9, 2025
72315d8
[feat] 볼륨 단일 조회 유스케이스 추가
dolong2 Sep 9, 2025
5da84f3
[feat] 볼륨 단일 조회 응답 객체 추가
dolong2 Sep 9, 2025
4ad401e
[feat] 볼륨 단일 조회 엔드포인트 추가
dolong2 Sep 9, 2025
579ce29
[test] 볼륨 목록 조회 유스케이스 테스트 추가
dolong2 Sep 9, 2025
1fd5abd
[test] 볼륨 단일 조회 유스케이스 테스트 추가
dolong2 Sep 9, 2025
4760e55
[test] 볼륨 조회 엔드포인트 관련 테스트 추가
dolong2 Sep 9, 2025
9e623ff
Merge pull request #716 from dolong2/feature/get-volume-api
dolong2 Sep 9, 2025
44de243
[feat] 애플리케이션 컨테이너 생성시 마운트된 볼륨을 반영해서 생성하는 로직 추가
dolong2 Sep 12, 2025
e2e6f20
[feat] 볼륨 마운트 정보 세이브 메서드 추가
dolong2 Sep 12, 2025
948400d
[feat] 볼륨 마운트 요청 dto 추가
dolong2 Sep 12, 2025
8d8b60e
[feat] 볼륨 마운트 유스케이스 추가
dolong2 Sep 12, 2025
f0aecea
[feat] 볼륨 마운트 요청 객체 추가
dolong2 Sep 12, 2025
cddcf30
[feat] 볼륨 마운트 엔드포인트 추가
dolong2 Sep 12, 2025
9c14412
[feat] 컨테이너 생성 테스트에서 의존성 추가
dolong2 Sep 12, 2025
9e87857
[test] 볼륨 마운트 유스케이스 테스트 추가
dolong2 Sep 12, 2025
5e9f6be
[test] 볼륨 마운트 엔드포인트 테스트 추가
dolong2 Sep 12, 2025
07c2760
[chore] 볼륨 관련 플래그 옵션을 코루틴 컨텍스트에서 생성하도록 수정
dolong2 Sep 13, 2025
9663644
[chore] 애플리케이션 배포 유스케이스 테스트 수정
dolong2 Sep 13, 2025
3b12c5d
[feat] 마운트 볼륨 요청시 마운트 경로에 정규식 적용
dolong2 Sep 13, 2025
aa35205
Merge pull request #718 from dolong2/feature/volume-mount-api
dolong2 Sep 13, 2025
42b1345
[feat] 볼륨 마운트시 이미 마운트됐을때 에러를 발생시키는 로직 추가
dolong2 Sep 14, 2025
b172d1b
[feat] 마운트 삭제 메서드, 마운트 조회 메서드 추가
dolong2 Sep 14, 2025
ca1896d
[feat] VolumeMountNotFoundException 추가
dolong2 Sep 14, 2025
9a8fa1b
[feat] 볼륨 마운트 해제 유스케이스 추가
dolong2 Sep 14, 2025
1af84eb
[feat] 볼륨 마운트 해제 엔드포인트 추가
dolong2 Sep 14, 2025
cbb8c6b
[test] 테스트 케이스 오타 수정
dolong2 Sep 14, 2025
bb36242
[fix] 볼륨 마운트의 기본키를 복합 외래키로 수정
dolong2 Sep 14, 2025
c75eeb6
[fix] 볼륨 마운트 변경에따른 테스트 객체 생성 부분 수정
dolong2 Sep 14, 2025
45b06e6
[fix] ddl및 엔티티가 일치하도록 수정
dolong2 Sep 14, 2025
aa06f2a
Merge pull request #720 from dolong2/feature/un-mount-volume-api
dolong2 Sep 14, 2025
93d86e7
[fix] 애플리케이션 컨테이너 생성시 물리적 볼륨 이름을 넣도록 수정
dolong2 Sep 17, 2025
2a338b3
Merge pull request #722 from dolong2/fix/invalid-volume-name-to-creat…
dolong2 Sep 17, 2025
484ce3c
[fix] http 설정 생성시 프록싱 경로를 containerName을 포함한 애플리케이션의 경로로 설정하도록 수정
dolong2 Sep 30, 2025
3145e35
Merge pull request #724 from dolong2/fix/domain-connect-logic
dolong2 Sep 30, 2025
23c55c5
[feat] h2 db 애플리케이션 타입 추가
dolong2 Oct 3, 2025
0fb8843
[feat] h2 db 도커 파일 추가
dolong2 Oct 4, 2025
31e33ba
[feat] CreateDockerFileServiceImpl에 h2_db 타입 분기 추가
dolong2 Oct 4, 2025
64ffa92
[feat] 애플리케이션 버전 조회시 h2_db 분기 추가
dolong2 Oct 4, 2025
1ee5e0c
[fix] 버전 조회 스크립트에서 imagePrefix를 조건에 따라 붙이도록 수정
dolong2 Oct 4, 2025
63e4887
Merge pull request #726 from dolong2/feature/h2-application-type
dolong2 Oct 4, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions src/main/kotlin/com/dcd/server/core/common/error/ErrorCode.kt
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ enum class ErrorCode(
ALREADY_EXISTS_DOMAIN("이미 존재하는 도메인", 400),
ALREADY_CONNECTED_DOMAIN("이미 연결된 도메인", 400),
NOT_CONNECTED_DOMAIN("도메인이 애플리케이션에 연결되어 있지 않음", 400),
ALREADY_EXISTS_VOLUME("이미 존재하는 볼륨", 400),
ALREADY_EXISTS_VOLUME_MOUNT("볼륨 마운트가 존재합니다.", 400),

UNAUTHORIZED("권한이 없음", 401),
EXPIRED_TOKEN("토큰이 만료됨", 401),
Expand All @@ -44,6 +46,8 @@ enum class ErrorCode(
WORKSPACE_NOT_FOUND("해당 워크스페이스를 찾을 수 없음", 404),
AUTH_CODE_NOT_FOUND("인증 코드를 찾을 수 없습니다. 코드를 다시 전송 해주세요.", 404),
DOMAIN_NOT_FOUND("해당 도메인을 찾을 수 없음", 404),
VOLUME_NOT_FOUND("해당 볼륨을 찾을 수 없음", 404),
VOLUME_MOUNT_NOT_FOUND("해당 볼륨 마운트를 찾을 수 없음", 404),

CONFLICT("해당 요청은 서버의 상태와 충돌됩니다.", 409),
CAN_NOT_DEPLOY_APPLICATION("애플리케이션을 배포할 수 없습니다. 애플리케이션을 정지시킨 후 실행해주세요.", 409),
Expand All @@ -59,4 +63,7 @@ enum class ErrorCode(
IMAGE_NOT_BUILT("해당 애플리케이션을 이미지로 빌드할 수 없음", 500),
INTERNAL_ERROR("서버 내부 에러", 500),
INVALID_PARSING_OBJECT_FIELD("파싱할 필드가 올바르게 설정되어있지 않는 객체임", 500),
FAILURE_VOLUME_CREATION("컨테이너 볼륨 생성에 실패했습니다.", 500),
FAILURE_VOLUME_DELETE("컨테이너 볼륨 삭제에 실패했습니다.", 500),
FAILURE_VOLUME_COPY("컨테이너 볼륨 복제에 실패했습니다.", 500),
}
16 changes: 13 additions & 3 deletions src/main/kotlin/com/dcd/server/core/common/file/FileContent.kt
Original file line number Diff line number Diff line change
Expand Up @@ -47,12 +47,21 @@ object FileContent {
${getEnvString(env)}
""".trimIndent()

fun getImageVersionShellScriptContent(imageName: String, minVersion: String): String =
fun getH2DBDockerFileContent(version: String, port: Int, env: Map<String, String>): String =
"""
FROM oscarfonts/h2:${version}
EXPOSE $port
${getEnvString(env)}
""".trimIndent()

fun getImageVersionShellScriptContent(imageName: String, minVersion: String): String {
val imagePrefix = if (imageName.contains("/")) "" else "library/"

return """
#!/bin/bash

# 이미지, 페이지 사이즈, 최소 버전(threshold) 설정
IMAGE_NAME="library/$imageName"
IMAGE_NAME="${imagePrefix}$imageName"
PAGE_SIZE=100
MIN_VERSION="$minVersion"

Expand Down Expand Up @@ -100,6 +109,7 @@ object FileContent {
echo "${'$'}sorted_numeric_tags"
fi
""".trimIndent()
}

fun getApplicationHttpConfig(application: Application, domain: String): String =
"""
Expand All @@ -118,7 +128,7 @@ object FileContent {
proxy_set_header X-Real-IP ${'$'}remote_addr;
proxy_set_header X-Forwarded-For ${'$'}proxy_add_x_forwarded_for;

proxy_pass http://host.docker.internal:${application.externalPort};
proxy_pass http://${application.containerName}:${application.externalPort};
}
}
""".trimIndent()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,6 @@ enum class ApplicationType {
NEST_JS,
MYSQL,
MARIA_DB,
REDIS
REDIS,
H2_DB
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,34 @@ import com.dcd.server.core.domain.application.model.Application
import com.dcd.server.core.domain.application.service.CreateContainerService
import com.dcd.server.core.domain.application.spi.CheckExitValuePort
import com.dcd.server.core.domain.application.util.FailureCase
import com.dcd.server.core.domain.volume.spi.QueryVolumePort
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import org.springframework.stereotype.Service

@Service
class CreateContainerServiceImpl(
private val commandPort: CommandPort,
private val queryVolumePort: QueryVolumePort,
private val checkExitValuePort: CheckExitValuePort
) : CreateContainerService {
override suspend fun createContainer(application: Application, externalPort: Int) {
withContext(Dispatchers.IO) {
val volumeMountBuilder = StringBuilder()
queryVolumePort.findAllMountByApplication(application)
.forEach {
val volume = it.volume
volumeMountBuilder.append("-v ${volume.volumeName}:${it.mountPath}")
if (it.readOnly)
volumeMountBuilder.append(":ro")
volumeMountBuilder.append(" ")
}
val volumeMountFlags = volumeMountBuilder.toString()
val cmd =
"docker create --network ${application.workspace.networkName} " +
"--name ${application.containerName} " +
"-p ${externalPort}:${application.port} ${application.containerName}:latest"
"--name ${application.containerName} " +
volumeMountFlags +
"-p ${externalPort}:${application.port} ${application.containerName}:latest"

commandPort.executeShellCommand(cmd)
.also {exitValue ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,9 @@ class CreateDockerFileServiceImpl(

ApplicationType.NEST_JS ->
FileContent.getNestJsDockerFileContent(version, application.port, applicationEnv)

ApplicationType.H2_DB ->
FileContent.getH2DBDockerFileContent(version, application.port, applicationEnv)
}
try {
if (!file.exists())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ class GetApplicationVersionServiceImpl(
ApplicationType.MARIA_DB -> "mariadb" to "10"
ApplicationType.MYSQL -> "mysql" to "8"
ApplicationType.REDIS -> "redis" to "6"
ApplicationType.H2_DB -> "oscarfonts/h2" to "0"
}
val getVersionScript = FileContent.getImageVersionShellScriptContent(baseImageName, minVersion)
return commandPort.executeShellCommandWithResult(getVersionScript)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package com.dcd.server.core.domain.volume.dto.extension

import com.dcd.server.core.domain.application.dto.extenstion.toProfileDto
import com.dcd.server.core.domain.volume.dto.request.CreateVolumeReqDto
import com.dcd.server.core.domain.volume.dto.request.UpdateVolumeReqDto
import com.dcd.server.core.domain.volume.dto.response.VolumeDetailResDto
import com.dcd.server.core.domain.volume.dto.response.VolumeMountResDto
import com.dcd.server.core.domain.volume.dto.response.VolumeSimpleResDto
import com.dcd.server.core.domain.volume.model.Volume
import com.dcd.server.core.domain.volume.model.VolumeMount
import com.dcd.server.core.domain.workspace.model.Workspace
import java.util.UUID

fun CreateVolumeReqDto.toEntity(workspace: Workspace): Volume =
Volume(
id = UUID.randomUUID(),
name = this.name,
description = this.description,
workspace = workspace,
)

fun UpdateVolumeReqDto.toEntity(volume: Volume): Volume =
Volume(
id = volume.id,
name = this.name,
description = this.description,
workspace = volume.workspace,
)

fun Volume.toResDto(): VolumeSimpleResDto =
VolumeSimpleResDto(
id = this.id,
name = this.name,
description = this.description
)

fun Volume.toDetailResDto(volumeMountList: List<VolumeMount>): VolumeDetailResDto =
VolumeDetailResDto(
id = this.id,
name = this.name,
description = this.description,
mountList = volumeMountList.map { it.toResDto() }
)

fun VolumeMount.toResDto(): VolumeMountResDto =
VolumeMountResDto(
mountPath = this.mountPath,
readOnly = this.readOnly,
applicationInfo = this.application.toProfileDto()
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.dcd.server.core.domain.volume.dto.request

data class CreateVolumeReqDto(
val name: String,
val description: String
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.dcd.server.core.domain.volume.dto.request

data class MountVolumeReqDto(
val mountPath: String,
val readOnly: Boolean,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.dcd.server.core.domain.volume.dto.request

data class UpdateVolumeReqDto(
val name: String,
val description: String
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.dcd.server.core.domain.volume.dto.response

import java.util.UUID

data class VolumeDetailResDto(
val id: UUID,
val name: String,
val description: String,
val mountList: List<VolumeMountResDto>
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.dcd.server.core.domain.volume.dto.response

data class VolumeListResDto(
val list: List<VolumeSimpleResDto>
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.dcd.server.core.domain.volume.dto.response

import com.dcd.server.core.domain.application.dto.response.ApplicationProfileResDto

data class VolumeMountResDto(
val mountPath: String,
val readOnly: Boolean,
val applicationInfo: ApplicationProfileResDto
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.dcd.server.core.domain.volume.dto.response

import java.util.UUID

data class VolumeSimpleResDto(
val id: UUID,
val name: String,
val description: String
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.dcd.server.core.domain.volume.exception

import com.dcd.server.core.common.error.BasicException
import com.dcd.server.core.common.error.ErrorCode

class AlreadyExistsVolumeException : BasicException(ErrorCode.ALREADY_EXISTS_VOLUME){

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.dcd.server.core.domain.volume.exception

import com.dcd.server.core.common.error.BasicException
import com.dcd.server.core.common.error.ErrorCode

class AlreadyExistsVolumeMountException : BasicException(ErrorCode.ALREADY_EXISTS_VOLUME_MOUNT)
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.dcd.server.core.domain.volume.exception

import com.dcd.server.core.common.error.BasicException
import com.dcd.server.core.common.error.ErrorCode

class VolumeCopyFailureException : BasicException(ErrorCode.FAILURE_VOLUME_COPY)
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.dcd.server.core.domain.volume.exception

import com.dcd.server.core.common.error.BasicException
import com.dcd.server.core.common.error.ErrorCode

class VolumeCreationFailureException : BasicException(ErrorCode.FAILURE_VOLUME_CREATION)
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.dcd.server.core.domain.volume.exception

import com.dcd.server.core.common.error.BasicException
import com.dcd.server.core.common.error.ErrorCode

class VolumeDeleteFailureException : BasicException(ErrorCode.FAILURE_VOLUME_DELETE)
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.dcd.server.core.domain.volume.exception

import com.dcd.server.core.common.error.BasicException
import com.dcd.server.core.common.error.ErrorCode

class VolumeMountNotFoundException : BasicException(ErrorCode.VOLUME_MOUNT_NOT_FOUND)
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.dcd.server.core.domain.volume.exception

import com.dcd.server.core.common.error.BasicException
import com.dcd.server.core.common.error.ErrorCode

class VolumeNotFoundException : BasicException(ErrorCode.VOLUME_NOT_FOUND)
13 changes: 13 additions & 0 deletions src/main/kotlin/com/dcd/server/core/domain/volume/model/Volume.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.dcd.server.core.domain.volume.model

import com.dcd.server.core.domain.workspace.model.Workspace
import java.util.UUID

class Volume(
val id: UUID,
val name: String,
val description: String,
val workspace: Workspace
) {
val volumeName: String = "${name.replace(" ", "_")}-$id"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.dcd.server.core.domain.volume.model

import com.dcd.server.core.domain.application.model.Application
import java.util.UUID

class VolumeMount(
val application: Application,
val volume: Volume,
val mountPath: String,
val readOnly: Boolean
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.dcd.server.core.domain.volume.service

import com.dcd.server.core.domain.volume.model.Volume

interface CopyVolumeService {
fun copyVolumeContent(existingVolume: Volume, newVolume: Volume)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.dcd.server.core.domain.volume.service

import com.dcd.server.core.domain.volume.model.Volume

interface CreateVolumeService {
fun create(volume: Volume)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.dcd.server.core.domain.volume.service

import com.dcd.server.core.domain.volume.model.Volume

interface DeleteVolumeService {
fun deleteVolume(volume: Volume)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.dcd.server.core.domain.volume.service.impl

import com.dcd.server.core.common.command.CommandPort
import com.dcd.server.core.domain.volume.exception.VolumeCopyFailureException
import com.dcd.server.core.domain.volume.model.Volume
import com.dcd.server.core.domain.volume.service.CopyVolumeService
import com.dcd.server.core.domain.volume.service.DeleteVolumeService
import org.springframework.stereotype.Service

@Service
class CopyDockerVolumeServiceImpl(
private val commandPort: CommandPort,
private val deleteVolumeService: DeleteVolumeService
) : CopyVolumeService {
override fun copyVolumeContent(existingVolume: Volume, newVolume: Volume) {
val volumeCopyCmd =
"""
docker run --rm -it \
-v ${existingVolume.volumeName}:/from \
-v ${newVolume.volumeName}:/to \
alpine ash -c \"cp -a /from/. /to/\"
""".trimIndent()

val exitValue = commandPort.executeShellCommand(volumeCopyCmd)
if (exitValue != 0) {
deleteVolumeService.deleteVolume(newVolume)
throw VolumeCopyFailureException()
}
}
}
Loading