summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDante Niewenhuis <d.niewenhuis@hotmail.com>2024-04-22 15:35:42 +0200
committerGitHub <noreply@github.com>2024-04-22 15:35:42 +0200
commitb18e95e687a6acfbb33fdbd7da80538f1459bfb2 (patch)
treeed695a0c0a156fefe50b83be7e2e160f534ffd22
parent7ffa97502d2725c1fe0a84677a654a5ea12cb454 (diff)
returned the carbon traces to the scenarioSpec (#223)
-rw-r--r--opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/models/scenario/Scenario.kt1
-rw-r--r--opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/models/scenario/ScenarioFactories.kt40
-rw-r--r--opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/models/scenario/specs/ScenarioSpec.kt2
-rw-r--r--opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/ScenarioRunner.kt29
4 files changed, 40 insertions, 32 deletions
diff --git a/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/models/scenario/Scenario.kt b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/models/scenario/Scenario.kt
index 9029691a..bd4b5cc9 100644
--- a/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/models/scenario/Scenario.kt
+++ b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/models/scenario/Scenario.kt
@@ -46,6 +46,7 @@ public data class Scenario(
val workload: WorkloadSpec,
val allocationPolicy: AllocationPolicySpec,
val failureModel: FailureModel?,
+ val carbonTracePath: String? = null,
val exportModel: ExportModelSpec = ExportModelSpec(),
val outputFolder: String = "output",
val name: String = "",
diff --git a/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/models/scenario/ScenarioFactories.kt b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/models/scenario/ScenarioFactories.kt
index 56076f52..05fa762e 100644
--- a/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/models/scenario/ScenarioFactories.kt
+++ b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/models/scenario/ScenarioFactories.kt
@@ -31,7 +31,6 @@ import org.opendc.compute.topology.clusterTopology
import org.opendc.compute.topology.specs.TopologyJSONSpec
import org.opendc.experiments.base.models.scenario.specs.ScenarioSpec
import java.io.File
-import java.util.UUID
private val scenarioReader = ScenarioReader()
@@ -73,7 +72,6 @@ public fun getScenario(scenarioSpec: ScenarioSpec): List<Scenario> {
* @return A list of Scenarios.
*/
public fun getScenarioCombinations(scenarioSpec: ScenarioSpec): List<Scenario> {
- val topologies = getTopologies(scenarioSpec.topologies)
val topologiesSpec = scenarioSpec.topologies
val workloads = scenarioSpec.workloads
val allocationPolicies = scenarioSpec.allocationPolicies
@@ -85,20 +83,23 @@ public fun getScenarioCombinations(scenarioSpec: ScenarioSpec): List<Scenario> {
for (workload in workloads) {
for (allocationPolicy in allocationPolicies) {
for (failureModel in failureModels) {
- for (exportModel in exportModels) {
- val scenario =
- Scenario(
- topology = clusterTopology(File(topology.pathToFile)),
- workload = workload,
- allocationPolicy = allocationPolicy,
- failureModel = getFailureModel(failureModel.failureInterval),
- exportModel = exportModel,
- outputFolder = scenarioSpec.outputFolder,
- name = getOutputFolderName(scenarioSpec, topology, workload, allocationPolicy),
- runs = scenarioSpec.runs,
- initialSeed = scenarioSpec.initialSeed,
- )
- scenarios.add(scenario)
+ for (carbonTracePath in scenarioSpec.carbonTracePaths) {
+ for (exportModel in exportModels) {
+ val scenario =
+ Scenario(
+ topology = clusterTopology(File(topology.pathToFile)),
+ workload = workload,
+ allocationPolicy = allocationPolicy,
+ failureModel = getFailureModel(failureModel.failureInterval),
+ carbonTracePath = carbonTracePath,
+ exportModel = exportModel,
+ outputFolder = scenarioSpec.outputFolder,
+ name = getOutputFolderName(scenarioSpec, topology, workload, allocationPolicy),
+ runs = scenarioSpec.runs,
+ initialSeed = scenarioSpec.initialSeed,
+ )
+ scenarios.add(scenario)
+ }
}
}
}
@@ -139,8 +140,7 @@ public fun getOutputFolderName(
allocationPolicy: AllocationPolicySpec,
): String {
return "scenario=${scenarioSpec.name}" +
- "-topology=${topology.pathToFile}" +
- "-workload=${workload.name}}" +
- "-scheduler=${allocationPolicy.name}" +
- "-${UUID.randomUUID().toString().substring(0, 8)}"
+ "-topology=${topology.name}" +
+ "-workload=${workload.name}" +
+ "-scheduler=${allocationPolicy.name}"
}
diff --git a/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/models/scenario/specs/ScenarioSpec.kt b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/models/scenario/specs/ScenarioSpec.kt
index 5f9aec4a..15012461 100644
--- a/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/models/scenario/specs/ScenarioSpec.kt
+++ b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/models/scenario/specs/ScenarioSpec.kt
@@ -47,6 +47,7 @@ public data class ScenarioSpec(
val workloads: List<WorkloadSpec>,
val allocationPolicies: List<AllocationPolicySpec>,
val failureModels: List<FailureModelSpec> = listOf(FailureModelSpec()),
+ val carbonTracePaths: List<String?> = listOf(null),
val exportModels: List<ExportModelSpec> = listOf(ExportModelSpec()),
val outputFolder: String = "output",
val initialSeed: Int = 0,
@@ -57,6 +58,7 @@ public data class ScenarioSpec(
require(runs > 0) { "The number of runs should always be positive" }
// generate name if not provided
+ // TODO: improve this
if (name == "") {
name =
"workload=${workloads[0].name}_topology=${topologies[0].name}_allocationPolicy=${allocationPolicies[0].name}"
diff --git a/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/ScenarioRunner.kt b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/ScenarioRunner.kt
index 63853d33..734cdacc 100644
--- a/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/ScenarioRunner.kt
+++ b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/ScenarioRunner.kt
@@ -25,6 +25,8 @@ package org.opendc.experiments.base.runner
import getWorkloadType
import me.tongfei.progressbar.ProgressBarBuilder
import me.tongfei.progressbar.ProgressBarStyle
+import org.opendc.compute.carbon.CarbonTrace
+import org.opendc.compute.carbon.getCarbonTrace
import org.opendc.compute.service.ComputeService
import org.opendc.compute.service.scheduler.ComputeSchedulerEnum
import org.opendc.compute.service.scheduler.createComputeScheduler
@@ -55,7 +57,7 @@ public fun runScenario(
val ansiReset = "\u001B[0m"
val ansiGreen = "\u001B[32m"
val ansiBlue = "\u001B[34m"
- clearOutputFolder()
+ clearOutputFolder(scenarios[0].outputFolder)
for (scenario in scenarios) {
val pool = ForkJoinPool(parallelism)
@@ -116,14 +118,12 @@ public fun runScenario(
setupHosts(serviceDomain, scenario.topology, optimize = true),
)
- val partition = scenario.name + "/seed=$seed"
val workloadLoader = ComputeWorkloadLoader(File(scenario.workload.pathToFile))
val vms = getWorkloadType(scenario.workload.type).resolve(workloadLoader, Random(seed))
- val startTime = Duration.ofMillis(vms.minOf { it.startTime }.toEpochMilli())
- // saveInSeedFolder(provisioner, serviceDomain, scenario, seed, partition, startTime)
- // XOR
- saveInOutputFolder(provisioner, serviceDomain, scenario, startTime)
+ val carbonTrace = getCarbonTrace(scenario.carbonTracePath)
+ val startTime = Duration.ofMillis(vms.minOf { it.startTime }.toEpochMilli())
+ saveInOutputFolder(provisioner, serviceDomain, scenario, seed, startTime, carbonTrace)
val service = provisioner.registry.resolve(serviceDomain, ComputeService::class.java)!!
service.replay(timeSource, vms, seed, failureModel = scenario.failureModel)
@@ -168,32 +168,37 @@ public fun saveInSeedFolder(
* @param provisioner The provisioner used to setup and run the simulation.
* @param serviceDomain The domain of the compute service.
* @param scenario The scenario being run.
- * @param startTime The start time of the simulation.
+ * @param seed The seed of the current run
+ * @param startTime The start time of the simulation given by the workload trace.
+ * @param carbonTrace The carbon trace used to determine carbon emissions.
*/
public fun saveInOutputFolder(
provisioner: Provisioner,
serviceDomain: String,
scenario: Scenario,
+ seed: Long,
startTime: Duration,
+ carbonTrace: CarbonTrace,
) {
provisioner.runStep(
registerComputeMonitor(
serviceDomain,
ParquetComputeMonitor(
- File("output/simulation-results/"),
- scenario.name,
+ File("${scenario.outputFolder}/${scenario.name}"),
+ "seed=$seed",
bufferSize = 4096,
),
Duration.ofSeconds(scenario.exportModel.exportInterval),
startTime,
+ carbonTrace,
),
)
}
/**
- * Utilitary function, in case we want to delete the previous simulation results.
+ * Utility function, in case we want to delete the previous simulation results.
+ * @param outputFolderPath The output folder to remove
*/
-public fun clearOutputFolder() {
- val outputFolderPath = "output/simulation-results/"
+public fun clearOutputFolder(outputFolderPath: String) {
if (File(outputFolderPath).exists()) File(outputFolderPath).deleteRecursively()
}