/* * 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 org.ow2.proactive.scheduler.core.db.schedulerdb; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import org.junit.Assert; import org.junit.Test; import org.ow2.proactive.db.SortOrder; import org.ow2.proactive.db.SortParameter; import org.ow2.proactive.scheduler.common.JobSortParameter; import org.ow2.proactive.scheduler.common.job.JobInfo; import org.ow2.proactive.scheduler.common.job.JobPriority; import org.ow2.proactive.scheduler.common.job.JobStatus; import org.ow2.proactive.scheduler.common.job.TaskFlowJob; import org.ow2.proactive.scheduler.common.task.JavaTask; import org.ow2.proactive.scheduler.common.task.TaskId; import org.ow2.proactive.scheduler.job.InternalJob; import org.ow2.proactive.scheduler.task.TaskResultImpl; import org.ow2.proactive.scheduler.task.internal.InternalTask; public class TestLoadJobsPagination extends BaseSchedulerDBTest { private TaskFlowJob createJob() throws Exception { TaskFlowJob job = new TaskFlowJob(); job.setName(this.getClass().getSimpleName()); job.setDescription("TestLoadJobsPagination desc"); JavaTask task = new JavaTask(); task.setExecutableClassName("className"); job.addTask(task); return job; } private TaskFlowJob createJob(String name, JobPriority priority) throws Exception { TaskFlowJob job = new TaskFlowJob(); job.setName(name); job.setPriority(priority); JavaTask task = new JavaTask(); task.setExecutableClassName("className"); job.addTask(task); return job; } @Test public void testSorting() throws Exception { InternalJob job1 = defaultSubmitJob(createJob("A", JobPriority.IDLE), "user_a"); // 1 defaultSubmitJob(createJob("B", JobPriority.LOWEST), "user_b"); // 2 InternalJob job3 = defaultSubmitJob(createJob("C", JobPriority.LOW), "user_c"); // 3 defaultSubmitJob(createJob("A", JobPriority.NORMAL), "user_d"); // 4 InternalJob job5 = defaultSubmitJob(createJob("B", JobPriority.HIGH), "user_e"); // 5 defaultSubmitJob(createJob("C", JobPriority.HIGHEST), "user_f"); // 6 // change status for some jobs job1.failed(null, JobStatus.KILLED); dbManager.updateAfterJobKilled(job1, Collections.<TaskId> emptySet()); job3.setPaused(); dbManager.updateJobAndTasksState(job3); job5.start(); InternalTask taskJob5 = startTask(job5, job5.getITasks().get(0)); dbManager.jobTaskStarted(job5, taskJob5, true); List<JobInfo> jobs; jobs = dbManager.getJobs(0, 10, null, true, true, true, sortParameters(new SortParameter<>(JobSortParameter.ID, SortOrder.ASC))) .getList(); checkJobs(jobs, 1, 2, 3, 4, 5, 6); jobs = dbManager.getJobs(0, 10, null, true, true, true, sortParameters(new SortParameter<>(JobSortParameter.ID, SortOrder.DESC))) .getList(); checkJobs(jobs, 6, 5, 4, 3, 2, 1); jobs = dbManager.getJobs(0, 10, null, true, true, true, sortParameters(new SortParameter<>(JobSortParameter.NAME, SortOrder.ASC), new SortParameter<>(JobSortParameter.ID, SortOrder.ASC))) .getList(); checkJobs(jobs, 1, 4, 2, 5, 3, 6); jobs = dbManager.getJobs(0, 10, null, true, true, true, sortParameters(new SortParameter<>(JobSortParameter.NAME, SortOrder.ASC), new SortParameter<>(JobSortParameter.ID, SortOrder.DESC))) .getList(); checkJobs(jobs, 4, 1, 5, 2, 6, 3); jobs = dbManager.getJobs(0, 10, null, true, true, true, sortParameters(new SortParameter<>(JobSortParameter.OWNER, SortOrder.ASC))) .getList(); checkJobs(jobs, 1, 2, 3, 4, 5, 6); jobs = dbManager.getJobs(0, 10, null, true, true, true, sortParameters(new SortParameter<>(JobSortParameter.OWNER, SortOrder.DESC))) .getList(); checkJobs(jobs, 6, 5, 4, 3, 2, 1); jobs = dbManager.getJobs(0, 10, null, true, true, true, sortParameters(new SortParameter<>(JobSortParameter.PRIORITY, SortOrder.ASC))) .getList(); checkJobs(jobs, 1, 2, 3, 4, 5, 6); jobs = dbManager.getJobs(0, 10, null, true, true, true, sortParameters(new SortParameter<>(JobSortParameter.PRIORITY, SortOrder.DESC))) .getList(); checkJobs(jobs, 6, 5, 4, 3, 2, 1); jobs = dbManager.getJobs(0, 10, null, true, true, true, sortParameters(new SortParameter<>(JobSortParameter.STATE, SortOrder.ASC), new SortParameter<>(JobSortParameter.ID, SortOrder.ASC))) .getList(); checkJobs(jobs, 2, 4, 6, 3, 5, 1); jobs = dbManager.getJobs(0, 10, null, true, true, true, sortParameters(new SortParameter<>(JobSortParameter.STATE, SortOrder.DESC), new SortParameter<>(JobSortParameter.ID, SortOrder.ASC))) .getList(); checkJobs(jobs, 1, 3, 5, 2, 4, 6); } @Test public void testPagingAndFilteting() throws Exception { InternalJob job; InternalTask task; // pending job - 1 defaultSubmitJob(createJob()); // job for user1 - 2 defaultSubmitJob(createJob(), "user1"); // running job - 3 job = defaultSubmitJob(createJob()); job.start(); task = startTask(job, job.getITasks().get(0)); dbManager.jobTaskStarted(job, task, true); // killed job - 4 job = defaultSubmitJob(createJob()); job.failed(null, JobStatus.KILLED); dbManager.updateAfterJobKilled(job, Collections.<TaskId> emptySet()); // job for user2 - 5 defaultSubmitJob(createJob(), "user2"); // finished job - 6 job = defaultSubmitJob(createJob()); job.start(); task = startTask(job, job.getITasks().get(0)); dbManager.jobTaskStarted(job, task, true); TaskResultImpl result = new TaskResultImpl(null, new TestResult(0, "result"), null, 0); job.terminateTask(false, task.getId(), null, null, result); job.terminate(); dbManager.updateAfterTaskFinished(job, task, new TaskResultImpl(null, new TestResult(0, "result"), null, 0)); // canceled job - 7 job = defaultSubmitJob(createJob()); job.failed(job.getITasks().get(0).getId(), JobStatus.CANCELED); dbManager.updateAfterJobKilled(job, Collections.<TaskId> emptySet()); // job marked as removed, method 'getJobs' shouldn't return it job = defaultSubmitJob(createJob()); dbManager.removeJob(job.getId(), System.currentTimeMillis(), false); List<JobInfo> jobs; List<SortParameter<JobSortParameter>> sortParameters = new ArrayList<>(); sortParameters.add(new SortParameter<>(JobSortParameter.ID, SortOrder.ASC)); jobs = dbManager.getJobs(5, 1, null, true, true, true, sortParameters).getList(); JobInfo jobInfo = jobs.get(0); Assert.assertEquals("6", jobInfo.getJobId().value()); Assert.assertEquals(JobStatus.FINISHED, jobInfo.getStatus()); Assert.assertEquals("TestLoadJobsPagination", jobInfo.getJobId().getReadableName()); Assert.assertEquals(1, jobInfo.getTotalNumberOfTasks()); Assert.assertEquals(1, jobInfo.getNumberOfFinishedTasks()); Assert.assertEquals(0, jobInfo.getNumberOfRunningTasks()); Assert.assertEquals(0, jobInfo.getNumberOfPendingTasks()); Assert.assertEquals(JobPriority.NORMAL, jobInfo.getPriority()); Assert.assertEquals(DEFAULT_USER_NAME, jobInfo.getJobOwner()); jobs = dbManager.getJobs(0, 10, null, true, true, true, sortParameters).getList(); checkJobs(jobs, 1, 2, 3, 4, 5, 6, 7); jobs = dbManager.getJobs(-1, -1, null, true, true, true, sortParameters).getList(); checkJobs(jobs, 1, 2, 3, 4, 5, 6, 7); jobs = dbManager.getJobs(-1, 5, null, true, true, true, sortParameters).getList(); checkJobs(jobs, 1, 2, 3, 4, 5); jobs = dbManager.getJobs(2, -1, null, true, true, true, sortParameters).getList(); checkJobs(jobs, 3, 4, 5, 6, 7); jobs = dbManager.getJobs(0, 0, null, true, true, true, sortParameters).getList(); checkJobs(jobs, 1, 2, 3, 4, 5, 6, 7); jobs = dbManager.getJobs(0, 1, null, true, true, true, sortParameters).getList(); checkJobs(jobs, 1); jobs = dbManager.getJobs(0, 3, null, true, true, true, sortParameters).getList(); checkJobs(jobs, 1, 2, 3); jobs = dbManager.getJobs(1, 10, null, true, true, true, sortParameters).getList(); checkJobs(jobs, 2, 3, 4, 5, 6, 7); jobs = dbManager.getJobs(5, 10, null, true, true, true, sortParameters).getList(); checkJobs(jobs, 6, 7); jobs = dbManager.getJobs(6, 10, null, true, true, true, sortParameters).getList(); checkJobs(jobs, 7); jobs = dbManager.getJobs(7, 10, null, true, true, true, sortParameters).getList(); checkJobs(jobs); jobs = dbManager.getJobs(0, 10, DEFAULT_USER_NAME, true, true, true, sortParameters).getList(); checkJobs(jobs, 1, 3, 4, 6, 7); jobs = dbManager.getJobs(0, 10, "user1", true, true, true, sortParameters).getList(); checkJobs(jobs, 2); jobs = dbManager.getJobs(0, 10, DEFAULT_USER_NAME, true, false, false, sortParameters).getList(); checkJobs(jobs, 1); jobs = dbManager.getJobs(0, 10, DEFAULT_USER_NAME, false, true, false, sortParameters).getList(); checkJobs(jobs, 3); jobs = dbManager.getJobs(0, 10, DEFAULT_USER_NAME, false, false, true, sortParameters).getList(); checkJobs(jobs, 4, 6, 7); jobs = dbManager.getJobs(0, 10, DEFAULT_USER_NAME, false, true, true, sortParameters).getList(); checkJobs(jobs, 3, 4, 6, 7); jobs = dbManager.getJobs(0, 10, DEFAULT_USER_NAME, true, false, true, sortParameters).getList(); checkJobs(jobs, 1, 4, 6, 7); jobs = dbManager.getJobs(0, 10, DEFAULT_USER_NAME, true, true, false, sortParameters).getList(); checkJobs(jobs, 1, 3); jobs = dbManager.getJobs(0, 10, DEFAULT_USER_NAME, false, false, false, sortParameters).getList(); checkJobs(jobs); } private List<SortParameter<JobSortParameter>> sortParameters(SortParameter<JobSortParameter>... params) { return Arrays.asList(params); } private void checkJobs(List<JobInfo> jobs, Integer... expectedIds) { List<Integer> ids = new ArrayList<>(); for (JobInfo job : jobs) { ids.add(Integer.valueOf(job.getJobId().value())); } Assert.assertEquals(Arrays.asList(expectedIds), ids); } }