release-0.11.10 - rename workplace to desktop

This commit is contained in:
ansgarz 2022-06-16 22:57:08 +02:00
parent bcd43a95be
commit bf3a8db4c0
16 changed files with 39 additions and 37 deletions

View file

@ -18,7 +18,7 @@ apply plugin: "kotlinx-serialization"
group = "org.domaindrivenarchitecture.provs" group = "org.domaindrivenarchitecture.provs"
version = "0.11.10-SNAPSHOT" version = "release-0.11.10"
repositories { repositories {
mavenCentral() mavenCentral()

View file

@ -7,7 +7,7 @@ import java.io.FileNotFoundException
import kotlin.system.exitProcess import kotlin.system.exitProcess
/** /**
* Provisions a desktop workplace locally or on a remote machine. Use option -h for help. * Provisions desktop software (office and/or ide depending on type) locally or on a remote machine. Use option -h for help.
*/ */
fun main(args: Array<String>) { fun main(args: Array<String>) {
@ -28,7 +28,7 @@ fun main(args: Array<String>) {
} catch (e: FileNotFoundException) { } catch (e: FileNotFoundException) {
println( println(
"Error: File\u001b[31m ${cmd.configFile?.fileName} \u001b[0m was not found.\n" + "Error: File\u001b[31m ${cmd.configFile?.fileName} \u001b[0m was not found.\n" +
"Pls copy file \u001B[31m WorkplaceConfigExample.yaml \u001B[0m to file \u001B[31m ${cmd.configFile?.fileName} \u001B[0m " + "Pls copy file \u001B[31m desktop-config-example.yaml \u001B[0m to file \u001B[31m ${cmd.configFile?.fileName} \u001B[0m " +
"and change the content according to your needs.\n" "and change the content according to your needs.\n"
) )
} }

View file

@ -20,7 +20,7 @@ fun provisionDesktop(prov: Prov, cmd: DesktopCliCommand) {
val conf = if (cmd.configFile != null) getConfig(cmd.configFile.fileName) else DesktopConfig() val conf = if (cmd.configFile != null) getConfig(cmd.configFile.fileName) else DesktopConfig()
if (submodules == null) { if (submodules == null) {
prov.provisionWorkplace(cmd.type, conf.ssh?.keyPair(), conf.gpg?.keyPair(), conf.gitUserName, conf.gitEmail) prov.provisionDesktop(cmd.type, conf.ssh?.keyPair(), conf.gpg?.keyPair(), conf.gitUserName, conf.gitEmail)
} else { } else {
prov.provisionDesktopSubmodules(submodules) prov.provisionDesktopSubmodules(submodules)
} }
@ -28,14 +28,14 @@ fun provisionDesktop(prov: Prov, cmd: DesktopCliCommand) {
/** /**
* Provisions software and configurations for a personal workplace. * Provisions software and configurations for a personal desktop.
* Offers the possibility to choose between different types. * Offers the possibility to choose between different types.
* Type OFFICE installs office-related software like Thunderbird, LibreOffice, and much more. * Type OFFICE installs office-related software like Thunderbird, LibreOffice, and much more.
* Type IDE provides additional software for a development environment, such as Visual Studio Code, IntelliJ, etc. * Type IDE provides additional software for a development environment, such as Visual Studio Code, IntelliJ, etc.
* *
* Prerequisites: user must be able to sudo without entering the password * Prerequisites: user must be able to sudo without entering the password
*/ */
fun Prov.provisionWorkplace( fun Prov.provisionDesktop(
desktopType: DesktopType = DesktopType.BASIC, desktopType: DesktopType = DesktopType.BASIC,
ssh: KeyPair? = null, ssh: KeyPair? = null,
gpg: KeyPair? = null, gpg: KeyPair? = null,
@ -44,7 +44,7 @@ fun Prov.provisionWorkplace(
) = task { ) = task {
if (!currentUserCanSudo()) { if (!currentUserCanSudo()) {
throw Exception("Current user ${whoami()} cannot execute sudo without entering a password! This is necessary to execute provisionWorkplace") throw Exception("Current user ${whoami()} cannot execute sudo without entering a password! This is necessary to execute provisionDesktop")
} }
aptInstall(KEY_MANAGEMENT) aptInstall(KEY_MANAGEMENT)

View file

@ -8,7 +8,7 @@ import java.io.FileWriter
/** /**
* Returns WorkplaceConfig; data for config is read from specified file. * Returns DesktopConfig; data for config is read from specified file.
* Throws exceptions FileNotFoundException, SerializationException if file is not found resp. cannot be parsed. * Throws exceptions FileNotFoundException, SerializationException if file is not found resp. cannot be parsed.
*/ */
internal fun getConfig(filename: String = "desktop-config.yaml"): DesktopConfig = readFromFile(filename).yamlToType() internal fun getConfig(filename: String = "desktop-config.yaml"): DesktopConfig = readFromFile(filename).yamlToType()

View file

@ -7,7 +7,7 @@ import org.domaindrivenarchitecture.provs.configuration.domain.TargetCliCommand
import org.domaindrivenarchitecture.provs.desktop.domain.DesktopCliCommand import org.domaindrivenarchitecture.provs.desktop.domain.DesktopCliCommand
import org.domaindrivenarchitecture.provs.desktop.domain.DesktopConfig import org.domaindrivenarchitecture.provs.desktop.domain.DesktopConfig
import org.domaindrivenarchitecture.provs.desktop.domain.DesktopType import org.domaindrivenarchitecture.provs.desktop.domain.DesktopType
import org.domaindrivenarchitecture.provs.desktop.domain.provisionWorkplace import org.domaindrivenarchitecture.provs.desktop.domain.provisionDesktop
import org.domaindrivenarchitecture.provs.desktop.infrastructure.getConfig import org.domaindrivenarchitecture.provs.desktop.infrastructure.getConfig
import org.domaindrivenarchitecture.provs.framework.core.* import org.domaindrivenarchitecture.provs.framework.core.*
import org.domaindrivenarchitecture.provs.framework.core.cli.retrievePassword import org.domaindrivenarchitecture.provs.framework.core.cli.retrievePassword
@ -20,7 +20,7 @@ import org.junit.jupiter.api.Test
import java.io.ByteArrayOutputStream import java.io.ByteArrayOutputStream
import java.io.PrintStream import java.io.PrintStream
internal class CliWorkplaceKtTest { internal class ApplicationKtTest {
companion object { companion object {
@ -31,6 +31,7 @@ internal class CliWorkplaceKtTest {
ConfigFileName("bla") ConfigFileName("bla")
) )
@Suppress("unused") // false positive
@BeforeAll @BeforeAll
@JvmStatic @JvmStatic
internal fun beforeAll() { internal fun beforeAll() {
@ -48,8 +49,8 @@ internal class CliWorkplaceKtTest {
mockkStatic(::getConfig) mockkStatic(::getConfig)
every { getConfig("testconfig.yaml") } returns testConfig every { getConfig("testconfig.yaml") } returns testConfig
mockkStatic(Prov::provisionWorkplace) mockkStatic(Prov::provisionDesktop)
every { any<Prov>().provisionWorkplace(any(), any(), any(), any(), any(), ) } returns ProvResult( every { any<Prov>().provisionDesktop(any(), any(), any(), any(), any(), ) } returns ProvResult(
true, true,
cmd = "mocked command" cmd = "mocked command"
) )
@ -58,6 +59,7 @@ internal class CliWorkplaceKtTest {
every { retrievePassword(any()) } returns Secret("sec") every { retrievePassword(any()) } returns Secret("sec")
} }
@Suppress("unused") // false positive
@AfterAll @AfterAll
@JvmStatic @JvmStatic
internal fun afterAll() { internal fun afterAll() {
@ -65,13 +67,13 @@ internal class CliWorkplaceKtTest {
unmockkStatic(::local) unmockkStatic(::local)
unmockkStatic(::remote) unmockkStatic(::remote)
unmockkStatic(::getConfig) unmockkStatic(::getConfig)
unmockkStatic(Prov::provisionWorkplace) unmockkStatic(Prov::provisionDesktop)
unmockkStatic(::retrievePassword) unmockkStatic(::retrievePassword)
} }
} }
@Test @Test
fun provision_workplace_remotely() { fun provision_desktop_remotely() {
// when // when
main(arrayOf("basic", "user123:sec@host123.xyz", "-c", "testconfig.yaml")) main(arrayOf("basic", "user123:sec@host123.xyz", "-c", "testconfig.yaml"))
@ -79,7 +81,7 @@ internal class CliWorkplaceKtTest {
// then // then
verify { remote("host123.xyz", "user123", Secret("sec"), any()) } verify { remote("host123.xyz", "user123", Secret("sec"), any()) }
verify { verify {
any<Prov>().provisionWorkplace( any<Prov>().provisionDesktop(
DesktopType.BASIC, DesktopType.BASIC,
null, null,
null, null,
@ -110,10 +112,10 @@ internal class CliWorkplaceKtTest {
System.setErr(originalErr) System.setErr(originalErr)
val expectedOutput = val expectedOutput =
"Error: File\u001B[31m idontexist.yaml \u001B[0m was not found.Pls copy file \u001B[31m WorkplaceConfigExample.yaml \u001B[0m to file \u001B[31m idontexist.yaml \u001B[0m and change the content according to your needs." "Error: File\u001B[31m idontexist.yaml \u001B[0m was not found.Pls copy file \u001B[31m desktop-config-example.yaml \u001B[0m to file \u001B[31m idontexist.yaml \u001B[0m and change the content according to your needs."
assertEquals(expectedOutput, outContent.toString().replace("\r", "").replace("\n", "")) assertEquals(expectedOutput, outContent.toString().replace("\r", "").replace("\n", ""))
verify(exactly = 0) { any<Prov>().provisionWorkplace(any(), any(), any(), any(), any(), ) } verify(exactly = 0) { any<Prov>().provisionDesktop(any(), any(), any(), any(), any(), ) }
} }
@Test @Test
@ -130,16 +132,16 @@ internal class CliWorkplaceKtTest {
System.setErr(PrintStream(errContent)) System.setErr(PrintStream(errContent))
// when // when
main(arrayOf("basic", "someuser@remotehost", "-c", "src/test/resources/InvalidWorkplaceConfig.yaml")) main(arrayOf("basic", "someuser@remotehost", "-c", "src/test/resources/invalid-desktop-config.yaml"))
// then // then
System.setOut(originalOut) System.setOut(originalOut)
System.setErr(originalErr) System.setErr(originalErr)
val expectedOutput = val expectedOutput =
"Error: File \"src/test/resources/InvalidWorkplaceConfig.yaml\" has an invalid format and or invalid data." "Error: File \"src/test/resources/invalid-desktop-config.yaml\" has an invalid format and or invalid data."
assertEquals(expectedOutput, outContent.toString().replace("\r", "").replace("\n", "")) assertEquals(expectedOutput, outContent.toString().replace("\r", "").replace("\n", ""))
verify(exactly = 0) { any<Prov>().provisionWorkplace(any(), any(), any(), any(), any(), ) } verify(exactly = 0) { any<Prov>().provisionDesktop(any(), any(), any(), any(), any(), ) }
} }
} }

View file

@ -5,16 +5,16 @@ import org.domaindrivenarchitecture.provs.test.defaultTestContainer
import org.domaindrivenarchitecture.provs.test.tags.ExtensiveContainerTest import org.domaindrivenarchitecture.provs.test.tags.ExtensiveContainerTest
import org.junit.jupiter.api.Assertions.assertTrue import org.junit.jupiter.api.Assertions.assertTrue
internal class ProvisionWorkplaceKtTest { internal class DesktopServiceKtTest {
@ExtensiveContainerTest @ExtensiveContainerTest
fun provisionWorkplace() { fun provisionDesktop() {
// given // given
val a = defaultTestContainer() val prov = defaultTestContainer()
// when // when
// in order to test WorkplaceType.OFFICE: fix installing libreoffice for a fresh container as it hangs the first time but succeeds 2nd time // in order to test DesktopType.OFFICE: fix installing libreoffice for a fresh container as it hangs the first time but succeeds 2nd time
val res = a.provisionWorkplace( val res = prov.provisionDesktop(
DesktopType.BASIC, DesktopType.BASIC,
gitUserName = "testuser", gitUserName = "testuser",
gitEmail = "testuser@test.org", gitEmail = "testuser@test.org",
@ -26,14 +26,14 @@ internal class ProvisionWorkplaceKtTest {
@ExtensiveContainerTest @ExtensiveContainerTest
fun provisionWorkplaceFromConfigFile() { fun provisionDesktopFromConfigFile() {
// given // given
val a = defaultTestContainer() val prov = defaultTestContainer()
// when // when
// in order to test WorkplaceType.OFFICE: fix installing libreoffice for a fresh container as it hangs the first time but succeeds 2nd time // in order to test DesktopType.OFFICE: fix installing libreoffice for a fresh container as it hangs the first time but succeeds 2nd time
val config = getConfig("src/test/resources/WorkplaceConfigExample.json") val config = getConfig("src/test/resources/desktop-config-example.json")
val res = a.provisionWorkplace( val res = prov.provisionDesktop(
DesktopType.BASIC, DesktopType.BASIC,
config.ssh?.keyPair(), config.ssh?.keyPair(),
config.gpg?.keyPair(), config.gpg?.keyPair(),

View file

@ -14,7 +14,7 @@ internal class K3SDesktopConfigRepositoryKtTest {
@Test @Test
fun getConfig_successful() { fun getConfig_successful() {
// when // when
val config = getConfig("src/test/resources/TestWorkplaceConfig.yaml") val config = getConfig("src/test/resources/test-desktop-config.yaml")
// then // then
assertEquals("username", config.gitUserName) assertEquals("username", config.gitUserName)
@ -32,7 +32,7 @@ internal class K3SDesktopConfigRepositoryKtTest {
@Test @Test
fun getConfig_fails_due_to_invalidProperty() { fun getConfig_fails_due_to_invalidProperty() {
val exception = assertThrows<InvalidPropertyValueException> { val exception = assertThrows<InvalidPropertyValueException> {
getConfig("src/test/resources/InvalidWorkplaceConfig.yaml") getConfig("src/test/resources/invalid-desktop-config.yaml")
} }
assertEquals("Value for 'sourceType' is invalid: Value 'xxx' is not a valid option, permitted choices are: FILE, GOPASS, PASS, PLAIN, PROMPT", exception.message) assertEquals("Value for 'sourceType' is invalid: Value 'xxx' is not a valid option, permitted choices are: FILE, GOPASS, PASS, PLAIN, PROMPT", exception.message)
} }

View file

@ -115,7 +115,7 @@ internal class WebKtTest {
} }
@Test @Test
fun isIp4_recognizes_Ip_correctly() { fun isIp4_recognizes_ip_correctly() {
// when // when
val res1 = isIp4("123.123.123.123") val res1 = isIp4("123.123.123.123")
val res2 = isIp4("123.abc.123.123") val res2 = isIp4("123.abc.123.123")
@ -128,7 +128,7 @@ internal class WebKtTest {
} }
@Test @Test
fun isIp6_recognizes_Ip_correctly() { fun isIp6_recognizes_ip_correctly() {
// when // when
val res1 = isIp6("2001:db8:3333:4444:5555:6666:7777:8888") val res1 = isIp6("2001:db8:3333:4444:5555:6666:7777:8888")
val res2 = isIp6("2001:db8:3333:4444:CCCC:DDDD:EEEE:FFFF") val res2 = isIp6("2001:db8:3333:4444:CCCC:DDDD:EEEE:FFFF")

View file

@ -28,7 +28,7 @@ internal class GrafanaAgentRepositoryKtTest {
@Test @Test
fun findK8sGrafanaConfig_returns_null_if_no_grafan_data_available() { fun findK8sGrafanaConfig_returns_null_if_no_grafan_data_available() {
// when // when
val config = findK8sGrafanaConfig(ConfigFileName("src/test/resources/k3sServerConfig.yaml")) val config = findK8sGrafanaConfig(ConfigFileName("src/test/resources/k3s-server-config.yaml"))
// then // then
assertEquals(null, config) assertEquals(null, config)

View file

@ -17,7 +17,7 @@ internal class K3sConfigRepositoryTest {
@Test @Test
fun getConfig_successful() { fun getConfig_successful() {
// when // when
val config = getK3sConfig(ConfigFileName("src/test/resources/k3sServerConfig.yaml")) val config = getK3sConfig(ConfigFileName("src/test/resources/k3s-server-config.yaml"))
// then // then
assertEquals( assertEquals(
@ -38,7 +38,7 @@ internal class K3sConfigRepositoryTest {
@Test @Test
fun getConfig_fails_due_to_missing_property() { fun getConfig_fails_due_to_missing_property() {
val exception = assertThrows<SerializationException> { val exception = assertThrows<SerializationException> {
getK3sConfig(ConfigFileName("src/test/resources/InvalidWorkplaceConfig.yaml")) getK3sConfig(ConfigFileName("src/test/resources/invalid-desktop-config.yaml"))
} }
assertEquals("Fields [fqdn, node] are required for type with serial name 'org.domaindrivenarchitecture.provs.server.domain.k3s.K3sConfig', but they were missing", exception.message) assertEquals("Fields [fqdn, node] are required for type with serial name 'org.domaindrivenarchitecture.provs.server.domain.k3s.K3sConfig', but they were missing", exception.message)
} }