Skip to content

Commit 38f2b8b

Browse files
committed
add rule cardinality check UT
Signed-off-by: Kaushal Kumar <[email protected]>
1 parent e92de90 commit 38f2b8b

File tree

2 files changed

+32
-18
lines changed

2 files changed

+32
-18
lines changed

modules/autotagging-commons/common/src/main/java/org/opensearch/rule/service/IndexStoredRulePersistenceService.java

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -111,24 +111,17 @@ public void createRule(CreateRuleRequest request, ActionListener<CreateRuleRespo
111111
}
112112

113113
private void performCardinalityCheck(ActionListener<CreateRuleResponse> listener) {
114-
client.prepareSearch(indexName).setQuery(queryBuilder.getCardinalityQuery())
115-
.execute(new ActionListener<SearchResponse>() {
116-
@Override
117-
public void onResponse(SearchResponse searchResponse) {
118-
if (searchResponse.getHits().getTotalHits().value() >= MAX_ALLOWED_RULE_COUNT) {
119-
listener.onFailure(
120-
new OpenSearchRejectedExecutionException("This create operation will violate" +
121-
" the cardinality limit of " + MAX_ALLOWED_RULE_COUNT +
122-
". Please delete some stale or redundant rules first")
123-
);
124-
}
125-
}
126-
127-
@Override
128-
public void onFailure(Exception e) {
129-
listener.onFailure(e);
130-
}
131-
});
114+
SearchResponse searchResponse = client.prepareSearch(indexName).setQuery(queryBuilder.getCardinalityQuery()).get();
115+
if (searchResponse.getHits().getTotalHits() != null && searchResponse.getHits().getTotalHits().value() >= MAX_ALLOWED_RULE_COUNT) {
116+
listener.onFailure(
117+
new OpenSearchRejectedExecutionException(
118+
"This create operation will violate"
119+
+ " the cardinality limit of "
120+
+ MAX_ALLOWED_RULE_COUNT
121+
+ ". Please delete some stale or redundant rules first"
122+
)
123+
);
124+
}
132125
}
133126

134127
/**

modules/autotagging-commons/common/src/test/java/org/opensearch/rule/service/IndexStoredRulePersistenceServiceTests.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.opensearch.common.util.concurrent.ThreadContext;
2626
import org.opensearch.core.action.ActionListener;
2727
import org.opensearch.core.common.bytes.BytesArray;
28+
import org.opensearch.core.concurrency.OpenSearchRejectedExecutionException;
2829
import org.opensearch.core.index.shard.ShardId;
2930
import org.opensearch.index.engine.DocumentMissingException;
3031
import org.opensearch.index.query.QueryBuilder;
@@ -109,6 +110,7 @@ public void setUp() throws Exception {
109110
queryBuilder = mock(QueryBuilder.class);
110111
when(queryBuilder.filter(any())).thenReturn(queryBuilder);
111112
when(ruleQueryMapper.from(any(GetRuleRequest.class))).thenReturn(queryBuilder);
113+
when(ruleQueryMapper.getCardinalityQuery()).thenReturn(mock(QueryBuilder.class));
112114
when(ruleEntityParser.parse(anyString())).thenReturn(rule);
113115

114116
rulePersistenceService = new IndexStoredRulePersistenceService(
@@ -144,6 +146,25 @@ public void testCreateRuleOnExistingIndex() throws Exception {
144146
assertNotNull(responseCaptor.getValue().getRule());
145147
}
146148

149+
public void testCardinalityCheckBasedFailure() throws Exception {
150+
CreateRuleRequest createRuleRequest = mock(CreateRuleRequest.class);
151+
when(createRuleRequest.getRule()).thenReturn(rule);
152+
when(rule.toXContent(any(), any())).thenAnswer(invocation -> invocation.getArgument(0));
153+
154+
SearchResponse searchResponse = mock(SearchResponse.class);
155+
when(searchResponse.getHits()).thenReturn(
156+
new SearchHits(new SearchHit[] {}, new TotalHits(10000, TotalHits.Relation.EQUAL_TO), 1.0f)
157+
);
158+
when(searchRequestBuilder.get()).thenReturn(searchResponse);
159+
160+
ActionListener<CreateRuleResponse> listener = mock(ActionListener.class);
161+
rulePersistenceService.createRule(createRuleRequest, listener);
162+
163+
ArgumentCaptor<Exception> exceptionCaptor = ArgumentCaptor.forClass(OpenSearchRejectedExecutionException.class);
164+
verify(listener).onFailure(exceptionCaptor.capture());
165+
assertNotNull(exceptionCaptor.getValue());
166+
}
167+
147168
public void testConcurrentCreateDuplicateRules() throws InterruptedException {
148169
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
149170
int threadCount = 10;

0 commit comments

Comments
 (0)