summaryrefslogtreecommitdiff
path: root/opendc-compute
diff options
context:
space:
mode:
authorFabian Mastenbroek <mail.fabianm@gmail.com>2021-09-15 23:06:08 +0200
committerFabian Mastenbroek <mail.fabianm@gmail.com>2021-09-19 14:02:49 +0200
commitb0ece0533825f5cd7983752330847071f4e438c4 (patch)
treeb85df385e33f8ce24fdb9da8af9a6c4bb1cb4810 /opendc-compute
parent859ce303f0b9110c7110b918e5957c2156fa8b26 (diff)
refactor(capelin): Support flexible topology creation
This change adds support for creating flexible topologies by creating a TopologyFactory interface that is responsible for configuring the hosts of a compute service.
Diffstat (limited to 'opendc-compute')
-rw-r--r--opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/ComputeWorkloadRunner.kt99
-rw-r--r--opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/topology/HostSpec.kt48
-rw-r--r--opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/topology/Topology.kt33
-rw-r--r--opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/topology/TopologyHelpers.kt (renamed from opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/env/MachineDef.kt)22
4 files changed, 139 insertions, 63 deletions
diff --git a/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/ComputeWorkloadRunner.kt b/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/ComputeWorkloadRunner.kt
index cc9f2705..29d84a9a 100644
--- a/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/ComputeWorkloadRunner.kt
+++ b/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/ComputeWorkloadRunner.kt
@@ -33,12 +33,9 @@ import kotlinx.coroutines.yield
import org.opendc.compute.service.ComputeService
import org.opendc.compute.service.scheduler.ComputeScheduler
import org.opendc.compute.simulator.SimHost
-import org.opendc.compute.workload.env.MachineDef
+import org.opendc.compute.workload.topology.HostSpec
import org.opendc.compute.workload.trace.TraceReader
-import org.opendc.simulator.compute.kernel.SimFairShareHypervisorProvider
-import org.opendc.simulator.compute.kernel.SimHypervisorProvider
import org.opendc.simulator.compute.kernel.interference.VmInterferenceModel
-import org.opendc.simulator.compute.power.SimplePowerDriver
import org.opendc.simulator.compute.workload.SimTraceWorkload
import org.opendc.simulator.compute.workload.SimWorkload
import org.opendc.simulator.resources.SimResourceInterpreter
@@ -50,15 +47,19 @@ import kotlin.math.max
/**
* Helper class to simulated VM-based workloads in OpenDC.
+ *
+ * @param context [CoroutineContext] to run the simulation in.
+ * @param clock [Clock] instance tracking simulation time.
+ * @param scheduler [ComputeScheduler] implementation to use for the service.
+ * @param failureModel A failure model to use for injecting failures.
+ * @param interferenceModel The model to use for performance interference.
*/
public class ComputeWorkloadRunner(
private val context: CoroutineContext,
private val clock: Clock,
scheduler: ComputeScheduler,
- machines: List<MachineDef>,
private val failureModel: FailureModel? = null,
- interferenceModel: VmInterferenceModel? = null,
- hypervisorProvider: SimHypervisorProvider = SimFairShareHypervisorProvider()
+ private val interferenceModel: VmInterferenceModel? = null,
) : AutoCloseable {
/**
* The [ComputeService] that has been configured by the manager.
@@ -86,13 +87,6 @@ public class ComputeWorkloadRunner(
val (service, serviceMeterProvider) = createService(scheduler)
this._metricProducers.add(serviceMeterProvider)
this.service = service
-
- for (def in machines) {
- val (host, hostMeterProvider) = createHost(def, hypervisorProvider, interferenceModel)
- this._metricProducers.add(hostMeterProvider)
- hosts.add(host)
- this.service.addHost(host)
- }
}
/**
@@ -156,6 +150,46 @@ public class ComputeWorkloadRunner(
}
}
+ /**
+ * Register a host for this simulation.
+ *
+ * @param spec The definition of the host.
+ * @return The [SimHost] that has been constructed by the runner.
+ */
+ public fun registerHost(spec: HostSpec): SimHost {
+ val resource = Resource.builder()
+ .put(HOST_ID, spec.uid.toString())
+ .put(HOST_NAME, spec.name)
+ .put(HOST_ARCH, ResourceAttributes.HostArchValues.AMD64)
+ .put(HOST_NCPUS, spec.model.cpus.size)
+ .put(HOST_MEM_CAPACITY, spec.model.memory.sumOf { it.size })
+ .build()
+
+ val meterProvider = SdkMeterProvider.builder()
+ .setClock(clock.toOtelClock())
+ .setResource(resource)
+ .build()
+ _metricProducers.add(meterProvider)
+
+ val host = SimHost(
+ spec.uid,
+ spec.name,
+ spec.model,
+ spec.meta,
+ context,
+ interpreter,
+ meterProvider,
+ spec.hypervisor,
+ powerDriver = spec.powerDriver,
+ interferenceDomain = interferenceModel?.newDomain(),
+ )
+
+ hosts.add(host)
+ service.addHost(host)
+
+ return host
+ }
+
override fun close() {
service.close()
@@ -182,41 +216,4 @@ public class ComputeWorkloadRunner(
val service = ComputeService(context, clock, meterProvider, scheduler)
return service to meterProvider
}
-
- /**
- * Construct a [SimHost] instance for the specified [MachineDef].
- */
- private fun createHost(
- def: MachineDef,
- hypervisorProvider: SimHypervisorProvider,
- interferenceModel: VmInterferenceModel? = null
- ): Pair<SimHost, SdkMeterProvider> {
- val resource = Resource.builder()
- .put(HOST_ID, def.uid.toString())
- .put(HOST_NAME, def.name)
- .put(HOST_ARCH, ResourceAttributes.HostArchValues.AMD64)
- .put(HOST_NCPUS, def.model.cpus.size)
- .put(HOST_MEM_CAPACITY, def.model.memory.sumOf { it.size })
- .build()
-
- val meterProvider = SdkMeterProvider.builder()
- .setClock(clock.toOtelClock())
- .setResource(resource)
- .build()
-
- val host = SimHost(
- def.uid,
- def.name,
- def.model,
- def.meta,
- context,
- interpreter,
- meterProvider,
- hypervisorProvider,
- powerDriver = SimplePowerDriver(def.powerModel),
- interferenceDomain = interferenceModel?.newDomain()
- )
-
- return host to meterProvider
- }
}
diff --git a/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/topology/HostSpec.kt b/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/topology/HostSpec.kt
new file mode 100644
index 00000000..f3dc1e9e
--- /dev/null
+++ b/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/topology/HostSpec.kt
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2021 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 org.opendc.compute.workload.topology
+
+import org.opendc.simulator.compute.kernel.SimFairShareHypervisorProvider
+import org.opendc.simulator.compute.kernel.SimHypervisorProvider
+import org.opendc.simulator.compute.model.MachineModel
+import org.opendc.simulator.compute.power.PowerDriver
+import java.util.*
+
+/**
+ * Description of a physical host that will be simulated by OpenDC and host the virtual machines.
+ *
+ * @param uid Unique identifier of the host.
+ * @param name The name of the host.
+ * @param meta The metadata of the host.
+ * @param model The physical model of the machine.
+ * @param powerDriver The [PowerDriver] to model the power consumption of the machine.
+ * @param hypervisor The hypervisor implementation to use.
+ */
+public data class HostSpec(
+ val uid: UUID,
+ val name: String,
+ val meta: Map<String, Any>,
+ val model: MachineModel,
+ val powerDriver: PowerDriver,
+ val hypervisor: SimHypervisorProvider = SimFairShareHypervisorProvider()
+)
diff --git a/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/topology/Topology.kt b/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/topology/Topology.kt
new file mode 100644
index 00000000..3b8dc918
--- /dev/null
+++ b/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/topology/Topology.kt
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2021 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 org.opendc.compute.workload.topology
+
+/**
+ * Representation of the environment of the compute service, describing the physical details of every host.
+ */
+public interface Topology {
+ /**
+ * Resolve the [Topology] into a list of [HostSpec]s.
+ */
+ public fun resolve(): List<HostSpec>
+}
diff --git a/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/env/MachineDef.kt b/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/topology/TopologyHelpers.kt
index c1695696..09159a93 100644
--- a/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/env/MachineDef.kt
+++ b/opendc-compute/opendc-compute-workload/src/main/kotlin/org/opendc/compute/workload/topology/TopologyHelpers.kt
@@ -20,19 +20,17 @@
* SOFTWARE.
*/
-package org.opendc.compute.workload.env
+@file:JvmName("TopologyHelpers")
+package org.opendc.compute.workload.topology
-import org.opendc.simulator.compute.model.MachineModel
-import org.opendc.simulator.compute.power.PowerModel
-import java.util.*
+import org.opendc.compute.workload.ComputeWorkloadRunner
/**
- * A definition of a machine in a cluster.
+ * Apply the specified [topology] to the given [ComputeWorkloadRunner].
*/
-public data class MachineDef(
- val uid: UUID,
- val name: String,
- val meta: Map<String, Any>,
- val model: MachineModel,
- val powerModel: PowerModel
-)
+public fun ComputeWorkloadRunner.apply(topology: Topology) {
+ val hosts = topology.resolve()
+ for (spec in hosts) {
+ registerHost(spec)
+ }
+}