package org.ourgrid.acceptance.util.broker;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.easymock.classextension.EasyMock;
import org.ourgrid.acceptance.util.BrokerAcceptanceUtil;
import org.ourgrid.broker.BrokerConfiguration;
import org.ourgrid.broker.BrokerServerModule;
import org.ourgrid.broker.business.dao.BrokerDAOFactory;
import org.ourgrid.broker.business.scheduler.SchedulerIF;
import org.ourgrid.broker.business.scheduler.workqueue.JobInfo;
import org.ourgrid.broker.business.scheduler.workqueue.WorkQueueExecutionController;
import org.ourgrid.broker.communication.sender.BrokerResponseControl;
import org.ourgrid.common.interfaces.LocalWorkerProvider;
import org.ourgrid.common.interfaces.Worker;
import org.ourgrid.common.interfaces.WorkerClient;
import org.ourgrid.common.interfaces.to.GridProcessHandle;
import org.ourgrid.common.interfaces.to.RequestSpecification;
import org.ourgrid.common.internal.IResponseTO;
import org.ourgrid.common.job.Job;
import br.edu.ufcg.lsd.commune.container.ObjectDeployment;
import br.edu.ufcg.lsd.commune.container.logging.CommuneLogger;
import br.edu.ufcg.lsd.commune.context.ModuleContext;
import br.edu.ufcg.lsd.commune.testinfra.util.TestStub;
public class Req_329_Util extends BrokerAcceptanceUtil {
private int maxReplicas = 1;
public Req_329_Util(ModuleContext context) {
super(context);
maxReplicas = context.parseIntegerProperty(BrokerConfiguration.PROP_MAX_REPLICAS);
}
public List<Long> doSchedule(BrokerServerModule component, List<TestStub> workerTestStubs, List<TestStub> peerStubs, List<TestJob> testJobs,
List<GridProcessHandle> replicaHandles) {
CommuneLogger newLogger = component.getLogger();
component.setLogger(newLogger);
WorkerClient workerClient = getWorkerClient(component);
List<Long> requests = new ArrayList<Long>();
int handleIndex = 0;
Iterator<TestStub> itWorkers = workerTestStubs.iterator();
EasyMock.reset(newLogger);
for (TestStub peerStub : peerStubs) {
LocalWorkerProvider lwp = (LocalWorkerProvider) peerStub.getObject();
EasyMock.reset(lwp);
}
for (TestJob testJob : testJobs) {
testJob.setJob(JobInfo.getInstance().getJob(testJob.getJob().getJobId()));
for (TestStub peerStub : peerStubs) {
LocalWorkerProvider lwp = (LocalWorkerProvider) peerStub.getObject();
RequestSpecification requestByPeer = testJob.getRequestByPeer(application, lwp);
if (requestByPeer != null) {
long requestID = requestByPeer.getRequestId();
requests.add(requestID);
Job job = testJob.getJob();
if (!isJobSatisfied(job, context)) {
for (int i = 0; i < maxReplicas; i++) {
if (itWorkers.hasNext()) {
TestStub testStub = itWorkers.next();
Worker worker = (Worker) testStub.getObject();
EasyMock.reset(worker);
newLogger.debug("Executing replica: " + replicaHandles.get(handleIndex) + ", Worker: " + testStub.getDeploymentID());
worker.startWork(workerClient, requestID, replicaHandles.get(handleIndex));
EasyMock.replay(worker);
handleIndex++;
}
}
}
lwp.pauseRequest(requestID);
}
}
}
EasyMock.replay(newLogger);
for (Iterator<TestStub> iterator2 = peerStubs.iterator(); iterator2.hasNext();) {
TestStub peerStub = (TestStub) iterator2.next();
LocalWorkerProvider lwp = (LocalWorkerProvider) peerStub.getObject();
EasyMock.replay(lwp);
}
Set<SchedulerIF> schedulers = BrokerDAOFactory.getInstance().getJobDAO().getSchedulers();
List<IResponseTO> responses = new ArrayList<IResponseTO>();
for (SchedulerIF schedulerIF : schedulers) {
schedulerIF.schedule(responses);
}
/* ObjectDeployment od = getBrokerControlDeployment(component);
CommandExecutor.getInstance().execute(outputCommands, component.createServiceManager(od));*/
ObjectDeployment od = getBrokerControlDeployment(component);
BrokerResponseControl.getInstance().execute(responses, component.createServiceManager(od));
for (Iterator<TestStub> iterator2 = peerStubs.iterator(); iterator2.hasNext();) {
TestStub peerStub = (TestStub) iterator2.next();
LocalWorkerProvider lwp = (LocalWorkerProvider) peerStub.getObject();
EasyMock.verify(lwp);
}
for(TestStub testStub: workerTestStubs){
Worker worker = (Worker) testStub.getObject();
EasyMock.verify(newLogger);
EasyMock.verify(worker);
}
return requests;
}
public long doSchedule(BrokerServerModule component, List<TestStub> workerTestStubs, TestStub peerStub, TestJob testJob,
GridProcessHandle replicaHandle) {
List<TestJob> jobs = new ArrayList<TestJob>();
jobs.add(testJob);
List<GridProcessHandle> handles = new ArrayList<GridProcessHandle>();
handles.add(replicaHandle);
List<TestStub> peerStubs = new ArrayList<TestStub>();
peerStubs.add(peerStub);
List<Long> requests = doSchedule(component, workerTestStubs, peerStubs, jobs, handles);
long requestID = 0;
if (requests != null && !requests.isEmpty()) {
requestID = requests.get(0);
}
return requestID;
}
private boolean isJobSatisfied(Job job, ModuleContext context) {
String replicas = context.getProperty(BrokerConfiguration.PROP_MAX_REPLICAS);
String fails = context.getProperty(BrokerConfiguration.PROP_MAX_FAILS);
String blFails = context.getProperty(BrokerConfiguration.PROP_MAX_BL_FAILS);
WorkQueueExecutionController heuristic = new WorkQueueExecutionController(
Integer.valueOf(replicas), Integer.valueOf(fails), Integer.valueOf(blFails));
return heuristic.isJobSatisfied(job);
}
}