summaryrefslogtreecommitdiff
path: root/opendc-compute
diff options
context:
space:
mode:
Diffstat (limited to 'opendc-compute')
-rw-r--r--opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/SimHost.kt59
-rw-r--r--opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/internal/Guest.kt8
2 files changed, 37 insertions, 30 deletions
diff --git a/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/SimHost.kt b/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/SimHost.kt
index 10faeb5b..908a58e9 100644
--- a/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/SimHost.kt
+++ b/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/SimHost.kt
@@ -47,6 +47,7 @@ import org.opendc.simulator.compute.model.MemoryUnit
import org.opendc.simulator.compute.power.ConstantPowerModel
import org.opendc.simulator.compute.power.PowerDriver
import org.opendc.simulator.compute.power.SimplePowerDriver
+import org.opendc.simulator.compute.workload.SimWorkload
import org.opendc.simulator.flow.FlowEngine
import java.util.*
import kotlin.coroutines.CoroutineContext
@@ -136,11 +137,6 @@ public class SimHost(
}
}
- /**
- * The [Job] that represents the machine running the hypervisor.
- */
- private var _job: Job? = null
-
init {
launch()
@@ -199,11 +195,12 @@ public class SimHost(
val guest = guests.computeIfAbsent(server) { key ->
require(canFit(key)) { "Server does not fit" }
- val machine = hypervisor.createMachine(key.flavor.toMachineModel(), key.name)
+ val machine = hypervisor.newMachine(key.flavor.toMachineModel(), key.name)
val newGuest = Guest(
scope.coroutineContext,
clock,
this,
+ hypervisor,
mapper,
guestListener,
server,
@@ -249,7 +246,7 @@ public class SimHost(
override fun close() {
reset()
scope.cancel()
- machine.close()
+ machine.cancel()
}
override fun toString(): String = "SimHost[uid=$uid,name=$name,model=$model]"
@@ -276,26 +273,39 @@ public class SimHost(
}
/**
+ * The [Job] that represents the machine running the hypervisor.
+ */
+ private var _ctx: SimMachineContext? = null
+
+ /**
* Launch the hypervisor.
*/
private fun launch() {
- check(_job == null) { "Concurrent hypervisor running" }
+ check(_ctx == null) { "Concurrent hypervisor running" }
// Launch hypervisor onto machine
- _job = scope.launch {
- try {
- _bootTime = clock.millis()
- _state = HostState.UP
- machine.run(hypervisor, emptyMap())
- } catch (_: CancellationException) {
- // Ignored
- } catch (cause: Throwable) {
- logger.error(cause) { "Host failed" }
- throw cause
- } finally {
- _state = HostState.DOWN
+ _ctx = machine.startWorkload(object : SimWorkload {
+ override fun onStart(ctx: SimMachineContext) {
+ try {
+ _bootTime = clock.millis()
+ _state = HostState.UP
+ hypervisor.onStart(ctx)
+ } catch (cause: Throwable) {
+ _state = HostState.DOWN
+ _ctx = null
+ throw cause
+ }
}
- }
+
+ override fun onStop(ctx: SimMachineContext) {
+ try {
+ hypervisor.onStop(ctx)
+ } finally {
+ _state = HostState.DOWN
+ _ctx = null
+ }
+ }
+ })
}
/**
@@ -305,12 +315,7 @@ public class SimHost(
updateUptime()
// Stop the hypervisor
- val job = _job
- if (job != null) {
- job.cancel()
- _job = null
- }
-
+ _ctx?.close()
_state = HostState.DOWN
}
diff --git a/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/internal/Guest.kt b/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/internal/Guest.kt
index 61b3214e..9f3122db 100644
--- a/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/internal/Guest.kt
+++ b/opendc-compute/opendc-compute-simulator/src/main/kotlin/org/opendc/compute/simulator/internal/Guest.kt
@@ -34,7 +34,9 @@ import org.opendc.compute.api.Server
import org.opendc.compute.api.ServerState
import org.opendc.compute.simulator.SimHost
import org.opendc.compute.simulator.SimWorkloadMapper
+import org.opendc.simulator.compute.kernel.SimHypervisor
import org.opendc.simulator.compute.kernel.SimVirtualMachine
+import org.opendc.simulator.compute.runWorkload
import org.opendc.simulator.compute.workload.SimWorkload
import java.time.Clock
import kotlin.coroutines.CoroutineContext
@@ -46,6 +48,7 @@ internal class Guest(
context: CoroutineContext,
private val clock: Clock,
val host: SimHost,
+ private val hypervisor: SimHypervisor,
private val mapper: SimWorkloadMapper,
private val listener: GuestListener,
val server: Server,
@@ -114,8 +117,7 @@ internal class Guest(
stop()
state = ServerState.DELETED
-
- machine.close()
+ hypervisor.removeMachine(machine)
scope.cancel()
}
@@ -191,7 +193,7 @@ internal class Guest(
*/
private suspend fun runMachine(workload: SimWorkload) {
delay(1) // TODO Introduce model for boot time
- machine.run(workload, mapOf("driver" to host, "server" to server))
+ machine.runWorkload(workload, mapOf("driver" to host, "server" to server))
}
/**