Skip to content

Commit 58c0ab5

Browse files
allegro-internal/flex-roadmap#814 Added service-specific zone priorities
1 parent f43cedc commit 58c0ab5

File tree

3 files changed

+54
-4
lines changed

3 files changed

+54
-4
lines changed

envoy-control-core/src/main/kotlin/pl/allegro/tech/servicemesh/envoycontrol/snapshot/SnapshotProperties.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ class LoadBalancingProperties {
157157
var policy = Cluster.LbPolicy.LEAST_REQUEST
158158
var useKeysSubsetFallbackPolicy = true
159159
var priorities = LoadBalancingPriorityProperties()
160+
var servicePriorities: Map<String, LoadBalancingPriorityProperties> = mapOf()
160161
}
161162

162163
class CanaryProperties {

envoy-control-core/src/main/kotlin/pl/allegro/tech/servicemesh/envoycontrol/snapshot/resource/endpoints/EnvoyEndpointsFactory.kt

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ class EnvoyEndpointsFactory(
188188
?.map {
189189
createLbEndpoint(it, serviceInstances.serviceName, locality)
190190
} ?: emptyList())
191-
.setPriority(toEnvoyPriority(zone, locality))
191+
.setPriority(toEnvoyPriority(zone, locality, serviceInstances))
192192
.build()
193193
}
194194

@@ -286,8 +286,14 @@ class EnvoyEndpointsFactory(
286286
false -> this
287287
}
288288

289-
private fun toEnvoyPriority(zone: String, locality: Locality): Int {
290-
val zonePriorities = properties.loadBalancing.priorities.zonePriorities
289+
private fun toEnvoyPriority(zone: String, locality: Locality, serviceInstances: ServiceInstances?): Int {
290+
var zonePriorities = properties.loadBalancing.priorities.zonePriorities
291+
serviceInstances?.let {
292+
if (properties.loadBalancing.servicePriorities.containsKey(serviceInstances.serviceName)) {
293+
zonePriorities =
294+
properties.loadBalancing.servicePriorities[serviceInstances.serviceName]!!.zonePriorities
295+
}
296+
}
291297
return when (zonePriorities.isNotEmpty()) {
292298
true -> zonePriorities[currentZone]?.get(zone) ?: toEnvoyPriority(locality)
293299
false -> toEnvoyPriority(locality)

envoy-control-core/src/test/kotlin/pl/allegro/tech/servicemesh/envoycontrol/snapshot/resource/endpoints/EnvoyEndpointsFactoryTest.kt

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,40 @@ internal class EnvoyEndpointsFactoryTest {
406406
.anySatisfy { it.hasZoneWithPriority("DC3", 2) }
407407
}
408408

409+
@Test
410+
fun `should create load assignment with service zone priorities`() {
411+
val envoyEndpointsFactory = EnvoyEndpointsFactory(
412+
snapshotPropertiesWithPriorities
413+
(
414+
mapOf("DC2" to mapOf("DC1" to 1, "DC2" to 1, "DC3" to 1)),
415+
mapOf("DC2" to mapOf("DC1" to 2, "DC2" to 2, "DC3" to 2)),
416+
serviceName
417+
),
418+
currentZone = "DC2"
419+
)
420+
val loadAssignments = envoyEndpointsFactory.createLoadAssignment(setOf(serviceName), multiClusterStateDC2Local)
421+
loadAssignments.assertHasLoadAssignment(
422+
mapOf("DC1" to 2, "DC2" to 2, "DC3" to 2)
423+
)
424+
}
425+
426+
@Test
427+
fun `should create load assignment with global zone priorities when no service config found`() {
428+
val envoyEndpointsFactory = EnvoyEndpointsFactory(
429+
snapshotPropertiesWithPriorities
430+
(
431+
mapOf("DC2" to mapOf("DC1" to 1, "DC2" to 1, "DC3" to 1)),
432+
mapOf("DC2" to mapOf("DC1" to 2, "DC2" to 2, "DC3" to 2)),
433+
"another-service"
434+
),
435+
currentZone = "DC2"
436+
)
437+
val loadAssignments = envoyEndpointsFactory.createLoadAssignment(setOf(serviceName), multiClusterStateDC2Local)
438+
loadAssignments.assertHasLoadAssignment(
439+
mapOf("DC1" to 1, "DC2" to 1, "DC3" to 1)
440+
)
441+
}
442+
409443
private fun List<ClusterLoadAssignment>.assertHasLoadAssignment(map: Map<String, Int>) {
410444
assertThat(this)
411445
.isNotEmpty()
@@ -453,13 +487,22 @@ internal class EnvoyEndpointsFactoryTest {
453487
assertThat(this.locality.zone).isEqualTo(zone)
454488
}
455489

456-
private fun snapshotPropertiesWithPriorities(priorities: Map<String, Map<String, Int>>) =
490+
private fun snapshotPropertiesWithPriorities(
491+
priorities: Map<String, Map<String, Int>>,
492+
servicePriorities: Map<String, Map<String, Int>> = mapOf(),
493+
serviceName: String? = null
494+
) =
457495
SnapshotProperties().apply {
458496
loadBalancing = LoadBalancingProperties()
459497
.apply {
460498
this.priorities = LoadBalancingPriorityProperties().apply {
461499
zonePriorities = priorities
462500
}
501+
serviceName?.let {
502+
this.servicePriorities = mapOf(serviceName to LoadBalancingPriorityProperties().apply {
503+
zonePriorities = servicePriorities
504+
})
505+
}
463506
}
464507
}
465508

0 commit comments

Comments
 (0)