blob: f0a6bb80c60698d3bde2927b7a7a8b3dc2f52a3d [file] [log] [blame]
import logging
from google.appengine.dist import use_library
use_library('django', '1.2')
from google.appengine.ext import db
import filters
import settings
import utils
class BaseModel(db.Model):
@classmethod
def PK(cls, id_or_name):
return db.Key.from_path(cls.__name__, id_or_name)
@classmethod
def get(cls, id_or_name):
return db.get(cls.PK(id_or_name))
@classmethod
def create(cls, id_or_name):
instance = cls(key=cls.PK(id_or_name))
return instance
class Netbook(BaseModel):
#PK
name = property(lambda obj:obj.key().name())
boards = db.StringListProperty()
def add_board(self, board_name):
if board_name not in self.boards:
self.boards.append(board_name)
self.boards.sort()
def viewable(self, email):
return filters.IsViewable(email, self.name)
class Board(BaseModel):
#PK
name = property(lambda obj: obj.key().name())
netbooks = db.StringListProperty()
builds = db.StringListProperty()
def add_netbook(self, netbook_name):
netbook = Netbook.get(netbook_name)
if not netbook:
netbook = Netbook.create(netbook_name)
netbook.add_board(self.name)
netbook.put()
if netbook_name not in self.netbooks:
self.netbooks.append(netbook_name)
self.netbooks.sort()
def add_build(self, build_name):
if build_name not in self.builds:
self.builds.append(build_name)
self.builds.sort(utils.BuildCmp)
self.builds = self.builds[:settings.MAX_BUILDS]
def viewable(self, email):
viewable = False
for netbook_name in self.netbooks:
viewable = viewable or filters.IsViewable(email, netbook_name)
return viewable
class Category(BaseModel):
#PK
name = property(lambda obj: obj.key().name())
is_job_name = db.BooleanProperty()
test_names = db.StringListProperty()
def add_test(self, test_name):
if test_name not in self.test_names:
self.test_names.append(test_name)
self.test_names.sort()
class Build(db.Model):
name = db.StringProperty()
board = db.StringProperty()
version = db.StringProperty()
build_hash = db.StringProperty()
seq = db.IntegerProperty()
buildlog_json_url = db.StringProperty()
buildlog_url = db.StringProperty()
build_image_url = db.StringProperty()
build_started_time = db.FloatProperty()
build_finished_time = db.FloatProperty()
test_started_time = db.FloatProperty()
test_finished_time = db.FloatProperty()
chrome_version = db.StringProperty()
chrome_svn_number = db.IntegerProperty()
@classmethod
def PK(cls, board_name, build_name):
name = board_name + '$' + build_name
return db.Key.from_path(cls.__name__, name)
@classmethod
def get(cls, board_name, build_name):
return db.get(cls.PK(board_name, build_name))
@classmethod
def create(cls, board_name, build_name):
instance = cls(key=cls.PK(board_name, build_name))
instance.name = build_name
instance.board = board_name
(instance.version, instance.build_hash,
instance.seq) = utils.BuildSplit(build_name)
return instance
def get_chrome_version(self):
return '%s (%s)' % (self.chrome_version, self.chrome_svn_number)
class Job(BaseModel):
id = property(lambda obj: obj.key().id())
job_name = db.StringProperty()
owner = db.StringProperty()
job_created_time = db.FloatProperty()
job_queued_time = db.FloatProperty()
job_started_time = db.FloatProperty()
job_finished_time = db.FloatProperty()
job_status = db.BooleanProperty()
completed = db.BooleanProperty()
aborted = db.BooleanProperty()
board = db.StringProperty()
build = db.StringProperty()
netbook = db.StringProperty()
passed = db.IntegerProperty()
total = db.IntegerProperty()
class Test(BaseModel):
id = property(lambda x: x.key().id())
job_id = db.IntegerProperty()
test_name = db.StringProperty()
job_name = db.StringProperty()
owner = db.StringProperty()
status = db.StringProperty()
hostname = db.StringProperty()
chrome_version = db.StringProperty()
test_log_url = db.StringProperty()
test_started_time = db.FloatProperty()
test_finished_time = db.FloatProperty()
board = db.StringProperty()
build = db.StringProperty()
netbook = db.StringProperty()
reason = db.TextProperty()
def get_test_log_url(self):
if self.test_log_url:
return self.test_log_url
if self.status == 'GOOD':
suffix = 'DEBUG'
else:
suffix = 'ERROR'
return 'results/%d-%s/group0/%s/%s/debug/%s.%s' % (self.job_id, self.owner,
self.hostname, self.test_name, self.test_name, suffix)
class TestHostKey(db.Model):
test_id = db.IntegerProperty()
test_name = db.StringProperty()
hostkey_name = db.StringProperty()
hostkey_value = db.StringProperty()
@classmethod
def PK(cls, test_id, hostkey_name):
name = str(test_id) + '$' + hostkey_name
return db.Key.from_path(cls.__name__, name)
@classmethod
def get(cls, test_id, hostkey_name):
return db.get(key=cls.PK(test_id, hostkey_name))
@classmethod
def create(cls, test_id, hostkey_name):
key = cls.PK(test_id, hostkey_name)
instance = cls(key=key)
instance.test_id = test_id
instance.hostkey_name = hostkey_name
return instance
class TestPerfKey(db.Model):
test_id = db.IntegerProperty()
test_name = db.StringProperty()
perfkey_name = db.StringProperty()
values = db.ListProperty(float)
@classmethod
def PK(cls, test_id, perfkey_name):
name = str(test_id) + '$' + perfkey_name
return db.Key.from_path(cls.__name__, name)
@classmethod
def get(cls, test_id, perfkey_name):
return db.get(key=cls.PK(test_id, perfkey_name))
@classmethod
def create(cls, test_id, perfkey_name):
key = cls.PK(test_id, perfkey_name)
instance = cls(key=key)
instance.test_id = test_id
instance.perfkey_name = perfkey_name
return instance
def add_value(self, value):
self.values.append(value)
class TestName(BaseModel):
#PK
name = property(lambda obj:obj.key().name())
class NetbookBoard(db.Model):
categories = db.StringListProperty()
@classmethod
def PK(cls, netbook_name, board_name):
name = netbook_name + '$' + board_name
return db.Key.from_path(cls.__name__, name)
@classmethod
def get(cls, netbook_name, board_name):
return db.get(cls.PK(netbook_name, board_name))
@classmethod
def create(cls, netbook_name, board_name):
instance = cls(key=cls.PK(netbook_name, board_name))
return instance
def add_category(self, category_name):
if category_name not in self.categories:
self.categories.append(category_name)
self.categories.sort()
# The task queue only accepy payload less or equal to 10K. And apparently our
# data is exceeding that limit. So we have to put the data into datastore in
# order to carry around. That is a lose in performance.
class JobPostTask(BaseModel):
payload_pb = db.TextProperty()