From 1e24e8934396bf2947c0d3bd244c29c0ecff98a1 Mon Sep 17 00:00:00 2001 From: Georgios Andreadis Date: Wed, 20 May 2020 15:05:25 +0200 Subject: Add fallback for placement info --- .../virt/service/allocation/ReplayAllocationPolicy.kt | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/opendc/opendc-compute/src/main/kotlin/com/atlarge/opendc/compute/virt/service/allocation/ReplayAllocationPolicy.kt b/opendc/opendc-compute/src/main/kotlin/com/atlarge/opendc/compute/virt/service/allocation/ReplayAllocationPolicy.kt index f88eaed8..9e675e80 100644 --- a/opendc/opendc-compute/src/main/kotlin/com/atlarge/opendc/compute/virt/service/allocation/ReplayAllocationPolicy.kt +++ b/opendc/opendc-compute/src/main/kotlin/com/atlarge/opendc/compute/virt/service/allocation/ReplayAllocationPolicy.kt @@ -2,14 +2,18 @@ package com.atlarge.opendc.compute.virt.service.allocation import com.atlarge.opendc.compute.virt.service.HypervisorView import com.atlarge.opendc.compute.virt.service.SimpleVirtProvisioningService +import mu.KotlinLogging +import kotlin.random.Random + +private val logger = KotlinLogging.logger {} /** - * Policy replaying VM-cluster assignnment. + * Policy replaying VM-cluster assignment. * * Within each cluster, the active servers on each node determine which node gets * assigned the VM image. */ -class ReplayAllocationPolicy(val vmPlacements: Map) : AllocationPolicy { +class ReplayAllocationPolicy(val vmPlacements: Map, val random: Random = Random(0)) : AllocationPolicy { override fun invoke(): AllocationPolicy.Logic = object : AllocationPolicy.Logic { override fun select( hypervisors: Set, @@ -18,8 +22,14 @@ class ReplayAllocationPolicy(val vmPlacements: Map) : Allocation val clusterName = vmPlacements[image.name] ?: throw IllegalStateException("Could not find placement data in VM placement file for VM ${image.name}") val machinesInCluster = hypervisors.filter { it.server.name.contains(clusterName) } + + if (machinesInCluster.isEmpty()) { + logger.info { "Could not find any machines belonging to cluster $clusterName for image ${image.name}, assigning randomly." } + return hypervisors.random(random) + } + return machinesInCluster.maxBy { it.availableMemory } - ?: throw IllegalStateException("Cloud not find any machines belonging to cluster $clusterName for image ${image.name}") + ?: throw IllegalStateException("Cloud not find any machine and could not randomly assign") } } } -- cgit v1.2.3