Skip to content

Commit d9a4e4a

Browse files
CAIP-302 Add includeInvisible agent datafeed parameter (#853)
* CAIP-302 Add includeInvisible agent datafeed parameter * Update DatafeedLoopV2Test.java * custom tag * javadoc
1 parent de829d0 commit d9a4e4a

5 files changed

Lines changed: 48 additions & 22 deletions

File tree

symphony-bdk-config/src/main/java/com/symphony/bdk/core/config/model/BdkDatafeedConfig.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@ public class BdkDatafeedConfig {
1616
private String version = "v2";
1717
private String idFilePath;
1818
private BdkRetryConfig retry = new BdkRetryConfig(BdkRetryConfig.INFINITE_MAX_ATTEMPTS);
19+
/**
20+
* Agent 26.2.1 or later required to enable includeInvisible.
21+
*/
22+
private boolean includeInvisible = false;
23+
private String tag;
1924

2025
public void setVersion(String version) {
2126
if ("v1".equalsIgnoreCase(version)) {

symphony-bdk-core/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ dependencies {
7676
}
7777

7878
// OpenAPI code generation
79-
def apiBaseUrl = "https://raw.githubusercontent.com/finos/symphony-api-spec/ee09734380226ac1109a1513156ceefac3bd5a1e"
79+
def apiBaseUrl = "https://raw.githubusercontent.com/finos/symphony-api-spec/5526c5e81cb2313c4aab18119b526534652ba98e"
8080
def generatedFolder = "$buildDir/generated/openapi"
8181
def apisToGenerate = [
8282
Agent: 'agent/agent-api-public-deprecated.yaml',

symphony-bdk-core/src/main/java/com/symphony/bdk/core/service/datafeed/impl/DatafeedLoopV2.java

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import com.symphony.bdk.http.api.ApiException;
1515

1616
import lombok.extern.slf4j.Slf4j;
17+
import org.apache.commons.lang3.StringUtils;
1718
import org.apiguardian.api.API;
1819

1920
import java.util.List;
@@ -47,13 +48,16 @@ public class DatafeedLoopV2 extends AbstractAckIdEventLoop {
4748
* Datahose feeds are in the format *_p_*, e.g. "d25098517ec62f1fc65cd111667a8386_p_be940".
4849
*/
4950
private static final Pattern FANOUT_FEED_PATTERN = Pattern.compile("^[^\\s_]+_f(_[^\\s_]+)?$");
51+
private static final String FANOUT_TYPE = "fanout";
5052

5153
private final RetryWithRecoveryBuilder<?> retryWithRecoveryBuilder;
5254
private final RetryWithRecovery<Void> readDatafeed;
5355
private final RetryWithRecovery<V5Datafeed> retrieveDatafeed;
5456
private final RetryWithRecovery<V5Datafeed> createDatafeed;
5557
private final RetryWithRecovery<Void> deleteDatafeed;
5658

59+
private final V5DatafeedCreateBody datafeedCreateBody;
60+
5761
private V5Datafeed datafeed;
5862

5963
public DatafeedLoopV2(DatafeedApi datafeedApi, AuthSession authSession, BdkConfig config, UserV2 botInfo) {
@@ -87,6 +91,14 @@ public DatafeedLoopV2(DatafeedApi datafeedApi, AuthSession authSession, BdkConfi
8791
.supplier(this::doDeleteDatafeed)
8892
.ignoreException(ApiException::isClientError)
8993
.build();
94+
95+
datafeedCreateBody = new V5DatafeedCreateBody();
96+
if (config.getDatafeed().isIncludeInvisible()) {
97+
datafeedCreateBody.setIncludeInvisible(true);
98+
}
99+
if (StringUtils.isNotBlank(config.getDatafeed().getTag())) {
100+
datafeedCreateBody.setTag(config.getDatafeed().getTag());
101+
}
90102
}
91103

92104
@Override
@@ -108,7 +120,7 @@ private V5Datafeed doCreateDatafeed() throws ApiException {
108120
return this.datafeedApi.createDatafeed(
109121
this.authSession.getSessionToken(),
110122
this.authSession.getKeyManagerToken(),
111-
new V5DatafeedCreateBody()
123+
datafeedCreateBody
112124
);
113125
}
114126

@@ -118,10 +130,18 @@ private V5Datafeed doRetrieveDatafeed() throws ApiException {
118130
this.authSession.getKeyManagerToken(),
119131
null
120132
);
121-
return feeds.stream().filter(this::isFanoutFeed).findFirst().orElse(null);
133+
return feeds.stream().filter(this::isMatchingFeed).findFirst().orElse(null);
122134
}
123135

124-
private boolean isFanoutFeed(V5Datafeed d) {
136+
private boolean isMatchingFeed(V5Datafeed d) {
137+
if (this.datafeedCreateBody.getTag() != null) {
138+
if (this.datafeedCreateBody.getTag().equals(d.getId())
139+
&& FANOUT_TYPE.equalsIgnoreCase(d.getType())) {
140+
return true;
141+
} else {
142+
return false;
143+
}
144+
}
125145
final String datafeedId = d.getId();
126146
return datafeedId != null && FANOUT_FEED_PATTERN.matcher(datafeedId).matches();
127147
}

symphony-bdk-core/src/test/java/com/symphony/bdk/core/service/datafeed/impl/DatafeedLoopV2Test.java

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ void testStartWithoutTag() throws ApiException, AuthUnauthorizedException {
127127
void testStartInvalidExistingFeeds(String invalidExistingFeedId) throws ApiException, AuthUnauthorizedException {
128128
when(datafeedApi.listDatafeed(TOKEN, TOKEN, null))
129129
.thenReturn(Collections.singletonList(new V5Datafeed().id(invalidExistingFeedId)));
130-
when(datafeedApi.createDatafeed(TOKEN, TOKEN, new V5DatafeedCreateBody())).thenReturn(
130+
when(datafeedApi.createDatafeed(TOKEN, TOKEN, new V5DatafeedCreateBody().includeInvisible(true))).thenReturn(
131131
new V5Datafeed().id(DATAFEED_ID));
132132

133133
AckId ackId = new AckId().ackId(datafeedService.getAckId());
@@ -138,7 +138,7 @@ void testStartInvalidExistingFeeds(String invalidExistingFeedId) throws ApiExcep
138138

139139
this.datafeedService.start();
140140

141-
V5DatafeedCreateBody datafeedCreateBody = new V5DatafeedCreateBody();
141+
V5DatafeedCreateBody datafeedCreateBody = new V5DatafeedCreateBody().includeInvisible(true);
142142
verify(datafeedApi, times(1)).listDatafeed(TOKEN, TOKEN, null);
143143
verify(datafeedApi, times(1)).createDatafeed(TOKEN, TOKEN, datafeedCreateBody);
144144
verify(datafeedApi, times(1)).readDatafeed(DATAFEED_ID, TOKEN, TOKEN, ackId);
@@ -149,7 +149,7 @@ void testStartInvalidExistingFeeds(String invalidExistingFeedId) throws ApiExcep
149149
void testStartValidExistingFeeds(String validExistingFeedId) throws ApiException, AuthUnauthorizedException {
150150
when(datafeedApi.listDatafeed(TOKEN, TOKEN, null))
151151
.thenReturn(Collections.singletonList(new V5Datafeed().id(validExistingFeedId)));
152-
when(datafeedApi.createDatafeed(TOKEN, TOKEN, new V5DatafeedCreateBody())).thenReturn(
152+
when(datafeedApi.createDatafeed(TOKEN, TOKEN, new V5DatafeedCreateBody().includeInvisible(true))).thenReturn(
153153
new V5Datafeed().id(validExistingFeedId));
154154

155155
AckId ackId = new AckId().ackId(datafeedService.getAckId());
@@ -160,7 +160,7 @@ void testStartValidExistingFeeds(String validExistingFeedId) throws ApiException
160160

161161
this.datafeedService.start();
162162

163-
V5DatafeedCreateBody datafeedCreateBody = new V5DatafeedCreateBody();
163+
V5DatafeedCreateBody datafeedCreateBody = new V5DatafeedCreateBody().includeInvisible(true);
164164
verify(datafeedApi, times(1)).listDatafeed(TOKEN, TOKEN, null);
165165
verify(datafeedApi, times(0)).createDatafeed(TOKEN, TOKEN, datafeedCreateBody);
166166
verify(datafeedApi, times(1)).readDatafeed(validExistingFeedId, TOKEN, TOKEN, ackId);
@@ -337,7 +337,7 @@ private ArgumentMatcher<AckId> eqAckId(String ackId) {
337337
@Test
338338
void testStartEmptyListDatafeed() throws ApiException, AuthUnauthorizedException {
339339
when(datafeedApi.listDatafeed(TOKEN, TOKEN, null)).thenReturn(Collections.emptyList());
340-
when(datafeedApi.createDatafeed(TOKEN, TOKEN, new V5DatafeedCreateBody())).thenReturn(
340+
when(datafeedApi.createDatafeed(TOKEN, TOKEN, new V5DatafeedCreateBody().includeInvisible(true))).thenReturn(
341341
new V5Datafeed().id(DATAFEED_ID));
342342
AckId initialAckId = new AckId().ackId("");
343343
final String secondAckId = "ack-id";
@@ -349,11 +349,11 @@ void testStartEmptyListDatafeed() throws ApiException, AuthUnauthorizedException
349349
this.datafeedService.start();
350350

351351
verify(datafeedApi, times(1)).listDatafeed(TOKEN, TOKEN, null);
352-
verify(datafeedApi, times(1)).createDatafeed(TOKEN, TOKEN, new V5DatafeedCreateBody());
352+
verify(datafeedApi, times(1)).createDatafeed(TOKEN, TOKEN, new V5DatafeedCreateBody().includeInvisible(true));
353353
verify(datafeedApi, times(1)).readDatafeed(DATAFEED_ID, TOKEN, TOKEN, initialAckId);
354354
assertEquals(secondAckId, datafeedService.getAckId());
355355
}
356-
356+
357357
@Test
358358
void testClientErrorTriggersDatafeedRecreation() throws ApiException, AuthUnauthorizedException {
359359
when(datafeedApi.listDatafeed(TOKEN, TOKEN, null)).thenReturn(
@@ -370,7 +370,7 @@ void testClientErrorTriggersDatafeedRecreation() throws ApiException, AuthUnauth
370370
.thenThrow(new ApiException(400, ""));
371371
when(datafeedApi.deleteDatafeed(DATAFEED_ID, TOKEN, TOKEN)).thenReturn(null);
372372

373-
when(datafeedApi.createDatafeed(TOKEN, TOKEN, new V5DatafeedCreateBody())).thenReturn(
373+
when(datafeedApi.createDatafeed(TOKEN, TOKEN, new V5DatafeedCreateBody().includeInvisible(true))).thenReturn(
374374
new V5Datafeed().id(secondDatafeedId));
375375
when(datafeedApi.readDatafeed(secondDatafeedId, TOKEN, TOKEN, initialAckId))
376376
.thenReturn(new V5EventList().addEventsItem(
@@ -470,43 +470,43 @@ void testStartErrorListDatafeedThenRetrySuccess() throws ApiException, AuthUnaut
470470
@Test
471471
void testStartAuthErrorCreateDatafeed() throws ApiException, AuthUnauthorizedException {
472472
when(datafeedApi.listDatafeed(TOKEN, TOKEN, null)).thenReturn(Collections.emptyList());
473-
when(datafeedApi.createDatafeed(TOKEN, TOKEN, new V5DatafeedCreateBody())).thenThrow(
473+
when(datafeedApi.createDatafeed(TOKEN, TOKEN, new V5DatafeedCreateBody().includeInvisible(true))).thenThrow(
474474
new ApiException(401, "unauthorized-error"));
475475
doThrow(AuthUnauthorizedException.class).when(authSession).refresh();
476476

477477
assertThrows(AuthUnauthorizedException.class, this.datafeedService::start);
478478
verify(datafeedApi, times(1)).listDatafeed(TOKEN, TOKEN, null);
479-
verify(datafeedApi, times(1)).createDatafeed(TOKEN, TOKEN, new V5DatafeedCreateBody());
479+
verify(datafeedApi, times(1)).createDatafeed(TOKEN, TOKEN, new V5DatafeedCreateBody().includeInvisible(true));
480480
}
481481

482482
@Test
483483
void testStartClientErrorCreateDatafeed() throws ApiException {
484484
when(datafeedApi.listDatafeed(TOKEN, TOKEN, null)).thenReturn(Collections.emptyList());
485-
when(datafeedApi.createDatafeed(TOKEN, TOKEN, new V5DatafeedCreateBody())).thenThrow(
485+
when(datafeedApi.createDatafeed(TOKEN, TOKEN, new V5DatafeedCreateBody().includeInvisible(true))).thenThrow(
486486
new ApiException(400, "client-error"));
487487

488488
assertThrows(ApiException.class, this.datafeedService::start);
489489
verify(datafeedApi, times(1)).listDatafeed(TOKEN, TOKEN, null);
490-
verify(datafeedApi, times(2)).createDatafeed(TOKEN, TOKEN, new V5DatafeedCreateBody());
490+
verify(datafeedApi, times(2)).createDatafeed(TOKEN, TOKEN, new V5DatafeedCreateBody().includeInvisible(true));
491491
}
492492

493493
@Test
494494
void testStartServerErrorCreateDatafeed() throws ApiException {
495495
when(datafeedApi.listDatafeed(TOKEN, TOKEN, null)).thenReturn(Collections.emptyList());
496-
when(datafeedApi.createDatafeed(TOKEN, TOKEN, new V5DatafeedCreateBody())).thenThrow(
496+
when(datafeedApi.createDatafeed(TOKEN, TOKEN, new V5DatafeedCreateBody().includeInvisible(true))).thenThrow(
497497
new ApiException(502, "server-error"));
498498

499499
assertThrows(ApiException.class, this.datafeedService::start);
500500
verify(datafeedApi, times(1)).listDatafeed(TOKEN, TOKEN, null);
501-
verify(datafeedApi, times(2)).createDatafeed(TOKEN, TOKEN, new V5DatafeedCreateBody());
501+
verify(datafeedApi, times(2)).createDatafeed(TOKEN, TOKEN, new V5DatafeedCreateBody().includeInvisible(true));
502502
}
503503

504504
@Test
505505
void testStartClientErrorReadDatafeedAndClientErrorCreateDatafeed() throws ApiException, AuthUnauthorizedException {
506506
AckId ackId = new AckId().ackId(datafeedService.getAckId());
507507
when(datafeedApi.listDatafeed(TOKEN, TOKEN, null)).thenReturn(
508508
Collections.singletonList(new V5Datafeed().id(DATAFEED_ID)));
509-
when(datafeedApi.createDatafeed(TOKEN, TOKEN, new V5DatafeedCreateBody()))
509+
when(datafeedApi.createDatafeed(TOKEN, TOKEN, new V5DatafeedCreateBody().includeInvisible(true)))
510510
.thenThrow(new ApiException(400, "ALB: No matching rule found"))
511511
.thenReturn(new V5Datafeed().id("recreate-df-id"));
512512
when(datafeedApi.readDatafeed(DATAFEED_ID, TOKEN, TOKEN, ackId)).thenThrow(new ApiException(400, "client-error"));
@@ -520,7 +520,7 @@ void testStartClientErrorReadDatafeedAndClientErrorCreateDatafeed() throws ApiEx
520520
verify(datafeedApi, times(1)).readDatafeed(DATAFEED_ID, TOKEN, TOKEN, ackId);
521521
verify(datafeedApi, times(1)).readDatafeed("recreate-df-id", TOKEN, TOKEN, ackId);
522522
verify(datafeedApi, times(1)).deleteDatafeed(DATAFEED_ID, TOKEN, TOKEN);
523-
verify(datafeedApi, times(2)).createDatafeed(TOKEN, TOKEN, new V5DatafeedCreateBody());
523+
verify(datafeedApi, times(2)).createDatafeed(TOKEN, TOKEN, new V5DatafeedCreateBody().includeInvisible(true));
524524
}
525525

526526
@Test
@@ -613,7 +613,7 @@ void testStartClientErrorDeleteDatafeed() throws ApiException, AuthUnauthorizedE
613613
AckId ackId = new AckId().ackId(datafeedService.getAckId());
614614
when(datafeedApi.listDatafeed(TOKEN, TOKEN, null)).thenReturn(
615615
Collections.singletonList(new V5Datafeed().id(DATAFEED_ID)));
616-
when(datafeedApi.createDatafeed(TOKEN, TOKEN, new V5DatafeedCreateBody())).thenReturn(
616+
when(datafeedApi.createDatafeed(TOKEN, TOKEN, new V5DatafeedCreateBody().includeInvisible(true))).thenReturn(
617617
new V5Datafeed().id("recreate-df-id"));
618618
when(datafeedApi.readDatafeed(DATAFEED_ID, TOKEN, TOKEN, ackId)).thenThrow(new ApiException(400, "client-error"));
619619
when(datafeedApi.readDatafeed("recreate-df-id", TOKEN, TOKEN, ackId))
@@ -626,7 +626,7 @@ void testStartClientErrorDeleteDatafeed() throws ApiException, AuthUnauthorizedE
626626
verify(datafeedApi, times(1)).listDatafeed(TOKEN, TOKEN, null);
627627
verify(datafeedApi, times(1)).readDatafeed(DATAFEED_ID, TOKEN, TOKEN, ackId);
628628
verify(datafeedApi, times(1)).readDatafeed("recreate-df-id", TOKEN, TOKEN, ackId);
629-
verify(datafeedApi, times(1)).createDatafeed(TOKEN, TOKEN, new V5DatafeedCreateBody());
629+
verify(datafeedApi, times(1)).createDatafeed(TOKEN, TOKEN, new V5DatafeedCreateBody().includeInvisible(true));
630630
verify(datafeedApi, times(1)).deleteDatafeed(DATAFEED_ID, TOKEN, TOKEN);
631631
}
632632

symphony-bdk-core/src/test/resources/config/config.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ app:
2020
path: /Users/local/conf/agent/privatekey.pem
2121

2222
datafeed:
23+
includeInvisible: true
2324
retry:
2425
maxAttempts: 2
2526

0 commit comments

Comments
 (0)