From 7590e2df2eb4562edfe62f4f3a50cc48757c5d47 Mon Sep 17 00:00:00 2001 From: ansgarz Date: Mon, 9 May 2022 15:41:01 +0200 Subject: [PATCH] add grafana only option --- .../configuration/domain/CliTargetCommand.kt | 2 +- .../server/application/CliArgumentsParser.kt | 12 ++++- .../provs/server/domain/k3s/K3sCliCommand.kt | 11 ++-- .../provs/server/domain/k3s/K3sService.kt | 51 ++++++++++++------- .../server/domain/k3s/ServerSubModule.kt | 5 ++ .../infrastructure/GrafanaAgentRepository.kt | 7 ++- .../application/CliArgumentParserTest.kt | 36 ++++++++++++- 7 files changed, 99 insertions(+), 25 deletions(-) create mode 100644 src/main/kotlin/org/domaindrivenarchitecture/provs/server/domain/k3s/ServerSubModule.kt diff --git a/src/main/kotlin/org/domaindrivenarchitecture/provs/configuration/domain/CliTargetCommand.kt b/src/main/kotlin/org/domaindrivenarchitecture/provs/configuration/domain/CliTargetCommand.kt index 0cffca0..4814c0a 100644 --- a/src/main/kotlin/org/domaindrivenarchitecture/provs/configuration/domain/CliTargetCommand.kt +++ b/src/main/kotlin/org/domaindrivenarchitecture/provs/configuration/domain/CliTargetCommand.kt @@ -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 ) { diff --git a/src/main/kotlin/org/domaindrivenarchitecture/provs/server/application/CliArgumentsParser.kt b/src/main/kotlin/org/domaindrivenarchitecture/provs/server/application/CliArgumentsParser.kt index 429f3da..f6e5b3e 100644 --- a/src/main/kotlin/org/domaindrivenarchitecture/provs/server/application/CliArgumentsParser.kt +++ b/src/main/kotlin/org/domaindrivenarchitecture/provs/server/application/CliArgumentsParser.kt @@ -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? = 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(), + "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 } } diff --git a/src/main/kotlin/org/domaindrivenarchitecture/provs/server/domain/k3s/K3sCliCommand.kt b/src/main/kotlin/org/domaindrivenarchitecture/provs/server/domain/k3s/K3sCliCommand.kt index 9d78d86..fda6571 100644 --- a/src/main/kotlin/org/domaindrivenarchitecture/provs/server/domain/k3s/K3sCliCommand.kt +++ b/src/main/kotlin/org/domaindrivenarchitecture/provs/server/domain/k3s/K3sCliCommand.kt @@ -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) { -} \ No newline at end of file + val applicationFileName: ApplicationFileName?, + val submodules: List? = null +) : + ServerCliCommand( + serverType, target, configFileName + ) \ No newline at end of file diff --git a/src/main/kotlin/org/domaindrivenarchitecture/provs/server/domain/k3s/K3sService.kt b/src/main/kotlin/org/domaindrivenarchitecture/provs/server/domain/k3s/K3sService.kt index d49a209..8fb395f 100644 --- a/src/main/kotlin/org/domaindrivenarchitecture/provs/server/domain/k3s/K3sService.kt +++ b/src/main/kotlin/org/domaindrivenarchitecture/provs/server/domain/k3s/K3sService.kt @@ -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, 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) - } } diff --git a/src/main/kotlin/org/domaindrivenarchitecture/provs/server/domain/k3s/ServerSubModule.kt b/src/main/kotlin/org/domaindrivenarchitecture/provs/server/domain/k3s/ServerSubModule.kt new file mode 100644 index 0000000..de420d1 --- /dev/null +++ b/src/main/kotlin/org/domaindrivenarchitecture/provs/server/domain/k3s/ServerSubModule.kt @@ -0,0 +1,5 @@ +package org.domaindrivenarchitecture.provs.server.domain.k3s + +enum class ServerSubmodule { + GRAFANA +} diff --git a/src/main/kotlin/org/domaindrivenarchitecture/provs/server/infrastructure/GrafanaAgentRepository.kt b/src/main/kotlin/org/domaindrivenarchitecture/provs/server/infrastructure/GrafanaAgentRepository.kt index abcb106..7e53b87 100644 --- a/src/main/kotlin/org/domaindrivenarchitecture/provs/server/infrastructure/GrafanaAgentRepository.kt +++ b/src/main/kotlin/org/domaindrivenarchitecture/provs/server/infrastructure/GrafanaAgentRepository.kt @@ -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().grafana + try { + readFromFile(filePath).yamlToType().grafana + } catch (e: MissingRequiredPropertyException) { + null + } } else { null } diff --git a/src/test/kotlin/org/domaindrivenarchitecture/provs/server/application/CliArgumentParserTest.kt b/src/test/kotlin/org/domaindrivenarchitecture/provs/server/application/CliArgumentParserTest.kt index 0cf0779..a6cac4f 100644 --- a/src/test/kotlin/org/domaindrivenarchitecture/provs/server/application/CliArgumentParserTest.kt +++ b/src/test/kotlin/org/domaindrivenarchitecture/provs/server/application/CliArgumentParserTest.kt @@ -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) + } } \ No newline at end of file