Browse Source

[Connector API] Add job type filtering support for List connector sync jobs API (#104855)

Chenhui Wang 1 year ago
parent
commit
fa97f08df1

+ 10 - 0
docs/reference/connector/apis/list-connector-sync-jobs-api.asciidoc

@@ -35,6 +35,9 @@ Returns information about all stored connector sync jobs ordered by their creati
 `connector_id`::
 (Optional, string) The connector id the fetched sync jobs need to have.
 
+`job_type`::
+(Optional, job type) A comma-separated list of job types.
+
 [[list-connector-sync-jobs-api-example]]
 ==== {api-examples-title}
 
@@ -69,6 +72,13 @@ GET _connector/_sync_job?connector_id=connector-1
 ----
 // TEST[skip:there's no way to clean up after this code snippet, as we don't know the ids of sync jobs ahead of time]
 
+The following example lists connector sync jobs (the first 100 per default) for the connector with job type `full` or `incremental`:
+[source,console]
+----
+GET _connector/_sync_job?job_type=full,incremental
+----
+// TEST[skip:there's no way to clean up after this code snippet, as we don't know the ids of sync jobs ahead of time]
+
 [[list-connector-sync-jobs-api-response-codes]]
 ==== {api-response-codes-title}
 

+ 4 - 0
rest-api-spec/src/main/resources/rest-api-spec/api/connector_sync_job.list.json

@@ -39,6 +39,10 @@
       "connector_id": {
         "type": "string",
         "description": "Id of the connector to fetch the sync jobs for"
+      },
+      "job_type": {
+        "type": "list",
+        "description": "A comma-separated list of job types"
       }
     }
   }

+ 60 - 0
x-pack/plugin/ent-search/qa/rest/src/yamlRestTest/resources/rest-api-spec/test/entsearch/470_connector_sync_job_list.yml

@@ -166,6 +166,66 @@ setup:
   - match: { count: 1 }
   - match: { results.0.id: $sync-job-one-id }
 
+---
+"List Connector Sync Jobs - with invalid job status":
+  - do:
+      catch: bad_request
+      connector_sync_job.list:
+        status: invalid_job_status
+
+---
+"List Connector Sync Jobs - Get jobs with single job type":
+  - do:
+      connector_sync_job.post:
+        body:
+          id: connector-one
+          job_type: full
+          trigger_method: scheduled
+  - set: { id: sync-job-one-id }
+  - do:
+      connector_sync_job.post:
+        body:
+          id: connector-one
+          job_type: incremental
+          trigger_method: scheduled
+  - set: { id: sync-job-two-id }
+  - do:
+      connector_sync_job.list:
+        connector_id: connector-one
+        job_type: full
+  - match: { count: 1 }
+  - match: { results.0.id: $sync-job-one-id }
+
+---
+"List Connector Sync Jobs - Get jobs with multiple job types":
+  - do:
+      connector_sync_job.post:
+        body:
+          id: connector-one
+          job_type: full
+          trigger_method: scheduled
+  - set: { id: sync-job-one-id }
+  - do:
+      connector_sync_job.post:
+        body:
+          id: connector-one
+          job_type: incremental
+          trigger_method: scheduled
+  - set: { id: sync-job-two-id }
+  - do:
+      connector_sync_job.list:
+        connector_id: connector-one
+        job_type: full,incremental
+  - match: { count: 2 }
+  - match: { results.0.id: $sync-job-one-id }
+  - match: { results.1.id: $sync-job-two-id }
+
+---
+"List Connector Sync Jobs - with invalid job type":
+  - do:
+      catch: bad_request
+      connector_sync_job.list:
+        job_type: invalid_job_type,incremental
 
 ---
 "List Connector Sync Jobs - empty list":

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

@@ -32,6 +32,7 @@ import org.elasticsearch.index.query.BoolQueryBuilder;
 import org.elasticsearch.index.query.MatchAllQueryBuilder;
 import org.elasticsearch.index.query.QueryBuilder;
 import org.elasticsearch.index.query.TermQueryBuilder;
+import org.elasticsearch.index.query.TermsQueryBuilder;
 import org.elasticsearch.search.SearchHit;
 import org.elasticsearch.search.builder.SearchSourceBuilder;
 import org.elasticsearch.search.sort.SortOrder;
@@ -261,21 +262,23 @@ public class ConnectorSyncJobIndexService {
     /**
      * List the {@link ConnectorSyncJob} in ascending order of their 'created_at'.
      *
-     * @param from          From index to start the search from.
-     * @param size          The maximum number of {@link Connector}s to return.
-     * @param connectorId   The id of a {@link Connector} to return sync jobs from.
-     * @param syncStatus    The status to filter the sync jobs on.
-     * @param listener      The action listener to invoke on response/failure.
+     * @param from                  From index to start the search from.
+     * @param size                  The maximum number of {@link Connector}s to return.
+     * @param connectorId           The id of a {@link Connector} to return sync jobs from.
+     * @param syncStatus            The status to filter the sync jobs on.
+     * @param jobTypeList           The list of job types to filter the sync jobs on.
+     * @param listener              The action listener to invoke on response/failure.
      */
     public void listConnectorSyncJobs(
         int from,
         int size,
         String connectorId,
         ConnectorSyncStatus syncStatus,
+        List<ConnectorSyncJobType> jobTypeList,
         ActionListener<ConnectorSyncJobIndexService.ConnectorSyncJobsResult> listener
     ) {
         try {
-            QueryBuilder query = buildListQuery(connectorId, syncStatus);
+            QueryBuilder query = buildListQuery(connectorId, syncStatus, jobTypeList);
 
             final SearchSourceBuilder searchSource = new SearchSourceBuilder().from(from)
                 .size(size)
@@ -309,8 +312,8 @@ public class ConnectorSyncJobIndexService {
         }
     }
 
-    private static QueryBuilder buildListQuery(String connectorId, ConnectorSyncStatus syncStatus) {
-        boolean usesFilter = Stream.of(connectorId, syncStatus).anyMatch(Objects::nonNull);
+    private static QueryBuilder buildListQuery(String connectorId, ConnectorSyncStatus syncStatus, List<ConnectorSyncJobType> jobTypeList) {
+        boolean usesFilter = Stream.of(connectorId, syncStatus, jobTypeList).anyMatch(Objects::nonNull);
         BoolQueryBuilder boolFilterQueryBuilder = new BoolQueryBuilder();
 
         if (usesFilter) {
@@ -326,6 +329,14 @@ public class ConnectorSyncJobIndexService {
                 TermQueryBuilder syncStatusQuery = new TermQueryBuilder(ConnectorSyncJob.STATUS_FIELD.getPreferredName(), syncStatus);
                 boolFilterQueryBuilder.must().add(syncStatusQuery);
             }
+
+            if ((jobTypeList == null || jobTypeList.isEmpty()) == false) {
+                TermsQueryBuilder syncJobTypeQuery = new TermsQueryBuilder(
+                    ConnectorSyncJob.JOB_TYPE_FIELD.getPreferredName(),
+                    jobTypeList.stream().map(ConnectorSyncJobType::toString).toList()
+                );
+                boolFilterQueryBuilder.must().add(syncJobTypeQuery);
+            }
         }
 
         return usesFilter ? boolFilterQueryBuilder : new MatchAllQueryBuilder();

+ 39 - 4
x-pack/plugin/ent-search/src/main/java/org/elasticsearch/xpack/application/connector/syncjob/action/ListConnectorSyncJobsAction.java

@@ -21,6 +21,7 @@ import org.elasticsearch.xcontent.XContentParser;
 import org.elasticsearch.xpack.application.connector.ConnectorSyncStatus;
 import org.elasticsearch.xpack.application.connector.syncjob.ConnectorSyncJob;
 import org.elasticsearch.xpack.application.connector.syncjob.ConnectorSyncJobSearchResult;
+import org.elasticsearch.xpack.application.connector.syncjob.ConnectorSyncJobType;
 import org.elasticsearch.xpack.core.action.util.PageParams;
 import org.elasticsearch.xpack.core.action.util.QueryPage;
 
@@ -44,18 +45,26 @@ public class ListConnectorSyncJobsAction {
         private final PageParams pageParams;
         private final String connectorId;
         private final ConnectorSyncStatus connectorSyncStatus;
+        private final List<ConnectorSyncJobType> connectorSyncJobTypeList;
 
         public Request(StreamInput in) throws IOException {
             super(in);
             this.pageParams = new PageParams(in);
             this.connectorId = in.readOptionalString();
             this.connectorSyncStatus = in.readOptionalEnum(ConnectorSyncStatus.class);
+            this.connectorSyncJobTypeList = stringToEnumList(in.readOptionalStringCollectionAsList());
         }
 
-        public Request(PageParams pageParams, String connectorId, ConnectorSyncStatus connectorSyncStatus) {
+        public Request(
+            PageParams pageParams,
+            String connectorId,
+            ConnectorSyncStatus connectorSyncStatus,
+            List<ConnectorSyncJobType> connectorSyncJobTypeList
+        ) {
             this.pageParams = pageParams;
             this.connectorId = connectorId;
             this.connectorSyncStatus = connectorSyncStatus;
+            this.connectorSyncJobTypeList = connectorSyncJobTypeList;
         }
 
         public PageParams getPageParams() {
@@ -70,6 +79,10 @@ public class ListConnectorSyncJobsAction {
             return connectorSyncStatus;
         }
 
+        public List<ConnectorSyncJobType> getConnectorSyncJobTypeList() {
+            return connectorSyncJobTypeList;
+        }
+
         @Override
         public ActionRequestValidationException validate() {
             // Pagination validation is done as part of PageParams constructor
@@ -82,6 +95,7 @@ public class ListConnectorSyncJobsAction {
             pageParams.writeTo(out);
             out.writeOptionalString(connectorId);
             out.writeOptionalEnum(connectorSyncStatus);
+            out.writeOptionalStringCollection(enumToStringList(connectorSyncJobTypeList));
         }
 
         @Override
@@ -91,20 +105,25 @@ public class ListConnectorSyncJobsAction {
             Request request = (Request) o;
             return Objects.equals(pageParams, request.pageParams)
                 && Objects.equals(connectorId, request.connectorId)
-                && connectorSyncStatus == request.connectorSyncStatus;
+                && connectorSyncStatus == request.connectorSyncStatus
+                && connectorSyncJobTypeList == null
+                    ? request.connectorSyncJobTypeList == null
+                    : connectorSyncJobTypeList.equals(request.connectorSyncJobTypeList);
         }
 
         @Override
         public int hashCode() {
-            return Objects.hash(pageParams, connectorId, connectorSyncStatus);
+            return Objects.hash(pageParams, connectorId, connectorSyncStatus, connectorSyncJobTypeList);
         }
 
+        @SuppressWarnings("unchecked")
         private static final ConstructingObjectParser<ListConnectorSyncJobsAction.Request, String> PARSER = new ConstructingObjectParser<>(
             "list_connector_sync_jobs_request",
             p -> new ListConnectorSyncJobsAction.Request(
                 (PageParams) p[0],
                 (String) p[1],
-                p[2] != null ? ConnectorSyncStatus.fromString((String) p[2]) : null
+                p[2] != null ? ConnectorSyncStatus.fromString((String) p[2]) : null,
+                p[3] != null ? ((List<String>) p[3]).stream().map(ConnectorSyncJobType::fromString).toList() : null
             )
         );
 
@@ -112,6 +131,7 @@ public class ListConnectorSyncJobsAction {
             PARSER.declareObject(constructorArg(), (p, c) -> PageParams.fromXContent(p), PAGE_PARAMS_FIELD);
             PARSER.declareString(optionalConstructorArg(), CONNECTOR_ID_FIELD);
             PARSER.declareString(optionalConstructorArg(), ConnectorSyncJob.STATUS_FIELD);
+            PARSER.declareStringArray(optionalConstructorArg(), ConnectorSyncJob.JOB_TYPE_FIELD);
         }
 
         public static ListConnectorSyncJobsAction.Request parse(XContentParser parser) {
@@ -125,10 +145,25 @@ public class ListConnectorSyncJobsAction {
                 builder.field(PAGE_PARAMS_FIELD.getPreferredName(), pageParams);
                 builder.field(CONNECTOR_ID_FIELD.getPreferredName(), connectorId);
                 builder.field(ConnectorSyncJob.STATUS_FIELD.getPreferredName(), connectorSyncStatus);
+                builder.field(ConnectorSyncJob.JOB_TYPE_FIELD.getPreferredName(), connectorSyncJobTypeList);
             }
             builder.endObject();
             return builder;
         }
+
+        private List<ConnectorSyncJobType> stringToEnumList(List<String> jobTypeList) {
+            if (jobTypeList == null) {
+                return null;
+            }
+            return jobTypeList.stream().map(ConnectorSyncJobType::fromString).toList();
+        }
+
+        private List<String> enumToStringList(List<ConnectorSyncJobType> jobTypeList) {
+            if (jobTypeList == null) {
+                return null;
+            }
+            return jobTypeList.stream().map(ConnectorSyncJobType::name).toList();
+        }
     }
 
     public static class Response extends ActionResponse implements ToXContentObject {

+ 8 - 1
x-pack/plugin/ent-search/src/main/java/org/elasticsearch/xpack/application/connector/syncjob/action/RestListConnectorSyncJobsAction.java

@@ -16,9 +16,11 @@ import org.elasticsearch.rest.action.RestToXContentListener;
 import org.elasticsearch.xpack.application.EnterpriseSearch;
 import org.elasticsearch.xpack.application.connector.ConnectorSyncStatus;
 import org.elasticsearch.xpack.application.connector.syncjob.ConnectorSyncJob;
+import org.elasticsearch.xpack.application.connector.syncjob.ConnectorSyncJobType;
 import org.elasticsearch.xpack.core.action.util.PageParams;
 
 import java.io.IOException;
+import java.util.Arrays;
 import java.util.List;
 
 @ServerlessScope(Scope.PUBLIC)
@@ -40,11 +42,16 @@ public class RestListConnectorSyncJobsAction extends BaseRestHandler {
         String connectorId = restRequest.param(ListConnectorSyncJobsAction.Request.CONNECTOR_ID_FIELD.getPreferredName());
         String statusString = restRequest.param(ConnectorSyncJob.STATUS_FIELD.getPreferredName());
         ConnectorSyncStatus status = statusString != null ? ConnectorSyncStatus.fromString(statusString) : null;
+        String[] jobTypeStringArray = restRequest.paramAsStringArray(ConnectorSyncJob.JOB_TYPE_FIELD.getPreferredName(), null);
+        List<ConnectorSyncJobType> jobTypeList = jobTypeStringArray != null
+            ? Arrays.stream(jobTypeStringArray).map(ConnectorSyncJobType::fromString).toList()
+            : null;
 
         ListConnectorSyncJobsAction.Request request = new ListConnectorSyncJobsAction.Request(
             new PageParams(from, size),
             connectorId,
-            status
+            status,
+            jobTypeList
         );
 
         return channel -> client.execute(ListConnectorSyncJobsAction.INSTANCE, request, new RestToXContentListener<>(channel));

+ 5 - 0
x-pack/plugin/ent-search/src/main/java/org/elasticsearch/xpack/application/connector/syncjob/action/TransportListConnectorSyncJobsAction.java

@@ -18,8 +18,11 @@ import org.elasticsearch.tasks.Task;
 import org.elasticsearch.transport.TransportService;
 import org.elasticsearch.xpack.application.connector.ConnectorSyncStatus;
 import org.elasticsearch.xpack.application.connector.syncjob.ConnectorSyncJobIndexService;
+import org.elasticsearch.xpack.application.connector.syncjob.ConnectorSyncJobType;
 import org.elasticsearch.xpack.core.action.util.PageParams;
 
+import java.util.List;
+
 public class TransportListConnectorSyncJobsAction extends HandledTransportAction<
     ListConnectorSyncJobsAction.Request,
     ListConnectorSyncJobsAction.Response> {
@@ -51,12 +54,14 @@ public class TransportListConnectorSyncJobsAction extends HandledTransportAction
         final PageParams pageParams = request.getPageParams();
         final String connectorId = request.getConnectorId();
         final ConnectorSyncStatus syncStatus = request.getConnectorSyncStatus();
+        final List<ConnectorSyncJobType> jobTypeList = request.getConnectorSyncJobTypeList();
 
         connectorSyncJobIndexService.listConnectorSyncJobs(
             pageParams.getFrom(),
             pageParams.getSize(),
             connectorId,
             syncStatus,
+            jobTypeList,
             listener.map(r -> new ListConnectorSyncJobsAction.Response(r.connectorSyncJobs(), r.totalResults()))
         );
     }

+ 6 - 0
x-pack/plugin/ent-search/src/test/java/org/elasticsearch/xpack/application/connector/ConnectorTestUtils.java

@@ -25,6 +25,7 @@ import org.elasticsearch.xpack.application.connector.filtering.FilteringRuleCond
 import org.elasticsearch.xpack.application.connector.filtering.FilteringRules;
 import org.elasticsearch.xpack.application.connector.filtering.FilteringValidationInfo;
 import org.elasticsearch.xpack.application.connector.filtering.FilteringValidationState;
+import org.elasticsearch.xpack.application.connector.syncjob.ConnectorSyncJobType;
 import org.elasticsearch.xpack.core.scheduler.Cron;
 
 import java.io.IOException;
@@ -337,6 +338,11 @@ public final class ConnectorTestUtils {
         return values[randomInt(values.length - 1)];
     }
 
+    public static ConnectorSyncJobType getRandomSyncJobType() {
+        ConnectorSyncJobType[] values = ConnectorSyncJobType.values();
+        return values[randomInt(values.length - 1)];
+    }
+
     private static ConnectorStatus getRandomConnectorStatus() {
         ConnectorStatus[] values = ConnectorStatus.values();
         return values[randomInt(values.length - 1)];

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

@@ -37,6 +37,7 @@ import java.io.IOException;
 import java.time.Instant;
 import java.time.temporal.ChronoUnit;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
@@ -279,9 +280,9 @@ public class ConnectorSyncJobIndexServiceTests extends ESSingleNodeTestCase {
             syncJobs.add(syncJob);
         }
 
-        ConnectorSyncJobIndexService.ConnectorSyncJobsResult firstTwoSyncJobs = awaitListConnectorSyncJobs(0, 2, null, null);
-        ConnectorSyncJobIndexService.ConnectorSyncJobsResult nextTwoSyncJobs = awaitListConnectorSyncJobs(2, 2, null, null);
-        ConnectorSyncJobIndexService.ConnectorSyncJobsResult lastSyncJobs = awaitListConnectorSyncJobs(4, 100, null, null);
+        ConnectorSyncJobIndexService.ConnectorSyncJobsResult firstTwoSyncJobs = awaitListConnectorSyncJobs(0, 2, null, null, null);
+        ConnectorSyncJobIndexService.ConnectorSyncJobsResult nextTwoSyncJobs = awaitListConnectorSyncJobs(2, 2, null, null, null);
+        ConnectorSyncJobIndexService.ConnectorSyncJobsResult lastSyncJobs = awaitListConnectorSyncJobs(4, 100, null, null, null);
 
         ConnectorSyncJob firstSyncJob = ConnectorSyncJob.fromXContentBytes(
             firstTwoSyncJobs.connectorSyncJobs().get(0).getSourceRef(),
@@ -332,11 +333,15 @@ public class ConnectorSyncJobIndexServiceTests extends ESSingleNodeTestCase {
     }
 
     public void testListConnectorSyncJobs_WithStatusPending_GivenOnePendingTwoCancelled_ExpectOnePending() throws Exception {
-        String connectorId = connectorOneId;
-
-        PostConnectorSyncJobAction.Request requestOne = ConnectorSyncJobTestUtils.getRandomPostConnectorSyncJobActionRequest(connectorId);
-        PostConnectorSyncJobAction.Request requestTwo = ConnectorSyncJobTestUtils.getRandomPostConnectorSyncJobActionRequest(connectorId);
-        PostConnectorSyncJobAction.Request requestThree = ConnectorSyncJobTestUtils.getRandomPostConnectorSyncJobActionRequest(connectorId);
+        PostConnectorSyncJobAction.Request requestOne = ConnectorSyncJobTestUtils.getRandomPostConnectorSyncJobActionRequest(
+            connectorOneId
+        );
+        PostConnectorSyncJobAction.Request requestTwo = ConnectorSyncJobTestUtils.getRandomPostConnectorSyncJobActionRequest(
+            connectorOneId
+        );
+        PostConnectorSyncJobAction.Request requestThree = ConnectorSyncJobTestUtils.getRandomPostConnectorSyncJobActionRequest(
+            connectorOneId
+        );
 
         PostConnectorSyncJobAction.Response responseOne = awaitPutConnectorSyncJob(requestOne);
         PostConnectorSyncJobAction.Response responseTwo = awaitPutConnectorSyncJob(requestTwo);
@@ -354,7 +359,8 @@ public class ConnectorSyncJobIndexServiceTests extends ESSingleNodeTestCase {
             0,
             100,
             null,
-            ConnectorSyncStatus.PENDING
+            ConnectorSyncStatus.PENDING,
+            null
         );
         long numberOfResults = connectorSyncJobsResult.totalResults();
         String idOfReturnedSyncJob = connectorSyncJobsResult.connectorSyncJobs().get(0).getDocId();
@@ -379,6 +385,7 @@ public class ConnectorSyncJobIndexServiceTests extends ESSingleNodeTestCase {
             0,
             100,
             connectorOneId,
+            null,
             null
         );
 
@@ -393,8 +400,147 @@ public class ConnectorSyncJobIndexServiceTests extends ESSingleNodeTestCase {
         assertThat(connectorIdOfReturnedSyncJob, equalTo(connectorOneId));
     }
 
+    public void testListConnectorSyncJobs_WithJobTypeFull_GivenOnePerType_ExpectOneFull() throws Exception {
+        PostConnectorSyncJobAction.Request requestOne = ConnectorSyncJobTestUtils.getRandomPostConnectorSyncJobActionRequest(
+            connectorOneId,
+            ConnectorSyncJobType.FULL
+        );
+        PostConnectorSyncJobAction.Request requestTwo = ConnectorSyncJobTestUtils.getRandomPostConnectorSyncJobActionRequest(
+            connectorOneId,
+            ConnectorSyncJobType.INCREMENTAL
+        );
+        PostConnectorSyncJobAction.Request requestThree = ConnectorSyncJobTestUtils.getRandomPostConnectorSyncJobActionRequest(
+            connectorOneId,
+            ConnectorSyncJobType.ACCESS_CONTROL
+        );
+
+        PostConnectorSyncJobAction.Response responseOne = awaitPutConnectorSyncJob(requestOne);
+        awaitPutConnectorSyncJob(requestTwo);
+        awaitPutConnectorSyncJob(requestThree);
+
+        String syncJobOneId = responseOne.getId();
+
+        ConnectorSyncJobIndexService.ConnectorSyncJobsResult connectorSyncJobsResult = awaitListConnectorSyncJobs(
+            0,
+            100,
+            null,
+            null,
+            Collections.singletonList(ConnectorSyncJobType.FULL)
+        );
+        long numberOfResults = connectorSyncJobsResult.totalResults();
+        String idOfReturnedSyncJob = connectorSyncJobsResult.connectorSyncJobs().get(0).getDocId();
+
+        assertThat(numberOfResults, equalTo(1L));
+        assertThat(idOfReturnedSyncJob, equalTo(syncJobOneId));
+    }
+
+    public void testListConnectorSyncJobs_WithJobTypeIncremental_GivenOnePerType_ExpectOneIncremental() throws Exception {
+        PostConnectorSyncJobAction.Request requestOne = ConnectorSyncJobTestUtils.getRandomPostConnectorSyncJobActionRequest(
+            connectorOneId,
+            ConnectorSyncJobType.FULL
+        );
+        PostConnectorSyncJobAction.Request requestTwo = ConnectorSyncJobTestUtils.getRandomPostConnectorSyncJobActionRequest(
+            connectorOneId,
+            ConnectorSyncJobType.INCREMENTAL
+        );
+        PostConnectorSyncJobAction.Request requestThree = ConnectorSyncJobTestUtils.getRandomPostConnectorSyncJobActionRequest(
+            connectorOneId,
+            ConnectorSyncJobType.ACCESS_CONTROL
+        );
+
+        awaitPutConnectorSyncJob(requestOne);
+        PostConnectorSyncJobAction.Response responseTwo = awaitPutConnectorSyncJob(requestTwo);
+        awaitPutConnectorSyncJob(requestThree);
+
+        String syncJobTwoId = responseTwo.getId();
+
+        ConnectorSyncJobIndexService.ConnectorSyncJobsResult connectorSyncJobsResult = awaitListConnectorSyncJobs(
+            0,
+            100,
+            null,
+            null,
+            Collections.singletonList(ConnectorSyncJobType.INCREMENTAL)
+        );
+        long numberOfResults = connectorSyncJobsResult.totalResults();
+        String idOfReturnedSyncJob = connectorSyncJobsResult.connectorSyncJobs().get(0).getDocId();
+
+        assertThat(numberOfResults, equalTo(1L));
+        assertThat(idOfReturnedSyncJob, equalTo(syncJobTwoId));
+    }
+
+    public void testListConnectorSyncJobs_WithJobTypeAccessControl_GivenOnePerType_ExpectOneAccessControl() throws Exception {
+        PostConnectorSyncJobAction.Request requestOne = ConnectorSyncJobTestUtils.getRandomPostConnectorSyncJobActionRequest(
+            connectorOneId,
+            ConnectorSyncJobType.FULL
+        );
+        PostConnectorSyncJobAction.Request requestTwo = ConnectorSyncJobTestUtils.getRandomPostConnectorSyncJobActionRequest(
+            connectorOneId,
+            ConnectorSyncJobType.INCREMENTAL
+        );
+        PostConnectorSyncJobAction.Request requestThree = ConnectorSyncJobTestUtils.getRandomPostConnectorSyncJobActionRequest(
+            connectorOneId,
+            ConnectorSyncJobType.ACCESS_CONTROL
+        );
+
+        awaitPutConnectorSyncJob(requestOne);
+        awaitPutConnectorSyncJob(requestTwo);
+        PostConnectorSyncJobAction.Response responseThree = awaitPutConnectorSyncJob(requestThree);
+
+        String syncJobThreeId = responseThree.getId();
+
+        ConnectorSyncJobIndexService.ConnectorSyncJobsResult connectorSyncJobsResult = awaitListConnectorSyncJobs(
+            0,
+            100,
+            null,
+            null,
+            Collections.singletonList(ConnectorSyncJobType.ACCESS_CONTROL)
+        );
+        long numberOfResults = connectorSyncJobsResult.totalResults();
+        String idOfReturnedSyncJob = connectorSyncJobsResult.connectorSyncJobs().get(0).getDocId();
+
+        assertThat(numberOfResults, equalTo(1L));
+        assertThat(idOfReturnedSyncJob, equalTo(syncJobThreeId));
+    }
+
+    public void testListConnectorSyncJobs_WithJobTypeFullAndIncremental_GivenOnePerType_ExpectOneFullOneIncremental() throws Exception {
+        PostConnectorSyncJobAction.Request requestOne = ConnectorSyncJobTestUtils.getRandomPostConnectorSyncJobActionRequest(
+            connectorOneId,
+            ConnectorSyncJobType.FULL
+        );
+        PostConnectorSyncJobAction.Request requestTwo = ConnectorSyncJobTestUtils.getRandomPostConnectorSyncJobActionRequest(
+            connectorOneId,
+            ConnectorSyncJobType.INCREMENTAL
+        );
+        PostConnectorSyncJobAction.Request requestThree = ConnectorSyncJobTestUtils.getRandomPostConnectorSyncJobActionRequest(
+            connectorOneId,
+            ConnectorSyncJobType.ACCESS_CONTROL
+        );
+
+        PostConnectorSyncJobAction.Response responseOne = awaitPutConnectorSyncJob(requestOne);
+        PostConnectorSyncJobAction.Response responseTwo = awaitPutConnectorSyncJob(requestTwo);
+        awaitPutConnectorSyncJob(requestThree);
+
+        String syncJobOneId = responseOne.getId();
+        String syncJobTwoId = responseTwo.getId();
+
+        ConnectorSyncJobIndexService.ConnectorSyncJobsResult connectorSyncJobsResult = awaitListConnectorSyncJobs(
+            0,
+            100,
+            null,
+            null,
+            Arrays.asList(ConnectorSyncJobType.FULL, ConnectorSyncJobType.INCREMENTAL)
+        );
+        long numberOfResults = connectorSyncJobsResult.totalResults();
+        String idOfReturnedSyncJobOne = connectorSyncJobsResult.connectorSyncJobs().get(0).getDocId();
+        String idOfReturnedSyncJobTwo = connectorSyncJobsResult.connectorSyncJobs().get(1).getDocId();
+
+        assertThat(numberOfResults, equalTo(2L));
+        assertThat(idOfReturnedSyncJobOne, equalTo(syncJobOneId));
+        assertThat(idOfReturnedSyncJobTwo, equalTo(syncJobTwoId));
+    }
+
     public void testListConnectorSyncJobs_WithNoSyncJobs_ReturnEmptyResult() throws Exception {
-        ConnectorSyncJobIndexService.ConnectorSyncJobsResult firstOneHundredSyncJobs = awaitListConnectorSyncJobs(0, 100, null, null);
+        ConnectorSyncJobIndexService.ConnectorSyncJobsResult firstOneHundredSyncJobs = awaitListConnectorSyncJobs(0, 100, null, null, null);
 
         assertThat(firstOneHundredSyncJobs.connectorSyncJobs().size(), equalTo(0));
         assertThat(firstOneHundredSyncJobs.totalResults(), equalTo(0L));
@@ -632,13 +778,14 @@ public class ConnectorSyncJobIndexServiceTests extends ESSingleNodeTestCase {
         int from,
         int size,
         String connectorId,
-        ConnectorSyncStatus syncStatus
+        ConnectorSyncStatus syncStatus,
+        List<ConnectorSyncJobType> jobTypeList
     ) throws Exception {
         CountDownLatch latch = new CountDownLatch(1);
         final AtomicReference<ConnectorSyncJobIndexService.ConnectorSyncJobsResult> result = new AtomicReference<>(null);
         final AtomicReference<Exception> exc = new AtomicReference<>(null);
 
-        connectorSyncJobIndexService.listConnectorSyncJobs(from, size, connectorId, syncStatus, new ActionListener<>() {
+        connectorSyncJobIndexService.listConnectorSyncJobs(from, size, connectorId, syncStatus, jobTypeList, new ActionListener<>() {
             @Override
             public void onResponse(ConnectorSyncJobIndexService.ConnectorSyncJobsResult connectorSyncJobsResult) {
                 result.set(connectorSyncJobsResult);

+ 10 - 1
x-pack/plugin/ent-search/src/test/java/org/elasticsearch/xpack/application/connector/syncjob/ConnectorSyncJobTestUtils.java

@@ -24,6 +24,7 @@ import org.elasticsearch.xpack.application.search.SearchApplicationTestUtils;
 
 import java.io.IOException;
 import java.time.Instant;
+import java.util.Collections;
 import java.util.Map;
 
 import static org.elasticsearch.test.ESTestCase.randomAlphaOfLength;
@@ -124,6 +125,13 @@ public class ConnectorSyncJobTestUtils {
         );
     }
 
+    public static PostConnectorSyncJobAction.Request getRandomPostConnectorSyncJobActionRequest(
+        String connectorId,
+        ConnectorSyncJobType jobType
+    ) {
+        return new PostConnectorSyncJobAction.Request(connectorId, jobType, randomFrom(ConnectorSyncJobTriggerMethod.values()));
+    }
+
     public static PostConnectorSyncJobAction.Response getRandomPostConnectorSyncJobActionResponse() {
         return new PostConnectorSyncJobAction.Response(randomAlphaOfLength(10));
     }
@@ -182,7 +190,8 @@ public class ConnectorSyncJobTestUtils {
         return new ListConnectorSyncJobsAction.Request(
             SearchApplicationTestUtils.randomPageParams(),
             randomAlphaOfLength(10),
-            ConnectorTestUtils.getRandomSyncStatus()
+            ConnectorTestUtils.getRandomSyncStatus(),
+            Collections.singletonList(ConnectorTestUtils.getRandomSyncJobType())
         );
     }
 }

+ 6 - 2
x-pack/plugin/ent-search/src/test/java/org/elasticsearch/xpack/application/connector/syncjob/action/ListConnectorSyncJobsActionRequestBWCSerializingTests.java

@@ -12,11 +12,13 @@ import org.elasticsearch.common.io.stream.Writeable;
 import org.elasticsearch.xcontent.XContentParser;
 import org.elasticsearch.xpack.application.connector.ConnectorSyncStatus;
 import org.elasticsearch.xpack.application.connector.ConnectorTestUtils;
+import org.elasticsearch.xpack.application.connector.syncjob.ConnectorSyncJobType;
 import org.elasticsearch.xpack.application.search.SearchApplicationTestUtils;
 import org.elasticsearch.xpack.core.action.util.PageParams;
 import org.elasticsearch.xpack.core.ml.AbstractBWCSerializationTestCase;
 
 import java.io.IOException;
+import java.util.Collections;
 
 public class ListConnectorSyncJobsActionRequestBWCSerializingTests extends AbstractBWCSerializationTestCase<
     ListConnectorSyncJobsAction.Request> {
@@ -30,8 +32,9 @@ public class ListConnectorSyncJobsActionRequestBWCSerializingTests extends Abstr
         PageParams pageParams = SearchApplicationTestUtils.randomPageParams();
         String connectorId = randomAlphaOfLength(10);
         ConnectorSyncStatus syncStatus = ConnectorTestUtils.getRandomSyncStatus();
+        ConnectorSyncJobType syncJobType = ConnectorTestUtils.getRandomSyncJobType();
 
-        return new ListConnectorSyncJobsAction.Request(pageParams, connectorId, syncStatus);
+        return new ListConnectorSyncJobsAction.Request(pageParams, connectorId, syncStatus, Collections.singletonList(syncJobType));
     }
 
     @Override
@@ -52,7 +55,8 @@ public class ListConnectorSyncJobsActionRequestBWCSerializingTests extends Abstr
         return new ListConnectorSyncJobsAction.Request(
             instance.getPageParams(),
             instance.getConnectorId(),
-            instance.getConnectorSyncStatus()
+            instance.getConnectorSyncStatus(),
+            instance.getConnectorSyncJobTypeList()
         );
     }
 }