package hudson.plugins.virtualization;
import hudson.model.Slave;
import hudson.model.Node;
import hudson.model.Descriptor;
import hudson.model.Hudson;
import hudson.slaves.ComputerLauncher;
import hudson.slaves.RetentionStrategy;
import hudson.slaves.NodeProperty;
import hudson.slaves.Cloud;
import hudson.Util;
import hudson.Extension;
import hudson.Functions;
import java.util.List;
import java.util.ArrayList;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.Set;
import java.util.logging.Logger;
import java.util.logging.Level;
import java.io.IOException;
import org.kohsuke.stapler.DataBoundConstructor;
import org.apache.commons.collections.list.TreeList;
import net.java.dev.vcc.api.Computer;
/**
* Created by IntelliJ IDEA. User: connollys Date: Aug 13, 2009 Time: 2:55:43 PM To change this template use File |
* Settings | File Templates.
*/
public class VirtualComputerSlave extends Slave {
private static final Logger LOGGER = Logger.getLogger(VirtualComputerSlave.class.getName());
@DataBoundConstructor
public VirtualComputerSlave(String name, String nodeDescription, String remoteFS, String numExecutors,
Mode mode, String labelString, VirtualComputerLauncher launcher, ComputerLauncher delegateLauncher,
RetentionStrategy retentionStrategy, List<? extends NodeProperty<?>> nodeProperties,
String datacenterUri, String computerName)
throws
Descriptor.FormException, IOException {
super(name, nodeDescription, remoteFS, Util.tryParseNumber(numExecutors, 1).intValue(), mode, labelString,
launcher == null ? new VirtualComputerLauncher(delegateLauncher, findVirtualComputer(datacenterUri, computerName)) : launcher,
retentionStrategy, nodeProperties);
}
private static VirtualComputer findVirtualComputer(String datacenterUri, String computerName) {
computerName.getClass();
for (VirtualComputer c: ((DescriptorImpl)Hudson.getInstance().getDescriptor(VirtualComputerSlave.class)).getVirtualComputers()) {
if ((datacenterUri == null || datacenterUri.equals(c.getDatacenterUri())) && computerName.equals(c.getComputerName())) {
return c;
}
}
return null;
}
public ComputerLauncher getDelegateLauncher() {
return ((VirtualComputerLauncher)getLauncher()).getDelegate();
}
public VirtualComputer getVirtualComputer() {
return ((VirtualComputerLauncher)getLauncher()).getVirtualComputer();
}
public String getDatacenterUri() {
return getVirtualComputer().getDatacenterUri();
}
public String getComputerName() {
return getVirtualComputer().getComputerName();
}
@Extension
public static final class DescriptorImpl extends SlaveDescriptor {
public String getDisplayName() {
return "Slave virtual computer running on a virtualization platform (via vcc-api)";
}
@Override
public boolean isInstantiable() {
return true;
}
public Set<VirtualComputer> getVirtualComputers() {
SortedSet<VirtualComputer> result = new TreeSet<VirtualComputer>();
for (Cloud cloud: Hudson.getInstance().clouds) {
if (cloud instanceof VirtualDatacenter) {
VirtualDatacenter datacenter = VirtualDatacenter.class.cast(cloud);
result.addAll(datacenter.getVirtualComputers().values());
}
}
return result;
}
public List<VirtualDatacenter> getDatacenters() {
List<VirtualDatacenter> result = new ArrayList<VirtualDatacenter>();
for (Cloud cloud: Hudson.getInstance().clouds) {
if (cloud instanceof VirtualDatacenter) {
result.add((VirtualDatacenter) cloud);
}
}
return result;
}
public List<Descriptor<ComputerLauncher>> getComputerLauncherDescriptors() {
List<Descriptor<ComputerLauncher>> result = new ArrayList<Descriptor<ComputerLauncher>>();
for (Descriptor<ComputerLauncher> launcher: Functions.getComputerLauncherDescriptors()) {
if (!VirtualComputerLauncher.DESCRIPTOR.getClass().isAssignableFrom(launcher.getClass())) {
result.add(launcher);
}
}
return result;
}
}
}