From 21270e0b4250bd6927e85227fa825cf8ed59aaed Mon Sep 17 00:00:00 2001 From: Fabian Mastenbroek Date: Thu, 22 Sep 2022 10:55:13 +0200 Subject: refactor(compute): Add separate error host state This change adds a new HostState to indicate that the host is in an error state as opposed to being purposefully unavailable. --- .../kotlin/org/opendc/compute/service/driver/HostState.kt | 11 ++++++++--- .../org/opendc/compute/service/internal/ComputeServiceImpl.kt | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) (limited to 'opendc-compute/opendc-compute-service/src') diff --git a/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/driver/HostState.kt b/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/driver/HostState.kt index 6d85ee2d..ca6c625c 100644 --- a/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/driver/HostState.kt +++ b/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/driver/HostState.kt @@ -27,12 +27,17 @@ package org.opendc.compute.service.driver */ public enum class HostState { /** - * The host is up. + * The host is up and able to host guests. */ UP, /** - * The host is down. + * The host is in a (forced) down state and unable to host any guests. */ - DOWN + DOWN, + + /** + * The host is in an error state and unable to host any guests. + */ + ERROR, } diff --git a/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/internal/ComputeServiceImpl.kt b/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/internal/ComputeServiceImpl.kt index 21aaa19e..52ee780b 100644 --- a/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/internal/ComputeServiceImpl.kt +++ b/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/internal/ComputeServiceImpl.kt @@ -411,7 +411,7 @@ internal class ComputeServiceImpl( // Re-schedule on the new machine requestSchedulingCycle() } - HostState.DOWN -> { + else -> { logger.debug { "[${clock.instant()}] Host ${host.uid} state changed: $newState" } val hv = hostToView[host] ?: return -- cgit v1.2.3 From 3d5eb562227dcad5a8a60f31b96e6d68f7774fb2 Mon Sep 17 00:00:00 2001 From: Fabian Mastenbroek Date: Fri, 23 Sep 2022 12:27:09 +0200 Subject: refactor(compute): Provide access to instances in compute service This change updates the interface of `ComputeService` to provide access to the instances (servers) that have been registered with the compute service. This allows metric collectors to query the metrics of the servers that are currently running. --- .../org/opendc/compute/service/ComputeService.kt | 5 +++ .../compute/service/internal/ComputeServiceImpl.kt | 43 +++++++++++++--------- 2 files changed, 30 insertions(+), 18 deletions(-) (limited to 'opendc-compute/opendc-compute-service/src') diff --git a/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/ComputeService.kt b/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/ComputeService.kt index c0b70268..28ef7c40 100644 --- a/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/ComputeService.kt +++ b/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/ComputeService.kt @@ -36,6 +36,11 @@ import kotlin.coroutines.CoroutineContext * The [ComputeService] hosts the API implementation of the OpenDC Compute service. */ public interface ComputeService : AutoCloseable { + /** + * The servers that are registered with the "compute" service. + */ + public val servers: List + /** * The hosts that are registered with the "compute" service. */ diff --git a/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/internal/ComputeServiceImpl.kt b/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/internal/ComputeServiceImpl.kt index 52ee780b..519cf6c6 100644 --- a/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/internal/ComputeServiceImpl.kt +++ b/opendc-compute/opendc-compute-service/src/main/kotlin/org/opendc/compute/service/internal/ComputeServiceImpl.kt @@ -91,17 +91,18 @@ internal class ComputeServiceImpl( /** * The registered flavors for this compute service. */ - internal val flavors = mutableMapOf() + internal val flavorById = mutableMapOf() /** * The registered images for this compute service. */ - internal val images = mutableMapOf() + internal val imageById = mutableMapOf() /** * The registered servers for this compute service. */ - private val servers = mutableMapOf() + private val serverById = mutableMapOf() + override val servers: MutableList = mutableListOf() private var maxCores = 0 private var maxMemory = 0L @@ -127,13 +128,13 @@ internal class ComputeServiceImpl( override suspend fun queryFlavors(): List { check(!isClosed) { "Client is already closed" } - return flavors.values.map { ClientFlavor(it) } + return flavorById.values.map { ClientFlavor(it) } } override suspend fun findFlavor(id: UUID): Flavor? { check(!isClosed) { "Client is already closed" } - return flavors[id]?.let { ClientFlavor(it) } + return flavorById[id]?.let { ClientFlavor(it) } } override suspend fun newFlavor( @@ -156,7 +157,7 @@ internal class ComputeServiceImpl( meta ) - flavors[uid] = flavor + flavorById[uid] = flavor return ClientFlavor(flavor) } @@ -164,13 +165,13 @@ internal class ComputeServiceImpl( override suspend fun queryImages(): List { check(!isClosed) { "Client is already closed" } - return images.values.map { ClientImage(it) } + return imageById.values.map { ClientImage(it) } } override suspend fun findImage(id: UUID): Image? { check(!isClosed) { "Client is already closed" } - return images[id]?.let { ClientImage(it) } + return imageById[id]?.let { ClientImage(it) } } override suspend fun newImage(name: String, labels: Map, meta: Map): Image { @@ -179,7 +180,7 @@ internal class ComputeServiceImpl( val uid = UUID(clock.millis(), random.nextLong()) val image = InternalImage(this@ComputeServiceImpl, uid, name, labels, meta) - images[uid] = image + imageById[uid] = image return ClientImage(image) } @@ -199,13 +200,14 @@ internal class ComputeServiceImpl( this@ComputeServiceImpl, uid, name, - requireNotNull(flavors[flavor.uid]) { "Unknown flavor" }, - requireNotNull(images[image.uid]) { "Unknown image" }, + requireNotNull(flavorById[flavor.uid]) { "Unknown flavor" }, + requireNotNull(imageById[image.uid]) { "Unknown image" }, labels.toMutableMap(), meta.toMutableMap() ) - servers[uid] = server + serverById[uid] = server + servers.add(server) if (start) { server.start() @@ -217,13 +219,13 @@ internal class ComputeServiceImpl( override suspend fun findServer(id: UUID): Server? { check(!isClosed) { "Client is already closed" } - return servers[id]?.let { ClientServer(it) } + return serverById[id]?.let { ClientServer(it) } } override suspend fun queryServers(): List { check(!isClosed) { "Client is already closed" } - return servers.values.map { ClientServer(it) } + return serverById.values.map { ClientServer(it) } } override fun close() { @@ -263,7 +265,11 @@ internal class ComputeServiceImpl( } override fun lookupHost(server: Server): Host? { - val internal = requireNotNull(servers[server.uid]) { "Invalid server passed to lookupHost" } + if (server is InternalServer) { + return server.host + } + + val internal = requireNotNull(serverById[server.uid]) { "Invalid server passed to lookupHost" } return internal.host } @@ -296,15 +302,16 @@ internal class ComputeServiceImpl( } internal fun delete(flavor: InternalFlavor) { - flavors.remove(flavor.uid) + flavorById.remove(flavor.uid) } internal fun delete(image: InternalImage) { - images.remove(image.uid) + imageById.remove(image.uid) } internal fun delete(server: InternalServer) { - servers.remove(server.uid) + serverById.remove(server.uid) + servers.remove(server) } /** -- cgit v1.2.3