Feature : Buildmonitor_Extention 48/167248/1
authorYonghee Han <onstudy@samsung.com>
Tue, 16 Jan 2018 10:34:34 +0000 (19:34 +0900)
committerYonghee Han <onstudy@samsung.com>
Tue, 16 Jan 2018 10:34:34 +0000 (19:34 +0900)
Created to extend api that connects The Buildmonitor Database

Change-Id: Ic6e2364b4a497b3614e778c783268fc195e5322c

common/buildmonitor_extention.py [new file with mode: 0644]
common/manifest.py
common/repomaker.py
debian/jenkins-scripts-common.install
job_create_snapshot.py
job_repa_auto_reject.py
packaging/jenkins-scripts.spec

diff --git a/common/buildmonitor_extention.py b/common/buildmonitor_extention.py
new file mode 100644 (file)
index 0000000..a16a7ab
--- /dev/null
@@ -0,0 +1,283 @@
+#!/usr/bin/
+#
+# Copyright (c) 2018 Samsung Electronics.Co.Ltd.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the Free
+# Software Foundation; version 2 of the License
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+"""Buildmonitor extention"""
+
+import os
+import sys
+
+from buildmonitor_db import connect_db, disconnect_db, do_query, do_many_query, \
+                            get_multi_values_from_query_data, get_value_from_query_data
+class BuildMonitorExtention(object):
+    """ Interface to BuildMonitor(Database) """
+    def __init__(self):
+        if os.getenv("BUILDMONITOR_ENABLED", "0") != "0":
+            self.enabled = True
+            #connect
+            self.conn = connect_db()
+            self.connect = True
+        else:
+           self.enabled = False
+           self.conn = None
+           self.connect = False
+        print 'BuildMonitorExtention init'
+
+    def __enter__(self):
+        print 'BuildMonitorExtention enter'
+        return self
+    def __exit__(self, exc_type, exc_value, traceback):
+        #disconnect
+        if self.conn:
+            disconnect_db()
+            self.connect = False
+        print 'BuildMonitorExtention exit'
+
+    def is_connect(self):
+        return self.connect
+
+    def get_auto_reject_projects(self):
+        # get project in database
+        # return : list
+
+        if not self.is_connect():
+            return []
+
+        prj_list = []
+        
+        query = "SELECT name FROM main_project WHERE sr_auto_reject = %s"
+        query_data = "1"
+        projects = get_multi_values_from_query_data(query, query_data)
+        for prj in projects:
+            prj_list.append("%s" %(prj))
+    
+        return prj_list
+
+    def get_build_project_id(self, project):
+
+        if not self.is_connect():
+            return
+
+        # get post_build_project_id
+        query = "SELECT bp.id \
+                 FROM build_project bp \
+                 WHERE bp.info_project_id = (SELECT id FROM info_project WHERE project_name = %s ) \
+                 AND bp.id > (SELECT bp.id FROM build_project bp, info_project ip, build_snapshot bs \
+                 WHERE ip.project_name = %s AND ip.id = bp.info_project_id AND bp.id = bs.build_project_id \
+                 ORDER BY id desc LIMIT 1) \
+                 ORDER BY id LIMIT 1"
+        query_data = (project, project) 
+        build_project_id = get_value_from_query_data(query, query_data)
+        print "1)build_project_id(%s)" % (build_project_id)
+        if build_project_id == 0:
+            # get last_bpid_of_build_snapshot
+            query = "SELECT bp.id \
+                     FROM build_project bp, info_project ip, build_snapshot bs \
+                     WHERE ip.project_name = %s \
+                     AND ip.id = bp.info_project_id \
+                     AND bp.id = bs.build_project_id \
+                     ORDER BY id desc LIMIT 1"
+            query_data = (project,)
+            build_project_id = get_value_from_query_data(query, query_data)
+            print "2)build_project_id(%s)" % (build_project_id)
+
+        return build_project_id
+
+    def get_repository_id(self, repo_name):
+
+        if not self.is_connect():
+            return
+
+        # Select id from git_repository
+        query = "SELECT id FROM git_repository WHERE name = %s"
+        query_data = (repo_name,)
+
+        return get_value_from_query_data(query, query_data)
+
+    def update_repository(self, repo_name):
+
+        if not self.is_connect():
+            return
+
+        query = "INSERT INTO git_repository (name) SELECT * FROM (SELECT %s) AS tmp \
+                 WHERE NOT EXISTS (SELECT name FROM git_repository WHERE name = %s) LIMIT 1"
+        do_query(query, (repo_name, repo_name))
+
+    def get_commit_id(self, git_path_id, commit_id):
+
+        if not self.is_connect():
+            return
+
+        # Select id from git_commit
+        query = "SELECT id FROM git_commit WHERE git_repository_id = %s AND commit_id = %s"
+        query_data = (git_path_id, commit_id)
+
+        return get_value_from_query_data(query, query_data)
+
+    def update_commit(self, git_path_id, commit_id, commit_date, committer=None, commit_message=None):
+
+        if not self.is_connect():
+            return
+       
+        if committer and commit_message:
+            query = "INSERT INTO git_commit (git_repository_id, commit_id, committer, commit_date, commit_message) \
+                     SELECT * FROM (SELECT %s, %s, %s, %s, %s) AS tmp \
+                     WHERE NOT EXISTS (SELECT git_repository_id, commit_id \
+                     FROM git_commit WHERE git_repository_id = %s AND commit_id = %s) \
+                     LIMIT 1"
+            do_query(query, ('%d' % git_path_id, commit_id, committer, commit_date, commit_message, \
+                             '%d' % git_path_id, commit_id))
+        else:
+            query = "INSERT INTO git_commit (git_repository_id, commit_id, commit_date) \
+                     SELECT * FROM (SELECT %s, %s, %s) AS tmp \
+                     WHERE NOT EXISTS (SELECT git_repository_id, commit_id \
+                     FROM git_commit WHERE git_repository_id = %s AND commit_id = %s) \
+                     LIMIT 1"
+            do_query(query, ('%d' % git_path_id, commit_id, commit_date, \
+                             '%d' % git_path_id, commit_id))
+
+    def get_tag_id(self, git_commit_id, tag_name, tag_revision):
+
+        if not self.is_connect():
+            return
+
+        query = 'SELECT id FROM git_tag WHERE git_commit_id=%s AND tag_name=%s AND tag_revision=%s'
+        return get_value_from_query_data(query, (git_commit_id, tag_name, tag_revision))
+
+    def update_tag(self, git_commit_id, tag_name, tag_revision, tagger, tag_date, tag_message):
+
+        if not self.is_connect():
+            return
+
+        query = "INSERT INTO git_tag (git_commit_id, tag_name, tag_revision, tagger, tag_date, tag_message) \
+                 SELECT * FROM (SELECT %s, %s, %s, %s, %s, %s) AS tmp \
+                 WHERE NOT EXISTS (SELECT git_commit_id, tag_revision \
+                 FROM git_tag WHERE git_commit_id = %s AND tag_revision = %s) LIMIT 1"
+        do_query(query, ('%d' % git_commit_id, tag_name, tag_revision, tagger, tag_date, tag_message, \
+                         '%d' % git_commit_id, tag_revision))
+
+    def get_obs_package_id(self, package_name):
+
+        if not self.is_connect():
+            return
+
+        # Select id from git_repository
+        query = "SELECT id FROM obs_package WHERE name = %s"
+        query_data = (package_name,)
+
+        return get_value_from_query_data(query, query_data)
+
+    def update_obs_package(self, package_name):
+
+        if not self.is_connect():
+            return
+
+        query = "INSERT INTO obs_package (name) SELECT * FROM (SELECT %s) AS tmp \
+                 WHERE NOT EXISTS (SELECT name FROM obs_package WHERE name = %s) LIMIT 1"
+        do_query(query, (package_name, package_name))
+
+
+    def get_manifest(self, build_project_id):
+
+        if not self.is_connect():
+            return
+
+        manifest_list = []
+        # Select git_repository name
+        query = "SELECT gr.name FROM snapshot_manifest sm, git_repository gr, git_commit gc \
+                 WHERE sm.build_project_id = %s \
+                 AND gr.id = sm.git_repository_id \
+                 AND gc.id = sm.git_commit_id \
+                 GROUP BY gr.name"
+        query_data = (build_project_id,)
+        rows = get_multi_values_from_query_data(query, query_data)
+        if rows == 0:
+            return manifest_list
+        for x in rows:
+            manifest_list.append("%s" % x)
+    
+        return manifest_list
+
+    def update_manifest_bulkdata(self, manifest_data_bulk_data):
+
+        if not self.is_connect():
+            return
+
+        query = "INSERT INTO snapshot_manifest (build_project_id, git_repository_id, git_commit_id, obs_package_id, date) VALUES \
+                 (%s, %s, %s, %s, %s)"
+        do_many_query(query, manifest_data_bulk_data)
+
+    def update_sr_accept_log(self, profile, sr_tag, repa_user, comment, decision):
+
+        if not self.is_connect():
+            return
+
+        # reject
+        repa_decision_db = 'R'
+        if decision == 'accept':
+            repa_decision_db = 'A'
+    
+        query = "INSERT INTO sr_accept_log (sr, profile, repa_user, comment, decision, status) " \
+                " VALUES(%s, %s, %s, %s, %s, 'R')"
+        query_data = ( sr_tag, profile, repa_user, comment, repa_decision_db)
+        do_query(query, query_data)
+
+def put_snapshot_manifest(bm_ext, project, manifest_items, start_datetime):
+    """
+       PUT Snapshot Manifest
+    """
+    # bulk data
+    # INSERT INTO TABLE_A (A, B, C, D) VALUES
+    # (1,1,1,1),
+    # (2,2,2,2),
+    # (3,3,3,3),
+    # (4,4,4,4);
+    if not bm_ext.enabled:
+        print "Skip Put snapshot manifest..."
+        return False
+
+    build_project_id = bm_ext.get_build_project_id(project)
+    manifest_data = []
+    # getid from git_repository
+    for git_repo, git_commit, obs_name in manifest_items:
+
+        bm_ext.update_repository(git_repo)
+        git_repository_id = bm_ext.get_repository_id(git_repo)
+        
+        bm_ext.update_commit(git_repository_id, git_commit, start_datetime)
+        git_commit_id = bm_ext.get_commit_id(git_repository_id, git_commit)
+
+        bm_ext.update_obs_package(obs_name)
+        obs_pkg_name_id = bm_ext.get_obs_package_id(obs_name)
+        manifest_data.append((build_project_id, git_repository_id, git_commit_id, obs_pkg_name_id, start_datetime))
+     
+    bm_ext.update_manifest_bulkdata(manifest_data)
+
+def get_snapshot_manifest(bm_ext, project):
+    """
+    Get snapshot manifest
+    """
+    manifest_list = []
+    
+    if not bm_ext.enabled:
+        print "Skip Get snapshot manifest..."
+        return
+
+    build_project_id = bm_ext.get_build_project_id(project)
+   
+    manifest_list = bm_ext.get_manifest(build_project_id)
+
+    return manifest_list
+
+
index d72ea79..b68fd91 100644 (file)
@@ -22,6 +22,7 @@
 
 import os
 import gzip
+import re
 
 from common.utils import xml_to_obj
 
@@ -60,10 +61,11 @@ def get_package_vcs_tag(primary_md):
 
     for package in primary.package:
         vcs_tag = package.version.vcs
+        obs_package_name = re.search(r'(.*)-(.*)-(.*).src.rpm', package.format.sourcerpm).groups()[0]
         if vcs_tag:
-            ret_data.append((package.name, vcs_tag))
+            ret_data.append((obs_package_name, vcs_tag))
         else:
-            ret_data.append((package.name, ""))
+            ret_data.append((obs_package_name, ""))
 
     return ret_data
 
index 29be8c2..ebfe364 100644 (file)
@@ -331,14 +331,16 @@ class RepoMaker(object):
         package_vcs_tag = manifest.get_package_vcs_tag(repo_primary)
         # tuple set in (gitprj, git_path, revision)
         data = set([])
-
+        manifestdata = set([])
         for pkg in package_vcs_tag:
             try:
                 git_prj, commit_id = pkg[1].split('#')
                 data.add((git_prj, git_prj, commit_id))
+                manifestdata.add((pkg[0], git_prj, commit_id))
             except ValueError:
                 # No vcs tag found
                 data.add((pkg[0], '', ''))
+                manifestdata.add((pkg[0], '', ''))
 
         manifest_string = manifest.gen_repo_manifest(sorted(data),
                                             gerrit_fetch_url,
@@ -350,9 +352,8 @@ class RepoMaker(object):
 
         manifest_items = []
         try:
-            tree = ElementTree.fromstring(manifest_string)
-            for project in tree.findall('project'):
-                manifest_items.append({project.get('path'): project.get('revision')})
+            for pkg in manifestdata:
+               manifest_items.append({pkg[1]: [pkg[2],pkg[0]]})
         except Exception as err:
             print repr(err)
         return manifest_items
index d52707d..8591eec 100644 (file)
@@ -21,6 +21,7 @@ debian/tmp/common/apply_scm_meta_git.py /var/lib/jenkins/jenkins-scripts/common/
 debian/tmp/common/check_scm_meta_git.py /var/lib/jenkins/jenkins-scripts/common/
 debian/tmp/common/git_diff_parse.py /var/lib/jenkins/jenkins-scripts/common/
 debian/tmp/common/buildmonitor_db.py /var/lib/jenkins/jenkins-scripts/common/
+debian/tmp/common/buildmonitor_extention.py /var/lib/jenkins/jenkins-scripts/common/
 debian/tmp/common/git_obs_mapping.py /var/lib/jenkins/jenkins-scripts/common/
 debian/tmp/job_re.py /var/lib/jenkins/jenkins-scripts/
 debian/tmp/job_create_snapshot.py /var/lib/jenkins/jenkins-scripts/
index 7924e23..07c7a97 100755 (executable)
@@ -33,6 +33,7 @@ from common.backenddb import BackendDB
 from common.snapshot import Snapshot, SnapshotError, snapshot_project_enabled
 from common.utils import make_latest_link
 from common.send_mail import prepare_mail
+from common.buildmonitor_extention import BuildMonitorExtention, put_snapshot_manifest
 
 class LocalError(Exception):
     """Local error exception."""
@@ -135,6 +136,7 @@ def make_repo(project, backenddb, base_path, live_repo_base):
     repos = {}
     imagedatas = {}
     duplicated_report = []
+    manifestdata = []
 
     if buildmonitor_enabled:
         bm_snapshot_name = local_build_id
@@ -281,6 +283,9 @@ def make_repo(project, backenddb, base_path, live_repo_base):
                                     os.getenv('GERRIT_FETCH_URL'),
                                     os.getenv('GERRIT_REVIEW_URL'),
                                     live_repo_path, repo['Architectures'])
+        
+        # Add Manifest data
+        manifestdata.extend(list(set([ (t.keys()[0],t[t.keys()[0]][0], t[t.keys()[0]][1]) for t in manifest_items])))
         # Check duplicated items
         path_list = [ t.keys()[0] for t in manifest_items if t.keys()[0] ]
         duplicated = set([x for x in path_list if path_list.count(x) > 1])
@@ -297,7 +302,8 @@ def make_repo(project, backenddb, base_path, live_repo_base):
             'repo_path': os.path.join(local_dir, local_build_id),
             'build_id': local_build_id,
             'imagedata': imagedatas,
-            'duplicated': duplicated_report
+            'duplicated': duplicated_report,
+            'manifestdata': manifestdata,
         }
 
 def main():
@@ -323,6 +329,7 @@ def main():
     project = content.get("project")
 
     build = BuildService(obs_api, obs_user, obs_passwd)
+    bm_ext = BuildMonitorExtention()
 
     unresolvable_broken_packages = {}
     BuildFailReason = 'Succeeded'
@@ -386,6 +393,13 @@ def main():
     data = repo_data.copy()
     # remove unused item
     data.pop('imagedata')
+
+    #INSERT MANIFEST DATA TO BUILDMONITOR 
+    if data.get('manifestdata'):
+        put_snapshot_manifest(bm_ext, project, data.get('manifestdata'), bm_start_datetime)
+        # remove unused item
+        data.pop('manifestdata')
+
     parm_backend = {}
     for bknd in list(reversed(range(1,99))):
         if os.getenv('BACKEND_%02d_REGEX' % bknd) and \
index 7392511..17e5455 100644 (file)
@@ -29,8 +29,8 @@ import shutil
 from common.buildservice import BuildService
 from common.buildtrigger import trigger_info, trigger_next
 from common import runner
-from common import buildmonitor_db
 from datetime import datetime
+from common.buildmonitor_extention import BuildMonitorExtention
 
 # set default char-set endcoding to utf-8
 reload(sys)
@@ -107,34 +107,6 @@ def auto_reject_submission_list(build, target, purge_day=14, processes=20):
     
     return purge_sr_tag
 
-def get_project_config():
-    # get project in database
-    # return : list
-    projectlist = []
-    
-    query = "SELECT name " \
-            " FROM main_project WHERE sr_auto_reject = %s"
-    query_data = "1"
-    projects = buildmonitor_db.get_multi_values_from_query_data(query, query_data)
-    for project in projects:
-        print 'project = %s ' %(project)
-        projectlist.append("%s" %(project))
-
-    return projectlist
-
-def insert_repa_reject(profile, sr_tag, repa_user, comment, decision):
-    print "[%s] insert_repa %s, %s, %s, %s, %s\n", (__file__, sr_tag, profile, repa_user, comment, \
-                                                decision)
-    # reject
-    repa_decision_db = 'R'
-    if decision == 'accept':
-        repa_decision_db = 'A'
-  
-    query = "INSERT INTO sr_accept_log (sr, profile, repa_user, comment, decision, status) " \
-            " VALUES(%s, %s, %s, %s, %s, 'R')"
-    query_data = ( sr_tag, profile, repa_user, comment, repa_decision_db)
-    buildmonitor_db.do_query(query, query_data)
-
 def trigger_next_to_repa(project, tag, obs_user, decision, comment, count):
     """ trigger next to repa """
 
@@ -157,22 +129,19 @@ def main():
     print '---[JOB STARTED: repa auto reject]-------------------------'
 
     build = BuildService(obs_api, obs_user, obs_passwd)
-
-    buildmonitor_db.connect_db()
+    bm_ext = BuildMonitorExtention()
 
     count = 0
     repa_decision = 'declined'
 
-    for project in get_project_config():
+    for project in bm_ext.get_auto_reject_projects():
         for sr_tag in auto_reject_submission_list(build, project):
             print 'sr_tag : %s' %(sr_tag)
             repa_comment = "Auto Rejected Submission " + sr_tag
-            insert_repa_reject( project, sr_tag, obs_user, repa_comment, repa_decision)
+            bm_ext.update_sr_accept_log( project, sr_tag, obs_user, repa_comment, repa_decision)
             trigger_next_to_repa(project, sr_tag, obs_user, repa_decision, repa_comment, count)
             count += count + 1
 
-    buildmonitor_db.disconnect_db()
-
     return 0
 
 if __name__ == '__main__':
index e9c7faa..1ac6644 100644 (file)
@@ -210,6 +210,7 @@ fi
 %{destdir}/common/check_scm_meta_git.py
 %{destdir}/common/git_diff_parse.py
 %{destdir}/common/buildmonitor_db.py
+%{destdir}/common/buildmonitor_extention.py
 %{destdir}/common/git_obs_mapping.py
 %{destdir}/job_re.py
 %{destdir}/job_create_snapshot.py