From 03ed39ba016b6e01c38d3af5ddc12c7c161e5e0e Mon Sep 17 00:00:00 2001
From: Teemu Patja <tp@iki.fi>
Date: Mon, 7 Mar 2016 12:29:44 +0200
Subject: [PATCH] Adds support for deleting builds

Support for deleting individual builds for a Jenkins job.

Change-Id: I35c98855b0883986a85cbe7212ec52e6f67e5638
Signed-off-by: Sorin Sbarnea <ssbarnea@redhat.com>
---
 README.rst          |  1 +
 jenkins/__init__.py | 11 +++++++++++
 tests/test_build.py | 22 ++++++++++++++++++++++
 3 files changed, 34 insertions(+)

diff --git a/README.rst b/README.rst
index f87ff22..99cc404 100644
--- a/README.rst
+++ b/README.rst
@@ -23,6 +23,7 @@ the things you can use it for:
 * Create/delete/reconfig views
 * Put server in shutdown mode (quiet down)
 * List running builds
+* Delete builds
 * Create/delete/update folders [#f1]_
 * Set the next build number [#f2]_
 * Install plugins
diff --git a/jenkins/__init__.py b/jenkins/__init__.py
index 932c984..75b8a87 100755
--- a/jenkins/__init__.py
+++ b/jenkins/__init__.py
@@ -115,6 +115,7 @@ STOP_BUILD = '%(folder_url)sjob/%(short_name)s/%(number)s/stop'
 BUILD_WITH_PARAMS_JOB = '%(folder_url)sjob/%(short_name)s/buildWithParameters'
 BUILD_INFO = '%(folder_url)sjob/%(short_name)s/%(number)d/api/json?depth=%(depth)s'
 BUILD_CONSOLE_OUTPUT = '%(folder_url)sjob/%(short_name)s/%(number)d/consoleText'
+DELETE_BUILD = '%(folder_url)sjob/%(short_name)s/%(number)s/doDelete'
 NODE_LIST = 'computer/api/json'
 CREATE_NODE = 'computer/doCreateItem'
 DELETE_NODE = 'computer/%(name)s/doDelete'
@@ -1216,6 +1217,16 @@ class Jenkins(object):
             'POST', self._build_url(STOP_BUILD, locals())
         ))
 
+    def delete_build(self, name, number):
+        """Delete a Jenkins build.
+
+        :param name: Name of Jenkins job, ``str``
+        :param number: Jenkins build number for the job, ``int``
+        """
+        folder_url, short_name = self._get_job_folder(name)
+        self.jenkins_open(requests.Request('POST',
+                          self._build_url(DELETE_BUILD, locals()), b''))
+
     def get_running_builds(self):
         '''Return list of running builds.
 
diff --git a/tests/test_build.py b/tests/test_build.py
index af0ad47..2d907c7 100644
--- a/tests/test_build.py
+++ b/tests/test_build.py
@@ -203,6 +203,28 @@ class JenkinsStopBuildTest(JenkinsTestBase):
         self._check_requests(jenkins_mock.call_args_list)
 
 
+class JenkinsDeleteBuildTest(JenkinsTestBase):
+
+    @patch.object(jenkins.Jenkins, 'jenkins_open')
+    def test_simple(self, jenkins_mock):
+        self.j.delete_build(u'Test Job', number=52)
+
+        self.assertEqual(
+            jenkins_mock.call_args[0][0].url,
+            self.make_url('job/Test%20Job/52/doDelete'))
+        self._check_requests(jenkins_mock.call_args_list)
+
+    @patch.object(jenkins.Jenkins, 'jenkins_open')
+    def test_in_folder(self, jenkins_mock):
+
+        self.j.delete_build(u'a Folder/Test Job', number=52)
+
+        self.assertEqual(
+            jenkins_mock.call_args[0][0].url,
+            self.make_url('job/a%20Folder/job/Test%20Job/52/doDelete'))
+        self._check_requests(jenkins_mock.call_args_list)
+
+
 class JenkinsListRunningBuildsTest(JenkinsTestBase):
     @patch.object(jenkins.Jenkins, 'get_node_info')
     @patch.object(jenkins.Jenkins, 'get_nodes')