Skip to content

Commit

Permalink
Add Connector Sync Job POST API
Browse files Browse the repository at this point in the history
  • Loading branch information
timgrein committed Nov 28, 2023
1 parent f2a9c15 commit 6a29783
Show file tree
Hide file tree
Showing 24 changed files with 1,805 additions and 11 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
{
"connector_sync_job.post": {
"documentation": {
"url": "https://www.elastic.co/guide/en/enterprise-search/current/connectors.html",
"description": "Creates a connector sync job."
},
"stability": "experimental",
"visibility": "feature_flag",
"feature_flag": "es.connector_api_feature_flag_enabled",
"headers": {
"accept": [
"application/json"
],
"content_type": [
"application/json"
]
},
"url": {
"paths": [
{
"path": "/_connector/_sync_job",
"methods": [
"POST"
]
}
]
},
"body": {
"description": "The connector sync job data.",
"required": true
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,7 @@
import java.security.NoSuchProviderException;
import java.security.Provider;
import java.security.SecureRandom;
import java.time.Instant;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Arrays;
Expand Down Expand Up @@ -1032,6 +1033,16 @@ public static String randomIdentifier() {
return randomAlphaOfLengthBetween(8, 12).toLowerCase(Locale.ROOT);
}

/**
* @return a random instant between a min and a max value with a random nanosecond precision
*/
public static Instant randomInstantBetween(Instant minInstant, Instant maxInstant) {
return Instant.ofEpochSecond(
randomLongBetween(minInstant.getEpochSecond(), maxInstant.getEpochSecond()),
randomLongBetween(0, 999999999)
);
}

public static String randomUUID() {
return UUIDs.randomBase64UUID(random());
}
Expand Down
2 changes: 1 addition & 1 deletion x-pack/plugin/ent-search/qa/rest/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ dependencies {

restResources {
restApi {
include '_common', 'bulk', 'cluster', 'connector', 'nodes', 'indices', 'index', 'query_ruleset', 'search_application', 'xpack', 'security', 'search'
include '_common', 'bulk', 'cluster', 'connector', 'connector_sync_job', 'nodes', 'indices', 'index', 'query_ruleset', 'search_application', 'xpack', 'security', 'search'
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
setup:
- skip:
version: " - 8.11.99"
reason: Introduced in 8.12.0
- do:
connector.put:
connector_id: test-connector
body:
index_name: search-test
name: my-connector
language: de
is_native: false
service_type: super-connector

---
'Create connector sync job':
- do:
connector_sync_job.post:
body:
id: test-connector
job_type: full
trigger_method: on_demand
- set: { id: id }
- match: { id: $id }

---
'Create connector sync job with missing job type':
- skip:
features: warnings
- do:
warnings:
- Missing field 'job_type'. Using default value 'full'.
connector_sync_job.post:
body:
id: test-connector
trigger_method: on_demand
- set: { id: id }
- match: { id: $id }

---
'Create connector sync job with missing trigger method':
- skip:
features: warnings
- do:
warnings:
- Missing field 'trigger_method'. Using default value 'on_demand'.
connector_sync_job.post:
body:
id: test-connector
job_type: full
- set: { id: id }
- match: { id: $id }

---
'Create connector sync job with non-existing connector id':
- do:
connector_sync_job.post:
body:
id: non-existing-id
job_type: full
trigger_method: on_demand
catch: missing
2 changes: 2 additions & 0 deletions x-pack/plugin/ent-search/src/main/java/module-info.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@
exports org.elasticsearch.xpack.application.rules.action;
exports org.elasticsearch.xpack.application.connector;
exports org.elasticsearch.xpack.application.connector.action;
exports org.elasticsearch.xpack.application.connector.syncjob;
exports org.elasticsearch.xpack.application.connector.syncjob.action;

provides org.elasticsearch.features.FeatureSpecification with org.elasticsearch.xpack.application.EnterpriseSearchFeatures;
}
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,9 @@
import org.elasticsearch.xpack.application.connector.action.PutConnectorAction;
import org.elasticsearch.xpack.application.connector.action.RestPutConnectorAction;
import org.elasticsearch.xpack.application.connector.action.TransportPutConnectorAction;
import org.elasticsearch.xpack.application.connector.syncjob.action.PostConnectorSyncJobAction;
import org.elasticsearch.xpack.application.connector.syncjob.action.RestPostConnectorSyncJobAction;
import org.elasticsearch.xpack.application.connector.syncjob.action.TransportPostConnectorSyncJobAction;
import org.elasticsearch.xpack.application.rules.QueryRulesConfig;
import org.elasticsearch.xpack.application.rules.QueryRulesIndexService;
import org.elasticsearch.xpack.application.rules.RuleQueryBuilder;
Expand Down Expand Up @@ -105,6 +108,8 @@ public class EnterpriseSearch extends Plugin implements ActionPlugin, SystemInde

public static final String CONNECTOR_API_ENDPOINT = "_connector";

public static final String CONNECTOR_SYNC_JOB_API_ENDPOINT = CONNECTOR_API_ENDPOINT + "/_sync_job";

private static final Logger logger = LogManager.getLogger(EnterpriseSearch.class);

public static final String FEATURE_NAME = "ent_search";
Expand Down Expand Up @@ -157,6 +162,7 @@ protected XPackLicenseState getLicenseState() {
// Connectors
if (ConnectorAPIFeature.isEnabled()) {
actionHandlers.add(new ActionHandler<>(PutConnectorAction.INSTANCE, TransportPutConnectorAction.class));
actionHandlers.add(new ActionHandler<>(PostConnectorSyncJobAction.INSTANCE, TransportPostConnectorSyncJobAction.class));
}

return Collections.unmodifiableList(actionHandlers);
Expand Down Expand Up @@ -204,6 +210,7 @@ public List<RestHandler> getRestHandlers(
// Connectors
if (ConnectorAPIFeature.isEnabled()) {
restHandlers.add(new RestPutConnectorAction());
restHandlers.add(new RestPostConnectorSyncJobAction());
}

return Collections.unmodifiableList(restHandlers);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@

package org.elasticsearch.xpack.application.connector;

import org.elasticsearch.common.io.stream.NamedWriteable;
import org.elasticsearch.common.io.stream.StreamInput;
import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.common.io.stream.Writeable;
import org.elasticsearch.core.Nullable;
import org.elasticsearch.xcontent.ParseField;
import org.elasticsearch.xcontent.ToXContentObject;
Expand All @@ -18,6 +18,7 @@
import java.io.IOException;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;

Expand Down Expand Up @@ -47,7 +48,9 @@
* <li>A boolean flag 'syncNow', which, when set, triggers an immediate synchronization operation.</li>
* </ul>
*/
public class Connector implements Writeable, ToXContentObject {
public class Connector implements NamedWriteable, ToXContentObject {

public static final String NAME = Connector.class.getName().toUpperCase(Locale.ROOT);

private final String connectorId;
@Nullable
Expand Down Expand Up @@ -172,22 +175,22 @@ public Connector(StreamInput in) throws IOException {
this.syncNow = in.readBoolean();
}

private static final ParseField ID_FIELD = new ParseField("connector_id");
public static final ParseField ID_FIELD = new ParseField("connector_id");
private static final ParseField API_KEY_ID_FIELD = new ParseField("api_key_id");
private static final ParseField CONFIGURATION_FIELD = new ParseField("configuration");
public static final ParseField CONFIGURATION_FIELD = new ParseField("configuration");
private static final ParseField CUSTOM_SCHEDULING_FIELD = new ParseField("custom_scheduling");
private static final ParseField DESCRIPTION_FIELD = new ParseField("description");
private static final ParseField ERROR_FIELD = new ParseField("error");
private static final ParseField FEATURES_FIELD = new ParseField("features");
private static final ParseField FILTERING_FIELD = new ParseField("filtering");
private static final ParseField INDEX_NAME_FIELD = new ParseField("index_name");
public static final ParseField FILTERING_FIELD = new ParseField("filtering");
public static final ParseField INDEX_NAME_FIELD = new ParseField("index_name");
private static final ParseField IS_NATIVE_FIELD = new ParseField("is_native");
private static final ParseField LANGUAGE_FIELD = new ParseField("language");
public static final ParseField LANGUAGE_FIELD = new ParseField("language");

private static final ParseField NAME_FIELD = new ParseField("name");
private static final ParseField PIPELINE_FIELD = new ParseField("pipeline");
public static final ParseField PIPELINE_FIELD = new ParseField("pipeline");
private static final ParseField SCHEDULING_FIELD = new ParseField("scheduling");
private static final ParseField SERVICE_TYPE_FIELD = new ParseField("service_type");
public static final ParseField SERVICE_TYPE_FIELD = new ParseField("service_type");
private static final ParseField STATUS_FIELD = new ParseField("status");
private static final ParseField SYNC_CURSOR_FIELD = new ParseField("sync_cursor");
private static final ParseField SYNC_NOW_FIELD = new ParseField("sync_now");
Expand Down Expand Up @@ -278,6 +281,30 @@ public String getConnectorId() {
return connectorId;
}

public List<ConnectorFiltering> getFiltering() {
return filtering;
}

public String getIndexName() {
return indexName;
}

public String getLanguage() {
return language;
}

public ConnectorIngestPipeline getPipeline() {
return pipeline;
}

public String getServiceType() {
return serviceType;
}

public Map<String, Object> getConfiguration() {
return configuration;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
Expand Down Expand Up @@ -329,6 +356,11 @@ public int hashCode() {
);
}

@Override
public String getWriteableName() {
return NAME;
}

public static class Builder {

private String connectorId;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,16 @@ public enum ConnectorSyncStatus {
PENDING,
SUSPENDED;

public static ConnectorSyncStatus fromString(String syncStatusString) {
for (ConnectorSyncStatus syncStatus : ConnectorSyncStatus.values()) {
if (syncStatus.toString().equalsIgnoreCase(syncStatusString)) {
return syncStatus;
}
}

return null;
}

@Override
public String toString() {
return name().toLowerCase(Locale.ROOT);
Expand Down

0 comments on commit 6a29783

Please sign in to comment.