From 16643c83e19b563c546a7962f9cd7b1acb001b0e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 2 Oct 2023 04:28:10 +0000 Subject: [PATCH 01/15] chore(deps): update dependency uk.org.webcompere:system-stubs-jupiter to v2.1.3 (#469) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b2b9253f9..d318db099 100644 --- a/pom.xml +++ b/pom.xml @@ -160,7 +160,7 @@ uk.org.webcompere system-stubs-jupiter - 2.1.2 + 2.1.3 test From 3190ad2bbc4746eb7efb571af14c73cba7176ea0 Mon Sep 17 00:00:00 2001 From: David Blanchard <89858058+DBlanchard88@users.noreply.github.com> Date: Wed, 4 Oct 2023 10:02:08 -0400 Subject: [PATCH 02/15] test: zero value and events tests (#468) Signed-off-by: DBlanchard88 Co-authored-by: Todd Baert --- pom.xml | 25 ++-- providers/flagd/pom.xml | 16 +++ .../e2e/RunFlagdInProcessCucumberTest.java | 1 + .../flagd/e2e/RunFlagdRpcCucumberTest.java | 1 + .../flagd/e2e/steps/StepDefinitions.java | 126 +++++++++++++++++- providers/flagd/test-harness | 2 +- 6 files changed, 160 insertions(+), 11 deletions(-) diff --git a/pom.xml b/pom.xml index d318db099..1092a64e4 100644 --- a/pom.xml +++ b/pom.xml @@ -148,35 +148,42 @@ mockito-inline 4.11.0 test - + - + uk.org.webcompere system-stubs-core 2.0.3 test - + - + uk.org.webcompere system-stubs-jupiter 2.1.3 test - + - + io.cucumber cucumber-java 7.14.0 test - + - + io.cucumber cucumber-junit-platform-engine 7.14.0 test - + + + + org.awaitility + awaitility + 4.2.0 + test + diff --git a/providers/flagd/pom.xml b/providers/flagd/pom.xml index 4f5f3ea42..2e363b041 100644 --- a/providers/flagd/pom.xml +++ b/providers/flagd/pom.xml @@ -314,6 +314,22 @@ + + copy-gherkin-flagd.feature + validate + + exec + + + + + cp + + test-harness/gherkin/flagd.feature + src/test/resources/features/ + + + diff --git a/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/e2e/RunFlagdInProcessCucumberTest.java b/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/e2e/RunFlagdInProcessCucumberTest.java index 18dbbe9ab..bc99c6da3 100644 --- a/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/e2e/RunFlagdInProcessCucumberTest.java +++ b/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/e2e/RunFlagdInProcessCucumberTest.java @@ -14,6 +14,7 @@ @IncludeEngines("cucumber") @SelectClasspathResource("features/evaluation.feature") @SelectClasspathResource("features/flagd-json-evaluator.feature") +@SelectClasspathResource("features/flagd.feature") @ConfigurationParameter(key = PLUGIN_PROPERTY_NAME, value = "pretty") @ConfigurationParameter(key = GLUE_PROPERTY_NAME, value = "dev.openfeature.contrib.providers.flagd.e2e.process,dev.openfeature.contrib.providers.flagd.e2e.steps") public class RunFlagdInProcessCucumberTest { diff --git a/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/e2e/RunFlagdRpcCucumberTest.java b/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/e2e/RunFlagdRpcCucumberTest.java index fc2f55a82..e1679a8a7 100644 --- a/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/e2e/RunFlagdRpcCucumberTest.java +++ b/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/e2e/RunFlagdRpcCucumberTest.java @@ -14,6 +14,7 @@ @IncludeEngines("cucumber") @SelectClasspathResource("features/evaluation.feature") @SelectClasspathResource("features/flagd-json-evaluator.feature") +@SelectClasspathResource("features/flagd.feature") @ConfigurationParameter(key = PLUGIN_PROPERTY_NAME, value = "pretty") @ConfigurationParameter(key = GLUE_PROPERTY_NAME, value = "dev.openfeature.contrib.providers.flagd.e2e.rpc,dev.openfeature.contrib.providers.flagd.e2e.steps") public class RunFlagdRpcCucumberTest { diff --git a/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/e2e/steps/StepDefinitions.java b/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/e2e/steps/StepDefinitions.java index b7514dd43..ae426db1a 100644 --- a/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/e2e/steps/StepDefinitions.java +++ b/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/e2e/steps/StepDefinitions.java @@ -4,13 +4,16 @@ import java.util.HashMap; import java.util.Map; +import java.util.function.Consumer; +import org.awaitility.Awaitility; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Order; import org.junit.jupiter.api.parallel.Isolated; import dev.openfeature.sdk.Client; import dev.openfeature.sdk.EvaluationContext; +import dev.openfeature.sdk.EventDetails; import dev.openfeature.sdk.FeatureProvider; import dev.openfeature.sdk.FlagEvaluationDetails; import dev.openfeature.sdk.ImmutableContext; @@ -25,6 +28,8 @@ import io.cucumber.java.en.Then; import io.cucumber.java.en.When; +import java.time.Duration; + /** * Common test suite used by both RPC and in-process flagd providers. */ @@ -63,6 +68,12 @@ public class StepDefinitions { private EvaluationContext customEvaluatorContext; + private boolean isChangeHandlerRun = false; + private boolean isReadyHandlerRun = false; + + private Consumer changeHandler; + private Consumer readyHandler; + /** * Injects the client to use for this test. * Tests run one at a time, but just in case, a lock is used to make sure the @@ -110,6 +121,7 @@ public void the_resolved_boolean_value_should_be_true(String expected) { } // string value + @When("a string flag with key {string} is evaluated with default value {string}") public void a_string_flag_with_key_is_evaluated_with_default_value(String flagKey, String defaultValue) { this.stringFlagKey = flagKey; @@ -371,7 +383,119 @@ public void a_context_containing_a_key_with_value(String key, String value) { @Then("the returned value should be {string}") public void the_returned_value_should_be(String expected) { - String value = client.getStringValue(this.stringFlagKey, this.stringFlagDefaultValue, this.customEvaluatorContext); + String value = client.getStringValue(this.stringFlagKey, this.stringFlagDefaultValue, + this.customEvaluatorContext); + assertEquals(expected, value); + } + + /* + * Events + */ + + // Flag change event + @When("a PROVIDER_CONFIGURATION_CHANGED handler is added") + public void a_provider_configuration_changed_handler_is_added() { + this.changeHandler = (EventDetails details) -> { + this.isChangeHandlerRun = true; + }; + client.onProviderConfigurationChanged(this.changeHandler); + + } + + @When("a flag with key {string} is modified") + public void a_flag_with_key_is_modified(String flagKey) { + // This happens automatically + } + + @Then("the PROVIDER_CONFIGURATION_CHANGED handler must run") + public void the_provider_configuration_changed_handler_must_run() { + Awaitility.await() + .atMost(Duration.ofSeconds(2)) + .until(() -> { + return this.isChangeHandlerRun; + }); + } + + @Then("the event details must indicate {string} was altered") + public void the_event_details_must_indicate_was_altered(String flagKey) { + // TODO: In-process-provider doesnt support flag change list. + } + + // Provider ready event + @When("a PROVIDER_READY handler is added") + public void a_provider_ready_handler_is_added() { + this.readyHandler = (EventDetails details) -> { + this.isReadyHandlerRun = true; + }; + client.onProviderReady(this.readyHandler); + } + + @Then("the PROVIDER_READY handler must run") + public void the_provider_ready_handler_must_run() { + Awaitility.await() + .atMost(Duration.ofSeconds(2)) + .until(() -> { + return this.isReadyHandlerRun; + }); + } + + /* + * Zero Value + */ + + // boolean value + @When("a zero-value boolean flag with key {string} is evaluated with default value {string}") + public void a_zero_value_boolean_flag_with_key_is_evaluated_with_default_value(String flagKey, + String defaultValue) { + this.booleanFlagKey = flagKey; + this.booleanFlagDefaultValue = Boolean.valueOf(defaultValue); + } + + @Then("the resolved boolean zero-value should be {string}") + public void the_resolved_boolean_zero_value_should_be(String expected) { + boolean value = client.getBooleanValue(this.booleanFlagKey, this.booleanFlagDefaultValue); + assertEquals(Boolean.valueOf(expected), value); + } + + // float/double value + @When("a zero-value float flag with key {string} is evaluated with default value {double}") + public void a_zero_value_float_flag_with_key_is_evaluated_with_default_value(String flagKey, Double defaultValue) { + // TODO: There is a bug here with 0 value floats + // this.doubleFlagKey = flagKey; + // this.doubleFlagDefaultValue = defaultValue; + } + + @Then("the resolved float zero-value should be {double}") + public void the_resolved_float_zero_value_should_be(Double expected) { + // FlagEvaluationDetails details = + // client.getDoubleDetails("float-zero-flag", this.doubleFlagDefaultValue); + // assertEquals(expected, details.getValue()); + } + + // integer value + @When("a zero-value integer flag with key {string} is evaluated with default value {int}") + public void a_zero_value_integer_flag_with_key_is_evaluated_with_default_value(String flagKey, + Integer defaultValue) { + this.intFlagKey = flagKey; + this.intFlagDefaultValue = defaultValue; + } + + @Then("the resolved integer zero-value should be {int}") + public void the_resolved_integer_zero_value_should_be(Integer expected) { + int value = client.getIntegerValue(this.intFlagKey, this.intFlagDefaultValue); + assertEquals(expected, value); + } + + // string value + @When("a zero-value string flag with key {string} is evaluated with default value {string}") + public void a_zero_value_string_flag_with_key_is_evaluated_with_default_value(String flagKey, String defaultValue) { + this.stringFlagKey = flagKey; + this.stringFlagDefaultValue = defaultValue; + } + + @Then("the resolved string zero-value should be {string}") + public void the_resolved_string_zero_value_should_be(String expected) { + String value = client.getStringValue(this.stringFlagKey, this.stringFlagDefaultValue); assertEquals(expected, value); } } \ No newline at end of file diff --git a/providers/flagd/test-harness b/providers/flagd/test-harness index 7ab147dbf..5b428c951 160000 --- a/providers/flagd/test-harness +++ b/providers/flagd/test-harness @@ -1 +1 @@ -Subproject commit 7ab147dbf80d84ed55b3bd85316cede1035335d3 +Subproject commit 5b428c951bbcfb7aa041f195ac38400cbc6ccd75 From 8a0c8cfa675363ecbef5467fea7ffc28d4b69e97 Mon Sep 17 00:00:00 2001 From: Giovanni Liva Date: Fri, 6 Oct 2023 16:28:14 +0200 Subject: [PATCH 03/15] chore: fix dependencies for flagd and OTel hook (#471) Signed-off-by: Giovanni Liva --- hooks/open-telemetry/pom.xml | 3 +-- providers/flagd/pom.xml | 6 ++++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/hooks/open-telemetry/pom.xml b/hooks/open-telemetry/pom.xml index a6fce1fde..2d664c159 100644 --- a/hooks/open-telemetry/pom.xml +++ b/hooks/open-telemetry/pom.xml @@ -48,8 +48,7 @@ io.opentelemetry opentelemetry-semconv - 1.28.0-alpha - provided + 1.30.1-alpha diff --git a/providers/flagd/pom.xml b/providers/flagd/pom.xml index 2e363b041..70a1a9180 100644 --- a/providers/flagd/pom.xml +++ b/providers/flagd/pom.xml @@ -128,6 +128,12 @@ 5.2.1 + + commons-codec + commons-codec + 1.16.0 + + From f4f28d8413f56d25355ce0331b6cf1f8b8de7229 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 7 Oct 2023 02:46:34 +0000 Subject: [PATCH 04/15] fix(deps): update dependency io.opentelemetry:opentelemetry-api to v1.31.0 (#474) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- providers/flagd/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/providers/flagd/pom.xml b/providers/flagd/pom.xml index 70a1a9180..fee4bc7d5 100644 --- a/providers/flagd/pom.xml +++ b/providers/flagd/pom.xml @@ -119,7 +119,7 @@ io.opentelemetry opentelemetry-api - 1.30.1 + 1.31.0 From 4873ebc83bf12afe365fec33fcc874c90e48cc91 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 7 Oct 2023 04:46:21 +0000 Subject: [PATCH 05/15] fix(deps): update dependency io.opentelemetry:opentelemetry-bom to v1.31.0 (#475) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- hooks/open-telemetry/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hooks/open-telemetry/pom.xml b/hooks/open-telemetry/pom.xml index 2d664c159..36aad9e9d 100644 --- a/hooks/open-telemetry/pom.xml +++ b/hooks/open-telemetry/pom.xml @@ -30,7 +30,7 @@ io.opentelemetry opentelemetry-bom - 1.30.1 + 1.31.0 pom import From 63b541c166188552764da9df3326754ea6d65b77 Mon Sep 17 00:00:00 2001 From: David Blanchard <89858058+DBlanchard88@users.noreply.github.com> Date: Mon, 9 Oct 2023 13:14:53 -0400 Subject: [PATCH 06/15] fix: int/float auto-conversion (#472) Signed-off-by: DBlanchard88 Co-authored-by: Kavindu Dodanduwa --- .../resolver/process/InProcessResolver.java | 22 ++++-- .../flagd/e2e/steps/StepDefinitions.java | 11 ++- .../process/InProcessResolverTest.java | 75 ++++++++++++++----- 3 files changed, 75 insertions(+), 33 deletions(-) diff --git a/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/resolver/process/InProcessResolver.java b/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/resolver/process/InProcessResolver.java index 409b85ddd..db7961436 100644 --- a/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/resolver/process/InProcessResolver.java +++ b/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/resolver/process/InProcessResolver.java @@ -26,7 +26,8 @@ import static dev.openfeature.contrib.providers.flagd.resolver.process.model.FeatureFlag.EMPTY_TARGETING_STRING; /** - * flagd in-process resolver. Resolves feature flags in-process. Flags are retrieved from {@link Storage}, where the + * flagd in-process resolver. Resolves feature flags in-process. Flags are + * retrieved from {@link Storage}, where the * {@link Storage} maintain flag configurations obtained from known source. */ @Slf4j @@ -97,7 +98,7 @@ public void shutdown() throws InterruptedException { * Resolve a boolean flag. */ public ProviderEvaluation booleanEvaluation(String key, Boolean defaultValue, - EvaluationContext ctx) { + EvaluationContext ctx) { return resolve(Boolean.class, key, ctx); } @@ -105,7 +106,7 @@ public ProviderEvaluation booleanEvaluation(String key, Boolean default * Resolve a string flag. */ public ProviderEvaluation stringEvaluation(String key, String defaultValue, - EvaluationContext ctx) { + EvaluationContext ctx) { return resolve(String.class, key, ctx); } @@ -113,7 +114,7 @@ public ProviderEvaluation stringEvaluation(String key, String defaultVal * Resolve a double flag. */ public ProviderEvaluation doubleEvaluation(String key, Double defaultValue, - EvaluationContext ctx) { + EvaluationContext ctx) { return resolve(Double.class, key, ctx); } @@ -121,7 +122,7 @@ public ProviderEvaluation doubleEvaluation(String key, Double defaultVal * Resolve an integer flag. */ public ProviderEvaluation integerEvaluation(String key, Integer defaultValue, - EvaluationContext ctx) { + EvaluationContext ctx) { return resolve(Integer.class, key, ctx); } @@ -142,7 +143,7 @@ public ProviderEvaluation objectEvaluation(String key, Value defaultValue } private ProviderEvaluation resolve(Class type, String key, - EvaluationContext ctx) { + EvaluationContext ctx) { final FeatureFlag flag = flagStore.getFlag(key); // missing flag @@ -155,7 +156,6 @@ private ProviderEvaluation resolve(Class type, String key, throw new FlagNotFoundError("flag: " + key + " is disabled"); } - final Object resolvedVariant; final String reason; @@ -186,7 +186,13 @@ private ProviderEvaluation resolve(Class type, String key, log.debug(message); throw new TypeMismatchError(message); } - + if (value instanceof Integer && type == Double.class) { + // if this is an integer and we are trying to resolve a double, convert + value = ((Integer) value).doubleValue(); + } else if (value instanceof Double && type == Integer.class) { + // if this is a double and we are trying to resolve an integer, convert + value = ((Double) value).intValue(); + } if (!type.isAssignableFrom(value.getClass()) || !(resolvedVariant instanceof String)) { String message = "returning default variant for flagKey: %s, type not valid"; log.debug(String.format(message, key)); diff --git a/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/e2e/steps/StepDefinitions.java b/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/e2e/steps/StepDefinitions.java index ae426db1a..ad11540a4 100644 --- a/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/e2e/steps/StepDefinitions.java +++ b/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/e2e/steps/StepDefinitions.java @@ -460,16 +460,15 @@ public void the_resolved_boolean_zero_value_should_be(String expected) { // float/double value @When("a zero-value float flag with key {string} is evaluated with default value {double}") public void a_zero_value_float_flag_with_key_is_evaluated_with_default_value(String flagKey, Double defaultValue) { - // TODO: There is a bug here with 0 value floats - // this.doubleFlagKey = flagKey; - // this.doubleFlagDefaultValue = defaultValue; + this.doubleFlagKey = flagKey; + this.doubleFlagDefaultValue = defaultValue; } @Then("the resolved float zero-value should be {double}") public void the_resolved_float_zero_value_should_be(Double expected) { - // FlagEvaluationDetails details = - // client.getDoubleDetails("float-zero-flag", this.doubleFlagDefaultValue); - // assertEquals(expected, details.getValue()); + FlagEvaluationDetails details = + client.getDoubleDetails("float-zero-flag", this.doubleFlagDefaultValue); + assertEquals(expected, details.getValue()); } // integer value diff --git a/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/resolver/process/InProcessResolverTest.java b/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/resolver/process/InProcessResolverTest.java index fc668b1a5..73a91c162 100644 --- a/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/resolver/process/InProcessResolverTest.java +++ b/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/resolver/process/InProcessResolverTest.java @@ -47,8 +47,8 @@ public void eventHandling() throws Throwable { final BlockingQueue sender = new LinkedBlockingQueue<>(5); final BlockingQueue receiver = new LinkedBlockingQueue<>(5); - InProcessResolver inProcessResolver = - getInProcessResolverWth(new MockStorage(new HashMap<>(), sender), providerState -> { + InProcessResolver inProcessResolver = getInProcessResolverWth(new MockStorage(new HashMap<>(), sender), + providerState -> { receiver.offer(providerState); }); @@ -56,7 +56,8 @@ public void eventHandling() throws Throwable { Thread initThread = new Thread(() -> { try { inProcessResolver.init(); - } catch (Exception e) {} + } catch (Exception e) { + } }); initThread.start(); if (!sender.offer(StorageState.OK, 100, TimeUnit.MILLISECONDS)) { @@ -86,8 +87,8 @@ public void simpleBooleanResolving() throws Exception { }); // when - ProviderEvaluation providerEvaluation = - inProcessResolver.booleanEvaluation("booleanFlag", false, new ImmutableContext()); + ProviderEvaluation providerEvaluation = inProcessResolver.booleanEvaluation("booleanFlag", false, + new ImmutableContext()); // then assertEquals(true, providerEvaluation.getValue()); @@ -105,8 +106,8 @@ public void simpleDoubleResolving() throws Exception { }); // when - ProviderEvaluation providerEvaluation = - inProcessResolver.doubleEvaluation("doubleFlag", 0d, new ImmutableContext()); + ProviderEvaluation providerEvaluation = inProcessResolver.doubleEvaluation("doubleFlag", 0d, + new ImmutableContext()); // then assertEquals(3.141d, providerEvaluation.getValue()); @@ -114,6 +115,44 @@ public void simpleDoubleResolving() throws Exception { assertEquals(Reason.STATIC.toString(), providerEvaluation.getReason()); } + @Test + public void fetchIntegerAsDouble() throws Exception { + // given + final Map flagMap = new HashMap<>(); + flagMap.put("doubleFlag", DOUBLE_FLAG); + + InProcessResolver inProcessResolver = getInProcessResolverWth(new MockStorage(flagMap), providerState -> { + }); + + // when + ProviderEvaluation providerEvaluation = inProcessResolver.integerEvaluation("doubleFlag", 0, + new ImmutableContext()); + + // then + assertEquals(3, providerEvaluation.getValue()); + assertEquals("one", providerEvaluation.getVariant()); + assertEquals(Reason.STATIC.toString(), providerEvaluation.getReason()); + } + + @Test + public void fetchDoubleAsInt() throws Exception { + // given + final Map flagMap = new HashMap<>(); + flagMap.put("integerFlag", INT_FLAG); + + InProcessResolver inProcessResolver = getInProcessResolverWth(new MockStorage(flagMap), providerState -> { + }); + + // when + ProviderEvaluation providerEvaluation = inProcessResolver.doubleEvaluation("integerFlag", 0d, + new ImmutableContext()); + + // then + assertEquals(1d, providerEvaluation.getValue()); + assertEquals("one", providerEvaluation.getVariant()); + assertEquals(Reason.STATIC.toString(), providerEvaluation.getReason()); + } + @Test public void simpleIntResolving() throws Exception { // given @@ -124,8 +163,8 @@ public void simpleIntResolving() throws Exception { }); // when - ProviderEvaluation providerEvaluation = - inProcessResolver.integerEvaluation("integerFlag", 0, new ImmutableContext()); + ProviderEvaluation providerEvaluation = inProcessResolver.integerEvaluation("integerFlag", 0, + new ImmutableContext()); // then assertEquals(1, providerEvaluation.getValue()); @@ -147,8 +186,8 @@ public void simpleObjectResolving() throws Exception { typeDefault.put("date", "01.01.1990"); // when - ProviderEvaluation providerEvaluation = - inProcessResolver.objectEvaluation("objectFlag", Value.objectToValue(typeDefault), new ImmutableContext()); + ProviderEvaluation providerEvaluation = inProcessResolver.objectEvaluation("objectFlag", + Value.objectToValue(typeDefault), new ImmutableContext()); // then Value value = providerEvaluation.getValue(); @@ -230,9 +269,8 @@ public void targetingMatchedEvaluationFlag() throws Exception { }); // when - ProviderEvaluation providerEvaluation = - inProcessResolver.stringEvaluation("stringFlag", "loopAlg", - new MutableContext().add("email", "abc@faas.com")); + ProviderEvaluation providerEvaluation = inProcessResolver.stringEvaluation("stringFlag", "loopAlg", + new MutableContext().add("email", "abc@faas.com")); // then assertEquals("binetAlg", providerEvaluation.getValue()); @@ -250,9 +288,8 @@ public void targetingUnmatchedEvaluationFlag() throws Exception { }); // when - ProviderEvaluation providerEvaluation = - inProcessResolver.stringEvaluation("stringFlag", "loopAlg", - new MutableContext().add("email", "abc@abc.com")); + ProviderEvaluation providerEvaluation = inProcessResolver.stringEvaluation("stringFlag", "loopAlg", + new MutableContext().add("email", "abc@abc.com")); // then assertEquals("loopAlg", providerEvaluation.getValue()); @@ -275,13 +312,13 @@ public void targetingErrorEvaluationFlag() throws Exception { }); } - private InProcessResolver getInProcessResolverWth(final MockStorage storage, Consumer stateConsumer) throws NoSuchFieldException, IllegalAccessException { Field flagStore = InProcessResolver.class.getDeclaredField("flagStore"); flagStore.setAccessible(true); - InProcessResolver resolver = new InProcessResolver(FlagdOptions.builder().deadline(1000).build(), stateConsumer); + InProcessResolver resolver = new InProcessResolver(FlagdOptions.builder().deadline(1000).build(), + stateConsumer); flagStore.set(resolver, storage); return resolver; From 6e5991de1c041463443067223770d797fadee9cd Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Mon, 9 Oct 2023 13:21:46 -0400 Subject: [PATCH 07/15] chore: update release-please-config.json Signed-off-by: Todd Baert --- release-please-config.json | 56 +++++++++++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/release-please-config.json b/release-please-config.json index b1bf18a8b..8b3f12af1 100644 --- a/release-please-config.json +++ b/release-please-config.json @@ -78,5 +78,59 @@ "README.md" ] } - } + }, + "changelog-sections": [ + { + "type": "fix", + "section": "๐Ÿ› Bug Fixes" + }, + { + "type": "feat", + "section": "โœจ New Features" + }, + { + "type": "chore", + "section": "๐Ÿงน Chore" + }, + { + "type": "docs", + "section": "๐Ÿ“š Documentation" + }, + { + "type": "perf", + "section": "๐Ÿš€ Performance" + }, + { + "type": "build", + "hidden": true, + "section": "๐Ÿ› ๏ธ Build" + }, + { + "type": "deps", + "section": "๐Ÿ“ฆ Dependencies" + }, + { + "type": "ci", + "hidden": true, + "section": "๐Ÿšฆ CI" + }, + { + "type": "refactor", + "section": "๐Ÿ”„ Refactoring" + }, + { + "type": "revert", + "section": "๐Ÿ”™ Reverts" + }, + { + "type": "style", + "hidden": true, + "section": "๐ŸŽจ Styling" + }, + { + "type": "test", + "hidden": true, + "section": "๐Ÿงช Tests" + } + ] } From 662361e65da5e17b17d2ecd300e624486657be74 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 9 Oct 2023 13:29:36 -0400 Subject: [PATCH 08/15] chore(main): release dev.openfeature.contrib.hooks.otel 2.1.1 (#429) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .release-please-manifest.json | 2 +- hooks/open-telemetry/CHANGELOG.md | 14 ++++++++++++++ hooks/open-telemetry/README.md | 2 +- hooks/open-telemetry/pom.xml | 2 +- hooks/open-telemetry/version.txt | 2 +- 5 files changed, 18 insertions(+), 4 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 99554ae19..e6aa084fe 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,6 +1,6 @@ { "providers/flagd": "0.6.4", - "hooks/open-telemetry": "2.1.0", + "hooks/open-telemetry": "2.1.1", "providers/go-feature-flag": "0.2.13", "providers/flagsmith": "0.0.8", "providers/env-var": "0.0.4", diff --git a/hooks/open-telemetry/CHANGELOG.md b/hooks/open-telemetry/CHANGELOG.md index 75bd040d2..ddc924c06 100644 --- a/hooks/open-telemetry/CHANGELOG.md +++ b/hooks/open-telemetry/CHANGELOG.md @@ -1,5 +1,19 @@ # Changelog +## [2.1.1](https://github.com/open-feature/java-sdk-contrib/compare/dev.openfeature.contrib.hooks.otel-v2.1.0...dev.openfeature.contrib.hooks.otel-v2.1.1) (2023-10-09) + + +### ๐Ÿ› Bug Fixes + +* **deps:** update dependency io.opentelemetry:opentelemetry-bom to v1.30.0 ([#428](https://github.com/open-feature/java-sdk-contrib/issues/428)) ([ffcbc47](https://github.com/open-feature/java-sdk-contrib/commit/ffcbc4745471a9be6c51428fa83693475bc5110d)) +* **deps:** update dependency io.opentelemetry:opentelemetry-bom to v1.30.1 ([#433](https://github.com/open-feature/java-sdk-contrib/issues/433)) ([0fe21e9](https://github.com/open-feature/java-sdk-contrib/commit/0fe21e9b3dc1e16bb28f285fa89f0a62c5c4a6fb)) +* **deps:** update dependency io.opentelemetry:opentelemetry-bom to v1.31.0 ([#475](https://github.com/open-feature/java-sdk-contrib/issues/475)) ([4873ebc](https://github.com/open-feature/java-sdk-contrib/commit/4873ebc83bf12afe365fec33fcc874c90e48cc91)) + + +### ๐Ÿงน Chore + +* fix dependencies for flagd and OTel hook ([#471](https://github.com/open-feature/java-sdk-contrib/issues/471)) ([8a0c8cf](https://github.com/open-feature/java-sdk-contrib/commit/8a0c8cfa675363ecbef5467fea7ffc28d4b69e97)) + ## [2.1.0](https://github.com/open-feature/java-sdk-contrib/compare/dev.openfeature.contrib.hooks.otel-v2.0.0...dev.openfeature.contrib.hooks.otel-v2.1.0) (2023-08-21) diff --git a/hooks/open-telemetry/README.md b/hooks/open-telemetry/README.md index 8062a92d5..5119a5d0f 100644 --- a/hooks/open-telemetry/README.md +++ b/hooks/open-telemetry/README.md @@ -12,7 +12,7 @@ These hooks can be used to determine the impact a feature has on a request, enab dev.openfeature.contrib.hooks otel - 2.1.0 + 2.1.1 ``` diff --git a/hooks/open-telemetry/pom.xml b/hooks/open-telemetry/pom.xml index 36aad9e9d..90c90d022 100644 --- a/hooks/open-telemetry/pom.xml +++ b/hooks/open-telemetry/pom.xml @@ -10,7 +10,7 @@ dev.openfeature.contrib.hooks otel - 2.1.0 + 2.1.1 open-telemetry-hook Open Telemetry Hook diff --git a/hooks/open-telemetry/version.txt b/hooks/open-telemetry/version.txt index 7ec1d6db4..3e3c2f1e5 100644 --- a/hooks/open-telemetry/version.txt +++ b/hooks/open-telemetry/version.txt @@ -1 +1 @@ -2.1.0 +2.1.1 From 0595b5ef1ce89ad4a374326d365c8eca562916d3 Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Mon, 9 Oct 2023 14:01:01 -0400 Subject: [PATCH 09/15] chore: skip tests on deploy (#478) Signed-off-by: Todd Baert --- .github/workflows/release-please.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml index dec0655de..4fd36317a 100644 --- a/.github/workflows/release-please.yml +++ b/.github/workflows/release-please.yml @@ -48,8 +48,8 @@ jobs: env: GPG_SIGNING_KEY: ${{ secrets.GPG_SIGNING_KEY }} - # Release Please has already incremented versions and published tags, so we just need to publish. - - name: Maven Verify Deploy + # Release Please has already incremented versions and published tags, so we just need to publish (skip tests). + - name: Maven Verify Deploy -DskipTests if: ${{ steps.release.outputs.releases_created }} # The nexus-staging-maven-plugin doesn't follow maven conventions. It stages all the projects with the last submodule: https://help.sonatype.com/repomanager2/staging-releases/configuring-your-project-for-deployment # This means there's no way to skip publishing of a particular module in a multi-module build, so we iterate over each module and publish them individually, From 51d15d23ed2d37d9d8b3611cecfee74e09f101bc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 9 Oct 2023 14:07:36 -0400 Subject: [PATCH 10/15] chore(main): release dev.openfeature.contrib.providers.flagd 0.6.5 (#479) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .release-please-manifest.json | 2 +- providers/flagd/CHANGELOG.md | 14 ++++++++++++++ providers/flagd/README.md | 2 +- providers/flagd/pom.xml | 2 +- providers/flagd/version.txt | 2 +- 5 files changed, 18 insertions(+), 4 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index e6aa084fe..80e766fd6 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,5 +1,5 @@ { - "providers/flagd": "0.6.4", + "providers/flagd": "0.6.5", "hooks/open-telemetry": "2.1.1", "providers/go-feature-flag": "0.2.13", "providers/flagsmith": "0.0.8", diff --git a/providers/flagd/CHANGELOG.md b/providers/flagd/CHANGELOG.md index 589efdbf6..f1d641798 100644 --- a/providers/flagd/CHANGELOG.md +++ b/providers/flagd/CHANGELOG.md @@ -1,5 +1,19 @@ # Changelog +## [0.6.5](https://github.com/open-feature/java-sdk-contrib/compare/dev.openfeature.contrib.providers.flagd-v0.6.4...dev.openfeature.contrib.providers.flagd-v0.6.5) (2023-10-09) + + +### ๐Ÿ› Bug Fixes + +* **deps:** update dependency io.opentelemetry:opentelemetry-api to v1.31.0 ([#474](https://github.com/open-feature/java-sdk-contrib/issues/474)) ([f4f28d8](https://github.com/open-feature/java-sdk-contrib/commit/f4f28d8413f56d25355ce0331b6cf1f8b8de7229)) +* int/float auto-conversion ([#472](https://github.com/open-feature/java-sdk-contrib/issues/472)) ([63b541c](https://github.com/open-feature/java-sdk-contrib/commit/63b541c166188552764da9df3326754ea6d65b77)) + + +### ๐Ÿงน Chore + +* fix dependencies for flagd and OTel hook ([#471](https://github.com/open-feature/java-sdk-contrib/issues/471)) ([8a0c8cf](https://github.com/open-feature/java-sdk-contrib/commit/8a0c8cfa675363ecbef5467fea7ffc28d4b69e97)) +* flagd change log level from error to warn ([#465](https://github.com/open-feature/java-sdk-contrib/issues/465)) ([d03be0c](https://github.com/open-feature/java-sdk-contrib/commit/d03be0c366876a84bcf169d5404ea2ea144e7fab)) + ## [0.6.4](https://github.com/open-feature/java-sdk-contrib/compare/dev.openfeature.contrib.providers.flagd-v0.6.3...dev.openfeature.contrib.providers.flagd-v0.6.4) (2023-09-28) diff --git a/providers/flagd/README.md b/providers/flagd/README.md index ad4fb6046..5f27847e6 100644 --- a/providers/flagd/README.md +++ b/providers/flagd/README.md @@ -12,7 +12,7 @@ This provider is designed to use flagd's [evaluation protocol](https://github.co dev.openfeature.contrib.providers flagd - 0.6.4 + 0.6.5 ``` diff --git a/providers/flagd/pom.xml b/providers/flagd/pom.xml index fee4bc7d5..1ab87034d 100644 --- a/providers/flagd/pom.xml +++ b/providers/flagd/pom.xml @@ -10,7 +10,7 @@ dev.openfeature.contrib.providers flagd - 0.6.4 + 0.6.5 diff --git a/providers/flagd/version.txt b/providers/flagd/version.txt index d2b13eb64..ef5e44544 100644 --- a/providers/flagd/version.txt +++ b/providers/flagd/version.txt @@ -1 +1 @@ -0.6.4 +0.6.5 From 6920557708528fa858b3febd7f0700255e598576 Mon Sep 17 00:00:00 2001 From: Kavindu Dodanduwa Date: Mon, 9 Oct 2023 15:41:52 -0700 Subject: [PATCH 11/15] feat: flagd in process offline mode (#473) Signed-off-by: Kavindu Dodanduwa Signed-off-by: Kavindu Dodanduwa Co-authored-by: Giovanni Liva Co-authored-by: Todd Baert --- providers/flagd/README.md | 15 ++++ providers/flagd/architecture.png | Bin 90678 -> 94139 bytes .../contrib/providers/flagd/FlagdOptions.java | 64 ++++++++++++++---- .../resolver/process/InProcessResolver.java | 9 ++- .../resolver/process/storage/FlagStore.java | 2 +- .../resolver/process/storage/Storage.java | 2 +- .../process/storage/connector/Connector.java | 2 +- .../storage/connector/file/FileConnector.java | 58 ++++++++++++++++ .../flagd/FeatureFlagProviderBuilderTest.java | 7 +- .../flagd/resolver/process/TestUtils.java | 8 +++ .../process/storage/FlagStoreTest.java | 2 +- .../connector/file/FileConnectorTest.java | 50 ++++++++++++++ 12 files changed, 198 insertions(+), 21 deletions(-) create mode 100644 providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/resolver/process/storage/connector/file/FileConnector.java create mode 100644 providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/resolver/process/storage/connector/file/FileConnectorTest.java diff --git a/providers/flagd/README.md b/providers/flagd/README.md index 5f27847e6..bd44b57e1 100644 --- a/providers/flagd/README.md +++ b/providers/flagd/README.md @@ -51,6 +51,21 @@ FlagdProvider flagdProvider = new FlagdProvider( In the above example, in-process handlers attempt to connect to a sync service on address `localhost:8013` to obtain [flag definitions](https://github.com/open-feature/schemas/blob/main/json/flagd-definitions.json). +In-process resolver can also work in an offline mode. To enable this mode, you should provide a valid flag configuration file with the option `offlineFlagSourcePath`. +The file must contain a valid flagd flag source file. + +```java +FlagdProvider flagdProvider = new FlagdProvider( + FlagdOptions.builder() + .resolverType(Config.Evaluator.IN_PROCESS) + .offlineFlagSourcePath("PATH") + .build()); +``` + +Provider will not detect file changes nor re-read the file after the initial read. +This mode is useful for local development, test cases and for offline application. +For a full-featured, production-ready file-based implementation, use the RPC evaluator in combination with the flagd standalone application, which can be configured to watch files for changes. + ### Configuration options Options can be defined in the constructor or as environment variables, with constructor options having the highest diff --git a/providers/flagd/architecture.png b/providers/flagd/architecture.png index 4bcd4a82369e14b2f1c5b0cc07bbe2e4bdc15879..899af60a3cfd1075215a3f671139d1c4f38553ef 100644 GIT binary patch literal 94139 zcmeFZcT`kK*Ef0yLL&&YfgouB6&2!d=m za#-U8f^6Q3Ae)vkbnu(E>;b_D;)fj3IQXZV>1bzX6!)jQ^HVE2vxz!sc|8?d*$*E+ zwd-7j2){sJxIl{LZ-%r22lpN<`}>IBZk;!OYoz+CsWFs?&~8&>6A1Os2xJe-Wi>QC zbzZr)00I z57H=yZqYC1UU{-aqXbjs`rn-Ti}+ybLkQblls)D=`*#}aNW?7}JAeAiQZOk+9^J5C z-CwKqVpf^QKeRH&dBs zp)2``iu%Y4@sdR=dq^Ybyzbt;wB}OZ9vx95OZns3Gx`{Wv&h3y*@ioC13@Sap zGnma(Eg~of%yn2<$ubO6*T<9

+6lg_-Mrn?dBBmHys6w8=W?tI5s1u{H}~IrERX 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

    eq0=bV`1>q^hzQ^pnB%l%mjdY-1b?-kD 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 ArvLx| 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 c45258006..0e00a6bd3 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 @@ -4,6 +4,8 @@ import lombok.Builder; import lombok.Getter; +import javax.annotation.Nonnull; + import static dev.openfeature.contrib.providers.flagd.Config.BASE_EVENT_STREAM_RETRY_BACKOFF_MS; import static dev.openfeature.contrib.providers.flagd.Config.BASE_EVENT_STREAM_RETRY_BACKOFF_MS_ENV_VAR_NAME; import static dev.openfeature.contrib.providers.flagd.Config.CACHE_ENV_VAR_NAME; @@ -20,15 +22,15 @@ import static dev.openfeature.contrib.providers.flagd.Config.MAX_CACHE_SIZE_ENV_VAR_NAME; import static dev.openfeature.contrib.providers.flagd.Config.MAX_EVENT_STREAM_RETRIES_ENV_VAR_NAME; import static dev.openfeature.contrib.providers.flagd.Config.PORT_ENV_VAR_NAME; -import static dev.openfeature.contrib.providers.flagd.Config.SOURCE_SELECTOR_ENV_VAR_NAME; import static dev.openfeature.contrib.providers.flagd.Config.SERVER_CERT_PATH_ENV_VAR_NAME; import static dev.openfeature.contrib.providers.flagd.Config.SOCKET_PATH_ENV_VAR_NAME; +import static dev.openfeature.contrib.providers.flagd.Config.SOURCE_SELECTOR_ENV_VAR_NAME; import static dev.openfeature.contrib.providers.flagd.Config.TLS_ENV_VAR_NAME; import static dev.openfeature.contrib.providers.flagd.Config.fallBackToEnvOrDefault; /** * FlagdOptions is a builder to build flagd provider options. - * */ + */ @Builder @Getter @SuppressWarnings("PMD.TooManyStaticImports") @@ -36,62 +38,62 @@ public class FlagdOptions { /** * flagd resolving type. - * */ + */ @Builder.Default private Config.Evaluator resolverType = DEFAULT_RESOLVER_TYPE; /** * flagd connection host. - * */ + */ @Builder.Default private String host = fallBackToEnvOrDefault(HOST_ENV_VAR_NAME, DEFAULT_HOST); /** * flagd connection port. - * */ + */ @Builder.Default private int port = Integer.parseInt(fallBackToEnvOrDefault(PORT_ENV_VAR_NAME, DEFAULT_PORT)); /** * Use TLS connectivity. - * */ + */ @Builder.Default private boolean tls = Boolean.parseBoolean(fallBackToEnvOrDefault(TLS_ENV_VAR_NAME, DEFAULT_TLS)); /** * TLS certificate overriding if TLS connectivity is used. - * */ + */ @Builder.Default private String certPath = fallBackToEnvOrDefault(SERVER_CERT_PATH_ENV_VAR_NAME, null); /** * Unix socket path to flagd. - * */ + */ @Builder.Default private String socketPath = fallBackToEnvOrDefault(SOCKET_PATH_ENV_VAR_NAME, null); /** * Cache type to use. Supports - lru, disabled. - * */ + */ @Builder.Default private String cacheType = fallBackToEnvOrDefault(CACHE_ENV_VAR_NAME, DEFAULT_CACHE); /** * Max cache size. - * */ + */ @Builder.Default private int maxCacheSize = fallBackToEnvOrDefault(MAX_CACHE_SIZE_ENV_VAR_NAME, DEFAULT_MAX_CACHE_SIZE); /** * Max event stream connection retries. - * */ + */ @Builder.Default private int maxEventStreamRetries = fallBackToEnvOrDefault(MAX_EVENT_STREAM_RETRIES_ENV_VAR_NAME, DEFAULT_MAX_EVENT_STREAM_RETRIES); /** * Backoff interval in milliseconds. - * */ + */ @Builder.Default private int retryBackoffMs = fallBackToEnvOrDefault(BASE_EVENT_STREAM_RETRY_BACKOFF_MS_ENV_VAR_NAME, BASE_EVENT_STREAM_RETRY_BACKOFF_MS); @@ -101,7 +103,7 @@ public class FlagdOptions { * Connection deadline in milliseconds. * For RPC resolving, this is the deadline to connect to flagd for flag evaluation. * For in-process resolving, this is the deadline for sync stream termination. - * */ + */ @Builder.Default private int deadline = fallBackToEnvOrDefault(DEADLINE_MS_ENV_VAR_NAME, DEFAULT_DEADLINE); @@ -111,9 +113,43 @@ public class FlagdOptions { @Builder.Default private String selector = fallBackToEnvOrDefault(SOURCE_SELECTOR_ENV_VAR_NAME, null); + /** + * File source of flags to be used by offline mode. + * Setting this enables the offline mode of the in-process provider. + */ + private String offlineFlagSourcePath; + + /** + * Flagd option to state the offline mode. Only get set with offlineFlagSourcePath. + */ + private boolean isOffline; + /** * Inject OpenTelemetry for the library runtime. Providing sdk will initiate distributed tracing for flagd grpc * connectivity. - * */ + */ private OpenTelemetry openTelemetry; + + /** + * Overload default lombok builder. + */ + public static class FlagdOptionsBuilder { + + /** + * File source of flags to be used by offline mode. + * Setting this enables the offline mode of the in-process provider. + */ + public FlagdOptionsBuilder offlineFlagSourcePath(@Nonnull final String offlineFlagSourcePath) { + this.isOffline = true; + this.offlineFlagSourcePath = offlineFlagSourcePath; + + return this; + } + + // Remove the public access as this needs to be connected to offlineFlagSourcePath + @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.UnusedPrivateMethod"}) + private FlagdOptionsBuilder isOffline(final boolean isOffline) { + return this; + } + } } diff --git a/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/resolver/process/InProcessResolver.java b/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/resolver/process/InProcessResolver.java index db7961436..5c9a9421f 100644 --- a/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/resolver/process/InProcessResolver.java +++ b/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/resolver/process/InProcessResolver.java @@ -7,6 +7,8 @@ import dev.openfeature.contrib.providers.flagd.resolver.process.storage.FlagStore; import dev.openfeature.contrib.providers.flagd.resolver.process.storage.Storage; import dev.openfeature.contrib.providers.flagd.resolver.process.storage.StorageState; +import dev.openfeature.contrib.providers.flagd.resolver.process.storage.connector.Connector; +import dev.openfeature.contrib.providers.flagd.resolver.process.storage.connector.file.FileConnector; import dev.openfeature.contrib.providers.flagd.resolver.process.storage.connector.grpc.GrpcStreamConnector; import dev.openfeature.contrib.providers.flagd.resolver.process.targeting.Operator; import dev.openfeature.contrib.providers.flagd.resolver.process.targeting.TargetingRuleException; @@ -42,8 +44,11 @@ public class InProcessResolver implements Resolver { * Initialize an in-process resolver. */ public InProcessResolver(FlagdOptions options, Consumer stateConsumer) { - // currently we support gRPC connector - this.flagStore = new FlagStore(new GrpcStreamConnector(options)); + final Connector connector = options.isOffline() + ? new FileConnector(options.getOfflineFlagSourcePath()) + : new GrpcStreamConnector(options); + + this.flagStore = new FlagStore(connector); this.deadline = options.getDeadline(); this.stateConsumer = stateConsumer; this.operator = new Operator(); diff --git a/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/resolver/process/storage/FlagStore.java b/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/resolver/process/storage/FlagStore.java index fd6c01da2..ad9435915 100644 --- a/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/resolver/process/storage/FlagStore.java +++ b/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/resolver/process/storage/FlagStore.java @@ -40,7 +40,7 @@ public FlagStore(final Connector connector) { /** * Initialize storage layer. */ - public void init() { + public void init() throws Exception { connector.init(); Thread streamer = new Thread(() -> { try { diff --git a/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/resolver/process/storage/Storage.java b/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/resolver/process/storage/Storage.java index 7e9f3a3a4..32337094e 100644 --- a/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/resolver/process/storage/Storage.java +++ b/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/resolver/process/storage/Storage.java @@ -8,7 +8,7 @@ * Storage abstraction for resolver. */ public interface Storage { - void init(); + void init() throws Exception; void shutdown() throws InterruptedException; diff --git a/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/resolver/process/storage/connector/Connector.java b/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/resolver/process/storage/connector/Connector.java index 5df398b46..66ebf2c90 100644 --- a/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/resolver/process/storage/connector/Connector.java +++ b/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/resolver/process/storage/connector/Connector.java @@ -7,7 +7,7 @@ * {@link StreamPayload} format. */ public interface Connector { - void init(); + void init() throws Exception; BlockingQueue getStream(); diff --git a/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/resolver/process/storage/connector/file/FileConnector.java b/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/resolver/process/storage/connector/file/FileConnector.java new file mode 100644 index 000000000..0d808eb2d --- /dev/null +++ b/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/resolver/process/storage/connector/file/FileConnector.java @@ -0,0 +1,58 @@ +package dev.openfeature.contrib.providers.flagd.resolver.process.storage.connector.file; + +import dev.openfeature.contrib.providers.flagd.resolver.process.storage.connector.Connector; +import dev.openfeature.contrib.providers.flagd.resolver.process.storage.connector.StreamPayload; +import dev.openfeature.contrib.providers.flagd.resolver.process.storage.connector.StreamPayloadType; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; +import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; + +/** + * File connector reads flag configurations and expose the context through {@code Connector} contract. + * The implementation is kept minimal and suites testing, local development needs. + */ +@SuppressFBWarnings(value = {"EI_EXPOSE_REP", "PATH_TRAVERSAL_IN"}, + justification = "File connector read feature flag from a file source.") +@Slf4j +public class FileConnector implements Connector { + + private final String flagSourcePath; + private final BlockingQueue queue = new LinkedBlockingQueue<>(1); + + public FileConnector(final String flagSourcePath) { + this.flagSourcePath = flagSourcePath; + } + + /** + * Initialize file connector. Reads content of the provided source file and offer it through queue. + */ + public void init() throws IOException { + final String flagData = new String(Files.readAllBytes(Paths.get(flagSourcePath)), StandardCharsets.UTF_8); + + if (!queue.offer(new StreamPayload(StreamPayloadType.DATA, flagData))) { + throw new RuntimeException("Unable to write to queue. Queue is full."); + } + + log.info(String.format("Using feature flag configurations from file %s", flagSourcePath)); + } + + /** + * Expose the queue to fulfil the {@code Connector} contract. + */ + public BlockingQueue getStream() { + return queue; + } + + /** + * NO-OP shutdown. + */ + public void shutdown() throws InterruptedException { + // NO-OP nothing to do here + } +} diff --git a/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/FeatureFlagProviderBuilderTest.java b/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/FeatureFlagProviderBuilderTest.java index cd7c4a32d..11ad26bf0 100644 --- a/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/FeatureFlagProviderBuilderTest.java +++ b/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/FeatureFlagProviderBuilderTest.java @@ -30,10 +30,12 @@ public void TestDefaults() { assertEquals(builder.getMaxEventStreamRetries(), DEFAULT_MAX_EVENT_STREAM_RETRIES); assertNull(builder.getSelector()); assertNull(builder.getOpenTelemetry()); + assertNull(builder.getOfflineFlagSourcePath()); + assertFalse(builder.isOffline()); } @Test - public void TestBuilderOptions(){ + public void TestBuilderOptions() { OpenTelemetry openTelemetry = Mockito.mock(OpenTelemetry.class); FlagdOptions flagdOptions = FlagdOptions.builder() @@ -45,6 +47,7 @@ public void TestBuilderOptions(){ .maxCacheSize(100) .maxEventStreamRetries(1) .selector("app=weatherApp") + .offlineFlagSourcePath("some-path") .openTelemetry(openTelemetry) .build(); @@ -56,6 +59,8 @@ public void TestBuilderOptions(){ assertEquals(flagdOptions.getMaxCacheSize(), 100); assertEquals(flagdOptions.getMaxEventStreamRetries(), 1); assertEquals(flagdOptions.getSelector(), "app=weatherApp"); + assertTrue(flagdOptions.isOffline()); + assertEquals("some-path", flagdOptions.getOfflineFlagSourcePath()); assertEquals(flagdOptions.getOpenTelemetry(), openTelemetry); } } diff --git a/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/resolver/process/TestUtils.java b/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/resolver/process/TestUtils.java index 9bb38cde2..61d6a038e 100644 --- a/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/resolver/process/TestUtils.java +++ b/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/resolver/process/TestUtils.java @@ -23,4 +23,12 @@ public static String getFlagsFromResource(final String file) throws IOException return new String(Files.readAllBytes(Paths.get(url.getPath()))); } } + + public static String getResourcePath(final String relativePath) { + final URL url = FlagParser.class.getClassLoader().getResource(relativePath); + if (url == null) { + throw new IllegalStateException(String.format("Resource %s not found", relativePath)); + } + return url.getPath(); + } } diff --git a/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/resolver/process/storage/FlagStoreTest.java b/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/resolver/process/storage/FlagStoreTest.java index 514eeb30a..9d2220d7a 100644 --- a/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/resolver/process/storage/FlagStoreTest.java +++ b/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/resolver/process/storage/FlagStoreTest.java @@ -18,7 +18,7 @@ class FlagStoreTest { @Test - public void connectorHandling() throws InterruptedException { + public void connectorHandling() throws Exception { final int maxDelay = 500; final BlockingQueue payload = new LinkedBlockingQueue<>(); diff --git a/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/resolver/process/storage/connector/file/FileConnectorTest.java b/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/resolver/process/storage/connector/file/FileConnectorTest.java new file mode 100644 index 000000000..bea063de7 --- /dev/null +++ b/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/resolver/process/storage/connector/file/FileConnectorTest.java @@ -0,0 +1,50 @@ +package dev.openfeature.contrib.providers.flagd.resolver.process.storage.connector.file; + +import dev.openfeature.contrib.providers.flagd.resolver.process.storage.connector.StreamPayload; +import dev.openfeature.contrib.providers.flagd.resolver.process.storage.connector.StreamPayloadType; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.time.Duration; +import java.util.concurrent.BlockingQueue; + +import static dev.openfeature.contrib.providers.flagd.resolver.process.TestUtils.VALID_LONG; +import static dev.openfeature.contrib.providers.flagd.resolver.process.TestUtils.getResourcePath; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTimeoutPreemptively; + +class FileConnectorTest { + + @Test + void readAndExposeFeatureFlagsFromSource() throws IOException { + // given + final FileConnector connector = new FileConnector(getResourcePath(VALID_LONG)); + + // when + connector.init(); + + // then + final BlockingQueue stream = connector.getStream(); + final StreamPayload[] payload = new StreamPayload[1]; + + assertNotNull(stream); + assertTimeoutPreemptively(Duration.ofMillis(200), () -> { + payload[0] = stream.take(); + }); + + assertNotNull(payload[0].getData()); + assertEquals(StreamPayloadType.DATA, payload[0].getType()); + } + + @Test + void throwsErrorIfInvalidFile(){ + // given + final FileConnector connector = new FileConnector("INVALID_PATH"); + + // then + assertThrows(IOException.class, connector::init); + } + +} From 05a2535f6223d923ce878e824dbac0ba1c06415e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 10 Oct 2023 01:13:40 +0000 Subject: [PATCH 12/15] fix(deps): update dependency org.semver4j:semver4j to v5.2.2 (#480) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- providers/flagd/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/providers/flagd/pom.xml b/providers/flagd/pom.xml index 1ab87034d..a10d17d2c 100644 --- a/providers/flagd/pom.xml +++ b/providers/flagd/pom.xml @@ -125,7 +125,7 @@ org.semver4j semver4j - 5.2.1 + 5.2.2 From 4ea280e9cff11960f60cd32ee9ca136957442372 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 10 Oct 2023 10:28:38 -0700 Subject: [PATCH 13/15] chore(main): release dev.openfeature.contrib.providers.flagd 0.6.6 (#481) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .release-please-manifest.json | 2 +- providers/flagd/CHANGELOG.md | 12 ++++++++++++ providers/flagd/README.md | 2 +- providers/flagd/pom.xml | 2 +- providers/flagd/version.txt | 2 +- 5 files changed, 16 insertions(+), 4 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 80e766fd6..9c63f5cc6 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,5 +1,5 @@ { - "providers/flagd": "0.6.5", + "providers/flagd": "0.6.6", "hooks/open-telemetry": "2.1.1", "providers/go-feature-flag": "0.2.13", "providers/flagsmith": "0.0.8", diff --git a/providers/flagd/CHANGELOG.md b/providers/flagd/CHANGELOG.md index f1d641798..74d1a3781 100644 --- a/providers/flagd/CHANGELOG.md +++ b/providers/flagd/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## [0.6.6](https://github.com/open-feature/java-sdk-contrib/compare/dev.openfeature.contrib.providers.flagd-v0.6.5...dev.openfeature.contrib.providers.flagd-v0.6.6) (2023-10-10) + + +### ๐Ÿ› Bug Fixes + +* **deps:** update dependency org.semver4j:semver4j to v5.2.2 ([#480](https://github.com/open-feature/java-sdk-contrib/issues/480)) ([05a2535](https://github.com/open-feature/java-sdk-contrib/commit/05a2535f6223d923ce878e824dbac0ba1c06415e)) + + +### โœจ New Features + +* flagd in process offline mode ([#473](https://github.com/open-feature/java-sdk-contrib/issues/473)) ([6920557](https://github.com/open-feature/java-sdk-contrib/commit/6920557708528fa858b3febd7f0700255e598576)) + ## [0.6.5](https://github.com/open-feature/java-sdk-contrib/compare/dev.openfeature.contrib.providers.flagd-v0.6.4...dev.openfeature.contrib.providers.flagd-v0.6.5) (2023-10-09) diff --git a/providers/flagd/README.md b/providers/flagd/README.md index bd44b57e1..8fcd6cc90 100644 --- a/providers/flagd/README.md +++ b/providers/flagd/README.md @@ -12,7 +12,7 @@ This provider is designed to use flagd's [evaluation protocol](https://github.co dev.openfeature.contrib.providers flagd - 0.6.5 + 0.6.6 ``` diff --git a/providers/flagd/pom.xml b/providers/flagd/pom.xml index a10d17d2c..c15bc2419 100644 --- a/providers/flagd/pom.xml +++ b/providers/flagd/pom.xml @@ -10,7 +10,7 @@ dev.openfeature.contrib.providers flagd - 0.6.5 + 0.6.6 diff --git a/providers/flagd/version.txt b/providers/flagd/version.txt index ef5e44544..05e8a4593 100644 --- a/providers/flagd/version.txt +++ b/providers/flagd/version.txt @@ -1 +1 @@ -0.6.5 +0.6.6 From 9c087997281cdc83de84a01743c2fcef8e1fb0d1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 10 Oct 2023 19:02:19 +0000 Subject: [PATCH 14/15] fix(deps): update dependency io.netty:netty-transport-native-epoll to v4.1.100.final (#482) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- providers/flagd/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/providers/flagd/pom.xml b/providers/flagd/pom.xml index c15bc2419..dc4d0c50b 100644 --- a/providers/flagd/pom.xml +++ b/providers/flagd/pom.xml @@ -54,7 +54,7 @@ io.netty netty-transport-native-epoll - 4.1.99.Final + 4.1.100.Final linux-x86_64 From b197f3b904256fff7b0a3987c33c5dc22fe9f12a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 11 Oct 2023 04:21:45 +0000 Subject: [PATCH 15/15] fix(deps): update dependency com.google.guava:guava to v32.1.3-jre (#484) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- providers/go-feature-flag/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/providers/go-feature-flag/pom.xml b/providers/go-feature-flag/pom.xml index dae113d71..715f7bbb6 100644 --- a/providers/go-feature-flag/pom.xml +++ b/providers/go-feature-flag/pom.xml @@ -59,7 +59,7 @@ com.google.guava guava - 32.1.2-jre + 32.1.3-jre