From 0436095fb53d33d938c268f5786d3f74dbcc0a76 Mon Sep 17 00:00:00 2001 From: Hazel Date: Tue, 4 Aug 2026 17:10:55 -0700 Subject: [PATCH 1/7] add test config --- .../stargate/sgv2/jsonapi/JsonApiStartUp.java | 19 +++++++- .../config/DeploymentMarkerConfig.java | 43 +++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 src/main/java/io/stargate/sgv2/jsonapi/config/DeploymentMarkerConfig.java diff --git a/src/main/java/io/stargate/sgv2/jsonapi/JsonApiStartUp.java b/src/main/java/io/stargate/sgv2/jsonapi/JsonApiStartUp.java index ca44cd1622..6efd0ea6d2 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/JsonApiStartUp.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/JsonApiStartUp.java @@ -4,13 +4,19 @@ import io.stargate.sgv2.jsonapi.api.request.tenant.TenantFactory; import io.stargate.sgv2.jsonapi.config.BillingConfig; import io.stargate.sgv2.jsonapi.config.DebugModeConfig; +import io.stargate.sgv2.jsonapi.config.DeploymentMarkerConfig; import io.stargate.sgv2.jsonapi.config.OperationsConfig; import jakarta.enterprise.event.Observes; import jakarta.inject.Inject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class JsonApiStartUp { + private static final Logger LOGGER = LoggerFactory.getLogger(JsonApiStartUp.class); + private final OperationsConfig operationsConfig; + private final DeploymentMarkerConfig deploymentMarkerConfig; /** * {@link DebugModeConfig} and {@link BillingConfig} are injected here purely to anchor them as @@ -26,11 +32,22 @@ public class JsonApiStartUp { */ @Inject public JsonApiStartUp( - DebugModeConfig config, OperationsConfig operationsConfig, BillingConfig billingConfig) { + DebugModeConfig config, + OperationsConfig operationsConfig, + BillingConfig billingConfig, + DeploymentMarkerConfig deploymentMarkerConfig) { this.operationsConfig = operationsConfig; + this.deploymentMarkerConfig = deploymentMarkerConfig; } void onStart(@Observes StartupEvent ev) { TenantFactory.initialize(operationsConfig.databaseConfig().type()); + + // Observation point for deployment drills, see DeploymentMarkerConfig. + // Disabled by default, in which case nothing is logged here. + if (deploymentMarkerConfig.enabled()) { + LOGGER.info( + "Deployment marker enabled - marker={}", deploymentMarkerConfig.value().orElse("")); + } } } diff --git a/src/main/java/io/stargate/sgv2/jsonapi/config/DeploymentMarkerConfig.java b/src/main/java/io/stargate/sgv2/jsonapi/config/DeploymentMarkerConfig.java new file mode 100644 index 0000000000..aa6f09582c --- /dev/null +++ b/src/main/java/io/stargate/sgv2/jsonapi/config/DeploymentMarkerConfig.java @@ -0,0 +1,43 @@ +package io.stargate.sgv2.jsonapi.config; + +import io.smallrye.config.ConfigMapping; +import io.smallrye.config.WithDefault; +import java.util.Optional; + +/** + * Configuration for the deployment marker: an opt-in, inert string that the application echoes once + * at startup. + * + *

The marker drives no behaviour of its own, it is only an observation point for deployment + * drills. The value is handed to the pod as an environment variable, and when {@link #enabled()} is + * {@code true} it is written to the startup log by {@link io.stargate.sgv2.jsonapi.JsonApiStartUp}. + * Left at the {@code false} default, no marker line is logged and no request handling changes. + * + *

As for any {@code @ConfigMapping}, SmallRye Config also reads these properties from + * environment variables, which is how a Helm chart would supply them: + * + *

+ * STARGATE_JSONAPI_DEPLOYMENT_MARKER_ENABLED=true
+ * STARGATE_JSONAPI_DEPLOYMENT_MARKER_VALUE=2026-08-04.1
+ * 
+ */ +@ConfigMapping(prefix = "stargate.jsonapi.deployment-marker") +public interface DeploymentMarkerConfig { + + /** + * @return If the deployment marker should be logged at startup. + */ + @WithDefault("false") + boolean enabled(); + + /** + * Deliberately not annotated {@code @WithDefault("")}: SmallRye's built-in String converter reads + * an empty default as {@code null}, and a non-optional mapping property then fails startup with + * {@code SRCFG00040}. {@link Optional} is also how the neighbouring config interfaces express + * "may be unset". + * + * @return The marker to log, such as a release tag or a rollout id. Only read when {@link + * #enabled()} is {@code true}, and logged as an empty marker when not set. + */ + Optional value(); +} From cb28988208061137941cdf01643459d279ffe26e Mon Sep 17 00:00:00 2001 From: Hazel Date: Tue, 4 Aug 2026 17:17:19 -0700 Subject: [PATCH 2/7] update comments --- .../config/DeploymentMarkerConfig.java | 31 ++----------------- 1 file changed, 2 insertions(+), 29 deletions(-) diff --git a/src/main/java/io/stargate/sgv2/jsonapi/config/DeploymentMarkerConfig.java b/src/main/java/io/stargate/sgv2/jsonapi/config/DeploymentMarkerConfig.java index aa6f09582c..288626f191 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/config/DeploymentMarkerConfig.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/config/DeploymentMarkerConfig.java @@ -4,40 +4,13 @@ import io.smallrye.config.WithDefault; import java.util.Optional; -/** - * Configuration for the deployment marker: an opt-in, inert string that the application echoes once - * at startup. - * - *

The marker drives no behaviour of its own, it is only an observation point for deployment - * drills. The value is handed to the pod as an environment variable, and when {@link #enabled()} is - * {@code true} it is written to the startup log by {@link io.stargate.sgv2.jsonapi.JsonApiStartUp}. - * Left at the {@code false} default, no marker line is logged and no request handling changes. - * - *

As for any {@code @ConfigMapping}, SmallRye Config also reads these properties from - * environment variables, which is how a Helm chart would supply them: - * - *

- * STARGATE_JSONAPI_DEPLOYMENT_MARKER_ENABLED=true
- * STARGATE_JSONAPI_DEPLOYMENT_MARKER_VALUE=2026-08-04.1
- * 
- */ + @ConfigMapping(prefix = "stargate.jsonapi.deployment-marker") public interface DeploymentMarkerConfig { - /** - * @return If the deployment marker should be logged at startup. - */ + @WithDefault("false") boolean enabled(); - /** - * Deliberately not annotated {@code @WithDefault("")}: SmallRye's built-in String converter reads - * an empty default as {@code null}, and a non-optional mapping property then fails startup with - * {@code SRCFG00040}. {@link Optional} is also how the neighbouring config interfaces express - * "may be unset". - * - * @return The marker to log, such as a release tag or a rollout id. Only read when {@link - * #enabled()} is {@code true}, and logged as an empty marker when not set. - */ Optional value(); } From 0c9a4b34f84488865b687c78918260ad273f14f1 Mon Sep 17 00:00:00 2001 From: Hazel Date: Tue, 4 Aug 2026 18:55:15 -0700 Subject: [PATCH 3/7] format --- .../io/stargate/sgv2/jsonapi/config/DeploymentMarkerConfig.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/io/stargate/sgv2/jsonapi/config/DeploymentMarkerConfig.java b/src/main/java/io/stargate/sgv2/jsonapi/config/DeploymentMarkerConfig.java index 288626f191..d1787c7521 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/config/DeploymentMarkerConfig.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/config/DeploymentMarkerConfig.java @@ -4,11 +4,9 @@ import io.smallrye.config.WithDefault; import java.util.Optional; - @ConfigMapping(prefix = "stargate.jsonapi.deployment-marker") public interface DeploymentMarkerConfig { - @WithDefault("false") boolean enabled(); From cdd722a33fc00d9c54b52e1950b0063c191a3f86 Mon Sep 17 00:00:00 2001 From: Hazel Date: Wed, 5 Aug 2026 15:35:59 -0700 Subject: [PATCH 4/7] update config --- .../sgv2/jsonapi/config/DeploymentMarkerConfig.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/stargate/sgv2/jsonapi/config/DeploymentMarkerConfig.java b/src/main/java/io/stargate/sgv2/jsonapi/config/DeploymentMarkerConfig.java index d1787c7521..998bf941ff 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/config/DeploymentMarkerConfig.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/config/DeploymentMarkerConfig.java @@ -4,11 +4,15 @@ import io.smallrye.config.WithDefault; import java.util.Optional; -@ConfigMapping(prefix = "stargate.jsonapi.deployment-marker") +@ConfigMapping(prefix = "stargate.jsonapi.deployment") public interface DeploymentMarkerConfig { @WithDefault("false") boolean enabled(); - Optional value(); + Optional deployCloud(); + + Optional deploy_region(); + + int value(); } From bbe9b3c5b733053c70f926e34e913d5a74333061 Mon Sep 17 00:00:00 2001 From: Hazel Date: Wed, 5 Aug 2026 15:40:36 -0700 Subject: [PATCH 5/7] update config --- .../io/stargate/sgv2/jsonapi/config/feature/ApiFeature.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/stargate/sgv2/jsonapi/config/feature/ApiFeature.java b/src/main/java/io/stargate/sgv2/jsonapi/config/feature/ApiFeature.java index f8cc2b57e0..c5ccc4c904 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/config/feature/ApiFeature.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/config/feature/ApiFeature.java @@ -82,7 +82,9 @@ public enum ApiFeature { * *

Disabled by default. */ - BILLING_EVENTS_LOGGING("billing-events-logging", false); + BILLING_EVENTS_LOGGING("billing-events-logging", false), + + DEPLOYMENT_MARKER("deployment-marker", false); /** * Prefix for HTTP headers used to override feature flags for specific requests: prepended before From d3f44b8cf583fbe9c80c85a0b687c56621d0e037 Mon Sep 17 00:00:00 2001 From: Hazel Date: Wed, 5 Aug 2026 15:56:01 -0700 Subject: [PATCH 6/7] update deployment marker startup logging --- .../stargate/sgv2/jsonapi/JsonApiStartUp.java | 18 +++++++++++++++--- .../jsonapi/config/DeploymentMarkerConfig.java | 1 + 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/stargate/sgv2/jsonapi/JsonApiStartUp.java b/src/main/java/io/stargate/sgv2/jsonapi/JsonApiStartUp.java index 6efd0ea6d2..6d26dacceb 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/JsonApiStartUp.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/JsonApiStartUp.java @@ -6,6 +6,9 @@ import io.stargate.sgv2.jsonapi.config.DebugModeConfig; import io.stargate.sgv2.jsonapi.config.DeploymentMarkerConfig; import io.stargate.sgv2.jsonapi.config.OperationsConfig; +import io.stargate.sgv2.jsonapi.config.feature.ApiFeature; +import io.stargate.sgv2.jsonapi.config.feature.ApiFeatures; +import io.stargate.sgv2.jsonapi.config.feature.FeaturesConfig; import jakarta.enterprise.event.Observes; import jakarta.inject.Inject; import org.slf4j.Logger; @@ -17,6 +20,7 @@ public class JsonApiStartUp { private final OperationsConfig operationsConfig; private final DeploymentMarkerConfig deploymentMarkerConfig; + private final FeaturesConfig featuresConfig; /** * {@link DebugModeConfig} and {@link BillingConfig} are injected here purely to anchor them as @@ -35,9 +39,11 @@ public JsonApiStartUp( DebugModeConfig config, OperationsConfig operationsConfig, BillingConfig billingConfig, - DeploymentMarkerConfig deploymentMarkerConfig) { + DeploymentMarkerConfig deploymentMarkerConfig, + FeaturesConfig featuresConfig) { this.operationsConfig = operationsConfig; this.deploymentMarkerConfig = deploymentMarkerConfig; + this.featuresConfig = featuresConfig; } void onStart(@Observes StartupEvent ev) { @@ -46,8 +52,14 @@ void onStart(@Observes StartupEvent ev) { // Observation point for deployment drills, see DeploymentMarkerConfig. // Disabled by default, in which case nothing is logged here. if (deploymentMarkerConfig.enabled()) { - LOGGER.info( - "Deployment marker enabled - marker={}", deploymentMarkerConfig.value().orElse("")); + LOGGER.info("Deployment config enabled - marker={}", deploymentMarkerConfig.value()); } + + // Startup-resolved feature flag state (configuration only — request headers cannot apply + // here). Logged unconditionally so the effective state is observable from the pod log. + ApiFeatures apiFeatures = ApiFeatures.fromConfigAndRequest(featuresConfig, null); + LOGGER.info( + "ApiFeature DEPLOYMENT_MARKER enabled={}", + apiFeatures.isFeatureEnabled(ApiFeature.DEPLOYMENT_MARKER)); } } diff --git a/src/main/java/io/stargate/sgv2/jsonapi/config/DeploymentMarkerConfig.java b/src/main/java/io/stargate/sgv2/jsonapi/config/DeploymentMarkerConfig.java index 998bf941ff..da03fe5afb 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/config/DeploymentMarkerConfig.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/config/DeploymentMarkerConfig.java @@ -14,5 +14,6 @@ public interface DeploymentMarkerConfig { Optional deploy_region(); + @WithDefault("0") int value(); } From cd03a96d23e5afe95a3ad9cd8e846efa4ca7a747 Mon Sep 17 00:00:00 2001 From: Hazel Date: Wed, 5 Aug 2026 17:20:46 -0700 Subject: [PATCH 7/7] update config --- .../io/stargate/sgv2/jsonapi/config/DeploymentMarkerConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/stargate/sgv2/jsonapi/config/DeploymentMarkerConfig.java b/src/main/java/io/stargate/sgv2/jsonapi/config/DeploymentMarkerConfig.java index da03fe5afb..5841d3b529 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/config/DeploymentMarkerConfig.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/config/DeploymentMarkerConfig.java @@ -4,7 +4,7 @@ import io.smallrye.config.WithDefault; import java.util.Optional; -@ConfigMapping(prefix = "stargate.jsonapi.deployment") +@ConfigMapping(prefix = "stargate.jsonapi.deployment.env") public interface DeploymentMarkerConfig { @WithDefault("false")