refactorings, reformats, minor fixes, update docs

This commit is contained in:
ansgarz 2024-08-16 11:53:46 +02:00
parent 277302d0ee
commit 469f864339
7 changed files with 93 additions and 69 deletions

View file

@ -6,7 +6,10 @@
## Purpose ## Purpose
provs provides cli-based tools for provs provides cli-based tools for
* provisioning a desktop (various kinds) * provisioning desktop software for different desktop types:
* basic
* office
* IDE
* provisioning a k3s server * provisioning a k3s server
* performing system checks * performing system checks

View file

@ -18,39 +18,10 @@ fun Prov.installDevOps() = task {
installGraalVM() installGraalVM()
} }
fun Prov.installGraalVM():ProvResult = task{
val version = "21.0.2"
val tmpDir = "~/tmp"
val filename = "graalvm-community-jdk-"
val additionalPartFilename = "_linux-x64_bin"
val packedFilename = "$filename$version$additionalPartFilename.tar.gz"
val extractedFilenameHunch = "graalvm-community-openjdk-"
val installationPath = "/usr/lib/jvm/"
if ( !chk("/usr/local/bin/native-image --version") || version != cmd("/usr/local/bin/native-image --version|awk 'NR==1 {print $2}").out?.trim() || !chk("ls -d $installationPath$extractedFilenameHunch$version*")) {
downloadFromURL(
"https://github.com/graalvm/graalvm-ce-builds/releases/download/jdk-$version/$packedFilename",
path = tmpDir,
sha256sum = "b048069aaa3a99b84f5b957b162cc181a32a4330cbc35402766363c5be76ae48"
)
if (!chk("ls -d $installationPath"))
cmd("sudo mkdir $installationPath")
else {
ProvResult(true, out = "$installationPath just exists, mkdir not necessary.")
}
cmd("sudo tar -C $installationPath -xzf $packedFilename", tmpDir)
val graalInstPath = installationPath + (cmd("ls /usr/lib/jvm/|grep -e graalvm-community-openjdk-$version").out?.replace("\n", ""))
cmd("sudo ln -s $graalInstPath/lib/svm/bin/native-image /usr/local/bin/native-image")
cmd("/usr/local/bin/native-image --version")
} else {
ProvResult(true, out = "GraalVM $version already installed")
}
}
fun Prov.installYq( fun Prov.installYq(
version: String = "4.13.2", version: String = "4.13.2",
sha256sum: String = "d7c89543d1437bf80fee6237eadc608d1b121c21a7cbbe79057d5086d74f8d79" sha256sum: String = "d7c89543d1437bf80fee6237eadc608d1b121c21a7cbbe79057d5086d74f8d79"
): ProvResult = task { ) = task {
val path = "/usr/bin/" val path = "/usr/bin/"
val filename = "yq" val filename = "yq"
if (!checkFile(path + filename)) { if (!checkFile(path + filename)) {
@ -67,7 +38,7 @@ fun Prov.installYq(
} }
} }
fun Prov.installKubectlAndTools(): ProvResult = task { fun Prov.installKubectlAndTools() = task {
task("installKubectl") { task("installKubectl") {
if (!checkFile(KUBE_CONFIG_CONTEXT_SCRIPT)) { if (!checkFile(KUBE_CONFIG_CONTEXT_SCRIPT)) {
@ -105,7 +76,7 @@ fun Prov.installKubeconform() = task {
} }
} }
fun Prov.installKubectl(): ProvResult = task { fun Prov.installKubectl() = task {
// see https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/ // see https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/
val kubectlVersion = "1.27.4" val kubectlVersion = "1.27.4"
@ -126,13 +97,13 @@ fun Prov.installKubectl(): ProvResult = task {
cmd("sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl", dir = tmpDir) cmd("sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl", dir = tmpDir)
} }
fun Prov.configureKubectlBashCompletion(): ProvResult = task { fun Prov.configureKubectlBashCompletion() = task {
cmd("kubectl completion bash >> /etc/bash_completion.d/kubernetes", sudo = true) cmd("kubectl completion bash >> /etc/bash_completion.d/kubernetes", sudo = true)
createDir(".bashrc.d") createDir(".bashrc.d")
createFileFromResource(KUBE_CONFIG_CONTEXT_SCRIPT, "kubectl.sh", RESOURCE_PATH) createFileFromResource(KUBE_CONFIG_CONTEXT_SCRIPT, "kubectl.sh", RESOURCE_PATH)
} }
fun Prov.installDevopsScripts() { fun Prov.installDevopsScripts() = task {
task("install ssh helper") { task("install ssh helper") {
createFileFromResource( createFileFromResource(
@ -174,7 +145,7 @@ fun Prov.installDevopsScripts() {
} }
} }
fun Prov.installTerraform(): ProvResult = task { fun Prov.installTerraform() = task {
val dir = "/usr/lib/tfenv/" val dir = "/usr/lib/tfenv/"
if (!checkDir(dir)) { if (!checkDir(dir)) {

View file

@ -0,0 +1,40 @@
package org.domaindrivenarchitecture.provs.desktop.infrastructure
import org.domaindrivenarchitecture.provs.framework.core.Prov
import org.domaindrivenarchitecture.provs.framework.core.ProvResult
import org.domaindrivenarchitecture.provs.framework.ubuntu.web.base.downloadFromURL
const val GRAAL_VM_VERSION = "21.0.2"
fun Prov.installGraalVM() = taskWithResult {
val tmpDir = "~/tmp"
val filename = "graalvm-community-jdk-"
val additionalPartFilename = "_linux-x64_bin"
val packedFilename = "$filename$GRAAL_VM_VERSION$additionalPartFilename.tar.gz"
val extractedFilenameHunch = "graalvm-community-openjdk-"
val installationPath = "/usr/lib/jvm/"
if ( GRAAL_VM_VERSION != graalVMVersion() || !chk("ls -d $installationPath$extractedFilenameHunch$GRAAL_VM_VERSION*")) {
downloadFromURL(
"https://github.com/graalvm/graalvm-ce-builds/releases/download/jdk-$GRAAL_VM_VERSION/$packedFilename",
path = tmpDir,
sha256sum = "b048069aaa3a99b84f5b957b162cc181a32a4330cbc35402766363c5be76ae48"
)
if (!chk("ls -d $installationPath"))
cmd("sudo mkdir $installationPath")
else {
ProvResult(true, out = "$installationPath just exists, mkdir not necessary.")
}
cmd("sudo tar -C $installationPath -xzf $packedFilename", tmpDir)
val graalInstPath = installationPath + (cmd("ls /usr/lib/jvm/|grep -e graalvm-community-openjdk-$GRAAL_VM_VERSION").out?.replace("\n", ""))
cmd("sudo ln -sf $graalInstPath/lib/svm/bin/native-image /usr/local/bin/native-image")
cmd("/usr/local/bin/native-image --version")
} else {
ProvResult(true, out = "GraalVM $GRAAL_VM_VERSION already installed")
}
}
fun Prov.graalVMVersion(): String {
return cmdNoEval("/usr/local/bin/native-image --version|awk 'NR==1 {print $2}'").out?.trim() ?: ""
}

View file

@ -80,8 +80,8 @@ open class Prov protected constructor(
} }
/** /**
* A task is the base execution unit in provs. In the results overview it is represented by one line resp. result (of either success or failure). * A task is the fundamental execution unit. In the results overview it is represented by one line with a success or failure result.
* Returns success if no sub-tasks are called or if all subtasks finish with success. * Returns success if all sub-tasks finished with success or if no sub-tasks are called at all.
*/ */
fun task(name: String? = null, taskLambda: Prov.() -> Unit): ProvResult { fun task(name: String? = null, taskLambda: Prov.() -> Unit): ProvResult {
printDeprecationWarningIfLevel0("task") printDeprecationWarningIfLevel0("task")
@ -89,8 +89,10 @@ open class Prov protected constructor(
} }
/** /**
* Same as task but the provided lambda is explicitly required to provide a ProvResult to be returned. * Same as task above but the lambda parameter must have a ProvResult as return type.
* The returned result is included in the evaluation. * The returned ProvResult is included in the success resp. failure evaluation,
* i.e. if the returned ProvResult from the lambda fails, the returned ProvResult from
* taskWithResult also fails, else success depends on potentially called sub-tasks.
*/ */
fun taskWithResult(name: String? = null, taskLambda: Prov.() -> ProvResult): ProvResult { fun taskWithResult(name: String? = null, taskLambda: Prov.() -> ProvResult): ProvResult {
printDeprecationWarningIfLevel0("taskWithResult") printDeprecationWarningIfLevel0("taskWithResult")
@ -98,27 +100,27 @@ open class Prov protected constructor(
} }
/** /**
* defines a task, which returns the returned result, the results of sub-tasks are not considered * defines a task, which returns the returned result from the lambda, the results of sub-tasks are not considered
*/ */
fun requireLast(name: String? = null, a: Prov.() -> ProvResult): ProvResult { fun requireLast(name: String? = null, taskLambda: Prov.() -> ProvResult): ProvResult {
printDeprecationWarningIfLevel0("requireLast") printDeprecationWarningIfLevel0("requireLast")
return evaluate(ResultMode.LAST, name) { a() } return evaluate(ResultMode.LAST, name) { taskLambda() }
} }
/** /**
* defines a task, which always returns success * Defines a task, which always returns success.
*/ */
fun optional(name: String? = null, a: Prov.() -> ProvResult): ProvResult { fun optional(name: String? = null, taskLambda: Prov.() -> ProvResult): ProvResult {
printDeprecationWarningIfLevel0("optional") printDeprecationWarningIfLevel0("optional")
return evaluate(ResultMode.OPTIONAL, name) { a() } return evaluate(ResultMode.OPTIONAL, name) { taskLambda() }
} }
/** /**
* defines a task, which exits the overall execution on failure * Defines a task, which exits the overall execution on failure result of the taskLambda.
*/ */
fun exitOnFailure(a: Prov.() -> ProvResult): ProvResult { fun exitOnFailure(taskLambda: Prov.() -> ProvResult): ProvResult {
printDeprecationWarningIfLevel0("exitOnFailure") printDeprecationWarningIfLevel0("exitOnFailure")
return evaluate(ResultMode.FAILEXIT) { a() } return evaluate(ResultMode.FAILEXIT) { taskLambda() }
} }
/** /**

View file

@ -1,7 +1,6 @@
package org.domaindrivenarchitecture.provs.server.infrastructure package org.domaindrivenarchitecture.provs.server.infrastructure
import org.domaindrivenarchitecture.provs.framework.core.Prov import org.domaindrivenarchitecture.provs.framework.core.Prov
import org.domaindrivenarchitecture.provs.framework.core.ProvResult
import org.domaindrivenarchitecture.provs.framework.ubuntu.filesystem.base.* import org.domaindrivenarchitecture.provs.framework.ubuntu.filesystem.base.*
import org.domaindrivenarchitecture.provs.framework.ubuntu.web.base.downloadFromURL import org.domaindrivenarchitecture.provs.framework.ubuntu.web.base.downloadFromURL
@ -12,10 +11,8 @@ const val K9S_VERSION = "v0.32.5"
// ----------------------------------- public functions -------------------------------- // ----------------------------------- public functions --------------------------------
fun Prov.installK9s(): ProvResult { fun Prov.installK9s() = task {
return taskWithResult {
createDir("/tmp", sudo = true) createDir("/tmp", sudo = true)
downloadFromURL("https://github.com/derailed/k9s/releases/download/" + K9S_VERSION + "/k9s_linux_amd64.deb", "k9s_linux_amd64.deb", "/tmp") downloadFromURL("https://github.com/derailed/k9s/releases/download/" + K9S_VERSION + "/k9s_linux_amd64.deb", "k9s_linux_amd64.deb", "/tmp")
cmd("sudo dpkg -i k9s_linux_amd64.deb", "/tmp") cmd("sudo dpkg -i k9s_linux_amd64.deb", "/tmp")
} }
}

View file

@ -59,17 +59,4 @@ internal class DevOpsKtTest {
assertTrue(res.success) assertTrue(res.success)
assertTrue(prov.checkFile("/usr/local/bin/kubeconform")) assertTrue(prov.checkFile("/usr/local/bin/kubeconform"))
} }
@ContainerTest
fun installGraalVM() {
// given
val prov = defaultTestContainer()
// when
val res = prov.installGraalVM()
// then
assertTrue(res.success)
assertTrue(prov.checkFile("/usr/local/bin/native-image"))
}
} }

View file

@ -0,0 +1,24 @@
package org.domaindrivenarchitecture.provs.desktop.infrastructure
import org.domaindrivenarchitecture.provs.framework.ubuntu.filesystem.base.checkFile
import org.domaindrivenarchitecture.provs.test.defaultTestContainer
import org.domaindrivenarchitecture.provs.test.tags.ContainerTest
import org.junit.jupiter.api.Assertions.*
class GraalVMKtTest {
@ContainerTest
fun installGraalVM() {
// given
val prov = defaultTestContainer()
// when
val res = prov.installGraalVM()
// then
assertTrue(res.success)
assertTrue(GRAAL_VM_VERSION == prov.graalVMVersion())
assertTrue(prov.checkFile("/usr/local/bin/native-image"))
}
}