From 689c873ff68b6c8fd66740603dad6efa3bf8ab47 Mon Sep 17 00:00:00 2001 From: Fabian Mastenbroek Date: Wed, 18 May 2022 00:36:15 +0200 Subject: refactor(web/runner): Move runner CLI into separate configuration This change splits the command line interface from the OpenDC web runner into a separate configuration. We plan to re-use the runner code for a Quarkus extension that integrates the runner in development mode. --- opendc-web/opendc-web-runner/Dockerfile | 2 +- opendc-web/opendc-web-runner/build.gradle.kts | 64 +++++++++-- .../src/cli/kotlin/org/opendc/web/runner/Main.kt | 127 +++++++++++++++++++++ .../src/main/kotlin/org/opendc/web/runner/Main.kt | 127 --------------------- 4 files changed, 180 insertions(+), 140 deletions(-) create mode 100644 opendc-web/opendc-web-runner/src/cli/kotlin/org/opendc/web/runner/Main.kt delete mode 100644 opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/Main.kt (limited to 'opendc-web') diff --git a/opendc-web/opendc-web-runner/Dockerfile b/opendc-web/opendc-web-runner/Dockerfile index b72f8a7f..bb606f4e 100644 --- a/opendc-web/opendc-web-runner/Dockerfile +++ b/opendc-web/opendc-web-runner/Dockerfile @@ -1,4 +1,4 @@ -FROM openjdk:17-slim +FROM openjdk:18-slim MAINTAINER OpenDC Maintainers # Obtain (cache) Gradle wrapper diff --git a/opendc-web/opendc-web-runner/build.gradle.kts b/opendc-web/opendc-web-runner/build.gradle.kts index c1e3b976..a5723994 100644 --- a/opendc-web/opendc-web-runner/build.gradle.kts +++ b/opendc-web/opendc-web-runner/build.gradle.kts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 AtLarge Research + * Copyright (c) 2022 AtLarge Research * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -24,27 +24,67 @@ description = "Experiment runner for OpenDC" /* Build configuration */ plugins { - `kotlin-conventions` - `testing-conventions` - application + `kotlin-library-conventions` + distribution } -application { - mainClass.set("org.opendc.web.runner.MainKt") +val cli: SourceSet by sourceSets.creating { + compileClasspath += sourceSets["main"].output + runtimeClasspath += sourceSets["main"].output +} + +val cliImplementation: Configuration by configurations.getting { + extendsFrom(configurations["implementation"]) +} +val cliRuntimeOnly: Configuration by configurations.getting +val cliRuntimeClasspath: Configuration by configurations.getting { + extendsFrom(configurations["runtimeClasspath"]) +} + +val cliJar by tasks.creating(Jar::class) { + from(cli.output) + + archiveBaseName.set("${project.name}-cli") } dependencies { + api(projects.opendcWeb.opendcWebClient) implementation(projects.opendcCompute.opendcComputeSimulator) implementation(projects.opendcCompute.opendcComputeWorkload) implementation(projects.opendcSimulator.opendcSimulatorCore) implementation(projects.opendcTrace.opendcTraceApi) - implementation(projects.opendcWeb.opendcWebClient) implementation(libs.kotlin.logging) - implementation(libs.clikt) - implementation(libs.sentry.log4j2) - implementation(kotlin("reflect")) - runtimeOnly(projects.opendcTrace.opendcTraceOpendc) - runtimeOnly(libs.log4j.slf4j) + runtimeOnly(projects.opendcTrace.opendcTraceBitbrains) + + cliImplementation(libs.clikt) + cliImplementation(libs.sentry.log4j2) + + cliRuntimeOnly(projects.opendcTrace.opendcTraceOpendc) + cliRuntimeOnly(libs.log4j.slf4j) +} + +val createCli by tasks.creating(CreateStartScripts::class) { + dependsOn(cliJar) + + applicationName = "opendc-runner" + mainClass.set("org.opendc.web.runner.cli.MainKt") + classpath = cliJar.outputs.files + cliRuntimeClasspath + outputDir = project.buildDir.resolve("scripts") +} + +distributions { + main { + contents { + into("bin") { + from(createCli) + } + + into("lib") { + from(cliJar) + from(cliRuntimeClasspath) // Also includes main classpath + } + } + } } diff --git a/opendc-web/opendc-web-runner/src/cli/kotlin/org/opendc/web/runner/Main.kt b/opendc-web/opendc-web-runner/src/cli/kotlin/org/opendc/web/runner/Main.kt new file mode 100644 index 00000000..348a838c --- /dev/null +++ b/opendc-web/opendc-web-runner/src/cli/kotlin/org/opendc/web/runner/Main.kt @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2022 AtLarge Research + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package org.opendc.web.runner + +import com.github.ajalt.clikt.core.CliktCommand +import com.github.ajalt.clikt.parameters.options.* +import com.github.ajalt.clikt.parameters.types.file +import com.github.ajalt.clikt.parameters.types.int +import mu.KotlinLogging +import org.opendc.web.client.auth.OpenIdAuthController +import org.opendc.web.client.runner.OpenDCRunnerClient +import java.io.File +import java.net.URI + +private val logger = KotlinLogging.logger {} + +/** + * Represents the CLI command for starting the OpenDC web runner. + */ +class RunnerCli : CliktCommand(name = "opendc-runner") { + /** + * The URL to the OpenDC API. + */ + private val apiUrl by option( + "--api-url", + help = "url to the OpenDC API", + envvar = "OPENDC_API_URL" + ) + .convert { URI(it) } + .default(URI("https://api.opendc.org/v2")) + + /** + * The auth domain to use. + */ + private val authDomain by option( + "--auth-domain", + help = "auth domain of the OpenDC API", + envvar = "AUTH0_DOMAIN" + ) + .required() + + /** + * The auth domain to use. + */ + private val authAudience by option( + "--auth-audience", + help = "auth audience of the OpenDC API", + envvar = "AUTH0_AUDIENCE" + ) + .required() + + /** + * The auth client ID to use. + */ + private val authClientId by option( + "--auth-id", + help = "auth client id of the OpenDC API", + envvar = "AUTH0_CLIENT_ID" + ) + .required() + + /** + * The auth client secret to use. + */ + private val authClientSecret by option( + "--auth-secret", + help = "auth client secret of the OpenDC API", + envvar = "AUTH0_CLIENT_SECRET" + ) + .required() + + /** + * The path to the traces directory. + */ + private val tracePath by option( + "--traces", + help = "path to the directory containing the traces", + envvar = "OPENDC_TRACES" + ) + .file(canBeFile = false) + .defaultLazy { File("traces/") } + + /** + * The number of threads used for simulations.. + */ + private val parallelism by option( + "--parallelism", + help = "maximum number of threads for simulations", + ) + .int() + .default(Runtime.getRuntime().availableProcessors() - 1) + + override fun run() { + logger.info { "Starting OpenDC web runner" } + + val client = OpenDCRunnerClient(baseUrl = apiUrl, OpenIdAuthController(authDomain, authClientId, authClientSecret, authAudience)) + val runner = OpenDCRunner(client, tracePath, parallelism = parallelism) + + logger.info { "Watching for queued scenarios" } + runner.run() + } +} + +/** + * Main entry point of the runner. + */ +fun main(args: Array): Unit = RunnerCli().main(args) diff --git a/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/Main.kt b/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/Main.kt deleted file mode 100644 index 7bf7e220..00000000 --- a/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/Main.kt +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright (c) 2021 AtLarge Research - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package org.opendc.web.runner - -import com.github.ajalt.clikt.core.CliktCommand -import com.github.ajalt.clikt.parameters.options.* -import com.github.ajalt.clikt.parameters.types.file -import com.github.ajalt.clikt.parameters.types.int -import mu.KotlinLogging -import org.opendc.web.client.auth.OpenIdAuthController -import org.opendc.web.client.runner.OpenDCRunnerClient -import java.io.File -import java.net.URI - -private val logger = KotlinLogging.logger {} - -/** - * Represents the CLI command for starting the OpenDC web runner. - */ -class RunnerCli : CliktCommand(name = "opendc-runner") { - /** - * The URL to the OpenDC API. - */ - private val apiUrl by option( - "--api-url", - help = "url to the OpenDC API", - envvar = "OPENDC_API_URL" - ) - .convert { URI(it) } - .default(URI("https://api.opendc.org/v2")) - - /** - * The auth domain to use. - */ - private val authDomain by option( - "--auth-domain", - help = "auth domain of the OpenDC API", - envvar = "AUTH0_DOMAIN" - ) - .required() - - /** - * The auth domain to use. - */ - private val authAudience by option( - "--auth-audience", - help = "auth audience of the OpenDC API", - envvar = "AUTH0_AUDIENCE" - ) - .required() - - /** - * The auth client ID to use. - */ - private val authClientId by option( - "--auth-id", - help = "auth client id of the OpenDC API", - envvar = "AUTH0_CLIENT_ID" - ) - .required() - - /** - * The auth client secret to use. - */ - private val authClientSecret by option( - "--auth-secret", - help = "auth client secret of the OpenDC API", - envvar = "AUTH0_CLIENT_SECRET" - ) - .required() - - /** - * The path to the traces directory. - */ - private val tracePath by option( - "--traces", - help = "path to the directory containing the traces", - envvar = "OPENDC_TRACES" - ) - .file(canBeFile = false) - .defaultLazy { File("traces/") } - - /** - * The number of threads used for simulations.. - */ - private val parallelism by option( - "--parallelism", - help = "maximum number of threads for simulations", - ) - .int() - .default(Runtime.getRuntime().availableProcessors() - 1) - - override fun run() { - logger.info { "Starting OpenDC web runner" } - - val client = OpenDCRunnerClient(baseUrl = apiUrl, OpenIdAuthController(authDomain, authClientId, authClientSecret, authAudience)) - val runner = OpenDCRunner(client, tracePath, parallelism = parallelism) - - logger.info { "Watching for queued scenarios" } - runner.run() - } -} - -/** - * Main entry point of the runner. - */ -fun main(args: Array): Unit = RunnerCli().main(args) -- cgit v1.2.3