Skip to content

Commit c2b4093

Browse files
authored
[Connector API] Fix bug with with wrong target index for access control sync (#109097) (#109157)
1 parent 0f93250 commit c2b4093

File tree

6 files changed

+54
-5
lines changed

6 files changed

+54
-5
lines changed

docs/changelog/109097.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
pr: 109097
2+
summary: "[Connector API] Fix bug with with wrong target index for access control\
3+
\ sync"
4+
area: Application
5+
type: bug
6+
issues: []

x-pack/plugin/ent-search/qa/rest/src/yamlRestTest/resources/rest-api-spec/test/entsearch/400_connector_sync_job_post.yml

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,27 @@ setup:
266266
- exists: created_at
267267
- exists: last_seen
268268

269+
---
270+
'Create access control sync job - expect prefixed connector index name':
271+
- do:
272+
connector.sync_job_post:
273+
body:
274+
id: test-connector
275+
job_type: access_control
276+
277+
- set: { id: id }
278+
279+
- match: { id: $id }
280+
281+
- do:
282+
connector.sync_job_get:
283+
connector_sync_job_id: $id
284+
285+
- match: { connector.id: test-connector }
286+
- match: { job_type: access_control }
287+
- match: { connector.index_name: .search-acl-filter-search-test }
288+
289+
269290
---
270291
'Create connector sync job with non-existing connector id':
271292
- do:

x-pack/plugin/ent-search/src/main/java/org/elasticsearch/xpack/application/connector/Connector.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import java.util.Objects;
3535

3636
import static org.elasticsearch.xcontent.ConstructingObjectParser.optionalConstructorArg;
37+
import static org.elasticsearch.xpack.application.connector.ConnectorTemplateRegistry.ACCESS_CONTROL_INDEX_PREFIX;
3738

3839
/**
3940
* Represents a Connector in the Elasticsearch ecosystem. Connectors are used for integrating
@@ -269,6 +270,10 @@ public Connector(StreamInput in) throws IOException {
269270
}
270271
);
271272

273+
public String getAccessControlIndexName() {
274+
return ACCESS_CONTROL_INDEX_PREFIX + this.indexName;
275+
}
276+
272277
static {
273278
PARSER.declareStringOrNull(optionalConstructorArg(), API_KEY_ID_FIELD);
274279
PARSER.declareStringOrNull(optionalConstructorArg(), API_KEY_SECRET_ID_FIELD);

x-pack/plugin/ent-search/src/main/java/org/elasticsearch/xpack/application/connector/ConnectorTemplateRegistry.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ public class ConnectorTemplateRegistry extends IndexTemplateRegistry {
4646
public static final String CONNECTOR_SYNC_JOBS_INDEX_NAME_PATTERN = ".elastic-connectors-sync-jobs-v1";
4747
public static final String CONNECTOR_SYNC_JOBS_TEMPLATE_NAME = "elastic-connectors-sync-jobs";
4848

49+
public static final String ACCESS_CONTROL_INDEX_PREFIX = ".search-acl-filter-";
4950
public static final String ACCESS_CONTROL_INDEX_NAME_PATTERN = ".search-acl-filter-*";
5051
public static final String ACCESS_CONTROL_TEMPLATE_NAME = "search-acl-filter";
5152

x-pack/plugin/ent-search/src/main/java/org/elasticsearch/xpack/application/connector/syncjob/ConnectorSyncJobIndexService.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,9 @@ public void createConnectorSyncJob(
9696
ActionListener<PostConnectorSyncJobAction.Response> listener
9797
) {
9898
String connectorId = request.getId();
99+
ConnectorSyncJobType jobType = Objects.requireNonNullElse(request.getJobType(), ConnectorSyncJob.DEFAULT_JOB_TYPE);
99100
try {
100-
getSyncJobConnectorInfo(connectorId, listener.delegateFailure((l, connector) -> {
101-
101+
getSyncJobConnectorInfo(connectorId, jobType, listener.delegateFailure((l, connector) -> {
102102
if (Strings.isNullOrEmpty(connector.getIndexName())) {
103103
l.onFailure(
104104
new ElasticsearchStatusException(
@@ -113,7 +113,6 @@ public void createConnectorSyncJob(
113113
}
114114

115115
Instant now = Instant.now();
116-
ConnectorSyncJobType jobType = Objects.requireNonNullElse(request.getJobType(), ConnectorSyncJob.DEFAULT_JOB_TYPE);
117116
ConnectorSyncJobTriggerMethod triggerMethod = Objects.requireNonNullElse(
118117
request.getTriggerMethod(),
119118
ConnectorSyncJob.DEFAULT_TRIGGER_METHOD
@@ -482,7 +481,7 @@ private ConnectorSyncStatus getConnectorSyncJobStatusFromSearchResult(ConnectorS
482481
);
483482
}
484483

485-
private void getSyncJobConnectorInfo(String connectorId, ActionListener<Connector> listener) {
484+
private void getSyncJobConnectorInfo(String connectorId, ConnectorSyncJobType jobType, ActionListener<Connector> listener) {
486485
try {
487486

488487
final GetRequest request = new GetRequest(ConnectorIndexService.CONNECTOR_INDEX_NAME, connectorId);
@@ -502,11 +501,15 @@ public void onResponse(GetResponse response) {
502501
connectorId,
503502
XContentType.JSON
504503
);
504+
// Access control syncs write data to a separate index
505+
String targetIndexName = jobType == ConnectorSyncJobType.ACCESS_CONTROL
506+
? connector.getAccessControlIndexName()
507+
: connector.getIndexName();
505508

506509
// Build the connector representation for sync job
507510
final Connector syncJobConnector = new Connector.Builder().setConnectorId(connector.getConnectorId())
508511
.setSyncJobFiltering(transformConnectorFilteringToSyncJobRepresentation(connector.getFiltering()))
509-
.setIndexName(connector.getIndexName())
512+
.setIndexName(targetIndexName)
510513
.setLanguage(connector.getLanguage())
511514
.setPipeline(connector.getPipeline())
512515
.setServiceType(connector.getServiceType())

x-pack/plugin/ent-search/src/test/java/org/elasticsearch/xpack/application/connector/syncjob/ConnectorSyncJobIndexServiceTests.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
import java.util.stream.Collectors;
5757

5858
import static org.elasticsearch.xcontent.XContentFactory.jsonBuilder;
59+
import static org.elasticsearch.xpack.application.connector.ConnectorTemplateRegistry.ACCESS_CONTROL_INDEX_PREFIX;
5960
import static org.elasticsearch.xpack.application.connector.ConnectorTestUtils.registerSimplifiedConnectorIndexTemplates;
6061
import static org.hamcrest.Matchers.containsString;
6162
import static org.hamcrest.Matchers.equalTo;
@@ -129,6 +130,18 @@ public void testCreateConnectorSyncJob() throws Exception {
129130
assertThat(connectorSyncJob.getDeletedDocumentCount(), equalTo(0L));
130131
}
131132

133+
public void testCreateConnectorSyncJob_WithAccessControlJobType_IndexIsPrefixed() throws Exception {
134+
PostConnectorSyncJobAction.Request createAccessControlJobRequest = ConnectorSyncJobTestUtils
135+
.getRandomPostConnectorSyncJobActionRequest(connectorOneId, ConnectorSyncJobType.ACCESS_CONTROL);
136+
137+
PostConnectorSyncJobAction.Response createAccessControlJobResponse = awaitPutConnectorSyncJob(createAccessControlJobRequest);
138+
139+
ConnectorSyncJob connectorSyncJob = awaitGetConnectorSyncJob(createAccessControlJobResponse.getId());
140+
141+
assertThat(connectorSyncJob.getJobType(), equalTo(ConnectorSyncJobType.ACCESS_CONTROL));
142+
assertTrue(connectorSyncJob.getConnector().getIndexName().startsWith(ACCESS_CONTROL_INDEX_PREFIX));
143+
}
144+
132145
public void testCreateConnectorSyncJob_WithMissingJobType_ExpectDefaultJobTypeToBeSet() throws Exception {
133146
PostConnectorSyncJobAction.Request syncJobRequest = new PostConnectorSyncJobAction.Request(
134147
connectorOneId,

0 commit comments

Comments
 (0)