diff options
Diffstat (limited to 'opendc-web')
11 files changed, 433 insertions, 2 deletions
diff --git a/opendc-web/opendc-web-api/build.gradle.kts b/opendc-web/opendc-web-api/build.gradle.kts index fe493f1d..a9392229 100644 --- a/opendc-web/opendc-web-api/build.gradle.kts +++ b/opendc-web/opendc-web-api/build.gradle.kts @@ -32,7 +32,9 @@ dependencies { implementation(projects.opendcWeb.opendcWebProto) compileOnly(projects.opendcWeb.opendcWebUiQuarkusDeployment) /* Temporary fix for Quarkus/Gradle issues */ + compileOnly(projects.opendcWeb.opendcWebRunnerQuarkusDeployment) implementation(projects.opendcWeb.opendcWebUiQuarkus) + implementation(projects.opendcWeb.opendcWebRunnerQuarkus) implementation(libs.quarkus.kotlin) implementation(libs.quarkus.resteasy.core) diff --git a/opendc-web/opendc-web-api/src/main/resources/application-prod.properties b/opendc-web/opendc-web-api/src/main/resources/application-prod.properties index 8f523d76..cebcdaab 100644 --- a/opendc-web/opendc-web-api/src/main/resources/application-prod.properties +++ b/opendc-web/opendc-web-api/src/main/resources/application-prod.properties @@ -28,5 +28,6 @@ quarkus.datasource.jdbc.url=${OPENDC_DB_URL} quarkus.hibernate-orm.dialect=org.hibernate.dialect.PostgreSQL95Dialect quarkus.hibernate-orm.database.generation=validate -# Disable OpenDC web UI +# Disable OpenDC web UI and runner quarkus.opendc-ui.include=false +quarkus.opendc-runner.include=false diff --git a/opendc-web/opendc-web-api/src/main/resources/application-test.properties b/opendc-web/opendc-web-api/src/main/resources/application-test.properties index ea07de6e..10197119 100644 --- a/opendc-web/opendc-web-api/src/main/resources/application-test.properties +++ b/opendc-web/opendc-web-api/src/main/resources/application-test.properties @@ -35,5 +35,6 @@ quarkus.smallrye-openapi.enable=false quarkus.swagger-ui.enable=false quarkus.smallrye-openapi.oidc-open-id-connect-url= -# Disable OpenDC web UI +# Disable OpenDC web UI and runner quarkus.opendc-ui.include=false +quarkus.opendc-runner.include=false diff --git a/opendc-web/opendc-web-runner-quarkus-deployment/build.gradle.kts b/opendc-web/opendc-web-runner-quarkus-deployment/build.gradle.kts new file mode 100644 index 00000000..24f667cf --- /dev/null +++ b/opendc-web/opendc-web-runner-quarkus-deployment/build.gradle.kts @@ -0,0 +1,35 @@ +/* + * 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. + */ + +description = "Quarkus extension for the OpenDC experiment runner" + +/* Build configuration */ +plugins { + `java-library-conventions` +} + +dependencies { + implementation(projects.opendcWeb.opendcWebRunnerQuarkus) + + implementation(platform(libs.quarkus.bom)) + implementation(libs.quarkus.core.deployment) +} diff --git a/opendc-web/opendc-web-runner-quarkus-deployment/src/main/java/org/opendc/web/runner/deployment/OpenDCRunnerBuildItem.java b/opendc-web/opendc-web-runner-quarkus-deployment/src/main/java/org/opendc/web/runner/deployment/OpenDCRunnerBuildItem.java new file mode 100644 index 00000000..3be15ee3 --- /dev/null +++ b/opendc-web/opendc-web-runner-quarkus-deployment/src/main/java/org/opendc/web/runner/deployment/OpenDCRunnerBuildItem.java @@ -0,0 +1,42 @@ +/* + * 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.deployment; + +import io.quarkus.builder.item.SimpleBuildItem; +import io.quarkus.runtime.RuntimeValue; +import org.opendc.web.runner.OpenDCRunner; + +/** + * A {@link SimpleBuildItem} that produces an {@link OpenDCRunner} instance. + */ +public final class OpenDCRunnerBuildItem extends SimpleBuildItem { + private final RuntimeValue<OpenDCRunner> runner; + + public OpenDCRunnerBuildItem(RuntimeValue<OpenDCRunner> runner) { + this.runner = runner; + } + + public RuntimeValue<OpenDCRunner> getRunner() { + return runner; + } +} diff --git a/opendc-web/opendc-web-runner-quarkus-deployment/src/main/java/org/opendc/web/runner/deployment/OpenDCRunnerConfig.java b/opendc-web/opendc-web-runner-quarkus-deployment/src/main/java/org/opendc/web/runner/deployment/OpenDCRunnerConfig.java new file mode 100644 index 00000000..ccbc5e19 --- /dev/null +++ b/opendc-web/opendc-web-runner-quarkus-deployment/src/main/java/org/opendc/web/runner/deployment/OpenDCRunnerConfig.java @@ -0,0 +1,38 @@ +/* + * 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.deployment; + +import io.quarkus.runtime.annotations.ConfigItem; +import io.quarkus.runtime.annotations.ConfigRoot; + +/** + * Build-time configuration for the OpenDC web runner extension. + */ +@ConfigRoot(name = "opendc-runner") +public class OpenDCRunnerConfig { + /** + * A flag to include the OpenDC web runner extension into the build. + */ + @ConfigItem(defaultValue = "true") + boolean include; +} diff --git a/opendc-web/opendc-web-runner-quarkus-deployment/src/main/java/org/opendc/web/runner/deployment/OpenDCRunnerProcessor.java b/opendc-web/opendc-web-runner-quarkus-deployment/src/main/java/org/opendc/web/runner/deployment/OpenDCRunnerProcessor.java new file mode 100644 index 00000000..b9a334ac --- /dev/null +++ b/opendc-web/opendc-web-runner-quarkus-deployment/src/main/java/org/opendc/web/runner/deployment/OpenDCRunnerProcessor.java @@ -0,0 +1,99 @@ +/* + * 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.deployment; + +import io.quarkus.deployment.annotations.BuildProducer; +import io.quarkus.deployment.annotations.BuildStep; +import io.quarkus.deployment.annotations.Record; +import io.quarkus.deployment.builditem.*; +import io.quarkus.runtime.RuntimeValue; +import org.opendc.web.runner.OpenDCRunner; +import org.opendc.web.runner.runtime.OpenDCRunnerRecorder; +import org.opendc.web.runner.runtime.OpenDCRunnerRuntimeConfig; + +import java.util.function.BooleanSupplier; + +import static io.quarkus.deployment.annotations.ExecutionTime.RUNTIME_INIT; + +/** + * Build processor for the OpenDC web runner Quarkus extension. + */ +public class OpenDCRunnerProcessor { + + private static final String FEATURE = "opendc-runner"; + + /** + * Provide the {@link FeatureBuildItem} for this Quarkus extension. + */ + @BuildStep(onlyIf = IsIncluded.class) + public FeatureBuildItem feature() { + return new FeatureBuildItem(FEATURE); + } + + /** + * Build step to index the necessary dependencies for the OpenDC runner. + */ + @BuildStep + void addDependencies(BuildProducer<IndexDependencyBuildItem> indexDependency) { + indexDependency.produce(new IndexDependencyBuildItem("org.opendc.trace", "opendc-trace-opendc")); + indexDependency.produce(new IndexDependencyBuildItem("org.opendc.trace", "opendc-trace-bitbrains")); + } + + /** + * Build step to create the runner service. + */ + @BuildStep(onlyIf = IsIncluded.class) + @Record(RUNTIME_INIT) + ServiceStartBuildItem createRunnerService(OpenDCRunnerRecorder recorder, + OpenDCRunnerRuntimeConfig config, + BuildProducer<OpenDCRunnerBuildItem> runnerBuildItem) { + RuntimeValue<OpenDCRunner> runner = recorder.createRunner(config); + runnerBuildItem.produce(new OpenDCRunnerBuildItem(runner)); + return new ServiceStartBuildItem("OpenDCRunnerService"); + } + + /** + * Build step to start the runner service. + */ + @BuildStep(onlyIf = IsIncluded.class) + @Record(RUNTIME_INIT) + void startRunnerService(ApplicationStartBuildItem start, + OpenDCRunnerBuildItem runnerBuildItem, + OpenDCRunnerRecorder recorder, + OpenDCRunnerRuntimeConfig config, + ShutdownContextBuildItem shutdownContextBuildItem) { + recorder.startRunner(runnerBuildItem.getRunner(), config,shutdownContextBuildItem); + } + + /** + * A {@link BooleanSupplier} to determine if the OpenDC web runner extension should be included. + */ + private static class IsIncluded implements BooleanSupplier { + OpenDCRunnerConfig config; + + @Override + public boolean getAsBoolean() { + return config.include; + } + } +} diff --git a/opendc-web/opendc-web-runner-quarkus/build.gradle.kts b/opendc-web/opendc-web-runner-quarkus/build.gradle.kts new file mode 100644 index 00000000..a92e03f2 --- /dev/null +++ b/opendc-web/opendc-web-runner-quarkus/build.gradle.kts @@ -0,0 +1,47 @@ +/* + * 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. + */ + +description = "Quarkus extension for the OpenDC experiment runner" + +plugins { + `java-library-conventions` + id("io.quarkus.extension") +} + +quarkusExtension { + deploymentModule = "opendc-web-runner-quarkus-deployment" +} + +dependencies { + modules { + module("javax.annotation:javax.annotation-api") { + replacedBy("jakarta.annotation:jakarta.annotation-api", "javax has been replaced by Jakarta") + } + } + + api(projects.opendcWeb.opendcWebRunner) + + implementation(platform(libs.quarkus.bom)) + implementation(libs.quarkus.core.runtime) +} + +evaluationDependsOn(projects.opendcWeb.opendcWebRunnerQuarkusDeployment.dependencyProject.path) diff --git a/opendc-web/opendc-web-runner-quarkus/src/main/java/org/opendc/web/runner/runtime/OpenDCRunnerRecorder.java b/opendc-web/opendc-web-runner-quarkus/src/main/java/org/opendc/web/runner/runtime/OpenDCRunnerRecorder.java new file mode 100644 index 00000000..b243dbc3 --- /dev/null +++ b/opendc-web/opendc-web-runner-quarkus/src/main/java/org/opendc/web/runner/runtime/OpenDCRunnerRecorder.java @@ -0,0 +1,84 @@ +/* + * 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.runtime; + +import io.quarkus.runtime.RuntimeValue; +import io.quarkus.runtime.ShutdownContext; +import io.quarkus.runtime.annotations.Recorder; +import org.jboss.logging.Logger; +import org.opendc.web.client.runner.OpenDCRunnerClient; +import org.opendc.web.runner.OpenDCRunner; + +import java.io.File; +import java.net.URI; + +/** + * Helper class for starting the OpenDC web runner. + */ +@Recorder +public class OpenDCRunnerRecorder { + private static final Logger LOGGER = Logger.getLogger(OpenDCRunnerRecorder.class.getName()); + + /** + * Helper method to create an {@link OpenDCRunner} instance. + */ + public RuntimeValue<OpenDCRunner> createRunner(OpenDCRunnerRuntimeConfig config) { + URI apiUrl = URI.create(config.apiUrl); + OpenDCRunnerClient client = new OpenDCRunnerClient(apiUrl, null); + OpenDCRunner runner = new OpenDCRunner( + client, + new File(config.tracePath), + config.parallelism, + config.jobTimeout, + config.pollInterval, + config.heartbeatInterval + ); + + return new RuntimeValue<>(runner); + } + + /** + * Helper method to start the OpenDC runner service. + */ + public void startRunner(RuntimeValue<OpenDCRunner> runner, + OpenDCRunnerRuntimeConfig config, + ShutdownContext shutdownContext) { + if (config.enable) { + LOGGER.info("Starting OpenDC Runner in background (polling " + config.apiUrl + ")"); + + Thread thread = new Thread(() -> { + try { + // Wait for some time to allow Vert.x to bind to the local port + Thread.sleep(1000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + + runner.getValue().run(); + }); + thread.start(); + + shutdownContext.addShutdownTask(thread::interrupt); + } + } +} diff --git a/opendc-web/opendc-web-runner-quarkus/src/main/java/org/opendc/web/runner/runtime/OpenDCRunnerRuntimeConfig.java b/opendc-web/opendc-web-runner-quarkus/src/main/java/org/opendc/web/runner/runtime/OpenDCRunnerRuntimeConfig.java new file mode 100644 index 00000000..e1dbf0a8 --- /dev/null +++ b/opendc-web/opendc-web-runner-quarkus/src/main/java/org/opendc/web/runner/runtime/OpenDCRunnerRuntimeConfig.java @@ -0,0 +1,77 @@ +/* + * 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.runtime; + +import io.quarkus.runtime.annotations.ConfigItem; +import io.quarkus.runtime.annotations.ConfigPhase; +import io.quarkus.runtime.annotations.ConfigRoot; + +import java.time.Duration; + +/** + * Configuration for the OpenDC web runner. + */ +@ConfigRoot(phase = ConfigPhase.RUN_TIME, name = "opendc-runner") +public class OpenDCRunnerRuntimeConfig { + /** + * Flag to indicate whether the runner should be enabled. + */ + @ConfigItem(defaultValue = "true") + public boolean enable; + + /** + * The URI to the (local) API to communicate with. + */ + @ConfigItem(defaultValue = "http://${quarkus.http.host}:${quarkus.http.port}${quarkus.resteasy.path:}") + public String apiUrl; + + /** + * The path where the workload traces are located. + */ + @ConfigItem(defaultValue = "traces") + public String tracePath; + + /** + * The number of concurrent simulations + */ + @ConfigItem(defaultValue = "1") + public int parallelism; + + /** + * The maximum duration of a job. + */ + @ConfigItem(defaultValue = "10m") + public Duration jobTimeout; + + /** + * The interval between successive polls to the API. + */ + @ConfigItem(defaultValue = "30s") + public Duration pollInterval; + + /** + * The interval between successive heartbeats to the API. + */ + @ConfigItem(defaultValue = "1m") + public Duration heartbeatInterval; +} diff --git a/opendc-web/opendc-web-runner-quarkus/src/main/resources/META-INF/quarkus-extension.yaml b/opendc-web/opendc-web-runner-quarkus/src/main/resources/META-INF/quarkus-extension.yaml new file mode 100644 index 00000000..b93b467a --- /dev/null +++ b/opendc-web/opendc-web-runner-quarkus/src/main/resources/META-INF/quarkus-extension.yaml @@ -0,0 +1,5 @@ +--- +name: "OpenDC Web Runner" +metadata: + status: "preview" + unlisted: true |
