diff --git a/providers/flagd/README.md b/providers/flagd/README.md index d8fbaca01..f2d680c2c 100644 --- a/providers/flagd/README.md +++ b/providers/flagd/README.md @@ -106,27 +106,27 @@ variables. Given below are the supported configurations: -| Option name | Environment variable name | Type & Values | Default | Compatible resolver | -|-----------------------|--------------------------------|--------------------------|-----------|-------------------------| -| resolver | FLAGD_RESOLVER | String - rpc, in-process | rpc | | -| host | FLAGD_HOST | String | localhost | rpc & in-process | -| port | FLAGD_PORT | int | 8013 | rpc & in-process | -| targetUri | FLAGD_TARGET_URI | string | null | rpc & in-process | -| tls | FLAGD_TLS | boolean | false | rpc & in-process | -| defaultAuthority | FLAGD_DEFAULT_AUTHORITY | String | null | rpc & in-process | -| socketPath | FLAGD_SOCKET_PATH | String | null | rpc & in-process | -| certPath | FLAGD_SERVER_CERT_PATH | String | null | rpc & in-process | -| deadline | FLAGD_DEADLINE_MS | int | 500 | rpc & in-process & file | -| streamDeadlineMs | FLAGD_STREAM_DEADLINE_MS | int | 600000 | rpc & in-process | -| keepAliveTime | FLAGD_KEEP_ALIVE_TIME_MS | long | 0 | rpc & in-process | -| selector | FLAGD_SOURCE_SELECTOR | String | null | in-process | -| providerId | FLAGD_SOURCE_PROVIDER_ID | String | null | in-process | -| cache | FLAGD_CACHE | String - lru, disabled | lru | rpc | -| maxCacheSize | FLAGD_MAX_CACHE_SIZE | int | 1000 | rpc | -| maxEventStreamRetries | FLAGD_MAX_EVENT_STREAM_RETRIES | int | 5 | rpc | -| retryBackoffMs | FLAGD_RETRY_BACKOFF_MS | int | 1000 | rpc | -| offlineFlagSourcePath | FLAGD_OFFLINE_FLAG_SOURCE_PATH | String | null | file | -| offlinePollIntervalMs | FLAGD_OFFLINE_POLL_MS | int | 5000 | file | +| Option name | Environment variable name | Type & Values | Default | Compatible resolver | +|-----------------------|------------------------------------------------------------------------|--------------------------|-------------------------------|-------------------------| +| resolver | FLAGD_RESOLVER | String - rpc, in-process | rpc | | +| host | FLAGD_HOST | String | localhost | rpc & in-process | +| port | FLAGD_PORT (rpc), FLAGD_SYNC_PORT (in-process, FLAGD_PORT as fallback) | int | 8013 (rpc), 8015 (in-process) | rpc & in-process | +| targetUri | FLAGD_TARGET_URI | string | null | rpc & in-process | +| tls | FLAGD_TLS | boolean | false | rpc & in-process | +| defaultAuthority | FLAGD_DEFAULT_AUTHORITY | String | null | rpc & in-process | +| socketPath | FLAGD_SOCKET_PATH | String | null | rpc & in-process | +| certPath | FLAGD_SERVER_CERT_PATH | String | null | rpc & in-process | +| deadline | FLAGD_DEADLINE_MS | int | 500 | rpc & in-process & file | +| streamDeadlineMs | FLAGD_STREAM_DEADLINE_MS | int | 600000 | rpc & in-process | +| keepAliveTime | FLAGD_KEEP_ALIVE_TIME_MS | long | 0 | rpc & in-process | +| selector | FLAGD_SOURCE_SELECTOR | String | null | in-process | +| providerId | FLAGD_SOURCE_PROVIDER_ID | String | null | in-process | +| cache | FLAGD_CACHE | String - lru, disabled | lru | rpc | +| maxCacheSize | FLAGD_MAX_CACHE_SIZE | int | 1000 | rpc | +| maxEventStreamRetries | FLAGD_MAX_EVENT_STREAM_RETRIES | int | 5 | rpc | +| retryBackoffMs | FLAGD_RETRY_BACKOFF_MS | int | 1000 | rpc | +| offlineFlagSourcePath | FLAGD_OFFLINE_FLAG_SOURCE_PATH | String | null | file | +| offlinePollIntervalMs | FLAGD_OFFLINE_POLL_MS | int | 5000 | file | > [!NOTE] > Some configurations are only applicable for RPC resolver. diff --git a/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/Config.java b/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/Config.java index e41121e5c..417826437 100644 --- a/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/Config.java +++ b/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/Config.java @@ -24,6 +24,7 @@ public final class Config { static final String RESOLVER_ENV_VAR = "FLAGD_RESOLVER"; static final String HOST_ENV_VAR_NAME = "FLAGD_HOST"; static final String PORT_ENV_VAR_NAME = "FLAGD_PORT"; + static final String SYNC_PORT_ENV_VAR_NAME = "FLAGD_SYNC_PORT"; static final String TLS_ENV_VAR_NAME = "FLAGD_TLS"; static final String DEFAULT_AUTHORITY_ENV_VAR_NAME = "FLAGD_DEFAULT_AUTHORITY"; static final String SOCKET_PATH_ENV_VAR_NAME = "FLAGD_SOCKET_PATH"; diff --git a/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/FlagdOptions.java b/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/FlagdOptions.java index a2463a946..17e86e6d1 100644 --- a/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/FlagdOptions.java +++ b/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/FlagdOptions.java @@ -254,8 +254,14 @@ void prebuild() { } if (port == 0 && resolverType != Config.Resolver.FILE) { - port = Integer.parseInt( - fallBackToEnvOrDefault(Config.PORT_ENV_VAR_NAME, determineDefaultPortForResolver())); + String defaultPort = determineDefaultPortForResolver(); + String fromPortEnv = fallBackToEnvOrDefault(Config.PORT_ENV_VAR_NAME, defaultPort); + + String portValue = resolverType == Config.Resolver.IN_PROCESS + ? fallBackToEnvOrDefault(Config.SYNC_PORT_ENV_VAR_NAME, fromPortEnv) + : fromPortEnv; + + port = Integer.parseInt(portValue); } } diff --git a/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/FlagdOptionsTest.java b/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/FlagdOptionsTest.java index 75fd3581f..552ae4afc 100644 --- a/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/FlagdOptionsTest.java +++ b/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/FlagdOptionsTest.java @@ -7,9 +7,11 @@ import static dev.openfeature.contrib.providers.flagd.Config.DEFAULT_RPC_PORT; import static dev.openfeature.contrib.providers.flagd.Config.KEEP_ALIVE_MS_ENV_VAR_NAME; import static dev.openfeature.contrib.providers.flagd.Config.KEEP_ALIVE_MS_ENV_VAR_NAME_OLD; +import static dev.openfeature.contrib.providers.flagd.Config.PORT_ENV_VAR_NAME; import static dev.openfeature.contrib.providers.flagd.Config.RESOLVER_ENV_VAR; import static dev.openfeature.contrib.providers.flagd.Config.RESOLVER_IN_PROCESS; import static dev.openfeature.contrib.providers.flagd.Config.RESOLVER_RPC; +import static dev.openfeature.contrib.providers.flagd.Config.SYNC_PORT_ENV_VAR_NAME; import static dev.openfeature.contrib.providers.flagd.Config.TARGET_URI_ENV_VAR_NAME; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -201,6 +203,37 @@ void testInProcessProviderFromEnv_portConfigured_usesConfiguredPort() { assertThat(flagdOptions.getPort()).isEqualTo(1000); } + @Test + @SetEnvironmentVariable(key = RESOLVER_ENV_VAR, value = RESOLVER_IN_PROCESS) + @SetEnvironmentVariable(key = SYNC_PORT_ENV_VAR_NAME, value = "9999") + void testInProcessProvider_usesSyncPortEnvVarWhenSet() { + FlagdOptions flagdOptions = FlagdOptions.builder().build(); + + assertThat(flagdOptions.getResolverType()).isEqualTo(Resolver.IN_PROCESS); + assertThat(flagdOptions.getPort()).isEqualTo(9999); + } + + @Test + @SetEnvironmentVariable(key = RESOLVER_ENV_VAR, value = RESOLVER_IN_PROCESS) + @SetEnvironmentVariable(key = PORT_ENV_VAR_NAME, value = "8888") + void testInProcessProvider_fallsBackToFlagdPortWhenSyncPortNotSet() { + FlagdOptions flagdOptions = FlagdOptions.builder().build(); + + assertThat(flagdOptions.getResolverType()).isEqualTo(Resolver.IN_PROCESS); + assertThat(flagdOptions.getPort()).isEqualTo(8888); + } + + @Test + @SetEnvironmentVariable(key = RESOLVER_ENV_VAR, value = RESOLVER_IN_PROCESS) + @SetEnvironmentVariable(key = PORT_ENV_VAR_NAME, value = "8888") + @SetEnvironmentVariable(key = SYNC_PORT_ENV_VAR_NAME, value = "9999") + void testInProcessProvider_syncPortTakesPrecedenceOverFlagdPort() { + FlagdOptions flagdOptions = FlagdOptions.builder().build(); + + assertThat(flagdOptions.getResolverType()).isEqualTo(Resolver.IN_PROCESS); + assertThat(flagdOptions.getPort()).isEqualTo(9999); + } + @Test @SetEnvironmentVariable(key = RESOLVER_ENV_VAR, value = RESOLVER_RPC) void testRpcProviderFromEnv_noPortConfigured_defaultsToCorrectPort() {