Index: dashboard/dashboard/pinpoint/handlers/new.py |
diff --git a/dashboard/dashboard/pinpoint/handlers/new.py b/dashboard/dashboard/pinpoint/handlers/new.py |
index f818a24533dc45771eedc2e02a4b23d11030be91..93ef1eb74aaf9259cfbf195cd5109676ba76b013 100644 |
--- a/dashboard/dashboard/pinpoint/handlers/new.py |
+++ b/dashboard/dashboard/pinpoint/handlers/new.py |
@@ -2,51 +2,71 @@ |
# Use of this source code is governed by a BSD-style license that can be |
# found in the LICENSE file. |
+import json |
+import logging |
import webapp2 |
+from google.appengine.api import users |
+from dashboard.api import oauth |
from dashboard.pinpoint.models import change |
from dashboard.pinpoint.models import job as job_module |
+from dashboard.services import gitiles_service |
+from dashboard import oauth2_decorator |
+ |
+ |
+class ParameterValidationError(Exception): |
+ pass |
class New(webapp2.RequestHandler): |
"""Handler that cooks up a fresh Pinpoint job.""" |
def post(self): |
+ logging.info('TRY NEW') |
+ try: |
+ try: |
+ self._CreateJob() |
+ except Exception as e: |
+ logging.info("EXCEPTION: %s" % str(e)) |
+ except oauth.NotLoggedInError: |
+ self._WriteErrorMessage('User not authenticated') |
+ except oauth.OAuthError: |
+ self._WriteErrorMessage('User authentication error') |
+ except ParameterValidationError as e: |
+ self._WriteErrorMessage(e.message) |
+ |
+ def _WriteErrorMessage(self, message): |
+ self.response.out.write(json.dumps({'error': message})) |
+ |
+ @oauth.Authorize |
+ def _CreateJob(self): |
"""Start a new Pinpoint job.""" |
- # TODO(dtu): Read the parameters from the request object. |
- # Not doing it for now because it's easier to run tests this way. |
- configuration = 'Mac Pro 10.11 Perf' |
- test_suite = 'speedometer' |
- test = None |
- metric = None |
- auto_explore = True |
+ configuration = self.request.get('configuration') |
+ test_suite = self.request.get('test_suite') |
+ test = self.request.get('test') |
+ metric = self.request.get('metric') |
+ auto_explore = self.request.get('auto_explore') == '1' |
change_1 = { |
'base_commit': { |
- 'repository': 'src', |
- 'git_hash': '2c1f8ed028edcb44c954cb2a0625a8f278933481', |
+ 'repository': self.request.get('start_repository'), |
+ 'git_hash': self.request.get('start_git_hash') |
} |
} |
+ |
change_2 = { |
'base_commit': { |
- 'repository': 'src', |
- 'git_hash': '858ceafc7cf4f11a6549b8c1ace839a45d943d68', |
+ 'repository': self.request.get('end_repository'), |
+ 'git_hash': self.request.get('end_git_hash') |
} |
} |
# Validate parameters. |
- try: |
- if metric and not test_suite: |
- raise ValueError("Specified a metric but there's no test_suite to run.") |
- changes = (change.Change.FromDict(change_1), |
- change.Change.FromDict(change_2)) |
- except (KeyError, ValueError) as e: |
- self.response.set_status(400) |
- self.response.write(e) |
- return |
+ self._ValidateTestPath(configuration, test_suite, test, metric) |
# Convert parameters to canonical internal representation. |
+ changes = self._ValidateChanges(change_1, change_2) |
# Create job. |
job = job_module.Job.New( |
@@ -64,7 +84,42 @@ class New(webapp2.RequestHandler): |
job_id = job.put().urlsafe() |
# Start job. |
- job.Start() |
- job.put() |
+ #job.Start() |
+ #job.put() |
+ |
+ self.response.out.write(json.dumps({ |
+ 'jobId': job_id |
+ })) |
+ logging.info('SUCCESS') |
- self.response.write(job_id) |
+ def _ValidateChanges(self, change_1, change_2): |
+ try: |
+ changes = (change.Change.FromDict(change_1), |
+ change.Change.FromDict(change_2)) |
+ except (KeyError, ValueError) as e: |
+ logging.info('FAIL1: %s' % str(e)) |
+ raise ParameterValidationError(str(e)) |
+ |
+ try: |
+ commits = gitiles_service.CommitRange( |
+ changes[0].base_commit.repository_url, |
+ changes[0].base_commit.git_hash, |
+ changes[1].base_commit.git_hash) |
+ if len(commits) <= 1: |
+ logging.info('FAIL: bad range') |
+ raise ParameterValidationError('Commit range too small.') |
+ except gitiles_service.NotFoundError as e: |
+ logging.info('FAIL2: %s' % str(e)) |
+ raise ParameterValidationError(e.message) |
+ |
+ return changes |
+ |
+ def _ValidateTestPath(self, configuration, test_suite, test, metric): |
+ try: |
+ if metric and not test_suite: |
+ logging.info('FAIL: suite') |
+ raise ParameterValidationError( |
+ "Specified a metric but there's no test_suite to run.") |
+ except (KeyError, ValueError) as e: |
+ logging.info('FAIL3: %s' % str(e)) |
+ raise ParameterValidationError(str(e)) |