package org.ourgrid.system.units; import static java.io.File.separator; import java.util.Collection; import java.util.Map; import java.util.Set; import org.ourgrid.broker.BrokerComponentContextFactory; import org.ourgrid.broker.BrokerConfiguration; import org.ourgrid.broker.BrokerConstants; import org.ourgrid.broker.BrokerServerModule; import org.ourgrid.broker.status.JobStatusInfo; import org.ourgrid.broker.status.PeerStatusInfo; import org.ourgrid.broker.status.WorkerStatusInfo; import org.ourgrid.broker.ui.sync.BrokerSyncApplicationClient; import org.ourgrid.broker.ui.sync.BrokerSyncManagerClient; import org.ourgrid.broker.ui.sync.command.BrokerStatusCommand; import org.ourgrid.common.interfaces.management.BrokerManager; import org.ourgrid.common.interfaces.to.BrokerCompleteStatus; import org.ourgrid.common.job.JobCounter; import org.ourgrid.common.job.PersistentJobCounter; import org.ourgrid.common.job.SimpleJobCounter; import org.ourgrid.common.specification.job.JobSpecification; import br.edu.ufcg.lsd.commune.container.control.ControlOperationResult; import br.edu.ufcg.lsd.commune.container.servicemanager.client.sync.SyncApplicationClient; import br.edu.ufcg.lsd.commune.context.ModuleContext; import br.edu.ufcg.lsd.commune.context.PropertiesFileParser; import br.edu.ufcg.lsd.commune.network.xmpp.CommuneNetworkException; import br.edu.ufcg.lsd.commune.network.xmpp.XMPPProperties; import br.edu.ufcg.lsd.commune.processor.ProcessorStartException; public class BrokerUnit extends AbstractUnit { private JobCounter jobCounter; private int maxReplicas; private int maxFails; private int maxBlFails; private int numREs; private BrokerSyncApplicationClient uiManager; public static final String BROKER_PROPERTIES_FILENAME = "test" + separator + "system" + separator + "broker.properties"; public BrokerUnit(String propertiesFile, Integer maxReplicas) throws Exception { super(BrokerConstants.MODULE_NAME, propertiesFile); initData(new SimpleJobCounter(), maxReplicas, 3, 10, 2); getUIManager(); this.uiManager.start(); } public BrokerUnit(String propertiesFile, int maxReplicas, int maxFails, int maxBlFails, int numREs) throws Exception { super(BrokerConstants.MODULE_NAME, propertiesFile); initData(new SimpleJobCounter(), maxReplicas, maxFails, maxBlFails, numREs); getUIManager(); this.uiManager.start(); } protected BrokerUnit() throws Exception { this( new SimpleJobCounter(), 1, 3, 10, 2 ); } protected BrokerUnit(JobCounter jobCounter, int maxReplicas, int maxFails, int maxBlFails, int numREs ) throws Exception { super( BrokerConstants.MODULE_NAME ); initData(jobCounter, maxReplicas, maxFails, maxBlFails, numREs); getUIManager(); this.uiManager.start(); } private void initData(JobCounter jobCounter, int maxReplicas, int maxFails, int maxBlFails,int numREs) throws Exception { this.jobCounter = jobCounter; this.maxReplicas = maxReplicas; this.maxFails = maxFails; this.maxBlFails = maxBlFails; this.numREs = numREs; setContext(createContext()); contextCreated(); } public int addJob( JobSpecification job ) throws Exception { checkIfUnitIsRunning(); ControlOperationResult result = uiManager.addJob( job ); return (Integer) result.getResult(); } public void cleanJob( int jobID ) throws Exception { checkIfUnitIsRunning(); uiManager.cleanFinishedJob(jobID); } public void cleanAllFinishedJobs() throws Exception { checkIfUnitIsRunning(); uiManager.cleanAllFinishedJobs(); } /* public void waitForJob( int jobID ) throws Exception { checkIfUnitIsRunning(); uiManager.waitForJob( jobID ); }*/ public Collection<PeerStatusInfo> getPeers() throws Exception { checkIfUnitIsRunning(); BrokerCompleteStatus brokerStatus = uiManager.getBrokerCompleteStatus(); return brokerStatus.getPeersPackage().getPeers(); } public JobStatusInfo getJob( int jobid ) throws Exception { checkIfUnitIsRunning(); BrokerCompleteStatus brokerStatus = uiManager.getBrokerCompleteStatus(); return brokerStatus.getJobsPackage().getJobs().get(jobid); } public Map<Integer,Set<WorkerStatusInfo>> getWorkersByJob() throws Exception { checkIfUnitIsRunning(); BrokerCompleteStatus brokerStatus = uiManager.getBrokerCompleteStatus(); return brokerStatus.getWorkersPackage().getWorkersByJob(); } /*private SchedulerCompleteStatus getSchedulerCompleteStatus() throws Exception, StatusException { checkIfUnitIsRunning(); setAuthenticationProperties(); return applicationClient.getCompleteStatus(); }*/ public JobCounter getJobCounter() { return jobCounter; } public void setJobCounter( JobCounter jobCounter ) throws Exception { checkIfUnitIsStopped(); this.jobCounter = jobCounter; } public int getMaxBlFails() { return maxBlFails; } public void setMaxBlFails( int maxBlFails ) throws Exception { this.maxBlFails = maxBlFails; } public int getMaxFails() { return maxFails; } public void setMaxFails( int maxFails ) throws Exception { this.maxFails = maxFails; } public int getMaxReplicas() { return maxReplicas; } public int getNumREs() { return numREs; } public void setNumberOfReplicaExecutors( int numREs ) throws Exception { checkIfUnitIsStopped(); this.numREs = numREs; } public void cancelJob( int jobid ) throws Exception { uiManager.cancelJob( jobid ); } public void cleanUp() throws Exception { if ( jobCounter instanceof PersistentJobCounter ) { PersistentJobCounter pjc = (PersistentJobCounter) jobCounter; pjc.getCounterFile().delete(); } } public boolean areThereJobsRunning() throws Exception { BrokerCompleteStatus brokerStatus = uiManager.getBrokerCompleteStatus(); Map<Integer,JobStatusInfo> jobs = brokerStatus.getJobsPackage().getJobs(); for ( JobStatusInfo job : jobs.values() ) { if ( job.isRunning() ) { System.out.println( "BrokerUnit.areThereJobsRunning(): " + job.getJobId() + " " + job.getState() ); return true; } } return false; } @Override protected void deploy() { throw new UnsupportedOperationException( "Remove deployment does not work for this unit" ); } /* public void showGUI() throws Exception { checkIfUnitIsRunning(); gui = new BrokerGUI( ); gui.setVisible( true ); }*/ public void showStatus() throws Exception { new BrokerStatusCommand( uiManager ).run( new String[ ] {} ); } @Override public SyncApplicationClient<BrokerManager, BrokerSyncManagerClient> getUIManager() throws Exception { if ( this.uiManager == null ) { ModuleContext context = getContext(); this.uiManager = new BrokerSyncApplicationClient(context); } return this.uiManager; } @Override protected void createComponent() { ModuleContext context = getContext(); try { new BrokerServerModule(context); } catch (CommuneNetworkException e) { e.printStackTrace(); } catch (ProcessorStartException e) { e.printStackTrace(); } } protected ModuleContext createContext() { String propertiesFile = BROKER_PROPERTIES_FILENAME; if (this.propertiesFile != null) { propertiesFile = this.propertiesFile; } BrokerComponentContextFactory contextFactory = new BrokerComponentContextFactory( new PropertiesFileParser(propertiesFile)); ModuleContext context = contextFactory.createContext(); Map<String, String> properties = context.getProperties(); properties.put(BrokerConfiguration.PROP_MAX_REPLICAS, String.valueOf(this.maxReplicas)); context = new ModuleContext(properties); return context; } public String getLogin() { ModuleContext context = createContext(); return context.getProperty(XMPPProperties.PROP_USERNAME) + "@" + context.getProperty(XMPPProperties.PROP_XMPP_SERVERNAME); } public String getPassword() { ModuleContext context = createContext(); return context.getProperty(XMPPProperties.PROP_PASSWORD); } }