package org.ourgrid.system;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.Collection;
import org.junit.Test;
import org.ourgrid.common.interfaces.status.ConsumerInfo;
import org.ourgrid.common.interfaces.status.LocalConsumerInfo;
import org.ourgrid.common.interfaces.status.RemoteWorkerInfo;
import org.ourgrid.common.interfaces.to.GridProcessState;
import org.ourgrid.common.interfaces.to.LocalWorkerState;
import org.ourgrid.common.interfaces.to.WorkerInfo;
import org.ourgrid.common.interfaces.to.WorkerStatus;
import org.ourgrid.peer.PeerConstants;
import org.ourgrid.system.condition.BrokerHasAPeerInTheState;
import org.ourgrid.system.condition.BrokerJobFinishedCondition;
import org.ourgrid.system.condition.BrokerJobRunningCondition;
import org.ourgrid.system.condition.DiscoveryServiceNumberOfPeersCondition;
import org.ourgrid.system.condition.PeerHasTheWorkerInStateCondition;
import org.ourgrid.system.condition.WorkerSetPeerCondition;
import org.ourgrid.system.condition.WorkerStatusCondition;
import org.ourgrid.system.units.BrokerUnit;
import org.ourgrid.system.units.DiscoveryServiceUnit;
import org.ourgrid.system.units.PeerUnit;
import org.ourgrid.system.units.UnitUtil;
import org.ourgrid.system.units.WorkerUnit;
import br.edu.ufcg.lsd.commune.identification.DeploymentID;
public class RemoteExecutionSystemTest extends AbstractSystemTest {
/**
* Test the execution of a simple job running on a remote worker. 2 peers
* (one local and one remote) 1 broker (connected to local peer) 1 worker
* (connected to the remote peer) 1 discovery service (that knows the 2
* peers) add job wait until the job finishes and the remote worker becomes
* idle
*/
@Test
public void testSimpleRemoteExecution() throws Exception {
DiscoveryServiceUnit dsUnit = unitManager.buildNewUnit( DiscoveryServiceUnit.class );
BrokerUnit brokerUnit = unitManager.buildNewUnit( BrokerUnit.class );
PeerUnit localPeerUnit = unitManager.buildNewUnit( PeerUnit.class );
localPeerUnit.setDiscoveryService( dsUnit );
PeerUnit remotePeerUnit = unitManager.buildNewUnit( PeerUnit.class );
remotePeerUnit.setDiscoveryService( dsUnit );
WorkerUnit workerUnit = unitManager.buildNewUnit( WorkerUnit.class );
System.out.println( "===> Units created <===" );
dsUnit.initKeys();
brokerUnit.initKeys();
localPeerUnit.initKeys();
remotePeerUnit.initKeys();
workerUnit.initKeys();
System.out.println( "===> Units started <===" );
conditionExpecter.waitUntilConditionIsMet( new DiscoveryServiceNumberOfPeersCondition( dsUnit, 2 ) );
System.out.println( "===> Discovery Service knows 2 peers <===" );
// remotePeerUnit.setWorkers( workerUnit );
conditionExpecter.waitUntilConditionIsMet( new WorkerSetPeerCondition( workerUnit ) );
System.out.println( "===> Remote peer knows one worker <===" );
conditionExpecter.waitUntilConditionIsMet( new BrokerHasAPeerInTheState( brokerUnit, localPeerUnit, PeerTestState.UP ) );
System.out.println( "===> Broker knows the local peer <===" );
int jobid = brokerUnit.addJob( UnitUtil.buildASleepJob( 5 ) );
conditionExpecter.waitUntilConditionIsMet( new BrokerJobRunningCondition( brokerUnit, jobid ) );
localPeerUnit.showStatus();
conditionExpecter.waitUntilConditionIsMet( new BrokerJobFinishedCondition( brokerUnit, jobid ) );
assertEquals( GridProcessState.FINISHED, brokerUnit.getJob( jobid ).getState() );
System.out.println( "===> Job finished <===" );
conditionExpecter.waitUntilConditionIsMet( new WorkerStatusCondition( workerUnit, WorkerStatus.IDLE ) );
assertEquals( WorkerStatus.IDLE, workerUnit.getStatus() );
System.out.println( "===> Remote worker is IDLE <===" );
}
@Test
public void testRemoteExecution() throws Exception {
DiscoveryServiceUnit dsUnit = unitManager.buildNewUnit( DiscoveryServiceUnit.class );
BrokerUnit brokerUnit = unitManager.buildNewUnit( BrokerUnit.class );
PeerUnit localPeerUnit = unitManager.buildNewUnit( PeerUnit.class );
localPeerUnit.setDiscoveryService( dsUnit );
PeerUnit remotePeerUnit = unitManager.buildNewUnit( PeerUnit.class );
remotePeerUnit.setDiscoveryService( dsUnit );
WorkerUnit workerUnit = unitManager.buildNewUnit( WorkerUnit.class );
System.out.println( "===> Units created <===" );
dsUnit.initKeys();
brokerUnit.initKeys();
localPeerUnit.initKeys();
remotePeerUnit.initKeys();
workerUnit.initKeys();
System.out.println( "===> Units started <===" );
// remotePeerUnit.setWorkers( workerUnit );
conditionExpecter.waitUntilConditionIsMet( new DiscoveryServiceNumberOfPeersCondition( dsUnit, 2 ) );
conditionExpecter.waitUntilConditionIsMet( new WorkerSetPeerCondition( workerUnit ) );
DeploymentID masterPeer = workerUnit.getMasterPeer();
assertEquals( remotePeerUnit.getLocation(), masterPeer.getContainerLocation() );
assertEquals( PeerConstants.WORKER_MANAGEMENT_CLIENT_OBJECT_NAME, masterPeer.getContainerName() );
assertEquals( WorkerStatus.IDLE, workerUnit.getStatus() );
Collection<LocalConsumerInfo> localConsumerStatus = remotePeerUnit.getLocalConsumerStatus();
Collection<ConsumerInfo> remoteConsumerStatus = remotePeerUnit.getRemoteConsumerStatus();
assertTrue( localConsumerStatus.isEmpty() );
assertTrue( remoteConsumerStatus.isEmpty() );
int jobid = brokerUnit.addJob( UnitUtil.buildASleepJob( Integer.MAX_VALUE ) );
conditionExpecter.waitUntilConditionIsMet( new BrokerJobRunningCondition( brokerUnit, jobid ) );
assertEquals( GridProcessState.RUNNING, brokerUnit.getJob( jobid ).getState() );
localConsumerStatus = remotePeerUnit.getLocalConsumerStatus();
remoteConsumerStatus = remotePeerUnit.getRemoteConsumerStatus();
assertTrue( localConsumerStatus.isEmpty() );
assertEquals( 1, remoteConsumerStatus.size() );
String localPeerURL = localPeerUnit.getJabberUserName() + "@" + localPeerUnit.getJabberServerHostname();
assertEquals( localPeerURL, remoteConsumerStatus.iterator().next().getConsumerIdentification() );
}
@Test
public void testRemoteExecutionsWithThreePeers() throws Exception {
DiscoveryServiceUnit dsUnit = unitManager.buildNewUnit( DiscoveryServiceUnit.class );
BrokerUnit brokerUnit = new BrokerUnit(BrokerUnit.BROKER_PROPERTIES_FILENAME, 2);
unitManager.addUnit(brokerUnit);
PeerUnit localPeerUnit = unitManager.buildNewUnit( PeerUnit.class );
PeerUnit remotePeerUnit1 = unitManager.buildNewUnit( PeerUnit.class );
PeerUnit remotePeerUnit2 = unitManager.buildNewUnit( PeerUnit.class );
WorkerUnit workerUnit1 = unitManager.buildNewUnit( WorkerUnit.class );
WorkerUnit workerUnit2 = unitManager.buildNewUnit( WorkerUnit.class );
WorkerUnit workerUnit3 = unitManager.buildNewUnit( WorkerUnit.class );
WorkerUnit workerUnit4 = unitManager.buildNewUnit( WorkerUnit.class );
WorkerUnit workerUnit5 = unitManager.buildNewUnit( WorkerUnit.class );
WorkerUnit workerUnit6 = unitManager.buildNewUnit( WorkerUnit.class );
localPeerUnit.setDiscoveryService( dsUnit );
remotePeerUnit1.setDiscoveryService( dsUnit );
remotePeerUnit2.setDiscoveryService( dsUnit );
dsUnit.initKeys();
localPeerUnit.initKeys();
remotePeerUnit1.initKeys();
remotePeerUnit2.initKeys();
workerUnit1.initKeys();
workerUnit2.initKeys();
workerUnit3.initKeys();
workerUnit4.initKeys();
workerUnit5.initKeys();
workerUnit6.initKeys();
brokerUnit.initKeys();
// localPeerUnit.setWorkers( workerUnit1, workerUnit2 );
// remotePeerUnit1.setWorkers( workerUnit3, workerUnit4 );
// remotePeerUnit2.setWorkers( workerUnit5, workerUnit6 );
conditionExpecter.waitUntilConditionIsMet( new WorkerSetPeerCondition( workerUnit1 ) );
conditionExpecter.waitUntilConditionIsMet( new WorkerSetPeerCondition( workerUnit2 ) );
conditionExpecter.waitUntilConditionIsMet( new WorkerSetPeerCondition( workerUnit3 ) );
conditionExpecter.waitUntilConditionIsMet( new WorkerSetPeerCondition( workerUnit4 ) );
conditionExpecter.waitUntilConditionIsMet( new WorkerSetPeerCondition( workerUnit5 ) );
conditionExpecter.waitUntilConditionIsMet( new WorkerSetPeerCondition( workerUnit6 ) );
Collection<WorkerInfo> localPeerLocalWorkerStatus = localPeerUnit.getLocalWorkerStatus();
for ( WorkerInfo localWorkerStatusEntry : localPeerLocalWorkerStatus ) {
assertEquals( LocalWorkerState.IDLE, localWorkerStatusEntry.getStatus() );
}
Collection<RemoteWorkerInfo> localPeerRemoteWorkerStatus = localPeerUnit.getRemoteWorkerStatus();
assertTrue( localPeerRemoteWorkerStatus.isEmpty() );
Collection<LocalConsumerInfo> localPeerLocalConsumerStatus = localPeerUnit.getLocalConsumerStatus();
assertTrue( localPeerLocalConsumerStatus.isEmpty() );
Collection<ConsumerInfo> localPeerRemoteConsumerStatus = localPeerUnit.getRemoteConsumerStatus();
assertTrue( localPeerRemoteConsumerStatus.isEmpty() );
Collection<WorkerInfo> remotePeerLocalWorkerStatus1 = remotePeerUnit1.getLocalWorkerStatus();
for ( WorkerInfo localWorkerStatusEntry : remotePeerLocalWorkerStatus1 ) {
assertEquals( LocalWorkerState.IDLE, localWorkerStatusEntry.getStatus() );
}
Collection<WorkerInfo> remotePeerLocalWorkerStatus2 = remotePeerUnit2.getLocalWorkerStatus();
for ( WorkerInfo localWorkerStatusEntry : remotePeerLocalWorkerStatus2 ) {
assertEquals( LocalWorkerState.IDLE, localWorkerStatusEntry.getStatus() );
}
int job1 = brokerUnit.addJob( UnitUtil.buildASleepJob( 6, Integer.MAX_VALUE ) );
conditionExpecter.waitUntilConditionIsMet( new WorkerStatusCondition( workerUnit1, WorkerStatus.ALLOCATED_FOR_BROKER ) );
conditionExpecter.waitUntilConditionIsMet( new WorkerStatusCondition( workerUnit2, WorkerStatus.ALLOCATED_FOR_BROKER ) );
conditionExpecter.waitUntilConditionIsMet( new WorkerStatusCondition( workerUnit3, WorkerStatus.ALLOCATED_FOR_BROKER ) );
conditionExpecter.waitUntilConditionIsMet( new WorkerStatusCondition( workerUnit4, WorkerStatus.ALLOCATED_FOR_BROKER ) );
conditionExpecter.waitUntilConditionIsMet( new WorkerStatusCondition( workerUnit5, WorkerStatus.ALLOCATED_FOR_BROKER ) );
conditionExpecter.waitUntilConditionIsMet( new WorkerStatusCondition( workerUnit6, WorkerStatus.ALLOCATED_FOR_BROKER ) );
localPeerLocalWorkerStatus = localPeerUnit.getLocalWorkerStatus();
for ( WorkerInfo localWorkerStatusEntry : localPeerLocalWorkerStatus ) {
assertEquals( LocalWorkerState.IN_USE, localWorkerStatusEntry.getStatus() );
}
localPeerRemoteWorkerStatus = localPeerUnit.getRemoteWorkerStatus();
for ( RemoteWorkerInfo remoteWorkerStatusEntry : localPeerRemoteWorkerStatus ) {
assertEquals( LocalWorkerState.IN_USE, remoteWorkerStatusEntry.getStatus() );
}
localPeerLocalConsumerStatus = localPeerUnit.getLocalConsumerStatus();
assertFalse( localPeerLocalConsumerStatus.isEmpty() );
assertEquals( 1, localPeerLocalConsumerStatus.size() );
localPeerRemoteConsumerStatus = localPeerUnit.getRemoteConsumerStatus();
assertTrue( localPeerRemoteConsumerStatus.isEmpty() );
remotePeerLocalWorkerStatus1 = remotePeerUnit1.getLocalWorkerStatus();
for ( WorkerInfo localWorkerStatusEntry : remotePeerLocalWorkerStatus1 ) {
assertEquals( LocalWorkerState.DONATED, localWorkerStatusEntry.getStatus() );
}
assertEquals( 4, localPeerRemoteWorkerStatus.size() );
remotePeerLocalWorkerStatus2 = remotePeerUnit2.getLocalWorkerStatus();
for ( WorkerInfo localWorkerStatusEntry : remotePeerLocalWorkerStatus2 ) {
assertEquals( LocalWorkerState.DONATED, localWorkerStatusEntry.getStatus() );
}
brokerUnit.cancelJob( job1 );
conditionExpecter.waitUntilConditionIsMet( new PeerHasTheWorkerInStateCondition( localPeerUnit, workerUnit1,
LocalWorkerState.IDLE ) );
conditionExpecter.waitUntilConditionIsMet( new PeerHasTheWorkerInStateCondition( localPeerUnit, workerUnit2,
LocalWorkerState.IDLE ) );
conditionExpecter.waitUntilConditionIsMet( new PeerHasTheWorkerInStateCondition( remotePeerUnit1, workerUnit3,
LocalWorkerState.IDLE ) );
conditionExpecter.waitUntilConditionIsMet( new PeerHasTheWorkerInStateCondition( remotePeerUnit1, workerUnit4,
LocalWorkerState.IDLE ) );
conditionExpecter.waitUntilConditionIsMet( new PeerHasTheWorkerInStateCondition( remotePeerUnit2, workerUnit5,
LocalWorkerState.IDLE ) );
conditionExpecter.waitUntilConditionIsMet( new PeerHasTheWorkerInStateCondition( remotePeerUnit2, workerUnit6,
LocalWorkerState.IDLE ) );
localPeerLocalWorkerStatus = localPeerUnit.getLocalWorkerStatus();
for ( WorkerInfo localWorkerStatusEntry : localPeerLocalWorkerStatus ) {
assertEquals( LocalWorkerState.IDLE, localWorkerStatusEntry.getStatus() );
}
localPeerLocalConsumerStatus = localPeerUnit.getLocalConsumerStatus();
assertTrue( localPeerLocalConsumerStatus.isEmpty() );
localPeerRemoteConsumerStatus = localPeerUnit.getRemoteConsumerStatus();
assertTrue( localPeerRemoteConsumerStatus.isEmpty() );
localPeerRemoteWorkerStatus = localPeerUnit.getRemoteWorkerStatus();
assertTrue( localPeerRemoteWorkerStatus.isEmpty() );
remotePeerLocalWorkerStatus1 = remotePeerUnit1.getLocalWorkerStatus();
for ( WorkerInfo localWorkerStatusEntry : remotePeerLocalWorkerStatus1 ) {
assertEquals( LocalWorkerState.IDLE, localWorkerStatusEntry.getStatus() );
}
remotePeerLocalWorkerStatus2 = remotePeerUnit2.getLocalWorkerStatus();
for ( WorkerInfo localWorkerStatusEntry : remotePeerLocalWorkerStatus2 ) {
assertEquals( LocalWorkerState.IDLE, localWorkerStatusEntry.getStatus() );
}
}
}