Skip to content
Snippets Groups Projects
Commit 3dd3ffc5 authored by Morris Estepa's avatar Morris Estepa
Browse files

Merge branch 'aws-integration-merge-estepamo' into 'master'

Fix issue where users could not search using hundreds of kinds at once

See merge request !440
parents 0d517e77 54ce18c5
No related branches found
No related tags found
1 merge request!440Fix issue where users could not search using hundreds of kinds at once
Pipeline #168573 failed
package org.opengroup.osdu.search.provider.aws.util;
import com.google.api.client.util.Strings;
import org.opengroup.osdu.core.common.exception.BadRequestException;
import org.opengroup.osdu.core.common.model.http.DpsHeaders;
import org.opengroup.osdu.search.service.IndexAliasService;
import org.opengroup.osdu.search.util.CrossTenantUtils;
import org.opengroup.osdu.core.common.search.ElasticIndexNameResolver;
import org.opengroup.osdu.core.common.model.search.Query;
......@@ -9,36 +11,60 @@ import org.opengroup.osdu.core.common.util.KindParser;
import org.springframework.stereotype.Component;
import javax.inject.Inject;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Component
public class AwsCrossTenantUtils extends CrossTenantUtils {
// For details, please refer to implementation of class
// org.opengroup.osdu.core.common.model.search.validation.MultiKindValidator
private static final int MAX_INDEX_NAME_LENGTH = 3840;
@Inject
private DpsHeaders dpsHeaders;
@Inject
private ElasticIndexNameResolver elasticIndexNameResolver;
@Inject
private IndexAliasService indexAliasService;
// This override method forces the kind used in the index search to use the same partition id as
// the request's partition id header. This is to prevent data from other tenants (aka. partition)
// to appear when searching data in a given tenant.
@Override
public String getIndexName(Query searchRequest) throws BadRequestException {
StringBuilder builder = new StringBuilder();
List<String> kinds = KindParser.parse(searchRequest.getKind());
String index = getIndexName(kinds, new HashMap<>());
if(index.length() <= MAX_INDEX_NAME_LENGTH) {
return index;
}
else {
Map<String, String> aliases = this.indexAliasService.getIndicesAliases(kinds);
return getIndexName(kinds, aliases);
}
}
private String getIndexName(List<String> kinds, Map<String, String> aliases) {
StringBuilder builder = new StringBuilder();
for(String kind : kinds) {
String index = this.elasticIndexNameResolver.getIndexNameFromKind(kind);
String[] indexArr = index.split("-");
if (indexArr[0].equalsIgnoreCase("*")) {
indexArr[0] = dpsHeaders.getPartitionId();
if(aliases.containsKey(kind) && !Strings.isNullOrEmpty(aliases.get(kind))) {
String alias = aliases.get(kind);
builder.append(alias);
}
else if (indexArr[0].equalsIgnoreCase(dpsHeaders.getPartitionId()) == false) {
throw new BadRequestException("Invalid kind in search request.");
else {
String index = this.elasticIndexNameResolver.getIndexNameFromKind(kind);
String[] indexArr = index.split("-");
if (indexArr[0].equalsIgnoreCase("*")) {
indexArr[0] = dpsHeaders.getPartitionId();
}
else if (indexArr[0].equalsIgnoreCase(dpsHeaders.getPartitionId()) == false) {
throw new BadRequestException("Invalid kind in search request.");
}
builder.append(String.join("-", indexArr));
}
builder.append(String.join("-", indexArr) + ",");
builder.append(",");
}
builder.append("-.*"); // Exclude Lucene/ElasticSearch internal indices
return builder.toString();
}
}
......@@ -8,6 +8,11 @@ import org.opengroup.osdu.core.common.exception.BadRequestException;
import org.opengroup.osdu.core.common.model.http.DpsHeaders;
import org.opengroup.osdu.core.common.model.search.*;
import org.opengroup.osdu.core.common.search.ElasticIndexNameResolver;
import org.opengroup.osdu.core.common.util.KindParser;
import org.opengroup.osdu.search.service.IndexAliasService;
import org.springframework.security.core.parameters.P;
import java.util.*;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.when;
......@@ -24,6 +29,9 @@ public class AwsCrossTenantUtilsTest {
@Mock
private ElasticIndexNameResolver elasticIndexNameResolver;
@Mock
private IndexAliasService indexAliasService;
@Mock
private Query searchRequest;
......@@ -40,6 +48,75 @@ public class AwsCrossTenantUtilsTest {
assertEquals(INDEX_NAME, awsCrossTenantUtils.getIndexName(searchRequest));
}
@Test
public void should_return_alias_when_searchingHundredSameKindsAndKindMatches() {
Integer KIND_COUNT = 300;
String DATA_PARTITION_ID = "tenant1";
String KIND = "tenant1:*:*:*";
String INDEX = KIND.replace(":", "-");
List<String> KINDS = Collections.nCopies(KIND_COUNT, KIND);
String ALIAS = String.format("a%d", KIND.hashCode());
Map<String, String> ALIAS_MAP = new HashMap<>();
ALIAS_MAP.put(KIND, ALIAS);
StringBuilder kindBuilder = new StringBuilder();
for (int i = 0; i < KIND_COUNT; i++) {
if (i == 0) {
kindBuilder.append(KIND);
} else {
kindBuilder.append("," + KIND);
}
}
String HUNDREDS_KINDS = kindBuilder.toString();
List<String> ALIASES = Collections.nCopies(KIND_COUNT, ALIAS);
StringBuilder aliasBuilder = new StringBuilder();
ALIASES.forEach((alias) -> aliasBuilder.append(alias + ","));
String INDEX_NAME = String.format("%s%s", aliasBuilder, "-.*");
when(dpsHeaders.getPartitionId()).thenReturn(DATA_PARTITION_ID);
when(searchRequest.getKind()).thenReturn(HUNDREDS_KINDS);
when(elasticIndexNameResolver.getIndexNameFromKind(KIND)).thenReturn(INDEX);
when(indexAliasService.getIndicesAliases(KINDS)).thenReturn(ALIAS_MAP);
assertEquals(INDEX_NAME, awsCrossTenantUtils.getIndexName(searchRequest));
}
@Test
public void should_return_alias_when_searchingHundredSameKinds() {
Integer KIND_COUNT = 300;
String DATA_PARTITION_ID = "tenant1";
String KIND = "*:*:*:*";
String TENANT_KIND = "tenant1:*:*:*";
String INDEX = KIND.replace(":", "-");
List<String> KINDS = Collections.nCopies(KIND_COUNT, KIND);
String ALIAS = String.format("a%d", TENANT_KIND.hashCode());
Map<String, String> ALIAS_MAP = new HashMap<>();
ALIAS_MAP.put(KIND, ALIAS);
StringBuilder kindBuilder = new StringBuilder();
for (int i = 0; i < KIND_COUNT; i++) {
if (i == 0) {
kindBuilder.append(KIND);
} else {
kindBuilder.append("," + KIND);
}
}
String HUNDREDS_KINDS = kindBuilder.toString();
List<String> ALIASES = Collections.nCopies(KIND_COUNT, ALIAS);
StringBuilder aliasBuilder = new StringBuilder();
ALIASES.forEach((alias) -> aliasBuilder.append(alias + ","));
String INDEX_NAME = String.format("%s%s", aliasBuilder, "-.*");
when(dpsHeaders.getPartitionId()).thenReturn(DATA_PARTITION_ID);
when(searchRequest.getKind()).thenReturn(HUNDREDS_KINDS);
when(elasticIndexNameResolver.getIndexNameFromKind(KIND)).thenReturn(INDEX);
when(indexAliasService.getIndicesAliases(KINDS)).thenReturn(ALIAS_MAP);
assertEquals(INDEX_NAME, awsCrossTenantUtils.getIndexName(searchRequest));
}
@Test
public void should_return_PartitionIdIndexName_when_searchingAllKinds() {
String DATA_PARTITION_ID = "tenant1";
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment