Index: tools/android/loading/cloud/frontend/frontend_job.py |
diff --git a/tools/android/loading/cloud/frontend/frontend_job.py b/tools/android/loading/cloud/frontend/frontend_job.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0c5783e48c0033ea4d5698ba3f1c9099f9c7a3d2 |
--- /dev/null |
+++ b/tools/android/loading/cloud/frontend/frontend_job.py |
@@ -0,0 +1,90 @@ |
+# 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 |