summaryrefslogtreecommitdiff
path: root/opendc-compute/opendc-compute-service/src/test
diff options
context:
space:
mode:
authorFabian Mastenbroek <mail.fabianm@gmail.com>2022-09-21 11:12:19 +0200
committerGitHub <noreply@github.com>2022-09-21 11:12:19 +0200
commit8d1d091f093e6ac32dba1e6a4f74490b280fcc4b (patch)
tree2e45d57e3a06886648585ee0c00fbc793422d991 /opendc-compute/opendc-compute-service/src/test
parentf7ba5cd9bbf1f4d145c3d3d171c2632d44b5f94a (diff)
feat(compute): Add support for affinity scheduling (#101)
This change adds support for (anti-)affinity scheduling of servers onto hosts, which happens at the compute service level. In the future, we might add support for server groups, which also enables soft (anti-)affinity scheduling. Implements #26 ## Implementation Notes :hammer_and_pick: * Add `DifferentHostFilter` to schedule instances on different hosts from a set of instances. * Add `SameHostFilter` to schedule instances on the same hosts as a set of instances.
Diffstat (limited to 'opendc-compute/opendc-compute-service/src/test')
-rw-r--r--opendc-compute/opendc-compute-service/src/test/kotlin/org/opendc/compute/service/scheduler/FilterSchedulerTest.kt78
1 files changed, 78 insertions, 0 deletions
diff --git a/opendc-compute/opendc-compute-service/src/test/kotlin/org/opendc/compute/service/scheduler/FilterSchedulerTest.kt b/opendc-compute/opendc-compute-service/src/test/kotlin/org/opendc/compute/service/scheduler/FilterSchedulerTest.kt
index 3f2ce43b..350ac944 100644
--- a/opendc-compute/opendc-compute-service/src/test/kotlin/org/opendc/compute/service/scheduler/FilterSchedulerTest.kt
+++ b/opendc-compute/opendc-compute-service/src/test/kotlin/org/opendc/compute/service/scheduler/FilterSchedulerTest.kt
@@ -323,6 +323,84 @@ internal class FilterSchedulerTest {
}
@Test
+ fun testAffinityFilter() {
+ val scheduler = FilterScheduler(
+ filters = listOf(SameHostFilter()),
+ weighers = emptyList(),
+ )
+
+ val serverA = mockk<Server>()
+ every { serverA.uid } returns UUID.randomUUID()
+ every { serverA.flavor.cpuCount } returns 2
+ every { serverA.flavor.memorySize } returns 1024
+
+ val hostA = mockk<HostView>()
+ every { hostA.host.state } returns HostState.UP
+ every { hostA.host.model } returns HostModel(4 * 2600.0, 4, 2048)
+ every { hostA.host.instances } returns emptySet()
+ every { hostA.provisionedCores } returns 3
+
+ val hostB = mockk<HostView>()
+ every { hostB.host.state } returns HostState.UP
+ every { hostB.host.model } returns HostModel(4 * 2600.0, 4, 2048)
+ every { hostB.host.instances } returns setOf(serverA)
+ every { hostB.provisionedCores } returns 0
+
+ scheduler.addHost(hostA)
+ scheduler.addHost(hostB)
+
+ val serverB = mockk<Server>()
+ every { serverB.flavor.cpuCount } returns 2
+ every { serverB.flavor.memorySize } returns 1024
+ every { serverB.meta } returns emptyMap()
+
+ assertEquals(hostA, scheduler.select(serverB))
+
+ every { serverB.meta } returns mapOf("scheduler_hint:same_host" to setOf(serverA.uid))
+
+ assertEquals(hostB, scheduler.select(serverB))
+ }
+
+ @Test
+ fun testAntiAffinityFilter() {
+ val scheduler = FilterScheduler(
+ filters = listOf(DifferentHostFilter()),
+ weighers = emptyList(),
+ )
+
+ val serverA = mockk<Server>()
+ every { serverA.uid } returns UUID.randomUUID()
+ every { serverA.flavor.cpuCount } returns 2
+ every { serverA.flavor.memorySize } returns 1024
+
+ val hostA = mockk<HostView>()
+ every { hostA.host.state } returns HostState.UP
+ every { hostA.host.model } returns HostModel(4 * 2600.0, 4, 2048)
+ every { hostA.host.instances } returns setOf(serverA)
+ every { hostA.provisionedCores } returns 3
+
+ val hostB = mockk<HostView>()
+ every { hostB.host.state } returns HostState.UP
+ every { hostB.host.model } returns HostModel(4 * 2600.0, 4, 2048)
+ every { hostB.host.instances } returns emptySet()
+ every { hostB.provisionedCores } returns 0
+
+ scheduler.addHost(hostA)
+ scheduler.addHost(hostB)
+
+ val serverB = mockk<Server>()
+ every { serverB.flavor.cpuCount } returns 2
+ every { serverB.flavor.memorySize } returns 1024
+ every { serverB.meta } returns emptyMap()
+
+ assertEquals(hostA, scheduler.select(serverB))
+
+ every { serverB.meta } returns mapOf("scheduler_hint:different_host" to setOf(serverA.uid))
+
+ assertEquals(hostB, scheduler.select(serverB))
+ }
+
+ @Test
fun testRamWeigher() {
val scheduler = FilterScheduler(
filters = emptyList(),