def HandlePost(self): """Triggers an analysis on demand and redirects to the result page.""" url = self.request.get('url').strip() is_admin = auth_util.IsCurrentUserAdmin() user_email = auth_util.GetUserEmail() if not acl.CanTriggerNewAnalysis(user_email, is_admin): # No permission to schedule a new analysis. return self.CreateRedirect('/waterfall/failure?redirect=1&url=%s' % url) build_info = buildbot.ParseBuildUrl(url) if not build_info: return BaseHandler.CreateError( 'Url "%s" is not pointing to a build.' % url, 404) master_name, builder_name, build_number = build_info analysis = None if not (waterfall_config.MasterIsSupported(master_name) or auth_util.IsCurrentUserAdmin()): # If the build failure was already analyzed, just show it to the user. analysis = WfAnalysis.Get(master_name, builder_name, build_number) if not analysis: return BaseHandler.CreateError( 'Master "%s" is not supported yet.' % master_name, 501) if not analysis: # Only allow admin to force a re-run and set the build_completed. force = is_admin and self.request.get('force') == '1' build = build_util.GetBuildInfo(master_name, builder_name, build_number) if not build: return BaseHandler.CreateError( 'Can\'t get information about build "%s/%s/%s".' % (master_name, builder_name, build_number), 501) if not build.completed and force: return BaseHandler.CreateError( 'Can\'t force a rerun for an incomplete build "%s/%s/%s".' % (master_name, builder_name, build_number), 501) build_failure_analysis_pipelines.ScheduleAnalysisIfNeeded( master_name, builder_name, build_number, build_completed=build.completed, force=force, queue_name=constants.WATERFALL_ANALYSIS_QUEUE) return self.CreateRedirect('/waterfall/failure?redirect=1&url=%s' % url)
def testUnkownUserCanNotTriggerNewAnalysis(self): self.assertFalse(acl.CanTriggerNewAnalysis('*****@*****.**', False))
def testGooglerCanTriggerNewAnalysis(self): self.assertTrue(acl.CanTriggerNewAnalysis('*****@*****.**', False))
def testWhitelistedStagingAppAccountCanTriggerNewAnalysis(self, _): for email in constants.WHITELISTED_STAGING_APP_ACCOUNTS: self.assertTrue(acl.CanTriggerNewAnalysis(email, False))
def testAdminCanTriggerNewAnalysis(self): self.assertTrue(acl.CanTriggerNewAnalysis('*****@*****.**', True))