aboutsummaryrefslogtreecommitdiff
path: root/bugzilla_fetch.py
blob: 2ba2d9d08e294a3f9c5286505e3dcc1d7954ac8d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#!/usr/bin/env python
import time
import yaml
import json
import sys
import xmlrpclib
import os
import datetime
from wmfphablib import log
from wmfphablib import vlog
from wmfphablib import errorlog as elog
from wmfphablib import bzlib
from wmfphablib import config
from wmfphablib import epoch_to_datetime
from wmfphablib import datetime_to_epoch
from wmfphablib import phabdb
from wmfphablib import ipriority
from wmfphablib import now
from wmfphablib import return_bug_list


def fetch(bugid):

    pmig = phabdb.phdb(db=config.bzmigrate_db,
                       user=config.bzmigrate_user,
                       passwd=config.bzmigrate_passwd)

    server = xmlrpclib.ServerProxy(config.Bugzilla_url, use_datetime=True)
    token_data = server.User.login({'login': config.Bugzilla_login,
                                    'password': config.Bugzilla_password})

    token = token_data['token']
    kwargs = { 'ids': [bugid], 'Bugzilla_token': token }

    #grabbing one bug at a time for now
    buginfo = server.Bug.get(kwargs)['bugs']	
    buginfo =  buginfo[0]
    # some bugs have header data but no actual content
    # https://bugzilla.wikimedia.org/show_bug.cgi?id=32738
    com = server.Bug.comments(kwargs)['bugs'][str(bugid)]['comments']

    #have to do for json
    buginfo['last_change_time'] = datetime_to_epoch(buginfo['last_change_time'])
    buginfo['creation_time'] = datetime_to_epoch(buginfo['creation_time'])

    if 'flags' in buginfo:
        for flag in buginfo['flags']:
            for k, v in flag.iteritems():
                if isinstance(v, datetime.datetime):
                    flag[k] = datetime_to_epoch(v)

    for c in com:
        c['creation_time'] = datetime_to_epoch(c['creation_time'])
        c['time'] = datetime_to_epoch(c['time'])

    # set ticket status for priority import
    status = bzlib.status_convert(buginfo['status'], buginfo['resolution'])

    if status == 'open':
        creation_priority = ipriority['unresolved']
    else:
        creation_priority = ipriority['na']

    current = pmig.sql_x("SELECT * from bugzilla_meta where id = %s", bugid)
    if current:
        update_values = (creation_priority,
                         json.dumps(buginfo),
                         json.dumps(com),
                         now(),
                         bugid)
        vlog('update: ' + str(update_values))
        pmig.sql_x("UPDATE bugzilla_meta SET priority=%s, header=%s, comments=%s, modified=%s WHERE id = %s",
                   update_values)
    else:
        insert_values =  (bugid, creation_priority, json.dumps(buginfo), json.dumps(com), now(), now())
        vlog('insert: ' + str(insert_values))
        sql = "INSERT INTO bugzilla_meta (id, priority, header, comments, created, modified) VALUES (%s, %s, %s, %s, %s, %s)"
        pmig.sql_x(sql,
                   insert_values)
    pmig.close()
    return True

def run_fetch(bugid, tries=1):
    if tries == 0:
        pmig = phabdb.phdb(db=config.bzmigrate_db,
                       user=config.bzmigrate_user,
                       passwd=config.bzmigrate_passwd)

        current = pmig.sql_x("SELECT * from bugzilla_meta \
                              where id = %s", bugid)
        if current:
            update_values =  (ipriority['fetch_failed'], '', '', now(), bugid)
            pmig.sql_x("UPDATE bugzilla_meta SET priority=%s, \
                                                 header=%s, \
                                                 comments=%s, \
                                                 modified=%s \
                                                 WHERE id = %s",
                       update_values)
        else:
            insert_values =  (bugid, ipriority['fetch_failed'], '', '', now(), now())
            pmig.sql_x("INSERT INTO bugzilla_meta \
                        (id, priority, header, comments, modified, created) \
                        VALUES (%s, %s, %s, %s, %s, %s)",
                        insert_values)
            pmig.close()
        elog('failed to grab %s' % (bugid,))
        return False
    try:
        return fetch(bugid)
    except Exception as e:
        import traceback
        tries -= 1
        time.sleep(5)
        traceback.print_exc(file=sys.stdout)
        elog('failed to fetch %s (%s)' % (bugid, e))
        return run_fetch(bugid, tries=tries)


def main():

    bugs = return_bug_list()
    from multiprocessing import Pool
    pool = Pool(processes=int(config.bz_fetchmulti))
    _ =  pool.map(run_fetch, bugs)
    complete = len(filter(bool, _))
    failed = len(_) - complete
    print '%s completed %s, failed %s' % (sys.argv[0], complete, failed)

if __name__ == '__main__':
    main()