summaryrefslogtreecommitdiff
path: root/opendc-experiments
diff options
context:
space:
mode:
authorFabian Mastenbroek <mail.fabianm@gmail.com>2021-05-04 21:43:46 +0200
committerFabian Mastenbroek <mail.fabianm@gmail.com>2021-05-05 12:12:30 +0200
commitad65a05e3f41850807f95f7d643496a4d39a6197 (patch)
tree238b0fc83a5836d3fc08e3e888cec298eb8e8cd1 /opendc-experiments
parent6466d5e1b8da4582434f02dff2ab56e8f736ef85 (diff)
exp: Add support for experiment configuration
This change adds support for configuring the experiments via configuration files using the TypeSafe config library. In the future, we will also integrate support for configuration into the harness.
Diffstat (limited to 'opendc-experiments')
-rw-r--r--opendc-experiments/opendc-experiments-capelin/build.gradle.kts1
-rw-r--r--opendc-experiments/opendc-experiments-capelin/src/main/kotlin/org/opendc/experiments/capelin/Portfolio.kt21
-rw-r--r--opendc-experiments/opendc-experiments-capelin/src/main/resources/application.conf6
-rw-r--r--opendc-experiments/opendc-experiments-energy21/build.gradle.kts1
-rw-r--r--opendc-experiments/opendc-experiments-energy21/src/main/kotlin/org/opendc/experiments/energy21/EnergyExperiment.kt14
-rw-r--r--opendc-experiments/opendc-experiments-energy21/src/main/resources/application.conf8
-rw-r--r--opendc-experiments/opendc-experiments-serverless20/build.gradle.kts1
-rw-r--r--opendc-experiments/opendc-experiments-serverless20/src/main/kotlin/org/opendc/experiments/serverless/ServerlessExperiment.kt14
-rw-r--r--opendc-experiments/opendc-experiments-serverless20/src/main/resources/application.conf8
9 files changed, 40 insertions, 34 deletions
diff --git a/opendc-experiments/opendc-experiments-capelin/build.gradle.kts b/opendc-experiments/opendc-experiments-capelin/build.gradle.kts
index 83d89574..06a35c4b 100644
--- a/opendc-experiments/opendc-experiments-capelin/build.gradle.kts
+++ b/opendc-experiments/opendc-experiments-capelin/build.gradle.kts
@@ -39,6 +39,7 @@ dependencies {
implementation(project(":opendc-compute:opendc-compute-simulator"))
implementation("io.github.microutils:kotlin-logging")
+ implementation("com.typesafe:config")
implementation("me.tongfei:progressbar:${versions["progressbar"]}")
implementation("com.github.ajalt.clikt:clikt:${versions["clikt"]}")
diff --git a/opendc-experiments/opendc-experiments-capelin/src/main/kotlin/org/opendc/experiments/capelin/Portfolio.kt b/opendc-experiments/opendc-experiments-capelin/src/main/kotlin/org/opendc/experiments/capelin/Portfolio.kt
index fc6f79d3..b70eefb2 100644
--- a/opendc-experiments/opendc-experiments-capelin/src/main/kotlin/org/opendc/experiments/capelin/Portfolio.kt
+++ b/opendc-experiments/opendc-experiments-capelin/src/main/kotlin/org/opendc/experiments/capelin/Portfolio.kt
@@ -22,6 +22,7 @@
package org.opendc.experiments.capelin
+import com.typesafe.config.ConfigFactory
import io.opentelemetry.sdk.metrics.export.MetricProducer
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.cancel
@@ -60,19 +61,9 @@ public abstract class Portfolio(name: String) : Experiment(name) {
private val logger = KotlinLogging.logger {}
/**
- * The path to where the environments are located.
+ * The configuration to use.
*/
- private val environmentPath by anyOf(File("input/environments/"))
-
- /**
- * The path to where the traces are located.
- */
- private val tracePath by anyOf(File("input/traces/"))
-
- /**
- * The path to where the output results should be written.
- */
- private val outputPath by anyOf(File("output/"))
+ private val config = ConfigFactory.load().getConfig("opendc.experiments.capelin")
/**
* The path to the original VM placements file.
@@ -115,7 +106,7 @@ public abstract class Portfolio(name: String) : Experiment(name) {
@OptIn(ExperimentalCoroutinesApi::class)
override fun doRun(repeat: Int): Unit = runBlockingSimulation {
val seeder = Random(repeat.toLong())
- val environment = Sc20ClusterEnvironmentReader(File(environmentPath, "${topology.name}.txt"))
+ val environment = Sc20ClusterEnvironmentReader(File(config.getString("env-path"), "${topology.name}.txt"))
val chan = Channel<Unit>(Channel.CONFLATED)
val allocationPolicy = createComputeScheduler(seeder)
@@ -131,7 +122,7 @@ public abstract class Portfolio(name: String) : Experiment(name) {
val rawReaders = workloadNames.map { workloadName ->
traceReaders.computeIfAbsent(workloadName) {
logger.info { "Loading trace $workloadName" }
- Sc20RawParquetTraceReader(File(tracePath, workloadName))
+ Sc20RawParquetTraceReader(File(config.getString("trace-path"), workloadName))
}
}
@@ -141,7 +132,7 @@ public abstract class Portfolio(name: String) : Experiment(name) {
val trace = Sc20ParquetTraceReader(rawReaders, performanceInterferenceModel, workload, seeder.nextInt())
val monitor = ParquetExperimentMonitor(
- outputPath,
+ File(config.getString("output-path")),
"portfolio_id=$name/scenario_id=$id/run_id=$repeat",
4096
)
diff --git a/opendc-experiments/opendc-experiments-capelin/src/main/resources/application.conf b/opendc-experiments/opendc-experiments-capelin/src/main/resources/application.conf
new file mode 100644
index 00000000..f0e0f2d3
--- /dev/null
+++ b/opendc-experiments/opendc-experiments-capelin/src/main/resources/application.conf
@@ -0,0 +1,6 @@
+# Default configuration for the Capelin experiments
+opendc.experiments.capelin {
+ env-path = input/environments/
+ trace-path = input/traces/
+ output-path = output
+}
diff --git a/opendc-experiments/opendc-experiments-energy21/build.gradle.kts b/opendc-experiments/opendc-experiments-energy21/build.gradle.kts
index 7d5fc98d..fc37fc1c 100644
--- a/opendc-experiments/opendc-experiments-energy21/build.gradle.kts
+++ b/opendc-experiments/opendc-experiments-energy21/build.gradle.kts
@@ -39,6 +39,7 @@ dependencies {
implementation(project(":opendc-experiments:opendc-experiments-capelin"))
implementation(project(":opendc-telemetry:opendc-telemetry-sdk"))
implementation("io.github.microutils:kotlin-logging")
+ implementation("com.typesafe:config")
implementation("org.apache.parquet:parquet-avro:${versions["parquet-avro"]}")
implementation("org.apache.hadoop:hadoop-client:${versions["hadoop-client"]}") {
diff --git a/opendc-experiments/opendc-experiments-energy21/src/main/kotlin/org/opendc/experiments/energy21/EnergyExperiment.kt b/opendc-experiments/opendc-experiments-energy21/src/main/kotlin/org/opendc/experiments/energy21/EnergyExperiment.kt
index 772c9bcc..7460a1e7 100644
--- a/opendc-experiments/opendc-experiments-energy21/src/main/kotlin/org/opendc/experiments/energy21/EnergyExperiment.kt
+++ b/opendc-experiments/opendc-experiments-energy21/src/main/kotlin/org/opendc/experiments/energy21/EnergyExperiment.kt
@@ -22,6 +22,7 @@
package org.opendc.experiments.energy21
+import com.typesafe.config.ConfigFactory
import io.opentelemetry.api.metrics.MeterProvider
import io.opentelemetry.sdk.metrics.SdkMeterProvider
import io.opentelemetry.sdk.metrics.export.MetricProducer
@@ -65,14 +66,9 @@ public class EnergyExperiment : Experiment("Energy Modeling 2021") {
private val logger = KotlinLogging.logger {}
/**
- * The path to where the traces are located.
+ * The configuration to use.
*/
- private val tracePath by anyOf(File("input/traces/"))
-
- /**
- * The path to where the output results should be written.
- */
- private val outputPath by anyOf(File("output/"))
+ private val config = ConfigFactory.load().getConfig("opendc.experiments.energy21")
/**
* The traces to test.
@@ -96,8 +92,8 @@ public class EnergyExperiment : Experiment("Energy Modeling 2021") {
.setClock(clock.toOtelClock())
.build()
- val monitor = ParquetExperimentMonitor(outputPath, "power_model=$powerModel/run_id=$repeat", 4096)
- val trace = Sc20StreamingParquetTraceReader(File(tracePath, trace), random = Random(1).asKotlinRandom())
+ val monitor = ParquetExperimentMonitor(File(config.getString("output-path")), "power_model=$powerModel/run_id=$repeat", 4096)
+ val trace = Sc20StreamingParquetTraceReader(File(config.getString("trace-path"), trace), random = Random(1).asKotlinRandom())
withComputeService(clock, meterProvider, allocationPolicy) { scheduler ->
withMonitor(monitor, clock, meterProvider as MetricProducer, scheduler) {
diff --git a/opendc-experiments/opendc-experiments-energy21/src/main/resources/application.conf b/opendc-experiments/opendc-experiments-energy21/src/main/resources/application.conf
new file mode 100644
index 00000000..3e011862
--- /dev/null
+++ b/opendc-experiments/opendc-experiments-energy21/src/main/resources/application.conf
@@ -0,0 +1,8 @@
+# Default configuration for the energy experiments
+opendc.experiments.energy21 {
+ # Path to the directory containing the input traces
+ trace-path = input/traces
+
+ # Path to the output directory to write the results to
+ output-path = output
+}
diff --git a/opendc-experiments/opendc-experiments-serverless20/build.gradle.kts b/opendc-experiments/opendc-experiments-serverless20/build.gradle.kts
index 2dfa2d3f..f19d6067 100644
--- a/opendc-experiments/opendc-experiments-serverless20/build.gradle.kts
+++ b/opendc-experiments/opendc-experiments-serverless20/build.gradle.kts
@@ -37,6 +37,7 @@ dependencies {
implementation(project(":opendc-telemetry:opendc-telemetry-sdk"))
implementation(project(":opendc-harness:opendc-harness-cli"))
implementation("io.github.microutils:kotlin-logging")
+ implementation("com.typesafe:config")
implementation("org.apache.parquet:parquet-avro:${versions["parquet-avro"]}")
implementation("org.apache.hadoop:hadoop-client:${versions["hadoop-client"]}") {
diff --git a/opendc-experiments/opendc-experiments-serverless20/src/main/kotlin/org/opendc/experiments/serverless/ServerlessExperiment.kt b/opendc-experiments/opendc-experiments-serverless20/src/main/kotlin/org/opendc/experiments/serverless/ServerlessExperiment.kt
index 67b5ea54..3ff01e39 100644
--- a/opendc-experiments/opendc-experiments-serverless20/src/main/kotlin/org/opendc/experiments/serverless/ServerlessExperiment.kt
+++ b/opendc-experiments/opendc-experiments-serverless20/src/main/kotlin/org/opendc/experiments/serverless/ServerlessExperiment.kt
@@ -22,9 +22,9 @@
package org.opendc.experiments.serverless
+import com.typesafe.config.ConfigFactory
import io.opentelemetry.api.metrics.MeterProvider
import io.opentelemetry.sdk.metrics.SdkMeterProvider
-import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
@@ -59,14 +59,9 @@ public class ServerlessExperiment : Experiment("Serverless") {
private val logger = KotlinLogging.logger {}
/**
- * The path to where the traces are located.
+ * The configuration to use.
*/
- private val tracePath by anyOf(File("../../input/traces/serverless"))
-
- /**
- * The path to where the output results should be written.
- */
- private val outputPath by anyOf(File("output/"))
+ private val config = ConfigFactory.load().getConfig("opendc.experiments.serverless20")
/**
* The routing policy to test.
@@ -78,14 +73,13 @@ public class ServerlessExperiment : Experiment("Serverless") {
*/
private val coldStartModel by anyOf(ColdStartModel.LAMBDA, ColdStartModel.AZURE, ColdStartModel.GOOGLE)
- @OptIn(ExperimentalCoroutinesApi::class)
override fun doRun(repeat: Int): Unit = runBlockingSimulation {
val meterProvider: MeterProvider = SdkMeterProvider
.builder()
.setClock(clock.toOtelClock())
.build()
- val trace = ServerlessTraceReader().parse(tracePath)
+ val trace = ServerlessTraceReader().parse(File(config.getString("trace-path")))
val traceById = trace.associateBy { it.id }
val delayInjector = StochasticDelayInjector(coldStartModel, Random())
val deployer = SimFunctionDeployer(clock, this, createMachineModel(), delayInjector) { FunctionTraceWorkload(traceById.getValue(it.name)) }
diff --git a/opendc-experiments/opendc-experiments-serverless20/src/main/resources/application.conf b/opendc-experiments/opendc-experiments-serverless20/src/main/resources/application.conf
new file mode 100644
index 00000000..a065c5d6
--- /dev/null
+++ b/opendc-experiments/opendc-experiments-serverless20/src/main/resources/application.conf
@@ -0,0 +1,8 @@
+# Default configuration for the serverless experiments
+opendc.experiments.serverless20 {
+ # Path to the directory containing the serverless trace
+ trace-path = input/traces/serverless
+
+ # Path to the output directory to write the results to
+ output-path = output
+}