Skip to content

Commit d784c8b

Browse files
committed
Support custom agentless UFC endpoints
1 parent ba90dea commit d784c8b

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
@@ -170,7 +170,11 @@ private void updateEtag(final String nextEtag) {
170170
}
171171

172172
static HttpUrl endpoint(final Config config) {
173-
final String endpoint = datadogApiServerDistributionEndpoint(config);
173+
final String configuredBaseUrl = config.getFeatureFlaggingConfigurationSourceAgentlessBaseUrl();
174+
final String endpoint =
175+
configuredBaseUrl == null
176+
? datadogApiServerDistributionEndpoint(config)
177+
: endpointFromConfiguredBaseUrl(configuredBaseUrl);
174178
final HttpUrl parsed = HttpUrl.parse(endpoint);
175179
if (parsed == null) {
176180
throw new IllegalArgumentException(
@@ -179,6 +183,22 @@ static HttpUrl endpoint(final Config config) {
179183
return parsed;
180184
}
181185

186+
private static String endpointFromConfiguredBaseUrl(final String configuredBaseUrl) {
187+
final HttpUrl parsed = HttpUrl.parse(configuredBaseUrl.trim());
188+
if (parsed == null) {
189+
throw new IllegalArgumentException(
190+
"Invalid Feature Flagging HTTP configuration source URL: " + configuredBaseUrl);
191+
}
192+
if ("/".equals(parsed.encodedPath()) || parsed.encodedPath().isEmpty()) {
193+
return parsed
194+
.newBuilder()
195+
.addPathSegments(DATADOG_API_SERVER_DISTRIBUTION_PATH.substring(1))
196+
.build()
197+
.toString();
198+
}
199+
return parsed.toString();
200+
}
201+
182202
private static String datadogApiServerDistributionEndpoint(final Config config) {
183203
final StringBuilder endpoint =
184204
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
@@ -70,6 +70,41 @@ void derivesDatadogApiServerDistributionEndpointWithoutEnv() {
7070
AgentlessConfigurationSource.endpoint(config("datadoghq.com", null)).toString());
7171
}
7272

73+
@Test
74+
void appendsServerDistributionPathToConfiguredAgentlessBaseUrl() {
75+
final Config config = config();
76+
lenient()
77+
.when(config.getFeatureFlaggingConfigurationSourceAgentlessBaseUrl())
78+
.thenReturn("http://mock-backend:8080");
79+
80+
assertEquals(
81+
"http://mock-backend:8080/api/v2/feature-flagging/config/server-distribution",
82+
AgentlessConfigurationSource.endpoint(config).toString());
83+
}
84+
85+
@Test
86+
void usesConfiguredAgentlessEndpointWithPathUnchanged() {
87+
final Config config = config();
88+
lenient()
89+
.when(config.getFeatureFlaggingConfigurationSourceAgentlessBaseUrl())
90+
.thenReturn("http://mock-backend:8080/custom/ufc?tenant=test");
91+
92+
assertEquals(
93+
"http://mock-backend:8080/custom/ufc?tenant=test",
94+
AgentlessConfigurationSource.endpoint(config).toString());
95+
}
96+
97+
@Test
98+
void rejectsInvalidConfiguredAgentlessBaseUrl() {
99+
final Config config = config();
100+
lenient()
101+
.when(config.getFeatureFlaggingConfigurationSourceAgentlessBaseUrl())
102+
.thenReturn("not a URL");
103+
104+
assertThrows(
105+
IllegalArgumentException.class, () -> AgentlessConfigurationSource.endpoint(config));
106+
}
107+
73108
@Test
74109
void rejectsInvalidDatadogApiServerDistributionEndpoint() {
75110
assertThrows(
@@ -398,6 +433,7 @@ private static Config config(final String site, final String env) {
398433
lenient()
399434
.when(config.getFeatureFlaggingConfigurationSourceRequestTimeoutSeconds())
400435
.thenReturn(2);
436+
lenient().when(config.getFeatureFlaggingConfigurationSourceAgentlessBaseUrl()).thenReturn(null);
401437
lenient().when(config.getApiKey()).thenReturn("test-api-key");
402438
lenient().when(config.getSite()).thenReturn(site);
403439
lenient().when(config.getEnv()).thenReturn(env);

0 commit comments

Comments
 (0)