summaryrefslogtreecommitdiff
path: root/opendc/opendc-experiments-sc20/src/test
diff options
context:
space:
mode:
authorFabian Mastenbroek <mail.fabianm@gmail.com>2020-05-05 22:35:24 +0200
committerFabian Mastenbroek <mail.fabianm@gmail.com>2020-05-06 11:42:20 +0200
commit48f6a6f2d42851bc2eeed5b6ef41145740c70286 (patch)
treec42f2a5b08923e91b0afad4bc686b298c165a1ea /opendc/opendc-experiments-sc20/src/test
parent2b9b1e9e030dccacf9aa549fc49b2e5e382750bf (diff)
test: Add initial integration test for SC20 experiments
Diffstat (limited to 'opendc/opendc-experiments-sc20/src/test')
-rw-r--r--opendc/opendc-experiments-sc20/src/test/kotlin/com/atlarge/opendc/experiments/sc20/Sc20IntegrationTest.kt183
-rw-r--r--opendc/opendc-experiments-sc20/src/test/resources/env/topology.txt5
-rw-r--r--opendc/opendc-experiments-sc20/src/test/resources/trace/meta.parquetbin0 -> 2148 bytes
-rw-r--r--opendc/opendc-experiments-sc20/src/test/resources/trace/trace.parquetbin0 -> 1672463 bytes
4 files changed, 188 insertions, 0 deletions
diff --git a/opendc/opendc-experiments-sc20/src/test/kotlin/com/atlarge/opendc/experiments/sc20/Sc20IntegrationTest.kt b/opendc/opendc-experiments-sc20/src/test/kotlin/com/atlarge/opendc/experiments/sc20/Sc20IntegrationTest.kt
new file mode 100644
index 00000000..dd0931e4
--- /dev/null
+++ b/opendc/opendc-experiments-sc20/src/test/kotlin/com/atlarge/opendc/experiments/sc20/Sc20IntegrationTest.kt
@@ -0,0 +1,183 @@
+/*
+ * MIT License
+ *
+ * Copyright (c) 2020 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.
+ */
+
+package com.atlarge.opendc.experiments.sc20
+
+import com.atlarge.odcsim.Domain
+import com.atlarge.odcsim.SimulationEngine
+import com.atlarge.odcsim.SimulationEngineProvider
+import com.atlarge.opendc.compute.core.Server
+import com.atlarge.opendc.compute.core.workload.VmWorkload
+import com.atlarge.opendc.compute.virt.service.SimpleVirtProvisioningService
+import com.atlarge.opendc.compute.virt.service.allocation.AvailableCoreMemoryAllocationPolicy
+import com.atlarge.opendc.format.environment.EnvironmentReader
+import com.atlarge.opendc.format.environment.sc20.Sc20ClusterEnvironmentReader
+import com.atlarge.opendc.format.trace.TraceReader
+import com.atlarge.opendc.format.trace.sc20.Sc20PerformanceInterferenceReader
+import kotlinx.coroutines.cancel
+import kotlinx.coroutines.channels.Channel
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.runBlocking
+import org.junit.jupiter.api.AfterEach
+import org.junit.jupiter.api.Assertions.assertEquals
+import org.junit.jupiter.api.BeforeEach
+import org.junit.jupiter.api.Test
+import java.io.File
+import java.util.ServiceLoader
+
+/**
+ * An integration test suite for the SC20 experiments.
+ */
+class Sc20IntegrationTest {
+ /**
+ * The simulation engine to use.
+ */
+ private lateinit var simulationEngine: SimulationEngine
+
+ /**
+ * The root simulation domain to run in.
+ */
+ private lateinit var root: Domain
+
+ /**
+ * The monitor used to keep track of the metrics.
+ */
+ private lateinit var monitor: TestSc20Monitor
+
+ /**
+ * Setup the experimental environment.
+ */
+ @BeforeEach
+ fun setUp() {
+ val provider = ServiceLoader.load(SimulationEngineProvider::class.java).first()
+ simulationEngine = provider("test")
+ root = simulationEngine.newDomain("root")
+ monitor = TestSc20Monitor()
+ }
+
+ /**
+ * Tear down the experimental environment.
+ */
+ @AfterEach
+ fun tearDown() = runBlocking {
+ simulationEngine.terminate()
+ }
+
+ @Test
+ fun smoke() {
+ val failures = false
+ val seed = 0
+ val chan = Channel<Unit>(Channel.CONFLATED)
+ val allocationPolicy = AvailableCoreMemoryAllocationPolicy()
+ val traceReader = createTestTraceReader()
+ val environmentReader = createTestEnvironmentReader()
+ lateinit var scheduler: SimpleVirtProvisioningService
+
+ root.launch {
+ val res = createProvisioner(root, environmentReader, allocationPolicy)
+ val bareMetalProvisioner = res.first
+ scheduler = res.second
+
+ val failureDomain = if (failures) {
+ println("ENABLING failures")
+ createFailureDomain(seed, bareMetalProvisioner, chan)
+ } else {
+ null
+ }
+
+ attachMonitor(scheduler, monitor)
+ processTrace(traceReader, scheduler, chan, monitor)
+
+ println("Finish SUBMIT=${scheduler.submittedVms} FAIL=${scheduler.unscheduledVms} QUEUE=${scheduler.queuedVms} RUNNING=${scheduler.runningVms} FINISH=${scheduler.finishedVms}")
+
+ failureDomain?.cancel()
+ scheduler.terminate()
+ }
+
+ runSimulation()
+
+ // Note that these values have been verified beforehand
+ assertEquals(50, scheduler.submittedVms, "The trace contains 50 VMs")
+ assertEquals(50, scheduler.finishedVms, "All VMs should finish after a run")
+ assertEquals(207379117949, monitor.totalRequestedBurst)
+ assertEquals(207378478631, monitor.totalGrantedBurst)
+ assertEquals(639360, monitor.totalOvercommissionedBurst)
+ assertEquals(0, monitor.totalInterferedBurst)
+ }
+
+ /**
+ * Run the simulation.
+ */
+ private fun runSimulation() = runBlocking {
+ simulationEngine.run()
+ }
+
+ /**
+ * Obtain the trace reader for the test.
+ */
+ private fun createTestTraceReader(): TraceReader<VmWorkload> {
+ val performanceInterferenceStream = object {}.javaClass.getResourceAsStream("/env/performance-interference.json")
+ val performanceInterferenceModel = Sc20PerformanceInterferenceReader(performanceInterferenceStream)
+ .construct()
+ return createTraceReader(File("src/test/resources/trace"), performanceInterferenceModel, emptyList(), 0)
+ }
+
+ /**
+ * Obtain the environment reader for the test.
+ */
+ private fun createTestEnvironmentReader(): EnvironmentReader {
+ val stream = object {}.javaClass.getResourceAsStream("/env/topology.txt")
+ return Sc20ClusterEnvironmentReader(stream)
+ }
+
+ class TestSc20Monitor : Sc20Monitor {
+ var totalRequestedBurst = 0L
+ var totalGrantedBurst = 0L
+ var totalOvercommissionedBurst = 0L
+ var totalInterferedBurst = 0L
+
+ override suspend fun onSliceFinish(
+ time: Long,
+ requestedBurst: Long,
+ grantedBurst: Long,
+ overcommissionedBurst: Long,
+ interferedBurst: Long,
+ cpuUsage: Double,
+ cpuDemand: Double,
+ numberOfDeployedImages: Int,
+ hostServer: Server,
+ submittedVms: Long,
+ queuedVms: Long,
+ runningVms: Long,
+ finishedVms: Long,
+ duration: Long
+ ) {
+ totalRequestedBurst += requestedBurst
+ totalGrantedBurst += grantedBurst
+ totalOvercommissionedBurst += overcommissionedBurst
+ totalInterferedBurst += interferedBurst
+ }
+ override fun close() {}
+ }
+}
diff --git a/opendc/opendc-experiments-sc20/src/test/resources/env/topology.txt b/opendc/opendc-experiments-sc20/src/test/resources/env/topology.txt
new file mode 100644
index 00000000..6b347bff
--- /dev/null
+++ b/opendc/opendc-experiments-sc20/src/test/resources/env/topology.txt
@@ -0,0 +1,5 @@
+ClusterID;ClusterName;Cores;Speed;Memory;numberOfHosts;memoryCapacityPerHost;coreCountPerHost
+A01;A01;32;3.2;2048;1;256;32
+B01;B01;48;2.93;1256;6;64;8
+C01;C01;32;3.2;2048;2;128;16
+
diff --git a/opendc/opendc-experiments-sc20/src/test/resources/trace/meta.parquet b/opendc/opendc-experiments-sc20/src/test/resources/trace/meta.parquet
new file mode 100644
index 00000000..ce7a812c
--- /dev/null
+++ b/opendc/opendc-experiments-sc20/src/test/resources/trace/meta.parquet
Binary files differ
diff --git a/opendc/opendc-experiments-sc20/src/test/resources/trace/trace.parquet b/opendc/opendc-experiments-sc20/src/test/resources/trace/trace.parquet
new file mode 100644
index 00000000..1d7ce882
--- /dev/null
+++ b/opendc/opendc-experiments-sc20/src/test/resources/trace/trace.parquet
Binary files differ