[Buildmonitor] Added the build data logging parts for BuildMonitor 16/95416/3
authorSungHun Hwang <sh0924.hwang@samsung.com>
Thu, 3 Nov 2016 04:45:43 +0000 (13:45 +0900)
committerSungHun Hwang <sh0924.hwang@samsung.com>
Thu, 3 Nov 2016 11:58:01 +0000 (20:58 +0900)
1. Added the build data logging parts in for BuildMonitor dashboard
   which can show the status of each build steps from beginning to the end

2. The related actions and python files are as below
  (1) gbs submit --------------- [job_submit.py]
  (2) [pre] packae build ------- [on OBS]
  (3) [pre] snapshot create ---- [job_pre_release_obs.py]
  (4) [pre] image creation  ---- [job_imager.py][job_post_imager.py]
  (5) SR accept or reject ------ [job_request.py]
  (6) [post] package build ----- [on OBS]
  (7) [post] snapshot creation - [job_create_snapshot.py]
  (8) [post] image creation ---- [job_imager.py]
  (9) Completed
  * pre : pre build / post : post build

3. The buildmonitor.py is the common interface file

Change-Id: Id97e8c5e131dc11713fdf58bbb0b794907cedaa1
Signed-off-by: SungHun Hwang <sh0924.hwang@samsung.com>
common/buildmonitor.py [new file with mode: 0644]
common/buildmonitor_db.py [new file with mode: 0644]
job_create_snapshot.py
job_imager.py
job_post_image.py
job_pre_release_obs.py
job_request.py
job_submit.py
packaging/jenkins-scripts.spec

diff --git a/common/buildmonitor.py b/common/buildmonitor.py
new file mode 100644 (file)
index 0000000..2446c6d
--- /dev/null
@@ -0,0 +1,974 @@
+#!/usr/bin/env python
+#
+# Copyright (c) 2016 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 APIs
+
+1. Actions & Related files
+  (1) gbs submit --------------- [job_submit.py]
+  (2) [pre] packae build ------- [on OBS]
+  (3) [pre] snapshot create ---- [job_pre_release_obs.py]
+  (4) [pre] image creation  ---- [job_imager.py][job_post_imager.py]
+  (5) SR accept or reject ------ [job_request.py]
+  (6) [post] package build ----- [on OBS]
+  (7) [post] snapshot creation - [job_create_snapshot.py]
+  (8) [post] image creation ---- [job_imager.py]
+  (9) Completed
+  * pre : pre build / post : post build
+
+2. function naming rules
+
+[ACTION]_for_[TABLE]
+
+ex) sr_submit_for_sr_status
+ACTION : gbs submit
+TABLE  : sr_status
+
+3. db table list
+
+[SR    parts] sr_stage | sr_status | sr_commit | sr_status_details
+[BUILD parts] build_snapshot | build_snapshot_package | build_image
+"""
+
+
+import os
+import sys
+import datetime
+import buildmonitor_db
+
+#===============================================================================
+# connect & disconnect db
+
+def bm_connect_db():
+    buildmonitor_db.connect_db()
+
+def bm_disconnect_db():
+    buildmonitor_db.disconnect_db()
+
+#===============================================================================
+# [job_submit.py]
+
+def sr_submit_for_sr_status(ter_git_tag):
+    print '[%s] enter sr_submit_for_sr_status\n' % (__file__)
+
+    # get curr_sr_status_id
+    query = "SELECT id FROM sr_status WHERE sr = %s"
+    query_data = (ter_git_tag)
+    curr_sr_status_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+    #print '[%s] curr_sr_status_id(%s)\n' % (__file__, curr_sr_status_id)
+
+    if curr_sr_status_id == 9876 or curr_sr_status_id == 0:
+        query = "INSERT INTO sr_status (sr, status) VALUES(%s, %s)"
+        query_data = (ter_git_tag, 'C')
+        buildmonitor_db.do_query(query, query_data)
+    else:
+        print '[%s] Already existing sr_status_id(%s) skip INSERT sr_stage\n' \
+                % (__file__, curr_sr_status_id)
+
+def sr_submit_for_sr_commit(mygit, git_tag, gerrit_project,
+                            gerrit_newrev, gerrit_account_name):
+    print '[%s] enter sr_submit_for_sr_commit\n' % (__file__)
+
+    commit_date, cd_err, cd_ret = mygit._git_inout('show', ['-s', '--format=%ci'])
+    commit_msg, cm_err, cm_ret = mygit._git_inout('show', ['-s', '--format=%s'])
+    submit_date, sd_err, sd_ret = mygit._git_inout('for-each-ref', \
+                ['--count=1', '--sort=-taggerdate', '--format=%(taggerdate:iso)'])
+    submit_msg, sm_err, sm_ret = mygit._git_inout('for-each-ref', \
+                ['--count=1', '--sort=-taggerdate', '--format=%(subject)'])
+    submitter, st_err, st_ret = mygit._git_inout('for-each-ref',\
+                ['--count=1', '--sort=-taggerdate', '--format=%(taggeremail)'])
+    #print '[%s] %s%s' % (__file__, commit_date, commit_msg)
+    #print '[%s] %s%s%s' % (__file__, submit_date, submit_msg, submitter)
+
+    # get current_sr_status_id (should be here, after sr_submit_for_sr_status)
+    query = "SELECT id FROM sr_status WHERE sr = %s"
+    query_data = (git_tag)
+    curr_sr_status_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+    #print '[%s] curr_sr_status_id(%s)\n' % (__file__, curr_sr_status_id)
+
+    obs_pkg_name = os.path.basename(gerrit_project)
+    ter_submitter = submitter.split('@')[0].strip('<')
+    #print '[%s] ter_submitter(%s)' % (__file__, ter_submitter)
+
+    query = "INSERT INTO sr_commit (sr_status_id, git_repository," \
+            "obs_package_name, git_commit_id, git_commit_date, "   \
+            "git_commit_message, git_committer, sr_submit_date, "  \
+            "sr_submit_message, sr_submitter) " \
+            "VALUES(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"
+    query_data = (curr_sr_status_id, gerrit_project, obs_pkg_name,
+                    gerrit_newrev, commit_date, commit_msg,
+                    gerrit_account_name, submit_date, submit_msg,
+                    ter_submitter)
+    buildmonitor_db.do_query(query, query_data)
+
+def start_pre_build_for_sr_stage(git_tag, ter_start_datetime,
+                                 ter_end_datetime, pre_build_project_id):
+    print '[%s] enter start_pre_build_for_sr_stage\n' % (__file__)
+
+    # get current_sr_status_id (should be here after sr_submit_for_sr_status)
+    query = "SELECT id FROM sr_status WHERE sr = %s"
+    query_data = (git_tag)
+    curr_sr_status_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+    #print '[%s] curr_sr_status_id(%s)\n' % (__file__, curr_sr_status_id)
+
+    ### [1] end stage : SR submit
+    info_stage_id = 1
+    query = "UPDATE sr_stage SET stage_end_time = %s, stage_status = %s " \
+            "WHERE sr_status_id = %s AND info_stage_id = %s AND build_project_id = %s"
+    query_data = (ter_end_datetime, 'S', curr_sr_status_id, info_stage_id, pre_build_project_id)
+    buildmonitor_db.do_query(query, query_data)
+
+    ### [2] start stage : [pre] package build
+    ter_start_datetime = ter_end_datetime
+    info_stage_id = 2
+    query = "INSERT INTO sr_stage (sr_status_id, info_stage_id, stage_start_time, " \
+            "stage_status, build_project_id) VALUES(%s, %s, %s, %s, %s)"
+    query_data = (curr_sr_status_id, info_stage_id, ter_start_datetime, 'R', pre_build_project_id)
+    buildmonitor_db.do_query(query, query_data)
+
+def sr_submit_for_sr_stage(curr_sr_status_id, ter_start_datetime,
+                           ter_end_datetime, pre_build_project_id):
+    print '[%s] enter sr_submit_for_sr_stage\n' % (__file__)
+
+    ### [1] SR submit
+    info_stage_id = 1
+    query = "INSERT INTO sr_stage (sr_status_id, info_stage_id, stage_start_time, " \
+            "stage_end_time, stage_status, build_project_id) VALUES(%s, %s, %s, %s, %s, %s)"
+    query_data = (curr_sr_status_id, info_stage_id, ter_start_datetime,
+                  ter_end_datetime, 'S', pre_build_project_id)
+    buildmonitor_db.do_query(query, query_data)
+
+def package_build_for_sr_detail_sr_stage(git_tag, ter_start_datetime,
+                                         ter_end_datetime, ter_src_project_lst):
+    print '[%s] enter package_build_for_sr_detail_sr_stage\n' % (__file__)
+
+    # get current_sr_status_id (should be here after sr_submit_for_sr_status)
+    query = "SELECT id FROM sr_status WHERE sr = %s"
+    query_data = (git_tag)
+    curr_sr_status_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+    #print '[%s] curr_sr_status_id(%s)\n' % (__file__, curr_sr_status_id)
+
+    ### for sr_status_detail & sr_stage
+    # ter_src_project_lst is needed for multi profile
+    print '[%s] ter_src_project_lst(%s)\n' % (__file__, ter_src_project_lst)
+    for ter_src_project in ter_src_project_lst:
+        #print '[%s] ter_src_project(%s)\n' % (__file__, ter_src_project)
+
+        # get info_project_id -> get pre_build_project_id
+        query = "SELECT id FROM info_project WHERE project_name = %s"
+        query_data = (ter_src_project)
+        info_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+        query = "SELECT id FROM build_project WHERE info_project_id = %s"
+        query_data = (info_project_id)
+        pre_build_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+        print '[%s] info_project_id(%s), pre_build_project_id(%s)\n' \
+               % (__file__, info_project_id, pre_build_project_id)
+
+        # get sr_status_detail_id for checking group submit
+        query = "SELECT id FROM sr_status_detail WHERE sr_status_id = %s " \
+                "AND pre_build_project_id = %s"
+        query_data = (curr_sr_status_id, pre_build_project_id)
+        sr_status_detail_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+        #print '[%s] sr_status_detail_id(%s)\n' % (__file__, sr_status_detail_id)
+
+        if sr_status_detail_id == 9876 or sr_status_detail_id == 0:
+            # get pre_build_project_id
+            query = "SELECT id FROM build_project WHERE info_project_id = %s"
+            query_data = (info_project_id)
+            pre_build_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+
+            ### for sr_status_detail
+            query = "INSERT INTO sr_status_detail (sr_status_id, pre_build_project_id) " \
+                    "VALUES(%s, %s)"
+            query_data = (curr_sr_status_id, pre_build_project_id)
+            buildmonitor_db.do_query(query, query_data)
+
+            ### for sr_stage for multi profile
+            # [1] start stage
+            sr_submit_for_sr_stage(curr_sr_status_id, ter_start_datetime,
+                                   ter_end_datetime, pre_build_project_id)
+            # [1] end stage / [2] start stage
+            start_pre_build_for_sr_stage(git_tag, ter_start_datetime,
+                                         ter_end_datetime, pre_build_project_id)
+        else:
+            # clear the existing tables (sr_stage & build_snapshot)
+            print '[%s] Already existing sr_status_id(%s)!! clear the related tables\n' \
+                  % (__file__, sr_status_detail_id)
+            query = "DELETE FROM sr_stage WHERE sr_status_id = %s AND build_project_id = %s"
+            query_data = (curr_sr_status_id, pre_build_project_id)
+            buildmonitor_db.do_query(query, query_data)
+
+            # get build_snapshot_id for deleting build_snapshot_package & build_image
+            query = "SELECT id FROM build_snapshot WHERE build_project_id = %s"
+            query_data = (pre_build_project_id)
+            build_snapshot_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+
+            # delete build_snapshot & build_snapshot_package & build_image
+            query = "DELETE FROM build_snapshot WHERE build_project_id = %s"
+            query_data = (pre_build_project_id)
+            buildmonitor_db.do_query(query, query_data)
+            query = "DELETE FROM build_snapshot_package WHERE build_snapshot_id = %s"
+            query_data = (build_snapshot_id)
+            buildmonitor_db.do_query(query, query_data)
+            query = "DELETE FROM build_image WHERE build_snapshot_id = %s"
+            query_data = (build_snapshot_id)
+            buildmonitor_db.do_query(query, query_data)
+
+            ### for sr_stage for multi profile
+            # [1] start stage
+            sr_submit_for_sr_stage(curr_sr_status_id, ter_start_datetime,
+                                   ter_end_datetime, pre_build_project_id)
+            # [1] end stage / [2] start stage
+            start_pre_build_for_sr_stage(git_tag, ter_start_datetime,
+                                         ter_end_datetime, pre_build_project_id)
+
+#===============================================================================
+# [job_pre_release_obs.py]
+
+def update_fail_status_for_sr_stage(project, ter_git_tag):
+    print '[%s] enter update_fail_status_for_sr_stage\n' % (__file__)
+
+    # get curr_sr_status_id
+    query = "SELECT id FROM sr_status WHERE sr = %s"
+    query_data = (ter_git_tag)
+    curr_sr_status_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+    #print '[%s] curr_sr_status_id (%s)\n' % (__file__, curr_sr_status_id)
+
+    # get curr_info_project_id -> get curr_build_project_id for multi profile
+    query = "SELECT id FROM info_project WHERE project_name = %s"
+    query_data = (project)
+    curr_info_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+    query = "SELECT id FROM build_project WHERE info_project_id = %s"
+    query_data = (curr_info_project_id)
+    curr_build_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+
+    ### [3] stage end : update fail status [pre] snapshot creation
+    info_stage_id = 3
+    query = "UPDATE sr_stage SET stage_status = %s WHERE sr_status_id = %s " \
+            "AND info_stage_id = %s AND build_project_id = %s"
+    query_data = ('F', curr_sr_status_id, info_stage_id, curr_build_project_id)
+    buildmonitor_db.do_query(query, query_data)
+
+def start_pre_create_snapshot_for_sr_stage(project, ter_git_tag, ter_start_datetime):
+    print '[%s] enter start_pre_create_snapshot_for_sr_stage\n' % (__file__)
+
+    # get curr_sr_status_id
+    query = "SELECT id FROM sr_status WHERE sr = %s"
+    query_data = (ter_git_tag)
+    curr_sr_status_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+
+    # get curr_info_project_id -> get curr_build_project_id for multi profile
+    query = "SELECT id FROM info_project WHERE project_name = %s"
+    query_data = (project)
+    curr_info_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+    query = "SELECT id FROM build_project WHERE info_project_id = %s"
+    query_data = (curr_info_project_id)
+    curr_build_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+
+    # get multi_build_status from build_target
+    query = "SELECT status FROM build_target WHERE build_project_id = %s " \
+            "AND last_flag = %s"
+    query_data = (curr_build_project_id, 'Y')
+    multi_build_status = buildmonitor_db.get_multi_values_from_query_data(query, query_data)
+    print '[%s] multi_build_status(%s)\n' % (__file__, multi_build_status)
+
+    # default 'S'
+    info_stage_status = 'S'
+    for each_build_status in multi_build_status:
+        #print '[%s] each_build_status(%s)\n' % (__file__, each_build_status)
+        if each_build_status[0] == 'F':
+            info_stage_status = 'F'
+            print '[%s] failed!! info_stage_status(%s)\n' % (__file__, info_stage_status)
+
+    ### [2] stage end : [pre] package build
+    info_stage_id = 2
+    ter_end_datetime = ter_start_datetime
+    query = "UPDATE sr_stage SET stage_end_time = %s, stage_status = %s " \
+            "WHERE sr_status_id = %s AND info_stage_id = %s AND build_project_id = %s"
+    query_data = (ter_end_datetime, info_stage_status, curr_sr_status_id,
+                  info_stage_id, curr_build_project_id)
+    buildmonitor_db.do_query(query, query_data)
+
+    ### [3] stage start : [pre] snapshot creation
+    info_stage_id = 3
+    query = "INSERT INTO sr_stage (sr_status_id, info_stage_id, stage_start_time, " \
+            "stage_status, build_project_id) VALUES(%s, %s, %s, %s, %s)"
+    query_data = (curr_sr_status_id, info_stage_id,
+                  ter_start_datetime, 'R', curr_build_project_id)
+    buildmonitor_db.do_query(query, query_data)
+
+def start_pre_create_snapshot_for_build_snapshot(project, ter_start_datetime):
+    print '[%s] enter start_pre_create_snapshot_for_build_snapshot\n' % (__file__)
+
+    # get pre_info_project_id -> get pre_build_project_id
+    query = "SELECT id FROM info_project WHERE project_name = %s"
+    query_data = (project)
+    pre_info_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+    query = "SELECT id FROM build_project WHERE info_project_id = %s"
+    query_data = (pre_info_project_id)
+    pre_build_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+    #print '[%s] pre_info_project_id(%s), pre_build_project_id(%s)\n' \
+    #      % (__file__, pre_info_project_id, pre_build_project_id)
+
+    ### for build_snapshot
+    query = "INSERT INTO build_snapshot (build_project_id, start_time, status) " \
+            "VALUES(%s, %s, %s)"
+    query_data = (pre_build_project_id, ter_start_datetime, 'R')
+    buildmonitor_db.do_query(query, query_data)
+
+def create_snapshot_packages_for_build_snapshot_package(project, ter_snapshot_name,
+                                                        ter_repo, ter_arch, ter_pkg_urls_dic,
+                                                        base_url,base_path):
+    print '[%s] enter create_snapshot_packages_for_build_snapshot_package\n' % (__file__)
+
+    ter_pkg_url = ter_pkg_urls_dic[ter_arch]
+    ter_pkg_dir = ter_pkg_url.replace(base_url, base_path) #http -> /srv/obs
+    #print '[%s] ter_arch(%s), os.listdir(ter_pkg_dir)(%s)\n' \
+    #      % (__file__, ter_arch, os.listdir(ter_pkg_dir))
+
+    if ter_arch == 'ia32':
+        ter_arch = 'i686'
+
+    # get rpm files
+    ter_pkg_name_lst = []
+    ter_pkg_mdate_lst = []
+    ter_pkg_size_lst = []
+    for root, dirs, files in os.walk(ter_pkg_dir):
+        for each_file in files:
+            if each_file.endswith(".rpm"):
+                rpm_file_path = root + '/' + each_file
+                rpm_file_mdate = os.path.getmtime(rpm_file_path)
+                rpm_file_size = os.path.getsize(rpm_file_path)
+                ter_pkg_name_lst.append(each_file)
+                ter_pkg_mdate_lst.append(rpm_file_mdate)
+                ter_pkg_size_lst.append(rpm_file_size)
+                #print '[%s] rpm_file_path(%s), rpm_file_mdate(%s), rpm_file_size(%s)\n' \
+                #      % (__file__, rpm_file_path, rpm_file_mdate, rpm_file_size)
+
+    # get pre_info_project_id -> get pre_build_project_id
+    query = "SELECT id FROM info_project WHERE project_name = %s"
+    query_data = (project)
+    pre_info_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+    query = "SELECT id FROM build_project WHERE info_project_id = %s"
+    query_data = (pre_info_project_id)
+    pre_build_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+    #print '[%s] pre_info_project_id(%s), pre_build_project_id(%s)\n' \
+    #      % (__file__, pre_info_project_id, pre_build_project_id)
+
+    # get curr_build_snapshot_id
+    query = "SELECT id FROM build_snapshot WHERE build_project_id = %s"
+    query_data = (pre_build_project_id)
+    curr_build_snapshot_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+    #print '[%s] curr_build_snapshot_id(%s)\n' % (__file__, curr_build_snapshot_id)
+
+    for each_pkg_name, each_pkg_mdate, each_pkg_size in zip(ter_pkg_name_lst, ter_pkg_mdate_lst, ter_pkg_size_lst):
+        timestamp = datetime.datetime.fromtimestamp(each_pkg_mdate)
+        #print '[%s] each_pkg_name(%s), timestamp(%s), each_pkg_size(%s)\n' \
+        #      % (__file__, each_pkg_name, timestamp, each_pkg_size)
+        query = "INSERT INTO build_snapshot_package (build_snapshot_id, repository, " \
+                "arch, package_name, created_date, package_size, package_url) " \
+                "VALUES(%s, %s, %s, %s, %s, %s, %s)"
+        query_data = (curr_build_snapshot_id, ter_repo, ter_arch, each_pkg_name,
+                      timestamp, each_pkg_size, ter_pkg_url)
+        buildmonitor_db.do_query(query, query_data)
+
+def end_pre_create_snapshot_for_sr_stage(project, ter_git_tag,
+                                         ter_start_datetime, ter_end_datetime):
+    print '[%s] enter end_pre_create_snapshot_for_sr_stage\n' % (__file__)
+
+    # get curr_sr_status_id
+    query = "SELECT id FROM sr_status WHERE sr = %s"
+    query_data = (ter_git_tag)
+    curr_sr_status_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+
+    # get curr_info_project_id -> get curr_build_project_id for multi profile
+    query = "SELECT id FROM info_project WHERE project_name = %s"
+    query_data = (project)
+    curr_info_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+    query = "SELECT id FROM build_project WHERE info_project_id = %s"
+    query_data = (curr_info_project_id)
+    curr_build_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+
+    ### [3] stage end : [pre] snapshot creation
+    info_stage_id = 3
+    query = "UPDATE sr_stage SET stage_end_time = %s, stage_status = %s " \
+            "WHERE sr_status_id = %s AND info_stage_id = %s AND build_project_id = %s"
+    query_data = (ter_end_datetime, 'S', curr_sr_status_id,
+                  info_stage_id, curr_build_project_id)
+    buildmonitor_db.do_query(query, query_data)
+
+    ### [4] stage start : [pre] image creation
+    info_stage_id = 4
+    query = "INSERT INTO sr_stage (sr_status_id, info_stage_id, stage_start_time, " \
+            "stage_status, build_project_id) VALUES(%s, %s, %s, %s, %s)"
+    query_data = (curr_sr_status_id, info_stage_id, ter_end_datetime,
+                  'R', curr_build_project_id)
+    buildmonitor_db.do_query(query, query_data)
+
+def end_pre_create_snapshot_for_build_snapshot(project, ter_snapshot_name,
+                                               ter_snapshot_url, ter_end_datetime):
+    print '[%s] enter end_pre_create_snapshot_for_build_snapshot\n' % (__file__)
+
+    # get pre_info_project_id -> get pre_build_project_id
+    query = "SELECT id FROM info_project WHERE project_name = %s"
+    query_data = (project)
+    pre_info_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+    query = "SELECT id FROM build_project WHERE info_project_id = %s"
+    query_data = (pre_info_project_id)
+    pre_build_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+    #print '[%s] pre_info_project_id(%s), pre_build_project_id(%s)\n' \
+    #      % (__file__, pre_info_project_id, pre_build_project_id)
+
+    ### for build_snapshot
+    query = "UPDATE build_snapshot SET snapshot_name = %s, snapshot_url = %s, " \
+            "end_time = %s, status = %s WHERE build_project_id = %s"
+    query_data = (ter_snapshot_name, ter_snapshot_url, ter_end_datetime,
+                  'S', pre_build_project_id)
+    buildmonitor_db.do_query(query, query_data)
+
+#===============================================================================
+# [job_imager.py]
+
+def update_fail_create_image_for_sr_stage(fields, ter_start_datetime):
+    print '[%s] enter update_fail_create_image_for_sr_stage\n' % (__file__)
+
+    ter_prj_name = fields["project"]
+    ter_split_data = fields["project"].split(':')[-1]
+    ter_git_tag = 'submit/tizen/' + ter_split_data
+    ter_url = os.path.join(fields.get('url_pub_base', ''),
+                           fields['repo_path'], fields['images_path'])
+    #print '[%s] ter_prj_name(%s), ter_split_data(%s), ter_git_tag(%s), ter_url(%s)\n' \
+    #      % (__file__, ter_prj_name, ter_split_data, ter_git_tag, ter_url)
+
+    ter_end_datetime = datetime.datetime.now()
+
+    #if 'prerelease' in ter_url:
+    if not ((ter_url.find("prerelease")) == -1):
+
+        # [pre_build] get current_sr_status_id
+        query = "SELECT id FROM sr_status WHERE sr = %s"
+        query_data = (ter_git_tag)
+        curr_sr_status_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+        #print '[%s][pre_build] info_stage_id(%s), query_data(%s), curr_sr_status_id(%s)\n' \
+        #      % (__file__, info_stage_id, query_data, curr_sr_status_id)
+
+        # get curr_info_project_id -> get curr_build_project_id for multi profile
+        query = "SELECT id FROM info_project WHERE project_name = %s"
+        query_data = (ter_prj_name)
+        curr_info_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+        query = "SELECT id FROM build_project WHERE info_project_id = %s"
+        query_data = (curr_info_project_id)
+        curr_build_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+
+        ### [4] stage : update fail status for [pre] image creation
+        info_stage_id = 4
+        query = "UPDATE sr_stage SET stage_start_time = %s, stage_end_time = %s, stage_status = %s " \
+                "WHERE sr_status_id = %s AND info_stage_id = %s AND build_project_id = %s"
+        query_data = (ter_start_datetime, ter_end_datetime, 'F',
+                      curr_sr_status_id, info_stage_id, curr_build_project_id)
+        buildmonitor_db.do_query(query, query_data)
+    else:
+        # get post_info_project_id -> get post_build_project_id
+        query = "SELECT id FROM info_project WHERE project_name = %s"
+        query_data = (ter_prj_name)
+        post_info_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+        query = "SELECT id FROM build_project " \
+                "WHERE info_project_id = %s ORDER BY id desc LIMIT 1"
+        query_data = (post_info_project_id)
+        post_build_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+
+        # get curr_sr_status_id
+        query = "SELECT sr_status_id FROM sr_status_detail WHERE post_build_project_id = %s"
+        query_data = (post_build_project_id)
+        curr_sr_status_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+        #print '[%s] curr_sr_status_id(%s)\n' % (__file__, curr_sr_status_id)
+
+        ### [8] stage : update fail status for [post] image creation
+        info_stage_id = 8
+        query = "UPDATE sr_stage SET stage_start_time = %s, stage_end_time = %s, stage_status = %s " \
+                "WHERE sr_status_id = %s AND info_stage_id = %s AND build_project_id = %s"
+        query_data = (ter_start_datetime, ter_end_datetime, 'F',
+                      curr_sr_status_id, info_stage_id, post_build_project_id)
+        buildmonitor_db.do_query(query, query_data)
+
+def create_image_for_build_image(fields, ter_start_datetime,
+                                 ter_end_datetime, build_id):
+    print '[%s] enter create_image_for_build_image\n' % (__file__)
+
+    ter_repository = fields['repo']
+    ter_device_name = fields['name']
+    ter_status = fields['status']
+    ter_url = fields['url']
+    #print '[%s] ter_repository(%s), ter_device_name(%s), ter_status(%s), ter_url(%s)\n' \
+    #      % (__file__, ter_repository, ter_device_name, ter_status, ter_url)
+
+    ter_base_path = os.getenv('PATH_REPO_BASE')
+    ter_img_url = os.path.join(ter_base_path, fields['repo_path'], fields['images_path'])
+    ter_img_path = ter_img_url + '/' + build_id + '_' + ter_device_name + '.tar.gz'
+    ter_img_size = os.path.getsize(ter_img_path)
+    #print '[%s] ter_img_path(%s), ter_img_size(%s)\n' \
+    #      % (__file__, ter_img_path, ter_img_size)
+
+    # get curr_build_snapshot_id
+    query = "SELECT id FROM build_snapshot WHERE snapshot_name = %s"
+    query_data = (build_id)
+    curr_build_snapshot_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+    #print '[%s] curr_build_snapshot_id(%s)\n' % (__file__, curr_build_snapshot_id)
+
+    ### for build_image
+    query = "INSERT INTO build_image (build_snapshot_id, repository, device_name, " \
+            "start_time, end_time, status, image_size, image_url) " \
+            "VALUES(%s, %s, %s, %s, %s, %s, %s, %s)"
+    query_data = (curr_build_snapshot_id, ter_repository, ter_device_name,
+                  ter_start_datetime, ter_end_datetime,
+                  ter_status, ter_img_size, ter_url)
+    buildmonitor_db.do_query(query, query_data)
+
+#===============================================================================
+# [job_post_image.py]
+
+def end_create_image_for_sr_stage(ter_start_datetime, project):
+    print '[%s] enter end_create_image_for_sr_stage project(%s)\n' % (__file__, project)
+
+    if project.startswith("home:prerelease:"):
+        ter_end_datetime = datetime.datetime.now()
+        ter_git_tag = project.split(":")[-3] + '/' + project.split(":")[-2] + '/' + project.split(":")[-1]
+        #print '[%s] ter_git_tag(%s)\n' % (__file__, ter_git_tag)
+
+        # [pre_build] get current_sr_status_id
+        query = "SELECT id FROM sr_status WHERE sr = %s"
+        query_data = (ter_git_tag)
+        curr_sr_status_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+        #print '[%s][pre_build] query_data(%s), curr_sr_status_id(%s)\n' \
+        #      % (__file__, query_data, curr_sr_status_id)
+
+        # get curr_info_project_id -> get curr_build_project_id for multi profile
+        query = "SELECT id FROM info_project WHERE project_name = %s"
+        query_data = (project)
+        curr_info_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+        query = "SELECT id FROM build_project WHERE info_project_id = %s"
+        query_data = (curr_info_project_id)
+        curr_build_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+
+        ### [4] stage : [pre] image creation
+        info_stage_id = 4
+        query = "UPDATE sr_stage SET stage_end_time = %s, stage_status = %s " \
+                "WHERE sr_status_id = %s AND info_stage_id = %s AND build_project_id = %s"
+        query_data = (ter_end_datetime, 'S',
+                      curr_sr_status_id, info_stage_id, curr_build_project_id)
+        buildmonitor_db.do_query(query, query_data)
+
+#===============================================================================
+# [job_request.py]
+
+def sr_accept_for_sr_stage(ter_src_prj_name, ter_target_prj_name,
+                           ter_start_datetime, ter_end_datetime, ter_git_tag):
+    print '[%s] enter sr_accept_for_sr_stage\n' % (__file__)
+
+    # get current_sr_status_id
+    query = "SELECT id FROM sr_status WHERE sr = %s"
+    query_data = (ter_git_tag)
+    curr_sr_status_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+    #print '[%s] curr_sr_status_id(%s)\n' % (__file__, curr_sr_status_id)
+
+    # get curr_info_project_id -> get curr_build_project_id for multi profile
+    query = "SELECT id FROM info_project WHERE project_name = %s"
+    query_data = (ter_src_prj_name)
+    curr_info_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+    query = "SELECT id FROM build_project WHERE info_project_id = %s"
+    query_data = (curr_info_project_id)
+    curr_build_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+
+    ### [5] stage : SR aceept
+    info_stage_id = 5
+    query = "INSERT INTO sr_stage (sr_status_id, info_stage_id, " \
+            "stage_start_time, stage_end_time, stage_status, build_project_id) " \
+            "VALUES(%s, %s, %s, %s, %s, %s)"
+    query_data = (curr_sr_status_id, info_stage_id,
+                  ter_start_datetime, ter_end_datetime, 'S', curr_build_project_id)
+    buildmonitor_db.do_query(query, query_data)
+
+    # get curr_info_project_id -> get post_build_project_id for multi profile
+    query = "SELECT id FROM info_project WHERE project_name = %s"
+    query_data = (ter_target_prj_name)
+    curr_info_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+    query = "SELECT id FROM build_project " \
+            "WHERE info_project_id = %s ORDER BY id desc LIMIT 1"
+    query_data = (curr_info_project_id)
+    post_build_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+
+    ### [6] stage start : [post] package build
+    info_stage_id = 6
+    query = "INSERT INTO sr_stage (sr_status_id, info_stage_id, " \
+            "stage_start_time, stage_status, build_project_id) " \
+            "VALUES(%s, %s, %s, %s, %s)"
+    query_data = (curr_sr_status_id, info_stage_id, ter_start_datetime,
+                  'R', post_build_project_id)
+    buildmonitor_db.do_query(query, query_data)
+
+def sr_reject_for_sr_stage(ter_src_prj_name, ter_start_datetime,
+                           ter_end_datetime, ter_git_tag):
+    print '[%s] enter sr_reject_for_sr_stage\n' % (__file__)
+
+    # get curr_sr_status_id
+    query = "SELECT id FROM sr_status WHERE sr = %s"
+    query_data = (ter_git_tag)
+    curr_sr_status_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+    #print '[%s] curr_sr_status_id(%s)\n' % (__file__, curr_sr_status_id)
+
+    # get curr_info_project_id -> get curr_build_project_id for multi profile
+    query = "SELECT id FROM info_project WHERE project_name = %s"
+    query_data = (ter_src_prj_name)
+    curr_info_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+    query = "SELECT id FROM build_project WHERE info_project_id = %s"
+    query_data = (curr_info_project_id)
+    curr_build_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+
+    ### [5] stage : SR reject
+    info_stage_id = 5
+    query = "INSERT INTO sr_stage (sr_status_id, info_stage_id, stage_start_time, " \
+            "stage_end_time, stage_status, build_project_id) " \
+            "VALUES(%s, %s, %s, %s, %s, %s)"
+    query_data = (curr_sr_status_id, info_stage_id, ter_start_datetime, ter_end_datetime,
+                  'F', curr_build_project_id)
+    buildmonitor_db.do_query(query, query_data)
+
+def sr_accept_reject_for_sr_status_detail(event_fields, ter_start_datetime,
+                                          ter_end_datetime, ter_git_tag):
+    print '[%s] enter sr_accept_reject_for_sr_status_detail\n' % (__file__)
+
+    obs_req_no = event_fields['id']
+    obs_req_comment = event_fields['comment']
+    obs_req_date = ter_end_datetime
+    obs_req_status = event_fields['state']
+    obs_req_status = obs_req_status.upper()
+    ter_src_prj_name = event_fields['sourceproject']
+    ter_target_prj_name = event_fields['targetproject']
+    #print '[%s] obs_req_no(%s), obs_req_comment(%s), obs_req_date(%s), obs_req_status(%s)\n' \
+    #      % (__file__, obs_req_no, obs_req_comment, obs_req_date, obs_req_status)
+    #print '[%s] ter_src_prj_name(%s), ter_target_prj_name(%s), ter_git_tag(%s)\n' \
+    #      % (__file__, ter_src_prj_name, ter_target_prj_name, ter_git_tag)
+
+    if obs_req_status == 'ACCEPTED':
+        print '[%s][ACCEPTED] obs_req_status(%s)\n' % (__file__, obs_req_status)
+
+        # get pre_info_project_id -> get pre_build_project_id
+        query = "SELECT id FROM info_project WHERE project_name = %s"
+        query_data = (ter_src_prj_name) # should use ter_src_prj_name
+        pre_info_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+        query = "SELECT id FROM build_project WHERE info_project_id = %s"
+        query_data = (pre_info_project_id)
+        pre_build_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+        #print '[%s] pre_info_project_id(%d), pre_build_project_id(%s)\n' \
+        #      % (__file__, pre_info_project_id, pre_build_project_id)
+
+        # get post_info_project_id -> get post_build_project_id
+        query = "SELECT id FROM info_project WHERE project_name = %s"
+        query_data = (ter_target_prj_name)
+        post_info_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+        query = "SELECT id FROM build_project " \
+                "WHERE info_project_id = %s ORDER BY id desc LIMIT 1"
+        query_data = (post_info_project_id)
+        post_build_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+        #print '[%s] post_info_project_id(%s), post_build_project_id(%s)\n' \
+        #      % (__file__, post_info_project_id, post_build_project_id)
+
+        ### for sr_status_detail
+        query = "UPDATE sr_status_detail SET post_build_project_id = %s, obs_request_no = %s, " \
+                "obs_request_comment = %s, obs_request_date = %s, obs_request_status = %s " \
+                "WHERE pre_build_project_id = %s"
+        query_data = (post_build_project_id, obs_req_no, obs_req_comment,
+                      obs_req_date, obs_req_status, pre_build_project_id)
+        buildmonitor_db.do_query(query, query_data)
+
+        ### for sr_stage (now can find the build_project_id of the target prj)
+        sr_accept_for_sr_stage(ter_src_prj_name, ter_target_prj_name,
+                               ter_start_datetime, ter_end_datetime, ter_git_tag)
+
+    elif obs_req_status == 'REVOKED' or obs_req_status == 'DECLINED':
+        print '[%s][REVOKED or DECLINED] obs_req_status(%s)\n' \
+              % (__file__, obs_req_status)
+
+        # get info_project_id -> get pre_build_project_id
+        query = "SELECT id FROM info_project WHERE project_name = %s"
+        query_data = (ter_src_prj_name)
+        info_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+        query = "SELECT id FROM build_project WHERE info_project_id = %s"
+        query_data = (info_project_id)
+        pre_build_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+
+        ### for sr_status_detail
+        query = "UPDATE sr_status_detail SET obs_request_no = %s, " \
+                "obs_request_comment = %s, obs_request_date = %s, obs_request_status = %s " \
+                "WHERE pre_build_project_id = %s"
+        query_data = (obs_req_no, obs_req_comment, obs_req_date,
+                      obs_req_status, pre_build_project_id)
+        buildmonitor_db.do_query(query, query_data)
+
+        ### for sr_stage
+        sr_reject_for_sr_stage(ter_src_prj_name, ter_start_datetime,
+                               ter_end_datetime, ter_git_tag)
+
+#===============================================================================
+# [job_create_snapshot.py]
+
+def update_fail_create_snapshot_for_sr_stage(project):
+    print '[%s] enter update_fail_create_snapshot_for_sr_stage\n' % (__file__)
+
+    # get post_info_project_id
+    query = "SELECT id FROM info_project WHERE project_name = %s"
+    query_data = (project) # Tizen:Mobile
+    post_info_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+
+    # get post_build_project_id
+    query = "SELECT id FROM build_project " \
+            "WHERE info_project_id = %s ORDER BY id desc LIMIT 1"
+    query_data = (post_info_project_id)
+    post_build_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+
+    # get curr_sr_status_id
+    query = "SELECT sr_status_id FROM sr_status_detail WHERE post_build_project_id = %s"
+    query_data = (post_build_project_id)
+    curr_sr_status_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+    #print '[%s] post_info_project_id(%s), post_build_project_id(%d), curr_sr_status_id(%s)\n' \
+    #      % (__file__, post_info_project_id, post_build_project_id, curr_sr_status_id)
+
+    ### [7] stage : update fail status when failed
+    ter_start_datetime = ter_end_datetime = datetime.datetime.now()
+    query = "UPDATE sr_stage SET stage_start_time = %s, stage_end_time = %s, stage_status = %s " \
+            "WHERE sr_status_id = %s AND build_project_id = %s"
+    query_data = (ter_start_datetime, ter_end_datetime, 'F',
+                  curr_sr_status_id, post_build_project_id)
+    buildmonitor_db.do_query(query, query_data)
+
+def start_create_snapshot_for_sr_stage(project, ter_start_datetime):
+    print '[%s] enter start_create_snapshot_for_sr_stage\n' % (__file__)
+
+    # get post_info_project_id
+    query = "SELECT id FROM info_project WHERE project_name = %s"
+    query_data = (project) # Tizen:Mobile
+    post_info_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+
+    # get post_build_project_id
+    query = "SELECT id FROM build_project " \
+            "WHERE info_project_id = %s ORDER BY id desc LIMIT 1"
+    query_data = (post_info_project_id)
+    post_build_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+
+    # get multi_sr_status_id
+    query = "SELECT sr_status_id FROM sr_status_detail WHERE post_build_project_id = %s"
+    query_data = (post_build_project_id)
+    multi_sr_status_id = buildmonitor_db.get_multi_values_from_query_data(query, query_data)
+    #print '[%s] post_info_project_id(%s), post_build_project_id(%d), multi_sr_status_id(%s)\n' \
+    #      % (__file__, post_info_project_id, post_build_project_id, multi_sr_status_id)
+
+    ### [6] end / [7/8] start : [post] snapshot creation
+    for each_sr_status_id in multi_sr_status_id:
+        print '[%s] each_sr_status_id(%s)\n' % (__file__, each_sr_status_id)
+        info_stage_id = 6
+        ter_end_datetime = datetime.datetime.now()
+        query = "UPDATE sr_stage SET stage_end_time = %s, stage_status = %s " \
+                "WHERE sr_status_id = %s AND info_stage_id = %s AND build_project_id = %s"
+        query_data = (ter_end_datetime, 'S',
+                      each_sr_status_id[0], info_stage_id, post_build_project_id)
+        buildmonitor_db.do_query(query, query_data)
+
+        info_stage_id = 7
+        query = "INSERT INTO sr_stage (sr_status_id, info_stage_id, " \
+                "stage_start_time, stage_end_time, stage_status, build_project_id) " \
+                "VALUES(%s, %s, %s, %s, %s, %s)"
+        query_data = (each_sr_status_id[0], info_stage_id,
+                      ter_start_datetime, ter_end_datetime, 'R', post_build_project_id)
+        buildmonitor_db.do_query(query, query_data)
+
+        info_stage_id = 8
+        query = "INSERT INTO sr_stage (sr_status_id, info_stage_id, " \
+                "stage_start_time, stage_end_time, stage_status, build_project_id) " \
+                "VALUES(%s, %s, %s, %s, %s, %s)"
+        query_data = (each_sr_status_id[0], info_stage_id,
+                      ter_start_datetime, ter_end_datetime, 'R', post_build_project_id)
+        buildmonitor_db.do_query(query, query_data)
+
+def start_create_snapshot_for_post_build_snapshot(project, ter_snapshot_name,
+                                                  ter_start_datetime):
+    print '[%s] enter start_create_snapshot_for_post_build_snapshot\n' % (__file__)
+
+    # get post_info_project_id
+    query = "SELECT id FROM info_project WHERE project_name = %s"
+    query_data = (project)
+    post_info_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+
+    # get post_build_project_id
+    query = "SELECT id FROM build_project " \
+            "WHERE info_project_id = %s ORDER BY id desc LIMIT 1"
+    query_data = (post_info_project_id)
+    post_build_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+    #print '[%s] post_info_project_id(%s), post_build_project_id(%d)\n' \
+    #      % (__file__, post_info_project_id, post_build_project_id)
+
+    # insert new post_build_project_id
+    query = "INSERT INTO build_snapshot (build_project_id, snapshot_name, " \
+            "start_time, status) VALUES(%s, %s, %s, %s)"
+    query_data = (post_build_project_id, ter_snapshot_name, ter_start_datetime, 'R')
+    buildmonitor_db.do_query(query, query_data)
+
+def create_snapshot_packages_for_post_build_snapshot_package(repo, project, ter_repo,
+                                                             ter_arch, base_path, snapshot):
+    print '[%s] enter create_snapshot_packages_for_post_build_snapshot_package\n' % (__file__)
+
+    if ter_arch == 'ia32':
+        ter_arch = 'i686'
+    ter_repo_dir = os.path.join(snapshot.path, "repos", ter_repo, "packages")
+    #print '[%s] snapshot.path(%s), ter_repo(%s), ter_arch(%s)\n' \
+    #      % (__file__, snapshot.path, ter_repo, ter_arch)
+    #print '[%s] ter_repo_dir(%s), os.listdir(ter_repo_dir)(%s)\n' \
+    #      % (__file__, ter_repo_dir, os.listdir(ter_repo_dir))
+
+    ter_base_url = os.getenv("URL_PUBLIC_REPO_BASE")
+    ter_pkg_url = ter_repo_dir.replace(base_path, ter_base_url)
+    #print '[%s] ter_base_url(%s), base_path(%s), ter_pkg_url(%s)\n' \
+    #      % (__file__, ter_base_url, base_path, ter_pkg_url)
+
+    # get rpm files
+    ter_pkg_name_lst = []
+    ter_pkg_mdate_lst = []
+    ter_pkg_size_lst = []
+    for root, dirs, files in os.walk(ter_repo_dir):
+        #print '[%s] root(%s), dirs(%s), files(%s)\n' % (__file__, root, dirs, files)
+        for each_file in files:
+            if each_file.endswith(".rpm"):
+                rpm_file_path = os.path.join(root, each_file)
+                rpm_file_mdate = os.path.getmtime(rpm_file_path)
+                rpm_file_size = os.path.getsize(rpm_file_path)
+                ter_pkg_name_lst.append(each_file)
+                ter_pkg_mdate_lst.append(rpm_file_mdate)
+                ter_pkg_size_lst.append(rpm_file_size)
+                # too much log
+                #print '[%s] rpm_file_path(%s), rpm_file_mdate(%s), rpm_file_size(%s)\n' \
+                #      % (__file__, rpm_file_path, rpm_file_mdate, rpm_file_size)
+
+    # get post_info_project_id
+    query = "SELECT id FROM info_project WHERE project_name = %s"
+    query_data = (project)
+    post_info_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+    #print '[%s] post_info_project_id (%s)\n' % (__file__, post_info_project_id)
+
+    # get post_build_project_id
+    query = "SELECT id FROM build_project " \
+            "WHERE info_project_id = %s ORDER BY id desc LIMIT 1"
+    query_data = (post_info_project_id)
+    build_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+
+    # get curr_build_snapshot_id
+    query = "SELECT id FROM build_snapshot WHERE build_project_id = %s"
+    query_data = (build_project_id)
+    curr_build_snapshot_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+
+    for each_pkg_name, each_pkg_mdate, each_pkg_size in zip(ter_pkg_name_lst, ter_pkg_mdate_lst, ter_pkg_size_lst):
+        timestamp = datetime.datetime.fromtimestamp(each_pkg_mdate)
+        # post build
+        #print '[%s] curr_build_snapshot_id(%s), each_pkg_name(%s), timestamp(%s), each_pkg_size(%s)\n' \
+        #      % (__file__, curr_build_snapshot_id, each_pkg_name, timestamp, each_pkg_size)
+        query = "INSERT INTO build_snapshot_package (build_snapshot_id, repository, arch, " \
+                "package_name, created_date, package_size, package_url) " \
+                "VALUES(%s, %s, %s, %s, %s, %s, %s)"
+        query_data = (curr_build_snapshot_id, ter_repo, ter_arch,
+                      each_pkg_name, timestamp, each_pkg_size, ter_pkg_url)
+        buildmonitor_db.do_query(query, query_data)
+
+def end_create_snapshot_create_images_for_sr_stage(project, ter_start_datetime,
+                                                   ter_end_datetime):
+    print '[%s] enter end_create_snapshot_create_images_for_sr_stage\n' % (__file__)
+
+    ### [7/8/9] end : [post] snapshot creation / [post] image creation / Completed
+    # get post_info_project_id
+    query = "SELECT id FROM info_project WHERE project_name = %s"
+    query_data = (project) # Tizen:Mobile
+    post_info_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+
+    # get post_build_project_id
+    query = "SELECT id FROM build_project " \
+            "WHERE info_project_id = %s ORDER BY id desc LIMIT 1"
+    query_data = (post_info_project_id)
+    post_build_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+
+    # get multi_sr_status_id
+    query = "SELECT sr_status_id FROM sr_status_detail WHERE post_build_project_id = %s"
+    query_data = (post_build_project_id)
+    multi_sr_status_id = buildmonitor_db.get_multi_values_from_query_data(query, query_data)
+    #print '[%s] post_info_project_id(%s), post_build_project_id(%d), multi_sr_status_id(%s)\n' \
+    #      % (__file__, post_info_project_id, post_build_project_id, multi_sr_status_id)
+
+    for each_sr_status_id in multi_sr_status_id:
+        print '[%s] each_sr_status_id(%s)\n' % (__file__, each_sr_status_id)
+
+        # change the state_status of previous stage from 'R' to 'S'
+        info_stage_id = 7
+        query = "UPDATE sr_stage SET stage_end_time = %s, stage_status = %s " \
+                "WHERE sr_status_id = %s AND info_stage_id = %s AND build_project_id = %s"
+        query_data = (ter_end_datetime, 'S',
+                      each_sr_status_id[0], info_stage_id, post_build_project_id)
+        buildmonitor_db.do_query(query, query_data)
+
+        info_stage_id = 8
+        query = "UPDATE sr_stage SET stage_end_time = %s, stage_status = %s " \
+                "WHERE sr_status_id = %s AND info_stage_id = %s AND build_project_id = %s"
+        query_data = (ter_end_datetime, 'S',
+                      each_sr_status_id[0], info_stage_id, post_build_project_id)
+        buildmonitor_db.do_query(query, query_data)
+
+        info_stage_id = 9
+        ter_start_datetime = datetime.datetime.now()
+        query = "INSERT INTO sr_stage (sr_status_id, info_stage_id, " \
+                "stage_start_time, stage_end_time, stage_status, build_project_id) " \
+                "VALUES(%s, %s, %s, %s, %s, %s)"
+        query_data = (each_sr_status_id[0], info_stage_id,
+                      ter_start_datetime, ter_end_datetime, 'S', post_build_project_id)
+        buildmonitor_db.do_query(query, query_data)
+
+def end_create_snapshot_for_post_build_snapshot(project, ter_start_datetime,
+                                                ter_end_datetime, ter_snapshot_url,
+                                                ter_snapshot_name):
+    print '[%s] enter end_create_snapshot_for_post_build_snapshot\n' % (__file__)
+
+    # get post_info_project_id
+    query = "SELECT id FROM info_project WHERE project_name = %s"
+    query_data = (project)
+    post_info_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+
+    # get post_build_project_id
+    query = "SELECT id FROM build_project " \
+            "WHERE info_project_id = %s ORDER BY id desc LIMIT 1"
+    query_data = (post_info_project_id)
+    post_build_project_id = buildmonitor_db.get_value_from_query_data(query, query_data)
+    #print '[%s] post_info_project_id(%s), post_build_project_id(%d)\n' \
+    #      % (__file__, post_info_project_id, post_build_project_id)
+
+    # insert new post_build_project_id
+    query = "UPDATE build_snapshot SET snapshot_url = %s, " \
+            "end_time = %s, status = %s WHERE snapshot_name = %s"
+    query_data = (ter_snapshot_url, ter_end_datetime, 'S', ter_snapshot_name)
+    buildmonitor_db.do_query(query, query_data)
+#==================================================================================
+
+def main():
+    """
+    Script entry point.
+    """
+
+if __name__ == '__main__':
+    try:
+        sys.exit(main(os.path.basename(sys.argv[1])))
+    except LocalError, err:
+        print err
+        sys.exit(1)
diff --git a/common/buildmonitor_db.py b/common/buildmonitor_db.py
new file mode 100644 (file)
index 0000000..e163e28
--- /dev/null
@@ -0,0 +1,105 @@
+#!/usr/bin/env python
+#
+# Copyright (c) 2016 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.
+#
+"""Access to buildmonitor database"""
+
+import os
+import sys
+import MySQLdb
+
+def get_multi_values_from_query_data(query, data):
+    try:
+        print 'query(%s), data(%s)' % (query, data)
+
+        cursor = conn.cursor()
+        cursor.execute(query, data)
+        ret_rows = cursor.fetchall()
+        print 'ret_rows(%s)' % (ret_rows,)
+        conn.commit()
+        cursor.close()
+
+        if not ret_rows:
+            ret_rows = (((9876,),))
+            print 'prevent null ret_rows(%s)' % (ret_rows,)
+
+        return ret_rows
+
+    except MySQLdb.IntegrityError as err:
+        print 'Error %d: %s' % (err.args[0], err.args[1])
+
+def get_value_from_query_data(query, data):
+    try:
+        print 'query(%s), data(%s)' % (query, data)
+
+        cursor = conn.cursor()
+        cursor.execute(query, data)
+        ret_id = cursor.fetchone()
+        print 'ret_id(%s)' % (ret_id)
+        conn.commit()
+        cursor.close()
+
+        if ret_id == 0 or ret_id == None:
+            ret_id = 9876
+            print 'prevent null ret_id(%s)' % (ret_id)
+            return ret_id
+        else:
+            return ret_id[0]
+
+    except MySQLdb.IntegrityError as err:
+        print 'Error %d: %s' % (err.args[0], err.args[1])
+
+def do_query(query, data):
+    try:
+        # skip print bcz of too many logs
+        if not query.startswith('INSERT INTO build_snapshot_package'):
+            print 'query(%s), data(%s)' % (query, data)
+
+        cursor = conn.cursor()
+        cursor.execute(query, data)
+        conn.commit()
+        cursor.close()
+    except MySQLdb.IntegrityError as err:
+        print 'Error %d: %s' % (err.args[0], err.args[1])
+
+def connect_db():
+    global conn
+    conn = 0
+
+    try:
+        print '=====[BuildMonitor DB connecting...]=====\n'
+
+        # load config data
+        db_ip = os.getenv("BUILDMONITOR_IP")
+        db_user = os.getenv("BUILDMONITOR_USER")
+        db_pass = os.getenv("BUILDMONITOR_PASS")
+        db_name = os.getenv("BUILDMONITOR_NAME")
+        print '%s %s %s' % (db_ip, db_user, db_name)
+
+        # MySQL connect & get version
+        conn = MySQLdb.connect(db_ip, db_user, db_pass, db_name)
+        cursor = conn.cursor()
+        query = "SELECT VERSION()"
+        version = ''
+        cursor.execute(query)
+        for (version) in cursor:
+            print 'MySQL version: %s' % version
+        cursor.close()
+        return conn
+
+    except MySQLdb.IntegrityError as err:
+        print 'Error %d: %s' % (err.args[0], err.args[1])
+        sys.exit(1)
+
+def disconnect_db():
+    if conn:
+        conn.close()
index d5f475f..0d403f8 100755 (executable)
@@ -24,6 +24,7 @@ This code is called by jenkins jobs triggered by OBS events.
 import os
 import sys
 import re
+import datetime
 
 from common.buildtrigger import trigger_info, trigger_next
 from common.buildservice import BuildService
@@ -31,6 +32,7 @@ from common.repomaker import RepoMaker, RepoMakerError
 from common.backenddb import BackendDB
 from common.snapshot import Snapshot, SnapshotError, snapshot_project_enabled
 from common.utils import make_latest_link
+from common import buildmonitor
 
 class LocalError(Exception):
     """Local error exception."""
@@ -111,6 +113,11 @@ def make_repo(project, backenddb, base_path, live_repo_base):
     repos = {}
     imagedatas = {}
 
+    if buildmonitor_enabled:
+        bm_snapshot_name = snapshot.build_id
+        buildmonitor.start_create_snapshot_for_post_build_snapshot(project,
+                                                                   bm_snapshot_name,
+                                                                   bm_start_datetime)
     # Convert live repo to download structure
     for repo in targets:
         repomaker = RepoMaker(snapshot.build_id, snapshot.path)
@@ -130,12 +137,22 @@ def make_repo(project, backenddb, base_path, live_repo_base):
             raise LocalError("Unable to create download repo: %s" % err)
 
         if not repomaker.imagedata:
+            if buildmonitor_enabled:
+                print '[%s][LocalError] bm_project(%s)\n' % (__file__, bm_project)
+                buildmonitor.update_fail_create_snapshot_for_sr_stage(bm_project)
             raise LocalError("Image configuration not found in %s" %
                               snapshot.path)
 
         repos.update(repomaker.repos)
         imagedatas[repo['Name']] = repomaker.imagedata
 
+        if buildmonitor_enabled:
+            buildmonitor.create_snapshot_packages_for_post_build_snapshot_package(repo,
+                                                                                  project,
+                                                                                  repo['Name'],
+                                                                                  repo['Architectures'][0],
+                                                                                  base_path,
+                                                                                  snapshot)
         # Generate image info to builddata/ dir
         repomaker.gen_image_info()
 
@@ -159,6 +176,14 @@ def main():
     """Script entry point."""
 
     print '---[JOB STARTED: %s ]-------------------------'
+    global buildmonitor_enabled
+    buildmonitor_enabled = os.getenv("BUILDMONITOR_ENABLED", "0") != "0"
+    print 'buildmonitor_enabled(%s)\n' % (buildmonitor_enabled)
+    if buildmonitor_enabled:
+        buildmonitor_skip = 1 # for exception case
+        global bm_start_datetime
+        bm_start_datetime = datetime.datetime.now()
+        buildmonitor.bm_connect_db()
 
     obs_api = os.getenv("OBS_API_URL")
     obs_user = os.getenv("OBS_API_USERNAME")
@@ -170,6 +195,12 @@ def main():
     content = trigger_info(os.getenv("TRIGGER_INFO"))
 
     project = content.get("project")
+
+    if buildmonitor_enabled:
+        global bm_project # for update_fail_xxx
+        bm_project = project
+        buildmonitor.start_create_snapshot_for_sr_stage(project, bm_start_datetime)
+
     build = BuildService(obs_api, obs_user, obs_passwd)
 
     # Init backend database
@@ -194,6 +225,13 @@ def main():
 
     # trigger snapdiff sync
     for index, repo in enumerate(trigger_snapdiff.keys()):
+        if buildmonitor_enabled:
+            # if there is one data at least then do not skip
+            if trigger_snapdiff[repo] != []:
+                buildmonitor_skip = 0
+                print '[%s] repo(%s), trigger_snapdiff[repo](%s)\n' \
+                      % (__file__, repo, trigger_snapdiff[repo])
+
         trigger_next('snapdiff-trigger_%s' %
                       index, {repo: trigger_snapdiff[repo]})
 
@@ -204,6 +242,21 @@ def main():
 
     trigger_next("post-snapshot", data)
 
+    if buildmonitor_enabled:
+        if buildmonitor_skip == 1:
+            print 'snapdiff empty, buildmonitor_skipped!!\n'
+        else:
+            bm_end_datetime = datetime.datetime.now()
+            # for sr_stage & build_snapshot
+            buildmonitor.end_create_snapshot_create_images_for_sr_stage(project,
+                                                                        bm_start_datetime,
+                                                                        bm_end_datetime)
+            bm_snapshot_url = os.path.join(base_url, repo_data['repo_path'])
+            buildmonitor.end_create_snapshot_for_post_build_snapshot(project,
+                                                                     bm_start_datetime,
+                                                                     bm_end_datetime,
+                                                                     bm_snapshot_url,
+                                                                     repo_data['build_id'])
 
 if __name__ == '__main__':
     try:
index 310ba97..986e4f3 100755 (executable)
@@ -27,6 +27,7 @@ import gzip
 import xml.dom.minidom
 import urllib2
 import codecs
+import datetime
 
 from xml.dom.minidom import parse,parseString
 from collections import defaultdict
@@ -37,6 +38,7 @@ from random import randint
 
 from common.buildtrigger import trigger_info, trigger_next
 from common.utils import sync, set_permissions, Workdir
+from common import buildmonitor
 
 
 # Returns the list of baseurls from kickstart configuration.
@@ -203,6 +205,11 @@ def run_inside_vm(vm_image, vm_memory, vm_cpus, basedir):
 
 def main():
     """The main body"""
+    buildmonitor_enabled = os.getenv("BUILDMONITOR_ENABLED", "0") != "0"
+    print 'buildmonitor_enabled(%s)\n' % (buildmonitor_enabled)
+    if buildmonitor_enabled:
+        bm_start_datetime = datetime.datetime.now()
+        buildmonitor.bm_connect_db()
 
     # Check if environment variables are set
     for var in ('WORKSPACE', 'IMG_SYNC_DEST_BASE'):
@@ -283,6 +290,8 @@ def main():
     if ret:
         print 'Error: mic returned %d' % ret
         status = 'failed'
+        if buildmonitor_enabled:
+            buildmonitor.update_fail_create_image_for_sr_stage(fields, bm_start_datetime)
 
     # sync image, logs to SYNC_DEST
     sync_dest = os.path.join(os.getenv('IMG_SYNC_DEST_BASE'),
@@ -331,5 +340,11 @@ def main():
     else:
         return -1
 
+    if buildmonitor_enabled:
+        bm_end_datetime = datetime.datetime.now()
+        # for build_image
+        buildmonitor.create_image_for_build_image(fields, bm_start_datetime,
+                                                  bm_end_datetime, build_id)
+
 if __name__ == "__main__":
     sys.exit(main())
index f100565..4d2e3b6 100755 (executable)
 import os
 import sys
 import base64
+import datetime
 
 from common.buildtrigger import trigger_info
 from common.buildservice import BuildService
 from common.prerelease import is_prerelease_project
 from common.iris_rest_client import IrisRestClient
+from common import buildmonitor
 
 def main():
     """The main body"""
+    buildmonitor_enabled = os.getenv("BUILDMONITOR_ENABLED", "0") != "0"
+    print 'buildmonitor_enabled(%s)\n' % (buildmonitor_enabled)
+    if buildmonitor_enabled:
+        bm_start_datetime = datetime.datetime.now()
+        buildmonitor.bm_connect_db()
+
     obs_api = os.getenv("OBS_API_URL")
     obs_user = os.getenv("OBS_API_USERNAME")
     obs_passwd = os.getenv("OBS_API_PASSWD")
@@ -64,5 +72,13 @@ def main():
                 }
         build.update_info(info, project)
 
+        if buildmonitor_enabled:
+            saveinfo = build.get_info(project)
+                if len(saveinfo['images']) == saveinfo['images_count']:
+                    print '[%s] last image(%s)\n' \
+                          % (__file__, len(saveinfo['images']))
+                    buildmonitor.end_create_image_for_sr_stage(bm_start_datetime,
+                                                               project)
+
 if __name__ == "__main__":
     sys.exit(main())
index c1b49be..735e993 100755 (executable)
@@ -26,6 +26,8 @@ import sys
 import re
 import shutil
 import base64
+import datetime
+from common import buildmonitor
 
 from common.buildtrigger import trigger_info, trigger_next
 from common.buildservice import BuildService
@@ -152,6 +154,13 @@ def make_repo(project, repo, backenddb, base_url, base_path,
                                   project.replace(':', ':/'))
     targets = snapshot.targets
 
+    if buildmonitor_enabled:
+        global bm_snapshot_name
+        global bm_snapshot_url
+        bm_snapshot_name = prerelease.build_id
+        bm_snapshot_path = snapshot.path
+        bm_snapshot_url = bm_snapshot_path.replace(base_path, base_url)
+
     for repo in targets:
         repomaker = RepoMaker(prerelease.build_id,
                               os.path.join(prerelease.path,
@@ -179,6 +188,9 @@ def make_repo(project, repo, backenddb, base_url, base_path,
             img_conf_list = list(img_conf)
             # whether exist package of image-configuration
             if not img_conf_list:
+                if buildmonitor_enabled:
+                    print '[%s][LocalError] bm_git_tag(%s)\n' % (__file__, bm_git_tag)
+                    buildmonitor.update_fail_status_for_sr_stage(project, bm_git_tag)
                 raise LocalError("Image configuration not found in %s" %
                         snapshot.path)
             for rpm in img_conf_list:
@@ -192,6 +204,14 @@ def make_repo(project, repo, backenddb, base_url, base_path,
         images_ks = update_ks(repomaker.imagedata, snapshot.build_id,
                               prerelease.pkg_urls(repo['Name']))
 
+
+        if buildmonitor_enabled:
+            bm_pkg_urls_dic = prerelease.pkg_urls(repo['Name'])
+            print '[%s] prerelease.pkg_urls(%s), base_path(%s)\n' \
+                  % (__file__, bm_pkg_urls_dic, base_path)
+            buildmonitor.create_snapshot_packages_for_build_snapshot_package(project, bm_snapshot_name,
+                                                                             repo['Name'], repo['Architectures'][0],
+                                                                             bm_pkg_urls_dic, base_url, base_path)
         # Generate image info to builddata/ dir
         repomaker.gen_image_info(images_ks)
 
@@ -292,6 +312,14 @@ def main(action):
     """
 
     print '---[JOB STARTED: %s ]-------------------------' % action
+    global buildmonitor_enabled
+    buildmonitor_enabled = os.getenv("BUILDMONITOR_ENABLED", "0") != "0"
+    print 'buildmonitor_enabled(%s)\n' % (buildmonitor_enabled)
+    if buildmonitor_enabled:
+        bm_start_datetime = datetime.datetime.now()
+        global bm_git_tag # for execption handling
+        bm_git_tag = None
+        buildmonitor.bm_connect_db()
 
     obs_api = os.getenv("OBS_API_URL")
     obs_user = os.getenv("OBS_API_USERNAME")
@@ -312,6 +340,12 @@ def main(action):
     if action == 'create_images':
         repo = content.get("repo")
         info = build.get_info(project)
+
+        if buildmonitor_enabled:
+            bm_git_tag = info['git_tag']
+            buildmonitor.start_pre_create_snapshot_for_sr_stage(project, bm_git_tag, bm_start_datetime)
+            buildmonitor.start_pre_create_snapshot_for_build_snapshot(project, bm_start_datetime)
+
         buildstatus = build.getbuildstatus(project)
         print 'buildstatus=%s' %(buildstatus)
         build.update_buildstatus(buildstatus,project)
@@ -337,6 +371,19 @@ def main(action):
         raise LocalError("Not supported method of pre_release_obs job: %s" \
                           % action)
 
+    if buildmonitor_enabled and action == 'create_images':
+        #print '[%s] project(%s), bm_git_tag(%s), start_time(%s), end_time(%s)\n' \
+        #      % (__file__, project, bm_git_tag, bm_start_datetime, bm_end_datetime)
+        bm_end_datetime = datetime.datetime.now()
+        # for sr_stage & build_snapshot
+        buildmonitor.end_pre_create_snapshot_for_sr_stage(project, bm_git_tag,
+                                                          bm_start_datetime,
+                                                          bm_end_datetime)
+        buildmonitor.end_pre_create_snapshot_for_build_snapshot(project,
+                                                                bm_snapshot_name,
+                                                                bm_snapshot_url,
+                                                                bm_end_datetime)
+
 if __name__ == '__main__':
     try:
         sys.exit(main(sys.argv[1]))
index 90426fe..5a82bd1 100755 (executable)
@@ -35,6 +35,7 @@ import os
 import datetime
 import base64
 from xml.sax.saxutils import unescape
+from common import buildmonitor
 
 # set default char-set endcoding to utf-8
 reload(sys)
@@ -329,6 +330,11 @@ def notify_submiter(event_fields, data):
 
 def main():
     """The main body"""
+    buildmonitor_enabled = os.getenv("BUILDMONITOR_ENABLED", "0") != "0"
+    print 'buildmonitor_enabled(%s)\n' % (buildmonitor_enabled)
+    if buildmonitor_enabled:
+        bm_start_datetime = datetime.datetime.now()
+        buildmonitor.bm_connect_db()
 
     event_fields = trigger_info(os.getenv('TRIGGER_INFO'))
 
@@ -419,6 +425,13 @@ def main():
         elif event_type == 'OBS_SRCSRV_REQUEST_REVOKED':
             request_revoked(data)
 
+    if buildmonitor_enabled and event_type != 'OBS_SRCSRV_REQUEST_STATECHANGE':
+        bm_end_datetime = datetime.datetime.now()
+        buildmonitor.sr_accept_reject_for_sr_status_detail(event_fields,
+                                                           bm_start_datetime,
+                                                           bm_end_datetime,
+                                                           data["GIT_TAG"])
+
     return 0
 
 if __name__ == '__main__':
index ec35734..9272206 100755 (executable)
@@ -29,6 +29,8 @@ import re
 import xml.etree.cElementTree as ElementTree
 from xml.sax.saxutils import escape
 from time import sleep
+import datetime
+from common import buildmonitor
 
 from osc import core
 from gitbuildsys.errors import ObsError
@@ -472,6 +474,11 @@ def main(build_type):
     """
 
     print '---[JOB STARTED]-------------------------'
+    buildmonitor_enabled = os.getenv("BUILDMONITOR_ENABLED", "0") != "0"
+    print 'buildmonitor_enabled(%s)\n' % (buildmonitor_enabled)
+    if buildmonitor_enabled:
+        bm_start_datetime = datetime.datetime.now()
+        buildmonitor.bm_connect_db()
 
     obs_api = os.getenv("OBS_API_URL")
     obs_user = os.getenv("OBS_API_USERNAME")
@@ -656,6 +663,16 @@ def main(build_type):
     if submit_info['pre_created']:
         send_mail_sr_message(submit_info, mygerrit)
 
+    if buildmonitor_enabled:
+        bm_end_datetime = datetime.datetime.now()
+        ### sr_status -> sr_commit -> sr_stage & sr_status_detail
+        buildmonitor.sr_submit_for_sr_status(git_tag)
+        buildmonitor.sr_submit_for_sr_commit(mygit, git_tag, gerrit_project,
+                                             gerrit_newrev, gerrit_account_name)
+        buildmonitor.package_build_for_sr_detail_sr_stage(git_tag, bm_start_datetime,
+                                                          bm_end_datetime,
+                                                          submit_info['pre_created'])
+
 if __name__ == '__main__':
     try:
         sys.exit(main(os.path.basename(sys.argv[1])))
index a9b4941..27673b1 100644 (file)
@@ -124,6 +124,8 @@ fi
 %{destdir}/common/apply_scm_meta_git.py
 %{destdir}/common/check_scm_meta_git.py
 %{destdir}/common/git_diff_parse.py
+%{destdir}/common/buildmonitor.py
+%{destdir}/common/buildmonitor_db.py
 %{destdir}/job_re.py
 %{destdir}/job_create_snapshot.py
 %{destdir}/job_release_snapshot.py