package org.panlab.software.fstoolkit.localprovisioningengine;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.Display;
import FederationOffice.VTStatus;
import FederationOffice.federationscenarios.RequestedFederationScenario;
import FederationOffice.federationscenarios.ResourceRequest;
public class ProvisionJob extends Job {
private RequestedFederationScenario requestedScenario;
private ResourceRequest requestedResource;
private List<ProvisionResourceJob> provingResJobList;
private ProvisionJobAction provisionJobAction;
public ProvisionJob(String name, RequestedFederationScenario scenario, ProvisionJobAction action) {
this(name, scenario, null, action);
}
public ProvisionJob(String name, RequestedFederationScenario scenario,
ResourceRequest requestedResource, ProvisionJobAction action) {
super(name);
if (scenario == null){
return; //this normally should never happen
}
provingResJobList = new ArrayList<ProvisionResourceJob>();
this.requestedScenario = scenario;
this.provisionJobAction = action;
this.requestedResource = requestedResource;
this.setUser(true);
if (scenario.getScheduledPlan() == null){
this.schedule(2000);//start in 2 secs
}else{ //don't expect too much for now :-)
/** Today's date */
Date today = new Date();
long delay = scenario.getScheduledPlan().getValidFrom().getTime() - today.getTime();
System.out.println("Senario scheduled to run in "+delay+" msec");
if (delay>0)
this.schedule( delay );
else
this.schedule( 1000 );
}
switch (provisionJobAction) {
case PROVISION: scenario.setStatus(VTStatus.SCHEDULED_PROVISIONING);break;
case SHUT_DOWN: scenario.setStatus(VTStatus.SCHEDULED_SHUT_DOWN);break;
case SHUT_DOWN_RESOURCE: scenario.setStatus(VTStatus.PROVISIONING);break;
}
System.out.println("Senario STATUS to run is "+scenario.getStatus() );
//broadcast that
ProvisioningJobBroadcaster.getInstance().eventOccuredOnScenario(scenario);
}
public RequestedFederationScenario getRequestedScenario(){
return this.requestedScenario;
}
@Override
protected IStatus run(IProgressMonitor monitor) {
switch (provisionJobAction) {
case PROVISION: return runProvisionJob(monitor);
case SHUT_DOWN: return runShutDownJob(monitor);
case SHUT_DOWN_RESOURCE: return runShutDownResourceJob(monitor);
}
return Status.OK_STATUS ;
}
private IStatus runProvisionJob(IProgressMonitor monitor) {
this.requestedScenario.setStatus(VTStatus.PROVISIONING );
int totalWork= requestedScenario.getInfrastructureRequest().getReqOfferedResources().size();
monitor.beginTask("Provisioning "+this.requestedScenario.getName(), totalWork);
int lastProvisionedValue=totalWork;
monitor.subTask("Starting Resource Request jobs");
ProvisionResourceJobs(monitor, provisionJobAction);
do {
if (lastProvisionedValue!=provingResJobList.size()){
monitor.worked(lastProvisionedValue-provingResJobList.size());
lastProvisionedValue = provingResJobList.size();
}
if (monitor.isCanceled()){
Job.getJobManager().cancel(this.requestedScenario.getInfrastructureRequest() );
this.requestedScenario.setStatus(VTStatus.REJECTED );
ProvisioningJobBroadcaster.getInstance().eventOccuredOnScenario(this.requestedScenario);
return Status.CANCEL_STATUS;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} while (provingResJobList.size()>0);
monitor.done();
this.requestedScenario.setStatus(VTStatus.RUNNING );
LocalRuntimeScenariosMgt.getInstance().SaveRunningScenarioModel(this.requestedScenario);//since completed
Display.getDefault().asyncExec(new Runnable() {
public void run() {
MessageDialog.openInformation( Activator.getDefault().getWorkbench().getActiveWorkbenchWindow().getShell() ,
"Local Provisioning Engine", "Provisioning job of "+ requestedScenario.getName() +" finished.");
}
});
ProvisioningJobBroadcaster.getInstance().eventOccuredOnScenario(this.requestedScenario);
return Status.OK_STATUS;
}
private IStatus runShutDownJob(IProgressMonitor monitor) {
this.requestedScenario.setStatus(VTStatus.SHUTTING_DOWN );
int totalWork= requestedScenario.getInfrastructureRequest().getReqOfferedResources().size();
monitor.beginTask("Shutting down "+this.requestedScenario.getName(), totalWork);
int lastProvisionedValue=totalWork;
monitor.subTask("Shutting Down Resource Request jobs");
ProvisionResourceJobs(monitor, provisionJobAction);
do {
if (lastProvisionedValue!=provingResJobList.size()){
monitor.worked(lastProvisionedValue-provingResJobList.size());
lastProvisionedValue = provingResJobList.size();
}
if (monitor.isCanceled()){
Job.getJobManager().cancel(this.requestedScenario.getInfrastructureRequest() );
this.requestedScenario.setStatus(VTStatus.REJECTED );
ProvisioningJobBroadcaster.getInstance().eventOccuredOnScenario(this.requestedScenario);
return Status.CANCEL_STATUS;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} while (provingResJobList.size()>0);
monitor.done();
this.requestedScenario.setStatus(VTStatus.SHUT_DOWN );
LocalRuntimeScenariosMgt.getInstance().SaveRunningScenarioModel(this.requestedScenario);//since completed
Display.getDefault().asyncExec(new Runnable() {
public void run() {
MessageDialog.openInformation( Activator.getDefault().getWorkbench().getActiveWorkbenchWindow().getShell() ,
"Local Provisioning Engine", "Shutting down job of "+ requestedScenario.getName() +" finished.");
}
});
ProvisioningJobBroadcaster.getInstance().eventOccuredOnScenario(this.requestedScenario);
return Status.OK_STATUS;
}
private IStatus runShutDownResourceJob(IProgressMonitor monitor) {
this.requestedScenario.setStatus(VTStatus.PROVISIONING );
int totalWork= 1;
monitor.beginTask("Shutting down resource "+this.requestedResource.getName(), totalWork);
int lastProvisionedValue=totalWork;
monitor.subTask("Shutting Down Resource Request job");
ProvisionResourceJob resJob = new ProvisionResourceJob(this, monitor, "Resource Request " + this.requestedResource.getName(),
requestedScenario, this.requestedResource, provisionJobAction);
provingResJobList.add(resJob);
resJob.schedule();
do {
if (lastProvisionedValue!=provingResJobList.size()){
monitor.worked(lastProvisionedValue-provingResJobList.size());
lastProvisionedValue = provingResJobList.size();
}
if (monitor.isCanceled()){
Job.getJobManager().cancel(this.requestedScenario.getInfrastructureRequest() );
this.requestedScenario.setStatus(VTStatus.RUNNING );
ProvisioningJobBroadcaster.getInstance().eventOccuredOnScenario(this.requestedScenario);
return Status.CANCEL_STATUS;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} while (provingResJobList.size()>0);
monitor.done();
this.requestedScenario.setStatus(VTStatus.RUNNING );
LocalRuntimeScenariosMgt.getInstance().SaveRunningScenarioModel(this.requestedScenario);//since completed
Display.getDefault().asyncExec(new Runnable() {
public void run() {
MessageDialog.openInformation( Activator.getDefault().getWorkbench().getActiveWorkbenchWindow().getShell() ,
"Local Provisioning Engine", "Shutting down job of resource "+ requestedResource.getName() +" finished.");
}
});
ProvisioningJobBroadcaster.getInstance().eventOccuredOnScenario(this.requestedScenario);
return Status.OK_STATUS;
}
private void ProvisionResourceJobs(IProgressMonitor monitor, ProvisionJobAction action){
int i=0;
for (ResourceRequest resReq : requestedScenario.getInfrastructureRequest().getReqOfferedResources()) {
ProvisionResourceJob resJob = new ProvisionResourceJob(this, monitor, "Resource Request " + resReq.getName(),
requestedScenario, resReq, action);
provingResJobList.add(resJob);
resJob.schedule(i);//schedule each one with 3secs difference and see
i+=5000;
}
}
public void NotifyResJobFinished( ProvisionResourceJob provJob ){
System.out.println("NotifyResJobFinished : "+ provJob.getName());
provingResJobList.remove(provJob);
}
}