TPE-302 Send mail noti after SR sync 40/147440/2
authorhyokeun <hyokeun.jeon@samsung.com>
Mon, 4 Sep 2017 09:52:04 +0000 (18:52 +0900)
committerhyokeun <hyokeun.jeon@samsung.com>
Mon, 4 Sep 2017 10:27:31 +0000 (19:27 +0900)
Change-Id: Ife558246207c160bc9f86c131c6f588c1f6a3a5a

common/workflow.py
job_submit_request_sync.py

index 1d55a04..25ce3c9 100644 (file)
@@ -26,6 +26,7 @@ import sys
 import json
 import re
 import requests
+import ast
 import xml.etree.cElementTree as ElementTree
 from xml.sax.saxutils import escape
 from time import sleep
@@ -38,6 +39,8 @@ from common.upload_service import upload_obs_service, UploadError
 from common.prerelease import get_info_from_prerelease_name
 from common.git import Git, clone_gitproject
 from common.gerrit import GerritEnv, GerritError
+from common import runner
+from common.send_mail import prepare_mail
 
 from gbp.rpm import SpecFile
 from gbp.git.repository import GitRepositoryError
@@ -81,6 +84,82 @@ NOT_ANNOTATED_MSG = '- Tag should be annotated tag.'
 
 SUGGESTION = 'Suggest to use "gbs submit" to trigger submission\n'\
 
+class MailSender(object):
+    email_title = ''
+    email_head  = ''
+    email_body = ''
+    email_footer = '\n\n--------------------------------------------------------\n'\
+                   'Automatically generated by backend service.\n'\
+                   'Please DO NOT Reply!'
+    email_to = []
+
+    def __init__(self, receiver=None, title=None, body=None):
+        if receiver is not None: self.email_to = receiver
+        if title is not None: self.email_title = title
+        if body is not None: self.email_body = body
+
+    def add_receiver(self, add_new):
+        """ add receiver """
+        if type(add_new) == list:
+            self.email_to.extend(x for x in add_new)
+        elif type(add_new) == str:
+            self.email_to.append(add_new)
+        else:
+            print 'TYPE(%s) == %s' % (add_new, type(add_new))
+        self.email_to = list(set(self.email_to))
+
+    def add_title(self, add_new):
+        """ add title """
+        self.email_title = self.email_title + ' ' + add_new
+
+    def add_message(self, add_new, top=None):
+        """ add message """
+        if top is not None:
+            self.email_body = add_new + '\n' + self.email_body
+        else:
+            self.email_body = self.email_body + '\n' + add_new
+
+    def add_maintainers(self, mygerrit, group_name=None, project=None):
+        """ add maintainers """
+        if not mygerrit:
+            print 'mygerrit is Null...'
+            return
+
+        if not project and group_name:
+            mbrs = mygerrit.ls_members(['\'\"%s\"\'' % group_name, '--recursive'])
+            for line in mbrs:
+                self.add_receiver(line.split('\t')[3])
+            return
+
+        if project:
+            grps = mygerrit.ls_groups(['--project %s' % project])
+            dest_grp = [s for s in grps if " - Maintainers" in s]
+            for dg in dest_grp:
+                mbrs = mygerrit.ls_members(['\'\"%s\"\'' % dg, '--recursive'])
+                for line in mbrs:
+                    self.add_receiver(line.split('\t')[3])
+            return
+
+    def send_mail(self):
+        """ send mail """
+        self.email_body = self.email_head + self.email_body + self.email_footer
+
+        self.email_to = [x for x in self.email_to if x != 'n/a']
+        print '\n\n'
+        print self.email_title
+        #m_body = ''
+        #for m in self.email_body.splitlines():
+        #    m_body += '\n'.join(m[i:i+128] for i in xrange(0, len(m), 128)) + '\n'
+        #self.email_body = m_body
+        print self.email_body
+        print self.email_to
+
+        prepare_mail("%s.env" % os.getenv('BUILD_TAG'), \
+                     self.email_title, \
+                     self.email_body, \
+                     os.getenv('NOREPLY_EMAIL_SENDER'), \
+                     self.email_to)
+
 def parse_submit_tag(tag):
     """parse info from submit tag name"""
 
index 2ed8126..a4e026a 100644 (file)
@@ -29,14 +29,16 @@ import ast
 import copy
 
 from common.buildtrigger import trigger_next, trigger_info
-from common.mapping import git_obs_map, git_virtual_branch_map, git_obs_map_full_list
+from common.mapping import git_obs_map, git_obs_map_full_list
 from common import utils
-from gbp.rpm import SpecFile
-from gbp.errors import GbpError
-from common.git import Git, clone_gitproject
-from common.gerrit import GerritEnv
+#from gbp.rpm import SpecFile
+#from gbp.errors import GbpError
+#from common.git import Git, clone_gitproject
+from common.gerrit import GerritEnv, Gerrit
 
-from common.workflow import get_manifest_filelists_snapshot, get_info_from_tag
+from common.workflow import get_info_from_tag
+
+from common.workflow import MailSender
 
 # set default char-set endcoding to utf-8
 reload(sys)
@@ -180,6 +182,7 @@ def main():
         target_fork_prefix = target['fork']
         branch = target['branch']
         source_branch = target['source_branch']
+        notify_domain = target['notify']
 
         if True:
             project_to_create = 'home:prerelease:%s:submit:%s:%s' \
@@ -218,11 +221,11 @@ def main():
                             item.get('Project_name', '') == repo:
                             bSetHighlight = False
                             bDeleted = True
-
+                    marked_repo = {'cid': cid, 'submitter': smtr, 'snapshot': sn, 'deleted': bDeleted}
                     if bSetHighlight:
-                        marked_repo = {'repo': HIGHLIGHT + repo, 'cid': cid, 'submitter': smtr, 'snapshot': sn, 'deleted': bDeleted}
+                        marked_repo['repo'] = HIGHLIGHT + repo
                     else:
-                        marked_repo = {'repo': GREYEDOUT + repo, 'cid': cid, 'submitter': smtr, 'snapshot': sn, 'deleted': bDeleted}
+                        marked_repo['repo'] = GREYEDOUT + repo
                     if marked_repo not in _sr_list[_sr_tag]:
                         _sr_list[_sr_tag].append(marked_repo)
                 if _sr_list[_sr_tag]:
@@ -231,6 +234,7 @@ def main():
                 ret_data['requests'].append(_conv)
         print '\nret_data:\n%s\n' % ret_data
 
+        myGerritEnv = GerritEnv('PUBLIC_')
         # Find OBS package name and trigger OBS project creation job
         for req in ret_data['requests']:
             print '  + Make requests: [%s]\n    %s\n' \
@@ -243,10 +247,9 @@ def main():
                         smtr = item.get('submitter')
                         sn = item.get('snapshot')
                         _package = ''
-
                         if True:#git.startswith(HIGHLIGHT):
                             _tag_info = get_info_from_tag(git[1:], source_branch, project, \
-                                                          submit, GerritEnv('PUBLIC_'))
+                                                          submit, myGerritEnv)
                             _package = _tag_info.get('spec_name', None)
                             _commit_id = _tag_info.get('commit_id', None)
                             if _package is None:
@@ -255,6 +258,7 @@ def main():
                                 requests_item[project_to_create].append({'package': _package, \
                                                                          'git_tag': submit, \
                                                                          'cid': _commit_id, \
+                                                                         'rev': cid, \
                                                                          'submitter': smtr, \
                                                                          'gerrit_project': git, \
                                                                          'deleted': item.get('deleted'), \
@@ -264,13 +268,14 @@ def main():
         # Split request into smaller part
         split_step = 100
         for r in xrange(0, len(requests_item[project_to_create]), split_step):
-            trigger_next('PRE_RELEASE_REQUEST_%s_%d' % (target['target'], r), \
+            trigger_next('PRE_RELEASE_REQUEST_%s_%d' % (target['target'], (r/split_step)+1), \
                          {'requests': [{project_to_create: requests_item[project_to_create][r:(r+split_step)]}], \
                           'obs_target_prj': project, \
                           'url': git_url, \
                           'obs_dest_prj': target['target'], \
                           'reason': reason, \
-                          'snapshot': snapshot})
+                          'snapshot': snapshot,
+                          'index_sequence': '%d-%d' % ((r/split_step)+1, len(requests_item[project_to_create]))})
 
             bm_end_datetime = datetime.now()
             bm_sync_git_tag = project_to_create.split(':'+target['target']+':')[-1].replace(':','/')
@@ -292,6 +297,54 @@ def main():
                       }
             trigger_next("BUILD-MONITOR_%s_%d" % (bm_stage, r), bm_data)
 
+        # Mail notification
+        mymail = MailSender()
+        if len(snapshot.split(',')) > 1:
+            mymail.add_title('[SR-Sync] %s(Manual) => %s' % (ret_data.get('project'), target_project))
+        else:
+            mymail.add_title('[SR-Sync] %s(%s) => %s' % (ret_data.get('project'), snapshot, target_project))
+        mymail.add_message('Hello\n\nA virtual SR has been triggered for the below configuration;\n')
+        mymail.add_message('Source:')
+        mymail.add_message('  Project  : %s' % ret_data.get('project'))
+        mymail.add_message('  Snapshots: %s' % snapshot)
+        mymail.add_message('  Branch   : %s' % source_branch)
+        mymail.add_message('Target')
+        mymail.add_message('  Project  : %s' % target_project)
+        mymail.add_message('  Branch   : %s' % branch)
+        mymail.add_message('\nOBS Project: %s' % project_to_create)
+
+        packages_to_be_synced = [ {'repo': x['gerrit_project'][1:],
+                                   'package': x['package'],
+                                   'tag': x['git_tag']}
+                                  for x in requests_item[project_to_create]
+                                  if x['gerrit_project'].startswith(HIGHLIGHT) ]
+        packages_to_be_skipped = [ {'repo': x['gerrit_project'][1:],
+                                    'package': x['package'],
+                                    'tag': x['git_tag']}
+                                   for x in requests_item[project_to_create]
+                                   if x['gerrit_project'].startswith(GREYEDOUT) ]
+
+        mymail.add_message('\nPACKAGES TO BE SYNCED (%d)' % len(packages_to_be_synced))
+        mymail.add_message('====')
+        for pt in packages_to_be_synced:
+            mymail.add_message('%-15s: %s' % (pt['package'], pt['repo']))
+        mymail.add_message('\nPACKAGES TO BE SKIPPED (%d)' % len(packages_to_be_skipped))
+        mymail.add_message('====')
+        for pt in packages_to_be_skipped:
+            mymail.add_message('%s' % (pt['repo']))
+
+        private_gerrit = Gerrit(os.getenv('GERRIT_HOSTNAME'),
+                                os.getenv('GERRIT_USERNAME'),
+                                os.getenv('GERRIT_SSHPORT'),
+                                int(os.getenv('GERRIT_SILENT_MODE')))
+
+        # Add maintatiners to mail
+        [mymail.add_maintainers(private_gerrit, group_name = name) for name in notify_domain]
+
+        mymail.send_mail()
+        del mymail
+
+
 if __name__ == '__main__':
     sys.exit(main())