summaryrefslogtreecommitdiff
path: root/opendc-web/opendc-web-runner/src/main
diff options
context:
space:
mode:
authorFabian Mastenbroek <mail.fabianm@gmail.com>2022-10-03 17:20:34 +0200
committerFabian Mastenbroek <mail.fabianm@gmail.com>2022-10-03 20:47:12 +0200
commitbd476d11ab24fe745bb54e97a11133706bb96cb1 (patch)
treeb5edaff69212986265f9edc620e40bb8695f11eb /opendc-web/opendc-web-runner/src/main
parent448b4cafe3c757812138a8ca7580975191ac2f9c (diff)
refactor(exp/compute): Remove Topology interface
This change removes the Topology interface from the `opendc-experiments-compute` module, which was meant for provisioning the experimental topology. Howerver, with the stateless `HostSpec` class, it is not needed to resolve the topology everytime.
Diffstat (limited to 'opendc-web/opendc-web-runner/src/main')
-rw-r--r--opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/OpenDCRunner.kt102
1 files changed, 48 insertions, 54 deletions
diff --git a/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/OpenDCRunner.kt b/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/OpenDCRunner.kt
index bf0bb8f2..74f7c8c1 100644
--- a/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/OpenDCRunner.kt
+++ b/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/OpenDCRunner.kt
@@ -26,7 +26,6 @@ import mu.KotlinLogging
import org.opendc.compute.service.ComputeService
import org.opendc.experiments.compute.*
import org.opendc.experiments.compute.topology.HostSpec
-import org.opendc.experiments.compute.topology.Topology
import org.opendc.experiments.provisioner.Provisioner
import org.opendc.simulator.compute.model.MachineModel
import org.opendc.simulator.compute.model.MemoryUnit
@@ -37,6 +36,7 @@ import org.opendc.simulator.compute.power.SimplePowerDriver
import org.opendc.simulator.core.runBlockingSimulation
import org.opendc.web.proto.runner.Job
import org.opendc.web.proto.runner.Scenario
+import org.opendc.web.proto.runner.Topology
import org.opendc.web.runner.internal.WebComputeMonitor
import java.io.File
import java.time.Duration
@@ -200,7 +200,7 @@ public class OpenDCRunner(
private inner class SimulationTask(
private val scenario: Scenario,
private val repeat: Int,
- private val topology: Topology,
+ private val topology: List<HostSpec>,
) : RecursiveTask<WebComputeMonitor.Results>() {
override fun compute(): WebComputeMonitor.Results {
val monitor = WebComputeMonitor()
@@ -235,7 +235,7 @@ public class OpenDCRunner(
{ createComputeScheduler(scenario.schedulerName, Random(it.seeder.nextLong())) }
),
registerComputeMonitor(serviceDomain, monitor),
- setupHosts(serviceDomain, topology.resolve())
+ setupHosts(serviceDomain, topology)
)
val service = provisioner.registry.resolve(serviceDomain, ComputeService::class.java)!!
@@ -270,62 +270,56 @@ public class OpenDCRunner(
/**
* Convert the specified [topology] into an [Topology] understood by OpenDC.
*/
- private fun convertTopology(topology: org.opendc.web.proto.runner.Topology): Topology {
- return object : Topology {
-
- override fun resolve(): List<HostSpec> {
- val res = mutableListOf<HostSpec>()
- val random = Random(0)
-
- val machines = topology.rooms.asSequence()
- .flatMap { room ->
- room.tiles.flatMap { tile ->
- val rack = tile.rack
- rack?.machines?.map { machine -> rack to machine } ?: emptyList()
- }
- }
- for ((rack, machine) in machines) {
- val clusterId = rack.id
- val position = machine.position
-
- val processors = machine.cpus.flatMap { cpu ->
- val cores = cpu.numberOfCores
- val speed = cpu.clockRateMhz
- // TODO Remove hard coding of vendor
- val node = ProcessingNode("Intel", "amd64", cpu.name, cores)
- List(cores) { coreId ->
- ProcessingUnit(node, coreId, speed)
- }
- }
- val memoryUnits = machine.memory.map { memory ->
- MemoryUnit(
- "Samsung",
- memory.name,
- memory.speedMbPerS,
- memory.sizeMb.toLong()
- )
- }
-
- val energyConsumptionW = machine.cpus.sumOf { it.energyConsumptionW }
- val powerModel = LinearPowerModel(2 * energyConsumptionW, energyConsumptionW * 0.5)
- val powerDriver = SimplePowerDriver(powerModel)
-
- val spec = HostSpec(
- UUID(random.nextLong(), random.nextLong()),
- "node-$clusterId-$position",
- mapOf("cluster" to clusterId),
- MachineModel(processors, memoryUnits),
- powerDriver
- )
-
- res += spec
+ private fun convertTopology(topology: Topology): List<HostSpec> {
+ val res = mutableListOf<HostSpec>()
+ val random = Random(0)
+
+ val machines = topology.rooms.asSequence()
+ .flatMap { room ->
+ room.tiles.flatMap { tile ->
+ val rack = tile.rack
+ rack?.machines?.map { machine -> rack to machine } ?: emptyList()
}
+ }
- return res
+ for ((rack, machine) in machines) {
+ val clusterId = rack.id
+ val position = machine.position
+
+ val processors = machine.cpus.flatMap { cpu ->
+ val cores = cpu.numberOfCores
+ val speed = cpu.clockRateMhz
+ // TODO Remove hard coding of vendor
+ val node = ProcessingNode("Intel", "amd64", cpu.name, cores)
+ List(cores) { coreId ->
+ ProcessingUnit(node, coreId, speed)
+ }
+ }
+ val memoryUnits = machine.memory.map { memory ->
+ MemoryUnit(
+ "Samsung",
+ memory.name,
+ memory.speedMbPerS,
+ memory.sizeMb.toLong()
+ )
}
- override fun toString(): String = "WebRunnerTopologyFactory"
+ val energyConsumptionW = machine.cpus.sumOf { it.energyConsumptionW }
+ val powerModel = LinearPowerModel(2 * energyConsumptionW, energyConsumptionW * 0.5)
+ val powerDriver = SimplePowerDriver(powerModel)
+
+ val spec = HostSpec(
+ UUID(random.nextLong(), random.nextLong()),
+ "node-$clusterId-$position",
+ mapOf("cluster" to clusterId),
+ MachineModel(processors, memoryUnits),
+ powerDriver
+ )
+
+ res += spec
}
+
+ return res
}
/**