Merge remote-tracking branch 'origin/master' into jenkins
diff --git a/tools/build_uec.sh b/tools/build_uec.sh
index d57cb29..bbb8b37 100755
--- a/tools/build_uec.sh
+++ b/tools/build_uec.sh
@@ -90,9 +90,10 @@
 
 # libvirt.xml configuration
 NET_XML=$vm_dir/net.xml
+NET_NAME=${NET_NAME:-devstack-$GUEST_NETWORK}
 cat > $NET_XML <<EOF
 <network>
-  <name>devstack-$GUEST_NETWORK</name>
+  <name>$NET_NAME</name>
   <bridge name="stackbr%d" />
   <forward/>
   <ip address="$GUEST_GATEWAY" netmask="$GUEST_NETMASK">
@@ -104,9 +105,9 @@
 EOF
 
 if [[ "$GUEST_RECREATE_NET" == "yes" ]]; then
-    virsh net-destroy devstack-$GUEST_NETWORK || true
+    virsh net-destroy $NET_NAME || true
     # destroying the network isn't enough to delete the leases
-    rm -f /var/lib/libvirt/dnsmasq/devstack-$GUEST_NETWORK.leases
+    rm -f /var/lib/libvirt/dnsmasq/$NET_NAME.leases
     virsh net-create $vm_dir/net.xml
 fi
 
@@ -134,7 +135,7 @@
     </disk>
 
     <interface type='network'>
-      <source network='devstack-$GUEST_NETWORK'/>
+      <source network='$NET_NAME'/>
     </interface>
         
     <!-- The order is significant here.  File must be defined first -->
diff --git a/tools/jenkins/README.md b/tools/jenkins/README.md
new file mode 100644
index 0000000..74237f8
--- /dev/null
+++ b/tools/jenkins/README.md
@@ -0,0 +1,17 @@
+Getting Started With Jenkins and Devstack
+=========================================
+This little corner of devstack is to show how to get an Openstack jenkins
+environment up and running quickly, using the rcb configuration methodology.
+
+
+To manually set up a testing environment
+----------------------------------------
+    ./build_configuration.sh [EXECUTOR_NUMBER] [CONFIGURATION]
+
+For now, use "./build_configuration.sh $EXECUTOR_NUMBER kvm"
+
+To manually run a test
+----------------------
+    ./run_test.sh [EXECUTOR_NUMBER] [ADAPTER] 
+
+For now, use "./run_test.sh $EXECUTOR_NUMBER [euca|floating]"
diff --git a/tools/jenkins/adapters/euca.sh b/tools/jenkins/adapters/euca.sh
new file mode 100755
index 0000000..3cd9710
--- /dev/null
+++ b/tools/jenkins/adapters/euca.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+echo "$0 SUCCESS!"
diff --git a/tools/jenkins/adapters/floating_ips.sh b/tools/jenkins/adapters/floating_ips.sh
new file mode 100755
index 0000000..3cd9710
--- /dev/null
+++ b/tools/jenkins/adapters/floating_ips.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+echo "$0 SUCCESS!"
diff --git a/tools/jenkins/build_configuration.sh b/tools/jenkins/build_configuration.sh
new file mode 100755
index 0000000..cab133d
--- /dev/null
+++ b/tools/jenkins/build_configuration.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+EXECUTOR_NUMBER=$1
+CONFIGURATION=$2
+ADAPTER=$3
+
+function usage() {
+    echo "Usage: $0 -  Build a configuration"
+    echo ""
+    echo "$0 [EXECUTOR_NUMBER] [CONFIGURATION] [ADAPTER]"
+    exit 1
+}
+
+# Validate inputs
+if [[ "$EXECUTOR_NUMBER" = "" || "$CONFIGURATION" = "" ]]; then
+    usage
+fi
+
+# Execute configuration script
+cd configurations && ./$CONFIGURATION.sh $EXECUTOR_NUMBER $CONFIGURATION $ADAPTER
diff --git a/tools/jenkins/configurations/kvm.sh b/tools/jenkins/configurations/kvm.sh
new file mode 100755
index 0000000..e4c4bc5
--- /dev/null
+++ b/tools/jenkins/configurations/kvm.sh
@@ -0,0 +1,48 @@
+#!/bin/bash
+
+EXECUTOR_NUMBER=$1
+CONFIGURATION=$2
+ADAPTER=$3
+
+function usage() {
+    echo "Usage: $0 - Build a test configuration"
+    echo ""
+    echo "$0 [EXECUTOR_NUMBER] [CONFIGURATION] [ADAPTER]"
+    exit 1
+}
+
+# Validate inputs
+if [[ "$EXECUTOR_NUMBER" = "" || "$CONFIGURATION" = ""  || "$ADAPTER" = "" ]]; then
+    usage
+fi
+
+# This directory
+CUR_DIR=$(cd $(dirname "$0") && pwd)
+
+# devstack directory
+cd ../../..
+TOP_DIR=(pwd)
+
+# Name test instance based on executor
+BASE_NAME=executor-`printf "%02d" $EXECUTOR_NUMBER`
+GUEST_NAME=$BASE_NAME.$ADAPTER
+virsh destroy `virsh list | grep $BASE_NAME | cut -d " " -f1` || true
+
+# Configure localrc
+cat <<EOF >localrc
+RECLONE=yes
+GUEST_NETWORK=$EXECUTOR_NUMBER
+GUEST_NAME=$GUEST_NAME
+FLOATING_RANGE=192.168.$EXECUTOR_NUMBER.128/27
+GUEST_CORES=4
+GUEST_RAM=1000000
+MYSQL_PASSWORD=chicken
+RABBIT_PASSWORD=chicken
+SERVICE_TOKEN=chicken
+ADMIN_PASSWORD=chicken
+USERNAME=admin
+TENANT=admin
+NET_NAME=$GUEST_NAME
+EOF
+cd tools
+sudo ./build_uec.sh
diff --git a/tools/jenkins/jenkins_home/.gitignore b/tools/jenkins/jenkins_home/.gitignore
new file mode 100644
index 0000000..d831d01
--- /dev/null
+++ b/tools/jenkins/jenkins_home/.gitignore
@@ -0,0 +1,3 @@
+builds
+workspace
+*.sw*
diff --git a/tools/jenkins/jenkins_home/build_jenkins.sh b/tools/jenkins/jenkins_home/build_jenkins.sh
new file mode 100755
index 0000000..bbba8b0
--- /dev/null
+++ b/tools/jenkins/jenkins_home/build_jenkins.sh
@@ -0,0 +1,87 @@
+#!/bin/bash
+
+# Echo commands, exit on error
+set -o xtrace
+set -o errexit
+
+# Make sure only root can run our script
+if [[ $EUID -ne 0 ]]; then
+   echo "This script must be run as root"
+   exit 1
+fi
+
+# This directory
+CUR_DIR=$(cd $(dirname "$0") && pwd)
+
+# Install software
+DEPS="jenkins cloud-utils"
+apt-get install -y --force-yes $DEPS
+
+# Install jenkins
+if [ ! -e /var/lib/jenkins ]; then
+   echo "Jenkins installation failed"
+   exit 1
+fi
+
+# Setup sudo
+JENKINS_SUDO=/etc/sudoers.d/jenkins
+cat > $JENKINS_SUDO <<EOF
+jenkins ALL = NOPASSWD: ALL
+EOF
+chmod 440 $JENKINS_SUDO
+
+# Setup .gitconfig
+JENKINS_GITCONF=/var/lib/jenkins/hudson.plugins.git.GitSCM.xml
+cat > $JENKINS_GITCONF <<EOF
+<?xml version='1.0' encoding='UTF-8'?>
+<hudson.plugins.git.GitSCM_-DescriptorImpl>
+  <generation>4</generation>
+  <globalConfigName>Jenkins</globalConfigName>
+  <globalConfigEmail>jenkins@rcb.me</globalConfigEmail>
+</hudson.plugins.git.GitSCM_-DescriptorImpl>
+EOF
+
+# Add build numbers
+for job in ${`ls jobs`// / }; do
+    if [ ! -e jobs/$job/nextBuildNumber ]; then
+        echo 1 > jobs/$job/nextBuildNumber
+    fi
+done
+
+# Set ownership to jenkins
+chown -R jenkins $CUR_DIR
+
+# Make sure this directory is accessible to jenkins
+if ! su -c "ls $CUR_DIR" jenkins; then
+    echo "Your devstack directory is not accessible by jenkins."
+    echo "There is a decent chance you are trying to run this from a directory in /root."
+    echo "If so, try moving devstack elsewhere (eg. /opt/devstack)."
+    exit 1
+fi
+
+# Move aside old jobs, if present
+if [ ! -h /var/lib/jenkins/jobs ]; then
+    echo "Installing jobs symlink"
+    if [ -d /var/lib/jenkins/jobs ]; then
+        mv /var/lib/jenkins/jobs /var/lib/jenkins/jobs.old
+    fi
+fi
+
+# Set up jobs symlink
+rm -f /var/lib/jenkins/jobs
+ln -s $CUR_DIR/jobs /var/lib/jenkins/jobs
+
+# List of plugins
+PLUGINS=http://hudson-ci.org/downloads/plugins/build-timeout/1.6/build-timeout.hpi,http://mirrors.jenkins-ci.org/plugins/git/1.1.12/git.hpi,http://hudson-ci.org/downloads/plugins/global-build-stats/1.2/global-build-stats.hpi,http://hudson-ci.org/downloads/plugins/greenballs/1.10/greenballs.hpi,http://download.hudson-labs.org/plugins/console-column-plugin/1.0/console-column-plugin.hpi
+
+# Configure plugins
+for plugin in ${PLUGINS//,/ }; do
+    name=`basename $plugin`   
+    dest=/var/lib/jenkins/plugins/$name
+    if [ ! -e $dest ]; then
+        curl -L $plugin -o $dest
+    fi
+done
+
+# Restart jenkins
+restart jenkins
diff --git a/tools/jenkins/jenkins_home/jobs/kvm/config.xml b/tools/jenkins/jenkins_home/jobs/kvm/config.xml
new file mode 100644
index 0000000..32ce768
--- /dev/null
+++ b/tools/jenkins/jenkins_home/jobs/kvm/config.xml
@@ -0,0 +1,72 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<matrix-project>
+  <actions/>
+  <description></description>
+  <keepDependencies>false</keepDependencies>
+  <properties/>
+  <scm class="hudson.plugins.git.GitSCM">
+    <configVersion>2</configVersion>
+    <userRemoteConfigs>
+      <hudson.plugins.git.UserRemoteConfig>
+        <name>origin</name>
+        <refspec>+refs/heads/*:refs/remotes/origin/*</refspec>
+        <url>git://github.com/cloudbuilders/devstack.git</url>
+      </hudson.plugins.git.UserRemoteConfig>
+    </userRemoteConfigs>
+    <branches>
+      <hudson.plugins.git.BranchSpec>
+        <name>jenkins</name>
+      </hudson.plugins.git.BranchSpec>
+    </branches>
+    <recursiveSubmodules>false</recursiveSubmodules>
+    <doGenerateSubmoduleConfigurations>false</doGenerateSubmoduleConfigurations>
+    <authorOrCommitter>false</authorOrCommitter>
+    <clean>false</clean>
+    <wipeOutWorkspace>false</wipeOutWorkspace>
+    <pruneBranches>false</pruneBranches>
+    <remotePoll>false</remotePoll>
+    <buildChooser class="hudson.plugins.git.util.DefaultBuildChooser"/>
+    <gitTool>Default</gitTool>
+    <submoduleCfg class="list"/>
+    <relativeTargetDir></relativeTargetDir>
+    <excludedRegions></excludedRegions>
+    <excludedUsers></excludedUsers>
+    <gitConfigName></gitConfigName>
+    <gitConfigEmail></gitConfigEmail>
+    <skipTag>false</skipTag>
+    <scmName></scmName>
+  </scm>
+  <canRoam>true</canRoam>
+  <disabled>false</disabled>
+  <blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
+  <blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
+  <triggers class="vector"/>
+  <concurrentBuild>false</concurrentBuild>
+  <axes>
+    <hudson.matrix.TextAxis>
+      <name>ADAPTER</name>
+      <values>
+        <string>euca</string>
+        <string>floating_ips</string>
+      </values>
+    </hudson.matrix.TextAxis>
+  </axes>
+  <builders>
+    <hudson.tasks.Shell>
+      <command>sed -i &apos;s/) 2&gt;&amp;1 | tee &quot;${LOGFILE}&quot;/)/&apos; stack.sh</command>
+    </hudson.tasks.Shell>
+    <hudson.tasks.Shell>
+      <command>set -o errexit
+cd tools/jenkins
+sudo ./build_configuration.sh $EXECUTOR_NUMBER kvm $ADAPTER</command>
+    </hudson.tasks.Shell>
+    <hudson.tasks.Shell>
+      <command>set -o errexit
+cd tools/jenkins
+sudo ./run_test.sh $EXECUTOR_NUMBER $ADAPTER</command>
+    </hudson.tasks.Shell>
+  </builders>
+  <publishers/>
+  <buildWrappers/>
+  <runSequentially>false</runSequentially>
+</matrix-project>
\ No newline at end of file
diff --git a/tools/jenkins/jenkins_home/jobs/kvm/configurations/axis-ADAPTER/euca/config.xml b/tools/jenkins/jenkins_home/jobs/kvm/configurations/axis-ADAPTER/euca/config.xml
new file mode 100644
index 0000000..0be70a5
--- /dev/null
+++ b/tools/jenkins/jenkins_home/jobs/kvm/configurations/axis-ADAPTER/euca/config.xml
@@ -0,0 +1,15 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<matrix-config>
+  <keepDependencies>false</keepDependencies>
+  <properties/>
+  <scm class="hudson.scm.NullSCM"/>
+  <canRoam>false</canRoam>
+  <disabled>false</disabled>
+  <blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
+  <blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
+  <triggers class="vector"/>
+  <concurrentBuild>false</concurrentBuild>
+  <builders/>
+  <publishers/>
+  <buildWrappers/>
+</matrix-config>
\ No newline at end of file
diff --git a/tools/jenkins/jenkins_home/jobs/kvm/configurations/axis-ADAPTER/floatingips/config.xml b/tools/jenkins/jenkins_home/jobs/kvm/configurations/axis-ADAPTER/floatingips/config.xml
new file mode 100644
index 0000000..0be70a5
--- /dev/null
+++ b/tools/jenkins/jenkins_home/jobs/kvm/configurations/axis-ADAPTER/floatingips/config.xml
@@ -0,0 +1,15 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<matrix-config>
+  <keepDependencies>false</keepDependencies>
+  <properties/>
+  <scm class="hudson.scm.NullSCM"/>
+  <canRoam>false</canRoam>
+  <disabled>false</disabled>
+  <blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
+  <blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
+  <triggers class="vector"/>
+  <concurrentBuild>false</concurrentBuild>
+  <builders/>
+  <publishers/>
+  <buildWrappers/>
+</matrix-config>
\ No newline at end of file
diff --git a/tools/jenkins/run_test.sh b/tools/jenkins/run_test.sh
new file mode 100755
index 0000000..cf09cd5
--- /dev/null
+++ b/tools/jenkins/run_test.sh
@@ -0,0 +1,19 @@
+#!/bin/bash
+
+EXECUTOR_NUMBER=$1
+ADAPTER=$2
+
+function usage() {
+    echo "Usage: $0 - Run a test"
+    echo ""
+    echo "$0 [EXECUTOR_NUMBER] [ADAPTER]"
+    exit 1
+}
+
+# Validate inputs
+if [[ "$EXECUTOR_NUMBER" = "" || "$ADAPTER" = "" ]]; then
+    usage
+fi
+
+# Execute configuration script
+cd adapters && ./$ADAPTER.sh $EXECUTOR_NUMBER $ADAPTER