summaryrefslogtreecommitdiff
path: root/opendc-harness
diff options
context:
space:
mode:
authorFabian Mastenbroek <mail.fabianm@gmail.com>2021-05-05 12:23:25 +0200
committerGitHub <noreply@github.com>2021-05-05 12:23:25 +0200
commite1d892bcbaa7e8361c150f684ca6a0dc5e036a87 (patch)
tree99742afbc3cd762ec527f5a6c7e31ee245ee0385 /opendc-harness
parente021d46ab1601d0c3a00724358164483608f6297 (diff)
parent7fdfe48439f33abec8aa63fc4ab36fd687d59a43 (diff)
harness: Improve OpenDC Experiment Harness (v1)
This pull request contains several improvements to the OpenDC Experiment Harness, which aims to improve user-experience of users when re-running experiments in the repository. * Split the harness into separate modules * Add support for adding additional classpath entries when running experiments via the console * Initial support for configuration of experiments using HOCON.
Diffstat (limited to 'opendc-harness')
-rw-r--r--opendc-harness/build.gradle.kts22
-rw-r--r--opendc-harness/opendc-harness-api/build.gradle.kts35
-rw-r--r--opendc-harness/opendc-harness-api/src/main/kotlin/org/opendc/harness/api/ExperimentDefinition.kt (renamed from opendc-harness/src/main/kotlin/org/opendc/harness/api/ExperimentDefinition.kt)2
-rw-r--r--opendc-harness/opendc-harness-api/src/main/kotlin/org/opendc/harness/api/Parameter.kt (renamed from opendc-harness/src/main/kotlin/org/opendc/harness/api/Parameter.kt)2
-rw-r--r--opendc-harness/opendc-harness-api/src/main/kotlin/org/opendc/harness/api/Scenario.kt (renamed from opendc-harness/src/main/kotlin/org/opendc/harness/api/Scenario.kt)0
-rw-r--r--opendc-harness/opendc-harness-api/src/main/kotlin/org/opendc/harness/api/Trial.kt (renamed from opendc-harness/src/main/kotlin/org/opendc/harness/api/Trial.kt)0
-rw-r--r--opendc-harness/opendc-harness-api/src/main/kotlin/org/opendc/harness/dsl/Experiment.kt (renamed from opendc-harness/src/main/kotlin/org/opendc/harness/dsl/Experiment.kt)0
-rw-r--r--opendc-harness/opendc-harness-api/src/main/kotlin/org/opendc/harness/dsl/ParameterProvider.kt (renamed from opendc-harness/src/main/kotlin/org/opendc/harness/dsl/ParameterProvider.kt)0
-rw-r--r--opendc-harness/opendc-harness-api/src/main/kotlin/org/opendc/harness/dsl/Parameters.kt (renamed from opendc-harness/src/main/kotlin/org/opendc/harness/dsl/Parameters.kt)0
-rw-r--r--opendc-harness/opendc-harness-api/src/main/kotlin/org/opendc/harness/internal/ParameterDelegate.kt (renamed from opendc-harness/src/main/kotlin/org/opendc/harness/internal/ParameterDelegate.kt)0
-rw-r--r--opendc-harness/opendc-harness-cli/build.gradle.kts45
-rw-r--r--opendc-harness/opendc-harness-cli/src/main/kotlin/org/opendc/harness/runner/cli/ConsoleExperimentReporter.kt (renamed from opendc-harness/src/main/kotlin/org/opendc/harness/runner/console/ConsoleExperimentReporter.kt)2
-rw-r--r--opendc-harness/opendc-harness-cli/src/main/kotlin/org/opendc/harness/runner/cli/ConsoleRunner.kt (renamed from opendc-harness/src/main/kotlin/org/opendc/harness/runner/console/ConsoleRunner.kt)69
-rw-r--r--opendc-harness/opendc-harness-cli/src/main/resources/log4j2.xml (renamed from opendc-harness/src/main/resources/log4j2.xml)4
-rw-r--r--opendc-harness/opendc-harness-engine/build.gradle.kts39
-rw-r--r--opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/ExperimentEngine.kt (renamed from opendc-harness/src/main/kotlin/org/opendc/harness/engine/ExperimentEngine.kt)0
-rw-r--r--opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/ExperimentEngineLauncher.kt (renamed from opendc-harness/src/main/kotlin/org/opendc/harness/engine/ExperimentEngineLauncher.kt)2
-rw-r--r--opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/ExperimentExecutionListener.kt (renamed from opendc-harness/src/main/kotlin/org/opendc/harness/engine/ExperimentExecutionListener.kt)0
-rw-r--r--opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/discovery/Discovery.kt (renamed from opendc-harness/src/main/kotlin/org/opendc/harness/engine/discovery/Discovery.kt)0
-rw-r--r--opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/discovery/DiscoveryFilter.kt (renamed from opendc-harness/src/main/kotlin/org/opendc/harness/engine/discovery/DiscoveryFilter.kt)0
-rw-r--r--opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/discovery/DiscoveryProvider.kt (renamed from opendc-harness/src/main/kotlin/org/opendc/harness/engine/discovery/DiscoveryProvider.kt)8
-rw-r--r--opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/discovery/DiscoveryRequest.kt (renamed from opendc-harness/src/main/kotlin/org/opendc/harness/engine/discovery/DiscoveryRequest.kt)0
-rw-r--r--opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/discovery/DiscoverySelector.kt (renamed from opendc-harness/src/main/kotlin/org/opendc/harness/engine/discovery/DiscoverySelector.kt)0
-rw-r--r--opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/internal/CompositeDiscovery.kt (renamed from opendc-harness/src/main/kotlin/org/opendc/harness/internal/CompositeDiscovery.kt)6
-rw-r--r--opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/internal/CompositeExperimentExecutionListener.kt (renamed from opendc-harness/src/main/kotlin/org/opendc/harness/internal/CompositeExperimentExecutionListener.kt)2
-rw-r--r--opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/internal/DslDiscovery.kt (renamed from opendc-harness/src/main/kotlin/org/opendc/harness/internal/DslDiscovery.kt)5
-rw-r--r--opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/internal/DslDiscoveryProvider.kt (renamed from opendc-harness/src/main/kotlin/org/opendc/harness/internal/DslDiscoveryProvider.kt)4
-rw-r--r--opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/internal/ScenarioImpl.kt (renamed from opendc-harness/src/main/kotlin/org/opendc/harness/internal/ScenarioImpl.kt)2
-rw-r--r--opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/scheduler/ExperimentScheduler.kt (renamed from opendc-harness/src/main/kotlin/org/opendc/harness/engine/scheduler/ExperimentScheduler.kt)0
-rw-r--r--opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/scheduler/ExperimentSchedulerProvider.kt (renamed from opendc-harness/src/main/kotlin/org/opendc/harness/engine/scheduler/ExperimentSchedulerProvider.kt)0
-rw-r--r--opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/scheduler/ThreadPoolExperimentScheduler.kt (renamed from opendc-harness/src/main/kotlin/org/opendc/harness/engine/scheduler/ThreadPoolExperimentScheduler.kt)0
-rw-r--r--opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/scheduler/ThreadPoolExperimentSchedulerProvider.kt (renamed from opendc-harness/src/main/kotlin/org/opendc/harness/engine/scheduler/ThreadPoolExperimentSchedulerProvider.kt)0
-rw-r--r--opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/strategy/CartesianExperimentStrategy.kt (renamed from opendc-harness/src/main/kotlin/org/opendc/harness/engine/strategy/CartesianExperimentStrategy.kt)2
-rw-r--r--opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/strategy/CartesianExperimentStrategyProvider.kt (renamed from opendc-harness/src/main/kotlin/org/opendc/harness/engine/strategy/CartesianExperimentStrategyProvider.kt)0
-rw-r--r--opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/strategy/ExperimentStrategy.kt (renamed from opendc-harness/src/main/kotlin/org/opendc/harness/engine/strategy/ExperimentStrategy.kt)0
-rw-r--r--opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/strategy/ExperimentStrategyProvider.kt (renamed from opendc-harness/src/main/kotlin/org/opendc/harness/engine/strategy/ExperimentStrategyProvider.kt)0
-rw-r--r--opendc-harness/opendc-harness-engine/src/main/resources/META-INF/services/org.opendc.harness.engine.discovery.DiscoveryProvider1
-rw-r--r--opendc-harness/opendc-harness-engine/src/main/resources/META-INF/services/org.opendc.harness.engine.scheduler.ExperimentSchedulerProvider (renamed from opendc-harness/src/main/resources/META-INF/services/org.opendc.harness.engine.scheduler.ExperimentSchedulerProvider)0
-rw-r--r--opendc-harness/opendc-harness-engine/src/main/resources/META-INF/services/org.opendc.harness.engine.strategy.ExperimentStrategyProvider (renamed from opendc-harness/src/main/resources/META-INF/services/org.opendc.harness.engine.strategy.ExperimentStrategyProvider)0
-rw-r--r--opendc-harness/opendc-harness-engine/src/test/kotlin/org/opendc/harness/EngineTest.kt (renamed from opendc-harness/src/test/kotlin/org/opendc/harness/EngineTest.kt)2
-rw-r--r--opendc-harness/opendc-harness-engine/src/test/kotlin/org/opendc/harness/TestExperiment.kt (renamed from opendc-harness/src/test/kotlin/org/opendc/harness/TestExperiment.kt)0
-rw-r--r--opendc-harness/opendc-harness-junit5/build.gradle.kts36
-rw-r--r--opendc-harness/opendc-harness-junit5/src/main/kotlin/org/opendc/harness/runner/junit5/JUnitExperimentExecutionListener.kt (renamed from opendc-harness/src/main/kotlin/org/opendc/harness/runner/junit5/JUnitExperimentExecutionListener.kt)0
-rw-r--r--opendc-harness/opendc-harness-junit5/src/main/kotlin/org/opendc/harness/runner/junit5/OpenDCTestEngine.kt (renamed from opendc-harness/src/main/kotlin/org/opendc/harness/runner/junit5/OpenDCTestEngine.kt)3
-rw-r--r--opendc-harness/opendc-harness-junit5/src/main/resources/META-INF/services/org.junit.platform.engine.TestEngine (renamed from opendc-harness/src/main/resources/META-INF/services/org.junit.platform.engine.TestEngine)0
-rw-r--r--opendc-harness/src/main/resources/META-INF/services/org.opendc.harness.engine.discovery.DiscoveryProvider1
46 files changed, 242 insertions, 52 deletions
diff --git a/opendc-harness/build.gradle.kts b/opendc-harness/build.gradle.kts
index 01b4ecd6..7a9a8463 100644
--- a/opendc-harness/build.gradle.kts
+++ b/opendc-harness/build.gradle.kts
@@ -21,25 +21,3 @@
*/
description = "Harness for defining repeatable experiments using OpenDC"
-
-/* Build configuration */
-plugins {
- `kotlin-library-conventions`
- `testing-conventions`
- `jacoco-conventions`
-}
-
-dependencies {
- api(platform(project(":opendc-platform")))
- api("org.jetbrains.kotlinx:kotlinx-coroutines-core")
- api("org.junit.platform:junit-platform-commons:${versions.junitPlatform}")
-
- implementation("org.junit.platform:junit-platform-engine:${versions.junitPlatform}")
- implementation("io.github.classgraph:classgraph:${versions["classgraph"]}")
- implementation("io.github.microutils:kotlin-logging")
-
- implementation("com.github.ajalt.clikt:clikt:${versions["clikt"]}")
- implementation("me.tongfei:progressbar:${versions["progressbar"]}")
-
- runtimeOnly("org.apache.logging.log4j:log4j-slf4j-impl:${versions.log4j}")
-}
diff --git a/opendc-harness/opendc-harness-api/build.gradle.kts b/opendc-harness/opendc-harness-api/build.gradle.kts
new file mode 100644
index 00000000..67b1ce11
--- /dev/null
+++ b/opendc-harness/opendc-harness-api/build.gradle.kts
@@ -0,0 +1,35 @@
+/*
+ * 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.
+ */
+
+description = "API for OpenDC Experiment Harness"
+
+/* Build configuration */
+plugins {
+ `kotlin-library-conventions`
+}
+
+dependencies {
+ api(platform(project(":opendc-platform")))
+ api("org.junit.platform:junit-platform-commons:${versions.junitPlatform}")
+
+ implementation("io.github.microutils:kotlin-logging")
+}
diff --git a/opendc-harness/src/main/kotlin/org/opendc/harness/api/ExperimentDefinition.kt b/opendc-harness/opendc-harness-api/src/main/kotlin/org/opendc/harness/api/ExperimentDefinition.kt
index 88b26ee1..c90717d2 100644
--- a/opendc-harness/src/main/kotlin/org/opendc/harness/api/ExperimentDefinition.kt
+++ b/opendc-harness/opendc-harness-api/src/main/kotlin/org/opendc/harness/api/ExperimentDefinition.kt
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2020 AtLarge Research
+ * 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
diff --git a/opendc-harness/src/main/kotlin/org/opendc/harness/api/Parameter.kt b/opendc-harness/opendc-harness-api/src/main/kotlin/org/opendc/harness/api/Parameter.kt
index bb5c8c2b..1f4fdde1 100644
--- a/opendc-harness/src/main/kotlin/org/opendc/harness/api/Parameter.kt
+++ b/opendc-harness/opendc-harness-api/src/main/kotlin/org/opendc/harness/api/Parameter.kt
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2020 AtLarge Research
+ * 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
diff --git a/opendc-harness/src/main/kotlin/org/opendc/harness/api/Scenario.kt b/opendc-harness/opendc-harness-api/src/main/kotlin/org/opendc/harness/api/Scenario.kt
index a8dbf01e..a8dbf01e 100644
--- a/opendc-harness/src/main/kotlin/org/opendc/harness/api/Scenario.kt
+++ b/opendc-harness/opendc-harness-api/src/main/kotlin/org/opendc/harness/api/Scenario.kt
diff --git a/opendc-harness/src/main/kotlin/org/opendc/harness/api/Trial.kt b/opendc-harness/opendc-harness-api/src/main/kotlin/org/opendc/harness/api/Trial.kt
index 2d6ecd19..2d6ecd19 100644
--- a/opendc-harness/src/main/kotlin/org/opendc/harness/api/Trial.kt
+++ b/opendc-harness/opendc-harness-api/src/main/kotlin/org/opendc/harness/api/Trial.kt
diff --git a/opendc-harness/src/main/kotlin/org/opendc/harness/dsl/Experiment.kt b/opendc-harness/opendc-harness-api/src/main/kotlin/org/opendc/harness/dsl/Experiment.kt
index 41d4207a..41d4207a 100644
--- a/opendc-harness/src/main/kotlin/org/opendc/harness/dsl/Experiment.kt
+++ b/opendc-harness/opendc-harness-api/src/main/kotlin/org/opendc/harness/dsl/Experiment.kt
diff --git a/opendc-harness/src/main/kotlin/org/opendc/harness/dsl/ParameterProvider.kt b/opendc-harness/opendc-harness-api/src/main/kotlin/org/opendc/harness/dsl/ParameterProvider.kt
index e4bb9c64..e4bb9c64 100644
--- a/opendc-harness/src/main/kotlin/org/opendc/harness/dsl/ParameterProvider.kt
+++ b/opendc-harness/opendc-harness-api/src/main/kotlin/org/opendc/harness/dsl/ParameterProvider.kt
diff --git a/opendc-harness/src/main/kotlin/org/opendc/harness/dsl/Parameters.kt b/opendc-harness/opendc-harness-api/src/main/kotlin/org/opendc/harness/dsl/Parameters.kt
index 7d269ba1..7d269ba1 100644
--- a/opendc-harness/src/main/kotlin/org/opendc/harness/dsl/Parameters.kt
+++ b/opendc-harness/opendc-harness-api/src/main/kotlin/org/opendc/harness/dsl/Parameters.kt
diff --git a/opendc-harness/src/main/kotlin/org/opendc/harness/internal/ParameterDelegate.kt b/opendc-harness/opendc-harness-api/src/main/kotlin/org/opendc/harness/internal/ParameterDelegate.kt
index aaf90b99..aaf90b99 100644
--- a/opendc-harness/src/main/kotlin/org/opendc/harness/internal/ParameterDelegate.kt
+++ b/opendc-harness/opendc-harness-api/src/main/kotlin/org/opendc/harness/internal/ParameterDelegate.kt
diff --git a/opendc-harness/opendc-harness-cli/build.gradle.kts b/opendc-harness/opendc-harness-cli/build.gradle.kts
new file mode 100644
index 00000000..3e169e2a
--- /dev/null
+++ b/opendc-harness/opendc-harness-cli/build.gradle.kts
@@ -0,0 +1,45 @@
+/*
+ * 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.
+ */
+
+description = "Command line interface of OpenDC Harness"
+
+/* Build configuration */
+plugins {
+ `kotlin-library-conventions`
+ application
+}
+
+application {
+ applicationName = "opendc-harness"
+ mainClass.set("org.opendc.harness.runner.cli.ConsoleRunnerKt")
+}
+
+dependencies {
+ api(platform(project(":opendc-platform")))
+ api(project(":opendc-harness:opendc-harness-engine"))
+
+ implementation("io.github.microutils:kotlin-logging")
+ implementation("com.github.ajalt.clikt:clikt:${versions["clikt"]}")
+ implementation("me.tongfei:progressbar:${versions["progressbar"]}")
+
+ runtimeOnly("org.apache.logging.log4j:log4j-slf4j-impl:${versions.log4j}")
+}
diff --git a/opendc-harness/src/main/kotlin/org/opendc/harness/runner/console/ConsoleExperimentReporter.kt b/opendc-harness/opendc-harness-cli/src/main/kotlin/org/opendc/harness/runner/cli/ConsoleExperimentReporter.kt
index 2db74ef4..7177467a 100644
--- a/opendc-harness/src/main/kotlin/org/opendc/harness/runner/console/ConsoleExperimentReporter.kt
+++ b/opendc-harness/opendc-harness-cli/src/main/kotlin/org/opendc/harness/runner/cli/ConsoleExperimentReporter.kt
@@ -20,7 +20,7 @@
* SOFTWARE.
*/
-package org.opendc.harness.runner.console
+package org.opendc.harness.runner.cli
import me.tongfei.progressbar.ProgressBar
import me.tongfei.progressbar.ProgressBarBuilder
diff --git a/opendc-harness/src/main/kotlin/org/opendc/harness/runner/console/ConsoleRunner.kt b/opendc-harness/opendc-harness-cli/src/main/kotlin/org/opendc/harness/runner/cli/ConsoleRunner.kt
index ae221c7f..06800f0e 100644
--- a/opendc-harness/src/main/kotlin/org/opendc/harness/runner/console/ConsoleRunner.kt
+++ b/opendc-harness/opendc-harness-cli/src/main/kotlin/org/opendc/harness/runner/cli/ConsoleRunner.kt
@@ -20,19 +20,26 @@
* SOFTWARE.
*/
-package org.opendc.harness.runner.console
+package org.opendc.harness.runner.cli
import com.github.ajalt.clikt.core.CliktCommand
+import com.github.ajalt.clikt.parameters.arguments.argument
+import com.github.ajalt.clikt.parameters.arguments.multiple
+import com.github.ajalt.clikt.parameters.arguments.unique
import com.github.ajalt.clikt.parameters.options.default
import com.github.ajalt.clikt.parameters.options.multiple
import com.github.ajalt.clikt.parameters.options.option
+import com.github.ajalt.clikt.parameters.options.unique
+import com.github.ajalt.clikt.parameters.types.file
import com.github.ajalt.clikt.parameters.types.int
import mu.KotlinLogging
+import org.junit.platform.commons.util.ClassLoaderUtils
import org.opendc.harness.engine.ExperimentEngineLauncher
import org.opendc.harness.engine.discovery.DiscoveryProvider
import org.opendc.harness.engine.discovery.DiscoveryRequest
import org.opendc.harness.engine.discovery.DiscoverySelector
import org.opendc.harness.engine.scheduler.ThreadPoolExperimentScheduler
+import java.net.URLClassLoader
/**
* The logger for this experiment runner.
@@ -53,23 +60,49 @@ public class ConsoleRunner : CliktCommand(name = "opendc-harness") {
/**
* The selected experiments to run by name.
*/
- private val experiments by option("-e", "--experiments", help = "Names of experiments to explore")
- .multiple(emptyList())
+ private val experiments by argument(help = "Experiments to explore")
+ .multiple()
+ .unique()
/**
* The maximum number of worker threads to use.
*/
private val parallelism by option("-p", "--parallelism", help = "Maximum number of concurrent simulation runs")
.int()
- .default(Runtime.getRuntime().availableProcessors())
+ .default(Runtime.getRuntime().availableProcessors() - 1)
+
+ /**
+ * Additional classpath entries to load.
+ */
+ private val additionalClasspathEntries by option("--class-path", help = "Additional classpath entries to load")
+ .file(mustExist = true)
+ .multiple()
+ .unique()
+
+ /**
+ * Configuration file to load.
+ */
+ private val config by option("-c", "--config", help = "Configuration file for the experiments")
+ .file(mustExist = true, canBeDir = false, mustBeReadable = true)
override fun run() {
logger.info { "Starting OpenDC Console Experiment Runner" }
- val discovery = DiscoveryProvider.createComposite()
+ val config = config
+ if (config != null) {
+ System.setProperty("config.file", config.path)
+ }
+
+ val classLoader = createClassLoader()
+ // TODO: Add way to specify class loader for scheduler
+ Thread.currentThread().contextClassLoader = classLoader
+
+ val discovery = DiscoveryProvider.createComposite(classLoader)
val experiments = discovery.discover(
DiscoveryRequest(
- selectors = experiments.map { DiscoverySelector.Name(it) }
+ selectors = experiments.flatMap {
+ listOf(DiscoverySelector.Name(it), DiscoverySelector.Meta("class.name", it))
+ }
)
)
@@ -91,6 +124,30 @@ public class ConsoleRunner : CliktCommand(name = "opendc-harness") {
logger.info { "Finished all experiments. Exiting." }
}
+
+ /**
+ * Create a [ClassLoader] that is used to load the
+ */
+ private fun createClassLoader(): ClassLoader {
+ val parent = ClassLoaderUtils.getDefaultClassLoader()
+
+ if (additionalClasspathEntries.isNotEmpty()) {
+ val urls = additionalClasspathEntries.flatMap { file ->
+ if (file.isDirectory) {
+ file.walk()
+ .filter { it.extension == "jar" }
+ .map { it.toURI().toURL() }
+ .toList()
+ } else {
+ listOf(file.toURI().toURL())
+ }
+ }
+
+ return URLClassLoader.newInstance(urls.toTypedArray(), parent)
+ }
+
+ return parent
+ }
}
/**
diff --git a/opendc-harness/src/main/resources/log4j2.xml b/opendc-harness/opendc-harness-cli/src/main/resources/log4j2.xml
index 9553d964..32d81416 100644
--- a/opendc-harness/src/main/resources/log4j2.xml
+++ b/opendc-harness/opendc-harness-cli/src/main/resources/log4j2.xml
@@ -1,8 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- ~ MIT License
- ~
- ~ Copyright (c) 2020 atlarge-research
+ ~ 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
diff --git a/opendc-harness/opendc-harness-engine/build.gradle.kts b/opendc-harness/opendc-harness-engine/build.gradle.kts
new file mode 100644
index 00000000..bffafdac
--- /dev/null
+++ b/opendc-harness/opendc-harness-engine/build.gradle.kts
@@ -0,0 +1,39 @@
+/*
+ * 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.
+ */
+
+description = "Engine for running experiments using the OpenDC Harness"
+
+/* Build configuration */
+plugins {
+ `kotlin-library-conventions`
+ `testing-conventions`
+ `jacoco-conventions`
+}
+
+dependencies {
+ api(platform(project(":opendc-platform")))
+ api(project(":opendc-harness:opendc-harness-api"))
+ api("org.jetbrains.kotlinx:kotlinx-coroutines-core")
+
+ implementation("io.github.classgraph:classgraph:${versions["classgraph"]}")
+ implementation("io.github.microutils:kotlin-logging")
+}
diff --git a/opendc-harness/src/main/kotlin/org/opendc/harness/engine/ExperimentEngine.kt b/opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/ExperimentEngine.kt
index a36f1f9b..a36f1f9b 100644
--- a/opendc-harness/src/main/kotlin/org/opendc/harness/engine/ExperimentEngine.kt
+++ b/opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/ExperimentEngine.kt
diff --git a/opendc-harness/src/main/kotlin/org/opendc/harness/engine/ExperimentEngineLauncher.kt b/opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/ExperimentEngineLauncher.kt
index ddd30483..759e96f8 100644
--- a/opendc-harness/src/main/kotlin/org/opendc/harness/engine/ExperimentEngineLauncher.kt
+++ b/opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/ExperimentEngineLauncher.kt
@@ -26,11 +26,11 @@ import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.runBlocking
import org.opendc.harness.api.ExperimentDefinition
+import org.opendc.harness.engine.internal.CompositeExperimentExecutionListener
import org.opendc.harness.engine.scheduler.ExperimentScheduler
import org.opendc.harness.engine.scheduler.ThreadPoolExperimentScheduler
import org.opendc.harness.engine.strategy.CartesianExperimentStrategy
import org.opendc.harness.engine.strategy.ExperimentStrategy
-import org.opendc.harness.internal.CompositeExperimentExecutionListener
/**
* A builder class for conducting experiments via the [ExperimentEngine].
diff --git a/opendc-harness/src/main/kotlin/org/opendc/harness/engine/ExperimentExecutionListener.kt b/opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/ExperimentExecutionListener.kt
index 9ef71863..9ef71863 100644
--- a/opendc-harness/src/main/kotlin/org/opendc/harness/engine/ExperimentExecutionListener.kt
+++ b/opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/ExperimentExecutionListener.kt
diff --git a/opendc-harness/src/main/kotlin/org/opendc/harness/engine/discovery/Discovery.kt b/opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/discovery/Discovery.kt
index f7f73b38..f7f73b38 100644
--- a/opendc-harness/src/main/kotlin/org/opendc/harness/engine/discovery/Discovery.kt
+++ b/opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/discovery/Discovery.kt
diff --git a/opendc-harness/src/main/kotlin/org/opendc/harness/engine/discovery/DiscoveryFilter.kt b/opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/discovery/DiscoveryFilter.kt
index 219d09cd..219d09cd 100644
--- a/opendc-harness/src/main/kotlin/org/opendc/harness/engine/discovery/DiscoveryFilter.kt
+++ b/opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/discovery/DiscoveryFilter.kt
diff --git a/opendc-harness/src/main/kotlin/org/opendc/harness/engine/discovery/DiscoveryProvider.kt b/opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/discovery/DiscoveryProvider.kt
index fad255de..c4b420c5 100644
--- a/opendc-harness/src/main/kotlin/org/opendc/harness/engine/discovery/DiscoveryProvider.kt
+++ b/opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/discovery/DiscoveryProvider.kt
@@ -22,7 +22,7 @@
package org.opendc.harness.engine.discovery
-import org.opendc.harness.internal.CompositeDiscovery
+import org.opendc.harness.engine.internal.CompositeDiscovery
import java.util.*
/**
@@ -40,7 +40,7 @@ public interface DiscoveryProvider {
/**
* Factory method for creating a new [Discovery] instance.
*/
- public fun create(): Discovery
+ public fun create(classLoader: ClassLoader): Discovery
public companion object {
/**
@@ -58,8 +58,8 @@ public interface DiscoveryProvider {
/**
* Obtain a composite [Discovery] that combines the results of all available providers.
*/
- public fun createComposite(): Discovery {
- return CompositeDiscovery(providers)
+ public fun createComposite(classLoader: ClassLoader): Discovery {
+ return CompositeDiscovery(classLoader, providers)
}
}
}
diff --git a/opendc-harness/src/main/kotlin/org/opendc/harness/engine/discovery/DiscoveryRequest.kt b/opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/discovery/DiscoveryRequest.kt
index 5bc08dac..5bc08dac 100644
--- a/opendc-harness/src/main/kotlin/org/opendc/harness/engine/discovery/DiscoveryRequest.kt
+++ b/opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/discovery/DiscoveryRequest.kt
diff --git a/opendc-harness/src/main/kotlin/org/opendc/harness/engine/discovery/DiscoverySelector.kt b/opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/discovery/DiscoverySelector.kt
index 67681303..67681303 100644
--- a/opendc-harness/src/main/kotlin/org/opendc/harness/engine/discovery/DiscoverySelector.kt
+++ b/opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/discovery/DiscoverySelector.kt
diff --git a/opendc-harness/src/main/kotlin/org/opendc/harness/internal/CompositeDiscovery.kt b/opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/internal/CompositeDiscovery.kt
index 67a895e4..726125a8 100644
--- a/opendc-harness/src/main/kotlin/org/opendc/harness/internal/CompositeDiscovery.kt
+++ b/opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/internal/CompositeDiscovery.kt
@@ -20,7 +20,7 @@
* SOFTWARE.
*/
-package org.opendc.harness.internal
+package org.opendc.harness.engine.internal
import kotlinx.coroutines.FlowPreview
import kotlinx.coroutines.flow.*
@@ -32,11 +32,11 @@ import org.opendc.harness.engine.discovery.DiscoveryRequest
/**
* A composite [Discovery] instance that combines the results of multiple delegate instances.
*/
-internal class CompositeDiscovery(providers: Iterable<DiscoveryProvider>) : Discovery {
+internal class CompositeDiscovery(classLoader: ClassLoader, providers: Iterable<DiscoveryProvider>) : Discovery {
/**
* The [Discovery] instances to delegate to.
*/
- private val delegates = providers.map { it.create() }
+ private val delegates = providers.map { it.create(classLoader) }
@OptIn(FlowPreview::class)
override fun discover(request: DiscoveryRequest): Flow<ExperimentDefinition> {
diff --git a/opendc-harness/src/main/kotlin/org/opendc/harness/internal/CompositeExperimentExecutionListener.kt b/opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/internal/CompositeExperimentExecutionListener.kt
index a3cd6bd2..62b4ca8b 100644
--- a/opendc-harness/src/main/kotlin/org/opendc/harness/internal/CompositeExperimentExecutionListener.kt
+++ b/opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/internal/CompositeExperimentExecutionListener.kt
@@ -20,7 +20,7 @@
* SOFTWARE.
*/
-package org.opendc.harness.internal
+package org.opendc.harness.engine.internal
import org.opendc.harness.api.ExperimentDefinition
import org.opendc.harness.api.Scenario
diff --git a/opendc-harness/src/main/kotlin/org/opendc/harness/internal/DslDiscovery.kt b/opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/internal/DslDiscovery.kt
index eb6303d6..3fa3fe35 100644
--- a/opendc-harness/src/main/kotlin/org/opendc/harness/internal/DslDiscovery.kt
+++ b/opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/internal/DslDiscovery.kt
@@ -20,7 +20,7 @@
* SOFTWARE.
*/
-package org.opendc.harness.internal
+package org.opendc.harness.engine.internal
import io.github.classgraph.ClassGraph
import io.github.classgraph.ScanResult
@@ -36,7 +36,7 @@ import org.opendc.harness.engine.discovery.DiscoverySelector
/**
* A [Discovery] implementation that discovers [Experiment] instances on the classpath.
*/
-internal class DslDiscovery : Discovery {
+internal class DslDiscovery(private val classLoader: ClassLoader) : Discovery {
/*
* Lazily memoize the results of the classpath scan.
*/
@@ -84,6 +84,7 @@ internal class DslDiscovery : Discovery {
*/
private fun scan(): ScanResult {
return ClassGraph()
+ .addClassLoader(classLoader)
.enableClassInfo()
.enableExternalClasses()
.ignoreClassVisibility()
diff --git a/opendc-harness/src/main/kotlin/org/opendc/harness/internal/DslDiscoveryProvider.kt b/opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/internal/DslDiscoveryProvider.kt
index 752ba4bb..6a9bd599 100644
--- a/opendc-harness/src/main/kotlin/org/opendc/harness/internal/DslDiscoveryProvider.kt
+++ b/opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/internal/DslDiscoveryProvider.kt
@@ -20,7 +20,7 @@
* SOFTWARE.
*/
-package org.opendc.harness.internal
+package org.opendc.harness.engine.internal
import org.opendc.harness.dsl.Experiment
import org.opendc.harness.engine.discovery.Discovery
@@ -32,5 +32,5 @@ import org.opendc.harness.engine.discovery.DiscoveryProvider
public class DslDiscoveryProvider : DiscoveryProvider {
override val id: String = "dsl"
- override fun create(): Discovery = DslDiscovery()
+ override fun create(classLoader: ClassLoader): Discovery = DslDiscovery(classLoader)
}
diff --git a/opendc-harness/src/main/kotlin/org/opendc/harness/internal/ScenarioImpl.kt b/opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/internal/ScenarioImpl.kt
index d255004d..65d19e87 100644
--- a/opendc-harness/src/main/kotlin/org/opendc/harness/internal/ScenarioImpl.kt
+++ b/opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/internal/ScenarioImpl.kt
@@ -20,7 +20,7 @@
* SOFTWARE.
*/
-package org.opendc.harness.internal
+package org.opendc.harness.engine.internal
import org.opendc.harness.api.ExperimentDefinition
import org.opendc.harness.api.Parameter
diff --git a/opendc-harness/src/main/kotlin/org/opendc/harness/engine/scheduler/ExperimentScheduler.kt b/opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/scheduler/ExperimentScheduler.kt
index 0265554a..0265554a 100644
--- a/opendc-harness/src/main/kotlin/org/opendc/harness/engine/scheduler/ExperimentScheduler.kt
+++ b/opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/scheduler/ExperimentScheduler.kt
diff --git a/opendc-harness/src/main/kotlin/org/opendc/harness/engine/scheduler/ExperimentSchedulerProvider.kt b/opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/scheduler/ExperimentSchedulerProvider.kt
index a93d4bf6..a93d4bf6 100644
--- a/opendc-harness/src/main/kotlin/org/opendc/harness/engine/scheduler/ExperimentSchedulerProvider.kt
+++ b/opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/scheduler/ExperimentSchedulerProvider.kt
diff --git a/opendc-harness/src/main/kotlin/org/opendc/harness/engine/scheduler/ThreadPoolExperimentScheduler.kt b/opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/scheduler/ThreadPoolExperimentScheduler.kt
index 1ae533cf..1ae533cf 100644
--- a/opendc-harness/src/main/kotlin/org/opendc/harness/engine/scheduler/ThreadPoolExperimentScheduler.kt
+++ b/opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/scheduler/ThreadPoolExperimentScheduler.kt
diff --git a/opendc-harness/src/main/kotlin/org/opendc/harness/engine/scheduler/ThreadPoolExperimentSchedulerProvider.kt b/opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/scheduler/ThreadPoolExperimentSchedulerProvider.kt
index cf9a132f..cf9a132f 100644
--- a/opendc-harness/src/main/kotlin/org/opendc/harness/engine/scheduler/ThreadPoolExperimentSchedulerProvider.kt
+++ b/opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/scheduler/ThreadPoolExperimentSchedulerProvider.kt
diff --git a/opendc-harness/src/main/kotlin/org/opendc/harness/engine/strategy/CartesianExperimentStrategy.kt b/opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/strategy/CartesianExperimentStrategy.kt
index e5e08003..733eca8f 100644
--- a/opendc-harness/src/main/kotlin/org/opendc/harness/engine/strategy/CartesianExperimentStrategy.kt
+++ b/opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/strategy/CartesianExperimentStrategy.kt
@@ -25,7 +25,7 @@ package org.opendc.harness.engine.strategy
import org.opendc.harness.api.ExperimentDefinition
import org.opendc.harness.api.Parameter
import org.opendc.harness.api.Scenario
-import org.opendc.harness.internal.ScenarioImpl
+import org.opendc.harness.engine.internal.ScenarioImpl
/**
* An [ExperimentStrategy] that takes the cartesian product of the parameters and evaluates every combination.
diff --git a/opendc-harness/src/main/kotlin/org/opendc/harness/engine/strategy/CartesianExperimentStrategyProvider.kt b/opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/strategy/CartesianExperimentStrategyProvider.kt
index f18795a3..f18795a3 100644
--- a/opendc-harness/src/main/kotlin/org/opendc/harness/engine/strategy/CartesianExperimentStrategyProvider.kt
+++ b/opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/strategy/CartesianExperimentStrategyProvider.kt
diff --git a/opendc-harness/src/main/kotlin/org/opendc/harness/engine/strategy/ExperimentStrategy.kt b/opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/strategy/ExperimentStrategy.kt
index 3a0148ad..3a0148ad 100644
--- a/opendc-harness/src/main/kotlin/org/opendc/harness/engine/strategy/ExperimentStrategy.kt
+++ b/opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/strategy/ExperimentStrategy.kt
diff --git a/opendc-harness/src/main/kotlin/org/opendc/harness/engine/strategy/ExperimentStrategyProvider.kt b/opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/strategy/ExperimentStrategyProvider.kt
index 7fa05f34..7fa05f34 100644
--- a/opendc-harness/src/main/kotlin/org/opendc/harness/engine/strategy/ExperimentStrategyProvider.kt
+++ b/opendc-harness/opendc-harness-engine/src/main/kotlin/org/opendc/harness/engine/strategy/ExperimentStrategyProvider.kt
diff --git a/opendc-harness/opendc-harness-engine/src/main/resources/META-INF/services/org.opendc.harness.engine.discovery.DiscoveryProvider b/opendc-harness/opendc-harness-engine/src/main/resources/META-INF/services/org.opendc.harness.engine.discovery.DiscoveryProvider
new file mode 100644
index 00000000..83ac5015
--- /dev/null
+++ b/opendc-harness/opendc-harness-engine/src/main/resources/META-INF/services/org.opendc.harness.engine.discovery.DiscoveryProvider
@@ -0,0 +1 @@
+org.opendc.harness.engine.internal.DslDiscoveryProvider
diff --git a/opendc-harness/src/main/resources/META-INF/services/org.opendc.harness.engine.scheduler.ExperimentSchedulerProvider b/opendc-harness/opendc-harness-engine/src/main/resources/META-INF/services/org.opendc.harness.engine.scheduler.ExperimentSchedulerProvider
index 2ba3a7cb..2ba3a7cb 100644
--- a/opendc-harness/src/main/resources/META-INF/services/org.opendc.harness.engine.scheduler.ExperimentSchedulerProvider
+++ b/opendc-harness/opendc-harness-engine/src/main/resources/META-INF/services/org.opendc.harness.engine.scheduler.ExperimentSchedulerProvider
diff --git a/opendc-harness/src/main/resources/META-INF/services/org.opendc.harness.engine.strategy.ExperimentStrategyProvider b/opendc-harness/opendc-harness-engine/src/main/resources/META-INF/services/org.opendc.harness.engine.strategy.ExperimentStrategyProvider
index cb1c70ac..cb1c70ac 100644
--- a/opendc-harness/src/main/resources/META-INF/services/org.opendc.harness.engine.strategy.ExperimentStrategyProvider
+++ b/opendc-harness/opendc-harness-engine/src/main/resources/META-INF/services/org.opendc.harness.engine.strategy.ExperimentStrategyProvider
diff --git a/opendc-harness/src/test/kotlin/org/opendc/harness/EngineTest.kt b/opendc-harness/opendc-harness-engine/src/test/kotlin/org/opendc/harness/EngineTest.kt
index 6f2989db..6955f7c5 100644
--- a/opendc-harness/src/test/kotlin/org/opendc/harness/EngineTest.kt
+++ b/opendc-harness/opendc-harness-engine/src/test/kotlin/org/opendc/harness/EngineTest.kt
@@ -50,7 +50,7 @@ internal class EngineTest {
@Test
fun discovery() {
runBlocking {
- val discovery = DiscoveryProvider.findById("dsl")?.create()
+ val discovery = DiscoveryProvider.findById("dsl")?.create(Thread.currentThread().contextClassLoader)
assertNotNull(discovery)
val res = mutableListOf<ExperimentDefinition>()
discovery?.discover(DiscoveryRequest())?.toList(res)
diff --git a/opendc-harness/src/test/kotlin/org/opendc/harness/TestExperiment.kt b/opendc-harness/opendc-harness-engine/src/test/kotlin/org/opendc/harness/TestExperiment.kt
index bedd1c76..bedd1c76 100644
--- a/opendc-harness/src/test/kotlin/org/opendc/harness/TestExperiment.kt
+++ b/opendc-harness/opendc-harness-engine/src/test/kotlin/org/opendc/harness/TestExperiment.kt
diff --git a/opendc-harness/opendc-harness-junit5/build.gradle.kts b/opendc-harness/opendc-harness-junit5/build.gradle.kts
new file mode 100644
index 00000000..aa0b78d5
--- /dev/null
+++ b/opendc-harness/opendc-harness-junit5/build.gradle.kts
@@ -0,0 +1,36 @@
+/*
+ * 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.
+ */
+
+description = "JUnit Platform interface to the OpenDC Harness"
+
+/* Build configuration */
+plugins {
+ `kotlin-library-conventions`
+}
+
+dependencies {
+ api(platform(project(":opendc-platform")))
+ api(project(":opendc-harness:opendc-harness-engine"))
+
+ implementation("io.github.microutils:kotlin-logging")
+ implementation("org.junit.platform:junit-platform-engine:${versions.junitPlatform}")
+}
diff --git a/opendc-harness/src/main/kotlin/org/opendc/harness/runner/junit5/JUnitExperimentExecutionListener.kt b/opendc-harness/opendc-harness-junit5/src/main/kotlin/org/opendc/harness/runner/junit5/JUnitExperimentExecutionListener.kt
index 9e2b629d..9e2b629d 100644
--- a/opendc-harness/src/main/kotlin/org/opendc/harness/runner/junit5/JUnitExperimentExecutionListener.kt
+++ b/opendc-harness/opendc-harness-junit5/src/main/kotlin/org/opendc/harness/runner/junit5/JUnitExperimentExecutionListener.kt
diff --git a/opendc-harness/src/main/kotlin/org/opendc/harness/runner/junit5/OpenDCTestEngine.kt b/opendc-harness/opendc-harness-junit5/src/main/kotlin/org/opendc/harness/runner/junit5/OpenDCTestEngine.kt
index ab7367b8..7fc97f6d 100644
--- a/opendc-harness/src/main/kotlin/org/opendc/harness/runner/junit5/OpenDCTestEngine.kt
+++ b/opendc-harness/opendc-harness-junit5/src/main/kotlin/org/opendc/harness/runner/junit5/OpenDCTestEngine.kt
@@ -25,6 +25,7 @@ package org.opendc.harness.runner.junit5
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.emptyFlow
import mu.KotlinLogging
+import org.junit.platform.commons.util.ClassLoaderUtils
import org.junit.platform.engine.*
import org.junit.platform.engine.discovery.ClassNameFilter
import org.junit.platform.engine.discovery.ClassSelector
@@ -63,7 +64,7 @@ public class OpenDCTestEngine : TestEngine {
val classNames = request.getSelectorsByType(ClassSelector::class.java).map { DiscoverySelector.Meta("class.name", it.className) }
val classNameFilters = request.getFiltersByType(ClassNameFilter::class.java).map { DiscoveryFilter.Name(it.toPredicate()) }
- val discovery = DiscoveryProvider.createComposite()
+ val discovery = DiscoveryProvider.createComposite(ClassLoaderUtils.getDefaultClassLoader())
val definitions = discovery.discover(DiscoveryRequest(classNames, classNameFilters))
return ExperimentEngineDescriptor(uniqueId, definitions)
diff --git a/opendc-harness/src/main/resources/META-INF/services/org.junit.platform.engine.TestEngine b/opendc-harness/opendc-harness-junit5/src/main/resources/META-INF/services/org.junit.platform.engine.TestEngine
index b83eec0c..b83eec0c 100644
--- a/opendc-harness/src/main/resources/META-INF/services/org.junit.platform.engine.TestEngine
+++ b/opendc-harness/opendc-harness-junit5/src/main/resources/META-INF/services/org.junit.platform.engine.TestEngine
diff --git a/opendc-harness/src/main/resources/META-INF/services/org.opendc.harness.engine.discovery.DiscoveryProvider b/opendc-harness/src/main/resources/META-INF/services/org.opendc.harness.engine.discovery.DiscoveryProvider
deleted file mode 100644
index d6a73ded..00000000
--- a/opendc-harness/src/main/resources/META-INF/services/org.opendc.harness.engine.discovery.DiscoveryProvider
+++ /dev/null
@@ -1 +0,0 @@
-org.opendc.harness.internal.DslDiscoveryProvider