Skip to content

Commit 4aea5fc

Browse files
authored
[Connectors API] Fix bug when creating a sync job via API (#104802) (#104824)
(cherry picked from commit a107107)
1 parent c3ec0f9 commit 4aea5fc

File tree

10 files changed

+438
-379
lines changed

10 files changed

+438
-379
lines changed

docs/changelog/104802.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
pr: 104802
2+
summary: "[Connectors API] Fix bug when triggering a sync job via API"
3+
area: Application
4+
type: bug
5+
issues: []

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

Lines changed: 101 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ setup:
2727
connector_sync_job.get:
2828
connector_sync_job_id: $id
2929

30-
- match: { connector.id: test-connector}
30+
- match: { connector.id: test-connector }
3131
- match: { job_type: full }
3232
- match: { trigger_method: on_demand }
3333
- match: { status: pending }
@@ -39,6 +39,106 @@ setup:
3939
- exists: created_at
4040
- exists: last_seen
4141

42+
---
43+
'Create connector sync job with filtering':
44+
- do:
45+
connector.update_filtering:
46+
connector_id: test-connector
47+
body:
48+
filtering:
49+
- active:
50+
advanced_snippet:
51+
created_at: "2023-05-25T12:30:00.000Z"
52+
updated_at: "2023-05-25T12:30:00.000Z"
53+
value: { }
54+
rules:
55+
- created_at: "2023-05-25T12:30:00.000Z"
56+
field: _
57+
id: RULE-ACTIVE-SYNC-JOB-TEST
58+
order: 0
59+
policy: include
60+
rule: regex
61+
updated_at: "2023-05-25T12:30:00.000Z"
62+
value: ".*"
63+
validation:
64+
errors: [ ]
65+
state: valid
66+
domain: DEFAULT
67+
draft:
68+
advanced_snippet:
69+
created_at: "2023-05-25T12:30:00.000Z"
70+
updated_at: "2023-05-25T12:30:00.000Z"
71+
value: { }
72+
rules:
73+
- created_at: "2023-05-25T12:30:00.000Z"
74+
field: _
75+
id: RULE-DRAFT-0
76+
order: 0
77+
policy: include
78+
rule: regex
79+
updated_at: "2023-05-25T12:30:00.000Z"
80+
value: ".*"
81+
validation:
82+
errors: [ ]
83+
state: valid
84+
- active:
85+
advanced_snippet:
86+
created_at: "2021-05-25T12:30:00.000Z"
87+
updated_at: "2021-05-25T12:30:00.000Z"
88+
value: { }
89+
rules:
90+
- created_at: "2021-05-25T12:30:00.000Z"
91+
field: _
92+
id: RULE-ACTIVE-1
93+
order: 0
94+
policy: include
95+
rule: regex
96+
updated_at: "2021-05-25T12:30:00.000Z"
97+
value: ".*"
98+
validation:
99+
errors: [ ]
100+
state: valid
101+
domain: TEST
102+
draft:
103+
advanced_snippet:
104+
created_at: "2021-05-25T12:30:00.000Z"
105+
updated_at: "2021-05-25T12:30:00.000Z"
106+
value: { }
107+
rules:
108+
- created_at: "2021-05-25T12:30:00.000Z"
109+
field: _
110+
id: RULE-DRAFT-1
111+
order: 0
112+
policy: exclude
113+
rule: regex
114+
updated_at: "2021-05-25T12:30:00.000Z"
115+
value: ".*"
116+
validation:
117+
errors: [ ]
118+
state: valid
119+
120+
- match: { result: updated }
121+
122+
- do:
123+
connector_sync_job.post:
124+
body:
125+
id: test-connector
126+
job_type: full
127+
trigger_method: on_demand
128+
129+
- set: { id: id }
130+
131+
- match: { id: $id }
132+
133+
- do:
134+
connector_sync_job.get:
135+
connector_sync_job_id: $id
136+
137+
- match: { connector.filtering.rules.0.id: RULE-ACTIVE-SYNC-JOB-TEST }
138+
- match: { connector.filtering.rules.0.rule: regex }
139+
- match: { connector.filtering.validation.state: valid }
140+
- match: { connector.filtering.advanced_snippet.created_at: "2023-05-25T12:30:00.000Z" }
141+
42142
---
43143
'Create connector sync job with complex connector document':
44144

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

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.elasticsearch.xcontent.XContentParser;
2323
import org.elasticsearch.xcontent.XContentParserConfiguration;
2424
import org.elasticsearch.xcontent.XContentType;
25+
import org.elasticsearch.xpack.application.connector.filtering.FilteringRules;
2526

2627
import java.io.IOException;
2728
import java.time.Instant;
@@ -47,6 +48,7 @@
4748
* <li>An error string capturing the latest error encountered during the connector's operation, if any.</li>
4849
* <li>A {@link ConnectorFeatures} object encapsulating the set of features enabled for this connector.</li>
4950
* <li>A list of {@link ConnectorFiltering} objects for applying filtering rules to the data processed by the connector.</li>
51+
* <li>An optional {@link FilteringRules} object that represents active filtering rules applied to a sync job.</li>
5052
* <li>The name of the Elasticsearch index where the synchronized data is stored or managed.</li>
5153
* <li>A boolean flag 'isNative' indicating whether the connector is a native Elasticsearch connector.</li>
5254
* <li>The language associated with the connector.</li>
@@ -79,6 +81,8 @@ public class Connector implements NamedWriteable, ToXContentObject {
7981
private final ConnectorFeatures features;
8082
private final List<ConnectorFiltering> filtering;
8183
@Nullable
84+
private final FilteringRules syncJobFiltering;
85+
@Nullable
8286
private final String indexName;
8387
private final boolean isNative;
8488
@Nullable
@@ -110,6 +114,7 @@ public class Connector implements NamedWriteable, ToXContentObject {
110114
* @param error Information about the last error encountered by the connector, if any.
111115
* @param features Features enabled for the connector.
112116
* @param filtering Filtering settings applied by the connector.
117+
* @param syncJobFiltering Filtering settings used by a sync job, it contains subset of data from 'filtering'.
113118
* @param indexName Name of the index associated with the connector.
114119
* @param isNative Flag indicating whether the connector is a native type.
115120
* @param language The language supported by the connector.
@@ -132,6 +137,7 @@ private Connector(
132137
String error,
133138
ConnectorFeatures features,
134139
List<ConnectorFiltering> filtering,
140+
FilteringRules syncJobFiltering,
135141
String indexName,
136142
boolean isNative,
137143
String language,
@@ -152,7 +158,8 @@ private Connector(
152158
this.description = description;
153159
this.error = error;
154160
this.features = features;
155-
this.filtering = Objects.requireNonNull(filtering, "[filtering] cannot be null");
161+
this.filtering = filtering;
162+
this.syncJobFiltering = syncJobFiltering;
156163
this.indexName = indexName;
157164
this.isNative = isNative;
158165
this.language = language;
@@ -176,6 +183,7 @@ public Connector(StreamInput in) throws IOException {
176183
this.error = in.readOptionalString();
177184
this.features = in.readOptionalWriteable(ConnectorFeatures::new);
178185
this.filtering = in.readOptionalCollectionAsList(ConnectorFiltering::new);
186+
this.syncJobFiltering = in.readOptionalWriteable(FilteringRules::new);
179187
this.indexName = in.readOptionalString();
180188
this.isNative = in.readBoolean();
181189
this.language = in.readOptionalString();
@@ -388,6 +396,7 @@ public void writeTo(StreamOutput out) throws IOException {
388396
out.writeOptionalString(error);
389397
out.writeOptionalWriteable(features);
390398
out.writeOptionalCollection(filtering);
399+
out.writeOptionalWriteable(syncJobFiltering);
391400
out.writeOptionalString(indexName);
392401
out.writeBoolean(isNative);
393402
out.writeOptionalString(language);
@@ -434,6 +443,10 @@ public List<ConnectorFiltering> getFiltering() {
434443
return filtering;
435444
}
436445

446+
public FilteringRules getSyncJobFiltering() {
447+
return syncJobFiltering;
448+
}
449+
437450
public String getIndexName() {
438451
return indexName;
439452
}
@@ -497,6 +510,7 @@ public boolean equals(Object o) {
497510
&& Objects.equals(error, connector.error)
498511
&& Objects.equals(features, connector.features)
499512
&& Objects.equals(filtering, connector.filtering)
513+
&& Objects.equals(syncJobFiltering, connector.syncJobFiltering)
500514
&& Objects.equals(indexName, connector.indexName)
501515
&& Objects.equals(language, connector.language)
502516
&& Objects.equals(lastSeen, connector.lastSeen)
@@ -520,6 +534,7 @@ public int hashCode() {
520534
error,
521535
features,
522536
filtering,
537+
syncJobFiltering,
523538
indexName,
524539
isNative,
525540
language,
@@ -550,6 +565,7 @@ public static class Builder {
550565
private String error;
551566
private ConnectorFeatures features;
552567
private List<ConnectorFiltering> filtering = List.of(ConnectorFiltering.getDefaultConnectorFilteringConfig());
568+
private FilteringRules syncJobFiltering;
553569
private String indexName;
554570
private boolean isNative = false;
555571
private String language;
@@ -603,6 +619,11 @@ public Builder setFiltering(List<ConnectorFiltering> filtering) {
603619
return this;
604620
}
605621

622+
public Builder setSyncJobFiltering(FilteringRules syncJobFiltering) {
623+
this.syncJobFiltering = syncJobFiltering;
624+
return this;
625+
}
626+
606627
public Builder setIndexName(String indexName) {
607628
this.indexName = indexName;
608629
return this;
@@ -676,6 +697,7 @@ public Connector build() {
676697
error,
677698
features,
678699
filtering,
700+
syncJobFiltering,
679701
indexName,
680702
isNative,
681703
language,

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,18 @@ public ConnectorFiltering(StreamInput in) throws IOException {
6666
this.draft = new FilteringRules(in);
6767
}
6868

69+
public FilteringRules getActive() {
70+
return active;
71+
}
72+
73+
public String getDomain() {
74+
return domain;
75+
}
76+
77+
public FilteringRules getDraft() {
78+
return draft;
79+
}
80+
6981
private static final ParseField ACTIVE_FIELD = new ParseField("active");
7082
private static final ParseField DOMAIN_FIELD = new ParseField("domain");
7183
private static final ParseField DRAFT_FIELD = new ParseField("draft");

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,18 @@ public FilteringRules(StreamInput in) throws IOException {
5757
this.filteringValidationInfo = new FilteringValidationInfo(in);
5858
}
5959

60+
public FilteringAdvancedSnippet getAdvancedSnippet() {
61+
return advancedSnippet;
62+
}
63+
64+
public List<FilteringRule> getRules() {
65+
return rules;
66+
}
67+
68+
public FilteringValidationInfo getFilteringValidationInfo() {
69+
return filteringValidationInfo;
70+
}
71+
6072
private static final ParseField ADVANCED_SNIPPET_FIELD = new ParseField("advanced_snippet");
6173
private static final ParseField RULES_FIELD = new ParseField("rules");
6274
private static final ParseField VALIDATION_FIELD = new ParseField("validation");

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

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,14 @@
2525
import org.elasticsearch.xcontent.XContentType;
2626
import org.elasticsearch.xpack.application.connector.Connector;
2727
import org.elasticsearch.xpack.application.connector.ConnectorConfiguration;
28-
import org.elasticsearch.xpack.application.connector.ConnectorFiltering;
2928
import org.elasticsearch.xpack.application.connector.ConnectorIngestPipeline;
3029
import org.elasticsearch.xpack.application.connector.ConnectorSyncStatus;
30+
import org.elasticsearch.xpack.application.connector.filtering.FilteringRules;
3131

3232
import java.io.IOException;
3333
import java.time.Instant;
3434
import java.util.Collections;
3535
import java.util.HashMap;
36-
import java.util.List;
3736
import java.util.Map;
3837
import java.util.Objects;
3938

@@ -343,21 +342,23 @@ private static Instant parseNullableInstant(XContentParser p) throws IOException
343342
String syncJobConnectorId = Strings.isNullOrEmpty(connectorId) ? parsedConnectorId : connectorId;
344343

345344
return new Connector.Builder().setConnectorId(syncJobConnectorId)
346-
.setFiltering((List<ConnectorFiltering>) args[i++])
345+
.setFiltering(null)
346+
.setSyncJobFiltering((FilteringRules) args[i++])
347347
.setIndexName((String) args[i++])
348348
.setLanguage((String) args[i++])
349349
.setPipeline((ConnectorIngestPipeline) args[i++])
350350
.setServiceType((String) args[i++])
351-
.setConfiguration((Map<String, ConnectorConfiguration>) args[i++])
351+
.setConfiguration((Map<String, ConnectorConfiguration>) args[i])
352352
.build();
353353
}
354354
);
355355

356356
static {
357357
SYNC_JOB_CONNECTOR_PARSER.declareString(optionalConstructorArg(), Connector.ID_FIELD);
358-
SYNC_JOB_CONNECTOR_PARSER.declareObjectArray(
358+
SYNC_JOB_CONNECTOR_PARSER.declareObjectOrNull(
359359
optionalConstructorArg(),
360-
(p, c) -> ConnectorFiltering.fromXContent(p),
360+
(p, c) -> FilteringRules.fromXContent(p),
361+
null,
361362
Connector.FILTERING_FIELD
362363
);
363364
SYNC_JOB_CONNECTOR_PARSER.declareStringOrNull(optionalConstructorArg(), Connector.INDEX_NAME_FIELD);
@@ -491,8 +492,8 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
491492
if (connector.getConnectorId() != null) {
492493
builder.field(Connector.ID_FIELD.getPreferredName(), connector.getConnectorId());
493494
}
494-
if (connector.getFiltering() != null) {
495-
builder.field(Connector.FILTERING_FIELD.getPreferredName(), connector.getFiltering());
495+
if (connector.getSyncJobFiltering() != null) {
496+
builder.field(Connector.FILTERING_FIELD.getPreferredName(), connector.getSyncJobFiltering());
496497
}
497498
if (connector.getIndexName() != null) {
498499
builder.field(Connector.INDEX_NAME_FIELD.getPreferredName(), connector.getIndexName());

0 commit comments

Comments
 (0)