Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 # Copyright 2016 The Chromium Authors. All rights reserved. | |
| 2 # Use of this source code is governed by a BSD-style license that can be | |
| 3 # found in the LICENSE file. | |
| 4 | |
| 5 from datetime import date | |
| 6 from datetime import datetime | |
| 7 from datetime import timedelta | |
| 8 | |
| 9 import dev_appserver | |
| 10 dev_appserver.fix_sys_path() | |
|
stgao
2016/10/14 00:55:01
Should this be handled by the caller at the top of
Sharu Jiang
2016/10/14 18:14:49
Deleted this, it is legacy import from testing and
| |
| 11 | |
| 12 from crash.type_enums import CrashClient | |
| 13 import iterator | |
| 14 from model.crash.cracas_crash_analysis import CracasCrashAnalysis | |
| 15 from model.crash.fracas_crash_analysis import FracasCrashAnalysis | |
| 16 import remote_api | |
| 17 | |
| 18 _DEFAULT_BATCH_SIZE = 1000 | |
| 19 _TODAY = date.today().strftime('%Y-%m-%d') | |
| 20 _A_YEAR_AGO = (date.today() - timedelta(days=365)).strftime('%Y-%m-%d') | |
| 21 | |
| 22 COMMON_CRASH_FIELDS = ['crashed_version', 'stack_trace', 'signature', | |
| 23 'platform', 'client_id', 'customized_data'] | |
| 24 | |
| 25 | |
| 26 # TODO(katesonia): Switch to use fuction of objects encapsulating CrashClients, | |
| 27 # after the refactoring is done. | |
| 28 def GetAnalysisClassForClient(client_id): | |
| 29 if client_id == CrashClient.FRACAS: | |
| 30 return FracasCrashAnalysis | |
| 31 elif client_id == CrashClient.CRACAS: | |
| 32 return CracasCrashAnalysis | |
| 33 elif client_id == CrashClient.CLUSTERFUZZ: | |
| 34 # TODO(katesonia): Define ClusterfuzzCrashAnalysis. | |
| 35 return None | |
| 36 | |
| 37 return None | |
| 38 | |
| 39 | |
| 40 def GetQueryForClient(client_id, property_values, start_date, end_date, | |
| 41 datetime_pattern='%Y-%m-%d'): | |
| 42 if property_values is None: | |
| 43 property_values = {} | |
| 44 | |
| 45 start_date = datetime.strptime(start_date, datetime_pattern) | |
| 46 end_date = datetime.strptime(end_date, datetime_pattern) | |
| 47 cls = GetAnalysisClassForClient(client_id) | |
| 48 query = cls.query() | |
| 49 for property_name, value in property_values.iteritems(): | |
| 50 query = query.filter(getattr(cls, property_name) == value) | |
| 51 | |
| 52 return query.filter( | |
| 53 cls.requested_time >= start_date).filter( | |
| 54 cls.requested_time < end_date) | |
| 55 | |
| 56 | |
| 57 def IterateCrashes(client_id, | |
| 58 fields=None, | |
| 59 property_values=None, | |
| 60 start_date=_A_YEAR_AGO, | |
| 61 end_date=_TODAY, | |
| 62 batch_size=_DEFAULT_BATCH_SIZE, | |
| 63 batch_run=False, | |
| 64 app_id=None): | |
| 65 """Genrates query to query crashes and iterates crashes. | |
| 66 | |
| 67 Args: | |
| 68 client_id (CrashClient): One of CrashClient.FRACAS, CrashClient.CRACAS, | |
| 69 CrashClient.CLUSTERFUZZ. | |
| 70 fields (list): Field names of CrashAnalysis entity to project. | |
| 71 property_values (dict): Property values to filter. | |
| 72 start_date (str): Only iterate testcases after this date including this | |
| 73 date, format '%Y-%m-%d'. | |
| 74 end_date (str): Only iterate testcases before this date excluding this date, | |
| 75 format '%Y-%m-%d'. | |
| 76 batch_size (int): The number of crashes to query at one time. | |
| 77 batch_run (bool): If True, iterate batches of crashes, if | |
| 78 False, iterate each crash. | |
| 79 app_id (str): App engine app id. | |
| 80 | |
| 81 An example is available in crash_printer/print_crash.py. | |
| 82 """ | |
| 83 if fields is None: | |
| 84 fields = COMMON_CRASH_FIELDS | |
| 85 | |
| 86 if property_values is None: | |
| 87 property_values = {} | |
| 88 | |
| 89 query = GetQueryForClient(client_id, property_values, start_date, end_date) | |
| 90 for crash in iterator.Iterate(query, fields, batch_size=batch_size, | |
| 91 batch_run=batch_run, app_id=app_id): | |
| 92 yield crash | |
| OLD | NEW |