Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
42 changes: 36 additions & 6 deletions src/main/kotlin/com/dcd/server/core/common/file/FileContent.kt
Original file line number Diff line number Diff line change
@@ -1,57 +1,80 @@
package com.dcd.server.core.common.file

import com.dcd.server.core.domain.application.model.Application
import com.dcd.server.core.domain.application.model.enums.ApplicationType
import java.lang.StringBuilder

object FileContent {
fun getSpringBootDockerFileContent(version: String, port: Int, env: Map<String, String>): String =
fun getApplicationDockerFileContent(
applicationType: ApplicationType,
version: String,
port: Int,
env: Map<String, String>,
initialScripts: List<String>
): String =
when(applicationType) {
ApplicationType.SPRING_BOOT -> getSpringBootDockerFileContent(version, port, env, initialScripts)
ApplicationType.NEST_JS -> getNestJsDockerFileContent(version, port, env, initialScripts)
ApplicationType.MYSQL -> getMYSQLDockerFileContent(version, port, env, initialScripts)
ApplicationType.MARIA_DB -> getMARIADBDockerFileContent(version, port, env, initialScripts)
ApplicationType.H2_DB -> getH2DBDockerFileContent(version, port, env, initialScripts)
ApplicationType.REDIS -> getRedisDockerFileContent(version, port, env, initialScripts)
}

private fun getSpringBootDockerFileContent(version: String, port: Int, env: Map<String, String>, initialScripts: List<String>): String =
"""
FROM openjdk:${version}-jdk
COPY build/libs/*.jar build/libs/
RUN rm -f build/libs/*-plain.jar
RUN mv build/libs/*.jar build/libs/app.jar
EXPOSE $port
${getEnvString(env)}
${getInitialScriptsString(initialScripts)}
CMD ["java", "-jar", "build/libs/app.jar"]
""".trimIndent()

fun getNestJsDockerFileContent(version: String, port: Int, env: Map<String, String>): String =
private fun getNestJsDockerFileContent(version: String, port: Int, env: Map<String, String>, initialScripts: List<String>): String =
"""
FROM node:${version}
COPY . .
RUN npm install
RUN npm run build
EXPOSE $port
${getEnvString(env)}
${getInitialScriptsString(initialScripts)}
CMD ["npm", "start"]
""".trimIndent()

fun getMYSQLDockerFileContent(version: String, port: Int, env: Map<String, String>): String =
private fun getMYSQLDockerFileContent(version: String, port: Int, env: Map<String, String>, initialScripts: List<String>): String =
"""
FROM mysql:${version}
EXPOSE $port
${getEnvString(env)}
${getInitialScriptsString(initialScripts)}
""".trimIndent()

fun getMARIADBDockerFileContent(version: String, port: Int, env: Map<String, String>): String =
private fun getMARIADBDockerFileContent(version: String, port: Int, env: Map<String, String>, initialScripts: List<String>): String =
"""
FROM mariadb:${version}
EXPOSE $port
${getEnvString(env)}
${getInitialScriptsString(initialScripts)}
""".trimIndent()

fun getRedisDockerFileContent(version: String, port: Int, env: Map<String, String>): String =
private fun getRedisDockerFileContent(version: String, port: Int, env: Map<String, String>, initialScripts: List<String>): String =
"""
FROM redis:${version}
EXPOSE $port
${getEnvString(env)}
${getInitialScriptsString(initialScripts)}
""".trimIndent()

fun getH2DBDockerFileContent(version: String, port: Int, env: Map<String, String>): String =
private fun getH2DBDockerFileContent(version: String, port: Int, env: Map<String, String>, initialScripts: List<String>): String =
"""
FROM oscarfonts/h2:${version}
EXPOSE $port
${getEnvString(env)}
${getInitialScriptsString(initialScripts)}
""".trimIndent()

fun getImageVersionShellScriptContent(imageName: String, minVersion: String): String {
Expand Down Expand Up @@ -141,4 +164,11 @@ object FileContent {
return envString.toString()
}

private fun getInitialScriptsString(initialScripts: List<String>): String {
val initialScriptString = StringBuilder()
for (initialScript in initialScripts) {
initialScriptString.append("RUN $initialScript\n")
}
return initialScriptString.toString()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ import com.dcd.server.core.domain.application.event.ChangeApplicationStatusEvent
import com.dcd.server.core.domain.application.exception.ApplicationNotFoundException
import com.dcd.server.core.domain.application.model.Application
import com.dcd.server.core.domain.application.model.enums.ApplicationStatus
import com.dcd.server.core.domain.application.model.enums.ApplicationType
import com.dcd.server.core.domain.application.service.CreateDockerFileService
import com.dcd.server.core.domain.application.spi.CheckExitValuePort
import com.dcd.server.core.domain.application.spi.QueryApplicationInitialScriptPort
import com.dcd.server.core.domain.application.spi.QueryApplicationPort
import com.dcd.server.core.domain.application.util.FailureCase
import com.dcd.server.core.domain.env.spi.QueryApplicationEnvPort
Expand All @@ -26,6 +26,7 @@ import java.io.IOException
class CreateDockerFileServiceImpl(
private val queryApplicationPort: QueryApplicationPort,
private val queryApplicationEnvPort: QueryApplicationEnvPort,
private val queryApplicationInitialScriptPort: QueryApplicationInitialScriptPort,
private val commandPort: CommandPort,
private val checkExitValuePort: CheckExitValuePort,
private val eventPublisher: ApplicationEventPublisher,
Expand Down Expand Up @@ -57,6 +58,11 @@ class CreateDockerFileServiceImpl(
it.key to it.value
}

val initialScripts =
queryApplicationInitialScriptPort
.findAllByApplication(application)
.map { it.script }

commandPort.executeShellCommand("mkdir -p $directoryName")
.also {exitValue ->
if (exitValue != 0)
Expand All @@ -65,25 +71,15 @@ class CreateDockerFileServiceImpl(
}

val file = File("./${application.name}/Dockerfile")
val fileContent = when (application.applicationType) {
ApplicationType.SPRING_BOOT ->
FileContent.getSpringBootDockerFileContent(version, application.port, applicationEnv)

ApplicationType.MYSQL ->
FileContent.getMYSQLDockerFileContent(version, application.port, applicationEnv)

ApplicationType.MARIA_DB ->
FileContent.getMARIADBDockerFileContent(version, application.port, applicationEnv)
val fileContent =
FileContent.getApplicationDockerFileContent(
application.applicationType,
version,
application.port,
applicationEnv,
initialScripts
)

ApplicationType.REDIS ->
FileContent.getRedisDockerFileContent(version, application.port, applicationEnv)

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

ApplicationType.H2_DB ->
FileContent.getH2DBDockerFileContent(version, application.port, applicationEnv)
}
try {
if (!file.exists())
file.createNewFile()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import com.dcd.server.core.domain.application.service.impl.CreateDockerFileServi
import com.dcd.server.core.domain.application.spi.QueryApplicationPort
import com.dcd.server.infrastructure.global.command.adapter.CommandAdapter
import com.dcd.server.core.domain.application.spi.CheckExitValuePort
import com.dcd.server.core.domain.application.spi.QueryApplicationInitialScriptPort
import com.dcd.server.core.domain.env.spi.QueryApplicationEnvPort
import io.kotest.core.spec.style.BehaviorSpec
import io.kotest.matchers.shouldBe
Expand All @@ -21,16 +22,18 @@ import java.io.File
class CreateDockerFileServiceImplTest : BehaviorSpec({
val queryApplicationPort = mockk<QueryApplicationPort>()
val queryApplicationEnvPort = mockk<QueryApplicationEnvPort>()
val queryApplicationInitialScriptPort = mockk<QueryApplicationInitialScriptPort>()
val commandPort = spyk(CommandAdapter())
val eventPublisher = mockk<ApplicationEventPublisher>(relaxed = true)
val checkExitValuePort = mockk<CheckExitValuePort>(relaxUnitFun = true)
val encryptPort = mockk<EncryptPort>()
val createDockerFileService = CreateDockerFileServiceImpl(queryApplicationPort, queryApplicationEnvPort, commandPort, checkExitValuePort, eventPublisher, encryptPort)
val createDockerFileService = CreateDockerFileServiceImpl(queryApplicationPort, queryApplicationEnvPort, queryApplicationInitialScriptPort, commandPort, checkExitValuePort, eventPublisher, encryptPort)

given("μŠ€ν”„λ§ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ£Όμ–΄μ§€κ³ ") {
val application =
ApplicationGenerator.generateApplication(applicationType = ApplicationType.SPRING_BOOT)
every { queryApplicationEnvPort.findByApplication(application) } returns emptyList()
every { queryApplicationInitialScriptPort.findAllByApplication(application) } returns emptyList()

`when`("μ„œλΉ„μŠ€λ₯Ό μ‹€ν–‰ν• λ•Œ") {
createDockerFileService.createFileToApplication(application, application.version)
Expand All @@ -48,7 +51,7 @@ class CreateDockerFileServiceImplTest : BehaviorSpec({
}
actualFileContent.deleteAt(actualFileContent.length - 1)

actualFileContent.toString() shouldBe FileContent.getSpringBootDockerFileContent(application.version, application.port, emptyMap())
actualFileContent.toString() shouldBe FileContent.getApplicationDockerFileContent(application.applicationType, application.version, application.port, emptyMap(), listOf())
}
}

Expand All @@ -59,6 +62,7 @@ class CreateDockerFileServiceImplTest : BehaviorSpec({
val application =
ApplicationGenerator.generateApplication(applicationType = ApplicationType.REDIS)
every { queryApplicationEnvPort.findByApplication(application) } returns emptyList()
every { queryApplicationInitialScriptPort.findAllByApplication(application) } returns emptyList()

`when`("μ„œλΉ„μŠ€λ₯Ό μ‹€ν–‰ν• λ•Œ") {
createDockerFileService.createFileToApplication(application, application.version)
Expand All @@ -75,7 +79,7 @@ class CreateDockerFileServiceImplTest : BehaviorSpec({
actualFileContent.append(it + "\n")
}

actualFileContent.toString() shouldBe FileContent.getRedisDockerFileContent(application.version, application.port, emptyMap())
actualFileContent.toString() shouldBe FileContent.getApplicationDockerFileContent(application.applicationType, application.version, application.port, emptyMap(), listOf())
}
}

Expand All @@ -86,6 +90,7 @@ class CreateDockerFileServiceImplTest : BehaviorSpec({
val application =
ApplicationGenerator.generateApplication(applicationType = ApplicationType.MYSQL)
every { queryApplicationEnvPort.findByApplication(application) } returns emptyList()
every { queryApplicationInitialScriptPort.findAllByApplication(application) } returns emptyList()

`when`("μ„œλΉ„μŠ€λ₯Ό μ‹€ν–‰ν• λ•Œ") {
createDockerFileService.createFileToApplication(application, application.version)
Expand All @@ -102,7 +107,7 @@ class CreateDockerFileServiceImplTest : BehaviorSpec({
actualFileContent.append(it + "\n")
}

actualFileContent.toString() shouldBe FileContent.getMYSQLDockerFileContent(application.version, application.port, emptyMap())
actualFileContent.toString() shouldBe FileContent.getApplicationDockerFileContent(application.applicationType, application.version, application.port, emptyMap(), listOf())
}
}

Expand All @@ -113,6 +118,7 @@ class CreateDockerFileServiceImplTest : BehaviorSpec({
val application =
ApplicationGenerator.generateApplication(applicationType = ApplicationType.MARIA_DB)
every { queryApplicationEnvPort.findByApplication(application) } returns emptyList()
every { queryApplicationInitialScriptPort.findAllByApplication(application) } returns emptyList()

`when`("μ„œλΉ„μŠ€λ₯Ό μ‹€ν–‰ν• λ•Œ") {
createDockerFileService.createFileToApplication(application, application.version)
Expand All @@ -129,7 +135,7 @@ class CreateDockerFileServiceImplTest : BehaviorSpec({
actualFileContent.append(it + "\n")
}

actualFileContent.toString() shouldBe FileContent.getMARIADBDockerFileContent(application.version, application.port, emptyMap())
actualFileContent.toString() shouldBe FileContent.getApplicationDockerFileContent(application.applicationType, application.version, application.port, emptyMap(), listOf())
}
}

Expand Down