Use jenkins job to accept and reject submissions
authorEd Bartosh <eduard.bartosh@intel.com>
Thu, 12 Feb 2015 14:05:00 +0000 (16:05 +0200)
committerEd Bartosh <eduard.bartosh@intel.com>
Fri, 13 Feb 2015 12:04:22 +0000 (14:04 +0200)
Implemented -j --jenkins command line option for repa reject and
repa accept subcommands.

With this option repa will trigger 're' jenkins job instead of creating
SR directly on OBS. With this functionality RE doesn't need to be a mainainer
of OBS project to be able to accept and reject submissions.

Fixes: #2412
Change-Id: I7ad07ca18595083cb7a91ac0a4af7fc297c89119
Signed-off-by: Ed Bartosh <eduard.bartosh@intel.com>
repa.1
repa/accept.py
repa/common.py
repa/reject.py

diff --git a/repa.1 b/repa.1
index 3416d908d5d6337061e057f5f5aca7f58ed68da7..0ce6399d07f9e998a3bb30fcd22ac1b9201b075f 100644 (file)
--- a/repa.1
+++ b/repa.1
@@ -249,6 +249,12 @@ Print short help text about the "accept" command and exit.
 Add acceptance comment for created SR.
 .RE
 
+.PP
+\-j \-\-jenkins
+.RS 2
+Trigger Jenkins job to accept submission.
+.RE
+
 .\"
 .\" The "reject" command description
 .\"
@@ -275,6 +281,12 @@ Print short help text about the "reject" command and exit.
 Add rejection comment for created SR.
 .RE
 
+.PP
+\-j \-\-jenkins
+.RS 2
+Trigger Jenkins job to reject submission.
+.RE
+
 .\"
 .\" The "group" command description
 .\"
index 7c561dab3c28279f90e642c519f18ec4f345f4c9..410952ddf90bdd85793eb844a6697685c6fd1929 100644 (file)
@@ -30,6 +30,7 @@ Accept submissions.
 """
 
 import sys
+from collections import namedtuple
 
 from repa.obs import OBS
 from repa.main import sub_main
@@ -48,13 +49,21 @@ class Accept(object):
         """Adds arguments to the parser. Called from [sub_]main."""
         parser.add_argument('submission', help='submission or group')
         parser.add_argument('-c', '--comment', help='comment', default='')
+        parser.add_argument('-j', '--jenkins', action='store_true',
+                            help='trigger Jenkins job')
 
     @staticmethod
     def run(argv):
         """Command line entry point. Called from [sub_]main."""
         obs = OBS(argv.apiurl, argv.apiuser, argv.apipasswd)
+
+        cred = None
+        if argv.jenkins:
+            cred = namedtuple('cred', ['url', 'username', 'password'])(\
+                     argv.jenkins_url, argv.jenkins_user, argv.jenkins_passwd)
+
         return accept_or_reject(obs, argv.submission, 'accepted',
-                                argv.project, argv.comment)
+                                argv.project, argv.comment, cred)
 
 if __name__ == '__main__':
     sys.exit(sub_main(sys.argv[1:], Accept()))
index 20344aa9dc9f8da93e97e05c93b83aaaf18e0f17..7829f52230352b1807d0f941bce63b362c9a4b2e 100644 (file)
@@ -35,6 +35,8 @@ import time
 import json
 from functools import wraps, partial
 
+from repa.jenkins import trigger_build
+
 OBS_PROJECT_PREFIX = "home:prerelease:"
 
 class RepaException(Exception):
@@ -82,8 +84,14 @@ def delete_project(obs, name, target):
     obs.delete_project(project)
 
 
-def accept_or_reject(obs, submission, state, target, comment=''):
-    """Create SRs and set their state for one submission or for a group."""
+def accept_or_reject(obs, submission, state, target, comment='',
+                     jenkins_cred=None):
+    """
+    Create SRs and set their state for one submission or for a group.
+
+    This can be done 2 ways - directly using OBS API and by triggering
+                              jenkins job
+    """
     for name, project, meta in _resolve_submissions(obs, submission, target):
         # osc submitreq [OPTIONS] SOURCEPRJ SOURCEPKG DESTPRJ [DESTPKG]
         # osc request accept [-m TEXT] ID
@@ -99,19 +107,30 @@ def accept_or_reject(obs, submission, state, target, comment=''):
             % (comment or "submission %s" % str(name),
                projects, meta['git_tag'])
 
-        # Create SR
-        reqid = obs.create_sr(project, obs.get_source_packages(project),
-                              str(meta['obs_target_prj']), message=message)
+        target_prj = str(meta['obs_target_prj'])
+
+        if jenkins_cred:
+            build, status, out = \
+                trigger_build('re', {'action': state,
+                                     'submission': str(name),
+                                     'target_project': target_prj,
+                                     'comment': comment}, jenkins_cred)
+            print "Jenkins job: re, build #%s, status: %s" % (build, status)
+            print out
+        else:
+            # Create SR
+            reqid = obs.create_sr(project, obs.get_source_packages(project),
+                                  target_prj, message=message)
 
-        print 'created SR %s' % reqid
+            print 'created SR %s' % reqid
 
-        # and immediately set its state
-        message = "SR %s is set to %s" % (reqid, state)
-        if comment:
-            message += comment
-        obs.set_sr_state(reqid, state=state,
+            # and immediately set its state
+            message = "SR %s is set to %s" % (reqid, state)
+            if comment:
+                message += comment
+            obs.set_sr_state(reqid, state=state,
                          message=str(message), force=True)
-        print 'set SR state to', state
+            print 'set SR state to', state
 
     # delete submit group
     if submission.startswith('submitgroup'):
index 89bcbbec0cbcf1e939b8bd3c34b13f9a3afd2bed..4f8290aaff0f434b4638e754abe599a82ac8c5d9 100644 (file)
@@ -30,6 +30,7 @@ Accept submissions.
 """
 
 import sys
+from collections import namedtuple
 
 from repa.obs import OBS
 from repa.main import sub_main
@@ -48,13 +49,21 @@ class Reject(object):
         """Adds arguments to the parser. Called from [sub_]main."""
         parser.add_argument('submission', help='submission or group')
         parser.add_argument('-c', '--comment', help='comment', default='')
+        parser.add_argument('-j', '--jenkins', action='store_true',
+                            help='trigger Jenkins job')
 
     @staticmethod
     def run(argv):
         """Command line entry point. Called from [sub_]main."""
         obs = OBS(argv.apiurl, argv.apiuser, argv.apipasswd)
+
+        cred = None
+        if argv.jenkins:
+            cred = namedtuple('cred', ['url', 'username', 'password'])(\
+                     argv.jenkins_url, argv.jenkins_user, argv.jenkins_passwd)
+
         return accept_or_reject(obs, argv.submission, 'declined',
-                                argv.project, argv.comment)
+                                argv.project, argv.comment, cred)
 
 if __name__ == '__main__':
     sys.exit(sub_main(sys.argv[1:], Reject()))