diff options
12 files changed, 43 insertions, 35 deletions
diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 6aa9260b..bb187a40 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -26,7 +26,6 @@ import org.gradle.api.JavaVersion import org.gradle.api.Project import org.gradle.kotlin.dsl.extra import kotlin.properties.ReadOnlyProperty -import kotlin.reflect.KProperty /** * This class contains the versions of the dependencies shared by the different @@ -46,6 +45,7 @@ public class Versions(private val project: Project) { val slf4j by version() val kotlinLogging by version(name = "kotlin-logging") val log4j by version() + val config by version() val kotlinxCoroutines by version(name = "kotlinx-coroutines") diff --git a/gradle.properties b/gradle.properties index cbe19a08..20f4b711 100644 --- a/gradle.properties +++ b/gradle.properties @@ -47,6 +47,7 @@ hadoop-client.version = 3.2.1 sentry-log4j2.version = 4.2.0 mongodb-driver-sync.version = 4.2.1 classgraph.version = 4.8.102 +config.version = 1.4.1 # Dependencies (Testing) junit-jupiter.version = 5.7.1 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 +} diff --git a/opendc-platform/build.gradle.kts b/opendc-platform/build.gradle.kts index ea0591ad..3fbc144e 100644 --- a/opendc-platform/build.gradle.kts +++ b/opendc-platform/build.gradle.kts @@ -31,6 +31,7 @@ dependencies { api("org.jetbrains.kotlinx:kotlinx-coroutines-core:${versions.kotlinxCoroutines}") api("org.jetbrains.kotlinx:kotlinx-coroutines-test:${versions.kotlinxCoroutines}") + api("com.typesafe:config:1.4.1") api("io.github.microutils:kotlin-logging:${versions.kotlinLogging}") runtime("org.slf4j:slf4j-simple:${versions.slf4j}") runtime("org.apache.logging.log4j:log4j-slf4j-impl:${versions.log4j}") |
