Skip to content

Commit 08eb701

Browse files
committed
Ref #27576: add tests for metadata endpoint
1 parent 852558c commit 08eb701

3 files changed

Lines changed: 53 additions & 3 deletions

File tree

src/main/kotlin/eu/openanalytics/shinyproxyoperator/ingress/skipper/MetadataRouteGroupFactory.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
package eu.openanalytics.shinyproxyoperator.ingress.skipper
2222

2323
import com.fasterxml.jackson.databind.ObjectMapper
24+
import com.fasterxml.jackson.module.kotlin.registerKotlinModule
2425
import eu.openanalytics.shinyproxyoperator.components.LabelFactory
2526
import eu.openanalytics.shinyproxyoperator.components.ResourceNameFactory
2627
import eu.openanalytics.shinyproxyoperator.crd.ShinyProxy
@@ -34,13 +35,13 @@ import mu.KotlinLogging
3435
class MetadataRouteGroupFactory(private val routeGroupClient: MixedOperation<RouteGroup, KubernetesResourceList<RouteGroup>, Resource<RouteGroup>>) {
3536

3637
private val logger = KotlinLogging.logger {}
37-
private val objectMapper = ObjectMapper()
38+
private val objectMapper = ObjectMapper().registerKotlinModule()
3839

3940
fun createOrReplaceRouteGroup(shinyProxy: ShinyProxy) {
4041
val metadata = objectMapper.writeValueAsString(mapOf("instances" to shinyProxy.status.instances)).replace("\"", "\\\"")
4142

4243
val path = if (shinyProxy.subPath != "") {
43-
shinyProxy.subPath + "/operator/metadata"
44+
shinyProxy.subPath + "operator/metadata"
4445
} else {
4546
"/operator/metadata"
4647
}

src/main/kotlin/eu/openanalytics/shinyproxyoperator/ingress/skipper/RouteGroup.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ data class BackendName(val backendName: String)
3232
data class Route(val pathSubtree: String, val filters: List<String>, val backends: List<BackendName>)
3333
data class RouteGroupSpec(val hosts: List<String>, val backends: List<Backend>, val defaultBackends: List<BackendName>, val routes: List<Route>)
3434

35-
// TODO create tests
3635
@Version("v1")
3736
@Group("zalando.org")
3837
class RouteGroup: CustomResource<RouteGroupSpec, RouteGroupStatus>(), Namespaced {

src/test/kotlin/eu/openanalytics/shinyproxyoperator/helpers/ShinyProxyTestInstance.kt

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,23 @@
2020
*/
2121
package eu.openanalytics.shinyproxyoperator.helpers
2222

23+
import com.fasterxml.jackson.databind.ObjectMapper
24+
import com.fasterxml.jackson.module.kotlin.registerKotlinModule
2325
import eu.openanalytics.shinyproxyoperator.Operator
2426
import eu.openanalytics.shinyproxyoperator.ShinyProxyClient
2527
import eu.openanalytics.shinyproxyoperator.components.LabelFactory
2628
import eu.openanalytics.shinyproxyoperator.crd.ShinyProxy
2729
import eu.openanalytics.shinyproxyoperator.crd.ShinyProxyInstance
30+
import eu.openanalytics.shinyproxyoperator.crd.ShinyProxyStatus
31+
import eu.openanalytics.shinyproxyoperator.ingress.skipper.RouteGroup
2832
import io.fabric8.kubernetes.api.model.HasMetadata
2933
import io.fabric8.kubernetes.api.model.IntOrString
3034
import io.fabric8.kubernetes.client.NamespacedKubernetesClient
3135
import io.fabric8.kubernetes.client.internal.readiness.Readiness
3236
import kotlinx.coroutines.TimeoutCancellationException
3337
import kotlinx.coroutines.withTimeout
38+
import java.nio.file.Paths
39+
import kotlin.io.path.pathString
3440
import kotlin.test.assertEquals
3541
import kotlin.test.assertNotEquals
3642
import kotlin.test.assertNotNull
@@ -43,6 +49,7 @@ class ShinyProxyTestInstance(private val namespace: String,
4349
private val reconcileListener: ReconcileListener) {
4450

4551
lateinit var hash: String
52+
private val objectMapper = ObjectMapper().registerKotlinModule()
4653

4754
fun create(): ShinyProxy {
4855
val sp: ShinyProxy = shinyProxyClient.inNamespace(namespace).load(this.javaClass.getResourceAsStream("/configs/$fileName")).createOrReplace()
@@ -94,6 +101,49 @@ class ShinyProxyTestInstance(private val namespace: String,
94101

95102
// check ingress
96103
assertIngressIsCorrect(sp, numInstancesRunning, isLatest)
104+
105+
// check metadata RouteGroup
106+
assertMetadataRouteGroupIsCorrect(sp)
107+
}
108+
109+
private fun assertMetadataRouteGroupIsCorrect(sp: ShinyProxy) {
110+
val routeGroupClient = client.resources(RouteGroup::class.java)
111+
val routeGroups = routeGroupClient.inNamespace(namespace).withLabel(LabelFactory.NAME_LABEL, sp.metadata.name).list().items
112+
assertEquals(1, routeGroups.size)
113+
val routeGroup = routeGroups[0]
114+
assertEquals("sp-${sp.metadata.name}-ing-metadata".take(63), routeGroup.metadata.name)
115+
assertEquals(mapOf(
116+
LabelFactory.APP_LABEL to LabelFactory.APP_LABEL_VALUE,
117+
LabelFactory.NAME_LABEL to sp.metadata.name
118+
), routeGroup.metadata.labels)
119+
120+
assertEquals(1, routeGroup.metadata.ownerReferences.size)
121+
assertTrue(routeGroup.metadata.ownerReferences[0].controller)
122+
assertEquals("ShinyProxy", routeGroup.metadata.ownerReferences[0].kind)
123+
assertEquals("openanalytics.eu/v1", routeGroup.metadata.ownerReferences[0].apiVersion)
124+
assertEquals(sp.metadata.name, routeGroup.metadata.ownerReferences[0].name)
125+
126+
assertEquals(1, routeGroup.spec.hosts.size)
127+
assertEquals(sp.fqdn, routeGroup.spec.hosts[0])
128+
129+
assertEquals(1, routeGroup.spec.backends.size)
130+
assertEquals("shunt", routeGroup.spec.backends[0].name)
131+
assertEquals("shunt", routeGroup.spec.backends[0].type)
132+
133+
assertEquals(1, routeGroup.spec.defaultBackends.size)
134+
assertEquals("shunt", routeGroup.spec.defaultBackends[0].backendName)
135+
136+
assertEquals(1, routeGroup.spec.routes.size)
137+
assertEquals(Paths.get(sp.subPath, "/operator/metadata").pathString, routeGroup.spec.routes[0].pathSubtree)
138+
assertEquals(1, routeGroup.spec.routes[0].backends.size)
139+
assertEquals("shunt", routeGroup.spec.routes[0].backends[0].backendName)
140+
assertEquals(3, routeGroup.spec.routes[0].filters.size)
141+
assertEquals("""setResponseHeader("Content-Type","application/json")""", routeGroup.spec.routes[0].filters[0])
142+
val metadata = routeGroup.spec.routes[0].filters[1].removePrefix("inlineContent(\"").removeSuffix("\")").replace("\\\"", "\"")
143+
val status = objectMapper.readValue(metadata, ShinyProxyStatus::class.java)
144+
assertEquals(sp.status, status)
145+
assertEquals("""status(200)""", routeGroup.spec.routes[0].filters[2])
146+
97147
}
98148

99149
fun assertIngressIsCorrect(sp: ShinyProxy, numInstancesRunning: Int = 1, isLatest: Boolean = true) {

0 commit comments

Comments
 (0)