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