From 7b2321859e7dc2c363c0c54ba379cb24ed48e598 Mon Sep 17 00:00:00 2001 From: Varun Jain Date: Tue, 27 Dec 2022 14:14:10 -0800 Subject: [PATCH 01/26] Job Details from Extension for JS Signed-off-by: Varun Jain --- build.gradle | 2 + .../jobscheduler/JobSchedulerPlugin.java | 48 ++++-- .../jobscheduler/constant/CommonValue.java | 13 ++ .../jobscheduler/model/JobDetails.java | 148 ++++++++++++++++++ .../rest/RestGetJobIndexAction.java | 107 +++++++++++++ .../rest/RestGetJobTypeAction.java | 101 ++++++++++++ .../transport/GetJobIndexAction.java | 19 +++ .../transport/GetJobIndexRequest.java | 90 +++++++++++ .../transport/GetJobIndexTransportAction.java | 56 +++++++ .../transport/GetJobTypeAction.java | 19 +++ .../transport/GetJobTypeRequest.java | 62 ++++++++ .../transport/GetJobTypeTransportAction.java | 48 ++++++ .../transport/RestJobDetailsResponse.java | 41 +++++ .../jobscheduler/utils/RestHandlerUtils.java | 80 ++++++++++ 14 files changed, 823 insertions(+), 11 deletions(-) create mode 100644 src/main/java/org/opensearch/jobscheduler/constant/CommonValue.java create mode 100644 src/main/java/org/opensearch/jobscheduler/model/JobDetails.java create mode 100644 src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java create mode 100644 src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java create mode 100644 src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexAction.java create mode 100644 src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java create mode 100644 src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportAction.java create mode 100644 src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeAction.java create mode 100644 src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeRequest.java create mode 100644 src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportAction.java create mode 100644 src/main/java/org/opensearch/jobscheduler/transport/RestJobDetailsResponse.java create mode 100644 src/main/java/org/opensearch/jobscheduler/utils/RestHandlerUtils.java diff --git a/build.gradle b/build.gradle index 0ed8c85e..278c4a64 100644 --- a/build.gradle +++ b/build.gradle @@ -136,6 +136,8 @@ repositories { dependencies { implementation project(path: ":${rootProject.name}-spi", configuration: 'shadow') + implementation group: 'com.google.guava', name: 'guava', version:'31.0.1-jre' + implementation group: 'com.google.guava', name: 'failureaccess', version:'1.0.1' javaRestTestImplementation project.sourceSets.main.runtimeClasspath } diff --git a/src/main/java/org/opensearch/jobscheduler/JobSchedulerPlugin.java b/src/main/java/org/opensearch/jobscheduler/JobSchedulerPlugin.java index 311b2f3a..d35a6882 100644 --- a/src/main/java/org/opensearch/jobscheduler/JobSchedulerPlugin.java +++ b/src/main/java/org/opensearch/jobscheduler/JobSchedulerPlugin.java @@ -5,6 +5,15 @@ package org.opensearch.jobscheduler; +import org.opensearch.action.ActionRequest; +import org.opensearch.action.ActionResponse; +import org.opensearch.client.node.NodeClient; +import org.opensearch.cluster.node.DiscoveryNodes; +import org.opensearch.common.settings.*; +import org.opensearch.extensions.ExtensionsSettings; +import org.opensearch.jobscheduler.model.JobDetails; +import org.opensearch.jobscheduler.rest.RestGetJobIndexAction; +import org.opensearch.jobscheduler.rest.RestGetJobTypeAction; import org.opensearch.jobscheduler.scheduler.JobScheduler; import org.opensearch.jobscheduler.spi.JobSchedulerExtension; import org.opensearch.jobscheduler.spi.ScheduledJobParser; @@ -20,36 +29,35 @@ import org.opensearch.cluster.service.ClusterService; import org.opensearch.common.ParseField; import org.opensearch.common.io.stream.NamedWriteableRegistry; -import org.opensearch.common.settings.Setting; -import org.opensearch.common.settings.Settings; import org.opensearch.common.util.concurrent.OpenSearchExecutors; import org.opensearch.common.xcontent.NamedXContentRegistry; import org.opensearch.env.Environment; import org.opensearch.env.NodeEnvironment; import org.opensearch.index.IndexModule; +import org.opensearch.plugins.ActionPlugin; import org.opensearch.plugins.ExtensiblePlugin; import org.opensearch.plugins.Plugin; import org.opensearch.repositories.RepositoriesService; +import org.opensearch.rest.BaseRestHandler; +import org.opensearch.rest.RestController; +import org.opensearch.rest.RestHandler; +import org.opensearch.rest.RestRequest; import org.opensearch.script.ScriptService; import org.opensearch.threadpool.ExecutorBuilder; import org.opensearch.threadpool.FixedExecutorBuilder; import org.opensearch.threadpool.ThreadPool; import org.opensearch.watcher.ResourceWatcherService; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.io.IOException; +import java.util.*; import java.util.function.Supplier; +import com.google.common.collect.ImmutableList; -public class JobSchedulerPlugin extends Plugin implements ExtensiblePlugin { +public class JobSchedulerPlugin extends Plugin implements ActionPlugin, ExtensiblePlugin { public static final String OPEN_DISTRO_JOB_SCHEDULER_THREAD_POOL_NAME = "open_distro_job_scheduler"; + public static final String JS_BASE_URI = "/_plugins/_job_scheduler"; private static final Logger log = LogManager.getLogger(JobSchedulerPlugin.class); @@ -58,10 +66,12 @@ public class JobSchedulerPlugin extends Plugin implements ExtensiblePlugin { private LockService lockService; private Map indexToJobProviders; private Set indicesToListen; + private HashMap jobDetailsHashMap; public JobSchedulerPlugin() { this.indicesToListen = new HashSet<>(); this.indexToJobProviders = new HashMap<>(); + this.jobDetailsHashMap=new HashMap<>(); } @Override @@ -155,4 +165,20 @@ private JobSweeper initSweeper(Settings settings, Client client, ClusterService return new JobSweeper(settings, client, clusterService, threadPool, registry, this.indexToJobProviders, scheduler, lockService); } + + @Override + public List getRestHandlers( + Settings settings, + RestController restController, + ClusterSettings clusterSettings, + IndexScopedSettings indexScopedSettings, + SettingsFilter settingsFilter, + IndexNameExpressionResolver indexNameExpressionResolver, + Supplier nodesInCluster + ) { + RestGetJobIndexAction restGetJobIndexAction = new RestGetJobIndexAction(jobDetailsHashMap); + RestGetJobTypeAction restGetJobTypeAction = new RestGetJobTypeAction(); + return ImmutableList.of(restGetJobIndexAction,restGetJobTypeAction); + } + } diff --git a/src/main/java/org/opensearch/jobscheduler/constant/CommonValue.java b/src/main/java/org/opensearch/jobscheduler/constant/CommonValue.java new file mode 100644 index 00000000..65f75324 --- /dev/null +++ b/src/main/java/org/opensearch/jobscheduler/constant/CommonValue.java @@ -0,0 +1,13 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.opensearch.jobscheduler.constant; + +public class CommonValue { + + public static Integer NO_SCHEMA_VERSION = 0; + public static String INTERNAL_ACTION_PREFIX = "cluster:admin/opendistro/jsinternal/"; + public static String EXTERNAL_ACTION_PREFIX = "cluster:admin/opendistro/js/"; +} diff --git a/src/main/java/org/opensearch/jobscheduler/model/JobDetails.java b/src/main/java/org/opensearch/jobscheduler/model/JobDetails.java new file mode 100644 index 00000000..c8ebf3d0 --- /dev/null +++ b/src/main/java/org/opensearch/jobscheduler/model/JobDetails.java @@ -0,0 +1,148 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.opensearch.jobscheduler.model; + +import org.opensearch.common.xcontent.ToXContent; +import org.opensearch.common.xcontent.ToXContentObject; +import org.opensearch.common.xcontent.XContentBuilder; +import org.opensearch.common.xcontent.XContentParser; + +import java.io.IOException; +import java.util.Objects; + +import static org.opensearch.common.xcontent.XContentParserUtils.ensureExpectedToken; + +public class JobDetails implements ToXContentObject { + + private String jobIndex; + + private String jobType; + + private String jobParamAction; + + private String jobRunnerAction; + + + public static final String JOB_INDEX = "job_index"; + public static final String JOB_TYPE = "job_type"; + public static final String JOB_PARAM_ACTION= "job_param_action"; + public static final String JOB_RUNNER_ACTION = "job_runner_action"; + + + public JobDetails(){} + public JobDetails(String jobIndex, String jobType, String jobParamAction, String jobRunnerAction) { + this.jobIndex = jobIndex; + this.jobType = jobType; + this.jobParamAction = jobParamAction; + this.jobRunnerAction = jobRunnerAction; + } + + @Override + public XContentBuilder toXContent(XContentBuilder builder, ToXContent.Params params) throws IOException { + XContentBuilder xContentBuilder = builder.startObject(); + if (jobIndex != null) { + xContentBuilder.field(JOB_INDEX, jobIndex); + } + if (jobType != null) { + xContentBuilder.field(JOB_TYPE, jobType); + } + if (jobParamAction != null) { + xContentBuilder.field(JOB_PARAM_ACTION, jobParamAction); + } + if (jobRunnerAction != null) { + xContentBuilder.field(JOB_RUNNER_ACTION, jobRunnerAction); + } + return xContentBuilder.endObject(); + } + + public static JobDetails parse(XContentParser parser) throws IOException { + String jobIndex = null; + String jobType = null; + String jobParamAction = null; + String jobRunnerAction = null; + + ensureExpectedToken(XContentParser.Token.START_OBJECT, parser.currentToken(), parser); + + while (parser.nextToken() != XContentParser.Token.END_OBJECT) { + String fieldName = parser.currentName(); + parser.nextToken(); + switch (fieldName) { + case JOB_INDEX: + jobIndex = parser.text(); + break; + case JOB_TYPE: + jobType = parser.text(); + break; + case JOB_PARAM_ACTION: + jobParamAction = parser.text(); + break; + case JOB_RUNNER_ACTION: + jobRunnerAction = parser.text(); + break; + default: + parser.skipChildren(); + break; + } + } + + return new JobDetails(jobIndex,jobType,jobParamAction,jobRunnerAction); + } + + public String getJobIndex() { + return jobIndex; + } + + public void setJobIndex(String jobIndex) { + this.jobIndex = jobIndex; + } + + public String getJobType() { + return jobType; + } + + public void setJobType(String jobType) { + this.jobType = jobType; + } + + public String getJobParamAction() { + return jobParamAction; + } + + public void setJobParamAction(String jobParamAction) { + this.jobParamAction = jobParamAction; + } + + public String getJobRunnerAction() { + return jobRunnerAction; + } + + public void setJobRunnerAction(String jobRunnerAction) { + this.jobRunnerAction = jobRunnerAction; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + JobDetails that = (JobDetails) o; + return Objects.equals(jobIndex, that.jobIndex) && Objects.equals(jobType, that.jobType) && jobParamAction.equals(that.jobParamAction) && jobRunnerAction.equals(that.jobRunnerAction); + } + + @Override + public int hashCode() { + return Objects.hash(jobIndex, jobType, jobParamAction, jobRunnerAction); + } + + @Override + public String toString() { + return "JobDetails{" + + "jobIndex='" + jobIndex + '\'' + + ", jobType='" + jobType + '\'' + + ", jobParamAction='" + jobParamAction + '\'' + + ", jobRunnerAction='" + jobRunnerAction + '\'' + + '}'; + } +} diff --git a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java new file mode 100644 index 00000000..7f9507f7 --- /dev/null +++ b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java @@ -0,0 +1,107 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.opensearch.jobscheduler.rest; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.opensearch.client.node.NodeClient; +import org.opensearch.common.xcontent.ToXContent; +import org.opensearch.common.xcontent.XContentParser; +import org.opensearch.jobscheduler.JobSchedulerPlugin; +import org.opensearch.jobscheduler.model.JobDetails; +import org.opensearch.jobscheduler.transport.GetJobIndexAction; +import org.opensearch.jobscheduler.transport.GetJobIndexRequest; +import org.opensearch.jobscheduler.transport.RestJobDetailsResponse; +import org.opensearch.rest.*; +import org.opensearch.rest.action.RestResponseListener; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +import static java.util.Arrays.asList; +import static java.util.Collections.unmodifiableList; +import static org.opensearch.common.xcontent.XContentParserUtils.ensureExpectedToken; +import static org.opensearch.rest.RestRequest.Method.PUT; + +public class RestGetJobIndexAction extends BaseRestHandler { + + private static final String GET_JOB_INDEX_ACTION = "get_job_index_action"; + + private final Logger logger = LogManager.getLogger(RestGetJobIndexAction.class); + + private HashMap jobDetailsHashMap; + + public RestGetJobIndexAction(HashMap jobDetailsHashMap){ + this.jobDetailsHashMap=jobDetailsHashMap; + } + + @Override + public String getName() { + return GET_JOB_INDEX_ACTION; + } + + @Override + public List routes() { + return unmodifiableList(asList(new Route(PUT, String.format(Locale.ROOT, "%s/%s", JobSchedulerPlugin.JS_BASE_URI, "_get/_job_index")))); + } + + @Override + protected RestChannelConsumer prepareRequest(RestRequest restRequest, NodeClient client) throws IOException { + XContentParser parser = restRequest.contentParser(); + ensureExpectedToken(XContentParser.Token.START_OBJECT, parser.nextToken(), parser); + String jobIndex = restRequest.param("jobIndex"); + String jobParamAction= restRequest.param("jobParamAction"); + String jobRunnerAction= restRequest.param("jobRunnerAction"); + String extensionId= restRequest.param("extensionId"); + GetJobIndexRequest getJobIndexRequest = new GetJobIndexRequest(jobIndex, jobParamAction,jobRunnerAction,extensionId); + RestRequest.Method method = restRequest.getHttpRequest().method(); + return channel -> client + .execute(GetJobIndexAction.INSTANCE, getJobIndexRequest, getJobIndexResponse(channel, method,getJobIndexRequest,extensionId)); + + } + + private RestResponseListener getJobIndexResponse( + RestChannel channel, + RestRequest.Method method, + GetJobIndexRequest request, + String extensionId + ) { + try{ + JobDetails jobDetails = new JobDetails(); + jobDetails.setJobIndex(request.getJobIndex()); + jobDetails.setJobParamAction(request.getJobParamAction()); + jobDetails.setJobRunnerAction(request.getJobRunnerAction()); + + jobDetailsHashMap.put(extensionId,jobDetails); + + } catch (Exception e) { + logger.error(e); + } + + System.out.println("Job Details Map size : "+jobDetailsHashMap.size() ); + for (Map.Entry map:jobDetailsHashMap.entrySet()){ + System.out.println("Key is: "+map.getValue()+" Value is : "+map.getValue().toString()); + } + + return new RestResponseListener<>(channel) { + @Override + public RestResponse buildResponse(RestJobDetailsResponse response) throws Exception { + RestStatus restStatus = RestStatus.CREATED; + if (method == RestRequest.Method.PUT) { + restStatus = RestStatus.OK; + } + BytesRestResponse bytesRestResponse = new BytesRestResponse( + restStatus, + response.toXContent(channel.newBuilder(), ToXContent.EMPTY_PARAMS) + ); + return bytesRestResponse; + } + }; + } +} diff --git a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java new file mode 100644 index 00000000..43ff1c77 --- /dev/null +++ b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java @@ -0,0 +1,101 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.opensearch.jobscheduler.rest; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.opensearch.client.node.NodeClient; +import org.opensearch.common.xcontent.ToXContent; +import org.opensearch.common.xcontent.XContentParser; +import org.opensearch.jobscheduler.JobSchedulerPlugin; +import org.opensearch.jobscheduler.model.JobDetails; +import org.opensearch.jobscheduler.transport.*; +import org.opensearch.rest.*; +import org.opensearch.rest.action.RestResponseListener; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +import static java.util.Arrays.asList; +import static java.util.Collections.unmodifiableList; +import static org.opensearch.common.xcontent.XContentParserUtils.ensureExpectedToken; +import static org.opensearch.rest.RestRequest.Method.PUT; + +public class RestGetJobTypeAction extends BaseRestHandler { + + private static final String GET_JOB_TYPE_ACTION = "get_job_type_action"; + + private final Logger logger = LogManager.getLogger(RestGetJobTypeAction.class); + + private HashMap jobDetailsHashMap; + + @Override + public String getName() { + return GET_JOB_TYPE_ACTION; + } + + public RestGetJobTypeAction(){} + + public RestGetJobTypeAction(HashMap jobDetailsHashMap){ + this.jobDetailsHashMap=jobDetailsHashMap; + } + + @Override + public List routes() { + return unmodifiableList(asList(new Route(PUT, String.format(Locale.ROOT, "%s/%s", JobSchedulerPlugin.JS_BASE_URI, "get/_job_type")))); + } + + @Override + protected RestChannelConsumer prepareRequest(RestRequest restRequest, NodeClient client) throws IOException { + XContentParser parser = restRequest.contentParser(); + ensureExpectedToken(XContentParser.Token.START_OBJECT, parser.nextToken(), parser); + String jobType = restRequest.param("jobType"); + String extensionId= restRequest.param("extensionId"); + GetJobTypeRequest getJobTypeRequest = new GetJobTypeRequest(jobType, extensionId); + RestRequest.Method method = restRequest.getHttpRequest().method(); + return channel -> client + .execute(GetJobTypeAction.INSTANCE, getJobTypeRequest, getJobTypeResponse(channel, method,getJobTypeRequest,extensionId)); + + } + + private RestResponseListener getJobTypeResponse( + RestChannel channel, + RestRequest.Method method, + GetJobTypeRequest request, + String extensionId + ) { + try{ + JobDetails jobDetails = jobDetailsHashMap.get(extensionId); + jobDetails.setJobType(request.getJobType()); + jobDetailsHashMap.put(extensionId,jobDetails); + + } catch (Exception e) { + logger.error(e); + } + + System.out.println("Job Details Map size : "+jobDetailsHashMap.size() ); + for (Map.Entry map:jobDetailsHashMap.entrySet()){ + System.out.println("Key is: "+map.getValue()+" Value is : "+map.getValue().toString()); + } + return new RestResponseListener<>(channel) { + @Override + public RestResponse buildResponse(RestJobDetailsResponse response) throws Exception { + RestStatus restStatus = RestStatus.CREATED; + if (method == RestRequest.Method.PUT) { + restStatus = RestStatus.OK; + } + BytesRestResponse bytesRestResponse = new BytesRestResponse( + restStatus, + response.toXContent(channel.newBuilder(), ToXContent.EMPTY_PARAMS) + ); + return bytesRestResponse; + } + }; + } +} diff --git a/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexAction.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexAction.java new file mode 100644 index 00000000..56379599 --- /dev/null +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexAction.java @@ -0,0 +1,19 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.opensearch.jobscheduler.transport; + +import org.opensearch.action.ActionType; +import org.opensearch.jobscheduler.constant.CommonValue; + +public class GetJobIndexAction extends ActionType { + + public static final String NAME = CommonValue.EXTERNAL_ACTION_PREFIX + "get/jobIndex"; + public static final GetJobIndexAction INSTANCE = new GetJobIndexAction(); + + public GetJobIndexAction() { + super(NAME, RestJobDetailsResponse::new); + } +} diff --git a/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java new file mode 100644 index 00000000..3a53e755 --- /dev/null +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java @@ -0,0 +1,90 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.opensearch.jobscheduler.transport; + +import org.opensearch.action.ActionRequest; +import org.opensearch.action.ActionRequestValidationException; +import org.opensearch.common.io.stream.StreamInput; +import org.opensearch.common.io.stream.StreamOutput; +import org.opensearch.common.unit.TimeValue; +import org.opensearch.rest.RestRequest; + +import java.io.IOException; + +public class GetJobIndexRequest extends ActionRequest { + + private String jobIndex; + + private String jobParamAction; + + private String jobRunnerAction; + + private String extensionId; + + public GetJobIndexRequest(StreamInput in) throws IOException{ + super(in); + jobIndex=in.readString(); + jobParamAction=in.readString(); + jobRunnerAction=in.readString(); + extensionId= in.readString(); + + } + + public GetJobIndexRequest(String jobIndex, String jobParamAction, String jobRunnerAction, String extensionId){ + super(); + this.jobIndex=jobIndex; + this.jobParamAction=jobParamAction; + this.jobRunnerAction=jobRunnerAction; + this.extensionId=extensionId; + } + + + @Override + public void writeTo(StreamOutput out) throws IOException { + super.writeTo(out); + out.writeString(jobIndex); + out.writeString(jobParamAction); + out.writeString(jobRunnerAction); + out.writeString(extensionId); + } + + public String getJobIndex() { + return jobIndex; + } + + public void setJobIndex(String jobIndex) { + this.jobIndex = jobIndex; + } + + public String getJobParamAction() { + return jobParamAction; + } + + public void setJobParamAction(String jobParamAction) { + this.jobParamAction = jobParamAction; + } + + public String getJobRunnerAction() { + return jobRunnerAction; + } + + public void setJobRunnerAction(String jobRunnerAction) { + this.jobRunnerAction = jobRunnerAction; + } + + public String getExtensionId() { + return extensionId; + } + + public void setExtensionId(String extensionId) { + this.extensionId = extensionId; + } + + @Override + public ActionRequestValidationException validate() { + return null; + } +} diff --git a/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportAction.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportAction.java new file mode 100644 index 00000000..906fdaa8 --- /dev/null +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportAction.java @@ -0,0 +1,56 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.opensearch.jobscheduler.transport; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.opensearch.action.ActionListener; +import org.opensearch.action.support.ActionFilters; +import org.opensearch.action.support.HandledTransportAction; +import org.opensearch.jobscheduler.model.JobDetails; +import org.opensearch.rest.RestRequest; +import org.opensearch.tasks.Task; +import org.opensearch.transport.TransportService; + +import java.util.HashMap; + +import static org.opensearch.jobscheduler.utils.RestHandlerUtils.wrapRestActionListener; + +public class GetJobIndexTransportAction extends HandledTransportAction { + private static final Logger LOG = LogManager.getLogger(GetJobIndexTransportAction.class); + + private HashMap jobDetailsHashMap; + + private String extensionId; + + protected GetJobIndexTransportAction(String actionName, TransportService transportService, ActionFilters actionFilters, HashMap jobDetailsHashMap, String extensionId) { + super(actionName, transportService, actionFilters, GetJobIndexRequest::new); + this.jobDetailsHashMap= jobDetailsHashMap; + this.extensionId=extensionId; + } + + + @Override + protected void doExecute(Task task, GetJobIndexRequest request, ActionListener actionListener) { + + + ActionListener listener = wrapRestActionListener(actionListener, ""); + + try{ + JobDetails jobDetails = new JobDetails(); + jobDetails.setJobIndex(request.getJobIndex()); + jobDetails.setJobParamAction(request.getJobParamAction()); + request.setJobRunnerAction(request.getJobRunnerAction()); + + jobDetailsHashMap.put(extensionId,jobDetails); + + } catch (Exception e) { + LOG.error(e); + listener.onFailure(e); + } + + } +} diff --git a/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeAction.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeAction.java new file mode 100644 index 00000000..6ef9d2dd --- /dev/null +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeAction.java @@ -0,0 +1,19 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.opensearch.jobscheduler.transport; + +import org.opensearch.action.ActionType; +import org.opensearch.jobscheduler.constant.CommonValue; + +public class GetJobTypeAction extends ActionType { + + public static final String NAME = CommonValue.EXTERNAL_ACTION_PREFIX + "get/jobType"; + public static final GetJobTypeAction INSTANCE = new GetJobTypeAction(); + + public GetJobTypeAction() { + super(NAME, RestJobDetailsResponse::new); + } +} diff --git a/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeRequest.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeRequest.java new file mode 100644 index 00000000..94dcc2a1 --- /dev/null +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeRequest.java @@ -0,0 +1,62 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.opensearch.jobscheduler.transport; + +import org.opensearch.action.ActionRequest; +import org.opensearch.action.ActionRequestValidationException; +import org.opensearch.common.io.stream.StreamInput; +import org.opensearch.common.io.stream.StreamOutput; +import org.opensearch.common.unit.TimeValue; +import org.opensearch.rest.RestRequest; + +import java.io.IOException; + +public class GetJobTypeRequest extends ActionRequest { + + private String jobType; + + private String extensionId; + + public GetJobTypeRequest(String jobType,String extensionId){ + super(); + this.jobType=jobType; + this.extensionId=extensionId; + } + + public GetJobTypeRequest(StreamInput in) throws IOException { + super(in); + jobType=in.readString(); + extensionId=in.readString(); + } + + @Override + public void writeTo(StreamOutput out) throws IOException { + super.writeTo(out); + out.writeString(jobType); + out.writeString(extensionId); + } + + public String getJobType() { + return jobType; + } + + public void setJobType(String jobType) { + this.jobType = jobType; + } + + public String getExtensionId() { + return extensionId; + } + + public void setExtensionId(String extensionId) { + this.extensionId = extensionId; + } + + @Override + public ActionRequestValidationException validate() { + return null; + } +} diff --git a/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportAction.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportAction.java new file mode 100644 index 00000000..15e32b86 --- /dev/null +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportAction.java @@ -0,0 +1,48 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.opensearch.jobscheduler.transport; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.opensearch.action.ActionListener; +import org.opensearch.action.support.ActionFilters; +import org.opensearch.action.support.HandledTransportAction; +import org.opensearch.common.io.stream.Writeable; +import org.opensearch.jobscheduler.model.JobDetails; +import org.opensearch.tasks.Task; +import org.opensearch.transport.TransportService; + +import java.util.HashMap; + +import static org.opensearch.jobscheduler.utils.RestHandlerUtils.wrapRestActionListener; + +public class GetJobTypeTransportAction extends HandledTransportAction { + private static final Logger LOG = LogManager.getLogger(GetJobTypeTransportAction.class); + private HashMap jobDetailsHashMap; + + private String extensionId; + + protected GetJobTypeTransportAction(String actionName, TransportService transportService, ActionFilters actionFilters, Writeable.Reader getJobTypeRequestReader, HashMap jobDetailsHashMap, String extensionId) { + super(actionName, transportService, actionFilters, getJobTypeRequestReader); + this.jobDetailsHashMap=jobDetailsHashMap; + this.extensionId=extensionId; + } + + @Override + protected void doExecute(Task task, GetJobTypeRequest request, ActionListener actionListener) { + ActionListener listener = wrapRestActionListener(actionListener, ""); + + try{ + JobDetails jobDetails = jobDetailsHashMap.get(extensionId); + jobDetails.setJobType(request.getJobType()); + jobDetailsHashMap.put(extensionId,jobDetails); + } catch (Exception e) { + LOG.error(e); + listener.onFailure(e); + } + + } +} diff --git a/src/main/java/org/opensearch/jobscheduler/transport/RestJobDetailsResponse.java b/src/main/java/org/opensearch/jobscheduler/transport/RestJobDetailsResponse.java new file mode 100644 index 00000000..8d8933e4 --- /dev/null +++ b/src/main/java/org/opensearch/jobscheduler/transport/RestJobDetailsResponse.java @@ -0,0 +1,41 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.opensearch.jobscheduler.transport; + +import org.opensearch.action.ActionResponse; +import org.opensearch.common.io.stream.StreamInput; +import org.opensearch.common.io.stream.StreamOutput; +import org.opensearch.common.xcontent.ToXContentObject; +import org.opensearch.common.xcontent.XContentBuilder; +import org.opensearch.rest.RestStatus; + +import java.io.IOException; + +public class RestJobDetailsResponse extends ActionResponse implements ToXContentObject { + + private final RestStatus restStatus; + + public RestJobDetailsResponse(StreamInput in) throws IOException { + super(in); + restStatus = in.readEnum(RestStatus.class); + } + + public RestJobDetailsResponse(String jobIndex, String jobParamAction, String jobRunnerAction, RestStatus restStatus) { + this.restStatus=restStatus; + } + + @Override + public void writeTo(StreamOutput out) throws IOException { + out.writeEnum(restStatus); + } + + @Override + public XContentBuilder toXContent(XContentBuilder xContentBuilder, Params params) throws IOException { + return xContentBuilder + .startObject() + .endObject(); + } +} diff --git a/src/main/java/org/opensearch/jobscheduler/utils/RestHandlerUtils.java b/src/main/java/org/opensearch/jobscheduler/utils/RestHandlerUtils.java new file mode 100644 index 00000000..26c7cca6 --- /dev/null +++ b/src/main/java/org/opensearch/jobscheduler/utils/RestHandlerUtils.java @@ -0,0 +1,80 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.opensearch.jobscheduler.utils; + +import com.google.common.base.Throwables; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.opensearch.OpenSearchStatusException; +import org.opensearch.ResourceNotFoundException; +import org.opensearch.action.ActionListener; +import org.opensearch.common.Nullable; +import org.opensearch.index.IndexNotFoundException; +import org.opensearch.indices.InvalidIndexNameException; +import org.opensearch.rest.RestStatus; + +import static org.opensearch.rest.RestStatus.BAD_REQUEST; +import static org.opensearch.rest.RestStatus.INTERNAL_SERVER_ERROR; + +public final class RestHandlerUtils { + + private static final Logger logger = LogManager.getLogger(RestHandlerUtils.class); + + private RestHandlerUtils() {} + + /** + * Wrap action listener to avoid return verbose error message and wrong 500 error to user. + * Suggestion for exception handling in AD: + * 1. If the error is caused by wrong input, throw IllegalArgumentException exception. + * 2. For other errors, please use AnomalyDetectionException or its subclass, or use + * OpenSearchStatusException. + * + * TODO: tune this function for wrapped exception, return root exception error message + * + * @param actionListener action listener + * @param generalErrorMessage general error message + * @param action listener response type + * @return wrapped action listener + */ + public static ActionListener wrapRestActionListener(ActionListener actionListener, String generalErrorMessage) { + return ActionListener.wrap(r -> { actionListener.onResponse(r); }, e -> { + logger.error("Wrap exception before sending back to user", e); + Throwable cause = Throwables.getRootCause(e); + if (isProperExceptionToReturn(e)) { + actionListener.onFailure(e); + } else if (isProperExceptionToReturn(cause)) { + actionListener.onFailure((Exception) cause); + } else { + RestStatus status = isBadRequest(e) ? BAD_REQUEST : INTERNAL_SERVER_ERROR; + String errorMessage = generalErrorMessage; + if (isBadRequest(e)) { + errorMessage = e.getMessage(); + } else if (cause != null && (isBadRequest(cause))) { + errorMessage = cause.getMessage(); + } + actionListener.onFailure(new OpenSearchStatusException(errorMessage, status)); + } + }); + } + + public static boolean isBadRequest(Throwable e) { + if (e == null) { + return false; + } + return e instanceof IllegalArgumentException || e instanceof ResourceNotFoundException; + } + + public static boolean isProperExceptionToReturn(Throwable e) { + if (e == null) { + return false; + } + return e instanceof OpenSearchStatusException || e instanceof IndexNotFoundException || e instanceof InvalidIndexNameException; + } + + private static String coalesceToEmpty(@Nullable String s) { + return s == null ? "" : s; + } +} From ecb3462466d9ef99518ac590d793da236b853aab Mon Sep 17 00:00:00 2001 From: Varun Jain Date: Wed, 28 Dec 2022 12:09:52 -0800 Subject: [PATCH 02/26] Communication Mechanism for JS Signed-off-by: Varun Jain --- .../jobscheduler/JobSchedulerPlugin.java | 14 +++- .../rest/RestGetJobIndexAction.java | 68 +++++++++---------- .../rest/RestGetJobTypeAction.java | 53 +++++++-------- ...sponse.java => GetJobDetailsResponse.java} | 6 +- .../transport/GetJobIndexAction.java | 4 +- .../transport/GetJobIndexTransportAction.java | 23 +++++-- .../transport/GetJobTypeAction.java | 4 +- .../transport/GetJobTypeTransportAction.java | 20 ++++-- 8 files changed, 107 insertions(+), 85 deletions(-) rename src/main/java/org/opensearch/jobscheduler/transport/{RestJobDetailsResponse.java => GetJobDetailsResponse.java} (77%) diff --git a/src/main/java/org/opensearch/jobscheduler/JobSchedulerPlugin.java b/src/main/java/org/opensearch/jobscheduler/JobSchedulerPlugin.java index d35a6882..5cefb4fa 100644 --- a/src/main/java/org/opensearch/jobscheduler/JobSchedulerPlugin.java +++ b/src/main/java/org/opensearch/jobscheduler/JobSchedulerPlugin.java @@ -34,6 +34,10 @@ import org.opensearch.env.Environment; import org.opensearch.env.NodeEnvironment; import org.opensearch.index.IndexModule; +import org.opensearch.jobscheduler.transport.GetJobIndexAction; +import org.opensearch.jobscheduler.transport.GetJobIndexTransportAction; +import org.opensearch.jobscheduler.transport.GetJobTypeAction; +import org.opensearch.jobscheduler.transport.GetJobTypeTransportAction; import org.opensearch.plugins.ActionPlugin; import org.opensearch.plugins.ExtensiblePlugin; import org.opensearch.plugins.Plugin; @@ -177,8 +181,16 @@ public List getRestHandlers( Supplier nodesInCluster ) { RestGetJobIndexAction restGetJobIndexAction = new RestGetJobIndexAction(jobDetailsHashMap); - RestGetJobTypeAction restGetJobTypeAction = new RestGetJobTypeAction(); + RestGetJobTypeAction restGetJobTypeAction = new RestGetJobTypeAction(jobDetailsHashMap); return ImmutableList.of(restGetJobIndexAction,restGetJobTypeAction); } +// @Override +// public List> getActions() { +// return Arrays +// .asList( +// new ActionHandler<>(GetJobIndexAction.INSTANCE, GetJobIndexTransportAction.class), +// new ActionHandler<>(GetJobTypeAction.INSTANCE, GetJobTypeTransportAction.class) +// ); +// } } diff --git a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java index 7f9507f7..29dc99e2 100644 --- a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java +++ b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java @@ -12,9 +12,7 @@ import org.opensearch.common.xcontent.XContentParser; import org.opensearch.jobscheduler.JobSchedulerPlugin; import org.opensearch.jobscheduler.model.JobDetails; -import org.opensearch.jobscheduler.transport.GetJobIndexAction; -import org.opensearch.jobscheduler.transport.GetJobIndexRequest; -import org.opensearch.jobscheduler.transport.RestJobDetailsResponse; +import org.opensearch.jobscheduler.transport.GetJobDetailsResponse; import org.opensearch.rest.*; import org.opensearch.rest.action.RestResponseListener; @@ -53,55 +51,55 @@ public List routes() { @Override protected RestChannelConsumer prepareRequest(RestRequest restRequest, NodeClient client) throws IOException { + logger.info("In Prepare request method"); XContentParser parser = restRequest.contentParser(); ensureExpectedToken(XContentParser.Token.START_OBJECT, parser.nextToken(), parser); - String jobIndex = restRequest.param("jobIndex"); - String jobParamAction= restRequest.param("jobParamAction"); - String jobRunnerAction= restRequest.param("jobRunnerAction"); - String extensionId= restRequest.param("extensionId"); - GetJobIndexRequest getJobIndexRequest = new GetJobIndexRequest(jobIndex, jobParamAction,jobRunnerAction,extensionId); - RestRequest.Method method = restRequest.getHttpRequest().method(); - return channel -> client - .execute(GetJobIndexAction.INSTANCE, getJobIndexRequest, getJobIndexResponse(channel, method,getJobIndexRequest,extensionId)); - } - - private RestResponseListener getJobIndexResponse( - RestChannel channel, - RestRequest.Method method, - GetJobIndexRequest request, - String extensionId - ) { + String jobIndex; + String jobParamAction; + String jobRunnerAction; + String extensionId=null; try{ - JobDetails jobDetails = new JobDetails(); - jobDetails.setJobIndex(request.getJobIndex()); - jobDetails.setJobParamAction(request.getJobParamAction()); - jobDetails.setJobRunnerAction(request.getJobRunnerAction()); + jobIndex = restRequest.param("jobIndex"); + jobParamAction= restRequest.param("jobParamAction"); + jobRunnerAction= restRequest.param("jobRunnerAction"); + extensionId= restRequest.param("extensionId"); + }catch (Exception e){ + logger.info("Failed get job index for extensionId "+extensionId, e); + return channel -> getJobIndexResponse(channel, RestStatus.BAD_REQUEST); + } + //GetJobIndexRequest getJobIndexRequest = new GetJobIndexRequest(jobIndex, jobParamAction,jobRunnerAction,extensionId); - jobDetailsHashMap.put(extensionId,jobDetails); + JobDetails jobDetails = jobDetailsHashMap.getOrDefault(extensionId,new JobDetails()); + jobDetails.setJobIndex(jobIndex); + jobDetails.setJobParamAction(jobParamAction); + jobDetails.setJobRunnerAction(jobRunnerAction); - } catch (Exception e) { - logger.error(e); - } + jobDetailsHashMap.put(extensionId,jobDetails); - System.out.println("Job Details Map size : "+jobDetailsHashMap.size() ); + logger.info("Job Details Map size jobIndex: "+jobDetailsHashMap.size() ); for (Map.Entry map:jobDetailsHashMap.entrySet()){ - System.out.println("Key is: "+map.getValue()+" Value is : "+map.getValue().toString()); + logger.info("Key is: "+map.getValue()+" Value is : "+map.getValue().toString()); } + return channel -> getJobIndexResponse(channel, RestStatus.OK); + + } + + private RestResponseListener getJobIndexResponse( + RestChannel channel, + RestStatus status + ) { return new RestResponseListener<>(channel) { @Override - public RestResponse buildResponse(RestJobDetailsResponse response) throws Exception { - RestStatus restStatus = RestStatus.CREATED; - if (method == RestRequest.Method.PUT) { - restStatus = RestStatus.OK; - } + public RestResponse buildResponse(GetJobDetailsResponse response) throws Exception { BytesRestResponse bytesRestResponse = new BytesRestResponse( - restStatus, + status, response.toXContent(channel.newBuilder(), ToXContent.EMPTY_PARAMS) ); return bytesRestResponse; } }; } + } diff --git a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java index 43ff1c77..15b58bdd 100644 --- a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java +++ b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java @@ -55,43 +55,38 @@ public List routes() { protected RestChannelConsumer prepareRequest(RestRequest restRequest, NodeClient client) throws IOException { XContentParser parser = restRequest.contentParser(); ensureExpectedToken(XContentParser.Token.START_OBJECT, parser.nextToken(), parser); - String jobType = restRequest.param("jobType"); - String extensionId= restRequest.param("extensionId"); - GetJobTypeRequest getJobTypeRequest = new GetJobTypeRequest(jobType, extensionId); - RestRequest.Method method = restRequest.getHttpRequest().method(); - return channel -> client - .execute(GetJobTypeAction.INSTANCE, getJobTypeRequest, getJobTypeResponse(channel, method,getJobTypeRequest,extensionId)); - - } - - private RestResponseListener getJobTypeResponse( - RestChannel channel, - RestRequest.Method method, - GetJobTypeRequest request, - String extensionId - ) { + String jobType; + String extensionId=null; try{ - JobDetails jobDetails = jobDetailsHashMap.get(extensionId); - jobDetails.setJobType(request.getJobType()); - jobDetailsHashMap.put(extensionId,jobDetails); - - } catch (Exception e) { - logger.error(e); + jobType = restRequest.param("jobType"); + extensionId= restRequest.param("extensionId"); + }catch (Exception e){ + logger.info("Failed get job type for extensionId "+extensionId, e); + return channel -> getJobTypeResponse(channel, RestStatus.BAD_REQUEST); } - System.out.println("Job Details Map size : "+jobDetailsHashMap.size() ); + //GetJobTypeRequest getJobTypeRequest = new GetJobTypeRequest(jobType, extensionId); + JobDetails jobDetails = jobDetailsHashMap.getOrDefault(extensionId,new JobDetails()); + jobDetails.setJobType(jobType); + jobDetailsHashMap.put(extensionId,jobDetails); + + logger.info("Job Details Map size jobType: "+jobDetailsHashMap.size() ); for (Map.Entry map:jobDetailsHashMap.entrySet()){ - System.out.println("Key is: "+map.getValue()+" Value is : "+map.getValue().toString()); + logger.info("Key is: "+map.getValue()+" Value is : "+map.getValue().toString()); } + + return channel -> getJobTypeResponse(channel, RestStatus.OK); + } + + private RestResponseListener getJobTypeResponse( + RestChannel channel, + RestStatus status + ) { return new RestResponseListener<>(channel) { @Override - public RestResponse buildResponse(RestJobDetailsResponse response) throws Exception { - RestStatus restStatus = RestStatus.CREATED; - if (method == RestRequest.Method.PUT) { - restStatus = RestStatus.OK; - } + public RestResponse buildResponse(GetJobDetailsResponse response) throws Exception { BytesRestResponse bytesRestResponse = new BytesRestResponse( - restStatus, + status, response.toXContent(channel.newBuilder(), ToXContent.EMPTY_PARAMS) ); return bytesRestResponse; diff --git a/src/main/java/org/opensearch/jobscheduler/transport/RestJobDetailsResponse.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponse.java similarity index 77% rename from src/main/java/org/opensearch/jobscheduler/transport/RestJobDetailsResponse.java rename to src/main/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponse.java index 8d8933e4..a605dd2d 100644 --- a/src/main/java/org/opensearch/jobscheduler/transport/RestJobDetailsResponse.java +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponse.java @@ -14,16 +14,16 @@ import java.io.IOException; -public class RestJobDetailsResponse extends ActionResponse implements ToXContentObject { +public class GetJobDetailsResponse extends ActionResponse implements ToXContentObject { private final RestStatus restStatus; - public RestJobDetailsResponse(StreamInput in) throws IOException { + public GetJobDetailsResponse(StreamInput in) throws IOException { super(in); restStatus = in.readEnum(RestStatus.class); } - public RestJobDetailsResponse(String jobIndex, String jobParamAction, String jobRunnerAction, RestStatus restStatus) { + public GetJobDetailsResponse(RestStatus restStatus) { this.restStatus=restStatus; } diff --git a/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexAction.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexAction.java index 56379599..aca98870 100644 --- a/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexAction.java +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexAction.java @@ -8,12 +8,12 @@ import org.opensearch.action.ActionType; import org.opensearch.jobscheduler.constant.CommonValue; -public class GetJobIndexAction extends ActionType { +public class GetJobIndexAction extends ActionType { public static final String NAME = CommonValue.EXTERNAL_ACTION_PREFIX + "get/jobIndex"; public static final GetJobIndexAction INSTANCE = new GetJobIndexAction(); public GetJobIndexAction() { - super(NAME, RestJobDetailsResponse::new); + super(NAME, GetJobDetailsResponse::new); } } diff --git a/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportAction.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportAction.java index 906fdaa8..3e615425 100644 --- a/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportAction.java +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportAction.java @@ -10,34 +10,38 @@ import org.opensearch.action.ActionListener; import org.opensearch.action.support.ActionFilters; import org.opensearch.action.support.HandledTransportAction; +import org.opensearch.common.inject.Inject; import org.opensearch.jobscheduler.model.JobDetails; import org.opensearch.rest.RestRequest; import org.opensearch.tasks.Task; import org.opensearch.transport.TransportService; import java.util.HashMap; +import java.util.Map; import static org.opensearch.jobscheduler.utils.RestHandlerUtils.wrapRestActionListener; -public class GetJobIndexTransportAction extends HandledTransportAction { - private static final Logger LOG = LogManager.getLogger(GetJobIndexTransportAction.class); +public class GetJobIndexTransportAction extends HandledTransportAction { + private static final Logger logger = LogManager.getLogger(GetJobIndexTransportAction.class); private HashMap jobDetailsHashMap; private String extensionId; - protected GetJobIndexTransportAction(String actionName, TransportService transportService, ActionFilters actionFilters, HashMap jobDetailsHashMap, String extensionId) { - super(actionName, transportService, actionFilters, GetJobIndexRequest::new); + + @Inject + public GetJobIndexTransportAction(String actionName, TransportService transportService, ActionFilters actionFilters, HashMap jobDetailsHashMap, String extensionId) { + super(GetJobIndexAction.NAME, transportService, actionFilters, GetJobIndexRequest::new); this.jobDetailsHashMap= jobDetailsHashMap; this.extensionId=extensionId; } @Override - protected void doExecute(Task task, GetJobIndexRequest request, ActionListener actionListener) { + protected void doExecute(Task task, GetJobIndexRequest request, ActionListener actionListener) { - ActionListener listener = wrapRestActionListener(actionListener, ""); + ActionListener listener = wrapRestActionListener(actionListener, ""); try{ JobDetails jobDetails = new JobDetails(); @@ -47,8 +51,13 @@ protected void doExecute(Task task, GetJobIndexRequest request, ActionListener map:jobDetailsHashMap.entrySet()){ + logger.info("Key is: "+map.getValue()+" Value is : "+map.getValue().toString()); + } + } catch (Exception e) { - LOG.error(e); + //logger.info(e); listener.onFailure(e); } diff --git a/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeAction.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeAction.java index 6ef9d2dd..20f30a7c 100644 --- a/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeAction.java +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeAction.java @@ -8,12 +8,12 @@ import org.opensearch.action.ActionType; import org.opensearch.jobscheduler.constant.CommonValue; -public class GetJobTypeAction extends ActionType { +public class GetJobTypeAction extends ActionType { public static final String NAME = CommonValue.EXTERNAL_ACTION_PREFIX + "get/jobType"; public static final GetJobTypeAction INSTANCE = new GetJobTypeAction(); public GetJobTypeAction() { - super(NAME, RestJobDetailsResponse::new); + super(NAME, GetJobDetailsResponse::new); } } diff --git a/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportAction.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportAction.java index 15e32b86..1f983f45 100644 --- a/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportAction.java +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportAction.java @@ -10,37 +10,45 @@ import org.opensearch.action.ActionListener; import org.opensearch.action.support.ActionFilters; import org.opensearch.action.support.HandledTransportAction; +import org.opensearch.common.inject.Inject; import org.opensearch.common.io.stream.Writeable; import org.opensearch.jobscheduler.model.JobDetails; import org.opensearch.tasks.Task; import org.opensearch.transport.TransportService; import java.util.HashMap; +import java.util.Map; import static org.opensearch.jobscheduler.utils.RestHandlerUtils.wrapRestActionListener; -public class GetJobTypeTransportAction extends HandledTransportAction { +public class GetJobTypeTransportAction extends HandledTransportAction { private static final Logger LOG = LogManager.getLogger(GetJobTypeTransportAction.class); private HashMap jobDetailsHashMap; private String extensionId; - protected GetJobTypeTransportAction(String actionName, TransportService transportService, ActionFilters actionFilters, Writeable.Reader getJobTypeRequestReader, HashMap jobDetailsHashMap, String extensionId) { - super(actionName, transportService, actionFilters, getJobTypeRequestReader); + @Inject + public GetJobTypeTransportAction(String actionName, TransportService transportService, ActionFilters actionFilters, HashMap jobDetailsHashMap, String extensionId) { + super(GetJobTypeAction.NAME, transportService, actionFilters, GetJobTypeRequest::new); this.jobDetailsHashMap=jobDetailsHashMap; this.extensionId=extensionId; } @Override - protected void doExecute(Task task, GetJobTypeRequest request, ActionListener actionListener) { - ActionListener listener = wrapRestActionListener(actionListener, ""); + protected void doExecute(Task task, GetJobTypeRequest request, ActionListener actionListener) { + ActionListener listener = wrapRestActionListener(actionListener, ""); try{ JobDetails jobDetails = jobDetailsHashMap.get(extensionId); jobDetails.setJobType(request.getJobType()); jobDetailsHashMap.put(extensionId,jobDetails); + + logger.info("Job Details Map size : "+jobDetailsHashMap.size() ); + for (Map.Entry map:jobDetailsHashMap.entrySet()){ + logger.info("Key is: "+map.getValue()+" Value is : "+map.getValue().toString()); + } } catch (Exception e) { - LOG.error(e); +// LOG.error(e); listener.onFailure(e); } From 692d65950e798238a0f869175501056b67a869c9 Mon Sep 17 00:00:00 2001 From: Varun Jain Date: Thu, 29 Dec 2022 11:21:00 -0800 Subject: [PATCH 03/26] Communication mechanism for JS Signed-off-by: Varun Jain --- .../jobscheduler/JobSchedulerPlugin.java | 16 +- .../rest/RestGetJobIndexAction.java | 45 ++-- .../rest/RestGetJobTypeAction.java | 30 +-- .../transport/GetJobDetailsResponse.java | 11 +- .../transport/GetJobIndexRequest.java | 208 +++++++++++------- .../transport/GetJobIndexTransportAction.java | 35 +-- .../transport/GetJobTypeRequest.java | 142 +++++++----- .../transport/GetJobTypeTransportAction.java | 27 +-- .../opensearch/jobscheduler/TestHelpers.java | 24 ++ .../rest/RestGetJobIndexActionTests.java | 82 +++++++ .../rest/RestGetJobTypeActionTests.java | 76 +++++++ .../transport/GetJobDetailsResponseTests.java | 28 +++ .../GetJobIndexTransportActionTests.java | 57 +++++ .../GetJobTypeTransportActionTests.java | 57 +++++ 14 files changed, 582 insertions(+), 256 deletions(-) create mode 100644 src/test/java/org/opensearch/jobscheduler/TestHelpers.java create mode 100644 src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java create mode 100644 src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java create mode 100644 src/test/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponseTests.java create mode 100644 src/test/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportActionTests.java create mode 100644 src/test/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportActionTests.java diff --git a/src/main/java/org/opensearch/jobscheduler/JobSchedulerPlugin.java b/src/main/java/org/opensearch/jobscheduler/JobSchedulerPlugin.java index 5cefb4fa..c2a4eb95 100644 --- a/src/main/java/org/opensearch/jobscheduler/JobSchedulerPlugin.java +++ b/src/main/java/org/opensearch/jobscheduler/JobSchedulerPlugin.java @@ -185,12 +185,12 @@ public List getRestHandlers( return ImmutableList.of(restGetJobIndexAction,restGetJobTypeAction); } -// @Override -// public List> getActions() { -// return Arrays -// .asList( -// new ActionHandler<>(GetJobIndexAction.INSTANCE, GetJobIndexTransportAction.class), -// new ActionHandler<>(GetJobTypeAction.INSTANCE, GetJobTypeTransportAction.class) -// ); -// } + @Override + public List> getActions() { + return Arrays + .asList( + new ActionHandler<>(GetJobIndexAction.INSTANCE, GetJobIndexTransportAction.class), + new ActionHandler<>(GetJobTypeAction.INSTANCE, GetJobTypeTransportAction.class) + ); + } } diff --git a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java index 29dc99e2..65a82c2b 100644 --- a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java +++ b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java @@ -13,6 +13,8 @@ import org.opensearch.jobscheduler.JobSchedulerPlugin; import org.opensearch.jobscheduler.model.JobDetails; import org.opensearch.jobscheduler.transport.GetJobDetailsResponse; +import org.opensearch.jobscheduler.transport.GetJobIndexAction; +import org.opensearch.jobscheduler.transport.GetJobIndexRequest; import org.opensearch.rest.*; import org.opensearch.rest.action.RestResponseListener; @@ -51,38 +53,19 @@ public List routes() { @Override protected RestChannelConsumer prepareRequest(RestRequest restRequest, NodeClient client) throws IOException { - logger.info("In Prepare request method"); XContentParser parser = restRequest.contentParser(); ensureExpectedToken(XContentParser.Token.START_OBJECT, parser.nextToken(), parser); - String jobIndex; - String jobParamAction; - String jobRunnerAction; - String extensionId=null; - try{ - jobIndex = restRequest.param("jobIndex"); - jobParamAction= restRequest.param("jobParamAction"); - jobRunnerAction= restRequest.param("jobRunnerAction"); - extensionId= restRequest.param("extensionId"); - }catch (Exception e){ - logger.info("Failed get job index for extensionId "+extensionId, e); - return channel -> getJobIndexResponse(channel, RestStatus.BAD_REQUEST); - } - //GetJobIndexRequest getJobIndexRequest = new GetJobIndexRequest(jobIndex, jobParamAction,jobRunnerAction,extensionId); - - JobDetails jobDetails = jobDetailsHashMap.getOrDefault(extensionId,new JobDetails()); - jobDetails.setJobIndex(jobIndex); - jobDetails.setJobParamAction(jobParamAction); - jobDetails.setJobRunnerAction(jobRunnerAction); - - jobDetailsHashMap.put(extensionId,jobDetails); - - logger.info("Job Details Map size jobIndex: "+jobDetailsHashMap.size() ); - for (Map.Entry map:jobDetailsHashMap.entrySet()){ - logger.info("Key is: "+map.getValue()+" Value is : "+map.getValue().toString()); - } - - return channel -> getJobIndexResponse(channel, RestStatus.OK); + GetJobIndexRequest getJobIndexRequest = GetJobIndexRequest.parse(parser); + + JobDetails jobDetails = jobDetailsHashMap.getOrDefault(getJobIndexRequest.getExtensionId(),new JobDetails()); + jobDetails.setJobIndex(getJobIndexRequest.getJobIndex()); + jobDetails.setJobParamAction(getJobIndexRequest.getJobParamAction()); + jobDetails.setJobRunnerAction(getJobIndexRequest.getJobRunnerAction()); + + jobDetailsHashMap.put(getJobIndexRequest.getExtensionId(),jobDetails); + + return channel -> client.execute(GetJobIndexAction.INSTANCE,getJobIndexRequest,getJobIndexResponse(channel, RestStatus.OK)); } @@ -92,10 +75,10 @@ private RestResponseListener getJobIndexResponse( ) { return new RestResponseListener<>(channel) { @Override - public RestResponse buildResponse(GetJobDetailsResponse response) throws Exception { + public RestResponse buildResponse(GetJobDetailsResponse getJobDetailsResponse) throws Exception { BytesRestResponse bytesRestResponse = new BytesRestResponse( status, - response.toXContent(channel.newBuilder(), ToXContent.EMPTY_PARAMS) + getJobDetailsResponse.toXContent(channel.newBuilder(), ToXContent.EMPTY_PARAMS) ); return bytesRestResponse; } diff --git a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java index 15b58bdd..6596bf9e 100644 --- a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java +++ b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java @@ -48,34 +48,20 @@ public RestGetJobTypeAction(HashMap jobDetailsHashMap){ @Override public List routes() { - return unmodifiableList(asList(new Route(PUT, String.format(Locale.ROOT, "%s/%s", JobSchedulerPlugin.JS_BASE_URI, "get/_job_type")))); + return unmodifiableList(asList(new Route(PUT, String.format(Locale.ROOT, "%s/%s", JobSchedulerPlugin.JS_BASE_URI, "_get/_job_type")))); } @Override protected RestChannelConsumer prepareRequest(RestRequest restRequest, NodeClient client) throws IOException { XContentParser parser = restRequest.contentParser(); ensureExpectedToken(XContentParser.Token.START_OBJECT, parser.nextToken(), parser); - String jobType; - String extensionId=null; - try{ - jobType = restRequest.param("jobType"); - extensionId= restRequest.param("extensionId"); - }catch (Exception e){ - logger.info("Failed get job type for extensionId "+extensionId, e); - return channel -> getJobTypeResponse(channel, RestStatus.BAD_REQUEST); - } - - //GetJobTypeRequest getJobTypeRequest = new GetJobTypeRequest(jobType, extensionId); - JobDetails jobDetails = jobDetailsHashMap.getOrDefault(extensionId,new JobDetails()); - jobDetails.setJobType(jobType); - jobDetailsHashMap.put(extensionId,jobDetails); - - logger.info("Job Details Map size jobType: "+jobDetailsHashMap.size() ); - for (Map.Entry map:jobDetailsHashMap.entrySet()){ - logger.info("Key is: "+map.getValue()+" Value is : "+map.getValue().toString()); - } - - return channel -> getJobTypeResponse(channel, RestStatus.OK); + GetJobTypeRequest getJobTypeRequest = GetJobTypeRequest.parse(parser); + + JobDetails jobDetails = jobDetailsHashMap.getOrDefault(getJobTypeRequest.getExtensionId(),new JobDetails()); + jobDetails.setJobType(getJobTypeRequest.getJobType()); + jobDetailsHashMap.put(getJobTypeRequest.getExtensionId(),jobDetails); + + return channel -> client.execute(GetJobTypeAction.INSTANCE,getJobTypeRequest,getJobTypeResponse(channel, RestStatus.OK)); } private RestResponseListener getJobTypeResponse( diff --git a/src/main/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponse.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponse.java index a605dd2d..da50c8d4 100644 --- a/src/main/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponse.java +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponse.java @@ -17,14 +17,18 @@ public class GetJobDetailsResponse extends ActionResponse implements ToXContentObject { private final RestStatus restStatus; + private final String response; + private final static String RESPONSE="response"; public GetJobDetailsResponse(StreamInput in) throws IOException { super(in); restStatus = in.readEnum(RestStatus.class); + response= in.readString(); } - public GetJobDetailsResponse(RestStatus restStatus) { + public GetJobDetailsResponse(RestStatus restStatus, String response) { this.restStatus=restStatus; + this.response=response; } @Override @@ -35,7 +39,8 @@ public void writeTo(StreamOutput out) throws IOException { @Override public XContentBuilder toXContent(XContentBuilder xContentBuilder, Params params) throws IOException { return xContentBuilder - .startObject() - .endObject(); + .startObject() + .field(RESPONSE, response) + .endObject(); } } diff --git a/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java index 3a53e755..24072351 100644 --- a/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java @@ -3,88 +3,128 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.opensearch.jobscheduler.transport; - -import org.opensearch.action.ActionRequest; -import org.opensearch.action.ActionRequestValidationException; -import org.opensearch.common.io.stream.StreamInput; -import org.opensearch.common.io.stream.StreamOutput; -import org.opensearch.common.unit.TimeValue; + package org.opensearch.jobscheduler.transport; + + import org.opensearch.action.ActionRequest; + import org.opensearch.action.ActionRequestValidationException; + import org.opensearch.common.io.stream.StreamInput; + import org.opensearch.common.io.stream.StreamOutput; + import org.opensearch.common.unit.TimeValue; + import org.opensearch.common.xcontent.XContentParser; +import org.opensearch.common.xcontent.XContentParserUtils; import org.opensearch.rest.RestRequest; - -import java.io.IOException; - -public class GetJobIndexRequest extends ActionRequest { - - private String jobIndex; - - private String jobParamAction; - - private String jobRunnerAction; - - private String extensionId; - - public GetJobIndexRequest(StreamInput in) throws IOException{ - super(in); - jobIndex=in.readString(); - jobParamAction=in.readString(); - jobRunnerAction=in.readString(); - extensionId= in.readString(); - - } - - public GetJobIndexRequest(String jobIndex, String jobParamAction, String jobRunnerAction, String extensionId){ - super(); - this.jobIndex=jobIndex; - this.jobParamAction=jobParamAction; - this.jobRunnerAction=jobRunnerAction; - this.extensionId=extensionId; - } - - - @Override - public void writeTo(StreamOutput out) throws IOException { - super.writeTo(out); - out.writeString(jobIndex); - out.writeString(jobParamAction); - out.writeString(jobRunnerAction); - out.writeString(extensionId); - } - - public String getJobIndex() { - return jobIndex; - } - - public void setJobIndex(String jobIndex) { - this.jobIndex = jobIndex; - } - - public String getJobParamAction() { - return jobParamAction; - } - - public void setJobParamAction(String jobParamAction) { - this.jobParamAction = jobParamAction; - } - - public String getJobRunnerAction() { - return jobRunnerAction; - } - - public void setJobRunnerAction(String jobRunnerAction) { - this.jobRunnerAction = jobRunnerAction; - } - - public String getExtensionId() { - return extensionId; - } - - public void setExtensionId(String extensionId) { - this.extensionId = extensionId; - } - - @Override - public ActionRequestValidationException validate() { - return null; - } -} + + import java.io.IOException; + + public class GetJobIndexRequest extends ActionRequest { + + private static String jobIndex; + + private static String jobParamAction; + + private static String jobRunnerAction; + + private static String extensionId; + + public static final String JOB_INDEX = "job_index"; + + public static final String EXTENSION_ID = "extension_id"; + private static final String JOB_PARAM_ACTION = "job_param_action"; + public static final String JOB_RUNNER_ACTION = "job_runner_action"; + + public GetJobIndexRequest(StreamInput in) throws IOException{ + super(in); + jobIndex=in.readString(); + jobParamAction=in.readString(); + jobRunnerAction=in.readString(); + extensionId= in.readString(); + + } + + public GetJobIndexRequest(String jobIndex, String jobParamAction, String jobRunnerAction, String extensionId){ + super(); + this.jobIndex=jobIndex; + this.jobParamAction=jobParamAction; + this.jobRunnerAction=jobRunnerAction; + this.extensionId=extensionId; + } + + + @Override + public void writeTo(StreamOutput out) throws IOException { + super.writeTo(out); + out.writeString(jobIndex); + out.writeString(jobParamAction); + out.writeString(jobRunnerAction); + out.writeString(extensionId); + } + + public String getJobIndex() { + return jobIndex; + } + + public void setJobIndex(String jobIndex) { + this.jobIndex = jobIndex; + } + + public String getJobParamAction() { + return jobParamAction; + } + + public void setJobParamAction(String jobParamAction) { + this.jobParamAction = jobParamAction; + } + + public String getJobRunnerAction() { + return jobRunnerAction; + } + + public void setJobRunnerAction(String jobRunnerAction) { + this.jobRunnerAction = jobRunnerAction; + } + + public String getExtensionId() { + return extensionId; + } + + public void setExtensionId(String extensionId) { + this.extensionId = extensionId; + } + + @Override + public ActionRequestValidationException validate() { + return null; + } + + public static GetJobIndexRequest parse( + XContentParser parser) throws IOException { + + XContentParserUtils.ensureExpectedToken(XContentParser.Token.START_OBJECT, parser.currentToken(), parser); + while (parser.nextToken() != XContentParser.Token.END_OBJECT) { + String fieldName = parser.currentName(); + parser.nextToken(); + + switch (fieldName) { + case JOB_INDEX: + jobIndex = parser.text(); + break; + case JOB_PARAM_ACTION: + jobParamAction = parser.text(); + break; + case JOB_RUNNER_ACTION: + jobRunnerAction = parser.text(); + break; + case EXTENSION_ID: + extensionId = parser.text(); + break; + default: + parser.skipChildren(); + break; + } + + } + GetJobIndexRequest request = new GetJobIndexRequest(jobIndex,jobParamAction,jobRunnerAction,extensionId); + return request; + } + } + \ No newline at end of file diff --git a/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportAction.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportAction.java index 3e615425..f273f61e 100644 --- a/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportAction.java +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportAction.java @@ -13,53 +13,28 @@ import org.opensearch.common.inject.Inject; import org.opensearch.jobscheduler.model.JobDetails; import org.opensearch.rest.RestRequest; +import org.opensearch.rest.RestStatus; import org.opensearch.tasks.Task; import org.opensearch.transport.TransportService; -import java.util.HashMap; -import java.util.Map; - import static org.opensearch.jobscheduler.utils.RestHandlerUtils.wrapRestActionListener; public class GetJobIndexTransportAction extends HandledTransportAction { private static final Logger logger = LogManager.getLogger(GetJobIndexTransportAction.class); - private HashMap jobDetailsHashMap; - - private String extensionId; @Inject - public GetJobIndexTransportAction(String actionName, TransportService transportService, ActionFilters actionFilters, HashMap jobDetailsHashMap, String extensionId) { + public GetJobIndexTransportAction(String actionName, TransportService transportService, ActionFilters actionFilters) { super(GetJobIndexAction.NAME, transportService, actionFilters, GetJobIndexRequest::new); - this.jobDetailsHashMap= jobDetailsHashMap; - this.extensionId=extensionId; } @Override protected void doExecute(Task task, GetJobIndexRequest request, ActionListener actionListener) { - - ActionListener listener = wrapRestActionListener(actionListener, ""); - - try{ - JobDetails jobDetails = new JobDetails(); - jobDetails.setJobIndex(request.getJobIndex()); - jobDetails.setJobParamAction(request.getJobParamAction()); - request.setJobRunnerAction(request.getJobRunnerAction()); - - jobDetailsHashMap.put(extensionId,jobDetails); - - logger.info("Job Details Map size : "+jobDetailsHashMap.size() ); - for (Map.Entry map:jobDetailsHashMap.entrySet()){ - logger.info("Key is: "+map.getValue()+" Value is : "+map.getValue().toString()); - } - - } catch (Exception e) { - //logger.info(e); - listener.onFailure(e); - } - + ActionListener listener = wrapRestActionListener(actionListener, "Failed to fetch job index for extensionId :"+request.getExtensionId()); + GetJobDetailsResponse response = new GetJobDetailsResponse(RestStatus.OK,"success"); + listener.onResponse(response); } } diff --git a/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeRequest.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeRequest.java index 94dcc2a1..5dbe9b2f 100644 --- a/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeRequest.java +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeRequest.java @@ -3,60 +3,90 @@ * SPDX-License-Identifier: Apache-2.0 */ -package org.opensearch.jobscheduler.transport; + package org.opensearch.jobscheduler.transport; -import org.opensearch.action.ActionRequest; -import org.opensearch.action.ActionRequestValidationException; -import org.opensearch.common.io.stream.StreamInput; -import org.opensearch.common.io.stream.StreamOutput; -import org.opensearch.common.unit.TimeValue; -import org.opensearch.rest.RestRequest; - -import java.io.IOException; - -public class GetJobTypeRequest extends ActionRequest { - - private String jobType; - - private String extensionId; - - public GetJobTypeRequest(String jobType,String extensionId){ - super(); - this.jobType=jobType; - this.extensionId=extensionId; - } - - public GetJobTypeRequest(StreamInput in) throws IOException { - super(in); - jobType=in.readString(); - extensionId=in.readString(); - } - - @Override - public void writeTo(StreamOutput out) throws IOException { - super.writeTo(out); - out.writeString(jobType); - out.writeString(extensionId); - } - - public String getJobType() { - return jobType; - } - - public void setJobType(String jobType) { - this.jobType = jobType; - } - - public String getExtensionId() { - return extensionId; - } - - public void setExtensionId(String extensionId) { - this.extensionId = extensionId; - } - - @Override - public ActionRequestValidationException validate() { - return null; - } -} + import org.opensearch.action.ActionRequest; + import org.opensearch.action.ActionRequestValidationException; + import org.opensearch.common.io.stream.StreamInput; + import org.opensearch.common.io.stream.StreamOutput; + import org.opensearch.common.unit.TimeValue; + import org.opensearch.common.xcontent.XContentParser; + import org.opensearch.rest.RestRequest; + + import java.io.IOException; + + public class GetJobTypeRequest extends ActionRequest { + + private static String jobType; + + private static String extensionId; + + public static final String JOB_TYPE = "job_type"; + + public static final String EXTENSION_ID = "extension_id"; + + public GetJobTypeRequest(String jobType,String extensionId){ + super(); + this.jobType=jobType; + this.extensionId=extensionId; + } + + public GetJobTypeRequest(StreamInput in) throws IOException { + super(in); + jobType=in.readString(); + extensionId=in.readString(); + } + + @Override + public void writeTo(StreamOutput out) throws IOException { + super.writeTo(out); + out.writeString(jobType); + out.writeString(extensionId); + } + + public String getJobType() { + return jobType; + } + + public void setJobType(String jobType) { + this.jobType = jobType; + } + + public String getExtensionId() { + return extensionId; + } + + public void setExtensionId(String extensionId) { + this.extensionId = extensionId; + } + + @Override + public ActionRequestValidationException validate() { + return null; + } + + public static GetJobTypeRequest parse( + XContentParser parser) throws IOException { + + while (parser.nextToken() != XContentParser.Token.END_OBJECT) { + String fieldName = parser.currentName(); + parser.nextToken(); + + switch (fieldName) { + case JOB_TYPE: + jobType = parser.text(); + break; + case EXTENSION_ID: + extensionId = parser.text(); + break; + default: + parser.skipChildren(); + break; + } + + } + GetJobTypeRequest request = new GetJobTypeRequest(jobType,extensionId); + return request; + } + } + \ No newline at end of file diff --git a/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportAction.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportAction.java index 1f983f45..ad0e2182 100644 --- a/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportAction.java +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportAction.java @@ -13,6 +13,7 @@ import org.opensearch.common.inject.Inject; import org.opensearch.common.io.stream.Writeable; import org.opensearch.jobscheduler.model.JobDetails; +import org.opensearch.rest.RestStatus; import org.opensearch.tasks.Task; import org.opensearch.transport.TransportService; @@ -23,34 +24,16 @@ public class GetJobTypeTransportAction extends HandledTransportAction { private static final Logger LOG = LogManager.getLogger(GetJobTypeTransportAction.class); - private HashMap jobDetailsHashMap; - - private String extensionId; @Inject - public GetJobTypeTransportAction(String actionName, TransportService transportService, ActionFilters actionFilters, HashMap jobDetailsHashMap, String extensionId) { + public GetJobTypeTransportAction(String actionName, TransportService transportService, ActionFilters actionFilters) { super(GetJobTypeAction.NAME, transportService, actionFilters, GetJobTypeRequest::new); - this.jobDetailsHashMap=jobDetailsHashMap; - this.extensionId=extensionId; } @Override protected void doExecute(Task task, GetJobTypeRequest request, ActionListener actionListener) { - ActionListener listener = wrapRestActionListener(actionListener, ""); - - try{ - JobDetails jobDetails = jobDetailsHashMap.get(extensionId); - jobDetails.setJobType(request.getJobType()); - jobDetailsHashMap.put(extensionId,jobDetails); - - logger.info("Job Details Map size : "+jobDetailsHashMap.size() ); - for (Map.Entry map:jobDetailsHashMap.entrySet()){ - logger.info("Key is: "+map.getValue()+" Value is : "+map.getValue().toString()); - } - } catch (Exception e) { -// LOG.error(e); - listener.onFailure(e); - } - + ActionListener listener = wrapRestActionListener(actionListener, "Failed to fetch job type for extensionId :"+request.getExtensionId()); + GetJobDetailsResponse response = new GetJobDetailsResponse(RestStatus.OK,"success"); + listener.onResponse(response); } } diff --git a/src/test/java/org/opensearch/jobscheduler/TestHelpers.java b/src/test/java/org/opensearch/jobscheduler/TestHelpers.java new file mode 100644 index 00000000..fd3c411e --- /dev/null +++ b/src/test/java/org/opensearch/jobscheduler/TestHelpers.java @@ -0,0 +1,24 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + + package org.opensearch.jobscheduler; + + import org.opensearch.common.bytes.BytesReference; + import org.opensearch.common.xcontent.XContentBuilder; + import org.opensearch.common.xcontent.XContentType; + + import java.io.IOException; + + public class TestHelpers { + + public static XContentBuilder builder() throws IOException { + return XContentBuilder.builder(XContentType.JSON.xContent()); + } + + public static String xContentBuilderToString(XContentBuilder builder) { + return BytesReference.bytes(builder).utf8ToString(); + } + } + \ No newline at end of file diff --git a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java new file mode 100644 index 00000000..9a18f634 --- /dev/null +++ b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java @@ -0,0 +1,82 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + + package org.opensearch.jobscheduler.rest; + + import org.apache.lucene.util.BytesRef; + import org.apache.lucene.util.BytesRefIterator; + import org.junit.Assert; + import org.junit.Before; + import org.junit.Test; + import org.opensearch.client.node.NodeClient; + import org.opensearch.common.bytes.BytesArray; + import org.opensearch.common.bytes.BytesReference; + import org.opensearch.common.io.stream.StreamInput; + import org.opensearch.common.xcontent.ToXContent; + import org.opensearch.common.xcontent.XContentBuilder; + import org.opensearch.common.xcontent.XContentType; + import org.opensearch.jobscheduler.model.JobDetails; + import org.opensearch.rest.RestHandler; + import org.opensearch.rest.RestRequest; + import org.opensearch.test.OpenSearchTestCase; + import org.opensearch.test.rest.FakeRestChannel; + import org.opensearch.test.rest.FakeRestRequest; + + import java.io.IOException; + import java.io.OutputStream; + import java.util.HashMap; + import java.util.List; + import java.util.Map; + + import static org.hamcrest.Matchers.equalTo; + import static org.mockito.Mockito.mock; + + public class RestGetJobIndexActionTests extends OpenSearchTestCase { + + private RestGetJobIndexAction action; + + public HashMap jobDetailsHashMap; + + @Before + public void setUp() throws Exception { + super.setUp(); + jobDetailsHashMap=new HashMap<>(); + action= new RestGetJobIndexAction(jobDetailsHashMap); + } + + + @Test + public void getNameTests(){ + String name=action.getName(); + Assert.assertEquals("get_job_index_action",name); + } + + + @Test + public void getRoutes(){ + List routes=action.routes(); + + Assert.assertEquals("/_plugins/_job_scheduler/_get/_job_index",routes.get(0).getPath()); + } + + @Test + public void prepareRequestTest() throws IOException { + + String content= "{\"job_index\":\"demo_job_index\",\"job_runner_action\":\"action\",\"job_param_action\":\"param_action\",\"extension_id\":\"extension_id\"}"; + Map params= new HashMap<>(); + FakeRestRequest request = new FakeRestRequest.Builder(xContentRegistry()).withMethod(RestRequest.Method.PUT) + .withPath("/_plugins/_job_scheduler/_get/_job_index") + .withParams(params) + .withContent(new BytesArray(content), XContentType.JSON) + .build(); + + final FakeRestChannel channel = new FakeRestChannel(request, true, 0); + action.prepareRequest(request, mock(NodeClient.class)); + + assertThat(channel.responses().get(), equalTo(0)); + assertThat(channel.errors().get(), equalTo(0)); + } + } + \ No newline at end of file diff --git a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java new file mode 100644 index 00000000..14548a6e --- /dev/null +++ b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java @@ -0,0 +1,76 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + + package org.opensearch.jobscheduler.rest; + + import org.junit.Assert; + import org.junit.Before; + import org.junit.Test; + import org.opensearch.client.node.NodeClient; + import org.opensearch.common.bytes.BytesArray; + import org.opensearch.common.xcontent.XContentType; + import org.opensearch.jobscheduler.model.JobDetails; + import org.opensearch.rest.RestHandler; + import org.opensearch.rest.RestRequest; + import org.opensearch.test.OpenSearchTestCase; + import org.opensearch.test.rest.FakeRestChannel; + import org.opensearch.test.rest.FakeRestRequest; + + import java.io.IOException; + import java.util.HashMap; + import java.util.List; + import java.util.Map; + + import static org.hamcrest.Matchers.equalTo; + import static org.mockito.Mockito.mock; + + public class RestGetJobTypeActionTests extends OpenSearchTestCase { + + private RestGetJobTypeAction action; + + public HashMap jobDetailsHashMap; + + @Before + public void setUp() throws Exception { + super.setUp(); + jobDetailsHashMap=new HashMap<>(); + action= new RestGetJobTypeAction(jobDetailsHashMap); + } + + + @Test + public void getNameTests(){ + String name=action.getName(); + Assert.assertEquals("get_job_type_action",name); + } + + + @Test + public void getRoutes(){ + List routes=action.routes(); + + Assert.assertEquals("/_plugins/_job_scheduler/_get/_job_type",routes.get(0).getPath()); + } + + @Test + public void prepareRequestTest() throws IOException { + + String content= "{\"job_type\":\"demo_job_type\",\"extension_id\":\"extension_id\"}"; + Map params= new HashMap<>(); + FakeRestRequest request = new FakeRestRequest.Builder(xContentRegistry()).withMethod(RestRequest.Method.PUT) + .withPath("/_plugins/_job_scheduler/_get/_job_type") + .withParams(params) + .withContent(new BytesArray(content), XContentType.JSON) + .build(); + + final FakeRestChannel channel = new FakeRestChannel(request, true, 0); + action.prepareRequest(request, mock(NodeClient.class)); + + assertThat(channel.responses().get(), equalTo(0)); + assertThat(channel.errors().get(), equalTo(0)); + } + } + + \ No newline at end of file diff --git a/src/test/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponseTests.java b/src/test/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponseTests.java new file mode 100644 index 00000000..a552a873 --- /dev/null +++ b/src/test/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponseTests.java @@ -0,0 +1,28 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + + package org.opensearch.jobscheduler.transport; + + import org.junit.Test; + import org.opensearch.common.xcontent.ToXContent; + import org.opensearch.jobscheduler.TestHelpers; + import org.opensearch.rest.RestStatus; + import org.opensearch.test.OpenSearchTestCase; + + import java.io.IOException; + + + public class GetJobDetailsResponseTests extends OpenSearchTestCase { + + + @Test + public void testToXContent() throws IOException { + GetJobDetailsResponse getJobDetailsResponse = new GetJobDetailsResponse(RestStatus.OK,"success"); + String response= TestHelpers.xContentBuilderToString(getJobDetailsResponse.toXContent(TestHelpers.builder(), ToXContent.EMPTY_PARAMS)); + assertEquals("{\"response\":\"success\"}", response ); + } + + } + \ No newline at end of file diff --git a/src/test/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportActionTests.java b/src/test/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportActionTests.java new file mode 100644 index 00000000..65ab614d --- /dev/null +++ b/src/test/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportActionTests.java @@ -0,0 +1,57 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + + package org.opensearch.jobscheduler.transport; + + import org.junit.Assert; + import org.junit.Before; + import org.junit.Test; + import org.opensearch.action.ActionListener; + import org.opensearch.action.support.ActionFilters; + import org.opensearch.tasks.Task; + import org.opensearch.test.OpenSearchIntegTestCase; + import org.opensearch.test.OpenSearchTestCase; + import org.opensearch.transport.TransportService; + + import static org.mockito.Mockito.mock; + + public class GetJobIndexTransportActionTests extends OpenSearchTestCase { + + private GetJobIndexTransportAction action; + + private Task task; + + private GetJobIndexRequest request; + + private ActionListener response; + + @Before + public void setUp() throws Exception { + super.setUp(); + action = new GetJobIndexTransportAction("",mock(TransportService.class), + mock(ActionFilters.class)); + request= new GetJobIndexRequest("demo_job_index","job_param_action","job_runner_action","extension_id"); + task = mock(Task.class); + response = new ActionListener() { + @Override + public void onResponse(GetJobDetailsResponse jobDetailsResponse) { + // onResponse will not be called as we do not have the AD index + Assert.assertEquals("success",jobDetailsResponse.getResponse()); + } + + @Override + public void onFailure(Exception e) { + // Assert.assertTrue(true); + } + }; + + } + + @Test + public void testGetJobIndexTransportAction() { + action.doExecute(task, request, response); + } + } + \ No newline at end of file diff --git a/src/test/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportActionTests.java b/src/test/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportActionTests.java new file mode 100644 index 00000000..689eaf5e --- /dev/null +++ b/src/test/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportActionTests.java @@ -0,0 +1,57 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + + package org.opensearch.jobscheduler.transport; + + import org.junit.Assert; + import org.junit.Before; + import org.junit.Test; + import org.opensearch.action.ActionListener; + import org.opensearch.action.support.ActionFilters; + import org.opensearch.tasks.Task; + import org.opensearch.test.OpenSearchTestCase; + import org.opensearch.transport.TransportService; + + import static org.mockito.Mockito.mock; + + public class GetJobTypeTransportActionTests extends OpenSearchTestCase { + + private GetJobTypeTransportAction action; + + private Task task; + + private GetJobTypeRequest request; + + private ActionListener response; + + @Before + public void setUp() throws Exception { + super.setUp(); + action = new GetJobTypeTransportAction("",mock(TransportService.class), + mock(ActionFilters.class)); + request= new GetJobTypeRequest("demo_job_type","extension_id"); + task = mock(Task.class); + response = new ActionListener() { + @Override + public void onResponse(GetJobDetailsResponse jobDetailsResponse) { + // onResponse will not be called as we do not have the AD index + Assert.assertEquals("success",jobDetailsResponse.getResponse()); + } + + @Override + public void onFailure(Exception e) { + // Assert.assertTrue(true); + } + }; + + } + + @Test + public void testGetJobTypeTransportAction() { + action.doExecute(task, request, response); + } + } + + \ No newline at end of file From 97e783b6b190005e72844dc470ee7249ebe508fb Mon Sep 17 00:00:00 2001 From: Varun Jain Date: Thu, 29 Dec 2022 11:28:54 -0800 Subject: [PATCH 04/26] Communication mechanism for JS Signed-off-by: Varun Jain --- .../jobscheduler/transport/GetJobDetailsResponse.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponse.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponse.java index da50c8d4..ac1d9525 100644 --- a/src/main/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponse.java +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponse.java @@ -36,6 +36,16 @@ public void writeTo(StreamOutput out) throws IOException { out.writeEnum(restStatus); } + + public RestStatus getRestStatus() { + return restStatus; + } + + public String getResponse() { + return response; + } + + @Override public XContentBuilder toXContent(XContentBuilder xContentBuilder, Params params) throws IOException { return xContentBuilder From b97d08ab61ae8e3958be68bd508876bfbc812853 Mon Sep 17 00:00:00 2001 From: Varun Jain Date: Thu, 29 Dec 2022 12:14:24 -0800 Subject: [PATCH 05/26] Communication mechanism for JS Signed-off-by: Varun Jain --- .../jobscheduler/JobSchedulerPlugin.java | 16 ++++++++++++++-- .../transport/GetJobIndexRequest.java | 3 +-- .../transport/GetJobTypeRequest.java | 3 +-- .../org/opensearch/jobscheduler/TestHelpers.java | 3 +-- .../rest/RestGetJobIndexActionTests.java | 3 +-- .../rest/RestGetJobTypeActionTests.java | 4 +--- .../transport/GetJobDetailsResponseTests.java | 3 +-- .../GetJobIndexTransportActionTests.java | 3 +-- .../GetJobTypeTransportActionTests.java | 4 +--- 9 files changed, 22 insertions(+), 20 deletions(-) diff --git a/src/main/java/org/opensearch/jobscheduler/JobSchedulerPlugin.java b/src/main/java/org/opensearch/jobscheduler/JobSchedulerPlugin.java index c2a4eb95..32ba2b66 100644 --- a/src/main/java/org/opensearch/jobscheduler/JobSchedulerPlugin.java +++ b/src/main/java/org/opensearch/jobscheduler/JobSchedulerPlugin.java @@ -9,7 +9,11 @@ import org.opensearch.action.ActionResponse; import org.opensearch.client.node.NodeClient; import org.opensearch.cluster.node.DiscoveryNodes; -import org.opensearch.common.settings.*; +import org.opensearch.common.settings.Setting; +import org.opensearch.common.settings.Settings; +import org.opensearch.common.settings.ClusterSettings; +import org.opensearch.common.settings.IndexScopedSettings; +import org.opensearch.common.settings.SettingsFilter; import org.opensearch.extensions.ExtensionsSettings; import org.opensearch.jobscheduler.model.JobDetails; import org.opensearch.jobscheduler.rest.RestGetJobIndexAction; @@ -53,7 +57,15 @@ import org.opensearch.watcher.ResourceWatcherService; import java.io.IOException; -import java.util.*; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Arrays; +import java.util.ArrayList; import java.util.function.Supplier; import com.google.common.collect.ImmutableList; diff --git a/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java index 24072351..fa8bae19 100644 --- a/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java @@ -126,5 +126,4 @@ public static GetJobIndexRequest parse( GetJobIndexRequest request = new GetJobIndexRequest(jobIndex,jobParamAction,jobRunnerAction,extensionId); return request; } - } - \ No newline at end of file + } \ No newline at end of file diff --git a/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeRequest.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeRequest.java index 5dbe9b2f..b71970b7 100644 --- a/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeRequest.java +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeRequest.java @@ -88,5 +88,4 @@ public static GetJobTypeRequest parse( GetJobTypeRequest request = new GetJobTypeRequest(jobType,extensionId); return request; } - } - \ No newline at end of file + } \ No newline at end of file diff --git a/src/test/java/org/opensearch/jobscheduler/TestHelpers.java b/src/test/java/org/opensearch/jobscheduler/TestHelpers.java index fd3c411e..03bdc812 100644 --- a/src/test/java/org/opensearch/jobscheduler/TestHelpers.java +++ b/src/test/java/org/opensearch/jobscheduler/TestHelpers.java @@ -20,5 +20,4 @@ public static XContentBuilder builder() throws IOException { public static String xContentBuilderToString(XContentBuilder builder) { return BytesReference.bytes(builder).utf8ToString(); } - } - \ No newline at end of file + } \ No newline at end of file diff --git a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java index 9a18f634..d63e56e3 100644 --- a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java +++ b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java @@ -78,5 +78,4 @@ public void prepareRequestTest() throws IOException { assertThat(channel.responses().get(), equalTo(0)); assertThat(channel.errors().get(), equalTo(0)); } - } - \ No newline at end of file + } \ No newline at end of file diff --git a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java index 14548a6e..c599bf7a 100644 --- a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java +++ b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java @@ -71,6 +71,4 @@ public void prepareRequestTest() throws IOException { assertThat(channel.responses().get(), equalTo(0)); assertThat(channel.errors().get(), equalTo(0)); } - } - - \ No newline at end of file + } \ No newline at end of file diff --git a/src/test/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponseTests.java b/src/test/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponseTests.java index a552a873..aeb7627c 100644 --- a/src/test/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponseTests.java +++ b/src/test/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponseTests.java @@ -24,5 +24,4 @@ public void testToXContent() throws IOException { assertEquals("{\"response\":\"success\"}", response ); } - } - \ No newline at end of file + } \ No newline at end of file diff --git a/src/test/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportActionTests.java b/src/test/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportActionTests.java index 65ab614d..17975963 100644 --- a/src/test/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportActionTests.java +++ b/src/test/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportActionTests.java @@ -53,5 +53,4 @@ public void onFailure(Exception e) { public void testGetJobIndexTransportAction() { action.doExecute(task, request, response); } - } - \ No newline at end of file + } \ No newline at end of file diff --git a/src/test/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportActionTests.java b/src/test/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportActionTests.java index 689eaf5e..9c060e53 100644 --- a/src/test/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportActionTests.java +++ b/src/test/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportActionTests.java @@ -52,6 +52,4 @@ public void onFailure(Exception e) { public void testGetJobTypeTransportAction() { action.doExecute(task, request, response); } - } - - \ No newline at end of file + } \ No newline at end of file From 92e5a15d519fffe54b6b42f330cb487302b8d1c3 Mon Sep 17 00:00:00 2001 From: Varun Jain Date: Thu, 29 Dec 2022 12:21:34 -0800 Subject: [PATCH 06/26] Communication mechanism for JS Signed-off-by: Varun Jain --- .../opensearch/jobscheduler/transport/GetJobIndexRequest.java | 3 ++- .../opensearch/jobscheduler/transport/GetJobTypeRequest.java | 3 ++- src/test/java/org/opensearch/jobscheduler/TestHelpers.java | 3 ++- .../jobscheduler/rest/RestGetJobIndexActionTests.java | 3 ++- .../jobscheduler/rest/RestGetJobTypeActionTests.java | 3 ++- .../jobscheduler/transport/GetJobDetailsResponseTests.java | 3 ++- .../transport/GetJobIndexTransportActionTests.java | 3 ++- .../jobscheduler/transport/GetJobTypeTransportActionTests.java | 3 ++- 8 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java index fa8bae19..24072351 100644 --- a/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java @@ -126,4 +126,5 @@ public static GetJobIndexRequest parse( GetJobIndexRequest request = new GetJobIndexRequest(jobIndex,jobParamAction,jobRunnerAction,extensionId); return request; } - } \ No newline at end of file + } + \ No newline at end of file diff --git a/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeRequest.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeRequest.java index b71970b7..5dbe9b2f 100644 --- a/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeRequest.java +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeRequest.java @@ -88,4 +88,5 @@ public static GetJobTypeRequest parse( GetJobTypeRequest request = new GetJobTypeRequest(jobType,extensionId); return request; } - } \ No newline at end of file + } + \ No newline at end of file diff --git a/src/test/java/org/opensearch/jobscheduler/TestHelpers.java b/src/test/java/org/opensearch/jobscheduler/TestHelpers.java index 03bdc812..fd3c411e 100644 --- a/src/test/java/org/opensearch/jobscheduler/TestHelpers.java +++ b/src/test/java/org/opensearch/jobscheduler/TestHelpers.java @@ -20,4 +20,5 @@ public static XContentBuilder builder() throws IOException { public static String xContentBuilderToString(XContentBuilder builder) { return BytesReference.bytes(builder).utf8ToString(); } - } \ No newline at end of file + } + \ No newline at end of file diff --git a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java index d63e56e3..eda040e8 100644 --- a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java +++ b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java @@ -78,4 +78,5 @@ public void prepareRequestTest() throws IOException { assertThat(channel.responses().get(), equalTo(0)); assertThat(channel.errors().get(), equalTo(0)); } - } \ No newline at end of file + } + \ No newline at end of file diff --git a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java index c599bf7a..f9146bd4 100644 --- a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java +++ b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java @@ -71,4 +71,5 @@ public void prepareRequestTest() throws IOException { assertThat(channel.responses().get(), equalTo(0)); assertThat(channel.errors().get(), equalTo(0)); } - } \ No newline at end of file + } + \ No newline at end of file diff --git a/src/test/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponseTests.java b/src/test/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponseTests.java index aeb7627c..a552a873 100644 --- a/src/test/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponseTests.java +++ b/src/test/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponseTests.java @@ -24,4 +24,5 @@ public void testToXContent() throws IOException { assertEquals("{\"response\":\"success\"}", response ); } - } \ No newline at end of file + } + \ No newline at end of file diff --git a/src/test/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportActionTests.java b/src/test/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportActionTests.java index 17975963..65ab614d 100644 --- a/src/test/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportActionTests.java +++ b/src/test/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportActionTests.java @@ -53,4 +53,5 @@ public void onFailure(Exception e) { public void testGetJobIndexTransportAction() { action.doExecute(task, request, response); } - } \ No newline at end of file + } + \ No newline at end of file diff --git a/src/test/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportActionTests.java b/src/test/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportActionTests.java index 9c060e53..886a64c3 100644 --- a/src/test/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportActionTests.java +++ b/src/test/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportActionTests.java @@ -52,4 +52,5 @@ public void onFailure(Exception e) { public void testGetJobTypeTransportAction() { action.doExecute(task, request, response); } - } \ No newline at end of file + } + \ No newline at end of file From da64ca75382f3680de222820ed1eee431243ede0 Mon Sep 17 00:00:00 2001 From: Varun Jain Date: Thu, 29 Dec 2022 13:48:19 -0800 Subject: [PATCH 07/26] Commnunication Mechanism for JS Signed-off-by: Varun Jain --- .../jobscheduler/JobSchedulerPlugin.java | 36 +++++---- .../rest/RestGetJobIndexAction.java | 54 +++++-------- .../rest/RestGetJobTypeAction.java | 43 +++++----- .../transport/GetJobDetailsResponse.java | 15 +++- .../transport/GetJobIndexRequest.java | 47 ++++++++++- .../transport/GetJobIndexTransportAction.java | 35 ++------ .../transport/GetJobTypeRequest.java | 33 +++++++- .../transport/GetJobTypeTransportAction.java | 27 ++----- .../opensearch/jobscheduler/TestHelpers.java | 23 ++++++ .../rest/RestGetJobIndexActionTests.java | 81 +++++++++++++++++++ .../rest/RestGetJobTypeActionTests.java | 75 +++++++++++++++++ .../transport/GetJobDetailsResponseTests.java | 27 +++++++ .../GetJobIndexTransportActionTests.java | 56 +++++++++++++ .../GetJobTypeTransportActionTests.java | 56 +++++++++++++ 14 files changed, 478 insertions(+), 130 deletions(-) create mode 100644 src/test/java/org/opensearch/jobscheduler/TestHelpers.java create mode 100644 src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java create mode 100644 src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java create mode 100644 src/test/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponseTests.java create mode 100644 src/test/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportActionTests.java create mode 100644 src/test/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportActionTests.java diff --git a/src/main/java/org/opensearch/jobscheduler/JobSchedulerPlugin.java b/src/main/java/org/opensearch/jobscheduler/JobSchedulerPlugin.java index 5cefb4fa..48554b99 100644 --- a/src/main/java/org/opensearch/jobscheduler/JobSchedulerPlugin.java +++ b/src/main/java/org/opensearch/jobscheduler/JobSchedulerPlugin.java @@ -9,7 +9,11 @@ import org.opensearch.action.ActionResponse; import org.opensearch.client.node.NodeClient; import org.opensearch.cluster.node.DiscoveryNodes; -import org.opensearch.common.settings.*; +import org.opensearch.common.settings.Setting; +import org.opensearch.common.settings.Settings; +import org.opensearch.common.settings.ClusterSettings; +import org.opensearch.common.settings.IndexScopedSettings; +import org.opensearch.common.settings.SettingsFilter; import org.opensearch.extensions.ExtensionsSettings; import org.opensearch.jobscheduler.model.JobDetails; import org.opensearch.jobscheduler.rest.RestGetJobIndexAction; @@ -42,18 +46,22 @@ import org.opensearch.plugins.ExtensiblePlugin; import org.opensearch.plugins.Plugin; import org.opensearch.repositories.RepositoriesService; -import org.opensearch.rest.BaseRestHandler; import org.opensearch.rest.RestController; -import org.opensearch.rest.RestHandler; -import org.opensearch.rest.RestRequest; import org.opensearch.script.ScriptService; import org.opensearch.threadpool.ExecutorBuilder; import org.opensearch.threadpool.FixedExecutorBuilder; import org.opensearch.threadpool.ThreadPool; import org.opensearch.watcher.ResourceWatcherService; -import java.io.IOException; -import java.util.*; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Arrays; +import java.util.ArrayList; import java.util.function.Supplier; import com.google.common.collect.ImmutableList; @@ -185,12 +193,12 @@ public List getRestHandlers( return ImmutableList.of(restGetJobIndexAction,restGetJobTypeAction); } -// @Override -// public List> getActions() { -// return Arrays -// .asList( -// new ActionHandler<>(GetJobIndexAction.INSTANCE, GetJobIndexTransportAction.class), -// new ActionHandler<>(GetJobTypeAction.INSTANCE, GetJobTypeTransportAction.class) -// ); -// } + @Override + public List> getActions() { + return Arrays + .asList( + new ActionHandler<>(GetJobIndexAction.INSTANCE, GetJobIndexTransportAction.class), + new ActionHandler<>(GetJobTypeAction.INSTANCE, GetJobTypeTransportAction.class) + ); + } } diff --git a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java index 29dc99e2..61d11f0c 100644 --- a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java +++ b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java @@ -13,14 +13,21 @@ import org.opensearch.jobscheduler.JobSchedulerPlugin; import org.opensearch.jobscheduler.model.JobDetails; import org.opensearch.jobscheduler.transport.GetJobDetailsResponse; -import org.opensearch.rest.*; +import org.opensearch.jobscheduler.transport.GetJobIndexAction; +import org.opensearch.jobscheduler.transport.GetJobIndexRequest; + +import org.opensearch.rest.BaseRestHandler; +import org.opensearch.rest.RestChannel; +import org.opensearch.rest.RestRequest; +import org.opensearch.rest.RestStatus; +import org.opensearch.rest.RestResponse; +import org.opensearch.rest.BytesRestResponse; import org.opensearch.rest.action.RestResponseListener; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Locale; -import java.util.Map; import static java.util.Arrays.asList; import static java.util.Collections.unmodifiableList; @@ -51,38 +58,19 @@ public List routes() { @Override protected RestChannelConsumer prepareRequest(RestRequest restRequest, NodeClient client) throws IOException { - logger.info("In Prepare request method"); XContentParser parser = restRequest.contentParser(); ensureExpectedToken(XContentParser.Token.START_OBJECT, parser.nextToken(), parser); - String jobIndex; - String jobParamAction; - String jobRunnerAction; - String extensionId=null; - try{ - jobIndex = restRequest.param("jobIndex"); - jobParamAction= restRequest.param("jobParamAction"); - jobRunnerAction= restRequest.param("jobRunnerAction"); - extensionId= restRequest.param("extensionId"); - }catch (Exception e){ - logger.info("Failed get job index for extensionId "+extensionId, e); - return channel -> getJobIndexResponse(channel, RestStatus.BAD_REQUEST); - } - //GetJobIndexRequest getJobIndexRequest = new GetJobIndexRequest(jobIndex, jobParamAction,jobRunnerAction,extensionId); - - JobDetails jobDetails = jobDetailsHashMap.getOrDefault(extensionId,new JobDetails()); - jobDetails.setJobIndex(jobIndex); - jobDetails.setJobParamAction(jobParamAction); - jobDetails.setJobRunnerAction(jobRunnerAction); - - jobDetailsHashMap.put(extensionId,jobDetails); - - logger.info("Job Details Map size jobIndex: "+jobDetailsHashMap.size() ); - for (Map.Entry map:jobDetailsHashMap.entrySet()){ - logger.info("Key is: "+map.getValue()+" Value is : "+map.getValue().toString()); - } - - return channel -> getJobIndexResponse(channel, RestStatus.OK); + GetJobIndexRequest getJobIndexRequest = GetJobIndexRequest.parse(parser); + + JobDetails jobDetails = jobDetailsHashMap.getOrDefault(getJobIndexRequest.getExtensionId(),new JobDetails()); + jobDetails.setJobIndex(getJobIndexRequest.getJobIndex()); + jobDetails.setJobParamAction(getJobIndexRequest.getJobParamAction()); + jobDetails.setJobRunnerAction(getJobIndexRequest.getJobRunnerAction()); + + jobDetailsHashMap.put(getJobIndexRequest.getExtensionId(),jobDetails); + + return channel -> client.execute(GetJobIndexAction.INSTANCE,getJobIndexRequest,getJobIndexResponse(channel, RestStatus.OK)); } @@ -92,10 +80,10 @@ private RestResponseListener getJobIndexResponse( ) { return new RestResponseListener<>(channel) { @Override - public RestResponse buildResponse(GetJobDetailsResponse response) throws Exception { + public RestResponse buildResponse(GetJobDetailsResponse getJobDetailsResponse) throws Exception { BytesRestResponse bytesRestResponse = new BytesRestResponse( status, - response.toXContent(channel.newBuilder(), ToXContent.EMPTY_PARAMS) + getJobDetailsResponse.toXContent(channel.newBuilder(), ToXContent.EMPTY_PARAMS) ); return bytesRestResponse; } diff --git a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java index 15b58bdd..8da1d90f 100644 --- a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java +++ b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java @@ -12,8 +12,17 @@ import org.opensearch.common.xcontent.XContentParser; import org.opensearch.jobscheduler.JobSchedulerPlugin; import org.opensearch.jobscheduler.model.JobDetails; -import org.opensearch.jobscheduler.transport.*; -import org.opensearch.rest.*; +import org.opensearch.jobscheduler.transport.GetJobDetailsResponse; +import org.opensearch.jobscheduler.transport.GetJobTypeAction; +import org.opensearch.jobscheduler.transport.GetJobTypeRequest; + +import org.opensearch.rest.BaseRestHandler; +import org.opensearch.rest.RestChannel; +import org.opensearch.rest.RestRequest; +import org.opensearch.rest.RestStatus; +import org.opensearch.rest.RestResponse; +import org.opensearch.rest.BytesRestResponse; + import org.opensearch.rest.action.RestResponseListener; import java.io.IOException; @@ -48,34 +57,20 @@ public RestGetJobTypeAction(HashMap jobDetailsHashMap){ @Override public List routes() { - return unmodifiableList(asList(new Route(PUT, String.format(Locale.ROOT, "%s/%s", JobSchedulerPlugin.JS_BASE_URI, "get/_job_type")))); + return unmodifiableList(asList(new Route(PUT, String.format(Locale.ROOT, "%s/%s", JobSchedulerPlugin.JS_BASE_URI, "_get/_job_type")))); } @Override protected RestChannelConsumer prepareRequest(RestRequest restRequest, NodeClient client) throws IOException { XContentParser parser = restRequest.contentParser(); ensureExpectedToken(XContentParser.Token.START_OBJECT, parser.nextToken(), parser); - String jobType; - String extensionId=null; - try{ - jobType = restRequest.param("jobType"); - extensionId= restRequest.param("extensionId"); - }catch (Exception e){ - logger.info("Failed get job type for extensionId "+extensionId, e); - return channel -> getJobTypeResponse(channel, RestStatus.BAD_REQUEST); - } - - //GetJobTypeRequest getJobTypeRequest = new GetJobTypeRequest(jobType, extensionId); - JobDetails jobDetails = jobDetailsHashMap.getOrDefault(extensionId,new JobDetails()); - jobDetails.setJobType(jobType); - jobDetailsHashMap.put(extensionId,jobDetails); - - logger.info("Job Details Map size jobType: "+jobDetailsHashMap.size() ); - for (Map.Entry map:jobDetailsHashMap.entrySet()){ - logger.info("Key is: "+map.getValue()+" Value is : "+map.getValue().toString()); - } - - return channel -> getJobTypeResponse(channel, RestStatus.OK); + GetJobTypeRequest getJobTypeRequest = GetJobTypeRequest.parse(parser); + + JobDetails jobDetails = jobDetailsHashMap.getOrDefault(getJobTypeRequest.getExtensionId(),new JobDetails()); + jobDetails.setJobType(getJobTypeRequest.getJobType()); + jobDetailsHashMap.put(getJobTypeRequest.getExtensionId(),jobDetails); + + return channel -> client.execute(GetJobTypeAction.INSTANCE,getJobTypeRequest,getJobTypeResponse(channel, RestStatus.OK)); } private RestResponseListener getJobTypeResponse( diff --git a/src/main/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponse.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponse.java index a605dd2d..5ed400f1 100644 --- a/src/main/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponse.java +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponse.java @@ -17,14 +17,18 @@ public class GetJobDetailsResponse extends ActionResponse implements ToXContentObject { private final RestStatus restStatus; + private final String response; + private final static String RESPONSE="response"; public GetJobDetailsResponse(StreamInput in) throws IOException { super(in); restStatus = in.readEnum(RestStatus.class); + response= in.readString(); } - public GetJobDetailsResponse(RestStatus restStatus) { + public GetJobDetailsResponse(RestStatus restStatus, String response) { this.restStatus=restStatus; + this.response=response; } @Override @@ -32,10 +36,19 @@ public void writeTo(StreamOutput out) throws IOException { out.writeEnum(restStatus); } + public RestStatus getRestStatus() { + return restStatus; + } + + public String getResponse() { + return response; + } + @Override public XContentBuilder toXContent(XContentBuilder xContentBuilder, Params params) throws IOException { return xContentBuilder .startObject() + .field(RESPONSE, response) .endObject(); } } diff --git a/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java index 3a53e755..f7145aa5 100644 --- a/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java @@ -10,19 +10,27 @@ import org.opensearch.common.io.stream.StreamInput; import org.opensearch.common.io.stream.StreamOutput; import org.opensearch.common.unit.TimeValue; +import org.opensearch.common.xcontent.XContentParser; +import org.opensearch.common.xcontent.XContentParserUtils; import org.opensearch.rest.RestRequest; import java.io.IOException; public class GetJobIndexRequest extends ActionRequest { - private String jobIndex; + private static String jobIndex; - private String jobParamAction; + private static String jobParamAction; - private String jobRunnerAction; + private static String jobRunnerAction; - private String extensionId; + private static String extensionId; + + public static final String JOB_INDEX = "job_index"; + + public static final String EXTENSION_ID = "extension_id"; + private static final String JOB_PARAM_ACTION = "job_param_action"; + public static final String JOB_RUNNER_ACTION = "job_runner_action"; public GetJobIndexRequest(StreamInput in) throws IOException{ super(in); @@ -87,4 +95,35 @@ public void setExtensionId(String extensionId) { public ActionRequestValidationException validate() { return null; } + + public static GetJobIndexRequest parse( + XContentParser parser) throws IOException { + + XContentParserUtils.ensureExpectedToken(XContentParser.Token.START_OBJECT, parser.currentToken(), parser); + while (parser.nextToken() != XContentParser.Token.END_OBJECT) { + String fieldName = parser.currentName(); + parser.nextToken(); + + switch (fieldName) { + case JOB_INDEX: + jobIndex = parser.text(); + break; + case JOB_PARAM_ACTION: + jobParamAction = parser.text(); + break; + case JOB_RUNNER_ACTION: + jobRunnerAction = parser.text(); + break; + case EXTENSION_ID: + extensionId = parser.text(); + break; + default: + parser.skipChildren(); + break; + } + + } + GetJobIndexRequest request = new GetJobIndexRequest(jobIndex,jobParamAction,jobRunnerAction,extensionId); + return request; + } } diff --git a/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportAction.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportAction.java index 3e615425..f273f61e 100644 --- a/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportAction.java +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportAction.java @@ -13,53 +13,28 @@ import org.opensearch.common.inject.Inject; import org.opensearch.jobscheduler.model.JobDetails; import org.opensearch.rest.RestRequest; +import org.opensearch.rest.RestStatus; import org.opensearch.tasks.Task; import org.opensearch.transport.TransportService; -import java.util.HashMap; -import java.util.Map; - import static org.opensearch.jobscheduler.utils.RestHandlerUtils.wrapRestActionListener; public class GetJobIndexTransportAction extends HandledTransportAction { private static final Logger logger = LogManager.getLogger(GetJobIndexTransportAction.class); - private HashMap jobDetailsHashMap; - - private String extensionId; @Inject - public GetJobIndexTransportAction(String actionName, TransportService transportService, ActionFilters actionFilters, HashMap jobDetailsHashMap, String extensionId) { + public GetJobIndexTransportAction(String actionName, TransportService transportService, ActionFilters actionFilters) { super(GetJobIndexAction.NAME, transportService, actionFilters, GetJobIndexRequest::new); - this.jobDetailsHashMap= jobDetailsHashMap; - this.extensionId=extensionId; } @Override protected void doExecute(Task task, GetJobIndexRequest request, ActionListener actionListener) { - - ActionListener listener = wrapRestActionListener(actionListener, ""); - - try{ - JobDetails jobDetails = new JobDetails(); - jobDetails.setJobIndex(request.getJobIndex()); - jobDetails.setJobParamAction(request.getJobParamAction()); - request.setJobRunnerAction(request.getJobRunnerAction()); - - jobDetailsHashMap.put(extensionId,jobDetails); - - logger.info("Job Details Map size : "+jobDetailsHashMap.size() ); - for (Map.Entry map:jobDetailsHashMap.entrySet()){ - logger.info("Key is: "+map.getValue()+" Value is : "+map.getValue().toString()); - } - - } catch (Exception e) { - //logger.info(e); - listener.onFailure(e); - } - + ActionListener listener = wrapRestActionListener(actionListener, "Failed to fetch job index for extensionId :"+request.getExtensionId()); + GetJobDetailsResponse response = new GetJobDetailsResponse(RestStatus.OK,"success"); + listener.onResponse(response); } } diff --git a/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeRequest.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeRequest.java index 94dcc2a1..7426d268 100644 --- a/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeRequest.java +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeRequest.java @@ -10,15 +10,20 @@ import org.opensearch.common.io.stream.StreamInput; import org.opensearch.common.io.stream.StreamOutput; import org.opensearch.common.unit.TimeValue; +import org.opensearch.common.xcontent.XContentParser; import org.opensearch.rest.RestRequest; import java.io.IOException; public class GetJobTypeRequest extends ActionRequest { - private String jobType; + private static String jobType; - private String extensionId; + private static String extensionId; + + public static final String JOB_TYPE = "job_type"; + + public static final String EXTENSION_ID = "extension_id"; public GetJobTypeRequest(String jobType,String extensionId){ super(); @@ -59,4 +64,28 @@ public void setExtensionId(String extensionId) { public ActionRequestValidationException validate() { return null; } + + public static GetJobTypeRequest parse( + XContentParser parser) throws IOException { + + while (parser.nextToken() != XContentParser.Token.END_OBJECT) { + String fieldName = parser.currentName(); + parser.nextToken(); + + switch (fieldName) { + case JOB_TYPE: + jobType = parser.text(); + break; + case EXTENSION_ID: + extensionId = parser.text(); + break; + default: + parser.skipChildren(); + break; + } + + } + GetJobTypeRequest request = new GetJobTypeRequest(jobType,extensionId); + return request; + } } diff --git a/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportAction.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportAction.java index 1f983f45..ad0e2182 100644 --- a/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportAction.java +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportAction.java @@ -13,6 +13,7 @@ import org.opensearch.common.inject.Inject; import org.opensearch.common.io.stream.Writeable; import org.opensearch.jobscheduler.model.JobDetails; +import org.opensearch.rest.RestStatus; import org.opensearch.tasks.Task; import org.opensearch.transport.TransportService; @@ -23,34 +24,16 @@ public class GetJobTypeTransportAction extends HandledTransportAction { private static final Logger LOG = LogManager.getLogger(GetJobTypeTransportAction.class); - private HashMap jobDetailsHashMap; - - private String extensionId; @Inject - public GetJobTypeTransportAction(String actionName, TransportService transportService, ActionFilters actionFilters, HashMap jobDetailsHashMap, String extensionId) { + public GetJobTypeTransportAction(String actionName, TransportService transportService, ActionFilters actionFilters) { super(GetJobTypeAction.NAME, transportService, actionFilters, GetJobTypeRequest::new); - this.jobDetailsHashMap=jobDetailsHashMap; - this.extensionId=extensionId; } @Override protected void doExecute(Task task, GetJobTypeRequest request, ActionListener actionListener) { - ActionListener listener = wrapRestActionListener(actionListener, ""); - - try{ - JobDetails jobDetails = jobDetailsHashMap.get(extensionId); - jobDetails.setJobType(request.getJobType()); - jobDetailsHashMap.put(extensionId,jobDetails); - - logger.info("Job Details Map size : "+jobDetailsHashMap.size() ); - for (Map.Entry map:jobDetailsHashMap.entrySet()){ - logger.info("Key is: "+map.getValue()+" Value is : "+map.getValue().toString()); - } - } catch (Exception e) { -// LOG.error(e); - listener.onFailure(e); - } - + ActionListener listener = wrapRestActionListener(actionListener, "Failed to fetch job type for extensionId :"+request.getExtensionId()); + GetJobDetailsResponse response = new GetJobDetailsResponse(RestStatus.OK,"success"); + listener.onResponse(response); } } diff --git a/src/test/java/org/opensearch/jobscheduler/TestHelpers.java b/src/test/java/org/opensearch/jobscheduler/TestHelpers.java new file mode 100644 index 00000000..95e9d8e9 --- /dev/null +++ b/src/test/java/org/opensearch/jobscheduler/TestHelpers.java @@ -0,0 +1,23 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.opensearch.jobscheduler; + +import org.opensearch.common.bytes.BytesReference; +import org.opensearch.common.xcontent.XContentBuilder; +import org.opensearch.common.xcontent.XContentType; + +import java.io.IOException; + +public class TestHelpers { + + public static XContentBuilder builder() throws IOException { + return XContentBuilder.builder(XContentType.JSON.xContent()); + } + + public static String xContentBuilderToString(XContentBuilder builder) { + return BytesReference.bytes(builder).utf8ToString(); + } +} diff --git a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java new file mode 100644 index 00000000..eec23f2d --- /dev/null +++ b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java @@ -0,0 +1,81 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.opensearch.jobscheduler.rest; + +import org.apache.lucene.util.BytesRef; +import org.apache.lucene.util.BytesRefIterator; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.opensearch.client.node.NodeClient; +import org.opensearch.common.bytes.BytesArray; +import org.opensearch.common.bytes.BytesReference; +import org.opensearch.common.io.stream.StreamInput; +import org.opensearch.common.xcontent.ToXContent; +import org.opensearch.common.xcontent.XContentBuilder; +import org.opensearch.common.xcontent.XContentType; +import org.opensearch.jobscheduler.model.JobDetails; +import org.opensearch.rest.RestHandler; +import org.opensearch.rest.RestRequest; +import org.opensearch.test.OpenSearchTestCase; +import org.opensearch.test.rest.FakeRestChannel; +import org.opensearch.test.rest.FakeRestRequest; + +import java.io.IOException; +import java.io.OutputStream; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.hamcrest.Matchers.equalTo; +import static org.mockito.Mockito.mock; + +public class RestGetJobIndexActionTests extends OpenSearchTestCase { + + private RestGetJobIndexAction action; + + public HashMap jobDetailsHashMap; + + @Before + public void setUp() throws Exception { + super.setUp(); + jobDetailsHashMap=new HashMap<>(); + action= new RestGetJobIndexAction(jobDetailsHashMap); + } + + + @Test + public void getNameTests(){ + String name=action.getName(); + Assert.assertEquals("get_job_index_action",name); + } + + + @Test + public void getRoutes(){ + List routes=action.routes(); + + Assert.assertEquals("/_plugins/_job_scheduler/_get/_job_index",routes.get(0).getPath()); + } + + @Test + public void prepareRequestTest() throws IOException { + + String content= "{\"job_index\":\"demo_job_index\",\"job_runner_action\":\"action\",\"job_param_action\":\"param_action\",\"extension_id\":\"extension_id\"}"; + Map params= new HashMap<>(); + FakeRestRequest request = new FakeRestRequest.Builder(xContentRegistry()).withMethod(RestRequest.Method.PUT) + .withPath("/_plugins/_job_scheduler/_get/_job_index") + .withParams(params) + .withContent(new BytesArray(content), XContentType.JSON) + .build(); + + final FakeRestChannel channel = new FakeRestChannel(request, true, 0); + action.prepareRequest(request, mock(NodeClient.class)); + + assertThat(channel.responses().get(), equalTo(0)); + assertThat(channel.errors().get(), equalTo(0)); + } +} diff --git a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java new file mode 100644 index 00000000..6473a701 --- /dev/null +++ b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java @@ -0,0 +1,75 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.opensearch.jobscheduler.rest; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.opensearch.client.node.NodeClient; +import org.opensearch.common.bytes.BytesArray; +import org.opensearch.common.xcontent.XContentType; +import org.opensearch.jobscheduler.model.JobDetails; +import org.opensearch.rest.RestHandler; +import org.opensearch.rest.RestRequest; +import org.opensearch.test.OpenSearchTestCase; +import org.opensearch.test.rest.FakeRestChannel; +import org.opensearch.test.rest.FakeRestRequest; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.hamcrest.Matchers.equalTo; +import static org.mockito.Mockito.mock; + +public class RestGetJobTypeActionTests extends OpenSearchTestCase { + + private RestGetJobTypeAction action; + + public HashMap jobDetailsHashMap; + + @Before + public void setUp() throws Exception { + super.setUp(); + jobDetailsHashMap=new HashMap<>(); + action= new RestGetJobTypeAction(jobDetailsHashMap); + } + + + @Test + public void getNameTests(){ + String name=action.getName(); + Assert.assertEquals("get_job_type_action",name); + } + + + @Test + public void getRoutes(){ + List routes=action.routes(); + + Assert.assertEquals("/_plugins/_job_scheduler/_get/_job_type",routes.get(0).getPath()); + } + + @Test + public void prepareRequestTest() throws IOException { + + String content= "{\"job_type\":\"demo_job_type\",\"extension_id\":\"extension_id\"}"; + Map params= new HashMap<>(); + FakeRestRequest request = new FakeRestRequest.Builder(xContentRegistry()).withMethod(RestRequest.Method.PUT) + .withPath("/_plugins/_job_scheduler/_get/_job_type") + .withParams(params) + .withContent(new BytesArray(content), XContentType.JSON) + .build(); + + final FakeRestChannel channel = new FakeRestChannel(request, true, 0); + action.prepareRequest(request, mock(NodeClient.class)); + + assertThat(channel.responses().get(), equalTo(0)); + assertThat(channel.errors().get(), equalTo(0)); + } +} + diff --git a/src/test/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponseTests.java b/src/test/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponseTests.java new file mode 100644 index 00000000..7739a765 --- /dev/null +++ b/src/test/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponseTests.java @@ -0,0 +1,27 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.opensearch.jobscheduler.transport; + +import org.junit.Test; +import org.opensearch.common.xcontent.ToXContent; +import org.opensearch.jobscheduler.TestHelpers; +import org.opensearch.rest.RestStatus; +import org.opensearch.test.OpenSearchTestCase; + +import java.io.IOException; + + +public class GetJobDetailsResponseTests extends OpenSearchTestCase { + + + @Test + public void testToXContent() throws IOException { + GetJobDetailsResponse getJobDetailsResponse = new GetJobDetailsResponse(RestStatus.OK,"success"); + String response= TestHelpers.xContentBuilderToString(getJobDetailsResponse.toXContent(TestHelpers.builder(), ToXContent.EMPTY_PARAMS)); + assertEquals("{\"response\":\"success\"}", response ); + } + +} diff --git a/src/test/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportActionTests.java b/src/test/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportActionTests.java new file mode 100644 index 00000000..fbe719d6 --- /dev/null +++ b/src/test/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportActionTests.java @@ -0,0 +1,56 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.opensearch.jobscheduler.transport; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.opensearch.action.ActionListener; +import org.opensearch.action.support.ActionFilters; +import org.opensearch.tasks.Task; +import org.opensearch.test.OpenSearchIntegTestCase; +import org.opensearch.test.OpenSearchTestCase; +import org.opensearch.transport.TransportService; + +import static org.mockito.Mockito.mock; + +public class GetJobIndexTransportActionTests extends OpenSearchTestCase { + + private GetJobIndexTransportAction action; + + private Task task; + + private GetJobIndexRequest request; + + private ActionListener response; + + @Before + public void setUp() throws Exception { + super.setUp(); + action = new GetJobIndexTransportAction("",mock(TransportService.class), + mock(ActionFilters.class)); + request= new GetJobIndexRequest("demo_job_index","job_param_action","job_runner_action","extension_id"); + task = mock(Task.class); + response = new ActionListener() { + @Override + public void onResponse(GetJobDetailsResponse jobDetailsResponse) { + // onResponse will not be called as we do not have the AD index + Assert.assertEquals("success",jobDetailsResponse.getResponse()); + } + + @Override + public void onFailure(Exception e) { + // Assert.assertTrue(true); + } + }; + + } + + @Test + public void testGetJobIndexTransportAction() { + action.doExecute(task, request, response); + } +} diff --git a/src/test/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportActionTests.java b/src/test/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportActionTests.java new file mode 100644 index 00000000..29f1289a --- /dev/null +++ b/src/test/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportActionTests.java @@ -0,0 +1,56 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.opensearch.jobscheduler.transport; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.opensearch.action.ActionListener; +import org.opensearch.action.support.ActionFilters; +import org.opensearch.tasks.Task; +import org.opensearch.test.OpenSearchTestCase; +import org.opensearch.transport.TransportService; + +import static org.mockito.Mockito.mock; + +public class GetJobTypeTransportActionTests extends OpenSearchTestCase { + + private GetJobTypeTransportAction action; + + private Task task; + + private GetJobTypeRequest request; + + private ActionListener response; + + @Before + public void setUp() throws Exception { + super.setUp(); + action = new GetJobTypeTransportAction("",mock(TransportService.class), + mock(ActionFilters.class)); + request= new GetJobTypeRequest("demo_job_type","extension_id"); + task = mock(Task.class); + response = new ActionListener() { + @Override + public void onResponse(GetJobDetailsResponse jobDetailsResponse) { + // onResponse will not be called as we do not have the AD index + Assert.assertEquals("success",jobDetailsResponse.getResponse()); + } + + @Override + public void onFailure(Exception e) { + // Assert.assertTrue(true); + } + }; + + } + + @Test + public void testGetJobTypeTransportAction() { + action.doExecute(task, request, response); + } +} + From 21dfd75b973ce2e14fb29044985dd3bde6142399 Mon Sep 17 00:00:00 2001 From: Varun Jain Date: Thu, 29 Dec 2022 16:03:02 -0800 Subject: [PATCH 08/26] Commnunication Mechanism for JS Signed-off-by: Varun Jain --- .../jobscheduler/JobSchedulerPlugin.java | 2 +- .../jobscheduler/constant/CommonValue.java | 2 - .../jobscheduler/model/JobDetails.java | 37 ++++++++++--------- .../rest/RestGetJobIndexAction.java | 19 +++++----- .../rest/RestGetJobTypeAction.java | 17 ++++----- .../transport/GetJobIndexRequest.java | 26 ++++++------- .../transport/GetJobIndexTransportAction.java | 3 +- .../transport/GetJobTypeTransportAction.java | 3 +- .../jobscheduler/utils/RestHandlerUtils.java | 4 -- .../opensearch/jobscheduler/TestHelpers.java | 2 +- .../rest/RestGetJobIndexActionTests.java | 23 ++++++------ .../rest/RestGetJobTypeActionTests.java | 20 +++++----- .../transport/GetJobDetailsResponseTests.java | 4 +- .../GetJobIndexTransportActionTests.java | 4 +- .../GetJobTypeTransportActionTests.java | 2 - 15 files changed, 77 insertions(+), 91 deletions(-) diff --git a/src/main/java/org/opensearch/jobscheduler/JobSchedulerPlugin.java b/src/main/java/org/opensearch/jobscheduler/JobSchedulerPlugin.java index 9e3fd92e..fcfb2b60 100644 --- a/src/main/java/org/opensearch/jobscheduler/JobSchedulerPlugin.java +++ b/src/main/java/org/opensearch/jobscheduler/JobSchedulerPlugin.java @@ -79,7 +79,7 @@ public class JobSchedulerPlugin extends Plugin implements ActionPlugin, Extensib private LockService lockService; private Map indexToJobProviders; private Set indicesToListen; - private HashMap jobDetailsHashMap; + private Map jobDetailsHashMap; public JobSchedulerPlugin() { this.indicesToListen = new HashSet<>(); diff --git a/src/main/java/org/opensearch/jobscheduler/constant/CommonValue.java b/src/main/java/org/opensearch/jobscheduler/constant/CommonValue.java index b1d9cef7..fd8fcbf7 100644 --- a/src/main/java/org/opensearch/jobscheduler/constant/CommonValue.java +++ b/src/main/java/org/opensearch/jobscheduler/constant/CommonValue.java @@ -10,7 +10,5 @@ public class CommonValue { - public static Integer NO_SCHEMA_VERSION = 0; - public static String INTERNAL_ACTION_PREFIX = "cluster:admin/opendistro/jsinternal/"; public static String EXTERNAL_ACTION_PREFIX = "cluster:admin/opendistro/js/"; } diff --git a/src/main/java/org/opensearch/jobscheduler/model/JobDetails.java b/src/main/java/org/opensearch/jobscheduler/model/JobDetails.java index f5f0b97c..0a31f5d4 100644 --- a/src/main/java/org/opensearch/jobscheduler/model/JobDetails.java +++ b/src/main/java/org/opensearch/jobscheduler/model/JobDetails.java @@ -18,19 +18,22 @@ import static org.opensearch.common.xcontent.XContentParserUtils.ensureExpectedToken; +/** + * This model class stores the job details of the extension. + */ public class JobDetails implements ToXContentObject { private String jobIndex; private String jobType; - private String jobParamAction; + private String jobParserAction; private String jobRunnerAction; public static final String JOB_INDEX = "job_index"; public static final String JOB_TYPE = "job_type"; - public static final String JOB_PARAM_ACTION = "job_param_action"; + public static final String JOB_PARSER_ACTION = "job_param_action"; public static final String JOB_RUNNER_ACTION = "job_runner_action"; public JobDetails() {} @@ -38,7 +41,7 @@ public JobDetails() {} public JobDetails(String jobIndex, String jobType, String jobParamAction, String jobRunnerAction) { this.jobIndex = jobIndex; this.jobType = jobType; - this.jobParamAction = jobParamAction; + this.jobParserAction = jobParamAction; this.jobRunnerAction = jobRunnerAction; } @@ -51,8 +54,8 @@ public XContentBuilder toXContent(XContentBuilder builder, ToXContent.Params par if (jobType != null) { xContentBuilder.field(JOB_TYPE, jobType); } - if (jobParamAction != null) { - xContentBuilder.field(JOB_PARAM_ACTION, jobParamAction); + if (jobParserAction != null) { + xContentBuilder.field(JOB_PARSER_ACTION, jobParserAction); } if (jobRunnerAction != null) { xContentBuilder.field(JOB_RUNNER_ACTION, jobRunnerAction); @@ -63,7 +66,7 @@ public XContentBuilder toXContent(XContentBuilder builder, ToXContent.Params par public static JobDetails parse(XContentParser parser) throws IOException { String jobIndex = null; String jobType = null; - String jobParamAction = null; + String jobParserAction = null; String jobRunnerAction = null; ensureExpectedToken(XContentParser.Token.START_OBJECT, parser.currentToken(), parser); @@ -78,8 +81,8 @@ public static JobDetails parse(XContentParser parser) throws IOException { case JOB_TYPE: jobType = parser.text(); break; - case JOB_PARAM_ACTION: - jobParamAction = parser.text(); + case JOB_PARSER_ACTION: + jobParserAction = parser.text(); break; case JOB_RUNNER_ACTION: jobRunnerAction = parser.text(); @@ -90,7 +93,7 @@ public static JobDetails parse(XContentParser parser) throws IOException { } } - return new JobDetails(jobIndex, jobType, jobParamAction, jobRunnerAction); + return new JobDetails(jobIndex, jobType, jobParserAction, jobRunnerAction); } public String getJobIndex() { @@ -109,12 +112,12 @@ public void setJobType(String jobType) { this.jobType = jobType; } - public String getJobParamAction() { - return jobParamAction; + public String getJobParserAction() { + return jobParserAction; } - public void setJobParamAction(String jobParamAction) { - this.jobParamAction = jobParamAction; + public void setJobParserAction(String jobParamAction) { + this.jobParserAction = jobParamAction; } public String getJobRunnerAction() { @@ -132,13 +135,13 @@ public boolean equals(Object o) { JobDetails that = (JobDetails) o; return Objects.equals(jobIndex, that.jobIndex) && Objects.equals(jobType, that.jobType) - && jobParamAction.equals(that.jobParamAction) + && jobParserAction.equals(that.jobParserAction) && jobRunnerAction.equals(that.jobRunnerAction); } @Override public int hashCode() { - return Objects.hash(jobIndex, jobType, jobParamAction, jobRunnerAction); + return Objects.hash(jobIndex, jobType, jobParserAction, jobRunnerAction); } @Override @@ -150,8 +153,8 @@ public String toString() { + ", jobType='" + jobType + '\'' - + ", jobParamAction='" - + jobParamAction + + ", jobParserAction='" + + jobParserAction + '\'' + ", jobRunnerAction='" + jobRunnerAction diff --git a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java index f7b7b0e7..bac1e4ab 100644 --- a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java +++ b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java @@ -28,24 +28,27 @@ import org.opensearch.rest.action.RestResponseListener; import java.io.IOException; -import java.util.HashMap; import java.util.List; import java.util.Locale; +import java.util.Map; import static java.util.Arrays.asList; import static java.util.Collections.unmodifiableList; import static org.opensearch.common.xcontent.XContentParserUtils.ensureExpectedToken; import static org.opensearch.rest.RestRequest.Method.PUT; +/** + * This class consists of the REST handler to GET job index from extensions. + */ public class RestGetJobIndexAction extends BaseRestHandler { - private static final String GET_JOB_INDEX_ACTION = "get_job_index_action"; + public static final String GET_JOB_INDEX_ACTION = "get_job_index_action"; private final Logger logger = LogManager.getLogger(RestGetJobIndexAction.class); - private HashMap jobDetailsHashMap; + private Map jobDetailsHashMap; - public RestGetJobIndexAction(HashMap jobDetailsHashMap) { + public RestGetJobIndexAction(Map jobDetailsHashMap) { this.jobDetailsHashMap = jobDetailsHashMap; } @@ -70,7 +73,7 @@ protected RestChannelConsumer prepareRequest(RestRequest restRequest, NodeClient JobDetails jobDetails = jobDetailsHashMap.getOrDefault(getJobIndexRequest.getExtensionId(), new JobDetails()); jobDetails.setJobIndex(getJobIndexRequest.getJobIndex()); - jobDetails.setJobParamAction(getJobIndexRequest.getJobParamAction()); + jobDetails.setJobParserAction(getJobIndexRequest.getJobParserAction()); jobDetails.setJobRunnerAction(getJobIndexRequest.getJobRunnerAction()); jobDetailsHashMap.put(getJobIndexRequest.getExtensionId(), jobDetails); @@ -83,11 +86,7 @@ private RestResponseListener getJobIndexResponse(RestChan return new RestResponseListener<>(channel) { @Override public RestResponse buildResponse(GetJobDetailsResponse getJobDetailsResponse) throws Exception { - BytesRestResponse bytesRestResponse = new BytesRestResponse( - status, - getJobDetailsResponse.toXContent(channel.newBuilder(), ToXContent.EMPTY_PARAMS) - ); - return bytesRestResponse; + return new BytesRestResponse(status, getJobDetailsResponse.toXContent(channel.newBuilder(), ToXContent.EMPTY_PARAMS)); } }; } diff --git a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java index 3f5616b8..96d87b9f 100644 --- a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java +++ b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java @@ -29,22 +29,25 @@ import org.opensearch.rest.action.RestResponseListener; import java.io.IOException; -import java.util.HashMap; import java.util.List; import java.util.Locale; +import java.util.Map; import static java.util.Arrays.asList; import static java.util.Collections.unmodifiableList; import static org.opensearch.common.xcontent.XContentParserUtils.ensureExpectedToken; import static org.opensearch.rest.RestRequest.Method.PUT; +/** + * This class consists of the REST handler to GET job type from extensions. + */ public class RestGetJobTypeAction extends BaseRestHandler { - private static final String GET_JOB_TYPE_ACTION = "get_job_type_action"; + public static final String GET_JOB_TYPE_ACTION = "get_job_type_action"; private final Logger logger = LogManager.getLogger(RestGetJobTypeAction.class); - private HashMap jobDetailsHashMap; + private Map jobDetailsHashMap; @Override public String getName() { @@ -53,7 +56,7 @@ public String getName() { public RestGetJobTypeAction() {} - public RestGetJobTypeAction(HashMap jobDetailsHashMap) { + public RestGetJobTypeAction(Map jobDetailsHashMap) { this.jobDetailsHashMap = jobDetailsHashMap; } @@ -81,11 +84,7 @@ private RestResponseListener getJobTypeResponse(RestChann return new RestResponseListener<>(channel) { @Override public RestResponse buildResponse(GetJobDetailsResponse response) throws Exception { - BytesRestResponse bytesRestResponse = new BytesRestResponse( - status, - response.toXContent(channel.newBuilder(), ToXContent.EMPTY_PARAMS) - ); - return bytesRestResponse; + return new BytesRestResponse(status, response.toXContent(channel.newBuilder(), ToXContent.EMPTY_PARAMS)); } }; } diff --git a/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java index 600748f5..e2915123 100644 --- a/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java @@ -21,7 +21,7 @@ public class GetJobIndexRequest extends ActionRequest { private static String jobIndex; - private static String jobParamAction; + private static String jobParserAction; private static String jobRunnerAction; @@ -30,22 +30,22 @@ public class GetJobIndexRequest extends ActionRequest { public static final String JOB_INDEX = "job_index"; public static final String EXTENSION_ID = "extension_id"; - private static final String JOB_PARAM_ACTION = "job_param_action"; + private static final String JOB_PARSER_ACTION = "job_param_action"; public static final String JOB_RUNNER_ACTION = "job_runner_action"; public GetJobIndexRequest(StreamInput in) throws IOException { super(in); jobIndex = in.readString(); - jobParamAction = in.readString(); + jobParserAction = in.readString(); jobRunnerAction = in.readString(); extensionId = in.readString(); } - public GetJobIndexRequest(String jobIndex, String jobParamAction, String jobRunnerAction, String extensionId) { + public GetJobIndexRequest(String jobIndex, String jobParserAction, String jobRunnerAction, String extensionId) { super(); this.jobIndex = jobIndex; - this.jobParamAction = jobParamAction; + this.jobParserAction = jobParserAction; this.jobRunnerAction = jobRunnerAction; this.extensionId = extensionId; } @@ -54,7 +54,7 @@ public GetJobIndexRequest(String jobIndex, String jobParamAction, String jobRunn public void writeTo(StreamOutput out) throws IOException { super.writeTo(out); out.writeString(jobIndex); - out.writeString(jobParamAction); + out.writeString(jobParserAction); out.writeString(jobRunnerAction); out.writeString(extensionId); } @@ -67,12 +67,12 @@ public void setJobIndex(String jobIndex) { this.jobIndex = jobIndex; } - public String getJobParamAction() { - return jobParamAction; + public String getJobParserAction() { + return jobParserAction; } - public void setJobParamAction(String jobParamAction) { - this.jobParamAction = jobParamAction; + public void setJobParserAction(String jobParserAction) { + this.jobParserAction = jobParserAction; } public String getJobRunnerAction() { @@ -107,8 +107,8 @@ public static GetJobIndexRequest parse(XContentParser parser) throws IOException case JOB_INDEX: jobIndex = parser.text(); break; - case JOB_PARAM_ACTION: - jobParamAction = parser.text(); + case JOB_PARSER_ACTION: + jobParserAction = parser.text(); break; case JOB_RUNNER_ACTION: jobRunnerAction = parser.text(); @@ -122,7 +122,7 @@ public static GetJobIndexRequest parse(XContentParser parser) throws IOException } } - GetJobIndexRequest request = new GetJobIndexRequest(jobIndex, jobParamAction, jobRunnerAction, extensionId); + GetJobIndexRequest request = new GetJobIndexRequest(jobIndex, jobParserAction, jobRunnerAction, extensionId); return request; } } diff --git a/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportAction.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportAction.java index 7b61c093..78871cfc 100644 --- a/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportAction.java +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportAction.java @@ -35,7 +35,6 @@ protected void doExecute(Task task, GetJobIndexRequest request, ActionListener jobDetailsHashMap; + public Map jobDetailsHashMap; @Before public void setUp() throws Exception { @@ -42,21 +43,21 @@ public void setUp() throws Exception { action = new RestGetJobIndexAction(jobDetailsHashMap); } - @Test - public void getNameTests() { + public void testGetNames() { String name = action.getName(); - Assert.assertEquals("get_job_index_action", name); + Assert.assertEquals(action.GET_JOB_INDEX_ACTION, name); } - @Test - public void getRoutes() { + public void testGetRoutes() { List routes = action.routes(); - Assert.assertEquals("/_plugins/_job_scheduler/_get/_job_index", routes.get(0).getPath()); + Assert.assertEquals( + String.format(Locale.ROOT, "%s/%s", JobSchedulerPlugin.JS_BASE_URI, "_get/_job_index"), + routes.get(0).getPath() + ); } - @Test - public void prepareRequestTest() throws IOException { + public void testPrepareRequest() throws IOException { String content = "{\"job_index\":\"demo_job_index\",\"job_runner_action\":\"action\",\"job_param_action\":\"param_action\",\"extension_id\":\"extension_id\"}"; diff --git a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java index d8cedcd8..ac2a9a18 100644 --- a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java +++ b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java @@ -10,10 +10,10 @@ import org.junit.Assert; import org.junit.Before; -import org.junit.Test; import org.opensearch.client.node.NodeClient; import org.opensearch.common.bytes.BytesArray; import org.opensearch.common.xcontent.XContentType; +import org.opensearch.jobscheduler.JobSchedulerPlugin; import org.opensearch.jobscheduler.model.JobDetails; import org.opensearch.rest.RestHandler; import org.opensearch.rest.RestRequest; @@ -22,9 +22,10 @@ import org.opensearch.test.rest.FakeRestRequest; import java.io.IOException; +import java.util.Map; import java.util.HashMap; +import java.util.Locale; import java.util.List; -import java.util.Map; import static org.hamcrest.Matchers.equalTo; import static org.mockito.Mockito.mock; @@ -33,7 +34,7 @@ public class RestGetJobTypeActionTests extends OpenSearchTestCase { private RestGetJobTypeAction action; - public HashMap jobDetailsHashMap; + public Map jobDetailsHashMap; @Before public void setUp() throws Exception { @@ -42,21 +43,18 @@ public void setUp() throws Exception { action = new RestGetJobTypeAction(jobDetailsHashMap); } - @Test - public void getNameTests() { + public void testGetNames() { String name = action.getName(); - Assert.assertEquals("get_job_type_action", name); + Assert.assertEquals(action.GET_JOB_TYPE_ACTION, name); } - @Test - public void getRoutes() { + public void testGetRoutes() { List routes = action.routes(); - Assert.assertEquals("/_plugins/_job_scheduler/_get/_job_type", routes.get(0).getPath()); + Assert.assertEquals(String.format(Locale.ROOT, "%s/%s", JobSchedulerPlugin.JS_BASE_URI, "_get/_job_type"), routes.get(0).getPath()); } - @Test - public void prepareRequestTest() throws IOException { + public void testPrepareRequest() throws IOException { String content = "{\"job_type\":\"demo_job_type\",\"extension_id\":\"extension_id\"}"; Map params = new HashMap<>(); diff --git a/src/test/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponseTests.java b/src/test/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponseTests.java index efdc2a67..d5076ed7 100644 --- a/src/test/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponseTests.java +++ b/src/test/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponseTests.java @@ -8,7 +8,6 @@ */ package org.opensearch.jobscheduler.transport; -import org.junit.Test; import org.opensearch.common.xcontent.ToXContent; import org.opensearch.jobscheduler.TestHelpers; import org.opensearch.rest.RestStatus; @@ -18,11 +17,10 @@ public class GetJobDetailsResponseTests extends OpenSearchTestCase { - @Test public void testToXContent() throws IOException { GetJobDetailsResponse getJobDetailsResponse = new GetJobDetailsResponse(RestStatus.OK, "success"); String response = TestHelpers.xContentBuilderToString( - getJobDetailsResponse.toXContent(TestHelpers.builder(), ToXContent.EMPTY_PARAMS) + getJobDetailsResponse.toXContent(TestHelpers.xContentBuilder(), ToXContent.EMPTY_PARAMS) ); assertEquals("{\"response\":\"success\"}", response); } diff --git a/src/test/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportActionTests.java b/src/test/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportActionTests.java index 4465b95c..b391d19f 100644 --- a/src/test/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportActionTests.java +++ b/src/test/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportActionTests.java @@ -10,7 +10,6 @@ import org.junit.Assert; import org.junit.Before; -import org.junit.Test; import org.opensearch.action.ActionListener; import org.opensearch.action.support.ActionFilters; import org.opensearch.tasks.Task; @@ -33,7 +32,7 @@ public class GetJobIndexTransportActionTests extends OpenSearchTestCase { public void setUp() throws Exception { super.setUp(); action = new GetJobIndexTransportAction("", mock(TransportService.class), mock(ActionFilters.class)); - request = new GetJobIndexRequest("demo_job_index", "job_param_action", "job_runner_action", "extension_id"); + request = new GetJobIndexRequest("demo_job_index", "job_parser_action", "job_runner_action", "extension_id"); task = mock(Task.class); response = new ActionListener() { @Override @@ -50,7 +49,6 @@ public void onFailure(Exception e) { } - @Test public void testGetJobIndexTransportAction() { action.doExecute(task, request, response); } diff --git a/src/test/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportActionTests.java b/src/test/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportActionTests.java index 9a7977fb..5d304f8e 100644 --- a/src/test/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportActionTests.java +++ b/src/test/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportActionTests.java @@ -10,7 +10,6 @@ import org.junit.Assert; import org.junit.Before; -import org.junit.Test; import org.opensearch.action.ActionListener; import org.opensearch.action.support.ActionFilters; import org.opensearch.tasks.Task; @@ -50,7 +49,6 @@ public void onFailure(Exception e) { } - @Test public void testGetJobTypeTransportAction() { action.doExecute(task, request, response); } From 15e9e2e8a15f08710c1c6542822e7ad5490ffdab Mon Sep 17 00:00:00 2001 From: Varun Jain Date: Thu, 29 Dec 2022 16:11:10 -0800 Subject: [PATCH 09/26] Commnunication Mechanism for JS Signed-off-by: Varun Jain --- .../org/opensearch/jobscheduler/model/JobDetails.java | 10 +++++----- .../jobscheduler/transport/GetJobIndexRequest.java | 2 +- .../jobscheduler/rest/RestGetJobIndexActionTests.java | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/opensearch/jobscheduler/model/JobDetails.java b/src/main/java/org/opensearch/jobscheduler/model/JobDetails.java index 0a31f5d4..92c13274 100644 --- a/src/main/java/org/opensearch/jobscheduler/model/JobDetails.java +++ b/src/main/java/org/opensearch/jobscheduler/model/JobDetails.java @@ -33,15 +33,15 @@ public class JobDetails implements ToXContentObject { public static final String JOB_INDEX = "job_index"; public static final String JOB_TYPE = "job_type"; - public static final String JOB_PARSER_ACTION = "job_param_action"; + public static final String JOB_PARSER_ACTION = "job_parser_action"; public static final String JOB_RUNNER_ACTION = "job_runner_action"; public JobDetails() {} - public JobDetails(String jobIndex, String jobType, String jobParamAction, String jobRunnerAction) { + public JobDetails(String jobIndex, String jobType, String jobParserAction, String jobRunnerAction) { this.jobIndex = jobIndex; this.jobType = jobType; - this.jobParserAction = jobParamAction; + this.jobParserAction = jobParserAction; this.jobRunnerAction = jobRunnerAction; } @@ -116,8 +116,8 @@ public String getJobParserAction() { return jobParserAction; } - public void setJobParserAction(String jobParamAction) { - this.jobParserAction = jobParamAction; + public void setJobParserAction(String jobParserAction) { + this.jobParserAction = jobParserAction; } public String getJobRunnerAction() { diff --git a/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java index e2915123..58633ffc 100644 --- a/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java @@ -30,7 +30,7 @@ public class GetJobIndexRequest extends ActionRequest { public static final String JOB_INDEX = "job_index"; public static final String EXTENSION_ID = "extension_id"; - private static final String JOB_PARSER_ACTION = "job_param_action"; + private static final String JOB_PARSER_ACTION = "job_parser_action"; public static final String JOB_RUNNER_ACTION = "job_runner_action"; public GetJobIndexRequest(StreamInput in) throws IOException { diff --git a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java index c755b930..462555d0 100644 --- a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java +++ b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java @@ -60,7 +60,7 @@ public void testGetRoutes() { public void testPrepareRequest() throws IOException { String content = - "{\"job_index\":\"demo_job_index\",\"job_runner_action\":\"action\",\"job_param_action\":\"param_action\",\"extension_id\":\"extension_id\"}"; + "{\"job_index\":\"demo_job_index\",\"job_runner_action\":\"action\",\"job_parser_action\":\"parser_action\",\"extension_id\":\"extension_id\"}"; Map params = new HashMap<>(); FakeRestRequest request = new FakeRestRequest.Builder(xContentRegistry()).withMethod(RestRequest.Method.PUT) .withPath("/_plugins/_job_scheduler/_get/_job_index") From c9933e6ad4bb62d529cdf5a35e1476c76a273db4 Mon Sep 17 00:00:00 2001 From: Varun Jain Date: Fri, 30 Dec 2022 10:37:09 -0800 Subject: [PATCH 10/26] Commnunication Mechanism for JS Signed-off-by: Varun Jain --- .../jobscheduler/JobSchedulerPlugin.java | 8 +++--- .../jobscheduler/model/JobDetails.java | 16 ++++++++++-- .../rest/RestGetJobIndexAction.java | 10 +++---- .../rest/RestGetJobTypeAction.java | 10 +++---- .../transport/GetJobDetailsResponse.java | 3 +++ .../transport/GetJobIndexAction.java | 3 +++ .../transport/GetJobIndexRequest.java | 3 +++ .../transport/GetJobIndexTransportAction.java | 3 +++ .../transport/GetJobTypeAction.java | 3 +++ .../transport/GetJobTypeRequest.java | 3 +++ .../transport/GetJobTypeTransportAction.java | 3 +++ .../opensearch/jobscheduler/TestHelpers.java | 26 ------------------- .../rest/RestGetJobIndexActionTests.java | 21 +++++++-------- .../rest/RestGetJobTypeActionTests.java | 18 ++++++------- .../transport/GetJobDetailsResponseTests.java | 8 +++--- .../GetJobIndexTransportActionTests.java | 13 ++++++---- .../GetJobTypeTransportActionTests.java | 12 +++++---- 17 files changed, 86 insertions(+), 77 deletions(-) delete mode 100644 src/test/java/org/opensearch/jobscheduler/TestHelpers.java diff --git a/src/main/java/org/opensearch/jobscheduler/JobSchedulerPlugin.java b/src/main/java/org/opensearch/jobscheduler/JobSchedulerPlugin.java index fcfb2b60..0f88f0a6 100644 --- a/src/main/java/org/opensearch/jobscheduler/JobSchedulerPlugin.java +++ b/src/main/java/org/opensearch/jobscheduler/JobSchedulerPlugin.java @@ -79,12 +79,12 @@ public class JobSchedulerPlugin extends Plugin implements ActionPlugin, Extensib private LockService lockService; private Map indexToJobProviders; private Set indicesToListen; - private Map jobDetailsHashMap; + private Map indexToJobDetails; public JobSchedulerPlugin() { this.indicesToListen = new HashSet<>(); this.indexToJobProviders = new HashMap<>(); - this.jobDetailsHashMap = new HashMap<>(); + this.indexToJobDetails = new HashMap<>(); } @Override @@ -217,8 +217,8 @@ public List getRestHandlers( IndexNameExpressionResolver indexNameExpressionResolver, Supplier nodesInCluster ) { - RestGetJobIndexAction restGetJobIndexAction = new RestGetJobIndexAction(jobDetailsHashMap); - RestGetJobTypeAction restGetJobTypeAction = new RestGetJobTypeAction(jobDetailsHashMap); + RestGetJobIndexAction restGetJobIndexAction = new RestGetJobIndexAction(indexToJobDetails); + RestGetJobTypeAction restGetJobTypeAction = new RestGetJobTypeAction(indexToJobDetails); return ImmutableList.of(restGetJobIndexAction, restGetJobTypeAction); } diff --git a/src/main/java/org/opensearch/jobscheduler/model/JobDetails.java b/src/main/java/org/opensearch/jobscheduler/model/JobDetails.java index 92c13274..a51c764e 100644 --- a/src/main/java/org/opensearch/jobscheduler/model/JobDetails.java +++ b/src/main/java/org/opensearch/jobscheduler/model/JobDetails.java @@ -23,12 +23,24 @@ */ public class JobDetails implements ToXContentObject { + /** + * jobIndex from the extension. + */ private String jobIndex; + /** + * jobType from the extension. + */ private String jobType; + /** + * jobParser action to trigger the response back to the extension. + */ private String jobParserAction; + /** + * jobRunner action to trigger the response back to the extension. + */ private String jobRunnerAction; public static final String JOB_INDEX = "job_index"; @@ -135,8 +147,8 @@ public boolean equals(Object o) { JobDetails that = (JobDetails) o; return Objects.equals(jobIndex, that.jobIndex) && Objects.equals(jobType, that.jobType) - && jobParserAction.equals(that.jobParserAction) - && jobRunnerAction.equals(that.jobRunnerAction); + && Objects.equals(jobParserAction, that.jobParserAction) + && Objects.equals(jobRunnerAction, that.jobRunnerAction); } @Override diff --git a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java index bac1e4ab..a572d93a 100644 --- a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java +++ b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java @@ -46,10 +46,10 @@ public class RestGetJobIndexAction extends BaseRestHandler { private final Logger logger = LogManager.getLogger(RestGetJobIndexAction.class); - private Map jobDetailsHashMap; + private Map indexToJobDetails; - public RestGetJobIndexAction(Map jobDetailsHashMap) { - this.jobDetailsHashMap = jobDetailsHashMap; + public RestGetJobIndexAction(Map indexToJobDetails) { + this.indexToJobDetails = indexToJobDetails; } @Override @@ -71,12 +71,12 @@ protected RestChannelConsumer prepareRequest(RestRequest restRequest, NodeClient GetJobIndexRequest getJobIndexRequest = GetJobIndexRequest.parse(parser); - JobDetails jobDetails = jobDetailsHashMap.getOrDefault(getJobIndexRequest.getExtensionId(), new JobDetails()); + JobDetails jobDetails = indexToJobDetails.getOrDefault(getJobIndexRequest.getExtensionId(), new JobDetails()); jobDetails.setJobIndex(getJobIndexRequest.getJobIndex()); jobDetails.setJobParserAction(getJobIndexRequest.getJobParserAction()); jobDetails.setJobRunnerAction(getJobIndexRequest.getJobRunnerAction()); - jobDetailsHashMap.put(getJobIndexRequest.getExtensionId(), jobDetails); + indexToJobDetails.put(getJobIndexRequest.getExtensionId(), jobDetails); return channel -> client.execute(GetJobIndexAction.INSTANCE, getJobIndexRequest, getJobIndexResponse(channel, RestStatus.OK)); diff --git a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java index 96d87b9f..8e22d6f6 100644 --- a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java +++ b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java @@ -47,7 +47,7 @@ public class RestGetJobTypeAction extends BaseRestHandler { private final Logger logger = LogManager.getLogger(RestGetJobTypeAction.class); - private Map jobDetailsHashMap; + private Map indexToJobDetails; @Override public String getName() { @@ -56,8 +56,8 @@ public String getName() { public RestGetJobTypeAction() {} - public RestGetJobTypeAction(Map jobDetailsHashMap) { - this.jobDetailsHashMap = jobDetailsHashMap; + public RestGetJobTypeAction(Map indexToJobDetails) { + this.indexToJobDetails = indexToJobDetails; } @Override @@ -73,9 +73,9 @@ protected RestChannelConsumer prepareRequest(RestRequest restRequest, NodeClient ensureExpectedToken(XContentParser.Token.START_OBJECT, parser.nextToken(), parser); GetJobTypeRequest getJobTypeRequest = GetJobTypeRequest.parse(parser); - JobDetails jobDetails = jobDetailsHashMap.getOrDefault(getJobTypeRequest.getExtensionId(), new JobDetails()); + JobDetails jobDetails = indexToJobDetails.getOrDefault(getJobTypeRequest.getExtensionId(), new JobDetails()); jobDetails.setJobType(getJobTypeRequest.getJobType()); - jobDetailsHashMap.put(getJobTypeRequest.getExtensionId(), jobDetails); + indexToJobDetails.put(getJobTypeRequest.getExtensionId(), jobDetails); return channel -> client.execute(GetJobTypeAction.INSTANCE, getJobTypeRequest, getJobTypeResponse(channel, RestStatus.OK)); } diff --git a/src/main/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponse.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponse.java index 4dd48924..dc6b2739 100644 --- a/src/main/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponse.java +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponse.java @@ -17,6 +17,9 @@ import java.io.IOException; +/** + * Response for get jobIndex and get jobType apis + */ public class GetJobDetailsResponse extends ActionResponse implements ToXContentObject { private final RestStatus restStatus; diff --git a/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexAction.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexAction.java index 605008c9..16998fa5 100644 --- a/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexAction.java +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexAction.java @@ -11,6 +11,9 @@ import org.opensearch.action.ActionType; import org.opensearch.jobscheduler.constant.CommonValue; +/** + * Get Job Index action + */ public class GetJobIndexAction extends ActionType { public static final String NAME = CommonValue.EXTERNAL_ACTION_PREFIX + "get/jobIndex"; diff --git a/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java index 58633ffc..d428413e 100644 --- a/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java @@ -17,6 +17,9 @@ import java.io.IOException; +/** + * Get Job Index Request Model class + */ public class GetJobIndexRequest extends ActionRequest { private static String jobIndex; diff --git a/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportAction.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportAction.java index 78871cfc..055e0c93 100644 --- a/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportAction.java +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportAction.java @@ -20,6 +20,9 @@ import static org.opensearch.jobscheduler.utils.RestHandlerUtils.wrapRestActionListener; +/** + * Get Job Index Transport Action + */ public class GetJobIndexTransportAction extends HandledTransportAction { private static final Logger logger = LogManager.getLogger(GetJobIndexTransportAction.class); diff --git a/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeAction.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeAction.java index 765a9749..e0a9c3c9 100644 --- a/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeAction.java +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeAction.java @@ -11,6 +11,9 @@ import org.opensearch.action.ActionType; import org.opensearch.jobscheduler.constant.CommonValue; +/** + * Get Job Type action + */ public class GetJobTypeAction extends ActionType { public static final String NAME = CommonValue.EXTERNAL_ACTION_PREFIX + "get/jobType"; diff --git a/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeRequest.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeRequest.java index 3a2bec25..8ba7d404 100644 --- a/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeRequest.java +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeRequest.java @@ -16,6 +16,9 @@ import java.io.IOException; +/** + * Get Job Type Request Model class + */ public class GetJobTypeRequest extends ActionRequest { private static String jobType; diff --git a/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportAction.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportAction.java index 7d0f6333..7d63db4f 100644 --- a/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportAction.java +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportAction.java @@ -20,6 +20,9 @@ import static org.opensearch.jobscheduler.utils.RestHandlerUtils.wrapRestActionListener; +/** + * Get Job Type Transport Action + */ public class GetJobTypeTransportAction extends HandledTransportAction { private static final Logger LOG = LogManager.getLogger(GetJobTypeTransportAction.class); diff --git a/src/test/java/org/opensearch/jobscheduler/TestHelpers.java b/src/test/java/org/opensearch/jobscheduler/TestHelpers.java deleted file mode 100644 index 4d0deb9a..00000000 --- a/src/test/java/org/opensearch/jobscheduler/TestHelpers.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - * - * The OpenSearch Contributors require contributions made to - * this file be licensed under the Apache-2.0 license or a - * compatible open source license. - */ -package org.opensearch.jobscheduler; - -import org.opensearch.common.bytes.BytesReference; -import org.opensearch.common.xcontent.XContentBuilder; -import org.opensearch.common.xcontent.XContentType; - -import java.io.IOException; - -public class TestHelpers { - - public static XContentBuilder xContentBuilder() throws IOException { - return XContentBuilder.builder(XContentType.JSON.xContent()); - } - - public static String xContentBuilderToString(XContentBuilder builder) { - return BytesReference.bytes(builder).utf8ToString(); - } -} diff --git a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java index 462555d0..4c650e63 100644 --- a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java +++ b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java @@ -8,12 +8,10 @@ */ package org.opensearch.jobscheduler.rest; -import org.junit.Assert; import org.junit.Before; import org.opensearch.client.node.NodeClient; import org.opensearch.common.bytes.BytesArray; import org.opensearch.common.xcontent.XContentType; -import org.opensearch.jobscheduler.JobSchedulerPlugin; import org.opensearch.jobscheduler.model.JobDetails; import org.opensearch.rest.RestHandler; import org.opensearch.rest.RestRequest; @@ -24,7 +22,6 @@ import java.io.IOException; import java.util.Map; import java.util.HashMap; -import java.util.Locale; import java.util.List; import static org.hamcrest.Matchers.equalTo; @@ -34,27 +31,27 @@ public class RestGetJobIndexActionTests extends OpenSearchTestCase { private RestGetJobIndexAction action; - public Map jobDetailsHashMap; + public Map indexToJobDetails; + + private String getJobIndexPath; @Before public void setUp() throws Exception { super.setUp(); - jobDetailsHashMap = new HashMap<>(); - action = new RestGetJobIndexAction(jobDetailsHashMap); + indexToJobDetails = new HashMap<>(); + action = new RestGetJobIndexAction(indexToJobDetails); + getJobIndexPath = action.routes().get(0).getPath(); } public void testGetNames() { String name = action.getName(); - Assert.assertEquals(action.GET_JOB_INDEX_ACTION, name); + assertEquals(action.GET_JOB_INDEX_ACTION, name); } public void testGetRoutes() { List routes = action.routes(); - Assert.assertEquals( - String.format(Locale.ROOT, "%s/%s", JobSchedulerPlugin.JS_BASE_URI, "_get/_job_index"), - routes.get(0).getPath() - ); + assertEquals(getJobIndexPath, routes.get(0).getPath()); } public void testPrepareRequest() throws IOException { @@ -63,7 +60,7 @@ public void testPrepareRequest() throws IOException { "{\"job_index\":\"demo_job_index\",\"job_runner_action\":\"action\",\"job_parser_action\":\"parser_action\",\"extension_id\":\"extension_id\"}"; Map params = new HashMap<>(); FakeRestRequest request = new FakeRestRequest.Builder(xContentRegistry()).withMethod(RestRequest.Method.PUT) - .withPath("/_plugins/_job_scheduler/_get/_job_index") + .withPath(getJobIndexPath) .withParams(params) .withContent(new BytesArray(content), XContentType.JSON) .build(); diff --git a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java index ac2a9a18..f62ee464 100644 --- a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java +++ b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java @@ -8,12 +8,10 @@ */ package org.opensearch.jobscheduler.rest; -import org.junit.Assert; import org.junit.Before; import org.opensearch.client.node.NodeClient; import org.opensearch.common.bytes.BytesArray; import org.opensearch.common.xcontent.XContentType; -import org.opensearch.jobscheduler.JobSchedulerPlugin; import org.opensearch.jobscheduler.model.JobDetails; import org.opensearch.rest.RestHandler; import org.opensearch.rest.RestRequest; @@ -24,7 +22,6 @@ import java.io.IOException; import java.util.Map; import java.util.HashMap; -import java.util.Locale; import java.util.List; import static org.hamcrest.Matchers.equalTo; @@ -34,24 +31,27 @@ public class RestGetJobTypeActionTests extends OpenSearchTestCase { private RestGetJobTypeAction action; - public Map jobDetailsHashMap; + public Map indexToJobDetails; + + private String getJobTypePath; @Before public void setUp() throws Exception { super.setUp(); - jobDetailsHashMap = new HashMap<>(); - action = new RestGetJobTypeAction(jobDetailsHashMap); + indexToJobDetails = new HashMap<>(); + action = new RestGetJobTypeAction(indexToJobDetails); + getJobTypePath = action.routes().get(0).getPath(); } public void testGetNames() { String name = action.getName(); - Assert.assertEquals(action.GET_JOB_TYPE_ACTION, name); + assertEquals(action.GET_JOB_TYPE_ACTION, name); } public void testGetRoutes() { List routes = action.routes(); - Assert.assertEquals(String.format(Locale.ROOT, "%s/%s", JobSchedulerPlugin.JS_BASE_URI, "_get/_job_type"), routes.get(0).getPath()); + assertEquals(getJobTypePath, routes.get(0).getPath()); } public void testPrepareRequest() throws IOException { @@ -59,7 +59,7 @@ public void testPrepareRequest() throws IOException { String content = "{\"job_type\":\"demo_job_type\",\"extension_id\":\"extension_id\"}"; Map params = new HashMap<>(); FakeRestRequest request = new FakeRestRequest.Builder(xContentRegistry()).withMethod(RestRequest.Method.PUT) - .withPath("/_plugins/_job_scheduler/_get/_job_type") + .withPath(getJobTypePath) .withParams(params) .withContent(new BytesArray(content), XContentType.JSON) .build(); diff --git a/src/test/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponseTests.java b/src/test/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponseTests.java index d5076ed7..3ced7537 100644 --- a/src/test/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponseTests.java +++ b/src/test/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponseTests.java @@ -8,8 +8,10 @@ */ package org.opensearch.jobscheduler.transport; +import org.opensearch.common.Strings; import org.opensearch.common.xcontent.ToXContent; -import org.opensearch.jobscheduler.TestHelpers; + +import org.opensearch.common.xcontent.json.JsonXContent; import org.opensearch.rest.RestStatus; import org.opensearch.test.OpenSearchTestCase; @@ -19,9 +21,7 @@ public class GetJobDetailsResponseTests extends OpenSearchTestCase { public void testToXContent() throws IOException { GetJobDetailsResponse getJobDetailsResponse = new GetJobDetailsResponse(RestStatus.OK, "success"); - String response = TestHelpers.xContentBuilderToString( - getJobDetailsResponse.toXContent(TestHelpers.xContentBuilder(), ToXContent.EMPTY_PARAMS) - ); + String response = Strings.toString(getJobDetailsResponse.toXContent(JsonXContent.contentBuilder(), ToXContent.EMPTY_PARAMS)); assertEquals("{\"response\":\"success\"}", response); } diff --git a/src/test/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportActionTests.java b/src/test/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportActionTests.java index b391d19f..a5458b24 100644 --- a/src/test/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportActionTests.java +++ b/src/test/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportActionTests.java @@ -8,7 +8,6 @@ */ package org.opensearch.jobscheduler.transport; -import org.junit.Assert; import org.junit.Before; import org.opensearch.action.ActionListener; import org.opensearch.action.support.ActionFilters; @@ -34,22 +33,26 @@ public void setUp() throws Exception { action = new GetJobIndexTransportAction("", mock(TransportService.class), mock(ActionFilters.class)); request = new GetJobIndexRequest("demo_job_index", "job_parser_action", "job_runner_action", "extension_id"); task = mock(Task.class); - response = new ActionListener() { + response = new ActionListener<>() { @Override public void onResponse(GetJobDetailsResponse jobDetailsResponse) { - // onResponse will not be called as we do not have the AD index - Assert.assertEquals("success", jobDetailsResponse.getResponse()); + assertEquals("success", jobDetailsResponse.getResponse()); } @Override public void onFailure(Exception e) { - // Assert.assertTrue(true); + // As the onFailure method is not triggered from the execution of doExecute method, therefore assertFalse condition is + // defined. + assertFalse(true); } }; } public void testGetJobIndexTransportAction() { + // do execute method with internally trigger onresponse method of the actionlistener. + // The definition of onResponse is defined in the setup() method above. action.doExecute(task, request, response); + } } diff --git a/src/test/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportActionTests.java b/src/test/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportActionTests.java index 5d304f8e..ff34558a 100644 --- a/src/test/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportActionTests.java +++ b/src/test/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportActionTests.java @@ -8,7 +8,6 @@ */ package org.opensearch.jobscheduler.transport; -import org.junit.Assert; import org.junit.Before; import org.opensearch.action.ActionListener; import org.opensearch.action.support.ActionFilters; @@ -34,22 +33,25 @@ public void setUp() throws Exception { action = new GetJobTypeTransportAction("", mock(TransportService.class), mock(ActionFilters.class)); request = new GetJobTypeRequest("demo_job_type", "extension_id"); task = mock(Task.class); - response = new ActionListener() { + response = new ActionListener<>() { @Override public void onResponse(GetJobDetailsResponse jobDetailsResponse) { - // onResponse will not be called as we do not have the AD index - Assert.assertEquals("success", jobDetailsResponse.getResponse()); + assertEquals("success", jobDetailsResponse.getResponse()); } @Override public void onFailure(Exception e) { - // Assert.assertTrue(true); + // As the onFailure method is not triggered from the execution of doExecute method, therefore assertFalse condition is + // defined. + assertFalse(true); } }; } public void testGetJobTypeTransportAction() { + // do execute method with internally trigger onresponse method of the actionlistener. + // The definition of onResponse is defined in the setup() method above. action.doExecute(task, request, response); } } From ff9e49384031a149b078c260b63453fbf87942c9 Mon Sep 17 00:00:00 2001 From: Varun Jain Date: Fri, 30 Dec 2022 11:26:22 -0800 Subject: [PATCH 11/26] Commnunication Mechanism for JS Signed-off-by: Varun Jain --- .../opensearch/jobscheduler/rest/RestGetJobTypeAction.java | 2 -- .../jobscheduler/transport/GetJobIndexRequest.java | 3 +-- .../jobscheduler/transport/GetJobTypeRequest.java | 3 +-- .../jobscheduler/rest/RestGetJobIndexActionTests.java | 6 ++++-- .../jobscheduler/rest/RestGetJobTypeActionTests.java | 4 +++- .../transport/GetJobIndexTransportActionTests.java | 2 +- .../transport/GetJobTypeTransportActionTests.java | 2 +- 7 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java index 8e22d6f6..cbe095f6 100644 --- a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java +++ b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java @@ -54,8 +54,6 @@ public String getName() { return GET_JOB_TYPE_ACTION; } - public RestGetJobTypeAction() {} - public RestGetJobTypeAction(Map indexToJobDetails) { this.indexToJobDetails = indexToJobDetails; } diff --git a/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java index d428413e..369db3c8 100644 --- a/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java @@ -125,7 +125,6 @@ public static GetJobIndexRequest parse(XContentParser parser) throws IOException } } - GetJobIndexRequest request = new GetJobIndexRequest(jobIndex, jobParserAction, jobRunnerAction, extensionId); - return request; + return new GetJobIndexRequest(jobIndex, jobParserAction, jobRunnerAction, extensionId); } } diff --git a/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeRequest.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeRequest.java index 8ba7d404..88352a40 100644 --- a/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeRequest.java +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeRequest.java @@ -88,7 +88,6 @@ public static GetJobTypeRequest parse(XContentParser parser) throws IOException } } - GetJobTypeRequest request = new GetJobTypeRequest(jobType, extensionId); - return request; + return new GetJobTypeRequest(jobType, extensionId); } } diff --git a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java index 4c650e63..8574d0f8 100644 --- a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java +++ b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java @@ -12,6 +12,8 @@ import org.opensearch.client.node.NodeClient; import org.opensearch.common.bytes.BytesArray; import org.opensearch.common.xcontent.XContentType; + +import org.opensearch.jobscheduler.JobSchedulerPlugin; import org.opensearch.jobscheduler.model.JobDetails; import org.opensearch.rest.RestHandler; import org.opensearch.rest.RestRequest; @@ -22,8 +24,8 @@ import java.io.IOException; import java.util.Map; import java.util.HashMap; +import java.util.Locale; import java.util.List; - import static org.hamcrest.Matchers.equalTo; import static org.mockito.Mockito.mock; @@ -40,7 +42,7 @@ public void setUp() throws Exception { super.setUp(); indexToJobDetails = new HashMap<>(); action = new RestGetJobIndexAction(indexToJobDetails); - getJobIndexPath = action.routes().get(0).getPath(); + getJobIndexPath = String.format(Locale.ROOT, "%s/%s", JobSchedulerPlugin.JS_BASE_URI, "_get/_job_index"); } public void testGetNames() { diff --git a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java index f62ee464..111ff95a 100644 --- a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java +++ b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java @@ -12,6 +12,7 @@ import org.opensearch.client.node.NodeClient; import org.opensearch.common.bytes.BytesArray; import org.opensearch.common.xcontent.XContentType; +import org.opensearch.jobscheduler.JobSchedulerPlugin; import org.opensearch.jobscheduler.model.JobDetails; import org.opensearch.rest.RestHandler; import org.opensearch.rest.RestRequest; @@ -22,6 +23,7 @@ import java.io.IOException; import java.util.Map; import java.util.HashMap; +import java.util.Locale; import java.util.List; import static org.hamcrest.Matchers.equalTo; @@ -40,7 +42,7 @@ public void setUp() throws Exception { super.setUp(); indexToJobDetails = new HashMap<>(); action = new RestGetJobTypeAction(indexToJobDetails); - getJobTypePath = action.routes().get(0).getPath(); + getJobTypePath = String.format(Locale.ROOT, "%s/%s", JobSchedulerPlugin.JS_BASE_URI, "_get/_job_type"); } public void testGetNames() { diff --git a/src/test/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportActionTests.java b/src/test/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportActionTests.java index a5458b24..92a29ad7 100644 --- a/src/test/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportActionTests.java +++ b/src/test/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportActionTests.java @@ -43,7 +43,7 @@ public void onResponse(GetJobDetailsResponse jobDetailsResponse) { public void onFailure(Exception e) { // As the onFailure method is not triggered from the execution of doExecute method, therefore assertFalse condition is // defined. - assertFalse(true); + fail("On failure method is not triggered from the test written below"); } }; diff --git a/src/test/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportActionTests.java b/src/test/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportActionTests.java index ff34558a..43ca03e3 100644 --- a/src/test/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportActionTests.java +++ b/src/test/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportActionTests.java @@ -43,7 +43,7 @@ public void onResponse(GetJobDetailsResponse jobDetailsResponse) { public void onFailure(Exception e) { // As the onFailure method is not triggered from the execution of doExecute method, therefore assertFalse condition is // defined. - assertFalse(true); + fail("On failure method is not triggered from the test written below"); } }; From 7933c4e599f27bb9a10576edd0aaa8648426ba00 Mon Sep 17 00:00:00 2001 From: Varun Jain Date: Fri, 30 Dec 2022 13:51:58 -0800 Subject: [PATCH 12/26] Commnunication Mechanism for JS Signed-off-by: Varun Jain --- .../java/org/opensearch/jobscheduler/constant/CommonValue.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/opensearch/jobscheduler/constant/CommonValue.java b/src/main/java/org/opensearch/jobscheduler/constant/CommonValue.java index fd8fcbf7..8fefb75e 100644 --- a/src/main/java/org/opensearch/jobscheduler/constant/CommonValue.java +++ b/src/main/java/org/opensearch/jobscheduler/constant/CommonValue.java @@ -10,5 +10,5 @@ public class CommonValue { - public static String EXTERNAL_ACTION_PREFIX = "cluster:admin/opendistro/js/"; + public static String EXTERNAL_ACTION_PREFIX = "cluster:admin/plugins/js/"; } From 37c8d0dbb73e8a0866b1b955f674a8178409b707 Mon Sep 17 00:00:00 2001 From: Varun Jain Date: Mon, 2 Jan 2023 17:27:59 -0800 Subject: [PATCH 13/26] Communication Mechanism for JS Signed-off-by: Varun Jain --- .../jobscheduler/JobSchedulerPlugin.java | 8 +- .../jobscheduler/model/JobDetails.java | 4 + .../rest/RestGetJobIndexAction.java | 92 +++++-- .../rest/RestGetJobTypeAction.java | 87 ++++-- .../transport/GetJobDetailsResponse.java | 1 + .../jobscheduler/utils/JobDetailsService.java | 259 ++++++++++++++++++ .../opensearch_plugins_job_details.json | 28 ++ .../rest/RestGetJobIndexActionTests.java | 112 ++++---- .../rest/RestGetJobTypeActionTests.java | 110 +++----- .../GetJobIndexTransportActionTests.java | 58 ---- .../GetJobTypeTransportActionTests.java | 57 ---- 11 files changed, 533 insertions(+), 283 deletions(-) create mode 100644 src/main/java/org/opensearch/jobscheduler/utils/JobDetailsService.java create mode 100644 src/main/java/resources/mappings/opensearch_plugins_job_details.json delete mode 100644 src/test/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportActionTests.java delete mode 100644 src/test/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportActionTests.java diff --git a/src/main/java/org/opensearch/jobscheduler/JobSchedulerPlugin.java b/src/main/java/org/opensearch/jobscheduler/JobSchedulerPlugin.java index 0f88f0a6..ae71cec4 100644 --- a/src/main/java/org/opensearch/jobscheduler/JobSchedulerPlugin.java +++ b/src/main/java/org/opensearch/jobscheduler/JobSchedulerPlugin.java @@ -43,6 +43,7 @@ import org.opensearch.jobscheduler.transport.GetJobIndexTransportAction; import org.opensearch.jobscheduler.transport.GetJobTypeAction; import org.opensearch.jobscheduler.transport.GetJobTypeTransportAction; +import org.opensearch.jobscheduler.utils.JobDetailsService; import org.opensearch.plugins.ActionPlugin; import org.opensearch.plugins.ExtensiblePlugin; import org.opensearch.plugins.Plugin; @@ -81,6 +82,8 @@ public class JobSchedulerPlugin extends Plugin implements ActionPlugin, Extensib private Set indicesToListen; private Map indexToJobDetails; + private JobDetailsService jobDetailsService; + public JobSchedulerPlugin() { this.indicesToListen = new HashSet<>(); this.indexToJobProviders = new HashMap<>(); @@ -102,6 +105,7 @@ public Collection createComponents( Supplier repositoriesServiceSupplier ) { this.lockService = new LockService(client, clusterService); + this.jobDetailsService = new JobDetailsService(client, clusterService); this.scheduler = new JobScheduler(threadPool, this.lockService); this.sweeper = initSweeper( environment.settings(), @@ -217,8 +221,8 @@ public List getRestHandlers( IndexNameExpressionResolver indexNameExpressionResolver, Supplier nodesInCluster ) { - RestGetJobIndexAction restGetJobIndexAction = new RestGetJobIndexAction(indexToJobDetails); - RestGetJobTypeAction restGetJobTypeAction = new RestGetJobTypeAction(indexToJobDetails); + RestGetJobIndexAction restGetJobIndexAction = new RestGetJobIndexAction(indexToJobDetails, jobDetailsService); + RestGetJobTypeAction restGetJobTypeAction = new RestGetJobTypeAction(indexToJobDetails, jobDetailsService); return ImmutableList.of(restGetJobIndexAction, restGetJobTypeAction); } diff --git a/src/main/java/org/opensearch/jobscheduler/model/JobDetails.java b/src/main/java/org/opensearch/jobscheduler/model/JobDetails.java index a51c764e..0c447d87 100644 --- a/src/main/java/org/opensearch/jobscheduler/model/JobDetails.java +++ b/src/main/java/org/opensearch/jobscheduler/model/JobDetails.java @@ -108,6 +108,10 @@ public static JobDetails parse(XContentParser parser) throws IOException { return new JobDetails(jobIndex, jobType, jobParserAction, jobRunnerAction); } + public JobDetails(final JobDetails copyJobDetails) { + this(copyJobDetails.jobIndex, copyJobDetails.jobType, copyJobDetails.jobParserAction, copyJobDetails.jobRunnerAction); + } + public String getJobIndex() { return jobIndex; } diff --git a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java index a572d93a..09b4cdf6 100644 --- a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java +++ b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java @@ -10,22 +10,19 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.opensearch.action.ActionListener; import org.opensearch.client.node.NodeClient; -import org.opensearch.common.xcontent.ToXContent; +import org.opensearch.common.xcontent.XContentBuilder; import org.opensearch.common.xcontent.XContentParser; import org.opensearch.jobscheduler.JobSchedulerPlugin; import org.opensearch.jobscheduler.model.JobDetails; -import org.opensearch.jobscheduler.transport.GetJobDetailsResponse; -import org.opensearch.jobscheduler.transport.GetJobIndexAction; import org.opensearch.jobscheduler.transport.GetJobIndexRequest; +import org.opensearch.jobscheduler.utils.JobDetailsService; import org.opensearch.rest.BaseRestHandler; -import org.opensearch.rest.RestChannel; import org.opensearch.rest.RestRequest; import org.opensearch.rest.RestStatus; -import org.opensearch.rest.RestResponse; import org.opensearch.rest.BytesRestResponse; -import org.opensearch.rest.action.RestResponseListener; import java.io.IOException; import java.util.List; @@ -48,8 +45,11 @@ public class RestGetJobIndexAction extends BaseRestHandler { private Map indexToJobDetails; - public RestGetJobIndexAction(Map indexToJobDetails) { + public JobDetailsService jobDetailsService; + + public RestGetJobIndexAction(Map indexToJobDetails, final JobDetailsService jobDetailsService) { this.indexToJobDetails = indexToJobDetails; + this.jobDetailsService = jobDetailsService; } @Override @@ -71,24 +71,80 @@ protected RestChannelConsumer prepareRequest(RestRequest restRequest, NodeClient GetJobIndexRequest getJobIndexRequest = GetJobIndexRequest.parse(parser); - JobDetails jobDetails = indexToJobDetails.getOrDefault(getJobIndexRequest.getExtensionId(), new JobDetails()); - jobDetails.setJobIndex(getJobIndexRequest.getJobIndex()); - jobDetails.setJobParserAction(getJobIndexRequest.getJobParserAction()); - jobDetails.setJobRunnerAction(getJobIndexRequest.getJobRunnerAction()); + final String[] response = new String[1]; + final JobDetails[] updateJobDetailsResponse = new JobDetails[1]; - indexToJobDetails.put(getJobIndexRequest.getExtensionId(), jobDetails); + // JobDetails jobDetails = indexToJobDetails.getOrDefault(getJobIndexRequest.getExtensionId(), new JobDetails()); + // jobDetails.setJobIndex(getJobIndexRequest.getJobIndex()); + // jobDetails.setJobParserAction(getJobIndexRequest.getJobParserAction()); + // jobDetails.setJobRunnerAction(getJobIndexRequest.getJobRunnerAction()); + // + // indexToJobDetails.put(getJobIndexRequest.getExtensionId(), jobDetails); - return channel -> client.execute(GetJobIndexAction.INSTANCE, getJobIndexRequest, getJobIndexResponse(channel, RestStatus.OK)); + String jobIndex = getJobIndexRequest.getJobIndex(); + String jobParserAction = getJobIndexRequest.getJobParserAction(); + String jobRunnerAction = getJobIndexRequest.getJobRunnerAction(); + String extensionId = getJobIndexRequest.getExtensionId(); - } + ActionListener actionListener = new ActionListener() { + @Override + public void onResponse(JobDetails jobDetails) { + if (jobDetails != null) { + response[0] = "success"; + updateJobDetailsResponse[0] = jobDetails; + } else { + response[0] = "failed"; + } + } - private RestResponseListener getJobIndexResponse(RestChannel channel, RestStatus status) { - return new RestResponseListener<>(channel) { @Override - public RestResponse buildResponse(GetJobDetailsResponse getJobDetailsResponse) throws Exception { - return new BytesRestResponse(status, getJobDetailsResponse.toXContent(channel.newBuilder(), ToXContent.EMPTY_PARAMS)); + public void onFailure(Exception e) { + response[0] = "failed"; + logger.info("could not process job index", e); } }; + + jobDetailsService.processJobIndexForExtensionId( + jobIndex, + null, + jobParserAction, + jobRunnerAction, + extensionId, + JobDetailsService.JobDetailsRequestType.JOB_INDEX, + actionListener + ); + + // return channel -> client.execute(GetJobIndexAction.INSTANCE, getJobIndexRequest, getJobIndexResponse(channel, RestStatus.OK)); + + return channel -> { + XContentBuilder builder = channel.newBuilder(); + RestStatus restStatus = RestStatus.OK; + BytesRestResponse bytesRestResponse; + try { + builder.startObject(); + builder.field("response", response[0]); + if (response[0] == "success") { + builder.field("jobDetails", updateJobDetailsResponse[0]); + } else { + restStatus = RestStatus.INTERNAL_SERVER_ERROR; + } + builder.endObject(); + bytesRestResponse = new BytesRestResponse(restStatus, builder); + } finally { + builder.close(); + } + + channel.sendResponse(bytesRestResponse); + }; } + // private RestResponseListener getJobIndexResponse(RestChannel channel, RestStatus status) { + // return new RestResponseListener<>(channel) { + // @Override + // public RestResponse buildResponse(GetJobDetailsResponse getJobDetailsResponse) throws Exception { + // return new BytesRestResponse(status, getJobDetailsResponse.toXContent(channel.newBuilder(), ToXContent.EMPTY_PARAMS)); + // } + // }; + // } + } diff --git a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java index cbe095f6..1339a4c7 100644 --- a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java +++ b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java @@ -10,24 +10,20 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.opensearch.action.ActionListener; import org.opensearch.client.node.NodeClient; -import org.opensearch.common.xcontent.ToXContent; +import org.opensearch.common.xcontent.XContentBuilder; import org.opensearch.common.xcontent.XContentParser; import org.opensearch.jobscheduler.JobSchedulerPlugin; import org.opensearch.jobscheduler.model.JobDetails; -import org.opensearch.jobscheduler.transport.GetJobDetailsResponse; -import org.opensearch.jobscheduler.transport.GetJobTypeAction; import org.opensearch.jobscheduler.transport.GetJobTypeRequest; +import org.opensearch.jobscheduler.utils.JobDetailsService; import org.opensearch.rest.BaseRestHandler; -import org.opensearch.rest.RestChannel; import org.opensearch.rest.RestRequest; import org.opensearch.rest.RestStatus; -import org.opensearch.rest.RestResponse; import org.opensearch.rest.BytesRestResponse; -import org.opensearch.rest.action.RestResponseListener; - import java.io.IOException; import java.util.List; import java.util.Locale; @@ -49,13 +45,16 @@ public class RestGetJobTypeAction extends BaseRestHandler { private Map indexToJobDetails; + public JobDetailsService jobDetailsService; + @Override public String getName() { return GET_JOB_TYPE_ACTION; } - public RestGetJobTypeAction(Map indexToJobDetails) { + public RestGetJobTypeAction(Map indexToJobDetails, final JobDetailsService jobDetailsService) { this.indexToJobDetails = indexToJobDetails; + this.jobDetailsService = jobDetailsService; } @Override @@ -71,19 +70,73 @@ protected RestChannelConsumer prepareRequest(RestRequest restRequest, NodeClient ensureExpectedToken(XContentParser.Token.START_OBJECT, parser.nextToken(), parser); GetJobTypeRequest getJobTypeRequest = GetJobTypeRequest.parse(parser); - JobDetails jobDetails = indexToJobDetails.getOrDefault(getJobTypeRequest.getExtensionId(), new JobDetails()); - jobDetails.setJobType(getJobTypeRequest.getJobType()); - indexToJobDetails.put(getJobTypeRequest.getExtensionId(), jobDetails); + final String[] response = new String[1]; + final JobDetails[] updateJobDetailsResponse = new JobDetails[1]; - return channel -> client.execute(GetJobTypeAction.INSTANCE, getJobTypeRequest, getJobTypeResponse(channel, RestStatus.OK)); - } + // JobDetails jobDetails = indexToJobDetails.getOrDefault(getJobTypeRequest.getExtensionId(), new JobDetails()); + // jobDetails.setJobType(getJobTypeRequest.getJobType()); + // indexToJobDetails.put(getJobTypeRequest.getExtensionId(), jobDetails); + + String jobType = getJobTypeRequest.getJobType(); + String extensionId = getJobTypeRequest.getExtensionId(); + + ActionListener actionListener = new ActionListener() { + @Override + public void onResponse(JobDetails jobDetails) { + if (jobDetails != null) { + response[0] = "success"; + updateJobDetailsResponse[0] = jobDetails; + } else { + response[0] = "failed"; + } + } - private RestResponseListener getJobTypeResponse(RestChannel channel, RestStatus status) { - return new RestResponseListener<>(channel) { @Override - public RestResponse buildResponse(GetJobDetailsResponse response) throws Exception { - return new BytesRestResponse(status, response.toXContent(channel.newBuilder(), ToXContent.EMPTY_PARAMS)); + public void onFailure(Exception e) { + response[0] = "failed"; + logger.info("could not process job type", e); } }; + + jobDetailsService.processJobIndexForExtensionId( + null, + jobType, + null, + null, + extensionId, + JobDetailsService.JobDetailsRequestType.JOB_TYPE, + actionListener + ); + + // return channel -> client.execute(GetJobTypeAction.INSTANCE, getJobTypeRequest, getJobTypeResponse(channel, RestStatus.OK)); + return channel -> { + XContentBuilder builder = channel.newBuilder(); + RestStatus restStatus = RestStatus.OK; + BytesRestResponse bytesRestResponse; + try { + builder.startObject(); + builder.field("response", response[0]); + if (response[0] == "success") { + builder.field("jobDetails", updateJobDetailsResponse[0]); + } else { + restStatus = RestStatus.INTERNAL_SERVER_ERROR; + } + builder.endObject(); + bytesRestResponse = new BytesRestResponse(restStatus, builder); + } finally { + builder.close(); + } + + channel.sendResponse(bytesRestResponse); + }; } + + // private RestResponseListener getJobTypeResponse(RestChannel channel, RestStatus status) { + // return new RestResponseListener<>(channel) { + // @Override + // public RestResponse buildResponse(GetJobDetailsResponse response) throws Exception { + // return new BytesRestResponse(status, response.toXContent(channel.newBuilder(), ToXContent.EMPTY_PARAMS)); + // } + // }; + // } } diff --git a/src/main/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponse.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponse.java index dc6b2739..b4c025f9 100644 --- a/src/main/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponse.java +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobDetailsResponse.java @@ -24,6 +24,7 @@ public class GetJobDetailsResponse extends ActionResponse implements ToXContentO private final RestStatus restStatus; private final String response; + private final static String RESPONSE = "response"; public GetJobDetailsResponse(StreamInput in) throws IOException { diff --git a/src/main/java/org/opensearch/jobscheduler/utils/JobDetailsService.java b/src/main/java/org/opensearch/jobscheduler/utils/JobDetailsService.java new file mode 100644 index 00000000..281a5ef3 --- /dev/null +++ b/src/main/java/org/opensearch/jobscheduler/utils/JobDetailsService.java @@ -0,0 +1,259 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + * + * The OpenSearch Contributors require contributions made to + * this file be licensed under the Apache-2.0 license or a + * compatible open source license. + */ +package org.opensearch.jobscheduler.utils; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.opensearch.ResourceAlreadyExistsException; +import org.opensearch.action.ActionListener; +import org.opensearch.action.DocWriteResponse; +import org.opensearch.action.admin.indices.create.CreateIndexRequest; +import org.opensearch.action.delete.DeleteRequest; +import org.opensearch.action.get.GetRequest; +import org.opensearch.action.index.IndexRequest; +import org.opensearch.action.update.UpdateRequest; +import org.opensearch.client.Client; +import org.opensearch.cluster.service.ClusterService; +import org.opensearch.common.xcontent.ToXContent; +import org.opensearch.common.xcontent.XContentFactory; +import org.opensearch.common.xcontent.XContentParser; +import org.opensearch.common.xcontent.XContentType; +import org.opensearch.common.xcontent.NamedXContentRegistry; +import org.opensearch.common.xcontent.LoggingDeprecationHandler; +import org.opensearch.index.IndexNotFoundException; +import org.opensearch.index.engine.DocumentMissingException; +import org.opensearch.index.engine.VersionConflictEngineException; +import org.opensearch.index.seqno.SequenceNumbers; +import org.opensearch.jobscheduler.model.JobDetails; + +public final class JobDetailsService { + + private static final Logger logger = LogManager.getLogger(JobDetailsService.class); + private static final String JOB_DETAILS_INDEX_NAME = ".opensearch-plugins-job-details"; + + private final Client client; + private final ClusterService clusterService; + + public JobDetailsService(final Client client, final ClusterService clusterService) { + this.client = client; + this.clusterService = clusterService; + } + + public boolean jobDetailsIndexExist() { + return clusterService.state().routingTable().hasIndex(JOB_DETAILS_INDEX_NAME); + } + + @VisibleForTesting + void createJobDetailsIndex(ActionListener listener) { + if (jobDetailsIndexExist()) { + listener.onResponse(true); + } else { + final CreateIndexRequest request = new CreateIndexRequest(JOB_DETAILS_INDEX_NAME).mapping(jobDetailsMapping()); + client.admin() + .indices() + .create(request, ActionListener.wrap(response -> listener.onResponse(response.isAcknowledged()), exception -> { + if (exception instanceof ResourceAlreadyExistsException + || exception.getCause() instanceof ResourceAlreadyExistsException) { + listener.onResponse(true); + } else { + listener.onFailure(exception); + } + })); + } + } + + public void processJobIndexForExtensionId( + final String jobIndexName, + final String jobTypeName, + final String jobParserActionName, + final String jobRunnerActionName, + final String extensionId, + final JobDetailsRequestType requestType, + ActionListener listener + ) { + boolean isJobIndexRequest; + if (requestType.JOB_INDEX == requestType) { + isJobIndexRequest = true; + if (jobIndexName == null) { + listener.onFailure(new IllegalArgumentException("Job Index Name should not be null")); + } else if (jobParserActionName == null) { + listener.onFailure(new IllegalArgumentException("Job Parser Action Name should not be null")); + } else if (jobRunnerActionName == null) { + listener.onFailure(new IllegalArgumentException("Job Runner Action Name should not be null")); + } + } else { + isJobIndexRequest = false; + if (jobTypeName == null) { + listener.onFailure(new IllegalArgumentException("Job Type Name should not be null")); + } + } + if (extensionId == null) { + listener.onFailure(new IllegalArgumentException("Extension Id should not be null")); + } else { + createJobDetailsIndex(ActionListener.wrap(created -> { + if (created) { + try { + findJobDetailsForExtensionId(extensionId, ActionListener.wrap(existingJobDetails -> { + if (existingJobDetails != null) { + logger.debug("Updating job details for extension id: " + extensionId + existingJobDetails); + JobDetails updateJobDetails = new JobDetails(existingJobDetails); + if (isJobIndexRequest) { + updateJobDetails.setJobIndex(jobIndexName); + updateJobDetails.setJobParserAction(jobParserActionName); + updateJobDetails.setJobRunnerAction(jobRunnerActionName); + } else { + updateJobDetails.setJobType(jobTypeName); + } + updateJobDetailsForExtensionId(updateJobDetails, extensionId, listener); + + } else { + JobDetails tempJobDetails = new JobDetails(); + if (isJobIndexRequest) { + tempJobDetails.setJobIndex(jobIndexName); + tempJobDetails.setJobParserAction(jobParserActionName); + tempJobDetails.setJobRunnerAction(jobRunnerActionName); + } else { + tempJobDetails.setJobType(jobTypeName); + } + logger.debug( + "Job Details for extension Id " + + extensionId + + " does not exist. Creating new Job Details" + + tempJobDetails + ); + createJobDetailsForExtensionId(tempJobDetails, extensionId, listener); + } + }, listener::onFailure)); + } catch (VersionConflictEngineException e) { + logger.debug("could not process job index for extensionId " + extensionId, e.getMessage()); + listener.onResponse(null); + } + } else { + listener.onResponse(null); + } + }, listener::onFailure)); + } + } + + private void createJobDetailsForExtensionId(final JobDetails tempJobDetails, String extensionId, ActionListener listener) { + try { + final IndexRequest request = new IndexRequest(JOB_DETAILS_INDEX_NAME).id(extensionId) + .source(tempJobDetails.toXContent(XContentFactory.jsonBuilder(), ToXContent.EMPTY_PARAMS)) + .setIfSeqNo(SequenceNumbers.UNASSIGNED_SEQ_NO) + .setIfPrimaryTerm(SequenceNumbers.UNASSIGNED_PRIMARY_TERM) + .create(true); + client.index(request, ActionListener.wrap(response -> listener.onResponse(new JobDetails(tempJobDetails)), exception -> { + if (exception instanceof VersionConflictEngineException) { + logger.debug("Job Details for extension id " + extensionId + " is already created. {}", exception.getMessage()); + } + if (exception instanceof IOException) { + logger.error("IOException occurred creating job details", exception); + } + listener.onResponse(null); + })); + } catch (IOException e) { + logger.error("IOException occurred creating job details for extension id " + extensionId, e); + listener.onResponse(null); + } + } + + private void findJobDetailsForExtensionId(final String extensionId, ActionListener listener) { + GetRequest getRequest = new GetRequest(JOB_DETAILS_INDEX_NAME).id(extensionId); + client.get(getRequest, ActionListener.wrap(response -> { + if (!response.isExists()) { + listener.onResponse(null); + } else { + try { + XContentParser parser = XContentType.JSON.xContent() + .createParser(NamedXContentRegistry.EMPTY, LoggingDeprecationHandler.INSTANCE, response.getSourceAsString()); + parser.nextToken(); + listener.onResponse(JobDetails.parse(parser)); + } catch (IOException e) { + logger.error("IOException occurred finding JobDetails for extension id " + extensionId, e); + listener.onResponse(null); + } + } + }, exception -> { + logger.error("Exception occurred finding job details for extension id " + extensionId, exception); + listener.onFailure(exception); + })); + } + + public void deleteJobDetailsForExtension(final String extensionId, ActionListener listener) { + DeleteRequest deleteRequest = new DeleteRequest(JOB_DETAILS_INDEX_NAME).id(extensionId); + client.delete(deleteRequest, ActionListener.wrap(response -> { + listener.onResponse( + response.getResult() == DocWriteResponse.Result.DELETED || response.getResult() == DocWriteResponse.Result.NOT_FOUND + ); + }, exception -> { + if (exception instanceof IndexNotFoundException || exception.getCause() instanceof IndexNotFoundException) { + logger.debug("Index is not found to delete job details for extension id. {} " + extensionId, exception.getMessage()); + listener.onResponse(true); + } else { + listener.onFailure(exception); + } + })); + } + + private void updateJobDetailsForExtensionId( + final JobDetails updateJobDetails, + final String extensionId, + ActionListener listener + ) { + try { + UpdateRequest updateRequest = new UpdateRequest().index(JOB_DETAILS_INDEX_NAME) + .id(extensionId) + .doc(updateJobDetails.toXContent(XContentFactory.jsonBuilder(), ToXContent.EMPTY_PARAMS)) + .fetchSource(true); + + client.update( + updateRequest, + ActionListener.wrap(response -> listener.onResponse(new JobDetails(updateJobDetails)), exception -> { + if (exception instanceof VersionConflictEngineException) { + logger.debug("could not update job details for extensionId " + extensionId, exception.getMessage()); + } + if (exception instanceof DocumentMissingException) { + logger.debug("Document is deleted. This happens if the job details is already removed {}", exception.getMessage()); + } + if (exception instanceof IOException) { + logger.error("IOException occurred in updating job details.", exception); + } + listener.onResponse(null); + }) + ); + } catch (IOException e) { + logger.error("IOException occurred updating job details for extension id " + extensionId, e); + listener.onResponse(null); + } + } + + private String jobDetailsMapping() { + try { + InputStream in = JobDetailsService.class.getResourceAsStream("opensearch_plugins_job_details.json"); + StringBuilder stringBuilder = new StringBuilder(); + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8)); + for (String line; (line = bufferedReader.readLine()) != null;) { + stringBuilder.append(line); + } + return stringBuilder.toString(); + } catch (IOException e) { + throw new IllegalArgumentException("JobDetails Mapping cannot be read correctly."); + } + } + + public enum JobDetailsRequestType { + JOB_INDEX, + JOB_TYPE + } +} diff --git a/src/main/java/resources/mappings/opensearch_plugins_job_details.json b/src/main/java/resources/mappings/opensearch_plugins_job_details.json new file mode 100644 index 00000000..3a460c57 --- /dev/null +++ b/src/main/java/resources/mappings/opensearch_plugins_job_details.json @@ -0,0 +1,28 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + * + * The OpenSearch Contributors require contributions made to + * this file be licensed under the Apache-2.0 license or a + * compatible open source license. + */ +{ + "dynamic": "false", + "properties": { + "job_index_name": { + "type": "keyword" + }, + "job_type_name": { + "type": "keyword" + }, + "job_parser_action": { + "type": "keyword" + }, + "job_runner_action": { + "type": "keyword" + }, + "extension_id": { + "type": "keyword" + } + } +} diff --git a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java index 8574d0f8..7cef134f 100644 --- a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java +++ b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java @@ -8,69 +8,49 @@ */ package org.opensearch.jobscheduler.rest; -import org.junit.Before; -import org.opensearch.client.node.NodeClient; -import org.opensearch.common.bytes.BytesArray; -import org.opensearch.common.xcontent.XContentType; - -import org.opensearch.jobscheduler.JobSchedulerPlugin; -import org.opensearch.jobscheduler.model.JobDetails; -import org.opensearch.rest.RestHandler; -import org.opensearch.rest.RestRequest; -import org.opensearch.test.OpenSearchTestCase; -import org.opensearch.test.rest.FakeRestChannel; -import org.opensearch.test.rest.FakeRestRequest; - -import java.io.IOException; -import java.util.Map; -import java.util.HashMap; -import java.util.Locale; -import java.util.List; -import static org.hamcrest.Matchers.equalTo; -import static org.mockito.Mockito.mock; - -public class RestGetJobIndexActionTests extends OpenSearchTestCase { - - private RestGetJobIndexAction action; - - public Map indexToJobDetails; - - private String getJobIndexPath; - - @Before - public void setUp() throws Exception { - super.setUp(); - indexToJobDetails = new HashMap<>(); - action = new RestGetJobIndexAction(indexToJobDetails); - getJobIndexPath = String.format(Locale.ROOT, "%s/%s", JobSchedulerPlugin.JS_BASE_URI, "_get/_job_index"); - } - - public void testGetNames() { - String name = action.getName(); - assertEquals(action.GET_JOB_INDEX_ACTION, name); - } - - public void testGetRoutes() { - List routes = action.routes(); - - assertEquals(getJobIndexPath, routes.get(0).getPath()); - } - - public void testPrepareRequest() throws IOException { - - String content = - "{\"job_index\":\"demo_job_index\",\"job_runner_action\":\"action\",\"job_parser_action\":\"parser_action\",\"extension_id\":\"extension_id\"}"; - Map params = new HashMap<>(); - FakeRestRequest request = new FakeRestRequest.Builder(xContentRegistry()).withMethod(RestRequest.Method.PUT) - .withPath(getJobIndexPath) - .withParams(params) - .withContent(new BytesArray(content), XContentType.JSON) - .build(); - - final FakeRestChannel channel = new FakeRestChannel(request, true, 0); - action.prepareRequest(request, mock(NodeClient.class)); - - assertThat(channel.responses().get(), equalTo(0)); - assertThat(channel.errors().get(), equalTo(0)); - } -} +// +// public class RestGetJobIndexActionTests extends OpenSearchTestCase { +// +// private RestGetJobIndexAction action; +// +// public Map indexToJobDetails; +// +// private String getJobIndexPath; +// +// @Before +// public void setUp() throws Exception { +// super.setUp(); +// indexToJobDetails = new HashMap<>(); +// action = new RestGetJobIndexAction(indexToJobDetails); +// getJobIndexPath = String.format(Locale.ROOT, "%s/%s", JobSchedulerPlugin.JS_BASE_URI, "_get/_job_index"); +// } +// +// public void testGetNames() { +// String name = action.getName(); +// assertEquals(action.GET_JOB_INDEX_ACTION, name); +// } +// +// public void testGetRoutes() { +// List routes = action.routes(); +// +// assertEquals(getJobIndexPath, routes.get(0).getPath()); +// } +// +// public void testPrepareRequest() throws IOException { +// +// String content = +// "{\"job_index\":\"demo_job_index\",\"job_runner_action\":\"action\",\"job_parser_action\":\"parser_action\",\"extension_id\":\"extension_id\"}"; +// Map params = new HashMap<>(); +// FakeRestRequest request = new FakeRestRequest.Builder(xContentRegistry()).withMethod(RestRequest.Method.PUT) +// .withPath(getJobIndexPath) +// .withParams(params) +// .withContent(new BytesArray(content), XContentType.JSON) +// .build(); +// +// final FakeRestChannel channel = new FakeRestChannel(request, true, 0); +// action.prepareRequest(request, mock(NodeClient.class)); +// +// assertThat(channel.responses().get(), equalTo(0)); +// assertThat(channel.errors().get(), equalTo(0)); +// } +// } diff --git a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java index 111ff95a..30e5317b 100644 --- a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java +++ b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java @@ -8,68 +8,48 @@ */ package org.opensearch.jobscheduler.rest; -import org.junit.Before; -import org.opensearch.client.node.NodeClient; -import org.opensearch.common.bytes.BytesArray; -import org.opensearch.common.xcontent.XContentType; -import org.opensearch.jobscheduler.JobSchedulerPlugin; -import org.opensearch.jobscheduler.model.JobDetails; -import org.opensearch.rest.RestHandler; -import org.opensearch.rest.RestRequest; -import org.opensearch.test.OpenSearchTestCase; -import org.opensearch.test.rest.FakeRestChannel; -import org.opensearch.test.rest.FakeRestRequest; - -import java.io.IOException; -import java.util.Map; -import java.util.HashMap; -import java.util.Locale; -import java.util.List; - -import static org.hamcrest.Matchers.equalTo; -import static org.mockito.Mockito.mock; - -public class RestGetJobTypeActionTests extends OpenSearchTestCase { - - private RestGetJobTypeAction action; - - public Map indexToJobDetails; - - private String getJobTypePath; - - @Before - public void setUp() throws Exception { - super.setUp(); - indexToJobDetails = new HashMap<>(); - action = new RestGetJobTypeAction(indexToJobDetails); - getJobTypePath = String.format(Locale.ROOT, "%s/%s", JobSchedulerPlugin.JS_BASE_URI, "_get/_job_type"); - } - - public void testGetNames() { - String name = action.getName(); - assertEquals(action.GET_JOB_TYPE_ACTION, name); - } - - public void testGetRoutes() { - List routes = action.routes(); - - assertEquals(getJobTypePath, routes.get(0).getPath()); - } - - public void testPrepareRequest() throws IOException { - - String content = "{\"job_type\":\"demo_job_type\",\"extension_id\":\"extension_id\"}"; - Map params = new HashMap<>(); - FakeRestRequest request = new FakeRestRequest.Builder(xContentRegistry()).withMethod(RestRequest.Method.PUT) - .withPath(getJobTypePath) - .withParams(params) - .withContent(new BytesArray(content), XContentType.JSON) - .build(); - - final FakeRestChannel channel = new FakeRestChannel(request, true, 0); - action.prepareRequest(request, mock(NodeClient.class)); - - assertThat(channel.responses().get(), equalTo(0)); - assertThat(channel.errors().get(), equalTo(0)); - } -} +// +// public class RestGetJobTypeActionTests extends OpenSearchTestCase { +// +// private RestGetJobTypeAction action; +// +// public Map indexToJobDetails; +// +// private String getJobTypePath; +// +// @Before +// public void setUp() throws Exception { +// super.setUp(); +// indexToJobDetails = new HashMap<>(); +// action = new RestGetJobTypeAction(indexToJobDetails); +// getJobTypePath = String.format(Locale.ROOT, "%s/%s", JobSchedulerPlugin.JS_BASE_URI, "_get/_job_type"); +// } +// +// public void testGetNames() { +// String name = action.getName(); +// assertEquals(action.GET_JOB_TYPE_ACTION, name); +// } +// +// public void testGetRoutes() { +// List routes = action.routes(); +// +// assertEquals(getJobTypePath, routes.get(0).getPath()); +// } +// +// public void testPrepareRequest() throws IOException { +// +// String content = "{\"job_type\":\"demo_job_type\",\"extension_id\":\"extension_id\"}"; +// Map params = new HashMap<>(); +// FakeRestRequest request = new FakeRestRequest.Builder(xContentRegistry()).withMethod(RestRequest.Method.PUT) +// .withPath(getJobTypePath) +// .withParams(params) +// .withContent(new BytesArray(content), XContentType.JSON) +// .build(); +// +// final FakeRestChannel channel = new FakeRestChannel(request, true, 0); +// action.prepareRequest(request, mock(NodeClient.class)); +// +// assertThat(channel.responses().get(), equalTo(0)); +// assertThat(channel.errors().get(), equalTo(0)); +// } +// } diff --git a/src/test/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportActionTests.java b/src/test/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportActionTests.java deleted file mode 100644 index 92a29ad7..00000000 --- a/src/test/java/org/opensearch/jobscheduler/transport/GetJobIndexTransportActionTests.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - * - * The OpenSearch Contributors require contributions made to - * this file be licensed under the Apache-2.0 license or a - * compatible open source license. - */ -package org.opensearch.jobscheduler.transport; - -import org.junit.Before; -import org.opensearch.action.ActionListener; -import org.opensearch.action.support.ActionFilters; -import org.opensearch.tasks.Task; -import org.opensearch.test.OpenSearchTestCase; -import org.opensearch.transport.TransportService; - -import static org.mockito.Mockito.mock; - -public class GetJobIndexTransportActionTests extends OpenSearchTestCase { - - private GetJobIndexTransportAction action; - - private Task task; - - private GetJobIndexRequest request; - - private ActionListener response; - - @Before - public void setUp() throws Exception { - super.setUp(); - action = new GetJobIndexTransportAction("", mock(TransportService.class), mock(ActionFilters.class)); - request = new GetJobIndexRequest("demo_job_index", "job_parser_action", "job_runner_action", "extension_id"); - task = mock(Task.class); - response = new ActionListener<>() { - @Override - public void onResponse(GetJobDetailsResponse jobDetailsResponse) { - assertEquals("success", jobDetailsResponse.getResponse()); - } - - @Override - public void onFailure(Exception e) { - // As the onFailure method is not triggered from the execution of doExecute method, therefore assertFalse condition is - // defined. - fail("On failure method is not triggered from the test written below"); - } - }; - - } - - public void testGetJobIndexTransportAction() { - // do execute method with internally trigger onresponse method of the actionlistener. - // The definition of onResponse is defined in the setup() method above. - action.doExecute(task, request, response); - - } -} diff --git a/src/test/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportActionTests.java b/src/test/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportActionTests.java deleted file mode 100644 index 43ca03e3..00000000 --- a/src/test/java/org/opensearch/jobscheduler/transport/GetJobTypeTransportActionTests.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - * - * The OpenSearch Contributors require contributions made to - * this file be licensed under the Apache-2.0 license or a - * compatible open source license. - */ -package org.opensearch.jobscheduler.transport; - -import org.junit.Before; -import org.opensearch.action.ActionListener; -import org.opensearch.action.support.ActionFilters; -import org.opensearch.tasks.Task; -import org.opensearch.test.OpenSearchTestCase; -import org.opensearch.transport.TransportService; - -import static org.mockito.Mockito.mock; - -public class GetJobTypeTransportActionTests extends OpenSearchTestCase { - - private GetJobTypeTransportAction action; - - private Task task; - - private GetJobTypeRequest request; - - private ActionListener response; - - @Before - public void setUp() throws Exception { - super.setUp(); - action = new GetJobTypeTransportAction("", mock(TransportService.class), mock(ActionFilters.class)); - request = new GetJobTypeRequest("demo_job_type", "extension_id"); - task = mock(Task.class); - response = new ActionListener<>() { - @Override - public void onResponse(GetJobDetailsResponse jobDetailsResponse) { - assertEquals("success", jobDetailsResponse.getResponse()); - } - - @Override - public void onFailure(Exception e) { - // As the onFailure method is not triggered from the execution of doExecute method, therefore assertFalse condition is - // defined. - fail("On failure method is not triggered from the test written below"); - } - }; - - } - - public void testGetJobTypeTransportAction() { - // do execute method with internally trigger onresponse method of the actionlistener. - // The definition of onResponse is defined in the setup() method above. - action.doExecute(task, request, response); - } -} From 1367c022a918e92eadcee81a619144db15aa7541 Mon Sep 17 00:00:00 2001 From: Varun Jain Date: Tue, 3 Jan 2023 15:38:51 -0800 Subject: [PATCH 14/26] Communication Mechanism for JS Signed-off-by: Varun Jain --- .../jobscheduler/model/JobDetails.java | 38 ++--- .../rest/RestGetJobIndexAction.java | 16 +- .../rest/RestGetJobTypeAction.java | 7 +- .../transport/GetJobIndexRequest.java | 26 ++-- .../jobscheduler/utils/JobDetailsService.java | 78 ++++++---- .../opensearch/jobscheduler/TestHelpers.java | 26 ---- .../rest/RestGetJobIndexActionTests.java | 121 +++++++++------ .../rest/RestGetJobTypeActionTests.java | 119 +++++++++------ .../utils/JobDetailsServiceIT.java | 142 ++++++++++++++++++ 9 files changed, 386 insertions(+), 187 deletions(-) delete mode 100644 src/test/java/org/opensearch/jobscheduler/TestHelpers.java create mode 100644 src/test/java/org/opensearch/jobscheduler/utils/JobDetailsServiceIT.java diff --git a/src/main/java/org/opensearch/jobscheduler/model/JobDetails.java b/src/main/java/org/opensearch/jobscheduler/model/JobDetails.java index 0c447d87..f79e5f64 100644 --- a/src/main/java/org/opensearch/jobscheduler/model/JobDetails.java +++ b/src/main/java/org/opensearch/jobscheduler/model/JobDetails.java @@ -36,7 +36,7 @@ public class JobDetails implements ToXContentObject { /** * jobParser action to trigger the response back to the extension. */ - private String jobParserAction; + private String jobParameterAction; /** * jobRunner action to trigger the response back to the extension. @@ -45,15 +45,15 @@ public class JobDetails implements ToXContentObject { public static final String JOB_INDEX = "job_index"; public static final String JOB_TYPE = "job_type"; - public static final String JOB_PARSER_ACTION = "job_parser_action"; + public static final String JOB_PARAMETER_ACTION = "job_parser_action"; public static final String JOB_RUNNER_ACTION = "job_runner_action"; public JobDetails() {} - public JobDetails(String jobIndex, String jobType, String jobParserAction, String jobRunnerAction) { + public JobDetails(String jobIndex, String jobType, String jobParameterAction, String jobRunnerAction) { this.jobIndex = jobIndex; this.jobType = jobType; - this.jobParserAction = jobParserAction; + this.jobParameterAction = jobParameterAction; this.jobRunnerAction = jobRunnerAction; } @@ -66,8 +66,8 @@ public XContentBuilder toXContent(XContentBuilder builder, ToXContent.Params par if (jobType != null) { xContentBuilder.field(JOB_TYPE, jobType); } - if (jobParserAction != null) { - xContentBuilder.field(JOB_PARSER_ACTION, jobParserAction); + if (jobParameterAction != null) { + xContentBuilder.field(JOB_PARAMETER_ACTION, jobParameterAction); } if (jobRunnerAction != null) { xContentBuilder.field(JOB_RUNNER_ACTION, jobRunnerAction); @@ -78,7 +78,7 @@ public XContentBuilder toXContent(XContentBuilder builder, ToXContent.Params par public static JobDetails parse(XContentParser parser) throws IOException { String jobIndex = null; String jobType = null; - String jobParserAction = null; + String jobParameterAction = null; String jobRunnerAction = null; ensureExpectedToken(XContentParser.Token.START_OBJECT, parser.currentToken(), parser); @@ -93,8 +93,8 @@ public static JobDetails parse(XContentParser parser) throws IOException { case JOB_TYPE: jobType = parser.text(); break; - case JOB_PARSER_ACTION: - jobParserAction = parser.text(); + case JOB_PARAMETER_ACTION: + jobParameterAction = parser.text(); break; case JOB_RUNNER_ACTION: jobRunnerAction = parser.text(); @@ -105,11 +105,11 @@ public static JobDetails parse(XContentParser parser) throws IOException { } } - return new JobDetails(jobIndex, jobType, jobParserAction, jobRunnerAction); + return new JobDetails(jobIndex, jobType, jobParameterAction, jobRunnerAction); } public JobDetails(final JobDetails copyJobDetails) { - this(copyJobDetails.jobIndex, copyJobDetails.jobType, copyJobDetails.jobParserAction, copyJobDetails.jobRunnerAction); + this(copyJobDetails.jobIndex, copyJobDetails.jobType, copyJobDetails.jobParameterAction, copyJobDetails.jobRunnerAction); } public String getJobIndex() { @@ -128,12 +128,12 @@ public void setJobType(String jobType) { this.jobType = jobType; } - public String getJobParserAction() { - return jobParserAction; + public String getJobParameterAction() { + return jobParameterAction; } - public void setJobParserAction(String jobParserAction) { - this.jobParserAction = jobParserAction; + public void setJobParameterAction(String jobParameterAction) { + this.jobParameterAction = jobParameterAction; } public String getJobRunnerAction() { @@ -151,13 +151,13 @@ public boolean equals(Object o) { JobDetails that = (JobDetails) o; return Objects.equals(jobIndex, that.jobIndex) && Objects.equals(jobType, that.jobType) - && Objects.equals(jobParserAction, that.jobParserAction) + && Objects.equals(jobParameterAction, that.jobParameterAction) && Objects.equals(jobRunnerAction, that.jobRunnerAction); } @Override public int hashCode() { - return Objects.hash(jobIndex, jobType, jobParserAction, jobRunnerAction); + return Objects.hash(jobIndex, jobType, jobParameterAction, jobRunnerAction); } @Override @@ -169,8 +169,8 @@ public String toString() { + ", jobType='" + jobType + '\'' - + ", jobParserAction='" - + jobParserAction + + ", jobParameterAction='" + + jobParameterAction + '\'' + ", jobRunnerAction='" + jobRunnerAction diff --git a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java index 510b6c73..5e4585a1 100644 --- a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java +++ b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java @@ -19,8 +19,6 @@ import org.opensearch.jobscheduler.transport.GetJobIndexRequest; -import org.opensearch.jobscheduler.transport.GetJobIndexRequest; - import org.opensearch.jobscheduler.utils.JobDetailsService; import org.opensearch.rest.BaseRestHandler; import org.opensearch.rest.RestRequest; @@ -76,23 +74,22 @@ protected RestChannelConsumer prepareRequest(RestRequest restRequest, NodeClient final JobDetails[] updateJobDetailsResponse = new JobDetails[1]; String jobIndex = getJobIndexRequest.getJobIndex(); - String jobParserAction = getJobIndexRequest.getJobParserAction(); + String jobParameterAction = getJobIndexRequest.getJobParameterAction(); String jobRunnerAction = getJobIndexRequest.getJobRunnerAction(); String extensionId = getJobIndexRequest.getExtensionId(); CountDownLatch latch = new CountDownLatch(1); - jobDetailsService.processJobIndexForExtensionId( + jobDetailsService.processJobDetailsForExtensionId( jobIndex, null, - jobParserAction, + jobParameterAction, jobRunnerAction, extensionId, JobDetailsService.JobDetailsRequestType.JOB_INDEX, - new ActionListener() { + new ActionListener<>() { @Override public void onResponse(JobDetails jobDetails) { - logger.info("In On response"); if (jobDetails != null) { restResponse[0] = "success"; updateJobDetailsResponse[0] = jobDetails; @@ -113,9 +110,9 @@ public void onFailure(Exception e) { ); try { - latch.await(10, TimeUnit.SECONDS); + latch.await(5, TimeUnit.SECONDS); } catch (Exception e) { - logger.info("Could not get Job Index due to exception ", e); + logger.info("Could not process job index due to exception ", e); } return channel -> { @@ -123,7 +120,6 @@ public void onFailure(Exception e) { RestStatus restStatus = RestStatus.OK; BytesRestResponse bytesRestResponse; try { - logger.info("Returning Response"); builder.startObject(); builder.field("response", restResponse[0]); if (restResponse[0] == "success") { diff --git a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java index aaa0ca4e..9236c847 100644 --- a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java +++ b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java @@ -76,7 +76,7 @@ protected RestChannelConsumer prepareRequest(RestRequest restRequest, NodeClient CountDownLatch latch = new CountDownLatch(1); - jobDetailsService.processJobIndexForExtensionId( + jobDetailsService.processJobDetailsForExtensionId( null, jobType, null, @@ -86,7 +86,6 @@ protected RestChannelConsumer prepareRequest(RestRequest restRequest, NodeClient new ActionListener() { @Override public void onResponse(JobDetails jobDetails) { - logger.info("In On response"); if (jobDetails != null) { restResponse[0] = "success"; updateJobDetailsResponse[0] = jobDetails; @@ -107,9 +106,9 @@ public void onFailure(Exception e) { ); try { - latch.await(10, TimeUnit.SECONDS); + latch.await(5, TimeUnit.SECONDS); } catch (Exception e) { - logger.info("Could not get Job Type due to exception ", e); + logger.info("Could not get job type due to exception ", e); } return channel -> { diff --git a/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java index 369db3c8..f421bf0c 100644 --- a/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java @@ -24,7 +24,7 @@ public class GetJobIndexRequest extends ActionRequest { private static String jobIndex; - private static String jobParserAction; + private static String jobParameterAction; private static String jobRunnerAction; @@ -33,22 +33,22 @@ public class GetJobIndexRequest extends ActionRequest { public static final String JOB_INDEX = "job_index"; public static final String EXTENSION_ID = "extension_id"; - private static final String JOB_PARSER_ACTION = "job_parser_action"; + private static final String JOB_PARAMETER_ACTION = "job_parser_action"; public static final String JOB_RUNNER_ACTION = "job_runner_action"; public GetJobIndexRequest(StreamInput in) throws IOException { super(in); jobIndex = in.readString(); - jobParserAction = in.readString(); + jobParameterAction = in.readString(); jobRunnerAction = in.readString(); extensionId = in.readString(); } - public GetJobIndexRequest(String jobIndex, String jobParserAction, String jobRunnerAction, String extensionId) { + public GetJobIndexRequest(String jobIndex, String jobParameterAction, String jobRunnerAction, String extensionId) { super(); this.jobIndex = jobIndex; - this.jobParserAction = jobParserAction; + this.jobParameterAction = jobParameterAction; this.jobRunnerAction = jobRunnerAction; this.extensionId = extensionId; } @@ -57,7 +57,7 @@ public GetJobIndexRequest(String jobIndex, String jobParserAction, String jobRun public void writeTo(StreamOutput out) throws IOException { super.writeTo(out); out.writeString(jobIndex); - out.writeString(jobParserAction); + out.writeString(jobParameterAction); out.writeString(jobRunnerAction); out.writeString(extensionId); } @@ -70,12 +70,12 @@ public void setJobIndex(String jobIndex) { this.jobIndex = jobIndex; } - public String getJobParserAction() { - return jobParserAction; + public static String getJobParameterAction() { + return jobParameterAction; } - public void setJobParserAction(String jobParserAction) { - this.jobParserAction = jobParserAction; + public static void setJobParameterAction(String jobParameterAction) { + GetJobIndexRequest.jobParameterAction = jobParameterAction; } public String getJobRunnerAction() { @@ -110,8 +110,8 @@ public static GetJobIndexRequest parse(XContentParser parser) throws IOException case JOB_INDEX: jobIndex = parser.text(); break; - case JOB_PARSER_ACTION: - jobParserAction = parser.text(); + case JOB_PARAMETER_ACTION: + jobParameterAction = parser.text(); break; case JOB_RUNNER_ACTION: jobRunnerAction = parser.text(); @@ -125,6 +125,6 @@ public static GetJobIndexRequest parse(XContentParser parser) throws IOException } } - return new GetJobIndexRequest(jobIndex, jobParserAction, jobRunnerAction, extensionId); + return new GetJobIndexRequest(jobIndex, jobParameterAction, jobRunnerAction, extensionId); } } diff --git a/src/main/java/org/opensearch/jobscheduler/utils/JobDetailsService.java b/src/main/java/org/opensearch/jobscheduler/utils/JobDetailsService.java index 170ced21..74fa20a4 100644 --- a/src/main/java/org/opensearch/jobscheduler/utils/JobDetailsService.java +++ b/src/main/java/org/opensearch/jobscheduler/utils/JobDetailsService.java @@ -39,10 +39,11 @@ import java.nio.charset.StandardCharsets; -public final class JobDetailsService { +public class JobDetailsService { private static final Logger logger = LogManager.getLogger(JobDetailsService.class); private static final String JOB_DETAILS_INDEX_NAME = ".opensearch-plugins-job-details"; + private static final String PLUGINS_JOB_DETAILS_MAPPING_FILE = "/mappings/opensearch_plugins_job_details.json"; private final Client client; private final ClusterService clusterService; @@ -56,6 +57,11 @@ public boolean jobDetailsIndexExist() { return clusterService.state().routingTable().hasIndex(JOB_DETAILS_INDEX_NAME); } + /** + * + * @param listener an {@code ActionListener} that has onResponse and onFailure that is used to return the job details index if it was created + * * or else null. + */ @VisibleForTesting void createJobDetailsIndex(ActionListener listener) { if (jobDetailsIndexExist()) { @@ -75,23 +81,34 @@ void createJobDetailsIndex(ActionListener listener) { } } - public void processJobIndexForExtensionId( + /** + * Attempts to process job details with a specific extension Id. If the job details does not exist it attempts to create the job details document. + * If the job details document exists, it will try to update the job details. + * + * @param jobIndexName a non-null job index name. + * @param jobTypeName a non-null job type name. + * @param jobParameterActionName a non-null job parameter action name. + * @param jobRunnerActionName a non-null job runner action name. + * @param extensionId the unique Id for the job details. + * @param listener an {@code ActionListener} that has onResponse and onFailure that is used to return the job details if it was processed + * or else null. + */ + public void processJobDetailsForExtensionId( final String jobIndexName, final String jobTypeName, - final String jobParserActionName, + final String jobParameterActionName, final String jobRunnerActionName, final String extensionId, final JobDetailsRequestType requestType, ActionListener listener ) { - logger.info("Processing request"); boolean isJobIndexRequest; if (requestType.JOB_INDEX == requestType) { isJobIndexRequest = true; if (jobIndexName == null) { listener.onFailure(new IllegalArgumentException("Job Index Name should not be null")); - } else if (jobParserActionName == null) { - listener.onFailure(new IllegalArgumentException("Job Parser Action Name should not be null")); + } else if (jobParameterActionName == null) { + listener.onFailure(new IllegalArgumentException("Job Parameter Action Name should not be null")); } else if (jobRunnerActionName == null) { listener.onFailure(new IllegalArgumentException("Job Runner Action Name should not be null")); } @@ -107,16 +124,13 @@ public void processJobIndexForExtensionId( createJobDetailsIndex(ActionListener.wrap(created -> { if (created) { try { - logger.info("Processing get request now"); - findJobDetailsForExtensionId(extensionId, ActionListener.wrap(existingJobDetails -> { if (existingJobDetails != null) { logger.debug("Updating job details for extension id: " + extensionId + existingJobDetails); JobDetails updateJobDetails = new JobDetails(existingJobDetails); - logger.info("Processing update request now"); if (isJobIndexRequest) { updateJobDetails.setJobIndex(jobIndexName); - updateJobDetails.setJobParserAction(jobParserActionName); + updateJobDetails.setJobParameterAction(jobParameterActionName); updateJobDetails.setJobRunnerAction(jobRunnerActionName); } else { updateJobDetails.setJobType(jobTypeName); @@ -124,11 +138,10 @@ public void processJobIndexForExtensionId( updateJobDetailsForExtensionId(updateJobDetails, extensionId, listener); } else { - logger.info("Processing create request now"); JobDetails tempJobDetails = new JobDetails(); if (isJobIndexRequest) { tempJobDetails.setJobIndex(jobIndexName); - tempJobDetails.setJobParserAction(jobParserActionName); + tempJobDetails.setJobParameterAction(jobParameterActionName); tempJobDetails.setJobRunnerAction(jobRunnerActionName); } else { tempJobDetails.setJobType(jobTypeName); @@ -153,8 +166,14 @@ public void processJobIndexForExtensionId( } } + /** + * + * @param tempJobDetails new job details object that need to be inserted as document in the index + * @param extensionId unique id to create the entry for job details + * @param listener an {@code ActionListener} that has onResponse and onFailure that is used to return the job details if it was created + * * or else null. + */ private void createJobDetailsForExtensionId(final JobDetails tempJobDetails, String extensionId, ActionListener listener) { - logger.info("Processing create Job details method now"); try { final IndexRequest request = new IndexRequest(JOB_DETAILS_INDEX_NAME).id(extensionId) .source(tempJobDetails.toXContent(XContentFactory.jsonBuilder(), ToXContent.EMPTY_PARAMS)) @@ -176,8 +195,13 @@ private void createJobDetailsForExtensionId(final JobDetails tempJobDetails, Str } } + /** + * + * @param extensionId unique id to find the job details document in the index + * @param listener an {@code ActionListener} that has onResponse and onFailure that is used to return the job details if it was found + * * or else null. + */ private void findJobDetailsForExtensionId(final String extensionId, ActionListener listener) { - logger.info("Processing find Job details method now"); GetRequest getRequest = new GetRequest(JOB_DETAILS_INDEX_NAME).id(extensionId); client.get(getRequest, ActionListener.wrap(response -> { if (!response.isExists()) { @@ -199,6 +223,12 @@ private void findJobDetailsForExtensionId(final String extensionId, ActionListen })); } + /** + * + * @param extensionId unique id to find and delete the job details document in the index + * @param listener an {@code ActionListener} that has onResponse and onFailure that is used to return the job details if it was deleted + * * or else null. + */ public void deleteJobDetailsForExtension(final String extensionId, ActionListener listener) { DeleteRequest deleteRequest = new DeleteRequest(JOB_DETAILS_INDEX_NAME).id(extensionId); client.delete(deleteRequest, ActionListener.wrap(response -> { @@ -215,12 +245,18 @@ public void deleteJobDetailsForExtension(final String extensionId, ActionListene })); } + /** + * + * @param updateJobDetails update job details object entry + * @param extensionId unique id to find and update the corresponding document mapped to it + * @param listener an {@code ActionListener} that has onResponse and onFailure that is used to return the job details if it was updated + * * or else null. + */ private void updateJobDetailsForExtensionId( final JobDetails updateJobDetails, final String extensionId, ActionListener listener ) { - logger.info("Processing update Job details method now"); try { UpdateRequest updateRequest = new UpdateRequest().index(JOB_DETAILS_INDEX_NAME) .id(extensionId) @@ -250,7 +286,7 @@ private void updateJobDetailsForExtensionId( private String jobDetailsMapping() { try { - InputStream in = JobDetailsService.class.getResourceAsStream("/mappings/opensearch_plugins_job_details.json"); + InputStream in = JobDetailsService.class.getResourceAsStream(PLUGINS_JOB_DETAILS_MAPPING_FILE); StringBuilder stringBuilder = new StringBuilder(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8)); for (String line; (line = bufferedReader.readLine()) != null;) { @@ -260,16 +296,6 @@ private String jobDetailsMapping() { } catch (IOException e) { throw new IllegalArgumentException("JobDetails Mapping cannot be read correctly."); } - // String response = null; - // try { - - // URL url = JobDetailsService.class.getClassLoader().getResource("mappings/opensearch_plugins_job_details.json"); - // response = Resources.toString(url, Charsets.UTF_8); - // } catch (IOException e) { - // logger.info("getJobMapping failed", e); - // } - - // return response; } public enum JobDetailsRequestType { diff --git a/src/test/java/org/opensearch/jobscheduler/TestHelpers.java b/src/test/java/org/opensearch/jobscheduler/TestHelpers.java deleted file mode 100644 index 0ef1f9f4..00000000 --- a/src/test/java/org/opensearch/jobscheduler/TestHelpers.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - * - * The OpenSearch Contributors require contributions made to - * this file be licensed under the Apache-2.0 license or a - * compatible open source license. - */ -package org.opensearch.jobscheduler; - -import org.opensearch.common.bytes.BytesReference; -import org.opensearch.common.xcontent.XContentBuilder; -import org.opensearch.common.xcontent.XContentType; - -import java.io.IOException; - -public class TestHelpers { - - public static XContentBuilder builder() throws IOException { - return XContentBuilder.builder(XContentType.JSON.xContent()); - } - - public static String xContentBuilderToString(XContentBuilder builder) { - return BytesReference.bytes(builder).utf8ToString(); - } -} diff --git a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java index 1c567452..8ff7da11 100644 --- a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java +++ b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java @@ -8,48 +8,79 @@ */ package org.opensearch.jobscheduler.rest; -// public class RestGetJobIndexActionTests extends OpenSearchTestCase { -// -// private RestGetJobIndexAction action; -// -// public Map indexToJobDetails; -// -// private String getJobIndexPath; -// -// @Before -// public void setUp() throws Exception { -// super.setUp(); -// indexToJobDetails = new HashMap<>(); -// action = new RestGetJobIndexAction(indexToJobDetails); -// getJobIndexPath = String.format(Locale.ROOT, "%s/%s", JobSchedulerPlugin.JS_BASE_URI, "_get/_job_index"); -// } -// -// public void testGetNames() { -// String name = action.getName(); -// assertEquals(action.GET_JOB_INDEX_ACTION, name); -// } -// -// public void testGetRoutes() { -// List routes = action.routes(); -// -// assertEquals(getJobIndexPath, routes.get(0).getPath()); -// } -// -// public void testPrepareRequest() throws IOException { -// -// String content = -// "{\"job_index\":\"demo_job_index\",\"job_runner_action\":\"action\",\"job_parser_action\":\"parser_action\",\"extension_id\":\"extension_id\"}"; -// Map params = new HashMap<>(); -// FakeRestRequest request = new FakeRestRequest.Builder(xContentRegistry()).withMethod(RestRequest.Method.PUT) -// .withPath(getJobIndexPath) -// .withParams(params) -// .withContent(new BytesArray(content), XContentType.JSON) -// .build(); -// -// final FakeRestChannel channel = new FakeRestChannel(request, true, 0); -// action.prepareRequest(request, mock(NodeClient.class)); -// -// assertThat(channel.responses().get(), equalTo(0)); -// assertThat(channel.errors().get(), equalTo(0)); -// } -// } +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import static org.hamcrest.Matchers.equalTo; +import org.junit.Before; +import org.mockito.Mockito; +import org.opensearch.action.ActionListener; +import org.opensearch.client.node.NodeClient; +import org.opensearch.common.bytes.BytesArray; +import org.opensearch.common.xcontent.XContentType; +import org.opensearch.jobscheduler.JobSchedulerPlugin; +import org.opensearch.jobscheduler.utils.JobDetailsService; +import org.opensearch.rest.RestHandler; +import org.opensearch.rest.RestRequest; +import org.opensearch.test.OpenSearchTestCase; +import org.opensearch.test.rest.FakeRestChannel; +import org.opensearch.test.rest.FakeRestRequest; + +public class RestGetJobIndexActionTests extends OpenSearchTestCase { + + private RestGetJobIndexAction action; + + private JobDetailsService jobDetailsService; + + private String getJobIndexPath; + + @Before + public void setUp() throws Exception { + super.setUp(); + jobDetailsService = Mockito.mock(JobDetailsService.class); + action = new RestGetJobIndexAction(jobDetailsService); + getJobIndexPath = String.format(Locale.ROOT, "%s/%s", JobSchedulerPlugin.JS_BASE_URI, "_get/_job_index"); + } + + public void testGetNames() { + String name = action.getName(); + assertEquals(action.GET_JOB_INDEX_ACTION, name); + } + + public void testGetRoutes() { + List routes = action.routes(); + + assertEquals(getJobIndexPath, routes.get(0).getPath()); + } + + public void testPrepareRequest() throws IOException { + + String content = + "{\"job_index\":\"sample-index-name\",\"job_runner_action\":\"sample-job-runner-action\",\"job_parameter_action\":\"sample-job-parameter-action\",\"extension_id\":\"sample-extension\"}"; + Map params = new HashMap<>(); + FakeRestRequest request = new FakeRestRequest.Builder(xContentRegistry()).withMethod(RestRequest.Method.PUT) + .withPath(getJobIndexPath) + .withParams(params) + .withContent(new BytesArray(content), XContentType.JSON) + .build(); + + final FakeRestChannel channel = new FakeRestChannel(request, true, 0); + Mockito.doNothing() + .when(jobDetailsService) + .processJobDetailsForExtensionId( + "sample-index-name", + null, + "sample-job-parameter-action", + "sample-runner-name", + "sample-extension", + JobDetailsService.JobDetailsRequestType.JOB_INDEX, + ActionListener.wrap(response -> {}, exception -> {}) + ); + action.prepareRequest(request, Mockito.mock(NodeClient.class)); + + assertThat(channel.responses().get(), equalTo(0)); + assertThat(channel.errors().get(), equalTo(0)); + } +} diff --git a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java index 1e6697e5..a0309279 100644 --- a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java +++ b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java @@ -8,47 +8,78 @@ */ package org.opensearch.jobscheduler.rest; -// public class RestGetJobTypeActionTests extends OpenSearchTestCase { -// -// private RestGetJobTypeAction action; -// -// public Map indexToJobDetails; -// -// private String getJobTypePath; -// -// @Before -// public void setUp() throws Exception { -// super.setUp(); -// indexToJobDetails = new HashMap<>(); -// action = new RestGetJobTypeAction(indexToJobDetails); -// getJobTypePath = String.format(Locale.ROOT, "%s/%s", JobSchedulerPlugin.JS_BASE_URI, "_get/_job_type"); -// } -// -// public void testGetNames() { -// String name = action.getName(); -// assertEquals(action.GET_JOB_TYPE_ACTION, name); -// } -// -// public void testGetRoutes() { -// List routes = action.routes(); -// -// assertEquals(getJobTypePath, routes.get(0).getPath()); -// } -// -// public void testPrepareRequest() throws IOException { -// -// String content = "{\"job_type\":\"demo_job_type\",\"extension_id\":\"extension_id\"}"; -// Map params = new HashMap<>(); -// FakeRestRequest request = new FakeRestRequest.Builder(xContentRegistry()).withMethod(RestRequest.Method.PUT) -// .withPath(getJobTypePath) -// .withParams(params) -// .withContent(new BytesArray(content), XContentType.JSON) -// .build(); -// -// final FakeRestChannel channel = new FakeRestChannel(request, true, 0); -// action.prepareRequest(request, mock(NodeClient.class)); -// -// assertThat(channel.responses().get(), equalTo(0)); -// assertThat(channel.errors().get(), equalTo(0)); -// } -// } +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import org.hamcrest.CoreMatchers; +import org.junit.Before; +import org.mockito.Mockito; +import org.opensearch.action.ActionListener; +import org.opensearch.client.node.NodeClient; +import org.opensearch.common.bytes.BytesArray; +import org.opensearch.common.xcontent.XContentType; +import org.opensearch.jobscheduler.JobSchedulerPlugin; +import org.opensearch.jobscheduler.utils.JobDetailsService; +import org.opensearch.rest.RestHandler; +import org.opensearch.rest.RestRequest; +import org.opensearch.test.OpenSearchTestCase; +import org.opensearch.test.rest.FakeRestChannel; +import org.opensearch.test.rest.FakeRestRequest; + +public class RestGetJobTypeActionTests extends OpenSearchTestCase { + + private RestGetJobTypeAction action; + + private String getJobTypePath; + + private JobDetailsService jobDetailsService; + + @Before + public void setUp() throws Exception { + super.setUp(); + jobDetailsService = Mockito.mock(JobDetailsService.class); + action = new RestGetJobTypeAction(jobDetailsService); + getJobTypePath = String.format(Locale.ROOT, "%s/%s", JobSchedulerPlugin.JS_BASE_URI, "_get/_job_type"); + } + + public void testGetNames() { + String name = action.getName(); + assertEquals(action.GET_JOB_TYPE_ACTION, name); + } + + public void testGetRoutes() { + List routes = action.routes(); + + assertEquals(getJobTypePath, routes.get(0).getPath()); + } + + public void testPrepareRequest() throws IOException { + + String content = "{\"job_type\":\"sample-job-type\",\"extension_id\":\"sample-extension\"}"; + Map params = new HashMap<>(); + FakeRestRequest request = new FakeRestRequest.Builder(xContentRegistry()).withMethod(RestRequest.Method.PUT) + .withPath(getJobTypePath) + .withParams(params) + .withContent(new BytesArray(content), XContentType.JSON) + .build(); + + final FakeRestChannel channel = new FakeRestChannel(request, true, 0); + Mockito.doNothing() + .when(jobDetailsService) + .processJobDetailsForExtensionId( + null, + "sample-job-type", + null, + null, + "sample-extension", + JobDetailsService.JobDetailsRequestType.JOB_INDEX, + ActionListener.wrap(response -> {}, exception -> {}) + ); + action.prepareRequest(request, Mockito.mock(NodeClient.class)); + + assertThat(channel.responses().get(), CoreMatchers.equalTo(0)); + assertThat(channel.errors().get(), CoreMatchers.equalTo(0)); + } +} diff --git a/src/test/java/org/opensearch/jobscheduler/utils/JobDetailsServiceIT.java b/src/test/java/org/opensearch/jobscheduler/utils/JobDetailsServiceIT.java new file mode 100644 index 00000000..41bfbfd6 --- /dev/null +++ b/src/test/java/org/opensearch/jobscheduler/utils/JobDetailsServiceIT.java @@ -0,0 +1,142 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + * + * The OpenSearch Contributors require contributions made to + * this file be licensed under the Apache-2.0 license or a + * compatible open source license. + */ +package org.opensearch.jobscheduler.utils; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import org.junit.Before; +import org.mockito.Mockito; +import org.opensearch.action.ActionListener; +import org.opensearch.cluster.service.ClusterService; +import org.opensearch.test.OpenSearchIntegTestCase; + +public class JobDetailsServiceIT extends OpenSearchIntegTestCase { + + private ClusterService clusterService; + + @Before + public void setup() { + this.clusterService = Mockito.mock(ClusterService.class, Mockito.RETURNS_DEEP_STUBS); + Mockito.when(this.clusterService.state().routingTable().hasIndex("opensearch-plugins-job-details")) + .thenReturn(false) + .thenReturn(true); + } + + public void testSanity() throws Exception { + CountDownLatch latch = new CountDownLatch(1); + JobDetailsService jobDetailsService = new JobDetailsService(client(), this.clusterService); + + jobDetailsService.processJobDetailsForExtensionId( + "sample-job-index", + null, + "sample-job-parameter", + "sample-job-runner", + "sample-extension", + JobDetailsService.JobDetailsRequestType.JOB_INDEX, + ActionListener.wrap(jobDetails -> { + assertNotNull("Expected to successfully get job details.", jobDetails); + assertEquals("sample-job-index", jobDetails.getJobIndex()); + assertEquals("sample-job-parameter", jobDetails.getJobParameterAction()); + assertEquals("sample-job-runner", jobDetails.getJobRunnerAction()); + assertNull(jobDetails.getJobType()); + jobDetailsService.createJobDetailsIndex(ActionListener.wrap(response -> { + assertTrue(response); + latch.countDown(); + }, exception -> { fail(exception.getMessage()); })); + + jobDetailsService.deleteJobDetailsForExtension("sample-extension", ActionListener.wrap(response -> { + assertTrue(response); + latch.countDown(); + }, exception -> { fail(exception.getMessage()); })); + }, exception -> { fail(exception.getMessage()); }) + ); + latch.await(5L, TimeUnit.SECONDS); + } + + public void testSecondProcessofJobIndexPass() throws Exception { + CountDownLatch latch = new CountDownLatch(1); + JobDetailsService jobDetailsService = new JobDetailsService(client(), this.clusterService); + + jobDetailsService.processJobDetailsForExtensionId( + "sample-job-index", + null, + "sample-job-parameter", + "sample-job-runner", + "sample-extension", + JobDetailsService.JobDetailsRequestType.JOB_INDEX, + ActionListener.wrap(jobDetails -> { + jobDetailsService.processJobDetailsForExtensionId( + "sample-job-index1", + null, + "sample-job-parameter", + "sample-job-runner", + "sample-extension", + JobDetailsService.JobDetailsRequestType.JOB_INDEX, + ActionListener.wrap(jobDetails1 -> { + assertNotNull("Expected to failed to get get job details for 2nd request.", jobDetails1); + assertNotNull("Expected to successfully get job details.", jobDetails); + assertEquals("sample-job-index", jobDetails.getJobIndex()); + assertEquals("sample-job-parameter", jobDetails.getJobParameterAction()); + assertEquals("sample-job-runner", jobDetails.getJobRunnerAction()); + assertEquals("sample-job-index1", jobDetails1.getJobIndex()); + assertNull(jobDetails.getJobType()); + jobDetailsService.createJobDetailsIndex(ActionListener.wrap(response -> { + assertTrue(response); + latch.countDown(); + }, exception -> { fail(exception.getMessage()); })); + + jobDetailsService.deleteJobDetailsForExtension("sample-extension", ActionListener.wrap(response -> { + assertTrue(response); + latch.countDown(); + }, exception -> { fail(exception.getMessage()); })); + }, exception -> { fail(exception.getMessage()); }) + ); + }, + exception -> { fail(exception.getMessage()); } + + ) + ); + + latch.await(10L, TimeUnit.SECONDS); + } + + public void testDeleteJobDetailsWithOutExtensionIdCreation() throws Exception { + CountDownLatch latch = new CountDownLatch(1); + JobDetailsService jobDetailsService = new JobDetailsService(client(), this.clusterService); + jobDetailsService.deleteJobDetailsForExtension( + "demo-extension", + ActionListener.wrap( + deleted -> { assertTrue("Failed to delete JobDetails.", deleted); }, + exception -> { fail(exception.getMessage()); } + ) + ); + latch.await(5L, TimeUnit.SECONDS); + } + + public void testDeleteNonExistingJobDetails() throws Exception { + CountDownLatch latch = new CountDownLatch(1); + JobDetailsService jobDetailsService = new JobDetailsService(client(), this.clusterService); + jobDetailsService.createJobDetailsIndex(ActionListener.wrap(created -> { + if (created) { + jobDetailsService.deleteJobDetailsForExtension( + "demo-extension", + ActionListener.wrap( + deleted -> { assertTrue("Failed to delete job details for extension.", deleted); }, + exception -> fail(exception.getMessage()) + ) + ); + } else { + fail("Failed to job details for extension"); + } + + }, exception -> fail(exception.getMessage()))); + latch.await(5L, TimeUnit.SECONDS); + } + +} From a27c263b078dff8b7f5a2551401b441f2a35c8ae Mon Sep 17 00:00:00 2001 From: Varun Jain Date: Wed, 4 Jan 2023 16:37:18 -0800 Subject: [PATCH 15/26] Communication Mechanism for JS Signed-off-by: Varun Jain --- build.gradle | 5 +- .../rest/RestGetJobIndexAction.java | 2 +- .../rest/RestGetJobTypeAction.java | 2 +- .../transport/GetJobIndexRequest.java | 2 +- .../jobscheduler/utils/JobDetailsService.java | 1 + .../jobscheduler/ODFERestTestCase.java | 217 ++++++++++++++++++ .../opensearch/jobscheduler/TestHelpers.java | 89 +++++++ .../GetJobDetailsMultiNodeRestIT.java | 65 ++++++ .../utils/JobDetailsServiceIT.java | 8 +- 9 files changed, 382 insertions(+), 9 deletions(-) create mode 100644 src/test/java/org/opensearch/jobscheduler/ODFERestTestCase.java create mode 100644 src/test/java/org/opensearch/jobscheduler/TestHelpers.java create mode 100644 src/test/java/org/opensearch/jobscheduler/multinode/GetJobDetailsMultiNodeRestIT.java diff --git a/build.gradle b/build.gradle index a688df0d..3bdedaec 100644 --- a/build.gradle +++ b/build.gradle @@ -42,7 +42,7 @@ ext { noticeFile = rootProject.file('NOTICE') } -licenseHeaders.enabled = false +licenseHeaders.enabled = true testingConventions.enabled = false forbiddenApis.ignoreFailures = false @@ -240,7 +240,8 @@ task integTestRemote(type: RestIntegTestTask) { systemProperty "security", System.getProperty("security") systemProperty "user", System.getProperty("user") systemProperty "password", System.getProperty("password") - + systemProperty 'tests.rest.cluster', 'localhost:9200' + systemProperty 'tests.clustername', 'opensearch-job-scheduler-cluster' if (System.getProperty("tests.rest.cluster") != null) { filter { includeTestsMatching "org.opensearch.jobscheduler.*RestIT" diff --git a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java index 5e4585a1..3b314387 100644 --- a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java +++ b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java @@ -110,7 +110,7 @@ public void onFailure(Exception e) { ); try { - latch.await(5, TimeUnit.SECONDS); + latch.await(JobDetailsService.TIME_OUT_FOR_LATCH, TimeUnit.SECONDS); } catch (Exception e) { logger.info("Could not process job index due to exception ", e); } diff --git a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java index 9236c847..3e2c3c8e 100644 --- a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java +++ b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java @@ -106,7 +106,7 @@ public void onFailure(Exception e) { ); try { - latch.await(5, TimeUnit.SECONDS); + latch.await(JobDetailsService.TIME_OUT_FOR_LATCH, TimeUnit.SECONDS); } catch (Exception e) { logger.info("Could not get job type due to exception ", e); } diff --git a/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java index f421bf0c..f0a7defa 100644 --- a/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java @@ -33,7 +33,7 @@ public class GetJobIndexRequest extends ActionRequest { public static final String JOB_INDEX = "job_index"; public static final String EXTENSION_ID = "extension_id"; - private static final String JOB_PARAMETER_ACTION = "job_parser_action"; + private static final String JOB_PARAMETER_ACTION = "job_parameter_action"; public static final String JOB_RUNNER_ACTION = "job_runner_action"; public GetJobIndexRequest(StreamInput in) throws IOException { diff --git a/src/main/java/org/opensearch/jobscheduler/utils/JobDetailsService.java b/src/main/java/org/opensearch/jobscheduler/utils/JobDetailsService.java index 74fa20a4..dd4eb978 100644 --- a/src/main/java/org/opensearch/jobscheduler/utils/JobDetailsService.java +++ b/src/main/java/org/opensearch/jobscheduler/utils/JobDetailsService.java @@ -45,6 +45,7 @@ public class JobDetailsService { private static final String JOB_DETAILS_INDEX_NAME = ".opensearch-plugins-job-details"; private static final String PLUGINS_JOB_DETAILS_MAPPING_FILE = "/mappings/opensearch_plugins_job_details.json"; + public static Long TIME_OUT_FOR_LATCH = 5L; private final Client client; private final ClusterService clusterService; diff --git a/src/test/java/org/opensearch/jobscheduler/ODFERestTestCase.java b/src/test/java/org/opensearch/jobscheduler/ODFERestTestCase.java new file mode 100644 index 00000000..b0001259 --- /dev/null +++ b/src/test/java/org/opensearch/jobscheduler/ODFERestTestCase.java @@ -0,0 +1,217 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + * + * The OpenSearch Contributors require contributions made to + * this file be licensed under the Apache-2.0 license or a + * compatible open source license. + */ +package org.opensearch.jobscheduler; + +import java.io.IOException; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; +import javax.net.ssl.SSLEngine; +import org.apache.hc.client5.http.auth.AuthScope; +import org.apache.hc.client5.http.auth.UsernamePasswordCredentials; +import org.apache.hc.client5.http.impl.auth.BasicCredentialsProvider; +import org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManager; +import org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManagerBuilder; +import org.apache.hc.client5.http.ssl.ClientTlsStrategyBuilder; +import org.apache.hc.client5.http.ssl.NoopHostnameVerifier; +import org.apache.hc.core5.function.Factory; +import org.apache.hc.core5.http.Header; +import org.apache.hc.core5.http.HttpHost; +import org.apache.hc.core5.http.message.BasicHeader; +import org.apache.hc.core5.http.nio.ssl.TlsStrategy; +import org.apache.hc.core5.reactor.ssl.TlsDetails; +import org.apache.hc.core5.ssl.SSLContextBuilder; +import org.apache.hc.core5.util.Timeout; +import org.junit.After; +import org.opensearch.client.Request; +import org.opensearch.client.Response; +import org.opensearch.client.RestClient; +import org.opensearch.client.RestClientBuilder; +import org.opensearch.common.settings.Settings; +import org.opensearch.common.unit.TimeValue; +import org.opensearch.common.util.concurrent.ThreadContext; +import org.opensearch.common.xcontent.DeprecationHandler; +import org.opensearch.common.xcontent.NamedXContentRegistry; +import org.opensearch.common.xcontent.XContentParser; +import org.opensearch.common.xcontent.XContentType; +import org.opensearch.rest.RestStatus; +import org.opensearch.test.rest.OpenSearchRestTestCase; + +public abstract class ODFERestTestCase extends OpenSearchRestTestCase { + + protected boolean isHttps() { + boolean isHttps = Optional.ofNullable(System.getProperty("https")).map("true"::equalsIgnoreCase).orElse(false); + if (isHttps) { + // currently only external cluster is supported for security enabled testing + if (!Optional.ofNullable(System.getProperty("tests.rest.cluster")).isPresent()) { + throw new RuntimeException("cluster url should be provided for security enabled testing"); + } + } + + return isHttps; + } + + @Override + protected String getProtocol() { + return isHttps() ? "https" : "http"; + } + + @Override + protected Settings restAdminSettings() { + return Settings.builder() + // disable the warning exception for admin client since it's only used for cleanup. + .put("strictDeprecationMode", false) + .put("http.port", 9200) + // @anomaly-detection.create-detector Commented this code until we have support of Common Utils for extensibility + /*.put(OPENSEARCH_SECURITY_SSL_HTTP_ENABLED, isHttps()) + .put(OPENSEARCH_SECURITY_SSL_HTTP_PEMCERT_FILEPATH, "sample.pem") + .put(OPENSEARCH_SECURITY_SSL_HTTP_KEYSTORE_FILEPATH, "test-kirk.jks") + .put(OPENSEARCH_SECURITY_SSL_HTTP_KEYSTORE_PASSWORD, "changeit") + .put(OPENSEARCH_SECURITY_SSL_HTTP_KEYSTORE_KEYPASSWORD, "changeit")*/ + .build(); + } + + // Utility fn for deleting indices. Should only be used when not allowed in a regular context + // (e.g., deleting system indices) + protected static void deleteIndexWithAdminClient(String name) throws IOException { + Request request = new Request("DELETE", "/" + name); + adminClient().performRequest(request); + } + + // Utility fn for checking if an index exists. Should only be used when not allowed in a regular context + // (e.g., checking existence of system indices) + protected static boolean indexExistsWithAdminClient(String indexName) throws IOException { + Request request = new Request("HEAD", "/" + indexName); + Response response = adminClient().performRequest(request); + return RestStatus.OK.getStatus() == response.getStatusLine().getStatusCode(); + } + + @Override + protected RestClient buildClient(Settings settings, HttpHost[] hosts) throws IOException { + boolean strictDeprecationMode = settings.getAsBoolean("strictDeprecationMode", true); + RestClientBuilder builder = RestClient.builder(hosts); + if (isHttps()) { + // @anomaly-detection.create-detector Commented this code until we have support of Common Utils for extensibility + /*String keystore = settings.get(OPENSEARCH_SECURITY_SSL_HTTP_KEYSTORE_FILEPATH); + if (Objects.nonNull(keystore)) { + URI uri = null; + try { + uri = this.getClass().getClassLoader().getResource("security/sample.pem").toURI(); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + Path configPath = PathUtils.get(uri).getParent().toAbsolutePath(); + return new SecureRestClientBuilder(settings, configPath).build(); + } else {*/ + configureHttpsClient(builder, settings); + builder.setStrictDeprecationMode(strictDeprecationMode); + return builder.build(); + } else { + configureClient(builder, settings); + builder.setStrictDeprecationMode(strictDeprecationMode); + return builder.build(); + } + + } + + @SuppressWarnings("unchecked") + @After + protected void wipeAllODFEIndices() throws IOException { + Response response = adminClient().performRequest(new Request("GET", "/_cat/indices?format=json&expand_wildcards=all")); + XContentType xContentType = XContentType.fromMediaType(response.getEntity().getContentType()); + try ( + XContentParser parser = xContentType.xContent() + .createParser( + NamedXContentRegistry.EMPTY, + DeprecationHandler.THROW_UNSUPPORTED_OPERATION, + response.getEntity().getContent() + ) + ) { + XContentParser.Token token = parser.nextToken(); + List> parserList = null; + if (token == XContentParser.Token.START_ARRAY) { + parserList = parser.listOrderedMap().stream().map(obj -> (Map) obj).collect(Collectors.toList()); + } else { + parserList = Collections.singletonList(parser.mapOrdered()); + } + + for (Map index : parserList) { + String indexName = (String) index.get("index"); + if (indexName != null && !".opendistro_security".equals(indexName)) { + adminClient().performRequest(new Request("DELETE", "/" + indexName)); + } + } + } + } + + protected static void configureHttpsClient(RestClientBuilder builder, Settings settings) throws IOException { + Map headers = ThreadContext.buildDefaultHeaders(settings); + Header[] defaultHeaders = new Header[headers.size()]; + int i = 0; + for (Map.Entry entry : headers.entrySet()) { + defaultHeaders[i++] = new BasicHeader(entry.getKey(), entry.getValue()); + } + builder.setDefaultHeaders(defaultHeaders); + builder.setHttpClientConfigCallback(httpClientBuilder -> { + String userName = Optional.ofNullable(System.getProperty("user")) + .orElseThrow(() -> new RuntimeException("user name is missing")); + String password = Optional.ofNullable(System.getProperty("password")) + .orElseThrow(() -> new RuntimeException("password is missing")); + BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider(); + credentialsProvider.setCredentials( + new AuthScope(new HttpHost("localhost", 9200)), + new UsernamePasswordCredentials(userName, password.toCharArray()) + ); + try { + final TlsStrategy tlsStrategy = ClientTlsStrategyBuilder.create() + .setSslContext(SSLContextBuilder.create().loadTrustMaterial(null, (chains, authType) -> true).build()) + // disable the certificate since our testing cluster just uses the default security configuration + .setHostnameVerifier(NoopHostnameVerifier.INSTANCE) + // See please https://issues.apache.org/jira/browse/HTTPCLIENT-2219 + .setTlsDetailsFactory(new Factory() { + @Override + public TlsDetails create(final SSLEngine sslEngine) { + return new TlsDetails(sslEngine.getSession(), sslEngine.getApplicationProtocol()); + } + }) + .build(); + + final PoolingAsyncClientConnectionManager connectionManager = PoolingAsyncClientConnectionManagerBuilder.create() + .setTlsStrategy(tlsStrategy) + .build(); + + return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider).setConnectionManager(connectionManager); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + + final String socketTimeoutString = settings.get(CLIENT_SOCKET_TIMEOUT); + final TimeValue socketTimeout = TimeValue.parseTimeValue( + socketTimeoutString == null ? "60s" : socketTimeoutString, + CLIENT_SOCKET_TIMEOUT + ); + builder.setRequestConfigCallback( + conf -> conf.setResponseTimeout(Timeout.ofMilliseconds(Math.toIntExact(socketTimeout.getMillis()))) + ); + if (settings.hasValue(CLIENT_PATH_PREFIX)) { + builder.setPathPrefix(settings.get(CLIENT_PATH_PREFIX)); + } + } + + /** + * wipeAllIndices won't work since it cannot delete security index. Use wipeAllODFEIndices instead. + */ + @Override + protected boolean preserveIndicesUponCompletion() { + return true; + } +} diff --git a/src/test/java/org/opensearch/jobscheduler/TestHelpers.java b/src/test/java/org/opensearch/jobscheduler/TestHelpers.java new file mode 100644 index 00000000..217d7285 --- /dev/null +++ b/src/test/java/org/opensearch/jobscheduler/TestHelpers.java @@ -0,0 +1,89 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + * + * The OpenSearch Contributors require contributions made to + * this file be licensed under the Apache-2.0 license or a + * compatible open source license. + */ +package org.opensearch.jobscheduler; + +import java.io.IOException; +import java.util.List; +import java.util.Map; +import org.apache.hc.core5.http.ContentType; +import org.apache.hc.core5.http.Header; +import org.apache.hc.core5.http.HttpEntity; +import org.apache.hc.core5.http.io.entity.StringEntity; +import org.opensearch.client.Response; +import org.opensearch.client.RestClient; +import org.opensearch.client.Request; +import org.opensearch.client.RequestOptions; +import org.opensearch.client.WarningsHandler; +import org.opensearch.common.bytes.BytesReference; +import org.opensearch.common.xcontent.ToXContent; +import org.opensearch.common.xcontent.ToXContentObject; +import org.opensearch.common.xcontent.XContentBuilder; +import org.opensearch.common.xcontent.XContentFactory; + +public class TestHelpers { + + public static final String GET_JOB_INDEX_BASE_DETECTORS_URI = "/_plugins/_job_scheduler/_get/_job_index"; + public static final String GET_JOB_TYPE_BASE_DETECTORS_URI = "/_plugins/_job_scheduler/_get/_job_type"; + + public static String xContentBuilderToString(XContentBuilder builder) { + return BytesReference.bytes(builder).utf8ToString(); + } + + public static String toJsonString(ToXContentObject object) throws IOException { + XContentBuilder builder = XContentFactory.jsonBuilder(); + return TestHelpers.xContentBuilderToString(object.toXContent(builder, ToXContent.EMPTY_PARAMS)); + } + + public static HttpEntity toHttpEntity(ToXContentObject object) throws IOException { + return new StringEntity(toJsonString(object), ContentType.APPLICATION_JSON); + } + + public static Response makeRequest( + RestClient client, + String method, + String endpoint, + Map params, + HttpEntity entity, + List
headers + ) throws IOException { + return makeRequest(client, method, endpoint, params, entity, headers, false); + } + + public static HttpEntity toHttpEntity(String jsonString) throws IOException { + return new StringEntity(jsonString, ContentType.APPLICATION_JSON); + } + + public static Response makeRequest( + RestClient client, + String method, + String endpoint, + Map params, + HttpEntity entity, + List
headers, + boolean strictDeprecationMode + ) throws IOException { + Request request = new Request(method, endpoint); + + RequestOptions.Builder options = RequestOptions.DEFAULT.toBuilder(); + if (headers != null) { + headers.forEach(header -> options.addHeader(header.getName(), header.getValue())); + } + options.setWarningsHandler(strictDeprecationMode ? WarningsHandler.STRICT : WarningsHandler.PERMISSIVE); + request.setOptions(options.build()); + + if (params != null) { + params.entrySet().forEach(it -> request.addParameter(it.getKey(), it.getValue())); + } + if (entity != null) { + request.setEntity(entity); + } + return client.performRequest(request); + } + +} diff --git a/src/test/java/org/opensearch/jobscheduler/multinode/GetJobDetailsMultiNodeRestIT.java b/src/test/java/org/opensearch/jobscheduler/multinode/GetJobDetailsMultiNodeRestIT.java new file mode 100644 index 00000000..c6d329d7 --- /dev/null +++ b/src/test/java/org/opensearch/jobscheduler/multinode/GetJobDetailsMultiNodeRestIT.java @@ -0,0 +1,65 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + * + * The OpenSearch Contributors require contributions made to + * this file be licensed under the Apache-2.0 license or a + * compatible open source license. + */ +package org.opensearch.jobscheduler.multinode; + +import com.google.common.collect.ImmutableMap; +import java.util.HashMap; +import java.util.Map; +import org.junit.Assert; +import org.opensearch.client.Response; +import org.opensearch.jobscheduler.ODFERestTestCase; +import org.opensearch.jobscheduler.TestHelpers; +import org.opensearch.test.OpenSearchIntegTestCase; + +@OpenSearchIntegTestCase.ClusterScope(scope = OpenSearchIntegTestCase.Scope.SUITE, numDataNodes = 2) +public class GetJobDetailsMultiNodeRestIT extends ODFERestTestCase { + + /** + * The below test performs a get index api on a multinode cluster. Internally, the cluster redirects the request to either of the node. + * After getting successful response, the get job type api is triggered for 100 times. From the response of get job type, job index is retrieved and is being compared with get index api response. + * Both response should be equal. + * @throws Exception + */ + public void testGetJobDetailsRestAPI() throws Exception { + + Response response = TestHelpers.makeRequest( + client(), + "PUT", + TestHelpers.GET_JOB_INDEX_BASE_DETECTORS_URI, + ImmutableMap.of(), + TestHelpers.toHttpEntity( + "{\"job_index\":\"demo_job_index\",\"job_parameter_action\":\"demo_parameter\",\"job_runner_action\":\"demo_runner\",\"extension_id\":\"sample_extension\"}" + ), + null + ); + + String expectedJobIndex = validateRequestAndGetJobIndex(entityAsMap(response)); + + for (int i = 0; i < 100; i++) { + Response response1 = TestHelpers.makeRequest( + client(), + "PUT", + TestHelpers.GET_JOB_TYPE_BASE_DETECTORS_URI, + ImmutableMap.of(), + TestHelpers.toHttpEntity("{\"job_type\":\"demo_job_type\",\"extension_id\":\"sample_extension\"}"), + null + ); + + String jobIndex = validateRequestAndGetJobIndex(entityAsMap(response1)); + Assert.assertEquals(expectedJobIndex, jobIndex); + } + } + + private String validateRequestAndGetJobIndex(Map responseMap) { + Assert.assertEquals("success", responseMap.get("response")); + HashMap jobDetails = (HashMap) responseMap.get("jobDetails"); + return jobDetails.get("job_index"); + } + +} diff --git a/src/test/java/org/opensearch/jobscheduler/utils/JobDetailsServiceIT.java b/src/test/java/org/opensearch/jobscheduler/utils/JobDetailsServiceIT.java index 41bfbfd6..58571934 100644 --- a/src/test/java/org/opensearch/jobscheduler/utils/JobDetailsServiceIT.java +++ b/src/test/java/org/opensearch/jobscheduler/utils/JobDetailsServiceIT.java @@ -56,7 +56,7 @@ public void testSanity() throws Exception { }, exception -> { fail(exception.getMessage()); })); }, exception -> { fail(exception.getMessage()); }) ); - latch.await(5L, TimeUnit.SECONDS); + latch.await(JobDetailsService.TIME_OUT_FOR_LATCH, TimeUnit.SECONDS); } public void testSecondProcessofJobIndexPass() throws Exception { @@ -103,7 +103,7 @@ public void testSecondProcessofJobIndexPass() throws Exception { ) ); - latch.await(10L, TimeUnit.SECONDS); + latch.await(JobDetailsService.TIME_OUT_FOR_LATCH, TimeUnit.SECONDS); } public void testDeleteJobDetailsWithOutExtensionIdCreation() throws Exception { @@ -116,7 +116,7 @@ public void testDeleteJobDetailsWithOutExtensionIdCreation() throws Exception { exception -> { fail(exception.getMessage()); } ) ); - latch.await(5L, TimeUnit.SECONDS); + latch.await(JobDetailsService.TIME_OUT_FOR_LATCH, TimeUnit.SECONDS); } public void testDeleteNonExistingJobDetails() throws Exception { @@ -136,7 +136,7 @@ public void testDeleteNonExistingJobDetails() throws Exception { } }, exception -> fail(exception.getMessage()))); - latch.await(5L, TimeUnit.SECONDS); + latch.await(JobDetailsService.TIME_OUT_FOR_LATCH, TimeUnit.SECONDS); } } From f4e36f0c1e77b2be3867eda9bb00b8b8c5dd112d Mon Sep 17 00:00:00 2001 From: Varun Jain Date: Wed, 4 Jan 2023 17:04:27 -0800 Subject: [PATCH 16/26] Communication Mechanism for JS Signed-off-by: Varun Jain --- .../jobscheduler/constant/CommonValue.java | 14 -------------- 1 file changed, 14 deletions(-) delete mode 100644 src/main/java/org/opensearch/jobscheduler/constant/CommonValue.java diff --git a/src/main/java/org/opensearch/jobscheduler/constant/CommonValue.java b/src/main/java/org/opensearch/jobscheduler/constant/CommonValue.java deleted file mode 100644 index 8fefb75e..00000000 --- a/src/main/java/org/opensearch/jobscheduler/constant/CommonValue.java +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - * - * The OpenSearch Contributors require contributions made to - * this file be licensed under the Apache-2.0 license or a - * compatible open source license. - */ -package org.opensearch.jobscheduler.constant; - -public class CommonValue { - - public static String EXTERNAL_ACTION_PREFIX = "cluster:admin/plugins/js/"; -} From 0b62209b8e485e7425cd9c1638ab56378adc87af Mon Sep 17 00:00:00 2001 From: Varun Jain Date: Wed, 4 Jan 2023 19:25:50 -0800 Subject: [PATCH 17/26] Communication Mechanism for JS Signed-off-by: Varun Jain --- .../multinode/GetJobDetailsMultiNodeRestIT.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/org/opensearch/jobscheduler/multinode/GetJobDetailsMultiNodeRestIT.java b/src/test/java/org/opensearch/jobscheduler/multinode/GetJobDetailsMultiNodeRestIT.java index c6d329d7..344a2a5b 100644 --- a/src/test/java/org/opensearch/jobscheduler/multinode/GetJobDetailsMultiNodeRestIT.java +++ b/src/test/java/org/opensearch/jobscheduler/multinode/GetJobDetailsMultiNodeRestIT.java @@ -39,7 +39,7 @@ public void testGetJobDetailsRestAPI() throws Exception { null ); - String expectedJobIndex = validateRequestAndGetJobIndex(entityAsMap(response)); + String expectedJobIndex = validateResponseAndGetJobIndex(entityAsMap(response)); for (int i = 0; i < 100; i++) { Response response1 = TestHelpers.makeRequest( @@ -51,12 +51,12 @@ public void testGetJobDetailsRestAPI() throws Exception { null ); - String jobIndex = validateRequestAndGetJobIndex(entityAsMap(response1)); + String jobIndex = validateResponseAndGetJobIndex(entityAsMap(response1)); Assert.assertEquals(expectedJobIndex, jobIndex); } } - private String validateRequestAndGetJobIndex(Map responseMap) { + private String validateResponseAndGetJobIndex(Map responseMap) { Assert.assertEquals("success", responseMap.get("response")); HashMap jobDetails = (HashMap) responseMap.get("jobDetails"); return jobDetails.get("job_index"); From fac7c692b28ab4320b1efb13dd49f11c84488811 Mon Sep 17 00:00:00 2001 From: Varun Jain Date: Thu, 5 Jan 2023 12:10:45 -0800 Subject: [PATCH 18/26] Communication Mechanism for JS Signed-off-by: Varun Jain --- .../jobscheduler/ODFERestTestCase.java | 34 ------------------- .../GetJobDetailsMultiNodeRestIT.java | 4 +-- .../rest/RestGetJobIndexActionTests.java | 4 +-- .../rest/RestGetJobTypeActionTests.java | 4 +-- 4 files changed, 6 insertions(+), 40 deletions(-) diff --git a/src/test/java/org/opensearch/jobscheduler/ODFERestTestCase.java b/src/test/java/org/opensearch/jobscheduler/ODFERestTestCase.java index b0001259..3c6c84e0 100644 --- a/src/test/java/org/opensearch/jobscheduler/ODFERestTestCase.java +++ b/src/test/java/org/opensearch/jobscheduler/ODFERestTestCase.java @@ -67,50 +67,16 @@ protected String getProtocol() { @Override protected Settings restAdminSettings() { return Settings.builder() - // disable the warning exception for admin client since it's only used for cleanup. .put("strictDeprecationMode", false) .put("http.port", 9200) - // @anomaly-detection.create-detector Commented this code until we have support of Common Utils for extensibility - /*.put(OPENSEARCH_SECURITY_SSL_HTTP_ENABLED, isHttps()) - .put(OPENSEARCH_SECURITY_SSL_HTTP_PEMCERT_FILEPATH, "sample.pem") - .put(OPENSEARCH_SECURITY_SSL_HTTP_KEYSTORE_FILEPATH, "test-kirk.jks") - .put(OPENSEARCH_SECURITY_SSL_HTTP_KEYSTORE_PASSWORD, "changeit") - .put(OPENSEARCH_SECURITY_SSL_HTTP_KEYSTORE_KEYPASSWORD, "changeit")*/ .build(); } - // Utility fn for deleting indices. Should only be used when not allowed in a regular context - // (e.g., deleting system indices) - protected static void deleteIndexWithAdminClient(String name) throws IOException { - Request request = new Request("DELETE", "/" + name); - adminClient().performRequest(request); - } - - // Utility fn for checking if an index exists. Should only be used when not allowed in a regular context - // (e.g., checking existence of system indices) - protected static boolean indexExistsWithAdminClient(String indexName) throws IOException { - Request request = new Request("HEAD", "/" + indexName); - Response response = adminClient().performRequest(request); - return RestStatus.OK.getStatus() == response.getStatusLine().getStatusCode(); - } - @Override protected RestClient buildClient(Settings settings, HttpHost[] hosts) throws IOException { boolean strictDeprecationMode = settings.getAsBoolean("strictDeprecationMode", true); RestClientBuilder builder = RestClient.builder(hosts); if (isHttps()) { - // @anomaly-detection.create-detector Commented this code until we have support of Common Utils for extensibility - /*String keystore = settings.get(OPENSEARCH_SECURITY_SSL_HTTP_KEYSTORE_FILEPATH); - if (Objects.nonNull(keystore)) { - URI uri = null; - try { - uri = this.getClass().getClassLoader().getResource("security/sample.pem").toURI(); - } catch (URISyntaxException e) { - throw new RuntimeException(e); - } - Path configPath = PathUtils.get(uri).getParent().toAbsolutePath(); - return new SecureRestClientBuilder(settings, configPath).build(); - } else {*/ configureHttpsClient(builder, settings); builder.setStrictDeprecationMode(strictDeprecationMode); return builder.build(); diff --git a/src/test/java/org/opensearch/jobscheduler/multinode/GetJobDetailsMultiNodeRestIT.java b/src/test/java/org/opensearch/jobscheduler/multinode/GetJobDetailsMultiNodeRestIT.java index 344a2a5b..09c62fb6 100644 --- a/src/test/java/org/opensearch/jobscheduler/multinode/GetJobDetailsMultiNodeRestIT.java +++ b/src/test/java/org/opensearch/jobscheduler/multinode/GetJobDetailsMultiNodeRestIT.java @@ -52,12 +52,12 @@ public void testGetJobDetailsRestAPI() throws Exception { ); String jobIndex = validateResponseAndGetJobIndex(entityAsMap(response1)); - Assert.assertEquals(expectedJobIndex, jobIndex); + assertEquals(expectedJobIndex, jobIndex); } } private String validateResponseAndGetJobIndex(Map responseMap) { - Assert.assertEquals("success", responseMap.get("response")); + assertEquals("success", responseMap.get("response")); HashMap jobDetails = (HashMap) responseMap.get("jobDetails"); return jobDetails.get("job_index"); } diff --git a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java index 8ff7da11..f2cdd96c 100644 --- a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java +++ b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java @@ -80,7 +80,7 @@ public void testPrepareRequest() throws IOException { ); action.prepareRequest(request, Mockito.mock(NodeClient.class)); - assertThat(channel.responses().get(), equalTo(0)); - assertThat(channel.errors().get(), equalTo(0)); + assertEquals(channel.responses().get(), equalTo(0)); + assertEquals(channel.errors().get(), equalTo(0)); } } diff --git a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java index a0309279..3629258c 100644 --- a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java +++ b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java @@ -79,7 +79,7 @@ public void testPrepareRequest() throws IOException { ); action.prepareRequest(request, Mockito.mock(NodeClient.class)); - assertThat(channel.responses().get(), CoreMatchers.equalTo(0)); - assertThat(channel.errors().get(), CoreMatchers.equalTo(0)); + assertEquals(channel.responses().get(), CoreMatchers.equalTo(0)); + assertEquals(channel.errors().get(), CoreMatchers.equalTo(0)); } } From 1494680c07db303cbcf4f4061d0f9c50f4740cb1 Mon Sep 17 00:00:00 2001 From: Varun Jain Date: Thu, 5 Jan 2023 12:11:32 -0800 Subject: [PATCH 19/26] Communication Mechanism for JS Signed-off-by: Varun Jain --- .../java/org/opensearch/jobscheduler/ODFERestTestCase.java | 6 +----- .../multinode/GetJobDetailsMultiNodeRestIT.java | 1 - 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/src/test/java/org/opensearch/jobscheduler/ODFERestTestCase.java b/src/test/java/org/opensearch/jobscheduler/ODFERestTestCase.java index 3c6c84e0..c7cc06b6 100644 --- a/src/test/java/org/opensearch/jobscheduler/ODFERestTestCase.java +++ b/src/test/java/org/opensearch/jobscheduler/ODFERestTestCase.java @@ -42,7 +42,6 @@ import org.opensearch.common.xcontent.NamedXContentRegistry; import org.opensearch.common.xcontent.XContentParser; import org.opensearch.common.xcontent.XContentType; -import org.opensearch.rest.RestStatus; import org.opensearch.test.rest.OpenSearchRestTestCase; public abstract class ODFERestTestCase extends OpenSearchRestTestCase { @@ -66,10 +65,7 @@ protected String getProtocol() { @Override protected Settings restAdminSettings() { - return Settings.builder() - .put("strictDeprecationMode", false) - .put("http.port", 9200) - .build(); + return Settings.builder().put("strictDeprecationMode", false).put("http.port", 9200).build(); } @Override diff --git a/src/test/java/org/opensearch/jobscheduler/multinode/GetJobDetailsMultiNodeRestIT.java b/src/test/java/org/opensearch/jobscheduler/multinode/GetJobDetailsMultiNodeRestIT.java index 09c62fb6..66619ba1 100644 --- a/src/test/java/org/opensearch/jobscheduler/multinode/GetJobDetailsMultiNodeRestIT.java +++ b/src/test/java/org/opensearch/jobscheduler/multinode/GetJobDetailsMultiNodeRestIT.java @@ -11,7 +11,6 @@ import com.google.common.collect.ImmutableMap; import java.util.HashMap; import java.util.Map; -import org.junit.Assert; import org.opensearch.client.Response; import org.opensearch.jobscheduler.ODFERestTestCase; import org.opensearch.jobscheduler.TestHelpers; From dbc9382661fb84bc9c1e94aea6650a2262fa1796 Mon Sep 17 00:00:00 2001 From: Varun Jain Date: Thu, 5 Jan 2023 12:28:04 -0800 Subject: [PATCH 20/26] Communication Mechanism for JS Signed-off-by: Varun Jain --- .../jobscheduler/rest/RestGetJobIndexActionTests.java | 5 ++--- .../jobscheduler/rest/RestGetJobTypeActionTests.java | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java index f2cdd96c..dcda0299 100644 --- a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java +++ b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java @@ -13,7 +13,6 @@ import java.util.List; import java.util.Locale; import java.util.Map; -import static org.hamcrest.Matchers.equalTo; import org.junit.Before; import org.mockito.Mockito; import org.opensearch.action.ActionListener; @@ -80,7 +79,7 @@ public void testPrepareRequest() throws IOException { ); action.prepareRequest(request, Mockito.mock(NodeClient.class)); - assertEquals(channel.responses().get(), equalTo(0)); - assertEquals(channel.errors().get(), equalTo(0)); + assertEquals(channel.responses().get(), 0); + assertEquals(channel.errors().get(), 0); } } diff --git a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java index 3629258c..7378936f 100644 --- a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java +++ b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java @@ -13,7 +13,6 @@ import java.util.List; import java.util.Locale; import java.util.Map; -import org.hamcrest.CoreMatchers; import org.junit.Before; import org.mockito.Mockito; import org.opensearch.action.ActionListener; @@ -79,7 +78,7 @@ public void testPrepareRequest() throws IOException { ); action.prepareRequest(request, Mockito.mock(NodeClient.class)); - assertEquals(channel.responses().get(), CoreMatchers.equalTo(0)); - assertEquals(channel.errors().get(), CoreMatchers.equalTo(0)); + assertEquals(channel.responses().get(), 0); + assertEquals(channel.errors().get(), 0); } } From 67964474df3d62d1c083eb9ef0e185cd6cf78a10 Mon Sep 17 00:00:00 2001 From: Varun Jain Date: Thu, 5 Jan 2023 15:12:59 -0800 Subject: [PATCH 21/26] Communication Mechanism for JS Signed-off-by: Varun Jain --- .../rest/RestGetJobIndexAction.java | 31 +++++++--------- .../rest/RestGetJobTypeAction.java | 33 +++++++---------- .../transport/GetJobIndexRequest.java | 9 ++--- .../transport/GetJobTypeRequest.java | 5 +-- .../jobscheduler/utils/JobDetailsService.java | 35 ++++++++++--------- .../jobscheduler/ODFERestTestCase.java | 5 ++- .../utils/JobDetailsServiceIT.java | 32 ++++++++--------- 7 files changed, 71 insertions(+), 79 deletions(-) diff --git a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java index 3b314387..e4805ddb 100644 --- a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java +++ b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java @@ -8,6 +8,8 @@ */ package org.opensearch.jobscheduler.rest; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.TimeUnit; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.opensearch.action.ActionListener; @@ -28,8 +30,6 @@ import java.io.IOException; import java.util.List; import java.util.Locale; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; import static java.util.Arrays.asList; import static java.util.Collections.unmodifiableList; @@ -70,15 +70,14 @@ protected RestChannelConsumer prepareRequest(RestRequest restRequest, NodeClient GetJobIndexRequest getJobIndexRequest = GetJobIndexRequest.parse(parser); - final String[] restResponse = new String[1]; - final JobDetails[] updateJobDetailsResponse = new JobDetails[1]; + final JobDetails[] jobDetailsResponseHolder = new JobDetails[1]; String jobIndex = getJobIndexRequest.getJobIndex(); String jobParameterAction = getJobIndexRequest.getJobParameterAction(); String jobRunnerAction = getJobIndexRequest.getJobRunnerAction(); String extensionId = getJobIndexRequest.getExtensionId(); - CountDownLatch latch = new CountDownLatch(1); + CompletableFuture inProgressFuture = new CompletableFuture<>(); jobDetailsService.processJobDetailsForExtensionId( jobIndex, @@ -90,27 +89,20 @@ protected RestChannelConsumer prepareRequest(RestRequest restRequest, NodeClient new ActionListener<>() { @Override public void onResponse(JobDetails jobDetails) { - if (jobDetails != null) { - restResponse[0] = "success"; - updateJobDetailsResponse[0] = jobDetails; - latch.countDown(); - } else { - restResponse[0] = "failed"; - latch.countDown(); - } + jobDetailsResponseHolder[0] = jobDetails; + inProgressFuture.complete(jobDetailsResponseHolder); } @Override public void onFailure(Exception e) { - restResponse[0] = "failed"; - latch.countDown(); + inProgressFuture.complete(null); logger.info("could not process job index", e); } } ); try { - latch.await(JobDetailsService.TIME_OUT_FOR_LATCH, TimeUnit.SECONDS); + inProgressFuture.get(JobDetailsService.TIME_OUT_FOR_REQUEST, TimeUnit.SECONDS); } catch (Exception e) { logger.info("Could not process job index due to exception ", e); } @@ -118,12 +110,13 @@ public void onFailure(Exception e) { return channel -> { XContentBuilder builder = channel.newBuilder(); RestStatus restStatus = RestStatus.OK; + String restResponse = jobDetailsResponseHolder[0] != null ? "success" : "failed"; BytesRestResponse bytesRestResponse; try { builder.startObject(); - builder.field("response", restResponse[0]); - if (restResponse[0] == "success") { - builder.field("jobDetails", updateJobDetailsResponse[0]); + builder.field("response", restResponse); + if (restResponse.equals("success")) { + builder.field("jobDetails", jobDetailsResponseHolder[0]); } else { restStatus = RestStatus.INTERNAL_SERVER_ERROR; } diff --git a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java index 3e2c3c8e..c48e697f 100644 --- a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java +++ b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java @@ -8,6 +8,8 @@ */ package org.opensearch.jobscheduler.rest; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.TimeUnit; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.opensearch.action.ActionListener; @@ -27,8 +29,6 @@ import java.io.IOException; import java.util.List; import java.util.Locale; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; import static java.util.Arrays.asList; import static java.util.Collections.unmodifiableList; @@ -68,13 +68,12 @@ protected RestChannelConsumer prepareRequest(RestRequest restRequest, NodeClient ensureExpectedToken(XContentParser.Token.START_OBJECT, parser.nextToken(), parser); GetJobTypeRequest getJobTypeRequest = GetJobTypeRequest.parse(parser); - final String[] restResponse = new String[1]; - final JobDetails[] updateJobDetailsResponse = new JobDetails[1]; + final JobDetails[] jobDetailsResponseHolder = new JobDetails[1]; String jobType = getJobTypeRequest.getJobType(); String extensionId = getJobTypeRequest.getExtensionId(); - CountDownLatch latch = new CountDownLatch(1); + CompletableFuture inProgressFuture = new CompletableFuture<>(); jobDetailsService.processJobDetailsForExtensionId( null, @@ -83,30 +82,23 @@ protected RestChannelConsumer prepareRequest(RestRequest restRequest, NodeClient null, extensionId, JobDetailsService.JobDetailsRequestType.JOB_TYPE, - new ActionListener() { + new ActionListener<>() { @Override public void onResponse(JobDetails jobDetails) { - if (jobDetails != null) { - restResponse[0] = "success"; - updateJobDetailsResponse[0] = jobDetails; - latch.countDown(); - } else { - restResponse[0] = "failed"; - latch.countDown(); - } + jobDetailsResponseHolder[0] = jobDetails; + inProgressFuture.complete(jobDetailsResponseHolder); } @Override public void onFailure(Exception e) { - restResponse[0] = "failed"; - latch.countDown(); + inProgressFuture.complete(null); logger.info("could not process job type", e); } } ); try { - latch.await(JobDetailsService.TIME_OUT_FOR_LATCH, TimeUnit.SECONDS); + inProgressFuture.get(10L, TimeUnit.SECONDS); } catch (Exception e) { logger.info("Could not get job type due to exception ", e); } @@ -114,12 +106,13 @@ public void onFailure(Exception e) { return channel -> { XContentBuilder builder = channel.newBuilder(); RestStatus restStatus = RestStatus.OK; + String restResponse = jobDetailsResponseHolder[0] != null ? "success" : "failed"; BytesRestResponse bytesRestResponse; try { builder.startObject(); - builder.field("response", restResponse[0]); - if (restResponse[0] == "success") { - builder.field("jobDetails", updateJobDetailsResponse[0]); + builder.field("response", restResponse); + if (restResponse.equals("success")) { + builder.field("jobDetails", jobDetailsResponseHolder[0]); } else { restStatus = RestStatus.INTERNAL_SERVER_ERROR; } diff --git a/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java index f0a7defa..a7d0ce54 100644 --- a/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobIndexRequest.java @@ -8,6 +8,7 @@ */ package org.opensearch.jobscheduler.transport; +import java.util.Objects; import org.opensearch.action.ActionRequest; import org.opensearch.action.ActionRequestValidationException; import org.opensearch.common.io.stream.StreamInput; @@ -47,10 +48,10 @@ public GetJobIndexRequest(StreamInput in) throws IOException { public GetJobIndexRequest(String jobIndex, String jobParameterAction, String jobRunnerAction, String extensionId) { super(); - this.jobIndex = jobIndex; - this.jobParameterAction = jobParameterAction; - this.jobRunnerAction = jobRunnerAction; - this.extensionId = extensionId; + this.jobIndex = Objects.requireNonNull(jobIndex); + this.jobParameterAction = Objects.requireNonNull(jobParameterAction); + this.jobRunnerAction = Objects.requireNonNull(jobRunnerAction); + this.extensionId = Objects.requireNonNull(extensionId); } @Override diff --git a/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeRequest.java b/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeRequest.java index 88352a40..01a52298 100644 --- a/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeRequest.java +++ b/src/main/java/org/opensearch/jobscheduler/transport/GetJobTypeRequest.java @@ -8,6 +8,7 @@ */ package org.opensearch.jobscheduler.transport; +import java.util.Objects; import org.opensearch.action.ActionRequest; import org.opensearch.action.ActionRequestValidationException; import org.opensearch.common.io.stream.StreamInput; @@ -31,8 +32,8 @@ public class GetJobTypeRequest extends ActionRequest { public GetJobTypeRequest(String jobType, String extensionId) { super(); - this.jobType = jobType; - this.extensionId = extensionId; + this.jobType = Objects.requireNonNull(jobType); + this.extensionId = Objects.requireNonNull(extensionId); } public GetJobTypeRequest(StreamInput in) throws IOException { diff --git a/src/main/java/org/opensearch/jobscheduler/utils/JobDetailsService.java b/src/main/java/org/opensearch/jobscheduler/utils/JobDetailsService.java index dd4eb978..b2b2d4bd 100644 --- a/src/main/java/org/opensearch/jobscheduler/utils/JobDetailsService.java +++ b/src/main/java/org/opensearch/jobscheduler/utils/JobDetailsService.java @@ -45,7 +45,7 @@ public class JobDetailsService { private static final String JOB_DETAILS_INDEX_NAME = ".opensearch-plugins-job-details"; private static final String PLUGINS_JOB_DETAILS_MAPPING_FILE = "/mappings/opensearch_plugins_job_details.json"; - public static Long TIME_OUT_FOR_LATCH = 5L; + public static Long TIME_OUT_FOR_REQUEST = 10L; private final Client client; private final ClusterService clusterService; @@ -61,7 +61,7 @@ public boolean jobDetailsIndexExist() { /** * * @param listener an {@code ActionListener} that has onResponse and onFailure that is used to return the job details index if it was created - * * or else null. + * or else null. */ @VisibleForTesting void createJobDetailsIndex(ActionListener listener) { @@ -106,21 +106,24 @@ public void processJobDetailsForExtensionId( boolean isJobIndexRequest; if (requestType.JOB_INDEX == requestType) { isJobIndexRequest = true; - if (jobIndexName == null) { - listener.onFailure(new IllegalArgumentException("Job Index Name should not be null")); - } else if (jobParameterActionName == null) { - listener.onFailure(new IllegalArgumentException("Job Parameter Action Name should not be null")); - } else if (jobRunnerActionName == null) { - listener.onFailure(new IllegalArgumentException("Job Runner Action Name should not be null")); + if (jobIndexName == null + || jobIndexName.isEmpty() + || jobParameterActionName == null + || jobParameterActionName.isEmpty() + || jobRunnerActionName == null + || jobRunnerActionName.isEmpty()) { + listener.onFailure( + new IllegalArgumentException("JobIndexName, JobParameterActionName, JobRunnerActionName must not be null or empty") + ); } } else { isJobIndexRequest = false; - if (jobTypeName == null) { - listener.onFailure(new IllegalArgumentException("Job Type Name should not be null")); + if (jobTypeName == null || jobTypeName.isEmpty()) { + listener.onFailure(new IllegalArgumentException("Job Type Name must not be null or empty")); } } - if (extensionId == null) { - listener.onFailure(new IllegalArgumentException("Extension Id should not be null")); + if (extensionId == null || extensionId.isEmpty()) { + listener.onFailure(new IllegalArgumentException("Extension Id must not be null or empty")); } else { createJobDetailsIndex(ActionListener.wrap(created -> { if (created) { @@ -172,7 +175,7 @@ public void processJobDetailsForExtensionId( * @param tempJobDetails new job details object that need to be inserted as document in the index * @param extensionId unique id to create the entry for job details * @param listener an {@code ActionListener} that has onResponse and onFailure that is used to return the job details if it was created - * * or else null. + * or else null. */ private void createJobDetailsForExtensionId(final JobDetails tempJobDetails, String extensionId, ActionListener listener) { try { @@ -200,7 +203,7 @@ private void createJobDetailsForExtensionId(final JobDetails tempJobDetails, Str * * @param extensionId unique id to find the job details document in the index * @param listener an {@code ActionListener} that has onResponse and onFailure that is used to return the job details if it was found - * * or else null. + * or else null. */ private void findJobDetailsForExtensionId(final String extensionId, ActionListener listener) { GetRequest getRequest = new GetRequest(JOB_DETAILS_INDEX_NAME).id(extensionId); @@ -228,7 +231,7 @@ private void findJobDetailsForExtensionId(final String extensionId, ActionListen * * @param extensionId unique id to find and delete the job details document in the index * @param listener an {@code ActionListener} that has onResponse and onFailure that is used to return the job details if it was deleted - * * or else null. + * or else null. */ public void deleteJobDetailsForExtension(final String extensionId, ActionListener listener) { DeleteRequest deleteRequest = new DeleteRequest(JOB_DETAILS_INDEX_NAME).id(extensionId); @@ -251,7 +254,7 @@ public void deleteJobDetailsForExtension(final String extensionId, ActionListene * @param updateJobDetails update job details object entry * @param extensionId unique id to find and update the corresponding document mapped to it * @param listener an {@code ActionListener} that has onResponse and onFailure that is used to return the job details if it was updated - * * or else null. + * or else null. */ private void updateJobDetailsForExtensionId( final JobDetails updateJobDetails, diff --git a/src/test/java/org/opensearch/jobscheduler/ODFERestTestCase.java b/src/test/java/org/opensearch/jobscheduler/ODFERestTestCase.java index c7cc06b6..304cc28b 100644 --- a/src/test/java/org/opensearch/jobscheduler/ODFERestTestCase.java +++ b/src/test/java/org/opensearch/jobscheduler/ODFERestTestCase.java @@ -46,6 +46,9 @@ public abstract class ODFERestTestCase extends OpenSearchRestTestCase { + private static String localhostName = "localhost"; + private static int port = 9200; + protected boolean isHttps() { boolean isHttps = Optional.ofNullable(System.getProperty("https")).map("true"::equalsIgnoreCase).orElse(false); if (isHttps) { @@ -129,7 +132,7 @@ protected static void configureHttpsClient(RestClientBuilder builder, Settings s .orElseThrow(() -> new RuntimeException("password is missing")); BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider(); credentialsProvider.setCredentials( - new AuthScope(new HttpHost("localhost", 9200)), + new AuthScope(new HttpHost(localhostName, port)), new UsernamePasswordCredentials(userName, password.toCharArray()) ); try { diff --git a/src/test/java/org/opensearch/jobscheduler/utils/JobDetailsServiceIT.java b/src/test/java/org/opensearch/jobscheduler/utils/JobDetailsServiceIT.java index 58571934..0c110f27 100644 --- a/src/test/java/org/opensearch/jobscheduler/utils/JobDetailsServiceIT.java +++ b/src/test/java/org/opensearch/jobscheduler/utils/JobDetailsServiceIT.java @@ -8,8 +8,10 @@ */ package org.opensearch.jobscheduler.utils; -import java.util.concurrent.CountDownLatch; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; import org.junit.Before; import org.mockito.Mockito; import org.opensearch.action.ActionListener; @@ -28,8 +30,8 @@ public void setup() { .thenReturn(true); } - public void testSanity() throws Exception { - CountDownLatch latch = new CountDownLatch(1); + public void testSanity() throws ExecutionException, InterruptedException, TimeoutException { + CompletableFuture inProgressFuture = new CompletableFuture<>(); JobDetailsService jobDetailsService = new JobDetailsService(client(), this.clusterService); jobDetailsService.processJobDetailsForExtensionId( @@ -47,20 +49,20 @@ public void testSanity() throws Exception { assertNull(jobDetails.getJobType()); jobDetailsService.createJobDetailsIndex(ActionListener.wrap(response -> { assertTrue(response); - latch.countDown(); + inProgressFuture.complete(response); }, exception -> { fail(exception.getMessage()); })); jobDetailsService.deleteJobDetailsForExtension("sample-extension", ActionListener.wrap(response -> { assertTrue(response); - latch.countDown(); + inProgressFuture.complete(response); }, exception -> { fail(exception.getMessage()); })); }, exception -> { fail(exception.getMessage()); }) ); - latch.await(JobDetailsService.TIME_OUT_FOR_LATCH, TimeUnit.SECONDS); + inProgressFuture.get(JobDetailsService.TIME_OUT_FOR_REQUEST, TimeUnit.SECONDS); } - public void testSecondProcessofJobIndexPass() throws Exception { - CountDownLatch latch = new CountDownLatch(1); + public void testSecondProcessofJobIndexPass() throws ExecutionException, InterruptedException, TimeoutException { + CompletableFuture inProgressFuture = new CompletableFuture<>(); JobDetailsService jobDetailsService = new JobDetailsService(client(), this.clusterService); jobDetailsService.processJobDetailsForExtensionId( @@ -88,12 +90,12 @@ public void testSecondProcessofJobIndexPass() throws Exception { assertNull(jobDetails.getJobType()); jobDetailsService.createJobDetailsIndex(ActionListener.wrap(response -> { assertTrue(response); - latch.countDown(); + inProgressFuture.complete(response); }, exception -> { fail(exception.getMessage()); })); jobDetailsService.deleteJobDetailsForExtension("sample-extension", ActionListener.wrap(response -> { assertTrue(response); - latch.countDown(); + inProgressFuture.complete(response); }, exception -> { fail(exception.getMessage()); })); }, exception -> { fail(exception.getMessage()); }) ); @@ -103,11 +105,10 @@ public void testSecondProcessofJobIndexPass() throws Exception { ) ); - latch.await(JobDetailsService.TIME_OUT_FOR_LATCH, TimeUnit.SECONDS); + inProgressFuture.get(JobDetailsService.TIME_OUT_FOR_REQUEST, TimeUnit.SECONDS); } - public void testDeleteJobDetailsWithOutExtensionIdCreation() throws Exception { - CountDownLatch latch = new CountDownLatch(1); + public void testDeleteJobDetailsWithOutExtensionIdCreation() throws ExecutionException, InterruptedException, TimeoutException { JobDetailsService jobDetailsService = new JobDetailsService(client(), this.clusterService); jobDetailsService.deleteJobDetailsForExtension( "demo-extension", @@ -116,11 +117,9 @@ public void testDeleteJobDetailsWithOutExtensionIdCreation() throws Exception { exception -> { fail(exception.getMessage()); } ) ); - latch.await(JobDetailsService.TIME_OUT_FOR_LATCH, TimeUnit.SECONDS); } - public void testDeleteNonExistingJobDetails() throws Exception { - CountDownLatch latch = new CountDownLatch(1); + public void testDeleteNonExistingJobDetails() throws ExecutionException, InterruptedException, TimeoutException { JobDetailsService jobDetailsService = new JobDetailsService(client(), this.clusterService); jobDetailsService.createJobDetailsIndex(ActionListener.wrap(created -> { if (created) { @@ -136,7 +135,6 @@ public void testDeleteNonExistingJobDetails() throws Exception { } }, exception -> fail(exception.getMessage()))); - latch.await(JobDetailsService.TIME_OUT_FOR_LATCH, TimeUnit.SECONDS); } } From b726e5cc56e13fe9c1f5c607e31a7087cad89d6f Mon Sep 17 00:00:00 2001 From: Varun Jain Date: Thu, 5 Jan 2023 15:23:26 -0800 Subject: [PATCH 22/26] Communication Mechanism for JS Signed-off-by: Varun Jain --- .../org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java | 2 +- .../org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java index e4805ddb..0789e82d 100644 --- a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java +++ b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java @@ -104,7 +104,7 @@ public void onFailure(Exception e) { try { inProgressFuture.get(JobDetailsService.TIME_OUT_FOR_REQUEST, TimeUnit.SECONDS); } catch (Exception e) { - logger.info("Could not process job index due to exception ", e); + logger.info("Time Limit Exceeded due to exception ", e); } return channel -> { diff --git a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java index c48e697f..369a8851 100644 --- a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java +++ b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java @@ -100,7 +100,7 @@ public void onFailure(Exception e) { try { inProgressFuture.get(10L, TimeUnit.SECONDS); } catch (Exception e) { - logger.info("Could not get job type due to exception ", e); + logger.info("Time Limit Exceeded due to exception", e); } return channel -> { From a123089901a879eb51fc6f37cfe809319e105e06 Mon Sep 17 00:00:00 2001 From: Varun Jain Date: Thu, 5 Jan 2023 15:30:41 -0800 Subject: [PATCH 23/26] Communication Mechanism for JS Signed-off-by: Varun Jain --- .../opensearch/jobscheduler/rest/RestGetJobIndexAction.java | 3 ++- .../org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java index 0789e82d..ae9817ba 100644 --- a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java +++ b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java @@ -95,8 +95,9 @@ public void onResponse(JobDetails jobDetails) { @Override public void onFailure(Exception e) { - inProgressFuture.complete(null); logger.info("could not process job index", e); + jobDetailsResponseHolder[0] = null; + inProgressFuture.complete(jobDetailsResponseHolder); } } ); diff --git a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java index 369a8851..089b9182 100644 --- a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java +++ b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java @@ -91,8 +91,9 @@ public void onResponse(JobDetails jobDetails) { @Override public void onFailure(Exception e) { - inProgressFuture.complete(null); logger.info("could not process job type", e); + jobDetailsResponseHolder[0] = null; + inProgressFuture.complete(jobDetailsResponseHolder); } } ); From d6bea89b6b84f7c78cfdde7971981395e62ad84f Mon Sep 17 00:00:00 2001 From: Varun Jain Date: Thu, 5 Jan 2023 15:48:34 -0800 Subject: [PATCH 24/26] Communication Mechanism for JS Signed-off-by: Varun Jain --- .../jobscheduler/utils/RestHandlerUtils.java | 79 ------------------- 1 file changed, 79 deletions(-) delete mode 100644 src/main/java/org/opensearch/jobscheduler/utils/RestHandlerUtils.java diff --git a/src/main/java/org/opensearch/jobscheduler/utils/RestHandlerUtils.java b/src/main/java/org/opensearch/jobscheduler/utils/RestHandlerUtils.java deleted file mode 100644 index 7f301785..00000000 --- a/src/main/java/org/opensearch/jobscheduler/utils/RestHandlerUtils.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - * - * The OpenSearch Contributors require contributions made to - * this file be licensed under the Apache-2.0 license or a - * compatible open source license. - */ -package org.opensearch.jobscheduler.utils; - -import com.google.common.base.Throwables; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.opensearch.OpenSearchStatusException; -import org.opensearch.ResourceNotFoundException; -import org.opensearch.action.ActionListener; -import org.opensearch.common.Nullable; -import org.opensearch.index.IndexNotFoundException; -import org.opensearch.indices.InvalidIndexNameException; -import org.opensearch.rest.RestStatus; - -import static org.opensearch.rest.RestStatus.BAD_REQUEST; -import static org.opensearch.rest.RestStatus.INTERNAL_SERVER_ERROR; - -public final class RestHandlerUtils { - - private static final Logger logger = LogManager.getLogger(RestHandlerUtils.class); - - private RestHandlerUtils() {} - - /** - * Wrap action listener to avoid return verbose error message and wrong 500 error to user. - * - * TODO: tune this function for wrapped exception, return root exception error message - * - * @param actionListener action listener - * @param generalErrorMessage general error message - * @param action listener response type - * @return wrapped action listener - */ - public static ActionListener wrapRestActionListener(ActionListener actionListener, String generalErrorMessage) { - return ActionListener.wrap(r -> { actionListener.onResponse(r); }, e -> { - logger.error("Wrap exception before sending back to user", e); - Throwable cause = Throwables.getRootCause(e); - if (isProperExceptionToReturn(e)) { - actionListener.onFailure(e); - } else if (isProperExceptionToReturn(cause)) { - actionListener.onFailure((Exception) cause); - } else { - RestStatus status = isBadRequest(e) ? BAD_REQUEST : INTERNAL_SERVER_ERROR; - String errorMessage = generalErrorMessage; - if (isBadRequest(e)) { - errorMessage = e.getMessage(); - } else if (cause != null && (isBadRequest(cause))) { - errorMessage = cause.getMessage(); - } - actionListener.onFailure(new OpenSearchStatusException(errorMessage, status)); - } - }); - } - - public static boolean isBadRequest(Throwable e) { - if (e == null) { - return false; - } - return e instanceof IllegalArgumentException || e instanceof ResourceNotFoundException; - } - - public static boolean isProperExceptionToReturn(Throwable e) { - if (e == null) { - return false; - } - return e instanceof OpenSearchStatusException || e instanceof IndexNotFoundException || e instanceof InvalidIndexNameException; - } - - private static String coalesceToEmpty(@Nullable String s) { - return s == null ? "" : s; - } -} From 3613ec8133463a463a8342f219003084e76e05af Mon Sep 17 00:00:00 2001 From: Varun Jain Date: Thu, 5 Jan 2023 19:06:11 -0800 Subject: [PATCH 25/26] Communication Mechanism for JS Signed-off-by: Varun Jain --- .../opensearch/jobscheduler/rest/RestGetJobIndexAction.java | 3 ++- .../opensearch/jobscheduler/rest/RestGetJobTypeAction.java | 3 ++- .../jobscheduler/rest/RestGetJobIndexActionTests.java | 4 +++- .../jobscheduler/rest/RestGetJobTypeActionTests.java | 2 ++ 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java index ae9817ba..ede07098 100644 --- a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java +++ b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java @@ -97,12 +97,13 @@ public void onResponse(JobDetails jobDetails) { public void onFailure(Exception e) { logger.info("could not process job index", e); jobDetailsResponseHolder[0] = null; - inProgressFuture.complete(jobDetailsResponseHolder); + inProgressFuture.completeExceptionally(e); } } ); try { + inProgressFuture.orTimeout(JobDetailsService.TIME_OUT_FOR_REQUEST, TimeUnit.SECONDS); inProgressFuture.get(JobDetailsService.TIME_OUT_FOR_REQUEST, TimeUnit.SECONDS); } catch (Exception e) { logger.info("Time Limit Exceeded due to exception ", e); diff --git a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java index 089b9182..d4d792e1 100644 --- a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java +++ b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java @@ -99,7 +99,8 @@ public void onFailure(Exception e) { ); try { - inProgressFuture.get(10L, TimeUnit.SECONDS); + inProgressFuture.orTimeout(JobDetailsService.TIME_OUT_FOR_REQUEST, TimeUnit.SECONDS); + inProgressFuture.get(); } catch (Exception e) { logger.info("Time Limit Exceeded due to exception", e); } diff --git a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java index dcda0299..4be6e71f 100644 --- a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java +++ b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobIndexActionTests.java @@ -8,6 +8,7 @@ */ package org.opensearch.jobscheduler.rest; +import com.carrotsearch.randomizedtesting.annotations.ThreadLeakScope; import java.io.IOException; import java.util.HashMap; import java.util.List; @@ -27,6 +28,7 @@ import org.opensearch.test.rest.FakeRestChannel; import org.opensearch.test.rest.FakeRestRequest; +@ThreadLeakScope(ThreadLeakScope.Scope.NONE) public class RestGetJobIndexActionTests extends OpenSearchTestCase { private RestGetJobIndexAction action; @@ -55,7 +57,6 @@ public void testGetRoutes() { } public void testPrepareRequest() throws IOException { - String content = "{\"job_index\":\"sample-index-name\",\"job_runner_action\":\"sample-job-runner-action\",\"job_parameter_action\":\"sample-job-parameter-action\",\"extension_id\":\"sample-extension\"}"; Map params = new HashMap<>(); @@ -77,6 +78,7 @@ public void testPrepareRequest() throws IOException { JobDetailsService.JobDetailsRequestType.JOB_INDEX, ActionListener.wrap(response -> {}, exception -> {}) ); + action.prepareRequest(request, Mockito.mock(NodeClient.class)); assertEquals(channel.responses().get(), 0); diff --git a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java index 7378936f..d6bc6974 100644 --- a/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java +++ b/src/test/java/org/opensearch/jobscheduler/rest/RestGetJobTypeActionTests.java @@ -8,6 +8,7 @@ */ package org.opensearch.jobscheduler.rest; +import com.carrotsearch.randomizedtesting.annotations.ThreadLeakScope; import java.io.IOException; import java.util.HashMap; import java.util.List; @@ -27,6 +28,7 @@ import org.opensearch.test.rest.FakeRestChannel; import org.opensearch.test.rest.FakeRestRequest; +@ThreadLeakScope(ThreadLeakScope.Scope.NONE) public class RestGetJobTypeActionTests extends OpenSearchTestCase { private RestGetJobTypeAction action; From 9a881dc97516278f735cdac7f388237015b358e4 Mon Sep 17 00:00:00 2001 From: Varun Jain Date: Fri, 6 Jan 2023 11:54:52 -0800 Subject: [PATCH 26/26] Communication Mechanism for JS Signed-off-by: Varun Jain --- .../jobscheduler/model/JobDetails.java | 5 ++++ .../rest/RestGetJobIndexAction.java | 25 ++++++++++++------- .../rest/RestGetJobTypeAction.java | 20 +++++++++------ .../jobscheduler/utils/JobDetailsService.java | 8 +++--- 4 files changed, 38 insertions(+), 20 deletions(-) diff --git a/src/main/java/org/opensearch/jobscheduler/model/JobDetails.java b/src/main/java/org/opensearch/jobscheduler/model/JobDetails.java index f79e5f64..aba35bc6 100644 --- a/src/main/java/org/opensearch/jobscheduler/model/JobDetails.java +++ b/src/main/java/org/opensearch/jobscheduler/model/JobDetails.java @@ -8,6 +8,7 @@ */ package org.opensearch.jobscheduler.model; +import org.opensearch.common.Nullable; import org.opensearch.common.xcontent.ToXContent; import org.opensearch.common.xcontent.ToXContentObject; import org.opensearch.common.xcontent.XContentBuilder; @@ -112,6 +113,7 @@ public JobDetails(final JobDetails copyJobDetails) { this(copyJobDetails.jobIndex, copyJobDetails.jobType, copyJobDetails.jobParameterAction, copyJobDetails.jobRunnerAction); } + @Nullable public String getJobIndex() { return jobIndex; } @@ -120,6 +122,7 @@ public void setJobIndex(String jobIndex) { this.jobIndex = jobIndex; } + @Nullable public String getJobType() { return jobType; } @@ -128,6 +131,7 @@ public void setJobType(String jobType) { this.jobType = jobType; } + @Nullable public String getJobParameterAction() { return jobParameterAction; } @@ -136,6 +140,7 @@ public void setJobParameterAction(String jobParameterAction) { this.jobParameterAction = jobParameterAction; } + @Nullable public String getJobRunnerAction() { return jobRunnerAction; } diff --git a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java index ede07098..25cc778a 100644 --- a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java +++ b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobIndexAction.java @@ -8,8 +8,6 @@ */ package org.opensearch.jobscheduler.rest; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.TimeUnit; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.opensearch.action.ActionListener; @@ -31,6 +29,11 @@ import java.util.List; import java.util.Locale; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + import static java.util.Arrays.asList; import static java.util.Collections.unmodifiableList; import static org.opensearch.common.xcontent.XContentParserUtils.ensureExpectedToken; @@ -96,28 +99,32 @@ public void onResponse(JobDetails jobDetails) { @Override public void onFailure(Exception e) { logger.info("could not process job index", e); - jobDetailsResponseHolder[0] = null; inProgressFuture.completeExceptionally(e); } } ); try { - inProgressFuture.orTimeout(JobDetailsService.TIME_OUT_FOR_REQUEST, TimeUnit.SECONDS); - inProgressFuture.get(JobDetailsService.TIME_OUT_FOR_REQUEST, TimeUnit.SECONDS); + inProgressFuture.orTimeout(JobDetailsService.TIME_OUT_FOR_REQUEST, TimeUnit.SECONDS).join(); + } catch (CompletionException e) { + if (e.getCause() instanceof TimeoutException) { + logger.info(" Request timed out with an exception ", e); + } else { + throw e; + } } catch (Exception e) { - logger.info("Time Limit Exceeded due to exception ", e); + logger.info(" Could not process job index due to exception ", e); } return channel -> { XContentBuilder builder = channel.newBuilder(); RestStatus restStatus = RestStatus.OK; - String restResponse = jobDetailsResponseHolder[0] != null ? "success" : "failed"; + String restResponseString = jobDetailsResponseHolder[0] != null ? "success" : "failed"; BytesRestResponse bytesRestResponse; try { builder.startObject(); - builder.field("response", restResponse); - if (restResponse.equals("success")) { + builder.field("response", restResponseString); + if (restResponseString.equals("success")) { builder.field("jobDetails", jobDetailsResponseHolder[0]); } else { restStatus = RestStatus.INTERNAL_SERVER_ERROR; diff --git a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java index d4d792e1..1e676ef4 100644 --- a/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java +++ b/src/main/java/org/opensearch/jobscheduler/rest/RestGetJobTypeAction.java @@ -9,7 +9,9 @@ package org.opensearch.jobscheduler.rest; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionException; import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.opensearch.action.ActionListener; @@ -92,28 +94,32 @@ public void onResponse(JobDetails jobDetails) { @Override public void onFailure(Exception e) { logger.info("could not process job type", e); - jobDetailsResponseHolder[0] = null; inProgressFuture.complete(jobDetailsResponseHolder); } } ); try { - inProgressFuture.orTimeout(JobDetailsService.TIME_OUT_FOR_REQUEST, TimeUnit.SECONDS); - inProgressFuture.get(); + inProgressFuture.orTimeout(JobDetailsService.TIME_OUT_FOR_REQUEST, TimeUnit.SECONDS).join(); + } catch (CompletionException e) { + if (e.getCause() instanceof TimeoutException) { + logger.info(" Request timed out with an exception ", e); + } else { + throw e; + } } catch (Exception e) { - logger.info("Time Limit Exceeded due to exception", e); + logger.info(" Could not process job type due to exception ", e); } return channel -> { XContentBuilder builder = channel.newBuilder(); RestStatus restStatus = RestStatus.OK; - String restResponse = jobDetailsResponseHolder[0] != null ? "success" : "failed"; + String restResponseString = jobDetailsResponseHolder[0] != null ? "success" : "failed"; BytesRestResponse bytesRestResponse; try { builder.startObject(); - builder.field("response", restResponse); - if (restResponse.equals("success")) { + builder.field("response", restResponseString); + if (restResponseString.equals("success")) { builder.field("jobDetails", jobDetailsResponseHolder[0]); } else { restStatus = RestStatus.INTERNAL_SERVER_ERROR; diff --git a/src/main/java/org/opensearch/jobscheduler/utils/JobDetailsService.java b/src/main/java/org/opensearch/jobscheduler/utils/JobDetailsService.java index b2b2d4bd..29dc41b4 100644 --- a/src/main/java/org/opensearch/jobscheduler/utils/JobDetailsService.java +++ b/src/main/java/org/opensearch/jobscheduler/utils/JobDetailsService.java @@ -171,7 +171,7 @@ public void processJobDetailsForExtensionId( } /** - * + * Create Job details entry for extension id * @param tempJobDetails new job details object that need to be inserted as document in the index * @param extensionId unique id to create the entry for job details * @param listener an {@code ActionListener} that has onResponse and onFailure that is used to return the job details if it was created @@ -200,7 +200,7 @@ private void createJobDetailsForExtensionId(final JobDetails tempJobDetails, Str } /** - * + * Find extension corresponding to an extension id * @param extensionId unique id to find the job details document in the index * @param listener an {@code ActionListener} that has onResponse and onFailure that is used to return the job details if it was found * or else null. @@ -228,7 +228,7 @@ private void findJobDetailsForExtensionId(final String extensionId, ActionListen } /** - * + * Delete job details to a corresponding extension id * @param extensionId unique id to find and delete the job details document in the index * @param listener an {@code ActionListener} that has onResponse and onFailure that is used to return the job details if it was deleted * or else null. @@ -250,7 +250,7 @@ public void deleteJobDetailsForExtension(final String extensionId, ActionListene } /** - * + * Update Job details to a corresponding extension Id * @param updateJobDetails update job details object entry * @param extensionId unique id to find and update the corresponding document mapped to it * @param listener an {@code ActionListener} that has onResponse and onFailure that is used to return the job details if it was updated