Skip to content

Commit 4f91f74

Browse files
feat: Add FLAGD_SYNC_PORT support for in-process providers with backwards compatibility (#1651)
Signed-off-by: Carla Köberl <[email protected]> Signed-off-by: Simon Schrottner <[email protected]> Co-authored-by: Simon Schrottner <[email protected]>
1 parent 06c5798 commit 4f91f74

File tree

4 files changed

+63
-23
lines changed

4 files changed

+63
-23
lines changed

providers/flagd/README.md

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -106,27 +106,27 @@ variables.
106106

107107
Given below are the supported configurations:
108108

109-
| Option name | Environment variable name | Type & Values | Default | Compatible resolver |
110-
|-----------------------|--------------------------------|--------------------------|-----------|-------------------------|
111-
| resolver | FLAGD_RESOLVER | String - rpc, in-process | rpc | |
112-
| host | FLAGD_HOST | String | localhost | rpc & in-process |
113-
| port | FLAGD_PORT | int | 8013 | rpc & in-process |
114-
| targetUri | FLAGD_TARGET_URI | string | null | rpc & in-process |
115-
| tls | FLAGD_TLS | boolean | false | rpc & in-process |
116-
| defaultAuthority | FLAGD_DEFAULT_AUTHORITY | String | null | rpc & in-process |
117-
| socketPath | FLAGD_SOCKET_PATH | String | null | rpc & in-process |
118-
| certPath | FLAGD_SERVER_CERT_PATH | String | null | rpc & in-process |
119-
| deadline | FLAGD_DEADLINE_MS | int | 500 | rpc & in-process & file |
120-
| streamDeadlineMs | FLAGD_STREAM_DEADLINE_MS | int | 600000 | rpc & in-process |
121-
| keepAliveTime | FLAGD_KEEP_ALIVE_TIME_MS | long | 0 | rpc & in-process |
122-
| selector | FLAGD_SOURCE_SELECTOR | String | null | in-process |
123-
| providerId | FLAGD_SOURCE_PROVIDER_ID | String | null | in-process |
124-
| cache | FLAGD_CACHE | String - lru, disabled | lru | rpc |
125-
| maxCacheSize | FLAGD_MAX_CACHE_SIZE | int | 1000 | rpc |
126-
| maxEventStreamRetries | FLAGD_MAX_EVENT_STREAM_RETRIES | int | 5 | rpc |
127-
| retryBackoffMs | FLAGD_RETRY_BACKOFF_MS | int | 1000 | rpc |
128-
| offlineFlagSourcePath | FLAGD_OFFLINE_FLAG_SOURCE_PATH | String | null | file |
129-
| offlinePollIntervalMs | FLAGD_OFFLINE_POLL_MS | int | 5000 | file |
109+
| Option name | Environment variable name | Type & Values | Default | Compatible resolver |
110+
|-----------------------|------------------------------------------------------------------------|--------------------------|-------------------------------|-------------------------|
111+
| resolver | FLAGD_RESOLVER | String - rpc, in-process | rpc | |
112+
| host | FLAGD_HOST | String | localhost | rpc & in-process |
113+
| port | FLAGD_PORT (rpc), FLAGD_SYNC_PORT (in-process, FLAGD_PORT as fallback) | int | 8013 (rpc), 8015 (in-process) | rpc & in-process |
114+
| targetUri | FLAGD_TARGET_URI | string | null | rpc & in-process |
115+
| tls | FLAGD_TLS | boolean | false | rpc & in-process |
116+
| defaultAuthority | FLAGD_DEFAULT_AUTHORITY | String | null | rpc & in-process |
117+
| socketPath | FLAGD_SOCKET_PATH | String | null | rpc & in-process |
118+
| certPath | FLAGD_SERVER_CERT_PATH | String | null | rpc & in-process |
119+
| deadline | FLAGD_DEADLINE_MS | int | 500 | rpc & in-process & file |
120+
| streamDeadlineMs | FLAGD_STREAM_DEADLINE_MS | int | 600000 | rpc & in-process |
121+
| keepAliveTime | FLAGD_KEEP_ALIVE_TIME_MS | long | 0 | rpc & in-process |
122+
| selector | FLAGD_SOURCE_SELECTOR | String | null | in-process |
123+
| providerId | FLAGD_SOURCE_PROVIDER_ID | String | null | in-process |
124+
| cache | FLAGD_CACHE | String - lru, disabled | lru | rpc |
125+
| maxCacheSize | FLAGD_MAX_CACHE_SIZE | int | 1000 | rpc |
126+
| maxEventStreamRetries | FLAGD_MAX_EVENT_STREAM_RETRIES | int | 5 | rpc |
127+
| retryBackoffMs | FLAGD_RETRY_BACKOFF_MS | int | 1000 | rpc |
128+
| offlineFlagSourcePath | FLAGD_OFFLINE_FLAG_SOURCE_PATH | String | null | file |
129+
| offlinePollIntervalMs | FLAGD_OFFLINE_POLL_MS | int | 5000 | file |
130130

131131
> [!NOTE]
132132
> Some configurations are only applicable for RPC resolver.

providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/Config.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ public final class Config {
2424
static final String RESOLVER_ENV_VAR = "FLAGD_RESOLVER";
2525
static final String HOST_ENV_VAR_NAME = "FLAGD_HOST";
2626
static final String PORT_ENV_VAR_NAME = "FLAGD_PORT";
27+
static final String SYNC_PORT_ENV_VAR_NAME = "FLAGD_SYNC_PORT";
2728
static final String TLS_ENV_VAR_NAME = "FLAGD_TLS";
2829
static final String DEFAULT_AUTHORITY_ENV_VAR_NAME = "FLAGD_DEFAULT_AUTHORITY";
2930
static final String SOCKET_PATH_ENV_VAR_NAME = "FLAGD_SOCKET_PATH";

providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/FlagdOptions.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -254,8 +254,14 @@ void prebuild() {
254254
}
255255

256256
if (port == 0 && resolverType != Config.Resolver.FILE) {
257-
port = Integer.parseInt(
258-
fallBackToEnvOrDefault(Config.PORT_ENV_VAR_NAME, determineDefaultPortForResolver()));
257+
String defaultPort = determineDefaultPortForResolver();
258+
String fromPortEnv = fallBackToEnvOrDefault(Config.PORT_ENV_VAR_NAME, defaultPort);
259+
260+
String portValue = resolverType == Config.Resolver.IN_PROCESS
261+
? fallBackToEnvOrDefault(Config.SYNC_PORT_ENV_VAR_NAME, fromPortEnv)
262+
: fromPortEnv;
263+
264+
port = Integer.parseInt(portValue);
259265
}
260266
}
261267

providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/FlagdOptionsTest.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@
77
import static dev.openfeature.contrib.providers.flagd.Config.DEFAULT_RPC_PORT;
88
import static dev.openfeature.contrib.providers.flagd.Config.KEEP_ALIVE_MS_ENV_VAR_NAME;
99
import static dev.openfeature.contrib.providers.flagd.Config.KEEP_ALIVE_MS_ENV_VAR_NAME_OLD;
10+
import static dev.openfeature.contrib.providers.flagd.Config.PORT_ENV_VAR_NAME;
1011
import static dev.openfeature.contrib.providers.flagd.Config.RESOLVER_ENV_VAR;
1112
import static dev.openfeature.contrib.providers.flagd.Config.RESOLVER_IN_PROCESS;
1213
import static dev.openfeature.contrib.providers.flagd.Config.RESOLVER_RPC;
14+
import static dev.openfeature.contrib.providers.flagd.Config.SYNC_PORT_ENV_VAR_NAME;
1315
import static dev.openfeature.contrib.providers.flagd.Config.TARGET_URI_ENV_VAR_NAME;
1416
import static org.assertj.core.api.Assertions.assertThat;
1517
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -201,6 +203,37 @@ void testInProcessProviderFromEnv_portConfigured_usesConfiguredPort() {
201203
assertThat(flagdOptions.getPort()).isEqualTo(1000);
202204
}
203205

206+
@Test
207+
@SetEnvironmentVariable(key = RESOLVER_ENV_VAR, value = RESOLVER_IN_PROCESS)
208+
@SetEnvironmentVariable(key = SYNC_PORT_ENV_VAR_NAME, value = "9999")
209+
void testInProcessProvider_usesSyncPortEnvVarWhenSet() {
210+
FlagdOptions flagdOptions = FlagdOptions.builder().build();
211+
212+
assertThat(flagdOptions.getResolverType()).isEqualTo(Resolver.IN_PROCESS);
213+
assertThat(flagdOptions.getPort()).isEqualTo(9999);
214+
}
215+
216+
@Test
217+
@SetEnvironmentVariable(key = RESOLVER_ENV_VAR, value = RESOLVER_IN_PROCESS)
218+
@SetEnvironmentVariable(key = PORT_ENV_VAR_NAME, value = "8888")
219+
void testInProcessProvider_fallsBackToFlagdPortWhenSyncPortNotSet() {
220+
FlagdOptions flagdOptions = FlagdOptions.builder().build();
221+
222+
assertThat(flagdOptions.getResolverType()).isEqualTo(Resolver.IN_PROCESS);
223+
assertThat(flagdOptions.getPort()).isEqualTo(8888);
224+
}
225+
226+
@Test
227+
@SetEnvironmentVariable(key = RESOLVER_ENV_VAR, value = RESOLVER_IN_PROCESS)
228+
@SetEnvironmentVariable(key = PORT_ENV_VAR_NAME, value = "8888")
229+
@SetEnvironmentVariable(key = SYNC_PORT_ENV_VAR_NAME, value = "9999")
230+
void testInProcessProvider_syncPortTakesPrecedenceOverFlagdPort() {
231+
FlagdOptions flagdOptions = FlagdOptions.builder().build();
232+
233+
assertThat(flagdOptions.getResolverType()).isEqualTo(Resolver.IN_PROCESS);
234+
assertThat(flagdOptions.getPort()).isEqualTo(9999);
235+
}
236+
204237
@Test
205238
@SetEnvironmentVariable(key = RESOLVER_ENV_VAR, value = RESOLVER_RPC)
206239
void testRpcProviderFromEnv_noPortConfigured_defaultsToCorrectPort() {

0 commit comments

Comments
 (0)