package hudson.plugins.virtualbox;
import hudson.Extension;
import hudson.Util;
import hudson.model.Descriptor;
import hudson.model.Label;
import hudson.slaves.Cloud;
import hudson.slaves.NodeProvisioner;
import hudson.util.FormValidation;
import hudson.util.Scrambler;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.QueryParameter;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.logging.Logger;
/**
* {@link Cloud} implementation for VirtualBox.
*
* @author Evgeny Mandrikov
*/
public class VirtualBoxCloud extends Cloud {
private static final Logger LOG = Logger.getLogger(VirtualBoxCloud.class.getName());
private final String url;
private final String username;
private final String password;
/**
* Lazily computed list of virtual machines from this host.
*/
private transient List<VirtualBoxMachine> virtualBoxMachines = null;
@DataBoundConstructor
public VirtualBoxCloud(String displayName, String url, String username, String password) {
super(displayName);
this.url = url;
this.username = username;
this.password = Scrambler.scramble(Util.fixEmptyAndTrim(password));
}
@Override
public Collection<NodeProvisioner.PlannedNode> provision(Label label, int excessWorkload) {
return Collections.emptyList();
}
@Override
public boolean canProvision(Label label) {
return false;
}
private List<VirtualBoxMachine> retrieveMachines() {
return VirtualBoxUtils.getMachines(this);
}
public List<VirtualBoxMachine> getVirtualMachines() {
if (virtualBoxMachines == null) {
virtualBoxMachines = retrieveMachines();
}
return virtualBoxMachines;
}
@Extension
public static class DescriptorImpl extends Descriptor<Cloud> {
@Override
public String getDisplayName() {
return Messages.VirtualBoxHost_displayName();
}
/**
* For UI.
*/
@SuppressWarnings({"UnusedDeclaration", "JavaDoc"})
public FormValidation doTestConnection(
@QueryParameter String url,
@QueryParameter String username,
@QueryParameter String password
) {
LOG.info("Testing connection to " + url + " with username " + username);
try {
VirtualBoxUtils.getMachines(new VirtualBoxCloud("testConnection", url, username, password));
return FormValidation.ok(Messages.VirtualBoxHost_success());
} catch (Throwable e) {
return FormValidation.error(e.getMessage());
}
}
}
public String getUrl() {
return url;
}
public String getUsername() {
return username;
}
public String getPassword() {
return Scrambler.descramble(password);
}
@Override
public String toString() {
final StringBuffer sb = new StringBuffer();
sb.append("VirtualBoxHost");
sb.append("{url='").append(url).append('\'');
sb.append(", username='").append(username).append('\'');
sb.append('}');
return sb.toString();
}
}