package ee.elinyo.teamcity.plugins.ansible.server;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import jetbrains.buildServer.serverSide.InvalidProperty;
import jetbrains.buildServer.serverSide.PropertiesProcessor;
import jetbrains.buildServer.serverSide.RunType;
import jetbrains.buildServer.serverSide.RunTypeRegistry;
import jetbrains.buildServer.util.StringUtil;
import jetbrains.buildServer.web.openapi.PluginDescriptor;
import org.jetbrains.annotations.NotNull;
import ee.elinyo.teamcity.plugins.ansible.common.AnsibleCommand;
import ee.elinyo.teamcity.plugins.ansible.common.AnsibleRunConfig;
import ee.elinyo.teamcity.plugins.ansible.common.AnsibleRunnerConstants;
public class AnsibleRunType extends RunType {
private PluginDescriptor pluginDescriptor;
public AnsibleRunType(@NotNull final RunTypeRegistry reg, @NotNull final PluginDescriptor pluginDescriptor) {
this.pluginDescriptor = pluginDescriptor;
reg.registerRunType(this);
}
@Override
public String getType() {
return AnsibleRunnerConstants.RUN_TYPE;
}
@Override
public String getDisplayName() {
return "Ansible";
}
@Override
public String getDescription() {
return "Ansible Playbook runner";
}
@Override
public String getEditRunnerParamsJspFilePath() {
return pluginDescriptor.getPluginResourcesPath("editAnsibleRun.jsp");
}
@Override
public String getViewRunnerParamsJspFilePath() {
return pluginDescriptor.getPluginResourcesPath("viewAnsibleRun.jsp");
}
@NotNull
@Override
public Map<String, String> getDefaultRunnerProperties() {
Map<String, String> defaults = new HashMap<String, String>();
defaults.put(AnsibleRunnerConstants.COMMAND_TYPE_KEY, AnsibleCommand.EXECUTABLE.getValue());
defaults.put(AnsibleRunnerConstants.EXECUTABLE_KEY, "ansible-playbook");
return defaults;
}
@NotNull
@Override
public PropertiesProcessor getRunnerPropertiesProcessor() {
return new PropertiesProcessor() {
public Collection<InvalidProperty> process(final Map<String, String> properties) {
List<InvalidProperty> errors = new ArrayList<InvalidProperty>();
AnsibleRunConfig config = new AnsibleRunConfig(properties);
if (AnsibleCommand.EXECUTABLE.equals(config.getCommandType())) {
if (StringUtil.isEmptyOrSpaces(config.getExecutable())) {
errors.add(new InvalidProperty(AnsibleRunnerConstants.EXECUTABLE_KEY, "Cannot be empty"));
}
if (StringUtil.isEmptyOrSpaces(config.getPlaybook())) {
errors.add(new InvalidProperty(AnsibleRunnerConstants.PLAYBOOK_FILE_KEY, "Cannot be empty"));
}
} else if (AnsibleCommand.CUSTOM_SCRIPT.equals(config.getCommandType())) {
if (StringUtil.isEmptyOrSpaces(config.getSourceCode())) {
errors.add(new InvalidProperty(AnsibleRunnerConstants.SOURCE_CODE_KEY, "Cannot be empty"));
}
}
return errors;
}
};
}
@Override
public String describeParameters(Map<String, String> params) {
StringBuilder sb = new StringBuilder("");
AnsibleRunConfig config = new AnsibleRunConfig(params);
if (AnsibleCommand.CUSTOM_SCRIPT.equals(config.getCommandType())) {
sb.append("Ansible by custom script");
} else {
sb.append(config.getExecutable()).append(" ").append(config.getPlaybook());
}
return sb.toString();
}
}