add grafana only option

This commit is contained in:
ansgarz 2022-05-09 15:41:01 +02:00
parent d686349a68
commit 7590e2df2e
7 changed files with 99 additions and 25 deletions

View file

@ -9,7 +9,7 @@ private const val USER_HOST_DELIMITER = "@"
private const val USER_PW_DELIMITER = ":"
class TargetCliCommand(
data class TargetCliCommand(
val target: String,
val passwordInteractive: Boolean = false
) {

View file

@ -9,6 +9,7 @@ import org.domaindrivenarchitecture.provs.server.domain.ServerCliCommand
import org.domaindrivenarchitecture.provs.server.domain.ServerType
import org.domaindrivenarchitecture.provs.server.domain.k3s.ApplicationFileName
import org.domaindrivenarchitecture.provs.server.domain.k3s.K3sCliCommand
import org.domaindrivenarchitecture.provs.server.domain.k3s.ServerSubmodule
class CliArgumentsParser(name: String) : CliTargetParser(name) {
@ -32,7 +33,8 @@ class CliArgumentsParser(name: String) : CliTargetParser(name) {
passwordInteractive
),
module.configFileName,
module.applicationFileName
module.applicationFileName,
module.submodules
)
else -> return ServerCliCommand(
ServerType.valueOf(module.name.uppercase()),
@ -49,6 +51,7 @@ class CliArgumentsParser(name: String) : CliTargetParser(name) {
var parsed: Boolean = false
var configFileName: ConfigFileName? = null
var applicationFileName: ApplicationFileName? = null
var submodules: List<String>? = null
}
class K3s : ServerSubcommand("k3s", "the k3s module") {
@ -64,10 +67,17 @@ class CliArgumentsParser(name: String) : CliTargetParser(name) {
"a",
"the filename containing the yaml a application deployment"
)
val only by option(
ArgType.Choice<ServerSubmodule>(),
"only",
"o",
"provisions only parts ",
)
override fun execute() {
super.configFileName = cliConfigFileName?.let { ConfigFileName(it) }
super.applicationFileName = cliApplicationFileName?.let { ApplicationFileName(it) }
super.submodules = if (only != null) listOf(only!!.name.lowercase()) else null
super.parsed = true
}
}

View file

@ -5,10 +5,13 @@ import org.domaindrivenarchitecture.provs.configuration.domain.TargetCliCommand
import org.domaindrivenarchitecture.provs.server.domain.ServerCliCommand
import org.domaindrivenarchitecture.provs.server.domain.ServerType
class K3sCliCommand (
class K3sCliCommand(
serverType: ServerType,
target: TargetCliCommand,
configFileName: ConfigFileName?,
val applicationFileName: ApplicationFileName?) :
ServerCliCommand(serverType, target, configFileName) {
}
val applicationFileName: ApplicationFileName?,
val submodules: List<String>? = null
) :
ServerCliCommand(
serverType, target, configFileName
)

View file

@ -4,34 +4,51 @@ import org.domaindrivenarchitecture.provs.framework.core.Prov
import org.domaindrivenarchitecture.provs.server.domain.k8s_grafana_agent.GrafanaAgentConfigResolved
import org.domaindrivenarchitecture.provs.server.domain.k8s_grafana_agent.provisionGrafanaAgent
import org.domaindrivenarchitecture.provs.server.infrastructure.*
import kotlin.system.exitProcess
/**
* Installs a k3s server.
*/
fun Prov.provisionK3s(cli: K3sCliCommand) = task {
val k3sConfig: K3sConfig = getK3sConfig(cli.configFileName)
val grafanaConfigResolved: GrafanaAgentConfigResolved? = findK8sGrafanaConfig(cli.configFileName)?.resolveSecret()
provisionNetwork(k3sConfig)
if (k3sConfig.reprovision && testConfigExists()) {
deprovisionK3sInfra()
if (cli.submodules == null) {
provisionNetwork(k3sConfig)
if (k3sConfig.reprovision && testConfigExists()) {
deprovisionK3sInfra()
}
installK3s(k3sConfig)
if (k3sConfig.certmanager != null) {
provisionK3sCertManager(k3sConfig.certmanager)
}
if (k3sConfig.echo == true) {
provisionK3sEcho(k3sConfig.fqdn, k3sConfig.certmanager?.letsencryptEndpoint)
}
if (grafanaConfigResolved != null) {
provisionGrafanaAgent(grafanaConfigResolved)
}
if (cli.applicationFileName != null) {
provisionK3sApplication(cli.applicationFileName)
}
} else {
provisionMeissaDesktopSubmodules(cli.submodules, grafanaConfigResolved)
}
installK3s(k3sConfig)
}
if (k3sConfig.certmanager != null) {
provisionK3sCertManager(k3sConfig.certmanager)
}
if (k3sConfig.echo == true) {
provisionK3sEcho(k3sConfig.fqdn, k3sConfig.certmanager?.letsencryptEndpoint)
}
if (grafanaConfigResolved != null) {
private fun Prov.provisionMeissaDesktopSubmodules(submodules: List<String>, grafanaConfigResolved: GrafanaAgentConfigResolved?) = task {
if (submodules.contains(ServerSubmodule.GRAFANA.name.lowercase())) {
if (grafanaConfigResolved == null) {
println("ERROR: Could not find grafana config.")
exitProcess(7)
}
provisionGrafanaAgent(grafanaConfigResolved)
}
if (cli.applicationFileName != null) {
provisionK3sApplication(cli.applicationFileName)
}
}

View file

@ -0,0 +1,5 @@
package org.domaindrivenarchitecture.provs.server.domain.k3s
enum class ServerSubmodule {
GRAFANA
}

View file

@ -1,5 +1,6 @@
package org.domaindrivenarchitecture.provs.server.infrastructure
import com.charleskorn.kaml.MissingRequiredPropertyException
import org.domaindrivenarchitecture.provs.configuration.domain.ConfigFileName
import org.domaindrivenarchitecture.provs.framework.core.readFromFile
import org.domaindrivenarchitecture.provs.framework.core.toYaml
@ -18,7 +19,11 @@ fun findK8sGrafanaConfig(fileName: ConfigFileName? = null): GrafanaAgentConfig?
// create a default config
return if (File(filePath).exists()) {
readFromFile(filePath).yamlToType<GrafanaAgentConfigHolder>().grafana
try {
readFromFile(filePath).yamlToType<GrafanaAgentConfigHolder>().grafana
} catch (e: MissingRequiredPropertyException) {
null
}
} else {
null
}

View file

@ -1,8 +1,12 @@
package org.domaindrivenarchitecture.provs.server.application
import org.domaindrivenarchitecture.provs.configuration.domain.TargetCliCommand
import org.domaindrivenarchitecture.provs.server.domain.ServerType
import org.domaindrivenarchitecture.provs.server.domain.k3s.ApplicationFileName
import org.domaindrivenarchitecture.provs.server.domain.k3s.K3sCliCommand
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.Assertions.*
internal class CliArgumentParserTest {
@ -18,4 +22,34 @@ internal class CliArgumentParserTest {
assertTrue(result.isValid())
assertEquals(ServerType.K3S, result.serverType)
}
@Test
fun test_parseServerArguments_are_valid_for_k3s_withOnly_grafana() {
// given
val parser = CliArgumentsParser("test")
// when
val result: K3sCliCommand = parser.parseCommand(args = arrayOf("k3s", "local", "-o", "grafana")) as K3sCliCommand
// then
assertTrue(result.isValid())
assertEquals(ServerType.K3S, result.serverType)
assertEquals(listOf("grafana"), result.submodules)
assertEquals(TargetCliCommand("local"), result.target)
}
@Test
fun test_parseServerArguments_are_valid_for_k3s_remote_with_application_yaml() {
// given
val parser = CliArgumentsParser("test")
// when
val result: K3sCliCommand = parser.parseCommand(args = arrayOf("k3s", "user@host.com", "-a", "app.yaml")) as K3sCliCommand
// then
assertTrue(result.isValid())
assertEquals(ServerType.K3S, result.serverType)
assertEquals(ApplicationFileName("app.yaml"), result.applicationFileName)
assertEquals(TargetCliCommand("user@host.com"), result.target)
}
}