Beispiel #1
0
    def get(self):
        """Handle a GET request."""
        # pylint: disable=unexpected-keyword-arg

        # Memoize all project and job names.
        _ = data_handler.get_all_project_names(__memoize_force__=True)
        _ = data_handler.get_all_job_type_names(__memoize_force__=True)

        # Memoize both variants of get_all_fuzzer_names_including_children.
        _ = data_handler.get_all_fuzzer_names_including_children(
            include_parents=True, __memoize_force__=True)
        _ = data_handler.get_all_fuzzer_names_including_children(
            __memoize_force__=True)

        # Memoize expensive testcase attribute calls.
        for testcase_id in data_handler.get_open_testcase_id_iterator():
            try:
                testcase = data_handler.get_testcase_by_id(testcase_id)
            except errors.InvalidTestcaseError:
                # Already deleted.
                continue

            blobs.get_blob_size(testcase.fuzzed_keys)
            blobs.get_blob_size(testcase.minimized_keys)

        self.response.headers['Content-Type'] = 'text/plain'
        self.response.out.write('OK')
        self.response.set_status(200)
Beispiel #2
0
  def get(self):
    """Handle a GET request."""
    # pylint: disable=unexpected-keyword-arg
    _ = data_handler.get_all_project_names(__memoize_force__=True)
    _ = data_handler.get_all_job_type_names(__memoize_force__=True)

    # Memorize both variants of get_all_fuzzer_names_including_children.
    _ = data_handler.get_all_fuzzer_names_including_children(
        include_parents=True, __memoize_force__=True)
    _ = data_handler.get_all_fuzzer_names_including_children(
        __memoize_force__=True)

    self.response.headers['Content-Type'] = 'text/plain'
    self.response.out.write('OK')
    self.response.set_status(200)
Beispiel #3
0
def get_top_crashes_for_all_projects_and_platforms():
    """Return top crashes for all projects and platforms."""
    last_hour = crash_stats.get_last_successful_hour()
    if not last_hour:
        # No crash stats available, skip.
        return {}

    jobs, platforms = get_jobs_and_platforms_for_top_crashes()
    project_names = data_handler.get_all_project_names()
    top_crashes_by_project_and_platform_map = {}

    for project_name in project_names:
        top_crashes_by_project_and_platform_map[project_name] = {}

        for platform in platforms:
            where_clause = (
                'crash_type NOT IN UNNEST(%s) AND '
                'crash_state NOT IN UNNEST(%s) AND '
                'job_type IN UNNEST(%s) AND '
                'platform LIKE %s AND '
                'project = %s' %
                (json.dumps(TOP_CRASHES_IGNORE_CRASH_TYPES),
                 json.dumps(TOP_CRASHES_IGNORE_CRASH_STATES),
                 json.dumps(list(jobs)), json.dumps(platform.lower() + '%'),
                 json.dumps(project_name)))

            for keyword in TOP_CRASHES_IGNORE_CRASH_STATE_KEYWORDS:
                where_clause += ' AND crash_state NOT LIKE "%%%s%%"' % keyword

            _, rows = crash_stats.get(end=last_hour,
                                      block='day',
                                      days=TOP_CRASHES_DAYS_LOOKBEHIND,
                                      group_by='platform',
                                      where_clause=where_clause,
                                      group_having_clause='',
                                      sort_by='total_count',
                                      offset=0,
                                      limit=TOP_CRASHES_LIMIT)
            if rows:
                rows = [
                    s for s in rows
                    if s['totalCount'] >= TOP_CRASHES_MIN_THRESHOLD
                ]
            top_crashes_by_project_and_platform_map[project_name][platform] = (
                rows or [])

    return top_crashes_by_project_and_platform_map
Beispiel #4
0
def get_top_crashes_for_all_projects_and_platforms():
  """Return top crashes for all projects and platforms."""
  last_hour = crash_stats.get_last_successful_hour()
  if not last_hour:
    # No crash stats available, skip.
    return {}

  jobs, platforms = get_jobs_and_platforms_for_top_crashes()
  project_names = data_handler.get_all_project_names()
  top_crashes_by_project_and_platform_map = {}

  for project_name in project_names:
    top_crashes_by_project_and_platform_map[project_name] = {}

    for platform in platforms:
      where_clause = ("crash_type NOT IN UNNEST(%s) AND "
                      "crash_state NOT IN UNNEST(%s) AND "
                      "job_type IN UNNEST(%s) AND "
                      "platform LIKE %s AND "
                      "project = %s" % (
                          json.dumps(TOP_CRASHES_IGNORE_CRASH_TYPES),
                          json.dumps(TOP_CRASHES_IGNORE_CRASH_STATES),
                          json.dumps(list(jobs)),
                          json.dumps(platform.lower() + "%"),
                          json.dumps(project_name),
                      ))

      _, rows = crash_stats.get(
          end=last_hour,
          block="day",
          days=TOP_CRASHES_DAYS_LOOKBEHIND,
          group_by="platform",
          where_clause=where_clause,
          group_having_clause="",
          sort_by="total_count",
          offset=0,
          limit=TOP_CRASHES_LIMIT,
      )
      if rows:
        rows = [s for s in rows if s["totalCount"] >= TOP_CRASHES_MIN_THRESHOLD]
      top_crashes_by_project_and_platform_map[project_name][
          platform] = rows or []

  return top_crashes_by_project_and_platform_map
Beispiel #5
0
 def get(self):
     """Get and render the testcase list in HTML."""
     result, params = get_result(self)
     field_values = {
         'projects':
         data_handler.get_all_project_names(),
         'fuzzers':
         data_handler.get_all_fuzzer_names_including_children(
             include_parents=True),
         'jobs':
         data_handler.get_all_job_type_names(),
         'shouldShowImpact':
         utils.is_chromium()
     }
     self.render('testcase-list.html', {
         'fieldValues': field_values,
         'result': result,
         'params': params
     })
    def get(self):
        """Handle a GET request."""
        project = request.get('project')

        if access.has_access():
            # User is an internal user of ClusterFuzz (eg: ClusterFuzz developer).

            # Show all projects in the list, since this allows user to pick another
            # project as needed.
            projects_list = data_handler.get_all_project_names()

            # Filter fuzzers and job list if a project is provided.
            fuzzers_list = (
                data_handler.get_all_fuzzer_names_including_children(
                    include_parents=True, project=project))
            jobs_list = data_handler.get_all_job_type_names(project=project)
        else:
            # User is an external user of ClusterFuzz (eg: non-Chrome dev who
            # submitted a fuzzer or someone with a project in OSS-Fuzz).
            user_email = helpers.get_user_email()

            # TODO(aarya): Filter fuzzer and job if |project| is provided.
            fuzzers_list = sorted(
                external_users.allowed_fuzzers_for_user(user_email,
                                                        include_from_jobs=True,
                                                        include_parents=True))
            if not fuzzers_list:
                # User doesn't actually have access to any fuzzers.
                raise helpers.AccessDeniedException(
                    "You don't have access to any fuzzers.")

            jobs_list = sorted(
                external_users.allowed_jobs_for_user(user_email))
            projects_list = sorted(
                {data_handler.get_project_name(job)
                 for job in jobs_list})

        result = {
            'projects': projects_list,
            'fuzzers': fuzzers_list,
            'jobs': jobs_list,
        }
        return self.render_json(result)
Beispiel #7
0
 def get(self):
   """Get and render the crash stats in HTML."""
   result, params = get_result(self)
   field_values = {
       'fuzzers':
           data_handler.get_all_fuzzer_names_including_children(
               include_parents=True),
       'jobs':
           data_handler.get_all_job_type_names(),
       'platforms':
           get_all_platforms(),
       'projects':
           data_handler.get_all_project_names(),
       'minHour':
           crash_stats_common.get_min_hour(),
       'maxHour':
           crash_stats_common.get_max_hour()
   }
   self.render('crash-stats.html', {
       'result': result,
       'fieldValues': field_values,
       'params': params
   })