Skip to content

Commit

Permalink
Initial version of the discobit autoconf plugin
Browse files Browse the repository at this point in the history
  • Loading branch information
jenssaade committed Oct 3, 2014
1 parent 1fa0efd commit 424be21
Show file tree
Hide file tree
Showing 7 changed files with 285 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,226 @@
package com.v3rticle.oss.discobit.jenkins.autoconfig;


import hudson.Extension;
import hudson.Launcher;
import hudson.model.BuildListener;
import hudson.model.AbstractBuild;
import hudson.tasks.BuildStepDescriptor;
import hudson.tasks.Builder;
import hudson.util.FormValidation;
import hudson.util.Secret;

import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.file.FileSystems;
import java.util.Arrays;
import java.util.List;

import javax.servlet.ServletException;

import net.sf.json.JSONObject;

import org.apache.commons.lang.StringUtils;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.StaplerRequest;

import com.v3rticle.oss.discobit.client.DiscobitClient;
import com.v3rticle.oss.discobit.client.DiscobitClientFactory;
import com.v3rticle.oss.discobit.client.DiscobitOperationException;


public class AutoConfigBuilder extends Builder {

private final String discobitUrl;
private final String discobitUser;
private final Secret discobitPassword;
private final String configurations;
private final String cuuid;

@DataBoundConstructor
public AutoConfigBuilder(String name, String discobitUrl,
String discobitUser, Secret discobitPassword,
String configurations, String cuuid) {
super();
this.discobitUrl = discobitUrl;
this.discobitUser = discobitUser;
this.discobitPassword = discobitPassword;
this.configurations = configurations;
this.cuuid = cuuid;



}

/**
* We'll use this from the <tt>config.jelly</tt>.
*/
public String getDiscobitUrl() {
return discobitUrl;
}

public String getDiscobitUser() {
return discobitUser;
}

public Secret getDiscobitPassword() {
return discobitPassword;
}

public String getConfigurations() {
return configurations;
}

public String getCuuid() {
return cuuid;
}

@Override
public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) {
System.out.println("performing discoBit autoConfig");


listener.getLogger().println("");
listener.getLogger().println("[ *** discoBit AutoConf *** ]");
listener.getLogger().println("[ Configuration Repository Plugin ]");
listener.getLogger().println("[ http://discobit.com ]");
listener.getLogger().println("");
listener.getLogger().println("[autoConfig] discobit url: " + getDescriptor().getDiscobitUrl());
listener.getLogger().println("[autoConfig] discobit user: " + getDescriptor().getDiscobitUser());
listener.getLogger().println("[autoConfig] configurations: " + configurations);
listener.getLogger().println("[autoConfig] uuid: " + cuuid);

URL serverUrl;
try {
serverUrl = new URL(getDescriptor().getDiscobitUrl());
} catch (MalformedURLException e) {
listener.error(e.getMessage());
return false;
}
DiscobitClient discobit = DiscobitClientFactory.getClient(
serverUrl,
getDescriptor().getDiscobitUser(),
getDescriptor().getDiscobitPassword().getPlainText());

try {
if (!discobit.testAuthentication()){
listener.error("Error accessing discobit, check server settings.");
return false;
}
} catch (DiscobitOperationException e) {
listener.error("Error accessing discobit: " + e.getMessage());
return false;
}

if (configurations != null){
List<String> configurationsSeparated = Arrays.asList(StringUtils.split(configurations, ","));
for (String singleConfig : configurationsSeparated) {
singleConfig = singleConfig.trim();

listener.getLogger().println("[autoConfig] validating file:" + singleConfig);
File singleConfigFile = new File(build.getWorkspace().getRemote() + FileSystems.getDefault().getSeparator() + singleConfig);
if (singleConfigFile.exists()){
listener.getLogger().println("[autoConfig] pushing: " + cuuid + " <- " + singleConfig);
boolean successPush = discobit.pushConfiguration(cuuid, singleConfigFile);
listener.getLogger().println("[autoConfig] successful: " + successPush);
} else {
listener.getLogger().println("[autoConfig] skipping, cannot be located: " + cuuid + " <- " + singleConfig);
}
}
}
listener.getLogger().println("[autoConfig] finished.");

return true;
}

@Override
public DescriptorImpl getDescriptor() {
return (DescriptorImpl)super.getDescriptor();
}



@Extension
public static final class DescriptorImpl extends BuildStepDescriptor<Builder> {

private String discobitUrl;
private String discobitUser;
private Secret discobitPassword;

public DescriptorImpl() {
load();
}

/**
* This human readable name is used in the configuration screen.
*/
@Override
public String getDisplayName() {
return "Push configurations to the discoBit configuration repository";
}

/**
* Applicable to any kind of project.
*/
@Override
public boolean isApplicable(Class type) {
return true;
}

@Override
public boolean configure(StaplerRequest req, JSONObject formData) throws FormException {
discobitUrl = formData.getString("discobitUrl");
discobitUser = formData.getString("discobitUser");
discobitPassword = Secret.fromString( formData.getString("discobitPassword") );

save();
return super.configure(req,formData);
}


public FormValidation doTestConnection(
@QueryParameter("discobitUrl") final String discobitUrl,
@QueryParameter("discobitUser") final String discobitUser,
@QueryParameter("discobitPassword") final String discobitPassword) throws IOException, ServletException {
try {
URL serverUrl = null;
try {
serverUrl = new URL(discobitUrl);
} catch (MalformedURLException e) {
return FormValidation.error("Failed. Mailformed URL");
}
DiscobitClient discobit = DiscobitClientFactory.getClient(
serverUrl,
discobitUser,
discobitPassword);

if( discobit.testAuthentication()) {
return FormValidation.ok("Success. Connection with discoBit Configuration Repository verified.");
}else{
return FormValidation.error("Failed. Connection with discoBit Configuration Repository not verified.");
}
} catch (Exception e) {
System.out.println("Exception " + e.getMessage() );
e.printStackTrace();
return FormValidation.error("Client error : " + e.getMessage());
}
}

public String getDiscobitUrl() {
return discobitUrl;
}

public String getDiscobitUser() {
return discobitUser;
}

public Secret getDiscobitPassword() {
return discobitPassword;
}

}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<j:jelly xmlns:j="jelly:core" xmlns:st="jelly:stapler" xmlns:d="jelly:define" xmlns:l="/lib/layout" xmlns:t="/lib/hudson" xmlns:f="/lib/form">

<f:section title="discoBit AutoConf - Configurations">
<f:entry title="Configuration files" field="configurations"
description="Source: Add configuration files (incl. workspace path) ">
<f:textbox />
</f:entry>
<f:entry title="discoBit UUID" field="cuuid"
description="Target: Add the UUID of the discoBit Configuration">
<f:textbox />
</f:entry>
</f:section>


<f:section title="discoBit AutoConf - Repository (optionally override global settings)">
<f:entry title="discoBit URL" field="discobitUrl"
description="Add discoBit URL ">
<f:textbox />
</f:entry>
<f:entry title="User" field="discobitUser"
description="Add discoBit User">
<f:textbox />
</f:entry>
<f:entry title="Password" field="discobitPassword"
description="Add discoBit Password">
<f:password />
</f:entry>
<f:validateButton
title="${%Test Connection}" progress="${%Testing...}"
method="testConnection" with="discobitUrl,discobitUser,discobitPassword" />
</f:section>
</j:jelly>
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<j:jelly xmlns:j="jelly:core" xmlns:st="jelly:stapler" xmlns:d="jelly:define" xmlns:l="/lib/layout" xmlns:t="/lib/hudson" xmlns:f="/lib/form">
<f:section title="discoBit AutoConf">
<f:entry title="discoBit URL" field="discobitUrl"
description="Add discoBit URL">
<f:textbox />
</f:entry>
<f:entry title="User" field="discobitUser"
description="Add discoBit User">
<f:textbox />
</f:entry>
<f:entry title="Password" field="discobitPassword"
description="Add discoBit Password">
<f:password />
</f:entry>
<f:validateButton
title="${%Test Connection}" progress="${%Testing...}"
method="testConnection" with="discobitUrl,discobitUser,discobitPassword" />
</f:section>
</j:jelly>
3 changes: 3 additions & 0 deletions src/main/resources/index.jelly
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<div>
The AutoConf plugin pushes your selected application configurations to a discoBit configuration repository. discoBit is a remote configuration repository for applications. Properties are read from the repository during bootstrap or on demand by your software via REST API (see <a href="http://discobit.com">discobit.com</a>).
</div>
5 changes: 5 additions & 0 deletions src/main/webapp/help-globalConfig.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<div>
<p>
See help-projectConfig.html for more about what these HTMLs do.
</p>
</div>

0 comments on commit 424be21

Please sign in to comment.