blob: 13a8b5a315b7e3c3208d92fa49f77defadaf2b98 [file] [log] [blame]
from google.appengine.dist import use_library
use_library('django', '1.2')
import base64
import logging
import os
import time
from google.appengine.ext import blobstore
from google.appengine.api import taskqueue
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
import autotest_pb2
import security_token
import settings
import utils
from dash_db import Board, Build, Category, Job, JobPostTask, NetbookBoard
from dash_db import Test, TestName, TestPerfKey, TestHostKey
class BasePost(webapp.RequestHandler):
def post(self):
token = self.request.get('token')
logging.info('Posted here. %s' % self.request.headers)
if token != security_token.token():
# token is not correct:
return
self.do_post()
def do_post(self):
raise
class BuildPost(BasePost):
def get(self):
# need to revisit.
self.response.headers['Content-Type'] = 'text/plain'
self.response.out.write('Boards: %d\n' % Board.all().count())
for board in Board.all():
self.response.out.write(board.name + ':' + str(len(board.builds)) + ' builds.\n')
self.response.out.write('Builds: %d\n' % Build.all().count())
def do_post(self):
build_pb = autotest_pb2.Build()
decoded_pb_str = base64.decodestring(self.request.get('payload'))
build_pb.ParseFromString(decoded_pb_str)
logging.debug(str(build_pb))
instance = Build.create(build_pb.board, build_pb.name)
instance.buildlog_json_url = build_pb.buildlog_json_url
instance.buildlog_url = build_pb.buildlog_url
instance.build_image_url = build_pb.build_image_url
instance.build_started_time = build_pb.build_started_time
instance.build_finished_time = build_pb.build_finished_time
instance.chrome_version = build_pb.chrome_version
instance.chrome_svn_number = build_pb.chrome_svn_number
instance.put()
class JobPost(BasePost):
def get(self):
# need to revisit.
self.response.headers['Content-Type'] = 'text/plain'
self.response.out.write('Netbooks: %d\n' % Netbook.all().count(100))
for netbook in Netbook.all():
self.response.out.write(netbook.name + '\n')
self.response.out.write('Boards: %d\n' % Board.all().count(100))
for board in Board.all():
self.response.out.write(board.name + ':' + str(len(board.builds)) + ' builds.\n')
self.response.out.write(board.name + ':' + str(len(board.netbooks)) + ' netbooks.\n')
self.response.out.write('Builds: %d\n' % Build.all().count(100))
self.response.out.write('Jobs: %d\n' % Job.all().count(100))
def do_post(self):
job_task = JobPostTask()
job_task.payload_pb = self.request.get('payload')
job_task.put()
taskqueue.add(queue_name='jobpost',
url='/_tasks/jobpost',
payload=str(job_task.key().id()))
class JobHandler(webapp.RequestHandler):
def post(self):
started_time = time.time()
job_task = JobPostTask.get(int(self.request.body))
job_pb = autotest_pb2.Job()
decoded_pb_str = base64.decodestring(job_task.payload_pb)
job_pb.ParseFromString(decoded_pb_str)
logging.debug(str(job_pb))
job = Job.create(job_pb.afe_job_id)
job.job_name = job_pb.job_name
job.owner = job_pb.owner
job.build = job_pb.build
job.board = job_pb.board
job.netbook = job_pb.netbook
board = Board.get(job_pb.board)
if not board:
board = Board.create(job_pb.board)
board.add_build(job_pb.build)
board.add_netbook(job_pb.netbook)
board.put()
job.job_created_time = float(job_pb.job_created_time)
job.job_queued_time = float(job_pb.job_queued_time)
job.job_started_time = float(job_pb.job_started_time)
job.job_status = job_pb.job_status
job.completed = job_pb.completed
job.aborted = job_pb.aborted
build = Build.get(job_pb.board, job_pb.build)
if not build:
build = Build.create(job_pb.board, job_pb.build)
netbook_board = NetbookBoard.get(job_pb.netbook, job_pb.board)
if not netbook_board:
netbook_board = NetbookBoard.create(job_pb.netbook, job_pb.board)
job.job_finished_time = float(job_pb.job_finished_time)
job.passed = job_pb.passed
job.total = job_pb.total
categories = {}
for test_pb in job_pb.tests:
test = Test.create(test_pb.tko_test_id)
test.job_id = test_pb.afe_job_id
test.netbook = job.netbook
test.board = job.board
test.build = job.build
test.owner = job_pb.owner
test.test_name = test_pb.test_name
test.job_name = job.job_name
test.hostname = test_pb.hostname
test.status = test_pb.status
test.test_log_url = test_pb.test_log_url
test.test_started_time = test_pb.test_started_time
test.test_finished_time = test_pb.test_finished_time
if test.status != 'GOOD':
test.reason = test_pb.reason
if build.test_started_time is None or \
build.test_started_time > test_pb.test_started_time:
build.test_started_time = test_pb.test_started_time
if build.test_finished_time is None or \
build.test_finished_time < test_pb.test_finished_time:
build.test_finished_time = test_pb.test_finished_time
test.put()
for host_keyval in test_pb.host_keyvals:
test_host_key = TestHostKey.create(test_pb.tko_test_id, host_keyval.key)
test_host_key.test_name = test_pb.test_name
test_host_key.hostkey_value = host_keyval.value[:500]
test_host_key.put()
for perfkey_values in test_pb.perfkeys:
perfkey = TestPerfKey.create(test_pb.tko_test_id, perfkey_values.key)
perfkey.test_name = test_pb.test_name
for value in perfkey_values.values:
perfkey.add_value(value)
perfkey.put()
for category_name in utils.ParseCategories(job_pb.job_name,
test_pb.test_name):
category = categories.get(category_name, None)
if not category:
category = Category.get(category_name)
if not category:
category = Category.create(category_name)
category.is_job_name = category_name in settings.EXTRA_CATEGORIES
categories[category_name] = category
category.add_test(test_pb.test_name)
test_name = TestName.create(test_pb.test_name)
test_name.put()
for category in categories.values():
category.put()
netbook_board.add_category(category.name)
netbook_board.put()
build.put()
job.put()
job_task.delete()
email_alert = bool(self.request.get('email_alert', True))
if email_alert:
# TODO
logging.info('At the end sending out email alert based on email config.')
logging.info('job post task (%d) %d takes %d seconds.' %
(int(self.request.body), job_pb.afe_job_id,
time.time() - started_time))
return
application = webapp.WSGIApplication([('/post/build', BuildPost),
('/post/job', JobPost),
('/_tasks/jobpost', JobHandler),
],
debug=False)
def main():
run_wsgi_app(application)
if __name__ == "__main__":
main()