summaryrefslogtreecommitdiff
path: root/opendc
diff options
context:
space:
mode:
authorFabian Mastenbroek <mail.fabianm@gmail.com>2020-03-23 11:41:22 +0100
committerFabian Mastenbroek <mail.fabianm@gmail.com>2020-03-23 11:41:22 +0100
commitf4ee29bb97aed68329e72710dd3049c23f592f25 (patch)
tree765610632bd14ee835c26d4e9092f95029b2ec00 /opendc
parent22b3568118493f2b3d18b37406e169f19b47a311 (diff)
parenta465f3eac0fb2718859f1adea8cce0fe69bd18f7 (diff)
Merge branch '2.x-args-extension' into '2.x'
Extend SC20 arguments with performance interference and selected VMs file See merge request opendc/opendc-simulator!46
Diffstat (limited to 'opendc')
-rw-r--r--opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/TestExperiment.kt46
1 files changed, 33 insertions, 13 deletions
diff --git a/opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/TestExperiment.kt b/opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/TestExperiment.kt
index 415a7628..f0d3fc8d 100644
--- a/opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/TestExperiment.kt
+++ b/opendc/opendc-experiments-sc20/src/main/kotlin/com/atlarge/opendc/experiments/sc20/TestExperiment.kt
@@ -44,25 +44,40 @@ import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import java.io.File
+import java.io.FileInputStream
+import java.io.FileReader
import java.util.ServiceLoader
import kotlin.math.max
class ExperimentParameters(parser: ArgParser) {
val traceDirectory by parser.storing("path to the trace directory")
val environmentFile by parser.storing("path to the environment file")
+ val performanceInterferenceFile by parser.storing("path to the performance interference file").default { null }
val outputFile by parser.storing("path to where the output should be stored")
.default { "sc20-experiment-results.csv" }
- val selectedVms by parser.storing("the VMs to run") {
- // Handle case where VM list contains a VM name with an (escaped) single-quote in it
- val string = this.replace("\\'", "\\\\[")
- .replace("'", "\"")
- .replace("\\\\[", "'")
- val vms: List<String> = jacksonObjectMapper().readValue(string)
- vms
- }
- .default {
- emptyList()
+ val selectedVms by parser.storing("the VMs to run") { parseVMs(this) }
+ .default { emptyList() }
+ val selectedVmsFile by parser.storing("path to a file containing the VMs to run") {
+ parseVMs(FileReader(File(this)).readText())
+ }
+ .default { emptyList() }
+
+ fun getSelectedVmList(): List<String> {
+ return if (selectedVms.isEmpty()) {
+ selectedVmsFile
+ } else {
+ selectedVms
}
+ }
+
+ private fun parseVMs(string: String): List<String> {
+ // Handle case where VM list contains a VM name with an (escaped) single-quote in it
+ val sanitizedString = string.replace("\\'", "\\\\[")
+ .replace("'", "\"")
+ .replace("\\\\[", "'")
+ val vms: List<String> = jacksonObjectMapper().readValue(sanitizedString)
+ return vms
+ }
}
/**
@@ -85,9 +100,14 @@ fun main(args: Array<String>) {
val environment = Sc20ClusterEnvironmentReader(File(environmentFile))
.use { it.construct(root) }
- val performanceInterferenceModel = Sc20PerformanceInterferenceReader(
+ val performanceInterferenceStream = if (performanceInterferenceFile != null) {
+ FileInputStream(File(performanceInterferenceFile!!))
+ } else {
object {}.javaClass.getResourceAsStream("/env/performance-interference.json")
- ).construct()
+ }
+
+ val performanceInterferenceModel = Sc20PerformanceInterferenceReader(performanceInterferenceStream)
+ .construct()
println(simulationContext.clock.instant())
@@ -98,7 +118,7 @@ fun main(args: Array<String>) {
hypervisorMonitor
)
- val reader = Sc20TraceReader(File(traceDirectory), performanceInterferenceModel, selectedVms)
+ val reader = Sc20TraceReader(File(traceDirectory), performanceInterferenceModel, getSelectedVmList())
while (reader.hasNext()) {
val (time, workload) = reader.next()
delay(max(0, time - simulationContext.clock.millis()))