package org.panlab.software.fstoolkit.localprovisioningengine; import java.util.ArrayList; import java.util.Random; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.ISafeRunnable; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.SafeRunner; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import FederationOffice.Office; import FederationOffice.experimentRuntime.RuntimeElement; import FederationOffice.experimentRuntime.RuntimeElementStatus; import FederationOffice.extensionInterfaces.IProvisionResource; import FederationOffice.federationscenarios.RequestedFederationScenario; import FederationOffice.federationscenarios.ResourceRequest; public class ProvisionResourceJob extends Job { private ResourceRequest resourceReq; private ProvisionJob parentJob; private ProvisionJobAction provisionJobAction; private RequestedFederationScenario scenario; public ProvisionResourceJob(ProvisionJob provisionJob, IProgressMonitor monitor, String name,RequestedFederationScenario scenario, ResourceRequest resReq, ProvisionJobAction action) { super(name); this.resourceReq = resReq; this.parentJob = provisionJob; this.scenario = scenario; this.setProgressGroup(monitor, 1); this.provisionJobAction = action; } @Override public boolean belongsTo(Object family) { return resourceReq.eContainer().equals(family); } @Override protected IStatus run(IProgressMonitor monitor) { switch (provisionJobAction) { case PROVISION: return runProvisionJob(monitor); case SHUT_DOWN: return runShutDownResourceJob(monitor); case SHUT_DOWN_RESOURCE: return runShutDownResourceJob(monitor); } return Status.OK_STATUS ; } private IStatus runProvisionJob(IProgressMonitor monitor) { RuntimeElement rtInfo = resourceReq.getRuntimeInfo() ; broadcastResourceStatus(RuntimeElementStatus.OFFLINE); Random r1 = new Random(); ScenarioSolver solver = new ScenarioSolver(); if ( !solver.resourceRequestHasAllAssignementsResolved(scenario, resourceReq) ){ //r1.nextInt(20)>5 ){//ResourceSettingsAreNotOK ){ broadcastResourceStatus(RuntimeElementStatus.WAITING); Random r = new Random(); this.schedule(1000 * r.nextInt(60)+1000); //reschedule the job in 60random seconds System.out.println("RESCHEDULED : " + resourceReq.getName()); return Status.OK_STATUS; } monitor.beginTask("Provisioning " + resourceReq.getName(), 1); if (monitor.isCanceled()) { parentJob.NotifyResJobFinished(this); System.out.println("ProvisionResourceJob, Cancel provisioning : " + resourceReq.getName()); broadcastResourceStatus(RuntimeElementStatus.UNKNOWN); return Status.CANCEL_STATUS; } String guid=""; String officeName = ((Office)resourceReq.getRefOfferedResource().getImplOfferedService().eContainer()).getName() ; for (IProvisionResource p : Activator.getDefault().getProvisionPlugins() ) { if (p.supportsOffice(officeName) ){ broadcastResourceStatus(RuntimeElementStatus.STARTING); guid = p.provisionResource(officeName, scenario, resourceReq); rtInfo.setGUID(guid); } } // try { // Random r = new Random(); // Thread.sleep(1000 * r.nextInt(10) ); // guid="temp"; // rtInfo.setGUID(guid+"."+resourceReq.getName()); // } catch (InterruptedException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } if ("".equals(guid)) broadcastResourceStatus(RuntimeElementStatus.ERROR); else broadcastResourceStatus(RuntimeElementStatus.ONLINE); monitor.worked(1); monitor.done(); parentJob.NotifyResJobFinished(this); return Status.OK_STATUS; } private IStatus runShutDownResourceJob(IProgressMonitor monitor) { RuntimeElement rtInfo = resourceReq.getRuntimeInfo() ; monitor.beginTask("Shutting down " + resourceReq.getName(), 1); if (monitor.isCanceled()) { parentJob.NotifyResJobFinished(this); System.out.println("ProvisionResourceJob, Cancel provisioning : " + resourceReq.getName()); broadcastResourceStatus(RuntimeElementStatus.UNKNOWN );; return Status.CANCEL_STATUS; } String guid=""; String officeName = ((Office)resourceReq.getRefOfferedResource().getImplOfferedService().eContainer()).getName() ; for (IProvisionResource p : Activator.getDefault().getProvisionPlugins()) { if (p.supportsOffice(officeName) ){ if ( (rtInfo.getStatus()!= RuntimeElementStatus.NOT_EXISTS )){ try { Random r = new Random(); Thread.sleep(1000 * r.nextInt(60) ); //sleep randomly..shutdown to avoid collisions. } catch (InterruptedException e) { e.printStackTrace(); } guid = p.deleteResource(officeName, scenario, resourceReq); } rtInfo.setGUID(guid); } } broadcastResourceStatus(RuntimeElementStatus.NOT_EXISTS); monitor.worked(1); monitor.done(); System.out.println("ProvisionResourceJob, OK Provisioning : " + resourceReq.getName()); parentJob.NotifyResJobFinished(this); return Status.OK_STATUS; } public ResourceRequest getResourceRequest() { return this.resourceReq; } public ProvisionJob getParentJob() { return parentJob; } private void broadcastResourceStatus(RuntimeElementStatus status){ resourceReq.getRuntimeInfo().setStatus(status); ProvisioningJobBroadcaster.getInstance().eventOccuredOnResource( resourceReq); } }