Skip to content

Commit

Permalink
Improve SchedulerClient compliance with Scheduler API (#2736)
Browse files Browse the repository at this point in the history
* Add result metadata to JavaExecutable

* Improve SchedulerClient compliance with Scheduler API
- improve the handling of job and task results handling, to allow transparent navigation (job to task, logs, etc). Added correct dozer mappings for job and task results
- improve the handling of job info and corrected the metrics which were broken in both Java and Rest apis
- implemented a few previously unsupported methods in SchedulerClient class
- better handling of the task logs and exception in Task result
- Added a test in SchedulerClientTest to test a few accesses to the scheduler api, mostly job result but also job state, job info

* Improve SchedulerClient compliance with Scheduler API
- fixing unit tests

* implement sonar review

* implemented reviews
  • Loading branch information
fviale committed Dec 30, 2016
1 parent 4205123 commit 3109091
Show file tree
Hide file tree
Showing 33 changed files with 896 additions and 298 deletions.
Expand Up @@ -36,6 +36,18 @@
*/
package org.ow2.proactive_grid_cloud_portal.common;

import org.jboss.resteasy.annotations.GZIP;
import org.jboss.resteasy.annotations.providers.multipart.MultipartForm;
import org.jboss.resteasy.plugins.providers.multipart.MultipartFormDataInput;
import org.ow2.proactive.scheduler.common.SortSpecifierContainer;
import org.ow2.proactive_grid_cloud_portal.common.dto.LoginForm;
import org.ow2.proactive_grid_cloud_portal.scheduler.dto.*;
import org.ow2.proactive_grid_cloud_portal.scheduler.exception.*;

import javax.security.auth.login.LoginException;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.PathSegment;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
Expand All @@ -46,51 +58,6 @@
import java.util.Map;
import java.util.Set;

import javax.security.auth.login.LoginException;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.NotFoundException;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.PathSegment;

import org.jboss.resteasy.annotations.GZIP;
import org.jboss.resteasy.annotations.providers.multipart.MultipartForm;
import org.jboss.resteasy.plugins.providers.multipart.MultipartFormDataInput;
import org.ow2.proactive.scheduler.common.SortSpecifierContainer;
import org.ow2.proactive_grid_cloud_portal.common.dto.LoginForm;
import org.ow2.proactive_grid_cloud_portal.scheduler.dto.JobIdData;
import org.ow2.proactive_grid_cloud_portal.scheduler.dto.JobInfoData;
import org.ow2.proactive_grid_cloud_portal.scheduler.dto.JobResultData;
import org.ow2.proactive_grid_cloud_portal.scheduler.dto.JobStateData;
import org.ow2.proactive_grid_cloud_portal.scheduler.dto.JobUsageData;
import org.ow2.proactive_grid_cloud_portal.scheduler.dto.JobValidationData;
import org.ow2.proactive_grid_cloud_portal.scheduler.dto.RestMapPage;
import org.ow2.proactive_grid_cloud_portal.scheduler.dto.RestPage;
import org.ow2.proactive_grid_cloud_portal.scheduler.dto.SchedulerStatusData;
import org.ow2.proactive_grid_cloud_portal.scheduler.dto.SchedulerUserData;
import org.ow2.proactive_grid_cloud_portal.scheduler.dto.TaskResultData;
import org.ow2.proactive_grid_cloud_portal.scheduler.dto.TaskStateData;
import org.ow2.proactive_grid_cloud_portal.scheduler.dto.UserJobData;
import org.ow2.proactive_grid_cloud_portal.scheduler.exception.JobAlreadyFinishedRestException;
import org.ow2.proactive_grid_cloud_portal.scheduler.exception.JobCreationRestException;
import org.ow2.proactive_grid_cloud_portal.scheduler.exception.LogForwardingRestException;
import org.ow2.proactive_grid_cloud_portal.scheduler.exception.NotConnectedRestException;
import org.ow2.proactive_grid_cloud_portal.scheduler.exception.PermissionRestException;
import org.ow2.proactive_grid_cloud_portal.scheduler.exception.SchedulerRestException;
import org.ow2.proactive_grid_cloud_portal.scheduler.exception.SubmissionClosedRestException;
import org.ow2.proactive_grid_cloud_portal.scheduler.exception.UnknownJobRestException;
import org.ow2.proactive_grid_cloud_portal.scheduler.exception.UnknownTaskRestException;

@Path("/scheduler/")
public interface SchedulerRestInterface {

Expand Down Expand Up @@ -1613,6 +1580,14 @@ List<SchedulerUserData> getUsers(@HeaderParam("sessionid") final String sessionI
List<String> userspaceURIs(@HeaderParam("sessionid") String sessionId)
throws NotConnectedRestException, PermissionRestException;


@GET
@Path("globalspace")
@Produces("application/json")
List<String> globalspaceURIs(@HeaderParam("sessionid") String sessionId)
throws NotConnectedRestException, PermissionRestException;


/**
* Users having jobs in the scheduler
*
Expand Down
Expand Up @@ -37,7 +37,7 @@

package org.ow2.proactive_grid_cloud_portal.scheduler.dto;

public class JobInfoData {
public class JobInfoData implements java.io.Serializable {

private long startTime;
private long inErrorTime;
Expand Down
Expand Up @@ -37,17 +37,23 @@

package org.ow2.proactive_grid_cloud_portal.scheduler.dto;

import java.util.Map;

import javax.xml.bind.annotation.XmlRootElement;
import java.util.Map;


@XmlRootElement
public class JobResultData {

private JobIdData id;

private JobInfoData jobInfo;

private Map<String, TaskResultData> allResults;

private Map<String, TaskResultData> preciousResults;

private Map<String, TaskResultData> exceptionResults;

public JobIdData getId() {
return id;
}
Expand All @@ -64,8 +70,32 @@ public void setAllResults(Map<String, TaskResultData> allResults) {
this.allResults = allResults;
}

public JobInfoData getJobInfo() {
return jobInfo;
}

public void setJobInfo(JobInfoData jobInfo) {
this.jobInfo = jobInfo;
}

public Map<String, TaskResultData> getPreciousResults() {
return preciousResults;
}

public void setPreciousResults(Map<String, TaskResultData> preciousResults) {
this.preciousResults = preciousResults;
}

public Map<String, TaskResultData> getExceptionResults() {
return exceptionResults;
}

public void setExceptionResults(Map<String, TaskResultData> exceptionResults) {
this.exceptionResults = exceptionResults;
}

@Override
public String toString() {
return "JobResultData{" + "id=" + id + ", allResults=" + allResults + '}';
return "JobResultData{" + "id=" + id + ", allResults=" + allResults + ", preciousResults=" + preciousResults + ", exceptionResults=" + exceptionResults + ", jobInfo=" + jobInfo + '}';
}
}
@@ -0,0 +1,66 @@
/*
* *
* ProActive Parallel Suite(TM): The Java(TM) library for
* Parallel, Distributed, Multi-Core Computing for
* Enterprise Grids & Clouds
*
* Copyright (C) 1997-2015 INRIA/University of
* Nice-Sophia Antipolis/ActiveEon
* Contact: proactive@ow2.org or contact@activeeon.com
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License
* as published by the Free Software Foundation; version 3 of
* the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA
*
* If needed, contact us to obtain a release under GPL Version 2 or 3
* or a different license than the AGPL.
*
* Initial developer(s): The ProActive Team
* http://proactive.inria.fr/team_members.htm
* Contributor(s):
*
* * $$ACTIVEEON_INITIAL_DEV$$
*/
package org.ow2.proactive_grid_cloud_portal.scheduler.dto;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class TaskLogsData {

private String stdoutLogs;
private String stderrLogs;

public String getStdoutLogs() {
return stdoutLogs;
}

public void setStdoutLogs(String stdoutLogs) {
this.stdoutLogs = stdoutLogs;
}

public String getStderrLogs() {
return stderrLogs;
}

public void setStderrLogs(String stderrLogs) {
this.stderrLogs = stderrLogs;
}


@Override
public String toString() {
return "TaskLogsData{" + "stdoutLogs=" + stdoutLogs + ", stdoutLogs=" + stderrLogs + '}';
}
}
Expand Up @@ -46,10 +46,19 @@
public class TaskResultData {

private TaskIdData id;

private byte[] serializedValue;

private byte[] serializedException;

private String exceptionMessage;

private Map<String, String> metadata;

private Map<String, byte[]> propagatedVariables;

private TaskLogsData output;

public TaskIdData getId() {
return id;
}
Expand All @@ -66,6 +75,14 @@ public void setSerializedValue(byte[] serializedValue) {
this.serializedValue = serializedValue;
}

public byte[] getSerializedException() {
return serializedException;
}

public void setSerializedException(byte[] serializedException) {
this.serializedException = serializedException;
}

public Map<String, String> getMetadata() {
return metadata;
}
Expand All @@ -74,8 +91,32 @@ public void setMetadata(Map<String, String> metadata) {
this.metadata = metadata;
}

public String getExceptionMessage() {
return exceptionMessage;
}

public void setExceptionMessage(String exceptionMessage) {
this.exceptionMessage = exceptionMessage;
}

public Map<String, byte[]> getPropagatedVariables() {
return propagatedVariables;
}

public void setPropagatedVariables(Map<String, byte[]> propagatedVariables) {
this.propagatedVariables = propagatedVariables;
}

public TaskLogsData getOutput() {
return output;
}

public void setOutput(TaskLogsData output) {
this.output = output;
}

@Override
public String toString() {
return "TaskResultData{" + "id=" + id + ", serializedValue=" + Arrays.toString(serializedValue) + ", metadata=" + metadata + '}';
return "TaskResultData{" + "id=" + id + ", serializedValue=" + Arrays.toString(serializedValue) + ", serializedException=" + Arrays.toString(serializedException) + ", exception=" + exceptionMessage + ", metadata=" + metadata + ", output=" + output + '}';
}
}
@@ -0,0 +1,42 @@
/*
* *
* ProActive Parallel Suite(TM): The Java(TM) library for
* Parallel, Distributed, Multi-Core Computing for
* Enterprise Grids & Clouds
*
* Copyright (C) 1997-2015 INRIA/University of
* Nice-Sophia Antipolis/ActiveEon
* Contact: proactive@ow2.org or contact@activeeon.com
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License
* as published by the Free Software Foundation; version 3 of
* the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA
*
* If needed, contact us to obtain a release under GPL Version 2 or 3
* or a different license than the AGPL.
*
* Initial developer(s): The ProActive Team
* http://proactive.inria.fr/team_members.htm
* Contributor(s):
*
* * $$ACTIVEEON_INITIAL_DEV$$
*/
package org.ow2.proactive_grid_cloud_portal.scheduler.exception;

public class TaskRestException extends RestException {

public TaskRestException(String message) {
super(message);
}
}
Expand Up @@ -34,8 +34,6 @@
*/
package org.ow2.proactive.scheduler.rest;

import java.util.List;

import org.ow2.proactive.scheduler.common.SchedulerEvent;
import org.ow2.proactive.scheduler.common.SchedulerEventListener;
import org.ow2.proactive.scheduler.common.SchedulerState;
Expand Down Expand Up @@ -63,11 +61,6 @@ public boolean changePolicy(String arg0) throws NotConnectedException, Permissio
throw newUnsupportedOperationException();
}

@Override
public List<String> getGlobalSpaceURIs() throws NotConnectedException, PermissionException {
throw newUnsupportedOperationException();
}

@Override
public SchedulerState getState() throws NotConnectedException, PermissionException {
throw newUnsupportedOperationException();
Expand All @@ -90,18 +83,6 @@ public TaskResult getTaskResultFromIncarnation(String arg0, String arg1, int arg
throw newUnsupportedOperationException();
}

@Override
public boolean killTask(JobId arg0, String arg1) throws NotConnectedException, UnknownJobException,
UnknownTaskException, PermissionException {
throw new UnsupportedOperationException();
}

@Override
public boolean killTask(String arg0, String arg1) throws NotConnectedException, UnknownJobException,
UnknownTaskException, PermissionException {
throw new UnsupportedOperationException();
}

@Override
public void listenJobLogs(JobId arg0, AppenderProvider arg1) throws NotConnectedException,
UnknownJobException, PermissionException {
Expand Down

0 comments on commit 3109091

Please sign in to comment.