package org.jenkinsci.plugins.openshift;
import static org.apache.commons.lang3.StringUtils.isEmpty;
import static org.jenkinsci.plugins.openshift.util.Utils.abort;
import static org.jenkinsci.plugins.openshift.util.Utils.findServer;
import static org.jenkinsci.plugins.openshift.util.Utils.log;
import hudson.Extension;
import hudson.Launcher;
import hudson.model.BuildListener;
import hudson.model.Result;
import hudson.model.AbstractBuild;
import hudson.model.AbstractProject;
import hudson.tasks.BuildStep;
import hudson.tasks.BuildStepMonitor;
import hudson.tasks.Builder;
import java.io.IOException;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.jenkinsci.plugins.openshift.util.Utils;
import org.kohsuke.stapler.DataBoundConstructor;
import com.openshift.client.IApplication;
/**
* @author Siamak Sadeghianfar <ssadeghi@redhat.com>
*/
public class DeleteApplication extends Builder implements BuildStep {
private String serverName;
private String domain;
private String appName;
@DataBoundConstructor
public DeleteApplication(String serverName, String appName, String domain) {
this.serverName = serverName;
this.appName = appName;
this.domain = domain;
}
@Override
public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException {
if (build != null && build.getResult() != null && build.getResult().isWorseThan(Result.SUCCESS)) {
abort(listener, "Build is not success.");
}
if (isEmpty(appName)) {
abort(listener, "Application name is not specified.");
}
try {
Server server = findServer(serverName);
if (server == null) {
abort(listener, "No OpenShift server is selected or none are defined in Jenkins Configuration.");
}
OpenShiftV2Client client = new OpenShiftV2Client(server.getBrokerAddress(), server.getUsername(), server.getPassword());
String targetDomain = domain;
if (isEmpty(targetDomain)) { // pick the domain if only one exists
List<String> domains = client.getDomains();
if (domains.size() > 1) {
abort(listener, "Specify the user domain. " + domains.size() + " domains found on the account.");
} else if (domains.isEmpty()) {
abort(listener, "No domains exist. Cannot delete the gear.");
}
targetDomain = domains.get(0);
}
IApplication deletedApp = client.deleteApp(appName, targetDomain);
if (deletedApp != null) {
log(listener, "Application '" + appName + "' [" + deletedApp.getApplicationUrl() + "] is deleted.");
}
else {
log(listener, "Application '" + appName + "' is not found.");
}
} catch(Exception e) {
abort(listener, e.getMessage());
}
return true;
}
public BuildStepMonitor getRequiredMonitorService() {
return BuildStepMonitor.BUILD;
}
public String getServerName() {
return serverName;
}
public String getDomain() {
return domain;
}
public String getAppName() {
return appName;
}
@Extension
public static class DeleteApplicationDescriptor extends AbstractDescriptor {
public DeleteApplicationDescriptor() {
super(DeleteApplication.class);
load();
}
@Override
public String getDisplayName() {
return Utils.getBuildStepName("Delete Application");
}
@Override
public boolean isApplicable(Class<? extends AbstractProject> jobType) {
return true;
}
}
}