diff --git a/pom.xml b/pom.xml index ed4587bc..37589870 100644 --- a/pom.xml +++ b/pom.xml @@ -46,6 +46,7 @@ util kafka valutakurs-klient + unleash diff --git a/unleash/README.md b/unleash/README.md new file mode 100644 index 00000000..a83161e1 --- /dev/null +++ b/unleash/README.md @@ -0,0 +1,19 @@ +# Unleash + +I hver enkelt applikasjon man skal bruke feature-toggles, blir man nødt til å legge inn `@ComponentScan("no.nav.familie.unleash", ...)` i App-configen. Deretter kan man ta ibruk servicen `UnleashService` som tilbyr `isEnabled()`-metoden. + +Hvor vidt man går mot unleash eller ikke kan styres med app-properties: +``` +// Default +unleash: + enabled: true + +// Dersom man ønsker at alle toggles skal gi isEnabled = false eller default verdi der det er definert +unleash: + enabled: false +``` + +Pakka krever følgende miljøvariabler: +* UNLEASH_SERVER_API_URL (se [Unleash-doc](https://docs.nais.io/addons/unleash-next/)) +* UNLEASH_SERVER_API_TOKEN (se [Unleash-doc](https://docs.nais.io/addons/unleash-next/)) +* NAIS_APP_NAME diff --git a/unleash/pom.xml b/unleash/pom.xml new file mode 100644 index 00000000..8cbdcba0 --- /dev/null +++ b/unleash/pom.xml @@ -0,0 +1,82 @@ + + + 4.0.0 + + no.nav.familie.felles + felles + ${revision}${sha1}${changelist} + + + unleash + ${revision}${sha1}${changelist} + Felles - Unleash + jar + + + + org.springframework.boot + spring-boot-starter-actuator + + + org.jetbrains.kotlin + kotlin-reflect + + + io.getunleash + unleash-client-java + 8.2.1 + + + + + src/main/kotlin + src/test/kotlin + + + + org.jetbrains.kotlin + kotlin-maven-plugin + ${kotlin.version} + + + compile + compile + + compile + + + + test-compile + test-compile + + test-compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + compile + compile + + compile + + + + testCompile + test-compile + + testCompile + + + + + + + + diff --git a/unleash/src/main/kotlin/no/nav/familie/unleash/DefaultUnleashService.kt b/unleash/src/main/kotlin/no/nav/familie/unleash/DefaultUnleashService.kt new file mode 100644 index 00000000..3903b584 --- /dev/null +++ b/unleash/src/main/kotlin/no/nav/familie/unleash/DefaultUnleashService.kt @@ -0,0 +1,43 @@ +package no.nav.familie.unleash + +import io.getunleash.DefaultUnleash +import io.getunleash.UnleashContext +import io.getunleash.UnleashContextProvider +import io.getunleash.util.UnleashConfig + +class DefaultUnleashService( + val apiUrl: String, + val apiToken: String, + val appName: String +) : UnleashService { + + private val defaultUnleash: DefaultUnleash + + init { + + defaultUnleash = DefaultUnleash( + UnleashConfig.builder() + .appName(appName) + .unleashAPI("$apiUrl/api") + .apiKey(apiToken) + .unleashContextProvider(lagUnleashContextProvider()).build() + ) + } + + private fun lagUnleashContextProvider(): UnleashContextProvider { + return UnleashContextProvider { + UnleashContext.builder() + .appName(appName) + .build() + } + } + + override fun isEnabled(toggleId: String, defaultValue: Boolean): Boolean { + return defaultUnleash.isEnabled(toggleId, defaultValue) + } + + override fun destroy() { + // Spring trigger denne ved shutdown. Gjøres for å unngå at unleash fortsetter å gjøre kall ut + defaultUnleash.shutdown() + } +} diff --git a/unleash/src/main/kotlin/no/nav/familie/unleash/UnleashConfig.kt b/unleash/src/main/kotlin/no/nav/familie/unleash/UnleashConfig.kt new file mode 100644 index 00000000..61075eed --- /dev/null +++ b/unleash/src/main/kotlin/no/nav/familie/unleash/UnleashConfig.kt @@ -0,0 +1,62 @@ +package no.nav.familie.unleash + +import org.slf4j.LoggerFactory +import org.springframework.beans.factory.DisposableBean +import org.springframework.beans.factory.annotation.Value +import org.springframework.boot.context.properties.ConfigurationProperties +import org.springframework.boot.context.properties.EnableConfigurationProperties +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration + +@Configuration +@EnableConfigurationProperties(UnleashProperties::class) +open class UnleashConfig( + private val featureToggleProperties: UnleashProperties, + @Value("\${UNLEASH_SERVER_API_URL}") val apiUrl: String, + @Value("\${UNLEASH_SERVER_API_TOKEN}") val apiToken: String, + @Value("\${NAIS_APP_NAME}") val appName: String +) { + + @Bean + open fun unleashNext(): UnleashService = + if (featureToggleProperties.enabled) { + DefaultUnleashService(apiUrl = apiUrl, apiToken = apiToken, appName = appName) + } else { + logger.warn( + "Funksjonsbryter-funksjonalitet er skrudd AV. " + + "isEnabled gir 'false' med mindre man har oppgitt en annen default verdi." + ) + lagDummyUnleashService() + } + + private fun lagDummyUnleashService(): UnleashService { + return object : UnleashService { + override fun isEnabled(toggleId: String, defaultValue: Boolean): Boolean { + return System.getenv(toggleId).run { toBoolean() } || defaultValue + } + + override fun destroy() { + // Dummy featureToggleService trenger ikke destroy, då den ikke har en unleash å lukke + } + } + } + + companion object { + + private val logger = LoggerFactory.getLogger(UnleashConfig::class.java) + } +} + +@ConfigurationProperties("unleash") +class UnleashProperties( + val enabled: Boolean = true +) + +interface UnleashService : DisposableBean { + + fun isEnabled(toggleId: String): Boolean { + return isEnabled(toggleId, false) + } + + fun isEnabled(toggleId: String, defaultValue: Boolean): Boolean +}