/**
* Copyright 2000-2014 NeuStar, Inc. All rights reserved.
* NeuStar, the Neustar logo and related names and logos are registered
* trademarks, service marks or tradenames of NeuStar, Inc. All other
* product names, company names, marks, logos and symbols may be trademarks
* of their respective owners.
*/
package biz.neustar.jenkins.plugins.packer;
import com.google.common.base.Strings;
import hudson.EnvVars;
import hudson.Extension;
import hudson.Functions;
import hudson.Launcher;
import hudson.Util;
import hudson.model.EnvironmentSpecific;
import hudson.model.Node;
import hudson.model.TaskListener;
import hudson.remoting.Callable;
import hudson.slaves.NodeSpecific;
import hudson.tools.ToolDescriptor;
import hudson.tools.ToolInstallation;
import hudson.tools.ToolInstaller;
import hudson.tools.ToolProperty;
import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.util.Collections;
import java.util.List;
import java.util.logging.Logger;
import jenkins.model.Jenkins;
import net.sf.json.JSONObject;
import org.kohsuke.stapler.DataBoundConstructor;
/**
*
*/
public class PackerInstallation extends ToolInstallation implements
EnvironmentSpecific<PackerInstallation>,
NodeSpecific<PackerInstallation>, Serializable {
private static final long serialVersionUID = 1L;
private static final Logger LOGGER = Logger.getLogger(PackerInstallation.class.getName());
public static final String UNIX_PACKER_COMMAND = "packer";
public static final String WINDOWS_PACKER_COMMAND = "packer.exe";
private final String packerHome;
private String params = "";
private String jsonTemplate = "";
private String jsonTemplateText = "";
private final JSONObject templateModeJsonObj;
private String templateMode = TemplateMode.TEXT.toMode();
private List<PackerFileEntry> fileEntries = Collections.emptyList();
@DataBoundConstructor
public PackerInstallation(String name, String home, String params,
JSONObject templateMode,
List<PackerFileEntry> fileEntries,
List<? extends ToolProperty<?>> properties) {
super(name, launderHome(home), properties);
this.packerHome = super.getHome();
this.params = params;
this.fileEntries = fileEntries;
this.templateModeJsonObj = templateMode;
this.jsonTemplate = templateModeJsonObj.optString("jsonTemplate", null);
this.jsonTemplateText = templateModeJsonObj.optString("jsonTemplateText", null);
if (!Strings.isNullOrEmpty(templateModeJsonObj.optString("value", null))) {
this.templateMode = templateModeJsonObj.getString("value");
}
}
private static String launderHome(String home) {
if (home.endsWith("/") || home.endsWith("\\")) {
// see https://issues.apache.org/bugzilla/show_bug.cgi?id=26947
// Ant doesn't like the trailing slash, especially on Windows
return home.substring(0, home.length() - 1);
} else {
return home;
}
}
@Override
public String getHome() {
if (packerHome != null) {
return packerHome;
}
return super.getHome();
}
public List<PackerFileEntry> getFileEntries() {
if (fileEntries == null) {
return Collections.emptyList();
}
return fileEntries;
}
public String getParams() {
return params;
}
public String getJsonTemplate() {
return jsonTemplate;
}
public String getJsonTemplateText() {
return jsonTemplateText;
}
public String getTemplateMode() {
return templateMode;
}
public boolean isFileTemplate() {
return TemplateMode.FILE.isMode(templateMode);
}
public boolean isTextTemplate() {
return TemplateMode.TEXT.isMode(templateMode);
}
public PackerInstallation forEnvironment(EnvVars environment) {
return new PackerInstallation(getName(),
environment.expand(packerHome), params, templateModeJsonObj,
fileEntries,
getProperties().toList());
}
public PackerInstallation forNode(Node node, TaskListener log)
throws IOException, InterruptedException {
return new PackerInstallation(getName(), translateFor(node, log),
params, templateModeJsonObj, fileEntries, getProperties().toList());
}
public String getExecutable(Launcher launcher) throws InterruptedException, IOException {
return launcher.getChannel().call(new Callable<String, IOException>() {
public String call() throws IOException {
File exe = getExeFile();
if (exe.exists()) {
return exe.getPath();
}
return null;
}
});
}
protected File getExeFile() {
String execName = (Functions.isWindows()) ? WINDOWS_PACKER_COMMAND : UNIX_PACKER_COMMAND;
String home = Util.replaceMacro(this.packerHome, EnvVars.masterEnvVars);
return new File(home, execName);
}
@Extension
public static class DescriptorImpl extends
ToolDescriptor<PackerInstallation> {
public DescriptorImpl() {
load();
}
@Override
public String getDisplayName() {
return "Packer";
}
@Override
public List<? extends ToolInstaller> getDefaultInstallers() {
return Collections.singletonList(new PackerInstaller(null));
}
@Override
public PackerInstallation[] getInstallations() {
return Jenkins.getInstance()
.getDescriptorByType(PackerPublisher.DescriptorImpl.class)
.getInstallations();
}
@Override
public void setInstallations(PackerInstallation... installations) {
Jenkins.getInstance()
.getDescriptorByType(PackerPublisher.DescriptorImpl.class)
.setInstallations(installations);
}
public boolean isTextTemplateChecked(PackerInstallation installation) {
if (installation == null) {
return true;
}
return installation.isTextTemplate() || !installation.isFileTemplate();
}
}
}