/*
* ProActive Parallel Suite(TM):
* The Open Source library for parallel and distributed
* Workflows & Scheduling, Orchestration, Cloud Automation
* and Big Data Analysis on Enterprise Grids & Clouds.
*
* Copyright (c) 2007 - 2017 ActiveEon
* Contact: 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 program 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 program. If not, see <http://www.gnu.org/licenses/>.
*
* If needed, contact us to obtain a release under GPL Version 2 or 3
* or a different license than the AGPL.
*/
package functionaltests;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.ow2.proactive.scheduler.common.Scheduler;
import org.ow2.proactive.scheduler.common.SchedulerState;
import org.ow2.proactive.scheduler.common.job.JobId;
import org.ow2.proactive.scheduler.common.job.JobState;
import org.ow2.proactive.scheduler.common.job.JobStatus;
import org.ow2.proactive.scheduler.common.task.TaskState;
import org.ow2.proactive_grid_cloud_portal.scheduler.WorkflowSubmitter;
/**
* Created by the activeeon team.
*/
public class RestSchedulerTagTest extends AbstractRestFuncTestCase {
private static Scheduler scheduler;
private static JobId submittedJobId = null;
@BeforeClass
public static void beforeClass() throws Exception {
System.out.println(Thread.currentThread().getStackTrace());
System.out.println("Initialize Test Class: " + RestSchedulerTagTest.class.toString());
init();
System.out.println("Finished Initialize Test Class: " + RestSchedulerTagTest.class.toString());
}
@Before
public void submitWorkflowWhichIsUSedByAllTestCasesOnce() throws Exception {
if (submittedJobId == null) {
System.out.println("Setup - no jobId found: Remove all jobs from scheduler");
scheduler = RestFuncTHelper.getScheduler();
SchedulerState state = scheduler.getState();
List<JobState> jobStates = new ArrayList<>();
jobStates.addAll(state.getPendingJobs());
jobStates.addAll(state.getRunningJobs());
jobStates.addAll(state.getFinishedJobs());
for (JobState jobState : jobStates) {
JobId jobId = jobState.getId();
scheduler.killJob(jobId);
scheduler.removeJob(jobId);
}
System.out.println("Scheduler was cleaned.");
System.out.println("Submit job for test cases.");
//submit a job with a loop and out and err outputs
System.out.println("submit a job with loop, out and err outputs");
submittedJobId = submitJob("flow_loop_out.xml");
}
System.out.println("Finished setup test case.");
}
private JobId submitJob(String filename) throws Exception {
File jobFile = new File(this.getClass().getResource("config/" + filename).toURI());
WorkflowSubmitter submitter = new WorkflowSubmitter(scheduler);
JobId id = submitter.submit(jobFile, new HashMap<String, String>());
waitJobState(id, JobStatus.FINISHED, 500000);
return id;
}
private HttpResponse sendRequest(String url) throws Exception {
String schedulerUrl = getResourceUrl(url);
HttpGet httpGet = new HttpGet(schedulerUrl);
setSessionHeader(httpGet);
HttpResponse response = executeUriRequest(httpGet);
assertHttpStatusOK(response);
return response;
}
@Test
public void testTaskIdsByTag() throws Exception {
HttpResponse response = sendRequest("jobs/" + submittedJobId + "/tasks/tag/LOOP-T2-1");
JSONObject jsonObject = toJsonObject(response);
JSONArray taskIds = (JSONArray) jsonObject.get("list");
System.out.println(jsonObject.toJSONString());
assertTrue(taskIds.contains("T1#1"));
assertTrue(taskIds.contains("Print1#1"));
assertTrue(taskIds.contains("Print2#1"));
assertTrue(taskIds.contains("T2#1"));
assertEquals("4", jsonObject.get("size").toString());
}
@Test
public void testTaskIdsByUnknownTag() throws Exception {
HttpResponse response = sendRequest("jobs/" + submittedJobId + "/tasks/tag/unknownTag");
JSONObject jsonObject = toJsonObject(response);
System.out.println(jsonObject.toJSONString());
assertEquals("0", jsonObject.get("size").toString());
}
@Test
public void testTaskStatesByTag() throws Exception {
HttpResponse response = sendRequest("jobs/" + submittedJobId + "/taskstates/LOOP-T2-1");
JSONObject jsonObject = toJsonObject(response);
System.out.println(jsonObject.toJSONString());
assertEquals("4", jsonObject.get("size").toString());
}
@Test
public void testTaskStatesByUnknownTag() throws Exception {
HttpResponse response = sendRequest("jobs/" + submittedJobId + "/taskstates/unknownTag");
JSONObject jsonObject = toJsonObject(response);
System.out.println(jsonObject.toJSONString());
assertEquals("0", jsonObject.get("size").toString());
}
@Test
public void testTaskLogAllByTag() throws Exception {
HttpResponse response = sendRequest("jobs/" + submittedJobId + "/tasks/tag/LOOP-T2-1/result/log/all");
String responseContent = getContent(response);
System.out.println(responseContent);
assertEquals(2, StringUtils.countMatches(responseContent, "Task 1 : Test STDERR"));
assertEquals(2, StringUtils.countMatches(responseContent, "Task 1 : Test STDOUT"));
assertEquals(2, StringUtils.countMatches(responseContent, "Terminate task number 1"));
}
@Test
public void testTaskLogAllByUnknownTag() throws Exception {
HttpResponse response = sendRequest("jobs/" + submittedJobId + "/tasks/tag/unknownTag/result/log/all");
String responseContent = getContent(response);
assertEquals("", responseContent);
}
@Test
public void testTaskLogErrByTag() throws Exception {
HttpResponse response = sendRequest("jobs/" + submittedJobId + "/tasks/tag/LOOP-T2-1/result/log/err");
String responseContent = getContent(response);
System.out.println(responseContent);
assertEquals(2, StringUtils.countMatches(responseContent, "Task 1 : Test STDERR"));
}
@Test
public void testTaskLogErrByUnknownTag() throws Exception {
HttpResponse response = sendRequest("jobs/" + submittedJobId + "/tasks/tag/unknownTag/result/log/err");
String responseContent = getContent(response);
assertEquals("", responseContent);
}
@Test
public void testTaskLogOutByTag() throws Exception {
HttpResponse response = sendRequest("jobs/" + submittedJobId + "/tasks/tag/LOOP-T2-1/result/log/out");
String responseContent = getContent(response);
System.out.println(responseContent);
assertEquals(2, StringUtils.countMatches(responseContent, "Task 1 : Test STDOUT"));
assertEquals(2, StringUtils.countMatches(responseContent, "Terminate task number 1"));
}
@Test
public void testTaskLogOutByUnknownTag() throws Exception {
HttpResponse response = sendRequest("jobs/" + submittedJobId + "/tasks/tag/unknownTag/result/log/all");
String responseContent = getContent(response);
assertEquals("", responseContent);
}
@Test
public void testTaskLogServerByTag() throws Exception {
HttpResponse response = sendRequest("jobs/" + submittedJobId + "/tasks/tag/LOOP-T2-1/log/server");
String responseContent = getContent(response);
for (TaskState state : scheduler.getJobState(submittedJobId).getTasksByTag("LOOP-T2-1")) {
assertTrue(responseContent.contains("Task " + state.getId() + " logs"));
}
}
@Test
public void testTaskLogSeverByUnknownTag() throws Exception {
HttpResponse response = sendRequest("jobs/" + submittedJobId + "/tasks/tag/unknownTag/log/server");
String responseContent = getContent(response);
assertTrue(!responseContent.contains("TaskLogger"));
}
//FIXME
@Test
public void testTaskResultByTag() throws Exception {
HttpResponse response = sendRequest("jobs/" + submittedJobId + "/tasks/tag/LOOP-T2-1/result");
JSONArray jsonArray = toJsonArray(response);
System.out.println(jsonArray.toJSONString());
ArrayList<String> taskNames = new ArrayList<>(4);
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject id = (JSONObject) ((JSONObject) jsonArray.get(i)).get("id");
String name = (String) id.get("readableName");
taskNames.add(name);
}
assertTrue(taskNames.contains("T1#1"));
assertTrue(taskNames.contains("Print1#1"));
assertTrue(taskNames.contains("Print2#1"));
assertTrue(taskNames.contains("T2#1"));
assertEquals(4, jsonArray.size());
}
@Test
public void testTaskResultByUnknownTag() throws Exception {
HttpResponse response = sendRequest("jobs/" + submittedJobId + "/tasks/tag/unknownTag/result");
JSONArray jsonArray = toJsonArray(response);
System.out.println(jsonArray.toJSONString());
assertEquals(0, jsonArray.size());
}
@Test
public void testTaskResultValueByTag() throws Exception {
HttpResponse response = sendRequest("jobs/" + submittedJobId + "/tasks/tag/LOOP-T2-1/result/value");
JSONObject jsonObject = toJsonObject(response);
System.out.println(jsonObject.toJSONString());
assertTrue(jsonObject.containsKey("T1#1"));
assertTrue(jsonObject.containsKey("Print1#1"));
assertTrue(jsonObject.containsKey("Print2#1"));
assertTrue(jsonObject.containsKey("T2#1"));
assertEquals(4, jsonObject.size());
}
@Test
public void testTaskResultValueByUnknownTag() throws Exception {
HttpResponse response = sendRequest("jobs/" + submittedJobId + "/tasks/tag/unknownTag/result/value");
JSONObject jsonObject = toJsonObject(response);
System.out.println(jsonObject.toJSONString());
assertEquals(0, jsonObject.size());
}
@Test
public void testTaskResultSerializedvalueByTag() throws Exception {
HttpResponse response = sendRequest("jobs/" + submittedJobId + "/tasks/tag/LOOP-T2-1/result/serializedvalue");
JSONObject jsonObject = toJsonObject(response);
System.out.println(jsonObject.toJSONString());
assertTrue(jsonObject.containsKey("T1#1"));
assertTrue(jsonObject.containsKey("Print1#1"));
assertTrue(jsonObject.containsKey("Print2#1"));
assertTrue(jsonObject.containsKey("T2#1"));
assertEquals(4, jsonObject.size());
}
@Test
public void testTaskResultSerializedvalueByUnknownTag() throws Exception {
HttpResponse response = sendRequest("jobs/" + submittedJobId + "/tasks/tag/unknownTag/result/serializedvalue");
JSONObject jsonObject = toJsonObject(response);
System.out.println(jsonObject.toJSONString());
assertEquals(0, jsonObject.size());
}
@Test
public void testJobTags() throws Exception {
HttpResponse response = sendRequest("jobs/" + submittedJobId + "/tasks/tags");
JSONArray jsonArray = toJsonArray(response);
System.out.println(jsonArray.toJSONString());
assertTrue(jsonArray.contains("LOOP-T2-1"));
assertTrue(jsonArray.contains("LOOP-T2-2"));
assertTrue(jsonArray.contains("LOOP-T2-3"));
assertTrue(jsonArray.contains("REPLICATE-T3-1"));
assertTrue(jsonArray.contains("REPLICATE-T3-2"));
assertEquals(5, jsonArray.size());
}
@Test
public void testJobTagsPrefix() throws Exception {
HttpResponse response = sendRequest("jobs/" + submittedJobId + "/tasks/tags/startsWith/LOOP");
JSONArray jsonArray = toJsonArray(response);
System.out.println(jsonArray.toJSONString());
assertTrue(jsonArray.contains("LOOP-T2-1"));
assertTrue(jsonArray.contains("LOOP-T2-2"));
assertTrue(jsonArray.contains("LOOP-T2-3"));
assertEquals(3, jsonArray.size());
}
@Test
public void testJobTagsBadPrefix() throws Exception {
HttpResponse response = sendRequest("jobs/" + submittedJobId + "/tasks/tags/startsWith/blabla");
JSONArray jsonArray = toJsonArray(response);
System.out.println(jsonArray.toJSONString());
assertEquals(0, jsonArray.size());
}
}