From 3931a2b9b9dc697ed51fe629dbde296d5c136e8a Mon Sep 17 00:00:00 2001
From: Michal Kovarik <mkovarik@redhat.com>
Date: Mon, 4 May 2015 12:52:57 +0200
Subject: [PATCH] Adding support for Beaker Builder Plugin

https://wiki.jenkins-ci.org/display/JENKINS/Beaker+Builder+Plugin

Change-Id: I66d1a34b1fb1f39a146f051178bc52cbdec8cc6f
---
 jenkins_jobs/modules/builders.py            | 39 +++++++++++++++++++++
 setup.cfg                                   |  1 +
 tests/builders/fixtures/beaker-content.xml  | 16 +++++++++
 tests/builders/fixtures/beaker-content.yaml |  8 +++++
 tests/builders/fixtures/beaker-path.xml     | 11 ++++++
 tests/builders/fixtures/beaker-path.yaml    |  4 +++
 6 files changed, 79 insertions(+)
 create mode 100644 tests/builders/fixtures/beaker-content.xml
 create mode 100644 tests/builders/fixtures/beaker-content.yaml
 create mode 100644 tests/builders/fixtures/beaker-path.xml
 create mode 100644 tests/builders/fixtures/beaker-path.yaml

diff --git a/jenkins_jobs/modules/builders.py b/jenkins_jobs/modules/builders.py
index 519c32236..a2e7fedd0 100644
--- a/jenkins_jobs/modules/builders.py
+++ b/jenkins_jobs/modules/builders.py
@@ -1924,3 +1924,42 @@ def sonatype_clm(parser, xml_parent, data):
         data.get('module-excludes', '')).lower()
     XML.SubElement(path_config, 'scanProperties').text = str(
         data.get('advanced-options', '')).lower()
+
+
+def beaker(parser, xml_parent, data):
+    """yaml: beaker
+    Execute a beaker build step. Requires the Jenkins :jenkins-wiki:`Beaker
+    Builder Plugin <Beaker+Builder+Plugin>`.
+
+    :arg str content: Run job from string
+                      (Alternative: you can choose a path instead)
+    :arg str path: Run job from file
+                   (Alternative: you can choose a content instead)
+    :arg bool download-logs: Download Beaker log files (default false)
+
+    Example:
+
+    .. literalinclude:: ../../tests/builders/fixtures/beaker-path.yaml
+       :language: yaml
+
+    .. literalinclude:: ../../tests/builders/fixtures/beaker-content.yaml
+       :language: yaml
+    """
+    beaker = XML.SubElement(xml_parent, 'org.jenkinsci.plugins.beakerbuilder.'
+                                        'BeakerBuilder')
+    jobSource = XML.SubElement(beaker, 'jobSource')
+    if 'content' in data and 'path' in data:
+        raise JenkinsJobsException("Use just one of 'content' or 'path'")
+    elif 'content' in data:
+        jobSourceClass = "org.jenkinsci.plugins.beakerbuilder.StringJobSource"
+        jobSource.set('class', jobSourceClass)
+        XML.SubElement(jobSource, 'jobContent').text = data['content']
+    elif 'path' in data:
+        jobSourceClass = "org.jenkinsci.plugins.beakerbuilder.FileJobSource"
+        jobSource.set('class', jobSourceClass)
+        XML.SubElement(jobSource, 'jobPath').text = data['path']
+    else:
+        raise JenkinsJobsException("Use one of 'content' or 'path'")
+
+    XML.SubElement(beaker, 'downloadFiles').text = str(data.get(
+        'download-logs', False)).lower()
diff --git a/setup.cfg b/setup.cfg
index 77a153034..9e04fb7d9 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -47,6 +47,7 @@ jenkins_jobs.builders =
     ant=jenkins_jobs.modules.builders:ant
     artifact-resolver=jenkins_jobs.modules.builders:artifact_resolver
     batch=jenkins_jobs.modules.builders:batch
+    beaker=jenkins_jobs.modules.builders:beaker
     builders-from=jenkins_jobs.modules.builders:builders_from
     change-assembly-version=jenkins_jobs.modules.builders:change_assembly_version
     cmake=jenkins_jobs.modules.builders:cmake
diff --git a/tests/builders/fixtures/beaker-content.xml b/tests/builders/fixtures/beaker-content.xml
new file mode 100644
index 000000000..8bd3628a3
--- /dev/null
+++ b/tests/builders/fixtures/beaker-content.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<project>
+  <builders>
+    <org.jenkinsci.plugins.beakerbuilder.BeakerBuilder>
+      <jobSource class="org.jenkinsci.plugins.beakerbuilder.StringJobSource">
+        <jobContent>&lt;job group='product-QA'&gt;
+    &lt;whiteboard&gt;
+        Apache 2.2 test
+    &lt;/whiteboard&gt;
+&lt;/job&gt;
+</jobContent>
+      </jobSource>
+      <downloadFiles>false</downloadFiles>
+    </org.jenkinsci.plugins.beakerbuilder.BeakerBuilder>
+  </builders>
+</project>
diff --git a/tests/builders/fixtures/beaker-content.yaml b/tests/builders/fixtures/beaker-content.yaml
new file mode 100644
index 000000000..e8ad30079
--- /dev/null
+++ b/tests/builders/fixtures/beaker-content.yaml
@@ -0,0 +1,8 @@
+builders:
+    - beaker:
+        content: |
+            <job group='product-QA'>
+                <whiteboard>
+                    Apache 2.2 test
+                </whiteboard>
+            </job>
diff --git a/tests/builders/fixtures/beaker-path.xml b/tests/builders/fixtures/beaker-path.xml
new file mode 100644
index 000000000..608ddce34
--- /dev/null
+++ b/tests/builders/fixtures/beaker-path.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<project>
+  <builders>
+    <org.jenkinsci.plugins.beakerbuilder.BeakerBuilder>
+      <jobSource class="org.jenkinsci.plugins.beakerbuilder.FileJobSource">
+        <jobPath>test.xml</jobPath>
+      </jobSource>
+      <downloadFiles>true</downloadFiles>
+    </org.jenkinsci.plugins.beakerbuilder.BeakerBuilder>
+  </builders>
+</project>
diff --git a/tests/builders/fixtures/beaker-path.yaml b/tests/builders/fixtures/beaker-path.yaml
new file mode 100644
index 000000000..34eb749f0
--- /dev/null
+++ b/tests/builders/fixtures/beaker-path.yaml
@@ -0,0 +1,4 @@
+builders:
+    - beaker:
+        path: 'test.xml'
+        download-logs: true