Fixed request job for the github connection 53/170753/4
authorYonghee Han <onstudy@samsung.com>
Thu, 22 Feb 2018 03:08:55 +0000 (12:08 +0900)
committerYonghee Han <onstudy@samsung.com>
Thu, 22 Feb 2018 05:27:54 +0000 (14:27 +0900)
Need to update github info to OBS description
Add delete obs prelease project for accepted tag

Change-Id: Id04637776e85a448782f874670f2b22a70b54490

common/workflow.py
job_request.py

index 7d4f5ea..b82fd42 100644 (file)
@@ -578,11 +578,14 @@ def create_project(build, obs_project, submit_list, mode=MODE_NORMAL):
            }
 
     # Enable Github Connection
-    if submit_list[0].get('github_type'):
+    github_item = {}
+    for u in submit_list:
+        if u.get('github_type'):
+            github_item[u.get('gerrit_project')] = u.get('github_fetch_url')
+
+    if github_item:
         info['github'] = []
-        item = {'project': git_project, \
-                'url': submit_list[0].get('github_fetch_url')}
-        info['github'].append(item)
+        info['github'].append(github_item)
 
     if mode == MODE_SRSYNC:
         submissions = []
index 3c5c738..f0fd064 100755 (executable)
@@ -59,20 +59,18 @@ def tag_info(prj, tag, event_fields=None):
     """Get git tag info"""
 
     git_cache = os.path.join(os.getenv('GIT_CACHE_DIR'))
     if event_fields.get('github'):
         github = event_fields.get('github')
-        prjdir = os.path.join(git_cache, prj)
-        giturl = None
-        git_cache_dir = None
         for item in github:
-            if prj in item.get('project'):
-                giturl = github.get('url')
-                gitorg = giturl.split(':')[1]
-                git_full_name = os.path.join(gitorg, prj)
-                prjdir = os.path.join(git_cache, git_full_name)
-                git_cache_dir = os.path.join(git_cache, gitorg)
-                break
+            for p in item:
+                if prj == p:
+                    giturl = item[p]
+                    gitorg = giturl.split(':')[1]
+                    git_full_name = os.path.join(gitorg, prj)
+                    prjdir = os.path.join(git_cache, git_full_name)
+                    git_cache_dir = os.path.join(git_cache, gitorg)
+                    print 'org=%s git_full_name = %s' %(gitorg, git_full_name)
+                    break
     else: # GERRIT
         prjdir = os.path.join(git_cache, prj)
         giturl = None
@@ -172,6 +170,7 @@ def obs_git_data(event_fields):
                         obs_req_pkg_name = event_fields['packages'][projects.index(project)]
                     except Exception as err:
                         print 'Warning: not able to find package name from description'
+
                 tag = tag_info(project, entry['GIT_TAG'], event_fields)
                 if tag:
                     tag.update({'GIT_PROJECT': project,
@@ -418,6 +417,142 @@ def notify_submiter(event_fields, data):
                 status['body'], os.getenv('NOREPLY_EMAIL_SENDER'), \
                 status['To'], status['Cc'])
 
+def sub_request_gerrit(event_type, event_fields, reqinfo):
+    """ sub request gerrit """
+
+    try:
+        data, projects_data = obs_git_data(event_fields)
+    except GitError, err:
+        print >> sys.stderr, err
+        return []
+
+    gerrit = Gerrit(os.getenv('GERRIT_HOSTNAME_EXTERNAL'), os.getenv('GERRIT_USERNAME'),
+                    os.getenv('GERRIT_SSHPORT'),
+                    int(os.getenv('GERRIT_SILENT_MODE')))
+
+    for project_data in projects_data:
+        data.update(project_data)
+        data.update({'GIT_AUTHOR_EMAIL': '%s <%s>' % \
+                                    (project_data['author'],
+                                    project_data['email'])})
+        # Update sourcepackage and targetpackage into event_fields,
+        # becuase the multiple project have the different packages.
+        event_fields.update({'sourcepackage': project_data['OBS_REQ_PKG_SRC'],
+                             'targetpackage': project_data['OBS_REQ_PKG']})
+        if not (event_type == 'OBS_SRCSRV_REQUEST_REVOKED' or \
+                (event_type == 'OBS_SRCSRV_REQUEST_STATECHANGE' and \
+                 event_fields['state'] == 'revoked')):
+            notify_submiter(event_fields, data)
+
+        git_cache = os.path.join(os.getenv('GIT_CACHE_DIR'))
+        prjdir = os.path.join(git_cache, data['GIT_PROJECT'])
+
+        try:
+            gitprj = Git(prjdir)
+        except GitRepositoryError, err:
+            # clone project to local workspace if it doesn't exist in git cache
+            if not clone_gitproject(data['GIT_PROJECT'], \
+                       os.path.join(os.getenv('WORKSPACE'), data['GIT_PROJECT'])):
+                return -1
+            gitprj = Git('%s/%s' % (os.getenv('WORKSPACE'),
+                                   data['GIT_PROJECT']))
+
+        trigger_next(event_type, data)
+
+        if event_type == 'OBS_SRCSRV_REQUEST_STATECHANGE':
+            if event_fields['state'] == 'declined':
+                request_rejected(data, gerrit)
+            elif event_fields['state'] == 'revoked':
+                request_revoked(data)
+            elif event_fields['state'] == 'accepted':
+                print 'From accept'
+                request_accepted(data, gerrit, gitprj, reqinfo.get('targetpackagelist', None))
+
+        elif event_type == 'OBS_SRCSRV_REQUEST_CREATE':
+            request_created(data)
+
+        elif event_type == 'OBS_SRCSRV_REQUEST_ACCEPTED':
+            request_accepted(data, gerrit, gitprj, reqinfo.get('targetpackagelist', None))
+        elif event_type == 'OBS_SRCSRV_REQUEST_REVOKED':
+            request_revoked(data)
+
+    return data
+
+def request_github_accepted(data, targetpackagelist=[]):
+    """Do lots of things when request accepted"""
+
+    print '====request accepted===================================='
+
+    message = 'The SR (Submit Request) has been accepted to OBS %s project.\n' \
+    '- Package: %s\n' \
+    '- Reviewer: %s\n' \
+    '- Comments: %s\n' \
+    '- Git project: %s\n' \
+    '- Tag:%s\n' \
+    '- Request URL:%s' % (data['OBS_REQ_PRJ'],
+                          data['OBS_REQ_PKG'],
+                          data["OBS_REQ_SENDER"],
+                          data["OBS_REQ_COMMENT"],
+                          data['GIT_PROJECT'],
+                          data["GIT_TAG"],
+                          request_url(data['OBS_REQ_ID']))
+
+    additional_comment = REPAIR_COMMENT \
+                     % (data['OBS_REQ_ID'], os.getenv('OBS_URL_EXTERNAL'), data['OBS_REQ_ID'], \
+                        data['OBS_REQ_DESP'])
+    delete_from_obs(data['OBS_REQ_PRJ_SRC'], data['OBS_REQ_PKG_SRC'], \
+                    handle_link={'target_project': data['OBS_REQ_PRJ'], \
+                                 'comments': additional_comment, \
+                                 'target_packages': targetpackagelist})
+
+def request_github_rejected(data):
+    """When request rejected, give msg to gerrit and delete remote package"""
+
+    print '====request rejected===================================='
+
+    message = 'The SR (Submit Request) has been *rejected* ' \
+    'to OBS %s project.\n' \
+    '- Reviewer: %s\n' \
+    '- Comments: %s\n' \
+    '- Git project: %s\n' \
+    '- Tag:%s\n' \
+    '- Request URL:%s' % (data['OBS_REQ_PRJ'],
+                          data["OBS_REQ_SENDER"],
+                          data["OBS_REQ_COMMENT"],
+                          data['GIT_PROJECT'],
+                          data["GIT_TAG"],
+                          request_url(data['OBS_REQ_ID']))
+
+    delete_from_obs(data['OBS_REQ_PRJ_SRC'], data['OBS_REQ_PKG_SRC'])
+
+def request_github_revoked(data):
+    """When request revoked, delete the remote package"""
+
+    print '====request revoked===================================='
+
+    delete_from_obs(data['OBS_REQ_PRJ_SRC'], data['OBS_REQ_PKG_SRC'])
+
+def sub_request_github(event_type, event_fields, reqinfo):
+    """ sub request github """
+    try:
+        data, projects_data = obs_git_data(event_fields)
+    except GitError, err:
+        print >> sys.stderr, err
+        return []
+
+    for project_data in projects_data:
+        data.update(project_data)
+
+        if event_type == 'OBS_SRCSRV_REQUEST_STATECHANGE':
+            if event_fields['state'] == 'declined':
+                request_github_rejected(data)
+            elif event_fields['state'] == 'revoked':
+                request_github_revoked(data)
+            elif event_fields['state'] == 'accepted':
+                request_github_accepted(data, reqinfo.get('targetpackagelist', None))
+
+    return data
+
 def main():
     """The main body"""
     buildmonitor_enabled = os.getenv("BUILDMONITOR_ENABLED", "0") != "0"
@@ -430,6 +565,18 @@ def main():
     if not event_fields:
         print 'Invalid OBS event'
         return -1
+
+    # Get event type
+    event_type = event_fields['event_type']
+
+    if event_type == 'OBS_SRCSRV_REQUEST_CREATE' \
+       and 'home:prerelease:' in event_fields['sourceproject']:
+        # do not notify submitter about SR creation from prerelease projects
+        # repa immediately accepts/rejects SRs after creation, so submitter
+        # will be notified anyway
+        print 'Skipping processing of REQUEST_CREATE for prerelease project'
+        return 0
+
     # Update info of request
     build = BuildService(os.getenv('OBS_API_URL'), \
             os.getenv('OBS_API_USERNAME'), os.getenv('OBS_API_PASSWD'))
@@ -476,91 +623,11 @@ def main():
             "when": event_fields.get('when'),
             "reason": event_fields.get('comment'),
             })
-    try:
-        data, projects_data = obs_git_data(event_fields)
-    except GitError, err:
-        print >> sys.stderr, err
-        return -1
 
-    # Get event type
-    event_type = event_fields['event_type']
-
-    if event_type == 'OBS_SRCSRV_REQUEST_CREATE' \
-       and 'home:prerelease:' in event_fields['sourceproject']:
-        # do not notify submitter about SR creation from prerelease projects
-        # repa immediately accepts/rejects SRs after creation, so submitter
-        # will be notified anyway
-        print 'Skipping processing of REQUEST_CREATE for prerelease project'
-        return 0
-
-    gerrit = Gerrit(os.getenv('GERRIT_HOSTNAME_EXTERNAL'), os.getenv('GERRIT_USERNAME'),
-                    os.getenv('GERRIT_SSHPORT'),
-                    int(os.getenv('GERRIT_SILENT_MODE')))
-
-    for project_data in projects_data:
-        data.update(project_data)
-        data.update({'GIT_AUTHOR_EMAIL': '%s <%s>' % \
-                                    (project_data['author'],
-                                    project_data['email'])})
-        # Update sourcepackage and targetpackage into event_fields,
-        # becuase the multiple project have the different packages.
-        event_fields.update({'sourcepackage': project_data['OBS_REQ_PKG_SRC'],
-                             'targetpackage': project_data['OBS_REQ_PKG']})
-        if not (event_type == 'OBS_SRCSRV_REQUEST_REVOKED' or \
-                (event_type == 'OBS_SRCSRV_REQUEST_STATECHANGE' and \
-                 event_fields['state'] == 'revoked')):
-            notify_submiter(event_fields, data)
-
-        git_cache = os.path.join(os.getenv('GIT_CACHE_DIR'))
-        # Enable Github Connection
-        if event_fields.get('github'):
-            github = event_fields.get('github')
-            prjdir = os.path.join(git_cache, data['GIT_PROJECT'])
-            giturl = None
-            git_cache_dir = None
-            for item in github:
-                if data['GIT_PROJECT'] in item.get('project'):
-                    giturl = item.get('url')
-                    gitorg = giturl.split(':')[1]
-                    git_full_name = os.path.join(gitorg, data['GIT_PROJECT'])
-                    prjdir = os.path.join(git_cache, git_full_name)
-                    git_cache_dir = os.path.join(git_cache, gitorg)
-                    print "GITHUB prjdir=%s git_cache_dir=%s" %(prjdir, git_cache_dir)
-                    break
-        else: # GERRIT
-            prjdir = os.path.join(git_cache, data['GIT_PROJECT'])
-            giturl = None
-            git_cache_dir = None
-            print "GERRIT prjdir=%s git_cache_dir=%s" %(prjdir, git_cache_dir)
-        try:
-            gitprj = Git(prjdir)
-        except GitRepositoryError, err:
-            # clone project to local workspace if it doesn't exist in git cache
-            if not clone_gitproject(data['GIT_PROJECT'], \
-                       os.path.join(os.getenv('WORKSPACE'), data['GIT_PROJECT']), \
-                       giturl=giturl, git_cache_dir=git_cache_dir):
-                return -1
-            gitprj = Git('%s/%s' % (os.getenv('WORKSPACE'),
-                                   data['GIT_PROJECT']))
-
-        trigger_next(event_type, data)
-
-        if event_type == 'OBS_SRCSRV_REQUEST_STATECHANGE':
-            if event_fields['state'] == 'declined':
-                request_rejected(data, gerrit)
-            elif event_fields['state'] == 'revoked':
-                request_revoked(data)
-            elif event_fields['state'] == 'accepted':
-                print 'From accept'
-                request_accepted(data, gerrit, gitprj, reqinfo.get('targetpackagelist', None))
-
-        elif event_type == 'OBS_SRCSRV_REQUEST_CREATE':
-            request_created(data)
-
-        elif event_type == 'OBS_SRCSRV_REQUEST_ACCEPTED':
-            request_accepted(data, gerrit, gitprj, reqinfo.get('targetpackagelist', None))
-        elif event_type == 'OBS_SRCSRV_REQUEST_REVOKED':
-            request_revoked(data)
+    if event_fields.get('github'): #GITHUB
+        data = sub_request_github(event_type, event_fields, reqinfo)
+    else: #GERRIT
+        data = sub_request_gerrit(event_type, event_fields, reqinfo)
 
     # Deleting project for SR-SYNC
     if submissions and len(submissions) >= 1: