package hudson.plugins.virtualization;
import hudson.slaves.ComputerLauncher;
import hudson.slaves.SlaveComputer;
import hudson.model.TaskListener;
import hudson.model.Descriptor;
import hudson.model.Hudson;
import hudson.Extension;
import java.io.IOException;
import org.kohsuke.stapler.DataBoundConstructor;
import net.java.dev.vcc.api.Datacenter;
import net.java.dev.vcc.api.Computer;
import net.java.dev.vcc.api.PowerState;
import net.java.dev.vcc.api.commands.StartComputer;
import net.java.dev.vcc.api.commands.SuspendComputer;
/**
* Created by IntelliJ IDEA. User: connollys Date: Aug 13, 2009 Time: 3:02:47 PM To change this template use File |
* Settings | File Templates.
*/
public class VirtualComputerLauncher extends ComputerLauncher {
private final ComputerLauncher delegate;
private final VirtualComputer virtualComputer;
@DataBoundConstructor
public VirtualComputerLauncher(ComputerLauncher delegate, VirtualComputer virtualComputer) {
this.delegate = delegate;
this.virtualComputer = virtualComputer;
}
public ComputerLauncher getDelegate() {
return delegate;
}
public VirtualComputer getVirtualComputer() {
return virtualComputer;
}
@Override
public boolean isLaunchSupported() {
return delegate.isLaunchSupported();
}
@Override
public void launch(SlaveComputer slaveComputer, TaskListener taskListener)
throws IOException, InterruptedException {
taskListener.getLogger().println("Getting connection to the virtual datacenter");
try {
taskListener.getLogger().println("Target virtual computer: " + virtualComputer);
Datacenter datacenter = virtualComputer.getDatacenter().getConnection();
taskListener.getLogger().println("Finding the computer");
for (Computer c : datacenter.getAllComputers()) {
if (virtualComputer.getName().equals(c.getName())) {
taskListener.getLogger().println("Found the computer");
if (!PowerState.RUNNING.equals(c.getState())) {
taskListener.getLogger().println("Starting virtual computer");
c.execute(new StartComputer());
} else {
taskListener.getLogger().println("Virtual computer is already running");
}
taskListener.getLogger().println("Starting stage 2 launcher");
delegate.launch(slaveComputer, taskListener);
taskListener.getLogger().println("Stage 2 launcher completed");
return;
}
}
taskListener.getLogger().println("Could not find the computer");
throw new IOException("Could not find the computer");
} catch (IOException e) {
e.printStackTrace(taskListener.getLogger());
throw e;
} catch (Throwable t) {
t.printStackTrace(taskListener.getLogger());
}
}
@Override
public void afterDisconnect(SlaveComputer slaveComputer, TaskListener taskListener) {
taskListener.getLogger().println("Starting stage 2 afterDisconnect");
delegate.afterDisconnect(slaveComputer, taskListener);
taskListener.getLogger().println("Getting connection to the virtual datacenter");
try {
Datacenter datacenter = virtualComputer.getDatacenter().getConnection();
taskListener.getLogger().println("Finding the computer");
for (Computer c : datacenter.getAllComputers()) {
if (virtualComputer.getName().equals(c.getName())) {
taskListener.getLogger().println("Found the computer");
if (PowerState.RUNNING.equals(c.getState())) {
taskListener.getLogger().println("Suspending virtual computer");
c.execute(new SuspendComputer());
} else {
taskListener.getLogger().println("Virtual computer is already suspended");
}
return;
}
}
taskListener.getLogger().println("Could not find the computer");
} catch (Throwable t) {
taskListener.fatalError(t.getMessage(), t);
}
}
@Override
public void beforeDisconnect(SlaveComputer slaveComputer, TaskListener taskListener) {
delegate.beforeDisconnect(slaveComputer, taskListener);
}
@Override
public Descriptor<ComputerLauncher> getDescriptor() {
return Hudson.getInstance().getDescriptor(getClass());
}
@Extension
public static final Descriptor<ComputerLauncher> DESCRIPTOR = new Descriptor<ComputerLauncher>() {
public String getDisplayName() {
return null;
}
};
}