Skip to content

Commit d378350

Browse files
committed
Support custom agentless UFC endpoints
1 parent 4baefdb commit d378350

2 files changed

Lines changed: 57 additions & 1 deletion

File tree

products/feature-flagging/feature-flagging-lib/src/main/java/com/datadog/featureflag/AgentlessConfigurationSource.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,11 @@ private void updateEtag(final String nextEtag) {
242242
}
243243

244244
static HttpUrl endpoint(final Config config) {
245-
final String endpoint = datadogApiServerDistributionEndpoint(config);
245+
final String configuredBaseUrl = config.getFeatureFlaggingConfigurationSourceAgentlessBaseUrl();
246+
final String endpoint =
247+
configuredBaseUrl == null
248+
? datadogApiServerDistributionEndpoint(config)
249+
: endpointFromConfiguredBaseUrl(configuredBaseUrl);
246250
final HttpUrl parsed = HttpUrl.parse(endpoint);
247251
if (parsed == null) {
248252
throw new IllegalArgumentException(
@@ -251,6 +255,22 @@ static HttpUrl endpoint(final Config config) {
251255
return parsed;
252256
}
253257

258+
private static String endpointFromConfiguredBaseUrl(final String configuredBaseUrl) {
259+
final HttpUrl parsed = HttpUrl.parse(configuredBaseUrl.trim());
260+
if (parsed == null) {
261+
throw new IllegalArgumentException(
262+
"Invalid Feature Flagging HTTP configuration source URL: " + configuredBaseUrl);
263+
}
264+
if ("/".equals(parsed.encodedPath()) || parsed.encodedPath().isEmpty()) {
265+
return parsed
266+
.newBuilder()
267+
.addPathSegments(DATADOG_API_SERVER_DISTRIBUTION_PATH.substring(1))
268+
.build()
269+
.toString();
270+
}
271+
return parsed.toString();
272+
}
273+
254274
private static String datadogApiServerDistributionEndpoint(final Config config) {
255275
final StringBuilder endpoint =
256276
new StringBuilder("https://api.")

products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/AgentlessConfigurationSourceTest.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,41 @@ void derivesDatadogApiServerDistributionEndpointWithoutEnv() {
7474
AgentlessConfigurationSource.endpoint(config("datadoghq.com", null)).toString());
7575
}
7676

77+
@Test
78+
void appendsServerDistributionPathToConfiguredAgentlessBaseUrl() {
79+
final Config config = config();
80+
lenient()
81+
.when(config.getFeatureFlaggingConfigurationSourceAgentlessBaseUrl())
82+
.thenReturn("http://mock-backend:8080");
83+
84+
assertEquals(
85+
"http://mock-backend:8080/api/v2/feature-flagging/config/server-distribution",
86+
AgentlessConfigurationSource.endpoint(config).toString());
87+
}
88+
89+
@Test
90+
void usesConfiguredAgentlessEndpointWithPathUnchanged() {
91+
final Config config = config();
92+
lenient()
93+
.when(config.getFeatureFlaggingConfigurationSourceAgentlessBaseUrl())
94+
.thenReturn("http://mock-backend:8080/custom/ufc?tenant=test");
95+
96+
assertEquals(
97+
"http://mock-backend:8080/custom/ufc?tenant=test",
98+
AgentlessConfigurationSource.endpoint(config).toString());
99+
}
100+
101+
@Test
102+
void rejectsInvalidConfiguredAgentlessBaseUrl() {
103+
final Config config = config();
104+
lenient()
105+
.when(config.getFeatureFlaggingConfigurationSourceAgentlessBaseUrl())
106+
.thenReturn("not a URL");
107+
108+
assertThrows(
109+
IllegalArgumentException.class, () -> AgentlessConfigurationSource.endpoint(config));
110+
}
111+
77112
@Test
78113
void rejectsInvalidDatadogApiServerDistributionEndpoint() {
79114
assertThrows(
@@ -702,6 +737,7 @@ private static Config config(final String site, final String env) {
702737
lenient()
703738
.when(config.getFeatureFlaggingConfigurationSourceRequestTimeoutSeconds())
704739
.thenReturn(2);
740+
lenient().when(config.getFeatureFlaggingConfigurationSourceAgentlessBaseUrl()).thenReturn(null);
705741
lenient().when(config.getApiKey()).thenReturn("test-api-key");
706742
lenient().when(config.getSite()).thenReturn(site);
707743
lenient().when(config.getEnv()).thenReturn(env);

0 commit comments

Comments
 (0)