From 83fa2d778bdca472c22605222fb2f65508300479 Mon Sep 17 00:00:00 2001 From: Yonghee Han Date: Thu, 22 Feb 2018 12:08:55 +0900 Subject: [PATCH] Fixed request job for the github connection Need to update github info to OBS description Add delete obs prelease project for accepted tag Change-Id: Id04637776e85a448782f874670f2b22a70b54490 --- common/workflow.py | 11 ++- job_request.py | 257 +++++++++++++++++++++++++++++++++-------------------- 2 files changed, 169 insertions(+), 99 deletions(-) diff --git a/common/workflow.py b/common/workflow.py index 7d4f5ea..b82fd42 100644 --- a/common/workflow.py +++ b/common/workflow.py @@ -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 = [] diff --git a/job_request.py b/job_request.py index 3c5c738..f0fd064 100755 --- a/job_request.py +++ b/job_request.py @@ -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: -- 2.7.4