From 4437b6b07b86f08a866c9873f23c1ef06815e1d5 Mon Sep 17 00:00:00 2001 From: david steinsland Date: Thu, 7 Nov 2024 08:53:32 +0100 Subject: [PATCH] tilbyr en ekstra readysjekk --- .../navikt/tbd_libs/naisful/NaisfulApp.kt | 25 ++++++++++++---- .../navikt/tbd_libs/naisful/NaisfulAppTest.kt | 30 ++++++++++++++++--- 2 files changed, 46 insertions(+), 9 deletions(-) diff --git a/naisful-app/src/main/kotlin/com/github/navikt/tbd_libs/naisful/NaisfulApp.kt b/naisful-app/src/main/kotlin/com/github/navikt/tbd_libs/naisful/NaisfulApp.kt index 6a733aa..a35cd61 100644 --- a/naisful-app/src/main/kotlin/com/github/navikt/tbd_libs/naisful/NaisfulApp.kt +++ b/naisful-app/src/main/kotlin/com/github/navikt/tbd_libs/naisful/NaisfulApp.kt @@ -15,6 +15,7 @@ import io.ktor.server.cio.CIOApplicationEngine import io.ktor.server.engine.EmbeddedServer import io.ktor.server.engine.EngineConnectorBuilder import io.ktor.server.engine.applicationEnvironment +import io.ktor.server.engine.connector import io.ktor.server.metrics.micrometer.MicrometerMetrics import io.ktor.server.plugins.BadRequestException import io.ktor.server.plugins.NotFoundException @@ -73,7 +74,9 @@ fun naisApp( timersConfig: Timer.Builder.(ApplicationCall, Throwable?) -> Unit = { _, _ -> }, mdcEntries: Map String?> = emptyMap(), port: Int = 8080, + readyCheck: () -> Boolean = { true }, preStopHook: suspend () -> Unit = { delay(5000) }, + cioConfiguration: CIOApplicationEngine.Configuration.() -> Unit = { }, applicationModule: Application.() -> Unit ): EmbeddedServer { val config = serverConfig( @@ -81,13 +84,24 @@ fun naisApp( log = applicationLogger } ) { - module { standardApiModule(meterRegistry, objectMapper, callLogger, naisEndpoints, callIdHeaderName, preStopHook, timersConfig, mdcEntries) } + module { + standardApiModule( + meterRegistry = meterRegistry, + objectMapper = objectMapper, + callLogger = callLogger, + naisEndpoints = naisEndpoints, + callIdHeaderName = callIdHeaderName, + preStopHook = preStopHook, + readyCheck = readyCheck, + timersConfig = timersConfig, + mdcEntries = mdcEntries + ) + } module(applicationModule) } val app = EmbeddedServer(config, CIO) { - connectors.add(EngineConnectorBuilder().apply { - this.port = port - }) + connector { this.port = port } + apply(cioConfiguration) } return app } @@ -99,6 +113,7 @@ fun Application.standardApiModule( naisEndpoints: NaisEndpoints, callIdHeaderName: String, preStopHook: suspend () -> Unit = { delay(5000) }, + readyCheck: () -> Boolean = { true }, timersConfig: Timer.Builder.(ApplicationCall, Throwable?) -> Unit = { _, _ -> }, mdcEntries: Map String?> = emptyMap(), ) { @@ -192,7 +207,7 @@ fun Application.standardApiModule( } get(naisEndpoints.isreadyEndpoint) { - if (!readyToggle.get()) return@get call.respondText("NOT READY", ContentType.Text.Plain, HttpStatusCode.ServiceUnavailable) + if (!readyToggle.get() || !readyCheck()) return@get call.respondText("NOT READY", ContentType.Text.Plain, HttpStatusCode.ServiceUnavailable) call.respondText("READY", ContentType.Text.Plain) } diff --git a/naisful-app/src/test/kotlin/com/github/navikt/tbd_libs/naisful/NaisfulAppTest.kt b/naisful-app/src/test/kotlin/com/github/navikt/tbd_libs/naisful/NaisfulAppTest.kt index 83ce421..151bf6c 100644 --- a/naisful-app/src/test/kotlin/com/github/navikt/tbd_libs/naisful/NaisfulAppTest.kt +++ b/naisful-app/src/test/kotlin/com/github/navikt/tbd_libs/naisful/NaisfulAppTest.kt @@ -29,6 +29,7 @@ import org.slf4j.LoggerFactory import java.net.ServerSocket import java.net.URI import java.time.Duration +import java.util.concurrent.atomic.AtomicBoolean class NaisfulAppTest { @@ -41,6 +42,16 @@ class NaisfulAppTest { } } + @Test + fun `ready check`() { + val ready = AtomicBoolean(true) + testApp(readyCheck = ready::get) { + assertEquals("READY", get("/isready").bodyAsText()) + ready.set(false) + assertEquals("NOT READY", get("/isready").bodyAsText()) + } + } + @Test fun `custom routes`() { val endpoints = NaisEndpoints( @@ -106,7 +117,12 @@ class NaisfulAppTest { } } - private fun testApp(naisEndpoints: NaisEndpoints = NaisEndpoints.Default, applicationModule: Application.() -> Unit = {}, testBlock: suspend HttpClient.() -> Unit) { + private fun testApp( + naisEndpoints: NaisEndpoints = NaisEndpoints.Default, + readyCheck: () -> Boolean = { true }, + applicationModule: Application.() -> Unit = {}, + testBlock: suspend HttpClient.() -> Unit + ) { val meterRegistry = PrometheusMeterRegistry(PrometheusConfig.DEFAULT) val objectMapper = jacksonObjectMapper() val randomPort = ServerSocket(0).localPort @@ -122,9 +138,15 @@ class NaisfulAppTest { } } application { - standardApiModule(meterRegistry, objectMapper, environment.log, naisEndpoints, "callId", { - delay(250) - }) + standardApiModule( + meterRegistry = meterRegistry, + objectMapper = objectMapper, + callLogger = environment.log, + naisEndpoints = naisEndpoints, + callIdHeaderName = "callId", + preStopHook = { delay(250) }, + readyCheck = readyCheck + ) applicationModule() } startApplication()