/*
* 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;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import java.io.IOException;
import java.util.HashMap;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.ow2.proactive.scheduler.common.job.JobId;
import org.ow2.proactive.scheduler.common.job.JobPriority;
import org.ow2.proactive.scheduler.common.task.OnTaskError;
import org.ow2.proactive.scheduler.common.task.TaskId;
import org.ow2.proactive.scheduler.common.task.TaskStatus;
import org.ow2.proactive.scheduler.core.rmproxies.RMProxiesManager;
import org.ow2.proactive.scheduler.core.rmproxies.RMProxy;
import org.ow2.proactive.scheduler.core.rmproxies.RMProxyCreationException;
import org.ow2.proactive.scheduler.job.InternalJob;
import org.ow2.proactive.scheduler.job.InternalTaskFlowJob;
import org.ow2.proactive.scheduler.job.JobIdImpl;
import org.ow2.proactive.scheduler.task.TaskIdImpl;
import org.ow2.proactive.scheduler.task.TaskLauncher;
import org.ow2.proactive.scheduler.task.internal.ExecuterInformation;
import org.ow2.proactive.scheduler.task.internal.InternalScriptTask;
import org.ow2.proactive.scheduler.task.internal.InternalTask;
import org.ow2.proactive.scheduler.task.utils.VariablesMap;
import org.ow2.proactive.scheduler.util.TaskLogger;
import org.ow2.proactive.utils.NodeSet;
public class TerminationDataTest {
private TerminationData terminationData;
@Mock
private SchedulingService service;
@Mock
private TaskLauncher launcher;
@Mock
private SchedulingInfrastructure schedulingInfrastructure;
@Mock
private RMProxiesManager proxiesManager;
@Mock
private RMProxy rmProxy;
@Before
public void init() throws RMProxyCreationException {
MockitoAnnotations.initMocks(this);
Mockito.when(service.getInfrastructure()).thenReturn(schedulingInfrastructure);
Mockito.when(schedulingInfrastructure.getRMProxiesManager()).thenReturn(proxiesManager);
Mockito.when(proxiesManager.getUserRMProxy("user", null)).thenReturn(rmProxy);
terminationData = TerminationData.newTerminationData();
}
@Test
public void testAddJobToTerminate() {
assertThat(terminationData.isEmpty(), is(true));
JobId jobId = new JobIdImpl(666, "readableName");
terminationData.addJobToTerminate(jobId);
assertThat(terminationData.isEmpty(), is(false));
assertThat(terminationData.jobTerminated(jobId), is(true));
}
@Test
public void testAddTaskData() {
assertThat(terminationData.isEmpty(), is(true));
InternalJob job = new InternalTaskFlowJob("test-name",
JobPriority.NORMAL,
OnTaskError.CANCEL_JOB,
"description");
JobId jobId = new JobIdImpl(666, "readableName");
InternalTask internalTask = new InternalScriptTask(job);
TaskId taskId = TaskIdImpl.createTaskId(jobId, "task-name", 777L);
internalTask.setId(taskId);
internalTask.setName("task-name");
internalTask.setStatus(TaskStatus.RUNNING);
internalTask.setExecuterInformation(Mockito.mock(ExecuterInformation.class));
RunningTaskData taskData = new RunningTaskData(internalTask, "user", null, null);
terminationData.addTaskData(null, taskData, true, null);
assertThat(terminationData.isEmpty(), is(false));
assertThat(terminationData.taskTerminated(jobId, "task-name"), is(true));
}
@Test
public void testAddRestartData() {
assertThat(terminationData.isEmpty(), is(true));
JobId jobId = new JobIdImpl(666, "readableName");
TaskId taskId = TaskIdImpl.createTaskId(jobId, "task-name", 777L);
terminationData.addRestartData(taskId, 1000L);
assertThat(terminationData.isEmpty(), is(false));
}
@Test
public void testHandleTerminationForJob() throws IOException, ClassNotFoundException {
JobId jobId = new JobIdImpl(666, "readableName");
terminationData.addJobToTerminate(jobId);
terminationData.handleTermination(service);
Mockito.verify(service, Mockito.times(1)).terminateJobHandling(jobId);
}
@Test
public void testHandleTerminationForTaskNotNormalTermination() throws IOException, ClassNotFoundException {
InternalJob job = new InternalTaskFlowJob("test-name",
JobPriority.NORMAL,
OnTaskError.CANCEL_JOB,
"description");
JobId jobId = new JobIdImpl(666, "readableName");
InternalTask internalTask = new InternalScriptTask(job);
TaskId taskId = TaskIdImpl.createTaskId(jobId, "task-name", 777L);
internalTask.setId(taskId);
internalTask.setName("task-name");
internalTask.setStatus(TaskStatus.RUNNING);
internalTask.setExecuterInformation(Mockito.mock(ExecuterInformation.class));
RunningTaskData taskData = new RunningTaskData(internalTask, "user", null, launcher);
terminationData.addTaskData(null, taskData, false, null);
terminationData.handleTermination(service);
Mockito.verify(launcher, Mockito.times(1)).kill();
}
@Test
public void testHandleTerminationForTaskNormalTermination()
throws RMProxyCreationException, IOException, ClassNotFoundException {
InternalJob job = new InternalTaskFlowJob("test-name",
JobPriority.NORMAL,
OnTaskError.CANCEL_JOB,
"description");
JobId jobId = new JobIdImpl(666, "readableName");
InternalTask internalTask = new InternalScriptTask(job);
TaskId taskId = TaskIdImpl.createTaskId(jobId, "task-name", 777L);
internalTask.setId(taskId);
internalTask.setName("task-name");
internalTask.setStatus(TaskStatus.RUNNING);
internalTask.setExecuterInformation(Mockito.mock(ExecuterInformation.class));
RunningTaskData taskData = new RunningTaskData(internalTask, "user", null, launcher);
terminationData.addTaskData(null, taskData, true, null);
terminationData.handleTermination(service);
Mockito.verify(proxiesManager, Mockito.times(1)).getUserRMProxy("user", null);
Mockito.verify(rmProxy, Mockito.times(1)).releaseNodes(org.mockito.Matchers.any(NodeSet.class),
org.mockito.Matchers.any(org.ow2.proactive.scripting.Script.class),
Mockito.any(VariablesMap.class),
Mockito.any(HashMap.class),
Mockito.any(TaskId.class));
}
@Test
public void testHandleTerminationForTaskToRestart()
throws RMProxyCreationException, IOException, ClassNotFoundException {
JobId jobId = new JobIdImpl(666, "readableName");
TaskId taskId = TaskIdImpl.createTaskId(jobId, "task-name", 777L);
terminationData.addRestartData(taskId, 1000L);
terminationData.handleTermination(service);
Mockito.verify(schedulingInfrastructure, Mockito.times(1)).schedule(org.mockito.Matchers.any(Runnable.class),
org.mockito.Matchers.anyLong());
}
}