OLD | NEW |
---|---|
1 <!-- | 1 <!-- |
2 Copyright 2014 The Chromium Authors. All rights reserved. | 2 Copyright 2014 The Chromium Authors. All rights reserved. |
3 Use of this source code is governed by a BSD-style license that can be | 3 Use of this source code is governed by a BSD-style license that can be |
4 found in the LICENSE file. | 4 found in the LICENSE file. |
5 --> | 5 --> |
6 | 6 |
7 <link rel="import" href="../lib/net.html"> | 7 <link rel="import" href="../lib/net.html"> |
8 <link rel="import" href="../lib/update-util.html"> | 8 <link rel="import" href="../lib/update-util.html"> |
9 <link rel="import" href="ct-builder-revisions.html"> | 9 <link rel="import" href="ct-builder-revisions.html"> |
10 <link rel="import" href="ct-failure.html"> | 10 <link rel="import" href="ct-failure.html"> |
11 <link rel="import" href="ct-failure-group.html"> | 11 <link rel="import" href="ct-failure-group.html"> |
12 <link rel="import" href="ct-builder-failure-group-data.html"> | |
12 <link rel="import" href="ct-sheriff-failure-group-data.html"> | 13 <link rel="import" href="ct-sheriff-failure-group-data.html"> |
13 <link rel="import" href="ct-trooper-failure-group-data.html"> | 14 <link rel="import" href="ct-trooper-failure-group-data.html"> |
14 <link rel="import" href="ct-commit-list.html"> | 15 <link rel="import" href="ct-commit-list.html"> |
15 | 16 |
16 <script> | 17 <script> |
17 function CTFailures(commitLog) { | 18 function CTFailures(commitLog) { |
18 this.commitLog = commitLog; | 19 this.commitLog = commitLog; |
19 this.builderLatestRevisions = null; | 20 this.builderLatestInfo = null; |
20 // Maps a tree id to an array of CTFailureGroups within that tree. | 21 // Maps a tree id to an array of CTFailureGroups within that tree. |
21 this.failures = null; | 22 this.failures = null; |
22 this.lastUpdateDate = null; | 23 this.lastUpdateDate = null; |
23 } | 24 } |
24 | 25 |
25 (function() { | 26 (function() { |
26 'use strict'; | 27 'use strict'; |
27 | 28 |
28 // FIXME: This could potentially move onto CTSheriffFailureGroupData as it isn't relevant to | 29 // FIXME: This could potentially move onto CTSheriffFailureGroupData as it isn't relevant to |
29 // trooper failures. | 30 // trooper failures. |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
86 }; | 87 }; |
87 | 88 |
88 CTFailures.prototype.update = function() { | 89 CTFailures.prototype.update = function() { |
89 var annotationPromise = CTFailureGroup.fetchAnnotations(); | 90 var annotationPromise = CTFailureGroup.fetchAnnotations(); |
90 return Promise.all([annotationPromise, net.json('http://sheriff-o-matic.appspo t.com/alerts'), | 91 return Promise.all([annotationPromise, net.json('http://sheriff-o-matic.appspo t.com/alerts'), |
91 net.json('http://trooper-o-matic.appspot.com/alerts')]).then(function(data _array) { | 92 net.json('http://trooper-o-matic.appspot.com/alerts')]).then(function(data _array) { |
92 var annotations = data_array[0]; | 93 var annotations = data_array[0]; |
93 var sheriff_data = data_array[1]; | 94 var sheriff_data = data_array[1]; |
94 var trooper_data = data_array[2]; | 95 var trooper_data = data_array[2]; |
95 | 96 |
96 // FIXME: Don't special-case the blink master. | 97 this.builderLatestInfo = {}; |
97 this.builderLatestRevisions = new CTBuilderRevisions(sheriff_data.latest_bui lder_info['chromium.webkit']); | 98 |
99 Object.keys(sheriff_data.latest_builder_info, function (master, data) { | |
100 this.builderLatestInfo[master] = new CTBuilderRevisions(data); | |
ojan
2014/09/10 00:40:03
Do we need CTBuilderRevisions at all anymore? Can
| |
101 }.bind(this)); | |
98 var newFailures = {}; | 102 var newFailures = {}; |
99 this.lastUpdateDate = new Date(sheriff_data.date * 1000); | 103 this.lastUpdateDate = new Date(sheriff_data.date * 1000); |
100 this._mungeAlerts(sheriff_data.alerts); | 104 this._mungeAlerts(sheriff_data.alerts); |
101 // FIXME: Change builder_alerts to expose the alerts as a map instead of an array. | 105 // FIXME: Change builder_alerts to expose the alerts as a map instead of an array. |
102 var alertsByKey = {} | 106 var alertsByKey = {} |
103 sheriff_data.alerts.forEach(function(alert) { | 107 sheriff_data.alerts.forEach(function(alert) { |
104 alertsByKey[alert.key] = alert; | 108 alertsByKey[alert.key] = alert; |
105 }); | 109 }); |
106 // Update |failures| with the appropriate CTFailureGroup's for each | 110 // Update |failures| with the appropriate CTFailureGroup's for each |
107 // tree. | 111 // tree. |
108 sheriff_data.range_groups.forEach(function(rangeGroup) { | 112 sheriff_data.range_groups.forEach(function(rangeGroup) { |
109 this._processFailuresForRangeGroup(newFailures, rangeGroup, alertsByKey, a nnotations); | 113 this._processFailuresForRangeGroup(newFailures, rangeGroup, alertsByKey, a nnotations); |
110 }.bind(this)); | 114 }.bind(this)); |
111 // Sort failure groups so that newer failures are shown at the top | 115 // Sort failure groups so that newer failures are shown at the top |
112 // of the UI. | 116 // of the UI. |
117 | |
113 Object.keys(newFailures, function (tree, failuresByTree) { | 118 Object.keys(newFailures, function (tree, failuresByTree) { |
114 failuresByTree.sort(this._failureByTreeListComparator.bind(this, tree)); | 119 failuresByTree.sort(this._failureByTreeListComparator.bind(this, tree)); |
115 }.bind(this)); | 120 }.bind(this)); |
121 | |
122 this._checkBuildersForFailures(newFailures); | |
116 this.failures = updateUtil.updateLeft(this.failures, newFailures); | 123 this.failures = updateUtil.updateLeft(this.failures, newFailures); |
117 this._processTrooperFailures(trooper_data); | 124 this._processTrooperFailures(trooper_data); |
118 }.bind(this)); | 125 }.bind(this)); |
119 }; | 126 }; |
120 | 127 |
121 CTFailures.prototype._failureComparator = function(a, b) { | 128 CTFailures.prototype._failureComparator = function(a, b) { |
122 if (a.step > b.step) | 129 if (a.step > b.step) |
123 return 1; | 130 return 1; |
124 if (a.step < b.step) | 131 if (a.step < b.step) |
125 return -1 | 132 return -1 |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
194 }) | 201 }) |
195 treeFailures.sort(this._failureComparator); | 202 treeFailures.sort(this._failureComparator); |
196 | 203 |
197 if (!newFailures[tree]) | 204 if (!newFailures[tree]) |
198 newFailures[tree] = []; | 205 newFailures[tree] = []; |
199 var commitList = new CTCommitList(this.commitLog, rangeGroup.likely_revision s); | 206 var commitList = new CTCommitList(this.commitLog, rangeGroup.likely_revision s); |
200 newFailures[tree].push(new CTFailureGroup(rangeGroup.sort_key, new CTSheriff FailureGroupData(treeFailures, commitList))); | 207 newFailures[tree].push(new CTFailureGroup(rangeGroup.sort_key, new CTSheriff FailureGroupData(treeFailures, commitList))); |
201 }.bind(this)); | 208 }.bind(this)); |
202 }; | 209 }; |
203 | 210 |
211 CTFailures.prototype._checkBuildersForFailures = function(newFailures) { | |
212 var timeThreshold = { | |
213 "idle": null, // FIXME: We should alert if a bot is idle with jobs queued | |
214 "building": 3 * 60 * 60, | |
215 "offline": 0.5 * 60 * 60 | |
216 }; | |
217 Object.keys(this.builderLatestInfo, function(master, builders) { | |
ojan
2014/09/10 00:40:03
In retrospect, we should move all this logic to bu
| |
218 // FIXME: Don't special case blink and chromium.webkit | |
219 if (master == "chromium.webkit") { | |
220 var tree = "blink"; | |
221 Object.keys(builders, function(builder, builderInfo) { | |
222 var timeSinceLastUpdate = (this.lastUpdateDate.valueOf() / 1000) - buil derInfo.lastUpdateTime; | |
223 var alert; | |
224 // If we add more failing criteria, this should be made into a loop over functions that handle the different errors. | |
225 if (timeSinceLastUpdate > timeThreshold[builderInfo.state] && builderInf o.state != "idle") | |
226 alert = (timeSinceLastUpdate / (60 * 60)).toFixed(2) + " hours "; | |
227 | |
228 var resultsByBuilder = { }; | |
229 resultsByBuilder[builder] = { | |
230 "actual": "UNKNOWN", | |
231 "masterUrl": "http://build.chromium.org/p/" + master | |
232 } | |
233 if (alert) { | |
234 if (!newFailures[tree]) | |
235 newFailures[tree] = []; | |
236 var key = master + "::" + builder + "::" + builderInfo.state; | |
237 var failure = new CTFailure(builderInfo.state, alert, resultsByBuilder ); | |
238 var data = new CTBuilderFailureGroupData(failure, builder, "http://bui ld.chromium.org/p/" + master + "/builders/" + builder); | |
239 newFailures[tree].push(new CTFailureGroup(key, data, 'builders')); | |
240 } | |
241 }.bind(this)); | |
242 } | |
243 }.bind(this)); | |
244 }; | |
245 | |
204 })(); | 246 })(); |
247 | |
205 </script> | 248 </script> |
OLD | NEW |