blob: c2aec20aa16dfaa5ff6be2a3f32086b20941a2f9 [file]
# Copyright 2016 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import base64
from google.appengine.ext import ndb
from libs import time_util
from model.base_build_model import BaseBuildModel
from model.base_swarming_task import BaseSwarmingTask
class FlakeSwarmingTaskData(ndb.Model):
task_id = ndb.StringProperty(indexed=False)
status = ndb.IntegerProperty(indexed=False)
error = ndb.JsonProperty(indexed=False)
created_time = ndb.DateTimeProperty(indexed=False)
started_time = ndb.DateTimeProperty(indexed=False)
completed_time = ndb.DateTimeProperty(indexed=False)
cache_hit = ndb.IntegerProperty(indexed=False)
number_of_iterations = ndb.IntegerProperty(indexed=False)
number_of_passes = ndb.IntegerProperty(indexed=False)
has_valid_artifact = ndb.BooleanProperty(indexed=False)
class FlakeSwarmingTask(BaseSwarmingTask, BaseBuildModel):
"""Represents a swarming task for a step w/candidate flaky tests.
"""
@staticmethod
def _CreateSwarmingTaskId(master_name, builder_name, build_number, step_name,
test_name): # pragma: no cover
encoded_test_name = base64.urlsafe_b64encode(test_name)
return '%s/%s/%s/%s/%s' % (master_name, builder_name, build_number,
step_name, encoded_test_name)
@staticmethod
def _CreateKey(master_name, builder_name, build_number, step_name,
test_name): # pragma: no cover
return ndb.Key('FlakeSwarmingTask',
FlakeSwarmingTask._CreateSwarmingTaskId(
master_name, builder_name, build_number, step_name,
test_name))
@staticmethod
def Create(master_name, builder_name, build_number, step_name,
test_name): # pragma: no cover
task = FlakeSwarmingTask(key=FlakeSwarmingTask._CreateKey(
master_name, builder_name, build_number, step_name, test_name))
task.requested_time = time_util.GetUTCNow()
return task
@ndb.ComputedProperty
def step_name(self):
return self.key.pairs()[0][1].split('/')[3]
@ndb.ComputedProperty
def test_name(self):
return base64.urlsafe_b64decode(self.key.pairs()[0][1].split('/')[4])
@staticmethod
def Get(master_name, builder_name, build_number, step_name,
test_name): # pragma: no cover
return FlakeSwarmingTask._CreateKey(master_name, builder_name, build_number,
step_name, test_name).get()
def GetFlakeSwarmingTaskData(self):
flake_swarming_task_data = FlakeSwarmingTaskData()
flake_swarming_task_data.task_id = self.task_id
flake_swarming_task_data.created_time = self.created_time
flake_swarming_task_data.started_time = self.started_time
flake_swarming_task_data.completed_time = self.completed_time
flake_swarming_task_data.error = self.error
flake_swarming_task_data.number_of_iterations = self.tries
flake_swarming_task_data.number_of_passes = self.successes
flake_swarming_task_data.status = self.status
flake_swarming_task_data.has_valid_artifact = self.has_valid_artifact
# TODO(lijeffrey): Determine cache_hit.
return flake_swarming_task_data
# Number of runs the test passed.
successes = ndb.IntegerProperty(default=0, indexed=False)
# How many times the test was rerun.
tries = ndb.IntegerProperty(default=0, indexed=False)
# Whether this task is expected to be run.
queued = ndb.BooleanProperty(default=False)
# Whether this task has valid artifact.
has_valid_artifact = ndb.BooleanProperty(default=True)
def Reset(self):
"""Resets the task as if it's a new task."""
super(FlakeSwarmingTask, self).Reset()
self.successes = None
self.tries = None