add provisioning of an additional k3s application

This commit is contained in:
jerger 2022-03-12 15:33:14 +01:00
parent a9b74342a7
commit a8c8864f75
8 changed files with 76 additions and 24 deletions

View file

@ -1,7 +1,9 @@
package org.domaindrivenarchitecture.provs.server.application package org.domaindrivenarchitecture.provs.server.application
import org.domaindrivenarchitecture.provs.framework.core.cli.createProvInstance import org.domaindrivenarchitecture.provs.framework.core.cli.createProvInstance
import org.domaindrivenarchitecture.provs.server.domain.provisionServer import org.domaindrivenarchitecture.provs.server.domain.ServerType
import org.domaindrivenarchitecture.provs.server.domain.k3s.K3sCliCommand
import org.domaindrivenarchitecture.provs.server.domain.k3s.provisionK3s
import kotlin.system.exitProcess import kotlin.system.exitProcess
@ -21,6 +23,7 @@ fun main(args: Array<String>) {
exitProcess(1) exitProcess(1)
} }
val prov = createProvInstance(cmd.target) val prov = createProvInstance(cmd.target)
provisionServer(prov, cmd) when(cmd.serverType) {
ServerType.K3S -> prov.provisionK3s(cmd as K3sCliCommand)
}
} }

View file

@ -7,6 +7,8 @@ import org.domaindrivenarchitecture.provs.configuration.domain.ConfigFileName
import org.domaindrivenarchitecture.provs.configuration.domain.TargetCliCommand import org.domaindrivenarchitecture.provs.configuration.domain.TargetCliCommand
import org.domaindrivenarchitecture.provs.server.domain.ServerCliCommand import org.domaindrivenarchitecture.provs.server.domain.ServerCliCommand
import org.domaindrivenarchitecture.provs.server.domain.ServerType import org.domaindrivenarchitecture.provs.server.domain.ServerType
import org.domaindrivenarchitecture.provs.server.domain.k3s.ApplicationFileName
import org.domaindrivenarchitecture.provs.server.domain.k3s.K3sCliCommand
class CliArgumentsParser(name: String) : CliTargetParser(name) { class CliArgumentsParser(name: String) : CliTargetParser(name) {
@ -21,19 +23,32 @@ class CliArgumentsParser(name: String) : CliTargetParser(name) {
val module = modules.first { it.parsed } val module = modules.first { it.parsed }
return ServerCliCommand( val serverType = ServerType.valueOf(module.name.uppercase())
ServerType.valueOf(module.name.uppercase()), when(serverType) {
TargetCliCommand( ServerType.K3S -> return K3sCliCommand(
target, ServerType.valueOf(module.name.uppercase()),
passwordInteractive TargetCliCommand(
), target,
module.configFileName passwordInteractive
) ),
module.configFileName,
module.applicationFileName
)
else -> return ServerCliCommand(
ServerType.valueOf(module.name.uppercase()),
TargetCliCommand(
target,
passwordInteractive
),
module.configFileName
)
}
} }
abstract class ServerSubcommand(name: String, description: String) : Subcommand(name, description) { abstract class ServerSubcommand(name: String, description: String) : Subcommand(name, description) {
var parsed: Boolean = false var parsed: Boolean = false
var configFileName: ConfigFileName? = null var configFileName: ConfigFileName? = null
var applicationFileName: ApplicationFileName? = null
} }
class K3s : ServerSubcommand("k3s", "the k3s module") { class K3s : ServerSubcommand("k3s", "the k3s module") {
@ -43,9 +58,16 @@ class CliArgumentsParser(name: String) : CliTargetParser(name) {
"c", "c",
"the filename containing the yaml config for k3s" "the filename containing the yaml config for k3s"
) )
val cliApplicationFileName by option(
ArgType.String,
"application-file",
"a",
"the filename containing the yaml a application deployment"
)
override fun execute() { override fun execute() {
super.configFileName = cliConfigFileName?.let { ConfigFileName(it) } super.configFileName = cliConfigFileName?.let { ConfigFileName(it) }
super.applicationFileName = cliApplicationFileName?.let { ApplicationFileName(it) }
super.parsed = true super.parsed = true
} }
} }

View file

@ -7,7 +7,7 @@ enum class ServerType {
K3D, K3S K3D, K3S
} }
class ServerCliCommand( open class ServerCliCommand(
val serverType: ServerType, val serverType: ServerType,
val target: TargetCliCommand, val target: TargetCliCommand,
val configFileName: ConfigFileName?,) val configFileName: ConfigFileName?,)

View file

@ -1,10 +0,0 @@
package org.domaindrivenarchitecture.provs.server.domain
import org.domaindrivenarchitecture.provs.framework.core.Prov
import org.domaindrivenarchitecture.provs.server.domain.k3s.provisionK3s
fun provisionServer(prov: Prov, cmd: ServerCliCommand) {
when(cmd.serverType) {
ServerType.K3S -> prov.provisionK3s(cmd.configFileName)
}
}

View file

@ -0,0 +1,9 @@
package org.domaindrivenarchitecture.provs.server.domain.k3s
import java.io.File
data class ApplicationFileName(val fileName: String) {
fun fullqualified() : String {
return File(fileName).absoluteFile.absolutePath
}
}

View file

@ -0,0 +1,14 @@
package org.domaindrivenarchitecture.provs.server.domain.k3s
import org.domaindrivenarchitecture.provs.configuration.domain.ConfigFileName
import org.domaindrivenarchitecture.provs.configuration.domain.TargetCliCommand
import org.domaindrivenarchitecture.provs.server.domain.ServerCliCommand
import org.domaindrivenarchitecture.provs.server.domain.ServerType
class K3sCliCommand (
serverType: ServerType,
target: TargetCliCommand,
configFileName: ConfigFileName?,
val applicationFileName: ApplicationFileName?) :
ServerCliCommand(serverType, target, configFileName) {
}

View file

@ -9,8 +9,8 @@ import org.domaindrivenarchitecture.provs.server.infrastructure.k3s.getK3sConfig
/** /**
* Installs a k3s server. * Installs a k3s server.
*/ */
fun Prov.provisionK3s(configFileName: ConfigFileName?) = task { fun Prov.provisionK3s(cli: K3sCliCommand) = task {
val k3sConfig: K3sConfig = getK3sConfig(configFileName) val k3sConfig: K3sConfig = getK3sConfig(cli.configFileName)
provisionNetwork(k3sConfig) provisionNetwork(k3sConfig)
if (k3sConfig.reprovision && testConfigExists()) { if (k3sConfig.reprovision && testConfigExists()) {
@ -25,5 +25,8 @@ fun Prov.provisionK3s(configFileName: ConfigFileName?) = task {
if (k3sConfig.echo == true) { if (k3sConfig.echo == true) {
provisionK3sEcho(k3sConfig.fqdn, k3sConfig.certmanager?.letsencryptEndpoint) provisionK3sEcho(k3sConfig.fqdn, k3sConfig.certmanager?.letsencryptEndpoint)
} }
if (cli.applicationFileName != null) {
provisionK3sApplication(cli.applicationFileName)
}
ProvResult(true) ProvResult(true)
} }

View file

@ -5,6 +5,7 @@ import org.domaindrivenarchitecture.provs.framework.core.ProvResult
import org.domaindrivenarchitecture.provs.framework.core.repeatTaskUntilSuccess import org.domaindrivenarchitecture.provs.framework.core.repeatTaskUntilSuccess
import org.domaindrivenarchitecture.provs.framework.ubuntu.filesystem.base.* import org.domaindrivenarchitecture.provs.framework.ubuntu.filesystem.base.*
import org.domaindrivenarchitecture.provs.server.domain.CertmanagerEndpoint import org.domaindrivenarchitecture.provs.server.domain.CertmanagerEndpoint
import org.domaindrivenarchitecture.provs.server.domain.k3s.ApplicationFileName
import org.domaindrivenarchitecture.provs.server.domain.k3s.Certmanager import org.domaindrivenarchitecture.provs.server.domain.k3s.Certmanager
import org.domaindrivenarchitecture.provs.server.domain.k3s.K3sConfig import org.domaindrivenarchitecture.provs.server.domain.k3s.K3sConfig
@ -174,3 +175,13 @@ fun Prov.provisionK3sEcho(fqdn: String, endpoint: CertmanagerEndpoint? = null) =
) )
cmd("kubectl apply -f $k3sEcho", sudo = true) cmd("kubectl apply -f $k3sEcho", sudo = true)
} }
fun Prov.provisionK3sApplication(applicationFileName: ApplicationFileName) = task {
copyFileFromLocal(
fullyQualifiedLocalFilename = applicationFileName.fullqualified(),
fullyQualifiedFilename = k3sManualManifestsDir + "application.yaml",
posixFilePermission = "644",
sudo = true
)
cmd("kubectl apply -f ${k3sManualManifestsDir}application.yaml", sudo = true)
}