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 3416d90..0ce6399 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 7c561da..410952d 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 20344aa..7829f52 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 89bcbbe..4f8290a 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()))