blob: 0c5783e48c0033ea4d5698ba3f1c9099f9c7a3d2 [file] [log] [blame]
# 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.
from google.appengine.ext import ndb
class FrontendJob(ndb.Model):
"""Class representing a frontend job.
A frontend job is a Clovis task sent by the user, and associated metadata
(such as the username, the start time...).
It is persisted in the Google Cloud datastore.
All frontend jobs are ancestors of a single entity called 'FrontendJobList'.
This allows to benefit from strong consistency when querying the job
associated to a tag.
"""
# Base URL path to get information about a job.
SHOW_JOB_URL = '/show_job'
# ndb properties persisted in the datastore. Indexing is not needed.
email = ndb.StringProperty(indexed=False)
status = ndb.StringProperty(indexed=False)
task_url = ndb.StringProperty(indexed=False)
eta = ndb.DateTimeProperty(indexed=False)
start_time = ndb.DateTimeProperty(auto_now_add=True, indexed=False)
# Not indexed by default.
clovis_task = ndb.TextProperty(compressed=True, indexed=False)
log = ndb.TextProperty(indexed=False)
@classmethod
def _GetParentKeyFromTag(cls, tag):
"""Gets the key that can be used to retrieve a frontend job from the job
list.
"""
return ndb.Key('FrontendJobList', tag)
@classmethod
def CreateForTag(cls, tag):
"""Creates a frontend job associated with tag."""
parent_key = cls._GetParentKeyFromTag(tag)
return cls(parent=parent_key)
@classmethod
def GetFromTag(cls, tag):
"""Gets the frontend job associated with tag."""
parent_key = cls._GetParentKeyFromTag(tag)
return cls.query(ancestor=parent_key).get()
@classmethod
def DeleteForTag(cls, tag):
"""Deletes the frontend job assowiated with tag."""
parent_key = cls._GetParentKeyFromTag(tag)
frontend_job = cls.query(ancestor=parent_key).get(keys_only=True)
if frontend_job:
frontend_job.delete()
@classmethod
def ListJobs(cls):
"""Lists all the frontend jobs.
Returns:
list of strings: The list of tags corresponding to existing frontend jobs.
"""
return [key.parent().string_id() for key in cls.query().fetch(
100, keys_only=True)]
@classmethod
def GetJobURL(cls, tag):
"""Gets the URL that can be used to get information about a specific job."""
return cls.SHOW_JOB_URL + '?tag=' + tag
def RenderAsHtml(self):
"""Render a short job description as a HTML table.
The log and ClovisTask are not included, because they are potentially very
large.
"""
html = '<table>'
for p in FrontendJob._properties:
if p == 'log' or p == 'clovis_task':
continue
value = getattr(self, p)
if value:
html += '<tr><td>' + p + '</td><td>' + str(value) + '</td></tr>'
html += '</table>'
return html