Merge "Fix races in timer trigger tests."
diff --git a/doc/source/zuul.rst b/doc/source/zuul.rst
index 408b0ac..21d3bae 100644
--- a/doc/source/zuul.rst
+++ b/doc/source/zuul.rst
@@ -418,34 +418,13 @@
containing 'retrigger' somewhere in the comment text are added to a
change.
- *require-approval*
+ *require-approval* (deprecated)
This may be used for any event. It requires that a certain kind
of approval be present for the current patchset of the change (the
- approval could be added by the event in question). It takes
- several sub-parameters, all of which are optional and are combined
- together so that there must be an approval matching all specified
- requirements.
-
- *username*
- If present, an approval from this username is required.
-
- *email-filter*
- If present, an approval with this email address is required. It
- is treated as a regular expression as above.
-
- *older-than*
- If present, the approval must be older than this amount of time
- to match. Provide a time interval as a number with a suffix of
- "w" (weeks), "d" (days), "h" (hours), "m" (minutes), "s"
- (seconds). Example ``48h`` or ``2d``.
-
- *newer-than*
- If present, the approval must be newer than this amount of time
- to match. Same format as "older-than".
-
- Any other field is interpreted as a review category and value
- pair. For example ``verified: 1`` would require that the approval
- be for a +1 vote in the "Verified" column.
+ approval could be added by the event in question). It follows the
+ same syntax as the "approval" pipeline requirement below. This
+ form should be considered deprecated and the pipeline requirement
+ used instead.
**timer**
This trigger will run based on a cron-style time specification.
@@ -458,6 +437,53 @@
supported, not the symbolic names. Example: ``0 0 * * *`` runs
at midnight.
+**require**
+ If this section is present, it established pre-requisites for any
+ kind of item entering the Pipeline. Regardless of how the item is
+ to be enqueued (via any trigger or automatic dependency resolution),
+ the conditions specified here must be met or the item will not be
+ enqueued.
+
+ **approval**
+ This requires that a certain kind of approval be present for the
+ current patchset of the change (the approval could be added by the
+ event in question). It takes several sub-parameters, all of which
+ are optional and are combined together so that there must be an
+ approval matching all specified requirements.
+
+ *username*
+ If present, an approval from this username is required.
+
+ *email-filter*
+ If present, an approval with this email address is required. It
+ is treated as a regular expression as above.
+
+ *older-than*
+ If present, the approval must be older than this amount of time
+ to match. Provide a time interval as a number with a suffix of
+ "w" (weeks), "d" (days), "h" (hours), "m" (minutes), "s"
+ (seconds). Example ``48h`` or ``2d``.
+
+ *newer-than*
+ If present, the approval must be newer than this amount of time
+ to match. Same format as "older-than".
+
+ Any other field is interpreted as a review category and value
+ pair. For example ``verified: 1`` would require that the approval
+ be for a +1 vote in the "Verified" column.
+
+ **open**
+ A boolean value (``true`` or ``false``) that indicates whether the change
+ must be open or closed in order to be enqueued.
+
+ **current-patchset**
+ A boolean value (``true`` or ``false``) that indicates whether the change
+ must be the current patchset in order to be enqueued.
+
+ **status**
+ A string value that corresponds with the status of the change
+ reported by the trigger. For example, when using the Gerrit
+ trigger, status values such as ``NEW`` or ``MERGED`` may be useful.
**dequeue-on-new-patchset**
Normally, if a new patchset is uploaded to a change that is in a
@@ -644,6 +670,18 @@
The name of the job. This field is treated as a regular expression
and will be applied to each job that matches.
+**queue-name (optional)**
+ Zuul will automatically combine projects that share a job into
+ shared change queues for dependent pipeline managers. In order to
+ report statistics about these queues, it is convenient for them to
+ have names. Zuul can automatically name change queues, however
+ these can grow quite long and are prone to changing as projects in
+ the queue change. If you assign a queue-name to a job, Zuul will
+ use that as the name for the shared change queue that contains that
+ job instead of the automatically generated one. It is an error for
+ a shared change queue to have more than one job with a queue-name if
+ they are not the same.
+
**failure-message (optional)**
The message that should be reported to Gerrit if the job fails.
diff --git a/etc/status/.gitignore b/etc/status/.gitignore
index a4b9570..8b94cad 100644
--- a/etc/status/.gitignore
+++ b/etc/status/.gitignore
@@ -1,3 +1,4 @@
public_html/jquery.min.js
public_html/jquery-visibility.min.js
public_html/bootstrap
+public_html/jquery.graphite.js
diff --git a/etc/status/fetch-dependencies.sh b/etc/status/fetch-dependencies.sh
index a5dddff..7823f29 100755
--- a/etc/status/fetch-dependencies.sh
+++ b/etc/status/fetch-dependencies.sh
@@ -8,6 +8,12 @@
echo "Fetching jquery-visibility.min.js..."
curl --silent https://raw.github.com/mathiasbynens/jquery-visibility/master/jquery-visibility.min.js > $BASE_DIR/public_html/jquery-visibility.min.js
+echo "Fetching jquery.graphite.js..."
+curl -L --silent https://github.com/prestontimmons/graphitejs/archive/master.zip > jquery-graphite.zip
+unzip -q -o jquery-graphite.zip -d $BASE_DIR/public_html/
+mv $BASE_DIR/public_html/graphitejs-master/jquery.graphite.js $BASE_DIR/public_html/
+rm -R jquery-graphite.zip $BASE_DIR/public_html/graphitejs-master
+
echo "Fetching bootstrap..."
curl -L --silent https://github.com/twbs/bootstrap/releases/download/v3.1.1/bootstrap-3.1.1-dist.zip > bootstrap.zip
unzip -q -o bootstrap.zip -d $BASE_DIR/public_html/
diff --git a/etc/status/public_html/app.js b/etc/status/public_html/app.js
index aee693b..8616201 100644
--- a/etc/status/public_html/app.js
+++ b/etc/status/public_html/app.js
@@ -22,6 +22,8 @@
var $container, $msg, $indicator, $queueInfo, $queueEventsNum,
$queueResultsNum, $pipelines, $jq;
var xhr, zuul,
+ zuul_graph_update_count = 0,
+ zuul_sparkline_urls = {},
current_filter = '',
demo = location.search.match(/[?&]demo=([^?&]*)/),
source_url = location.search.match(/[?&]source_url=([^?&]*)/),
@@ -52,6 +54,7 @@
zuul = {
enabled: true,
+ graphite_url: '',
collapsed_exceptions: [],
schedule: function () {
@@ -62,6 +65,12 @@
zuul.update().complete(function () {
setTimeout(zuul.schedule, 5000);
});
+
+ /* Only update graphs every minute */
+ if (zuul_graph_update_count > 11) {
+ zuul_graph_update_count = 0;
+ zuul.update_sparklines();
+ }
},
/** @return {jQuery.Promise} */
@@ -120,23 +129,47 @@
return xhr;
},
+ update_sparklines: function() {
+ $.each(zuul_sparkline_urls, function(name, url) {
+ var newimg = new Image();
+ var parts = url.split('#');
+ newimg.src = parts[0] + '#' + new Date().getTime();
+ $(newimg).load(function (x) {
+ zuul_sparkline_urls[name] = newimg.src;
+ });
+ });
+ },
+
format: {
job: function(job) {
- var $job_line;
+ var $job_line = $('<span />');
+
if (job.url !== null) {
- $job_line = $('<a href="' + job.url + '" />');
+ $job_line.append(
+ $('<a />')
+ .addClass('zuul-job-name')
+ .attr('href', job.url)
+ .text(job.name)
+ );
}
- else{
- $job_line = $('<span />');
+ else {
+ $job_line.append(
+ $('<span />')
+ .addClass('zuul-job-name')
+ .text(job.name)
+ );
}
- $job_line.text(job.name)
- .append(zuul.format.job_status(job));
+
+ $job_line.append(zuul.format.job_status(job));
if (job.voting === false) {
$job_line.append(
- $(' <small />').text(' (non-voting)')
+ $(' <small />')
+ .addClass('zuul-non-voting-desc')
+ .text(' (non-voting)')
);
}
+
return $job_line;
},
@@ -318,7 +351,7 @@
var $left = $('<div />')
.addClass('col-xs-8')
- .append($project_span, $('<br />'), $change_progress_row);
+ .append($project_span, $change_progress_row);
var remaining_time = zuul.format.time(
change.remaining_time, true);
@@ -341,7 +374,7 @@
change_list: function(jobs) {
var $list = $('<ul />')
- .addClass('list-group');
+ .addClass('list-group zuul-patchset-body');
$.each(jobs, function (i, job) {
var $item = $('<li />')
@@ -356,7 +389,7 @@
change_panel: function (change) {
var $header = $('<div />')
- .addClass('panel-heading patchset-header')
+ .addClass('panel-heading zuul-patchset-header')
.append(zuul.format.change_header(change));
var panel_id = change.id ? change.id.replace(',', '_')
@@ -372,25 +405,146 @@
return $panel;
},
- pipeline: function (pipeline) {
- var $html = $('<div />')
- .addClass('zuul-pipeline col-md-4')
- .append($('<h3 />').text(pipeline.name));
+ change_status_icon: function(change) {
+ var icon_name = 'green.png';
+ var icon_title = 'Succeeding';
+
+ if (change.active !== true) {
+ // Grey icon
+ icon_name = 'grey.png';
+ icon_title = 'Waiting until closer to head of queue to' +
+ ' start jobs';
+ }
+ else if (change.failing_reasons &&
+ change.failing_reasons.length > 0) {
+ var reason = change.failing_reasons.join(', ');
+ icon_title = 'Failing because ' + reason;
+ if (reason.match(/merge conflict/)) {
+ // Black icon
+ icon_name = 'black.png';
+ }
+ else {
+ // Red icon
+ icon_name = 'red.png';
+ }
+ }
+
+ var $icon = $('<img />')
+ .attr('src', 'images/' + icon_name)
+ .attr('title', icon_title)
+ .css('margin-top', '-6px');
+
+ return $icon;
+ },
+
+ change_with_status_tree: function(change, change_queue) {
+ var $change_row = $('<tr />');
+
+ for (var i = 0; i < change_queue._tree_columns; i++) {
+ var $tree_cell = $('<td />')
+ .css('height', '100%')
+ .css('padding', '0 0 10px 0')
+ .css('margin', '0')
+ .css('width', '16px')
+ .css('min-width', '16px')
+ .css('overflow', 'hidden')
+ .css('vertical-align', 'top');
+
+ if (i < change._tree.length && change._tree[i] !== null) {
+ $tree_cell.css('background-image',
+ 'url(\'images/line.png\')')
+ .css('background-repeat', 'repeat-y');
+ }
+
+ if (i === change._tree_index) {
+ $tree_cell.append(
+ zuul.format.change_status_icon(change));
+ }
+ if (change._tree_branches.indexOf(i) !== -1) {
+ var $image = $('<img />')
+ .css('vertical-align', 'baseline');
+ if (change._tree_branches.indexOf(i) ===
+ change._tree_branches.length - 1) {
+ // Angle line
+ $image.attr('src', 'images/line-angle.png');
+ }
+ else {
+ // T line
+ $image.attr('src', 'images/line-t.png');
+ }
+ $tree_cell.append($image);
+ }
+ $change_row.append($tree_cell);
+ }
+
+ var change_width = 360 - 16*change_queue._tree_columns;
+ var $change_column = $('<td />')
+ .css('width', change_width + 'px')
+ .addClass('zuul-change-cell')
+ .append(zuul.format.change_panel(change));
+
+ $change_row.append($change_column);
+
+ var $change_table = $('<table />')
+ .addClass('zuul-change-box')
+ .css('-moz-box-sizing', 'content-box')
+ .css('box-sizing', 'content-box')
+ .append($change_row);
+
+ return $change_table;
+ },
+
+ pipeline_sparkline: function(pipeline_name) {
+ if (zuul.graphite_url !== '') {
+ var $sparkline = $('<img />')
+ .addClass('pull-right')
+ .attr('src', zuul.get_sparkline_url(pipeline_name));
+ return $sparkline;
+ }
+ return false;
+ },
+
+ pipeline_header: function(pipeline, count) {
+ // Format the pipeline name, sparkline and description
+ var $header_div = $('<div />')
+ .addClass('zuul-pipeline-header');
+
+ var $heading = $('<h3 />')
+ .css('vertical-align', 'middle')
+ .text(pipeline.name)
+ .append(
+ $('<span />')
+ .addClass('badge pull-right')
+ .css('vertical-align', 'middle')
+ .css('margin-top', '0.5em')
+ .text(count)
+ )
+ .append(zuul.format.pipeline_sparkline(pipeline.name));
+
+ $header_div.append($heading);
if (typeof pipeline.description === 'string') {
- $html.append(
+ $header_div.append(
$('<p />').append(
$('<small />').text(pipeline.description)
)
);
}
+ return $header_div;
+ },
+
+ pipeline: function (pipeline) {
+ var count = zuul.create_tree(pipeline);
+ var $html = $('<div />')
+ .addClass('zuul-pipeline col-md-4')
+ .append(zuul.format.pipeline_header(pipeline, count));
$.each(pipeline.change_queues,
- function (queueNum, changeQueue) {
- $.each(changeQueue.heads, function (headNum, changes) {
+ function (queue_i, change_queue) {
+ $.each(change_queue.heads, function (head_i, changes) {
if (pipeline.change_queues.length > 1 &&
- headNum === 0) {
- var name = changeQueue.name;
+ head_i === 0) {
+ var name = change_queue.name;
var short_name = name;
if (short_name.length > 32) {
short_name = short_name.substr(0, 32) + '...';
@@ -405,10 +559,13 @@
)
);
}
- $.each(changes, function (changeNum, change) {
- var $panel = zuul.format.change_panel(change);
- $html.append($panel);
- zuul.display_patchset($panel);
+
+ $.each(changes, function (change_i, change) {
+ var $change_box =
+ zuul.format.change_with_status_tree(
+ change, change_queue);
+ $html.append($change_box);
+ zuul.display_patchset($change_box);
});
});
});
@@ -510,7 +667,7 @@
// Toggle showing/hiding the patchset when the header is clicked
// Grab the patchset panel
var $panel = $(e.target).parents('.zuul-change');
- var $body = $panel.children(':not(.patchset-header)');
+ var $body = $panel.children('.zuul-patchset-body');
$body.toggle(200);
var collapsed_index = zuul.collapsed_exceptions.indexOf(
$panel.attr('id'));
@@ -524,15 +681,18 @@
}
},
- display_patchset: function($panel, animate) {
+ display_patchset: function($change_box, animate) {
// Determine if to show or hide the patchset and/or the results
// when loaded
// See if we should hide the body/results
- var $body = $panel.children(':not(.patchset-header)');
+ var $panel = $change_box.find('.zuul-change');
+ var panel_change = $panel.attr('id');
+ var $body = $panel.children('.zuul-patchset-body');
var expand_by_default = $('#expand_by_default').prop('checked');
- var collapsed_index = zuul.collapsed_exceptions.indexOf(
- $panel.attr('id'));
+
+ var collapsed_index = zuul.collapsed_exceptions.indexOf(panel_change);
+
if (expand_by_default && collapsed_index === -1 ||
!expand_by_default && collapsed_index !== -1) {
// Expand by default, or is an exception
@@ -545,9 +705,14 @@
// Check if we should hide the whole panel
var panel_project = $panel.find('.change_project').text()
.toLowerCase();
- var panel_pipeline = $panel.parents('.zuul-pipeline')
- .children('h3').text().toLowerCase();
- var panel_change = $panel.attr('id');
+
+
+ var panel_pipeline = $change_box
+ .parents('.zuul-pipeline')
+ .find('.zuul-pipeline-header > h3')
+ .html()
+ .toLowerCase();
+
if (current_filter !== '') {
var show_panel = false;
var filter = current_filter.trim().split(/[\s,]+/);
@@ -562,14 +727,14 @@
}
});
if (show_panel === true) {
- $panel.show(animate);
+ $change_box.show(animate);
}
else {
- $panel.hide(animate);
+ $change_box.hide(animate);
}
}
else {
- $panel.show(animate);
+ $change_box.show(animate);
}
},
@@ -584,9 +749,9 @@
$('#filter_form_clear_box').show();
}
- $('.zuul-change').each(function(index, obj) {
- var $panel = $(obj);
- zuul.display_patchset($panel, 200);
+ $('.zuul-change-box').each(function(index, obj) {
+ var $change_box = $(obj);
+ zuul.display_patchset($change_box, 200);
});
return false;
},
@@ -595,11 +760,95 @@
// Handle toggling expand by default
set_cookie('zuul_expand_by_default', e.target.checked);
zuul.collapsed_exceptions = [];
- $('.zuul-change').each(function(index, obj) {
- var $panel = $(obj);
- zuul.display_patchset($panel, 200);
+ $('.zuul-change-box').each(function(index, obj) {
+ var $change_box = $(obj);
+ zuul.display_patchset($change_box, 200);
});
},
+
+ create_tree: function(pipeline) {
+ var count = 0;
+ var pipeline_max_tree_columns = 1;
+ $.each(pipeline.change_queues, function(change_queue_i,
+ change_queue) {
+ var tree = [];
+ var max_tree_columns = 1;
+ var changes = [];
+ var last_tree_length = 0;
+ $.each(change_queue.heads, function(head_i, head) {
+ $.each(head, function(change_i, change) {
+ changes[change.id] = change;
+ change._tree_position = change_i;
+ });
+ });
+ $.each(change_queue.heads, function(head_i, head) {
+ $.each(head, function(change_i, change) {
+ count += 1;
+ var idx = tree.indexOf(change.id);
+ if (idx > -1) {
+ change._tree_index = idx;
+ // remove...
+ tree[idx] = null;
+ while (tree[tree.length - 1] === null) {
+ tree.pop();
+ }
+ } else {
+ change._tree_index = 0;
+ }
+ change._tree_branches = [];
+ change._tree = [];
+ if (typeof(change.items_behind) === 'undefined') {
+ change.items_behind = [];
+ }
+ change.items_behind.sort(function(a, b) {
+ return (changes[b]._tree_position -
+ changes[a]._tree_position);
+ });
+ $.each(change.items_behind, function(i, id) {
+ tree.push(id);
+ if (tree.length>last_tree_length &&
+ last_tree_length > 0) {
+ change._tree_branches.push(
+ tree.length - 1);
+ }
+ });
+ if (tree.length > max_tree_columns) {
+ max_tree_columns = tree.length;
+ }
+ if (tree.length > pipeline_max_tree_columns) {
+ pipeline_max_tree_columns = tree.length;
+ }
+ change._tree = tree.slice(0); // make a copy
+ last_tree_length = tree.length;
+ });
+ });
+ change_queue._tree_columns = max_tree_columns;
+ });
+ pipeline._tree_columns = pipeline_max_tree_columns;
+ return count;
+ },
+
+ get_sparkline_url: function(pipeline_name) {
+ if (zuul.graphite_url !== '') {
+ if (!(pipeline_name in zuul_sparkline_urls)) {
+ zuul_sparkline_urls[pipeline_name] = $.fn.graphite.geturl({
+ url: zuul.graphite_url,
+ from: "-8hours",
+ width: 100,
+ height: 26,
+ margin: 0,
+ hideLegend: true,
+ hideAxes: true,
+ hideGrid: true,
+ target: [
+ "color(stats.gauges.zuul.pipeline."+pipeline_name+".current_changes, '6b8182')"
+ ]
+ });
+ }
+ return zuul_sparkline_urls[pipeline_name];
+ }
+ return false;
+ },
};
current_filter = read_cookie('zuul_filter_string', current_filter);
@@ -652,6 +901,7 @@
$pipelines, $zuulVersion,
$lastReconf);
+ //zuul.graphite_url = 'http://graphite.openstack.org/render/'
zuul.schedule();
$(document).on({
diff --git a/etc/status/public_html/images/black.png b/etc/status/public_html/images/black.png
new file mode 100644
index 0000000..0d1c61f
--- /dev/null
+++ b/etc/status/public_html/images/black.png
Binary files differ
diff --git a/etc/status/public_html/images/green.png b/etc/status/public_html/images/green.png
new file mode 100644
index 0000000..d755eb9
--- /dev/null
+++ b/etc/status/public_html/images/green.png
Binary files differ
diff --git a/etc/status/public_html/images/grey.png b/etc/status/public_html/images/grey.png
new file mode 100644
index 0000000..7c1815d
--- /dev/null
+++ b/etc/status/public_html/images/grey.png
Binary files differ
diff --git a/etc/status/public_html/images/line-angle.png b/etc/status/public_html/images/line-angle.png
new file mode 100644
index 0000000..e454c0e
--- /dev/null
+++ b/etc/status/public_html/images/line-angle.png
Binary files differ
diff --git a/etc/status/public_html/images/line-t.png b/etc/status/public_html/images/line-t.png
new file mode 100644
index 0000000..6be85ca
--- /dev/null
+++ b/etc/status/public_html/images/line-t.png
Binary files differ
diff --git a/etc/status/public_html/images/line.png b/etc/status/public_html/images/line.png
new file mode 100644
index 0000000..0bcaffb
--- /dev/null
+++ b/etc/status/public_html/images/line.png
Binary files differ
diff --git a/etc/status/public_html/images/red.png b/etc/status/public_html/images/red.png
new file mode 100644
index 0000000..1f6fa81
--- /dev/null
+++ b/etc/status/public_html/images/red.png
Binary files differ
diff --git a/etc/status/public_html/index.html b/etc/status/public_html/index.html
index 59b10e4..bea1a79 100644
--- a/etc/status/public_html/index.html
+++ b/etc/status/public_html/index.html
@@ -21,44 +21,7 @@
<title>Zuul Status</title>
<link rel="stylesheet" href="bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="bootstrap/css/bootstrap-responsive.min.css">
- <style>
- .zuul-change-id {
- float: right;
- }
-
- .zuul-job-result {
- float: right;
- width: 70px;
- height: 15px;
- margin: 0;
- }
-
- .zuul-change-total-result {
- height: 10px;
- width: 100px;
- margin: 5px 0 0 0;
- }
-
- .zuul-spinner,
- .zuul-spinner:hover {
- opacity: 0;
- transition: opacity 0.5s ease-out;
- cursor: default;
- pointer-events: none;
- }
-
- .zuul-spinner-on,
- .zuul-spinner-on:hover {
- opacity: 1;
- transition-duration: 0.2s;
- cursor: progress;
- }
-
- .zuul-change-job {
- padding: 5px 10px;
- }
-
- </style>
+ <link rel="stylesheet" href="styles/zuul.css" />
</head>
<body>
<div class="container">
@@ -69,6 +32,7 @@
</div>
<script src="jquery.min.js"></script>
<script src="jquery-visibility.min.js"></script>
+ <script src="jquery.graphite.js"></script>
<script src="app.js"></script>
</body>
</html>
diff --git a/etc/status/public_html/status-tree.json-sample b/etc/status/public_html/status-tree.json-sample
new file mode 100644
index 0000000..31a37c8
--- /dev/null
+++ b/etc/status/public_html/status-tree.json-sample
@@ -0,0 +1 @@
+{"pipelines": [{"description": "Newly uploaded patchsets enter this pipeline to receive an initial +/-1 Verified vote from Jenkins.", "change_queues": [{"heads": [[{"failing_reasons": ["at least one job failed"], "items_behind": [], "jobs": [{"elapsed_time": 271291, "name": "gate-nova-pep8", "url": "https://jenkins02.openstack.org/job/gate-nova-pep8/4691/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 229630, "name": "gate-nova-docs", "url": "https://jenkins02.openstack.org/job/gate-nova-docs/4628/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 1136580, "name": "gate-nova-python26", "url": "https://jenkins01.openstack.org/job/gate-nova-python26/5766/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 686242, "name": "gate-nova-python27", "url": "https://jenkins02.openstack.org/job/gate-nova-python27/5832/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 2119040, "name": "check-tempest-devstack-vm-full", "url": "https://jenkins01.openstack.org/job/check-tempest-devstack-vm-full/5/", "voting": true, "remaining_time": 0, "result": null}, {"elapsed_time": 2120037, "name": "check-tempest-devstack-vm-postgres-full", "url": "https://jenkins01.openstack.org/job/check-tempest-devstack-vm-postgres-full/4/", "voting": true, "remaining_time": 0, "result": null}, {"elapsed_time": 1621689, "name": "check-tempest-devstack-vm-neutron", "url": "https://jenkins01.openstack.org/job/check-tempest-devstack-vm-neutron/5/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 1044129, "name": "check-tempest-devstack-vm-large-ops", "url": "https://jenkins01.openstack.org/job/check-tempest-devstack-vm-large-ops/1/", "voting": true, "remaining_time": 0, "result": "FAILURE"}, {"elapsed_time": 1977057, "name": "check-grenade-devstack-vm", "url": "https://jenkins01.openstack.org/job/check-grenade-devstack-vm/4/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 678310, "name": "gate-nova-pylint", "url": "https://jenkins01.openstack.org/job/gate-nova-pylint/3023/", "voting": false, "remaining_time": 0, "result": "SUCCESS"}], "url": "https://review.openstack.org/48721", "item_ahead": null, "enqueue_time": 1380308488015, "project": "openstack/nova", "remaining_time": 0, "id": "48721,1"}], [{"failing_reasons": ["at least one job failed"], "items_behind": [], "jobs": [{"elapsed_time": 582992, "name": "gate-requirements-install", "url": "https://jenkins02.openstack.org/job/gate-requirements-install/225/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 23168, "name": "gate-requirements-pep8", "url": "https://jenkins01.openstack.org/job/gate-requirements-pep8/268/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 109904, "name": "gate-requirements-python27", "url": "https://jenkins01.openstack.org/job/gate-requirements-python27/273/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 190547, "name": "gate-requirements-pypy", "url": "https://jenkins01.openstack.org/job/gate-requirements-pypy/54/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 2120035, "name": "check-tempest-devstack-vm-full", "url": "https://jenkins01.openstack.org/job/check-tempest-devstack-vm-full/4/", "voting": true, "remaining_time": 0, "result": null}, {"elapsed_time": 2127801, "name": "check-tempest-devstack-vm-postgres-full", "url": "https://jenkins02.openstack.org/job/check-tempest-devstack-vm-postgres-full/1/", "voting": true, "remaining_time": 0, "result": null}, {"elapsed_time": 2113881, "name": "check-tempest-devstack-vm-neutron", "url": "https://jenkins02.openstack.org/job/check-tempest-devstack-vm-neutron/1/", "voting": true, "remaining_time": 0, "result": "FAILURE"}, {"elapsed_time": 1005847, "name": "check-tempest-devstack-vm-large-ops", "url": "https://jenkins02.openstack.org/job/check-tempest-devstack-vm-large-ops/1/", "voting": true, "remaining_time": 0, "result": "FAILURE"}, {"elapsed_time": 1885169, "name": "check-grenade-devstack-vm", "url": "https://jenkins01.openstack.org/job/check-grenade-devstack-vm/2/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 854611, "name": "check-swift-devstack-vm-functional", "url": "https://jenkins02.openstack.org/job/check-swift-devstack-vm-functional/1/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}], "url": "https://review.openstack.org/48722", "item_ahead": null, "enqueue_time": 1380308971613, "project": "openstack/requirements", "remaining_time": 0, "id": "48722,1"}], [{"failing_reasons": ["at least one job failed"], "items_behind": [], "jobs": [{"elapsed_time": 133600, "name": "gate-neutron-pep8", "url": "https://jenkins02.openstack.org/job/gate-neutron-pep8/1416/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 131277, "name": "gate-neutron-docs", "url": "https://jenkins02.openstack.org/job/gate-neutron-docs/1467/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 2251822, "name": "gate-neutron-python26", "url": "https://jenkins01.openstack.org/job/gate-neutron-python26/1771/", "voting": true, "remaining_time": 0, "result": "FAILURE"}, {"elapsed_time": 1452497, "name": "gate-neutron-python27", "url": "https://jenkins02.openstack.org/job/gate-neutron-python27/1678/", "voting": true, "remaining_time": 0, "result": "FAILURE"}, {"elapsed_time": 2124032, "name": "check-tempest-devstack-vm-neutron", "url": "https://jenkins01.openstack.org/job/check-tempest-devstack-vm-neutron/1/", "voting": true, "remaining_time": 0, "result": null}, {"elapsed_time": 1945001, "name": "check-tempest-devstack-vm-neutron-pg", "url": "https://jenkins01.openstack.org/job/check-tempest-devstack-vm-neutron-pg/1/", "voting": false, "remaining_time": 0, "result": "FAILURE"}], "url": "https://review.openstack.org/45677", "item_ahead": null, "enqueue_time": 1380308990019, "project": "openstack/neutron", "remaining_time": 0, "id": "45677,4"}], [{"failing_reasons": ["at least one job failed"], "items_behind": [], "jobs": [{"elapsed_time": 94738, "name": "gate-tempest-pep8", "url": "https://jenkins01.openstack.org/job/gate-tempest-pep8/1576/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 208144, "name": "gate-tempest-docs", "url": "https://jenkins01.openstack.org/job/gate-tempest-docs/1492/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 2126572, "name": "check-tempest-devstack-vm-full", "url": "https://jenkins02.openstack.org/job/check-tempest-devstack-vm-full/1/", "voting": true, "remaining_time": 0, "result": null}, {"elapsed_time": 2119030, "name": "check-tempest-devstack-vm-postgres-full", "url": "https://jenkins01.openstack.org/job/check-tempest-devstack-vm-postgres-full/5/", "voting": true, "remaining_time": 0, "result": null}, {"elapsed_time": 1622822, "name": "check-tempest-devstack-vm-neutron", "url": "https://jenkins01.openstack.org/job/check-tempest-devstack-vm-neutron/3/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 989220, "name": "check-tempest-devstack-vm-large-ops", "url": "https://jenkins01.openstack.org/job/check-tempest-devstack-vm-large-ops/3/", "voting": true, "remaining_time": 0, "result": "FAILURE"}, {"elapsed_time": 2119038, "name": "check-grenade-devstack-vm", "url": "https://jenkins01.openstack.org/job/check-grenade-devstack-vm/3/", "voting": true, "remaining_time": 0, "result": null}], "url": "https://review.openstack.org/48147", "item_ahead": null, "enqueue_time": 1380309029918, "project": "openstack/tempest", "remaining_time": 0, "id": "48147,8"}], [{"failing_reasons": ["at least one job failed"], "items_behind": [], "jobs": [{"elapsed_time": 105321, "name": "gate-heat-pep8", "url": "https://jenkins02.openstack.org/job/gate-heat-pep8/1627/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 120878, "name": "gate-heat-docs", "url": "https://jenkins01.openstack.org/job/gate-heat-docs/1411/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 137196, "name": "gate-heat-python26", "url": "https://jenkins02.openstack.org/job/gate-heat-python26/1658/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 105580, "name": "gate-heat-python27", "url": "https://jenkins01.openstack.org/job/gate-heat-python27/1951/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 2126107, "name": "check-tempest-devstack-vm-full", "url": "https://jenkins01.openstack.org/job/check-tempest-devstack-vm-full/2/", "voting": true, "remaining_time": 0, "result": null}, {"elapsed_time": 2070327, "name": "check-tempest-devstack-vm-postgres-full", "url": "https://jenkins01.openstack.org/job/check-tempest-devstack-vm-postgres-full/2/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 1688657, "name": "check-tempest-devstack-vm-neutron", "url": "https://jenkins01.openstack.org/job/check-tempest-devstack-vm-neutron/4/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 973734, "name": "check-tempest-devstack-vm-large-ops", "url": "https://jenkins01.openstack.org/job/check-tempest-devstack-vm-large-ops/2/", "voting": true, "remaining_time": 0, "result": "FAILURE"}], "url": "https://review.openstack.org/48727", "item_ahead": null, "enqueue_time": 1380309606606, "project": "openstack/heat", "remaining_time": 0, "id": "48727,1"}], [{"failing_reasons": ["at least one job failed"], "items_behind": [], "jobs": [{"elapsed_time": 259891, "name": "gate-nova-pep8", "url": "https://jenkins01.openstack.org/job/gate-nova-pep8/6686/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 179999, "name": "gate-nova-docs", "url": "https://jenkins01.openstack.org/job/gate-nova-docs/6789/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 1102654, "name": "gate-nova-python26", "url": "https://jenkins01.openstack.org/job/gate-nova-python26/5777/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 818856, "name": "gate-nova-python27", "url": "https://jenkins01.openstack.org/job/gate-nova-python27/5498/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 2127117, "name": "check-tempest-devstack-vm-full", "url": "https://jenkins01.openstack.org/job/check-tempest-devstack-vm-full/1/", "voting": true, "remaining_time": 0, "result": null}, {"elapsed_time": 2070550, "name": "check-tempest-devstack-vm-postgres-full", "url": "https://jenkins01.openstack.org/job/check-tempest-devstack-vm-postgres-full/1/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 1674929, "name": "check-tempest-devstack-vm-neutron", "url": "https://jenkins01.openstack.org/job/check-tempest-devstack-vm-neutron/2/", "voting": true, "remaining_time": 0, "result": "FAILURE"}, {"elapsed_time": 1066930, "name": "check-tempest-devstack-vm-large-ops", "url": "https://jenkins01.openstack.org/job/check-tempest-devstack-vm-large-ops/4/", "voting": true, "remaining_time": 0, "result": "FAILURE"}, {"elapsed_time": 2101177, "name": "check-grenade-devstack-vm", "url": "https://jenkins01.openstack.org/job/check-grenade-devstack-vm/1/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 682941, "name": "gate-nova-pylint", "url": "https://jenkins02.openstack.org/job/gate-nova-pylint/2934/", "voting": false, "remaining_time": 0, "result": "SUCCESS"}], "url": "https://review.openstack.org/42736", "item_ahead": null, "enqueue_time": 1380309629537, "project": "openstack/nova", "remaining_time": 0, "id": "42736,16"}], [{"failing_reasons": ["at least one job failed"], "items_behind": [], "jobs": [{"elapsed_time": 169641, "name": "gate-cinder-pep8", "url": "https://jenkins01.openstack.org/job/gate-cinder-pep8/1643/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 527224, "name": "gate-cinder-docs", "url": "https://jenkins02.openstack.org/job/gate-cinder-docs/1120/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 354497, "name": "gate-cinder-python26", "url": "https://jenkins02.openstack.org/job/gate-cinder-python26/1316/", "voting": true, "remaining_time": 0, "result": "FAILURE"}, {"elapsed_time": 265127, "name": "gate-cinder-python27", "url": "https://jenkins01.openstack.org/job/gate-cinder-python27/1468/", "voting": true, "remaining_time": 0, "result": "FAILURE"}, {"elapsed_time": 291907, "name": "gate-cinder-pylint", "url": "https://jenkins01.openstack.org/job/gate-cinder-pylint/843/", "voting": false, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 2121705, "name": "check-tempest-devstack-vm-full", "url": "https://jenkins01.openstack.org/job/check-tempest-devstack-vm-full/3/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 2124111, "name": "check-tempest-devstack-vm-postgres-full", "url": "https://jenkins01.openstack.org/job/check-tempest-devstack-vm-postgres-full/3/", "voting": true, "remaining_time": 0, "result": null}, {"elapsed_time": 2107674, "name": "check-tempest-devstack-vm-neutron", "url": "https://jenkins02.openstack.org/job/check-tempest-devstack-vm-neutron/3/", "voting": true, "remaining_time": 0, "result": "FAILURE"}, {"elapsed_time": 1132023, "name": "check-tempest-devstack-vm-large-ops", "url": "https://jenkins02.openstack.org/job/check-tempest-devstack-vm-large-ops/3/", "voting": true, "remaining_time": 0, "result": "FAILURE"}, {"elapsed_time": 1953058, "name": "check-grenade-devstack-vm", "url": "https://jenkins02.openstack.org/job/check-grenade-devstack-vm/2/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}], "url": "https://review.openstack.org/48387", "item_ahead": null, "enqueue_time": 1380309658104, "project": "openstack/cinder", "remaining_time": 0, "id": "48387,2"}], [{"failing_reasons": ["at least one job failed"], "items_behind": [], "jobs": [{"elapsed_time": 2124616, "name": "check-tempest-devstack-vm-full", "url": "https://jenkins02.openstack.org/job/check-tempest-devstack-vm-full/2/", "voting": true, "remaining_time": 0, "result": null}, {"elapsed_time": 2124614, "name": "check-tempest-devstack-vm-postgres-full", "url": "https://jenkins02.openstack.org/job/check-tempest-devstack-vm-postgres-full/2/", "voting": true, "remaining_time": 0, "result": null}, {"elapsed_time": 2092452, "name": "check-tempest-devstack-vm-neutron", "url": "https://jenkins02.openstack.org/job/check-tempest-devstack-vm-neutron/4/", "voting": true, "remaining_time": 0, "result": "FAILURE"}, {"elapsed_time": 1016557, "name": "check-tempest-devstack-vm-large-ops", "url": "https://jenkins02.openstack.org/job/check-tempest-devstack-vm-large-ops/2/", "voting": true, "remaining_time": 0, "result": "FAILURE"}, {"elapsed_time": 1962618, "name": "check-grenade-devstack-vm", "url": "https://jenkins02.openstack.org/job/check-grenade-devstack-vm/1/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 843816, "name": "check-swift-devstack-vm-functional", "url": "https://jenkins02.openstack.org/job/check-swift-devstack-vm-functional/2/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}], "url": "https://review.openstack.org/48411", "item_ahead": null, "enqueue_time": 1380309825203, "project": "openstack-dev/devstack", "remaining_time": 0, "id": "48411,2"}], [{"failing_reasons": ["at least one job failed"], "items_behind": [], "jobs": [{"elapsed_time": 129512, "name": "gate-heat-pep8", "url": "https://jenkins01.openstack.org/job/gate-heat-pep8/2137/", "voting": true, "remaining_time": 0, "result": "FAILURE"}, {"elapsed_time": 121344, "name": "gate-heat-docs", "url": "https://jenkins01.openstack.org/job/gate-heat-docs/1412/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 139891, "name": "gate-heat-python26", "url": "https://jenkins01.openstack.org/job/gate-heat-python26/1887/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 99492, "name": "gate-heat-python27", "url": "https://jenkins02.openstack.org/job/gate-heat-python27/1796/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 2120214, "name": "check-tempest-devstack-vm-full", "url": "https://jenkins02.openstack.org/job/check-tempest-devstack-vm-full/5/", "voting": true, "remaining_time": 0, "result": null}, {"elapsed_time": 2121195, "name": "check-tempest-devstack-vm-postgres-full", "url": "https://jenkins02.openstack.org/job/check-tempest-devstack-vm-postgres-full/3/", "voting": true, "remaining_time": 0, "result": null}, {"elapsed_time": 2119197, "name": "check-tempest-devstack-vm-neutron", "url": "https://jenkins02.openstack.org/job/check-tempest-devstack-vm-neutron/6/", "voting": true, "remaining_time": 0, "result": null}, {"elapsed_time": 1172776, "name": "check-tempest-devstack-vm-large-ops", "url": "https://jenkins02.openstack.org/job/check-tempest-devstack-vm-large-ops/4/", "voting": true, "remaining_time": 0, "result": "FAILURE"}], "url": "https://review.openstack.org/48730", "item_ahead": null, "enqueue_time": 1380309894142, "project": "openstack/heat", "remaining_time": 0, "id": "48730,1"}], [{"failing_reasons": ["at least one job failed"], "items_behind": [], "jobs": [{"elapsed_time": 228482, "name": "gate-nova-pep8", "url": "https://jenkins01.openstack.org/job/gate-nova-pep8/6687/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 261211, "name": "gate-nova-docs", "url": "https://jenkins02.openstack.org/job/gate-nova-docs/4642/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 871252, "name": "gate-nova-python26", "url": "https://jenkins01.openstack.org/job/gate-nova-python26/5778/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 808633, "name": "gate-nova-python27", "url": "https://jenkins01.openstack.org/job/gate-nova-python27/5499/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 2121220, "name": "check-tempest-devstack-vm-full", "url": "https://jenkins02.openstack.org/job/check-tempest-devstack-vm-full/4/", "voting": true, "remaining_time": 0, "result": null}, {"elapsed_time": 2035444, "name": "check-tempest-devstack-vm-postgres-full", "url": "https://jenkins02.openstack.org/job/check-tempest-devstack-vm-postgres-full/5/", "voting": true, "remaining_time": 0, "result": "FAILURE"}, {"elapsed_time": 2089448, "name": "check-tempest-devstack-vm-neutron", "url": "https://jenkins02.openstack.org/job/check-tempest-devstack-vm-neutron/7/", "voting": true, "remaining_time": 0, "result": null}, {"elapsed_time": 790327, "name": "check-tempest-devstack-vm-large-ops", "url": "https://jenkins02.openstack.org/job/check-tempest-devstack-vm-large-ops/6/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 1747827, "name": "check-grenade-devstack-vm", "url": "https://jenkins02.openstack.org/job/check-grenade-devstack-vm/4/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 887417, "name": "gate-nova-pylint", "url": "https://jenkins01.openstack.org/job/gate-nova-pylint/3024/", "voting": false, "remaining_time": 0, "result": "SUCCESS"}], "url": "https://review.openstack.org/48666", "item_ahead": null, "enqueue_time": 1380310094572, "project": "openstack/nova", "remaining_time": 0, "id": "48666,1"}], [{"failing_reasons": [], "items_behind": [], "jobs": [{"elapsed_time": 53467, "name": "gate-python-keystoneclient-pep8", "url": "https://jenkins01.openstack.org/job/gate-python-keystoneclient-pep8/391/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 59025, "name": "gate-python-keystoneclient-docs", "url": "https://jenkins01.openstack.org/job/gate-python-keystoneclient-docs/388/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 53179, "name": "gate-python-keystoneclient-python26", "url": "https://jenkins02.openstack.org/job/gate-python-keystoneclient-python26/334/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 49841, "name": "gate-python-keystoneclient-python27", "url": "https://jenkins02.openstack.org/job/gate-python-keystoneclient-python27/325/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 19429, "name": "gate-python-keystoneclient-python33", "url": "https://jenkins01.openstack.org/job/gate-python-keystoneclient-python33/242/", "voting": false, "remaining_time": 0, "result": "FAILURE"}, {"elapsed_time": 98806, "name": "check-tempest-devstack-vm-full", "url": "https://jenkins01.openstack.org/job/check-tempest-devstack-vm-full/6/", "voting": true, "remaining_time": 2016562, "result": null}, {"elapsed_time": 97555, "name": "check-tempest-devstack-vm-postgres-full", "url": "https://jenkins02.openstack.org/job/check-tempest-devstack-vm-postgres-full/6/", "voting": true, "remaining_time": 0, "result": null}, {"elapsed_time": 97553, "name": "check-tempest-devstack-vm-neutron", "url": "https://jenkins02.openstack.org/job/check-tempest-devstack-vm-neutron/10/", "voting": true, "remaining_time": 1828676, "result": null}, {"elapsed_time": 97548, "name": "check-tempest-devstack-vm-large-ops", "url": "https://jenkins02.openstack.org/job/check-tempest-devstack-vm-large-ops/7/", "voting": true, "remaining_time": 691118, "result": null}, {"elapsed_time": 98513, "name": "check-grenade-devstack-vm", "url": "https://jenkins01.openstack.org/job/check-grenade-devstack-vm/5/", "voting": true, "remaining_time": 1886679, "result": null}], "url": "https://review.openstack.org/40703", "item_ahead": null, "enqueue_time": 1380314139375, "project": "openstack/python-keystoneclient", "remaining_time": 2016562, "id": "40703,7"}], [{"failing_reasons": [], "items_behind": [], "jobs": [{"elapsed_time": 45817, "name": "gate-heat-pep8", "url": "https://jenkins01.openstack.org/job/gate-heat-pep8/2171/", "voting": true, "remaining_time": 48324, "result": null}, {"elapsed_time": 45858, "name": "gate-heat-docs", "url": "https://jenkins01.openstack.org/job/gate-heat-docs/1446/", "voting": true, "remaining_time": 94144, "result": null}, {"elapsed_time": 45815, "name": "gate-heat-python26", "url": "https://jenkins01.openstack.org/job/gate-heat-python26/1924/", "voting": true, "remaining_time": 99244, "result": null}, {"elapsed_time": 45813, "name": "gate-heat-python27", "url": "https://jenkins01.openstack.org/job/gate-heat-python27/1989/", "voting": true, "remaining_time": 72904, "result": null}, {"elapsed_time": 45793, "name": "check-tempest-devstack-vm-full", "url": "https://jenkins01.openstack.org/job/check-tempest-devstack-vm-full/7/", "voting": true, "remaining_time": 2069575, "result": null}, {"elapsed_time": 45795, "name": "check-tempest-devstack-vm-postgres-full", "url": "https://jenkins01.openstack.org/job/check-tempest-devstack-vm-postgres-full/6/", "voting": true, "remaining_time": 2022237, "result": null}, {"elapsed_time": 45749, "name": "check-tempest-devstack-vm-neutron", "url": "https://jenkins01.openstack.org/job/check-tempest-devstack-vm-neutron/7/", "voting": true, "remaining_time": 1588997, "result": null}, {"elapsed_time": 45594, "name": "check-tempest-devstack-vm-large-ops", "url": "https://jenkins02.openstack.org/job/check-tempest-devstack-vm-large-ops/8/", "voting": true, "remaining_time": 743072, "result": null}], "url": "https://review.openstack.org/44534", "item_ahead": null, "enqueue_time": 1380314190372, "project": "openstack/heat", "remaining_time": 2069575, "id": "44534,9"}], [{"failing_reasons": [], "items_behind": [], "jobs": [{"elapsed_time": 24513, "name": "gate-nova-pep8", "url": "https://jenkins01.openstack.org/job/gate-nova-pep8/6722/", "voting": true, "remaining_time": 221251, "result": null}, {"elapsed_time": 24476, "name": "gate-nova-docs", "url": "https://jenkins01.openstack.org/job/gate-nova-docs/6823/", "voting": true, "remaining_time": 213900, "result": null}, {"elapsed_time": 24418, "name": "gate-nova-python26", "url": "https://jenkins02.openstack.org/job/gate-nova-python26/5157/", "voting": true, "remaining_time": 1052059, "result": null}, {"elapsed_time": 24471, "name": "gate-nova-python27", "url": "https://jenkins01.openstack.org/job/gate-nova-python27/5532/", "voting": true, "remaining_time": 723110, "result": null}, {"elapsed_time": 24466, "name": "check-tempest-devstack-vm-full", "url": "https://jenkins01.openstack.org/job/check-tempest-devstack-vm-full/8/", "voting": true, "remaining_time": 2090902, "result": null}, {"elapsed_time": 24412, "name": "check-tempest-devstack-vm-postgres-full", "url": "https://jenkins02.openstack.org/job/check-tempest-devstack-vm-postgres-full/7/", "voting": true, "remaining_time": 0, "result": null}, {"elapsed_time": 24253, "name": "check-tempest-devstack-vm-neutron", "url": "https://jenkins01.openstack.org/job/check-tempest-devstack-vm-neutron/8/", "voting": true, "remaining_time": 1610493, "result": null}, {"elapsed_time": 24324, "name": "check-tempest-devstack-vm-large-ops", "url": "https://jenkins02.openstack.org/job/check-tempest-devstack-vm-large-ops/9/", "voting": true, "remaining_time": 764342, "result": null}, {"elapsed_time": 24104, "name": "check-grenade-devstack-vm", "url": "https://jenkins02.openstack.org/job/check-grenade-devstack-vm/5/", "voting": true, "remaining_time": 1859269, "result": null}, {"elapsed_time": 24294, "name": "gate-nova-pylint", "url": "https://jenkins02.openstack.org/job/gate-nova-pylint/2935/", "voting": false, "remaining_time": 717239, "result": null}], "url": "https://review.openstack.org/48544", "item_ahead": null, "enqueue_time": 1380314204556, "project": "openstack/nova", "remaining_time": 2090902, "id": "48544,2"}], [{"failing_reasons": [], "items_behind": [], "jobs": [{"elapsed_time": 8576, "name": "gate-barbican-pep8", "url": "https://jenkins01.openstack.org/job/gate-barbican-pep8/63/", "voting": true, "remaining_time": 29785, "result": null}, {"elapsed_time": 8575, "name": "gate-barbican-python27", "url": "https://jenkins01.openstack.org/job/gate-barbican-python27/54/", "voting": true, "remaining_time": 79333, "result": null}], "url": "https://review.openstack.org/48734", "item_ahead": null, "enqueue_time": 1380314228789, "project": "stackforge/barbican", "remaining_time": 79333, "id": "48734,1"}], [{"failing_reasons": [], "items_behind": [], "jobs": [{"elapsed_time": 1337, "name": "gate-python-swiftclient-requirements", "url": "https://jenkins02.openstack.org/job/gate-python-swiftclient-requirements/9/", "voting": true, "remaining_time": 3536, "result": null}, {"elapsed_time": 1342, "name": "gate-python-swiftclient-pep8", "url": "https://jenkins02.openstack.org/job/gate-python-swiftclient-pep8/22/", "voting": true, "remaining_time": 31997, "result": null}, {"elapsed_time": 3342, "name": "gate-python-swiftclient-docs", "url": "https://jenkins01.openstack.org/job/gate-python-swiftclient-docs/39/", "voting": true, "remaining_time": 40808, "result": null}, {"elapsed_time": 3338, "name": "gate-python-swiftclient-python26", "url": "https://jenkins01.openstack.org/job/gate-python-swiftclient-python26/34/", "voting": true, "remaining_time": 41947, "result": null}, {"elapsed_time": 3336, "name": "gate-python-swiftclient-python27", "url": "https://jenkins01.openstack.org/job/gate-python-swiftclient-python27/21/", "voting": true, "remaining_time": 33146, "result": null}, {"elapsed_time": 3344, "name": "gate-python-swiftclient-python33", "url": "https://jenkins01.openstack.org/job/gate-python-swiftclient-python33/35/", "voting": false, "remaining_time": 0, "result": null}, {"elapsed_time": 1748, "name": "gate-python-swiftclient-pypy", "url": "https://jenkins01.openstack.org/job/gate-python-swiftclient-pypy/27/", "voting": true, "remaining_time": 82666, "result": null}, {"elapsed_time": 1746, "name": "check-swift-devstack-vm-functional", "url": "https://jenkins01.openstack.org/job/check-swift-devstack-vm-functional/2/", "voting": true, "remaining_time": 0, "result": null}], "url": "https://review.openstack.org/48724", "item_ahead": null, "enqueue_time": 1380314236719, "project": "openstack/python-swiftclient", "remaining_time": 82666, "id": "48724,3"}]], "name": "openstack-dev/cookiecutter, openstack-dev/devstack, openstack-dev/grenade, openstack-dev/hacking, openstack-dev/heat-cfnclient, openstack-dev/openstack-nose, openstack-dev/openstack-qa, openstack-dev/pbr, openstack-dev/sandbox, openstack-infra/activity-board, openstack-infra/askbot-theme, openstack-infra/config, openstack-infra/devstack-gate, openstack-infra/elastic-recheck, openstack-infra/gear, openstack-infra/gearman-plugin, openstack-infra/gerrit, openstack-infra/gerritbot, openstack-infra/gerritlib, openstack-infra/git-review, openstack-infra/gitdm, openstack-infra/groups, openstack-infra/jeepyb, openstack-infra/jenkins-job-builder, openstack-infra/lodgeit, openstack-infra/meetbot, openstack-infra/nodepool, openstack-infra/nose-html-output, openstack-infra/odsreg, openstack-infra/publications, openstack-infra/puppet-apparmor, openstack-infra/puppet-dashboard, openstack-infra/puppet-vcsrepo, openstack-infra/pypi-mirror, openstack-infra/releasestatus, openstack-infra/reviewday, openstack-infra/reviewstats, openstack-infra/statusbot, openstack-infra/storyboard, openstack-infra/tripleo-ci, openstack-infra/zmq-event-publisher, openstack-infra/zuul, openstack/api-site, openstack/ceilometer, openstack/cinder, openstack/compute-api, openstack/database-api, openstack/diskimage-builder, openstack/django_openstack_auth, openstack/glance, openstack/governance, openstack/heat, openstack/heat-cfntools, openstack/heat-templates, openstack/horizon, openstack/identity-api, openstack/image-api, openstack/ironic, openstack/keystone, openstack/marconi, openstack/netconn-api, openstack/neutron, openstack/nova, openstack/object-api, openstack/openstack-chef, openstack/openstack-manuals, openstack/openstack-planet, openstack/operations-guide, openstack/os-apply-config, openstack/os-collect-config, openstack/os-refresh-config, openstack/oslo-incubator, openstack/oslo.config, openstack/oslo.messaging, openstack/oslo.sphinx, openstack/oslo.version, openstack/python-ceilometerclient, openstack/python-cinderclient, openstack/python-glanceclient, openstack/python-heatclient, openstack/python-ironicclient, openstack/python-keystoneclient, openstack/python-marconiclient, openstack/python-neutronclient, openstack/python-novaclient, openstack/python-openstackclient, openstack/python-swiftclient, openstack/python-troveclient, openstack/requirements, openstack/swift, openstack/tempest, openstack/tripleo-heat-templates, openstack/tripleo-image-elements, openstack/tripleo-incubator, openstack/trove, openstack/trove-integration, openstack/volume-api, stackforge/MRaaS, stackforge/anvil, stackforge/barbican, stackforge/billingstack, stackforge/bindep, stackforge/bufunfa, stackforge/cl-openstack-client, stackforge/climate, stackforge/cloudcafe, stackforge/clouddocs-maven-plugin, stackforge/cloudroast, stackforge/cookbook-openstack-block-storage, stackforge/cookbook-openstack-common, stackforge/cookbook-openstack-compute, stackforge/cookbook-openstack-dashboard, stackforge/cookbook-openstack-identity, stackforge/cookbook-openstack-image, stackforge/cookbook-openstack-metering, stackforge/cookbook-openstack-network, stackforge/cookbook-openstack-object-storage, stackforge/cookbook-openstack-ops-database, stackforge/cookbook-openstack-ops-messaging, stackforge/cookbook-openstack-orchestration, stackforge/designate, stackforge/fuel-astute, stackforge/fuel-main, stackforge/fuel-ostf-plugin, stackforge/fuel-ostf-tests, stackforge/fuel-web, stackforge/golang-client, stackforge/healthnmon, stackforge/inception, stackforge/kwapi, stackforge/libra, stackforge/manila, stackforge/murano-agent, stackforge/murano-api, stackforge/murano-common, stackforge/murano-conductor, stackforge/murano-dashboard, stackforge/murano-deployment, stackforge/murano-docs, stackforge/murano-tests, stackforge/novaimagebuilder, stackforge/occi-os, stackforge/opencafe, stackforge/openstack-chef-repo, stackforge/openvz-nova-driver, stackforge/packstack, stackforge/pecan, stackforge/puppet-ceilometer, stackforge/puppet-cinder, stackforge/puppet-glance, stackforge/puppet-heat, stackforge/puppet-horizon, stackforge/puppet-keystone, stackforge/puppet-neutron, stackforge/puppet-nova, stackforge/puppet-openstack, stackforge/puppet-openstack_dev_env, stackforge/puppet-savanna, stackforge/puppet-swift, stackforge/puppet-tempest, stackforge/pycadf, stackforge/pyghmi, stackforge/python-climateclient, stackforge/python-designateclient, stackforge/python-libraclient, stackforge/python-manilaclient, stackforge/python-muranoclient, stackforge/python-savannaclient, stackforge/python-tuskarclient, stackforge/rally, stackforge/savanna, stackforge/savanna-dashboard, stackforge/savanna-extra, stackforge/savanna-image-elements, stackforge/sqlalchemy-migrate, stackforge/staccato, stackforge/stackalytics, stackforge/taskflow, stackforge/tuskar, stackforge/tuskar-ui, stackforge/wsme"}], "name": "check"}, {"description": "Changes that have been approved by core developers are enqueued in order in this pipeline, and if they pass tests in Jenkins, will be merged.", "change_queues": [{"heads": [], "name": "stackforge/puppet-horizon"}, {"heads": [], "name": "openstack-dev/heat-cfnclient"}, {"heads": [[{"failing_reasons": ["at least one job failed"], "items_behind": ["48423,2"], "jobs": [{"elapsed_time": 199240, "name": "gate-ceilometer-docs", "url": "https://jenkins01.openstack.org/job/gate-ceilometer-docs/1113/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 88267, "name": "gate-ceilometer-pep8", "url": "https://jenkins01.openstack.org/job/gate-ceilometer-pep8/1146/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 621409, "name": "gate-ceilometer-python26", "url": "https://jenkins02.openstack.org/job/gate-ceilometer-python26/1014/", "voting": true, "remaining_time": 0, "result": "FAILURE"}, {"elapsed_time": 11124, "name": "gate-ceilometer-python27", "url": "https://jenkins02.openstack.org/job/gate-ceilometer-python27/1003/", "voting": true, "remaining_time": 0, "result": "FAILURE"}, {"elapsed_time": 1585675, "name": "gate-tempest-devstack-vm-full", "url": "https://jenkins02.openstack.org/job/gate-tempest-devstack-vm-full/14925/", "voting": true, "remaining_time": 340565, "result": null}, {"elapsed_time": 1582866, "name": "gate-tempest-devstack-vm-postgres-full", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-postgres-full/14693/", "voting": true, "remaining_time": 138052, "result": null}, {"elapsed_time": 1155105, "name": "gate-tempest-devstack-vm-neutron", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-neutron/16378/", "voting": true, "remaining_time": 0, "result": "FAILURE"}, {"elapsed_time": 882181, "name": "gate-tempest-devstack-vm-large-ops", "url": "https://jenkins02.openstack.org/job/gate-tempest-devstack-vm-large-ops/4288/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 612572, "name": "gate-swift-devstack-vm-functional", "url": "https://jenkins01.openstack.org/job/gate-swift-devstack-vm-functional/1678/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}], "url": "https://review.openstack.org/48418", "item_ahead": null, "enqueue_time": 1380275100319, "project": "openstack/ceilometer", "remaining_time": 340565, "id": "48418,1"}, {"failing_reasons": ["a needed change is failing", "at least one job failed"], "items_behind": [], "jobs": [{"elapsed_time": 1581332, "name": "gate-ceilometer-docs", "url": "https://jenkins01.openstack.org/job/gate-ceilometer-docs/1114/", "voting": true, "remaining_time": 0, "result": "CANCELED"}, {"elapsed_time": 78975, "name": "gate-ceilometer-pep8", "url": "https://jenkins02.openstack.org/job/gate-ceilometer-pep8/961/", "voting": true, "remaining_time": 0, "result": "CANCELED"}, {"elapsed_time": 1581499, "name": "gate-ceilometer-python26", "url": "https://jenkins02.openstack.org/job/gate-ceilometer-python26/1015/", "voting": true, "remaining_time": 0, "result": "CANCELED"}, {"elapsed_time": 1581346, "name": "gate-ceilometer-python27", "url": "https://jenkins01.openstack.org/job/gate-ceilometer-python27/1099/", "voting": true, "remaining_time": 0, "result": "CANCELED"}, {"elapsed_time": 1524357, "name": "gate-tempest-devstack-vm-full", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-full/15590/", "voting": true, "remaining_time": 264284, "result": "CANCELED"}, {"elapsed_time": 1522887, "name": "gate-tempest-devstack-vm-postgres-full", "url": "https://jenkins02.openstack.org/job/gate-tempest-devstack-vm-postgres-full/14951/", "voting": true, "remaining_time": 281026, "result": "CANCELED"}, {"elapsed_time": 1512715, "name": "gate-tempest-devstack-vm-neutron", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-neutron/16379/", "voting": true, "remaining_time": 0, "result": "CANCELED"}, {"elapsed_time": 1501341, "name": "gate-tempest-devstack-vm-large-ops", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-large-ops/4047/", "voting": true, "remaining_time": 0, "result": "CANCELED"}, {"elapsed_time": 1486370, "name": "gate-swift-devstack-vm-functional", "url": "https://jenkins01.openstack.org/job/gate-swift-devstack-vm-functional/1679/", "voting": true, "remaining_time": 0, "result": "CANCELED"}], "url": "https://review.openstack.org/48423", "item_ahead": "48418,1", "enqueue_time": 1380275122088, "project": "openstack/ceilometer", "remaining_time": 340565, "id": "48423,2"}], [{"failing_reasons": [], "items_behind": ["48385,1"], "jobs": [{"elapsed_time": 84934, "name": "gate-tempest-pep8", "url": "https://jenkins02.openstack.org/job/gate-tempest-pep8/1189/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 214743, "name": "gate-tempest-docs", "url": "https://jenkins01.openstack.org/job/gate-tempest-docs/1514/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 1399439, "name": "gate-tempest-devstack-vm-full", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-full/15592/", "voting": true, "remaining_time": 384946, "result": null}, {"elapsed_time": 1391747, "name": "gate-tempest-devstack-vm-postgres-full", "url": "https://jenkins02.openstack.org/job/gate-tempest-devstack-vm-postgres-full/14953/", "voting": true, "remaining_time": 521249, "result": null}, {"elapsed_time": 1387288, "name": "gate-tempest-devstack-vm-neutron", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-neutron/16381/", "voting": true, "remaining_time": 0, "result": null}, {"elapsed_time": 805938, "name": "gate-tempest-devstack-vm-large-ops", "url": "https://jenkins02.openstack.org/job/gate-tempest-devstack-vm-large-ops/4289/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 1326300, "name": "gate-grenade-devstack-vm", "url": "https://jenkins02.openstack.org/job/gate-grenade-devstack-vm/12622/", "voting": true, "remaining_time": 328649, "result": null}], "url": "https://review.openstack.org/48271", "item_ahead": null, "enqueue_time": 1380276878515, "project": "openstack/tempest", "remaining_time": 521249, "id": "48271,1"}, {"failing_reasons": [], "items_behind": ["48240,1"], "jobs": [{"elapsed_time": 266700, "name": "gate-nova-docs", "url": "https://jenkins01.openstack.org/job/gate-nova-docs/6815/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 288292, "name": "gate-nova-pep8", "url": "https://jenkins01.openstack.org/job/gate-nova-pep8/6716/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 1053388, "name": "gate-nova-python26", "url": "https://jenkins01.openstack.org/job/gate-nova-python26/5799/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 806482, "name": "gate-nova-python27", "url": "https://jenkins01.openstack.org/job/gate-nova-python27/5525/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 1297198, "name": "gate-tempest-devstack-vm-full", "url": "https://jenkins02.openstack.org/job/gate-tempest-devstack-vm-full/14927/", "voting": true, "remaining_time": 629042, "result": null}, {"elapsed_time": 1288003, "name": "gate-tempest-devstack-vm-postgres-full", "url": "https://jenkins02.openstack.org/job/gate-tempest-devstack-vm-postgres-full/14954/", "voting": true, "remaining_time": 624993, "result": null}, {"elapsed_time": 1255139, "name": "gate-tempest-devstack-vm-neutron", "url": "https://jenkins02.openstack.org/job/gate-tempest-devstack-vm-neutron/16430/", "voting": true, "remaining_time": 59370, "result": null}, {"elapsed_time": 652956, "name": "gate-tempest-devstack-vm-large-ops", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-large-ops/4049/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 1207574, "name": "gate-grenade-devstack-vm", "url": "https://jenkins02.openstack.org/job/gate-grenade-devstack-vm/12623/", "voting": true, "remaining_time": 447375, "result": null}], "url": "https://review.openstack.org/48385", "item_ahead": "48271,1", "enqueue_time": 1380282964803, "project": "openstack/nova", "remaining_time": 629042, "id": "48385,1"}, {"failing_reasons": [], "items_behind": ["48242,1"], "jobs": [{"elapsed_time": 109796, "name": "gate-heat-pep8", "url": "https://jenkins01.openstack.org/job/gate-heat-pep8/2164/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 104030, "name": "gate-heat-docs", "url": "https://jenkins01.openstack.org/job/gate-heat-docs/1439/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 141262, "name": "gate-heat-python26", "url": "https://jenkins01.openstack.org/job/gate-heat-python26/1917/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 113583, "name": "gate-heat-python27", "url": "https://jenkins01.openstack.org/job/gate-heat-python27/1981/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 1205403, "name": "gate-tempest-devstack-vm-full", "url": "https://jenkins02.openstack.org/job/gate-tempest-devstack-vm-full/14928/", "voting": true, "remaining_time": 720837, "result": null}, {"elapsed_time": 1166515, "name": "gate-tempest-devstack-vm-postgres-full", "url": "https://jenkins02.openstack.org/job/gate-tempest-devstack-vm-postgres-full/14955/", "voting": true, "remaining_time": 746481, "result": null}, {"elapsed_time": 1161162, "name": "gate-tempest-devstack-vm-neutron", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-neutron/16382/", "voting": true, "remaining_time": 0, "result": null}, {"elapsed_time": 673234, "name": "gate-tempest-devstack-vm-large-ops", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-large-ops/4050/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}], "url": "https://review.openstack.org/48240", "item_ahead": "48385,1", "enqueue_time": 1380283569407, "project": "openstack/heat", "remaining_time": 746481, "id": "48240,1"}, {"failing_reasons": [], "items_behind": ["48243,1"], "jobs": [{"elapsed_time": 118066, "name": "gate-heat-pep8", "url": "https://jenkins01.openstack.org/job/gate-heat-pep8/2165/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 138169, "name": "gate-heat-docs", "url": "https://jenkins01.openstack.org/job/gate-heat-docs/1440/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 135068, "name": "gate-heat-python26", "url": "https://jenkins01.openstack.org/job/gate-heat-python26/1918/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 115149, "name": "gate-heat-python27", "url": "https://jenkins01.openstack.org/job/gate-heat-python27/1982/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 1119221, "name": "gate-tempest-devstack-vm-full", "url": "https://jenkins02.openstack.org/job/gate-tempest-devstack-vm-full/14929/", "voting": true, "remaining_time": 807019, "result": null}, {"elapsed_time": 1107201, "name": "gate-tempest-devstack-vm-postgres-full", "url": "https://jenkins02.openstack.org/job/gate-tempest-devstack-vm-postgres-full/14956/", "voting": true, "remaining_time": 805795, "result": null}, {"elapsed_time": 1094770, "name": "gate-tempest-devstack-vm-neutron", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-neutron/16383/", "voting": true, "remaining_time": 45791, "result": null}, {"elapsed_time": 654451, "name": "gate-tempest-devstack-vm-large-ops", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-large-ops/4051/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}], "url": "https://review.openstack.org/48242", "item_ahead": "48240,1", "enqueue_time": 1380283569962, "project": "openstack/heat", "remaining_time": 807019, "id": "48242,1"}, {"failing_reasons": [], "items_behind": ["47860,4"], "jobs": [{"elapsed_time": 115274, "name": "gate-heat-pep8", "url": "https://jenkins02.openstack.org/job/gate-heat-pep8/1663/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 221959, "name": "gate-heat-docs", "url": "https://jenkins02.openstack.org/job/gate-heat-docs/1274/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 170541, "name": "gate-heat-python26", "url": "https://jenkins02.openstack.org/job/gate-heat-python26/1675/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 128771, "name": "gate-heat-python27", "url": "https://jenkins01.openstack.org/job/gate-heat-python27/1983/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 1080686, "name": "gate-tempest-devstack-vm-full", "url": "https://jenkins02.openstack.org/job/gate-tempest-devstack-vm-full/14930/", "voting": true, "remaining_time": 845554, "result": null}, {"elapsed_time": 1070273, "name": "gate-tempest-devstack-vm-postgres-full", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-postgres-full/14694/", "voting": true, "remaining_time": 650645, "result": null}, {"elapsed_time": 1065343, "name": "gate-tempest-devstack-vm-neutron", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-neutron/16384/", "voting": true, "remaining_time": 75218, "result": null}, {"elapsed_time": 672944, "name": "gate-tempest-devstack-vm-large-ops", "url": "https://jenkins02.openstack.org/job/gate-tempest-devstack-vm-large-ops/4290/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}], "url": "https://review.openstack.org/48243", "item_ahead": "48242,1", "enqueue_time": 1380283570607, "project": "openstack/heat", "remaining_time": 845554, "id": "48243,1"}, {"failing_reasons": [], "items_behind": ["48155,3"], "jobs": [{"elapsed_time": 98153, "name": "gate-heat-pep8", "url": "https://jenkins02.openstack.org/job/gate-heat-pep8/1664/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 253092, "name": "gate-heat-docs", "url": "https://jenkins02.openstack.org/job/gate-heat-docs/1275/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 142179, "name": "gate-heat-python26", "url": "https://jenkins01.openstack.org/job/gate-heat-python26/1919/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 138551, "name": "gate-heat-python27", "url": "https://jenkins01.openstack.org/job/gate-heat-python27/1984/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 1044832, "name": "gate-tempest-devstack-vm-full", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-full/15593/", "voting": true, "remaining_time": 739553, "result": null}, {"elapsed_time": 1032808, "name": "gate-tempest-devstack-vm-postgres-full", "url": "https://jenkins02.openstack.org/job/gate-tempest-devstack-vm-postgres-full/14957/", "voting": true, "remaining_time": 880188, "result": null}, {"elapsed_time": 1030352, "name": "gate-tempest-devstack-vm-neutron", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-neutron/16385/", "voting": true, "remaining_time": 110209, "result": null}, {"elapsed_time": 661805, "name": "gate-tempest-devstack-vm-large-ops", "url": "https://jenkins02.openstack.org/job/gate-tempest-devstack-vm-large-ops/4291/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}], "url": "https://review.openstack.org/47860", "item_ahead": "48243,1", "enqueue_time": 1380283597382, "project": "openstack/heat", "remaining_time": 880188, "id": "47860,4"}, {"failing_reasons": [], "items_behind": ["48591,1", "48111,7"], "jobs": [{"elapsed_time": 143371, "name": "gate-heat-pep8", "url": "https://jenkins02.openstack.org/job/gate-heat-pep8/1665/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 159850, "name": "gate-heat-docs", "url": "https://jenkins01.openstack.org/job/gate-heat-docs/1441/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 153069, "name": "gate-heat-python26", "url": "https://jenkins01.openstack.org/job/gate-heat-python26/1920/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 104530, "name": "gate-heat-python27", "url": "https://jenkins01.openstack.org/job/gate-heat-python27/1985/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 999795, "name": "gate-tempest-devstack-vm-full", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-full/15594/", "voting": true, "remaining_time": 784590, "result": null}, {"elapsed_time": 998656, "name": "gate-tempest-devstack-vm-postgres-full", "url": "https://jenkins02.openstack.org/job/gate-tempest-devstack-vm-postgres-full/14958/", "voting": true, "remaining_time": 914340, "result": null}, {"elapsed_time": 988798, "name": "gate-tempest-devstack-vm-neutron", "url": "https://jenkins02.openstack.org/job/gate-tempest-devstack-vm-neutron/16431/", "voting": true, "remaining_time": 325711, "result": null}, {"elapsed_time": 682055, "name": "gate-tempest-devstack-vm-large-ops", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-large-ops/4052/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}], "url": "https://review.openstack.org/48155", "item_ahead": "47860,4", "enqueue_time": 1380284449273, "project": "openstack/heat", "remaining_time": 914340, "id": "48155,3"}, {"failing_reasons": ["at least one job failed"], "items_behind": [], "jobs": [{"elapsed_time": 108212, "name": "gate-neutron-docs", "url": "https://jenkins01.openstack.org/job/gate-neutron-docs/2037/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 137419, "name": "gate-neutron-pep8", "url": "https://jenkins01.openstack.org/job/gate-neutron-pep8/2074/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 1361580, "name": "gate-neutron-python26", "url": "https://jenkins02.openstack.org/job/gate-neutron-python26/1628/", "voting": true, "remaining_time": 780221, "result": null}, {"elapsed_time": 22586, "name": "gate-neutron-python27", "url": "https://jenkins02.openstack.org/job/gate-neutron-python27/1689/", "voting": true, "remaining_time": 0, "result": "FAILURE"}, {"elapsed_time": 963152, "name": "gate-tempest-devstack-vm-neutron", "url": "https://jenkins02.openstack.org/job/gate-tempest-devstack-vm-neutron/16432/", "voting": true, "remaining_time": 351357, "result": null}], "url": "https://review.openstack.org/48591", "item_ahead": "48155,3", "enqueue_time": 1380287876076, "project": "openstack/neutron", "remaining_time": 914340, "id": "48591,1"}, {"failing_reasons": [], "items_behind": ["46123,21"], "jobs": [{"elapsed_time": 79014, "name": "gate-keystone-docs", "url": "https://jenkins01.openstack.org/job/gate-keystone-docs/1206/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 75321, "name": "gate-keystone-pep8", "url": "https://jenkins02.openstack.org/job/gate-keystone-pep8/998/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 1055592, "name": "gate-keystone-python26", "url": "https://jenkins02.openstack.org/job/gate-keystone-python26/1057/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 846093, "name": "gate-keystone-python27", "url": "https://jenkins01.openstack.org/job/gate-keystone-python27/1103/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 960841, "name": "gate-tempest-devstack-vm-full", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-full/15595/", "voting": true, "remaining_time": 823544, "result": null}, {"elapsed_time": 950223, "name": "gate-tempest-devstack-vm-postgres-full", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-postgres-full/14695/", "voting": true, "remaining_time": 770695, "result": null}, {"elapsed_time": 938442, "name": "gate-tempest-devstack-vm-neutron", "url": "https://jenkins02.openstack.org/job/gate-tempest-devstack-vm-neutron/16433/", "voting": true, "remaining_time": 376067, "result": null}, {"elapsed_time": 762279, "name": "gate-tempest-devstack-vm-large-ops", "url": "https://jenkins02.openstack.org/job/gate-tempest-devstack-vm-large-ops/4292/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 914795, "name": "gate-grenade-devstack-vm", "url": "https://jenkins01.openstack.org/job/gate-grenade-devstack-vm/12022/", "voting": true, "remaining_time": 741441, "result": null}, {"elapsed_time": 795754, "name": "gate-swift-devstack-vm-functional", "url": "https://jenkins02.openstack.org/job/gate-swift-devstack-vm-functional/1792/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}], "url": "https://review.openstack.org/48111", "item_ahead": "48155,3", "enqueue_time": 1380288460992, "project": "openstack/keystone", "remaining_time": 914340, "id": "48111,7"}, {"failing_reasons": [], "items_behind": ["48168,4"], "jobs": [{"elapsed_time": 86559, "name": "gate-keystone-docs", "url": "https://jenkins01.openstack.org/job/gate-keystone-docs/1207/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 90221, "name": "gate-keystone-pep8", "url": "https://jenkins02.openstack.org/job/gate-keystone-pep8/999/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 1171771, "name": "gate-keystone-python26", "url": "https://jenkins01.openstack.org/job/gate-keystone-python26/1058/", "voting": true, "remaining_time": 124855, "result": null}, {"elapsed_time": 859978, "name": "gate-keystone-python27", "url": "https://jenkins01.openstack.org/job/gate-keystone-python27/1104/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 899159, "name": "gate-tempest-devstack-vm-full", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-full/15596/", "voting": true, "remaining_time": 885226, "result": null}, {"elapsed_time": 883709, "name": "gate-tempest-devstack-vm-postgres-full", "url": "https://jenkins02.openstack.org/job/gate-tempest-devstack-vm-postgres-full/14959/", "voting": true, "remaining_time": 1029287, "result": null}, {"elapsed_time": 848838, "name": "gate-tempest-devstack-vm-neutron", "url": "https://jenkins02.openstack.org/job/gate-tempest-devstack-vm-neutron/16434/", "voting": true, "remaining_time": 465671, "result": null}, {"elapsed_time": 651313, "name": "gate-tempest-devstack-vm-large-ops", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-large-ops/4053/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 829582, "name": "gate-grenade-devstack-vm", "url": "https://jenkins02.openstack.org/job/gate-grenade-devstack-vm/12624/", "voting": true, "remaining_time": 825367, "result": null}, {"elapsed_time": 742887, "name": "gate-swift-devstack-vm-functional", "url": "https://jenkins02.openstack.org/job/gate-swift-devstack-vm-functional/1793/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}], "url": "https://review.openstack.org/46123", "item_ahead": "48111,7", "enqueue_time": 1380288462307, "project": "openstack/keystone", "remaining_time": 1029287, "id": "46123,21"}, {"failing_reasons": [], "items_behind": ["47546,2"], "jobs": [{"elapsed_time": 87433, "name": "gate-tempest-pep8", "url": "https://jenkins02.openstack.org/job/gate-tempest-pep8/1193/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 221562, "name": "gate-tempest-docs", "url": "https://jenkins01.openstack.org/job/gate-tempest-docs/1516/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 802529, "name": "gate-tempest-devstack-vm-full", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-full/15597/", "voting": true, "remaining_time": 981856, "result": null}, {"elapsed_time": 788099, "name": "gate-tempest-devstack-vm-postgres-full", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-postgres-full/14696/", "voting": true, "remaining_time": 932819, "result": null}, {"elapsed_time": 774143, "name": "gate-tempest-devstack-vm-neutron", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-neutron/16386/", "voting": true, "remaining_time": 366418, "result": null}, {"elapsed_time": 683464, "name": "gate-tempest-devstack-vm-large-ops", "url": "https://jenkins02.openstack.org/job/gate-tempest-devstack-vm-large-ops/4293/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 757249, "name": "gate-grenade-devstack-vm", "url": "https://jenkins02.openstack.org/job/gate-grenade-devstack-vm/12625/", "voting": true, "remaining_time": 897700, "result": null}], "url": "https://review.openstack.org/48168", "item_ahead": "46123,21", "enqueue_time": 1380288896067, "project": "openstack/tempest", "remaining_time": 1029287, "id": "48168,4"}, {"failing_reasons": [], "items_behind": ["48534,1"], "jobs": [{"elapsed_time": 241419, "name": "gate-nova-docs", "url": "https://jenkins01.openstack.org/job/gate-nova-docs/6816/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 269854, "name": "gate-nova-pep8", "url": "https://jenkins01.openstack.org/job/gate-nova-pep8/6718/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 1040776, "name": "gate-nova-python26", "url": "https://jenkins02.openstack.org/job/gate-nova-python26/5151/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 850596, "name": "gate-nova-python27", "url": "https://jenkins02.openstack.org/job/gate-nova-python27/5870/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 745448, "name": "gate-tempest-devstack-vm-full", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-full/15598/", "voting": true, "remaining_time": 1038937, "result": null}, {"elapsed_time": 720692, "name": "gate-tempest-devstack-vm-postgres-full", "url": "https://jenkins02.openstack.org/job/gate-tempest-devstack-vm-postgres-full/14960/", "voting": true, "remaining_time": 1192304, "result": null}, {"elapsed_time": 715260, "name": "gate-tempest-devstack-vm-neutron", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-neutron/16387/", "voting": true, "remaining_time": 425301, "result": null}, {"elapsed_time": 626189, "name": "gate-tempest-devstack-vm-large-ops", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-large-ops/4054/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 684699, "name": "gate-grenade-devstack-vm", "url": "https://jenkins02.openstack.org/job/gate-grenade-devstack-vm/12626/", "voting": true, "remaining_time": 970250, "result": null}], "url": "https://review.openstack.org/47546", "item_ahead": "48168,4", "enqueue_time": 1380289298528, "project": "openstack/nova", "remaining_time": 1192304, "id": "47546,2"}, {"failing_reasons": [], "items_behind": ["48516,4"], "jobs": [{"elapsed_time": 115419, "name": "gate-keystone-docs", "url": "https://jenkins02.openstack.org/job/gate-keystone-docs/1003/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 75258, "name": "gate-keystone-pep8", "url": "https://jenkins02.openstack.org/job/gate-keystone-pep8/1000/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 1160955, "name": "gate-keystone-python26", "url": "https://jenkins01.openstack.org/job/gate-keystone-python26/1059/", "voting": true, "remaining_time": 135671, "result": null}, {"elapsed_time": 854661, "name": "gate-keystone-python27", "url": "https://jenkins01.openstack.org/job/gate-keystone-python27/1105/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 684605, "name": "gate-tempest-devstack-vm-full", "url": "https://jenkins02.openstack.org/job/gate-tempest-devstack-vm-full/14931/", "voting": true, "remaining_time": 1241635, "result": null}, {"elapsed_time": 683344, "name": "gate-tempest-devstack-vm-postgres-full", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-postgres-full/14697/", "voting": true, "remaining_time": 1037574, "result": null}, {"elapsed_time": 672761, "name": "gate-tempest-devstack-vm-neutron", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-neutron/16388/", "voting": true, "remaining_time": 467800, "result": null}, {"elapsed_time": 658114, "name": "gate-tempest-devstack-vm-large-ops", "url": "https://jenkins02.openstack.org/job/gate-tempest-devstack-vm-large-ops/4294/", "voting": true, "remaining_time": 40884, "result": null}, {"elapsed_time": 653007, "name": "gate-grenade-devstack-vm", "url": "https://jenkins01.openstack.org/job/gate-grenade-devstack-vm/12023/", "voting": true, "remaining_time": 1003229, "result": null}, {"elapsed_time": 639570, "name": "gate-swift-devstack-vm-functional", "url": "https://jenkins01.openstack.org/job/gate-swift-devstack-vm-functional/1680/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}], "url": "https://review.openstack.org/48534", "item_ahead": "47546,2", "enqueue_time": 1380290773932, "project": "openstack/keystone", "remaining_time": 1241635, "id": "48534,1"}, {"failing_reasons": [], "items_behind": ["47479,2", "39668,13", "48625,1", "48627,1", "48601,1", "48164,1", "46291,2"], "jobs": [{"elapsed_time": 119304, "name": "gate-tempest-pep8", "url": "https://jenkins01.openstack.org/job/gate-tempest-pep8/1601/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 373183, "name": "gate-tempest-docs", "url": "https://jenkins02.openstack.org/job/gate-tempest-docs/1168/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 635471, "name": "gate-tempest-devstack-vm-full", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-full/15599/", "voting": true, "remaining_time": 1148914, "result": null}, {"elapsed_time": 605990, "name": "gate-tempest-devstack-vm-postgres-full", "url": "https://jenkins02.openstack.org/job/gate-tempest-devstack-vm-postgres-full/14961/", "voting": true, "remaining_time": 1307006, "result": null}, {"elapsed_time": 603764, "name": "gate-tempest-devstack-vm-neutron", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-neutron/16389/", "voting": true, "remaining_time": 536797, "result": null}, {"elapsed_time": 573906, "name": "gate-tempest-devstack-vm-large-ops", "url": "https://jenkins02.openstack.org/job/gate-tempest-devstack-vm-large-ops/4295/", "voting": true, "remaining_time": 125092, "result": null}, {"elapsed_time": 570202, "name": "gate-grenade-devstack-vm", "url": "https://jenkins01.openstack.org/job/gate-grenade-devstack-vm/12024/", "voting": true, "remaining_time": 1086034, "result": null}], "url": "https://review.openstack.org/48516", "item_ahead": "48534,1", "enqueue_time": 1380293089245, "project": "openstack/tempest", "remaining_time": 1307006, "id": "48516,4"}, {"failing_reasons": ["at least one job failed"], "items_behind": [], "jobs": [{"elapsed_time": 225181, "name": "gate-nova-docs", "url": "https://jenkins01.openstack.org/job/gate-nova-docs/6817/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 250970, "name": "gate-nova-pep8", "url": "https://jenkins02.openstack.org/job/gate-nova-pep8/4724/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 1160801, "name": "gate-nova-python26", "url": "https://jenkins01.openstack.org/job/gate-nova-python26/5803/", "voting": true, "remaining_time": 0, "result": null}, {"elapsed_time": 11087, "name": "gate-nova-python27", "url": "https://jenkins02.openstack.org/job/gate-nova-python27/5871/", "voting": true, "remaining_time": 0, "result": "FAILURE"}, {"elapsed_time": 551403, "name": "gate-tempest-devstack-vm-full", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-full/15600/", "voting": true, "remaining_time": 1232982, "result": null}, {"elapsed_time": 538724, "name": "gate-tempest-devstack-vm-postgres-full", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-postgres-full/14698/", "voting": true, "remaining_time": 1182194, "result": null}, {"elapsed_time": 518413, "name": "gate-tempest-devstack-vm-neutron", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-neutron/16390/", "voting": true, "remaining_time": 622148, "result": null}, {"elapsed_time": 513228, "name": "gate-tempest-devstack-vm-large-ops", "url": "https://jenkins02.openstack.org/job/gate-tempest-devstack-vm-large-ops/4296/", "voting": true, "remaining_time": 185770, "result": null}, {"elapsed_time": 488201, "name": "gate-grenade-devstack-vm", "url": "https://jenkins01.openstack.org/job/gate-grenade-devstack-vm/12025/", "voting": true, "remaining_time": 1168035, "result": null}], "url": "https://review.openstack.org/47479", "item_ahead": "48516,4", "enqueue_time": 1380293138283, "project": "openstack/nova", "remaining_time": 1307006, "id": "47479,2"}, {"failing_reasons": ["at least one job failed"], "items_behind": [], "jobs": [{"elapsed_time": 4238, "name": "gate-nova-docs", "url": "https://jenkins02.openstack.org/job/gate-nova-docs/4674/", "voting": true, "remaining_time": 0, "result": "FAILURE"}, {"elapsed_time": 2365, "name": "gate-nova-pep8", "url": "https://jenkins02.openstack.org/job/gate-nova-pep8/4727/", "voting": true, "remaining_time": 0, "result": "FAILURE"}, {"elapsed_time": 854913, "name": "gate-nova-python26", "url": "https://jenkins01.openstack.org/job/gate-nova-python26/5806/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 776630, "name": "gate-nova-python27", "url": "https://jenkins02.openstack.org/job/gate-nova-python27/5874/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 477284, "name": "gate-tempest-devstack-vm-full", "url": "https://jenkins02.openstack.org/job/gate-tempest-devstack-vm-full/14932/", "voting": true, "remaining_time": 1448956, "result": null}, {"elapsed_time": 474443, "name": "gate-tempest-devstack-vm-postgres-full", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-postgres-full/14699/", "voting": true, "remaining_time": 1246475, "result": null}, {"elapsed_time": 472601, "name": "gate-tempest-devstack-vm-neutron", "url": "https://jenkins02.openstack.org/job/gate-tempest-devstack-vm-neutron/16435/", "voting": true, "remaining_time": 841908, "result": null}, {"elapsed_time": 453504, "name": "gate-tempest-devstack-vm-large-ops", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-large-ops/4055/", "voting": true, "remaining_time": 191249, "result": null}, {"elapsed_time": 444138, "name": "gate-grenade-devstack-vm", "url": "https://jenkins02.openstack.org/job/gate-grenade-devstack-vm/12627/", "voting": true, "remaining_time": 1210811, "result": null}], "url": "https://review.openstack.org/39668", "item_ahead": "48516,4", "enqueue_time": 1380296032916, "project": "openstack/nova", "remaining_time": 1448956, "id": "39668,13"}, {"failing_reasons": ["at least one job failed"], "items_behind": [], "jobs": [{"elapsed_time": 104102, "name": "gate-heat-pep8", "url": "https://jenkins01.openstack.org/job/gate-heat-pep8/2169/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 78608, "name": "gate-heat-docs", "url": "https://jenkins02.openstack.org/job/gate-heat-docs/1279/", "voting": true, "remaining_time": 0, "result": "FAILURE"}, {"elapsed_time": 135647, "name": "gate-heat-python26", "url": "https://jenkins02.openstack.org/job/gate-heat-python26/1681/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 131232, "name": "gate-heat-python27", "url": "https://jenkins02.openstack.org/job/gate-heat-python27/1833/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 437367, "name": "gate-tempest-devstack-vm-full", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-full/15601/", "voting": true, "remaining_time": 1347018, "result": null}, {"elapsed_time": 419164, "name": "gate-tempest-devstack-vm-postgres-full", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-postgres-full/14700/", "voting": true, "remaining_time": 1301754, "result": null}, {"elapsed_time": 405004, "name": "gate-tempest-devstack-vm-neutron", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-neutron/16391/", "voting": true, "remaining_time": 735557, "result": null}, {"elapsed_time": 388934, "name": "gate-tempest-devstack-vm-large-ops", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-large-ops/4056/", "voting": true, "remaining_time": 255819, "result": null}], "url": "https://review.openstack.org/48625", "item_ahead": "48516,4", "enqueue_time": 1380298199735, "project": "openstack/heat", "remaining_time": 1448956, "id": "48625,1"}, {"failing_reasons": ["at least one job failed"], "items_behind": [], "jobs": [{"elapsed_time": 2383, "name": "gate-heat-pep8", "url": "https://jenkins02.openstack.org/job/gate-heat-pep8/1669/", "voting": true, "remaining_time": 0, "result": "FAILURE"}, {"elapsed_time": 123063, "name": "gate-heat-docs", "url": "https://jenkins01.openstack.org/job/gate-heat-docs/1445/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 140643, "name": "gate-heat-python26", "url": "https://jenkins01.openstack.org/job/gate-heat-python26/1923/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 120361, "name": "gate-heat-python27", "url": "https://jenkins02.openstack.org/job/gate-heat-python27/1834/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 355849, "name": "gate-tempest-devstack-vm-full", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-full/15602/", "voting": true, "remaining_time": 1428536, "result": null}, {"elapsed_time": 349963, "name": "gate-tempest-devstack-vm-postgres-full", "url": "https://jenkins02.openstack.org/job/gate-tempest-devstack-vm-postgres-full/14962/", "voting": true, "remaining_time": 1563033, "result": null}, {"elapsed_time": 325802, "name": "gate-tempest-devstack-vm-neutron", "url": "https://jenkins02.openstack.org/job/gate-tempest-devstack-vm-neutron/16436/", "voting": true, "remaining_time": 988707, "result": null}, {"elapsed_time": 309685, "name": "gate-tempest-devstack-vm-large-ops", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-large-ops/4057/", "voting": true, "remaining_time": 335068, "result": null}], "url": "https://review.openstack.org/48627", "item_ahead": "48516,4", "enqueue_time": 1380298279387, "project": "openstack/heat", "remaining_time": 1563033, "id": "48627,1"}, {"failing_reasons": ["at least one job failed"], "items_behind": [], "jobs": [{"elapsed_time": 39984, "name": "gate-swift-docs", "url": "https://jenkins02.openstack.org/job/gate-swift-docs/659/", "voting": true, "remaining_time": 0, "result": "FAILURE"}, {"elapsed_time": 62434, "name": "gate-swift-pep8", "url": "https://jenkins02.openstack.org/job/gate-swift-pep8/651/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 135465, "name": "gate-swift-python26", "url": "https://jenkins02.openstack.org/job/gate-swift-python26/714/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 84251, "name": "gate-swift-python27", "url": "https://jenkins02.openstack.org/job/gate-swift-python27/723/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 289217, "name": "gate-swift-devstack-vm-functional", "url": "https://jenkins02.openstack.org/job/gate-swift-devstack-vm-functional/1794/", "voting": true, "remaining_time": 503200, "result": null}, {"elapsed_time": 264841, "name": "gate-tempest-devstack-vm-full", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-full/15603/", "voting": true, "remaining_time": 1519544, "result": null}, {"elapsed_time": 241185, "name": "gate-tempest-devstack-vm-neutron", "url": "https://jenkins02.openstack.org/job/gate-tempest-devstack-vm-neutron/16437/", "voting": true, "remaining_time": 1073324, "result": null}, {"elapsed_time": 215778, "name": "gate-tempest-devstack-vm-postgres-full", "url": "https://jenkins02.openstack.org/job/gate-tempest-devstack-vm-postgres-full/14963/", "voting": true, "remaining_time": 1697218, "result": null}, {"elapsed_time": 190054, "name": "gate-tempest-devstack-vm-large-ops", "url": "https://jenkins02.openstack.org/job/gate-tempest-devstack-vm-large-ops/4297/", "voting": true, "remaining_time": 508944, "result": null}, {"elapsed_time": 166190, "name": "gate-grenade-devstack-vm", "url": "https://jenkins01.openstack.org/job/gate-grenade-devstack-vm/12026/", "voting": true, "remaining_time": 1490046, "result": null}], "url": "https://review.openstack.org/48601", "item_ahead": "48516,4", "enqueue_time": 1380298994701, "project": "openstack/swift", "remaining_time": 1697218, "id": "48601,1"}, {"failing_reasons": ["at least one job failed"], "items_behind": [], "jobs": [{"elapsed_time": 100330, "name": "gate-swift-docs", "url": "https://jenkins02.openstack.org/job/gate-swift-docs/662/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 64171, "name": "gate-swift-pep8", "url": "https://jenkins02.openstack.org/job/gate-swift-pep8/652/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 121329, "name": "gate-swift-python26", "url": "https://jenkins01.openstack.org/job/gate-swift-python26/683/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 5623, "name": "gate-swift-python27", "url": "https://jenkins02.openstack.org/job/gate-swift-python27/726/", "voting": true, "remaining_time": 0, "result": "FAILURE"}, {"elapsed_time": 159076, "name": "gate-swift-devstack-vm-functional", "url": "https://jenkins02.openstack.org/job/gate-swift-devstack-vm-functional/1795/", "voting": true, "remaining_time": 633341, "result": null}, {"elapsed_time": 149233, "name": "gate-tempest-devstack-vm-full", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-full/15604/", "voting": true, "remaining_time": 1635152, "result": null}, {"elapsed_time": 139770, "name": "gate-tempest-devstack-vm-neutron", "url": "https://jenkins02.openstack.org/job/gate-tempest-devstack-vm-neutron/16438/", "voting": true, "remaining_time": 1174739, "result": null}, {"elapsed_time": 133160, "name": "gate-tempest-devstack-vm-postgres-full", "url": "https://jenkins01.openstack.org/job/gate-tempest-devstack-vm-postgres-full/14701/", "voting": true, "remaining_time": 1587758, "result": null}, {"elapsed_time": 117650, "name": "gate-tempest-devstack-vm-large-ops", "url": "https://jenkins02.openstack.org/job/gate-tempest-devstack-vm-large-ops/4298/", "voting": true, "remaining_time": 581348, "result": null}, {"elapsed_time": 115132, "name": "gate-grenade-devstack-vm", "url": "https://jenkins02.openstack.org/job/gate-grenade-devstack-vm/12628/", "voting": true, "remaining_time": 1539817, "result": null}], "url": "https://review.openstack.org/48164", "item_ahead": "48516,4", "enqueue_time": 1380299009131, "project": "openstack/swift", "remaining_time": 1697218, "id": "48164,1"}, {"failing_reasons": [], "items_behind": ["48503,1"], "jobs": [{"elapsed_time": 80662, "name": "gate-swift-docs", "url": "https://jenkins01.openstack.org/job/gate-swift-docs/794/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 61048, "name": "gate-swift-pep8", "url": "https://jenkins01.openstack.org/job/gate-swift-pep8/801/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 118183, "name": "gate-swift-python26", "url": "https://jenkins02.openstack.org/job/gate-swift-python26/717/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 99494, "name": "gate-swift-python27", "url": "https://jenkins01.openstack.org/job/gate-swift-python27/723/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 110549, "name": "gate-swift-devstack-vm-functional", "url": "https://jenkins02.openstack.org/job/gate-swift-devstack-vm-functional/1796/", "voting": true, "remaining_time": 681868, "result": null}, {"elapsed_time": 70538, "name": "gate-tempest-devstack-vm-full", "url": "https://jenkins02.openstack.org/job/gate-tempest-devstack-vm-full/14933/", "voting": true, "remaining_time": 1855702, "result": null}, {"elapsed_time": 60891, "name": "gate-tempest-devstack-vm-neutron", "url": "https://jenkins02.openstack.org/job/gate-tempest-devstack-vm-neutron/16439/", "voting": true, "remaining_time": 1253618, "result": null}, {"elapsed_time": null, "name": "gate-tempest-devstack-vm-postgres-full", "url": null, "voting": true, "remaining_time": null, "result": null}, {"elapsed_time": null, "name": "gate-tempest-devstack-vm-large-ops", "url": null, "voting": true, "remaining_time": null, "result": null}, {"elapsed_time": null, "name": "gate-grenade-devstack-vm", "url": null, "voting": true, "remaining_time": null, "result": null}], "url": "https://review.openstack.org/46291", "item_ahead": "48516,4", "enqueue_time": 1380299228671, "project": "openstack/swift", "remaining_time": null, "id": "46291,2"}, {"failing_reasons": [], "items_behind": ["48202,1", "48553,4", "47718,7"], "jobs": [{"elapsed_time": 98382, "name": "gate-glance-docs", "url": "https://jenkins02.openstack.org/job/gate-glance-docs/640/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 171699, "name": "gate-glance-pep8", "url": "https://jenkins02.openstack.org/job/gate-glance-pep8/626/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 589539, "name": "gate-glance-python26", "url": "https://jenkins02.openstack.org/job/gate-glance-python26/689/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 520779, "name": "gate-glance-python27", "url": "https://jenkins02.openstack.org/job/gate-glance-python27/726/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": null, "name": "gate-tempest-devstack-vm-full", "url": null, "voting": true, "remaining_time": null, "result": null}, {"elapsed_time": null, "name": "gate-tempest-devstack-vm-postgres-full", "url": null, "voting": true, "remaining_time": null, "result": null}, {"elapsed_time": null, "name": "gate-tempest-devstack-vm-neutron", "url": null, "voting": true, "remaining_time": null, "result": null}, {"elapsed_time": null, "name": "gate-tempest-devstack-vm-large-ops", "url": null, "voting": true, "remaining_time": null, "result": null}, {"elapsed_time": null, "name": "gate-grenade-devstack-vm", "url": null, "voting": true, "remaining_time": null, "result": null}], "url": "https://review.openstack.org/48503", "item_ahead": "46291,2", "enqueue_time": 1380299426335, "project": "openstack/glance", "remaining_time": null, "id": "48503,1"}, {"failing_reasons": ["at least one job failed"], "items_behind": [], "jobs": [{"elapsed_time": 579487, "name": "gate-horizon-docs", "url": "https://jenkins02.openstack.org/job/gate-horizon-docs/616/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 118371, "name": "gate-horizon-pep8", "url": "https://jenkins01.openstack.org/job/gate-horizon-pep8/826/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 234012, "name": "gate-horizon-python26", "url": "https://jenkins02.openstack.org/job/gate-horizon-python26/756/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 216372, "name": "gate-horizon-python27", "url": "https://jenkins02.openstack.org/job/gate-horizon-python27/716/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 188521, "name": "gate-horizon-python27-django14", "url": "https://jenkins02.openstack.org/job/gate-horizon-python27-django14/685/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 1847, "name": "gate-horizon-selenium", "url": "https://jenkins02.openstack.org/job/gate-horizon-selenium/734/", "voting": true, "remaining_time": 0, "result": "FAILURE"}, {"elapsed_time": null, "name": "gate-tempest-devstack-vm-full", "url": null, "voting": true, "remaining_time": null, "result": null}, {"elapsed_time": null, "name": "gate-tempest-devstack-vm-postgres-full", "url": null, "voting": true, "remaining_time": null, "result": null}, {"elapsed_time": null, "name": "gate-tempest-devstack-vm-neutron", "url": null, "voting": true, "remaining_time": null, "result": null}, {"elapsed_time": null, "name": "gate-tempest-devstack-vm-large-ops", "url": null, "voting": true, "remaining_time": null, "result": null}, {"elapsed_time": null, "name": "gate-grenade-devstack-vm", "url": null, "voting": true, "remaining_time": null, "result": null}], "url": "https://review.openstack.org/48202", "item_ahead": "48503,1", "enqueue_time": 1380304046069, "project": "openstack/horizon", "remaining_time": null, "id": "48202,1"}, {"failing_reasons": ["at least one job failed"], "items_behind": [], "jobs": [{"elapsed_time": 79009, "name": "gate-keystone-docs", "url": "https://jenkins01.openstack.org/job/gate-keystone-docs/1215/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 89394, "name": "gate-keystone-pep8", "url": "https://jenkins02.openstack.org/job/gate-keystone-pep8/1007/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 633149, "name": "gate-keystone-python26", "url": "https://jenkins02.openstack.org/job/gate-keystone-python26/1065/", "voting": true, "remaining_time": 448519, "result": null}, {"elapsed_time": 8840, "name": "gate-keystone-python27", "url": "https://jenkins02.openstack.org/job/gate-keystone-python27/1097/", "voting": true, "remaining_time": 0, "result": "FAILURE"}, {"elapsed_time": null, "name": "gate-tempest-devstack-vm-full", "url": null, "voting": true, "remaining_time": null, "result": null}, {"elapsed_time": null, "name": "gate-tempest-devstack-vm-postgres-full", "url": null, "voting": true, "remaining_time": null, "result": null}, {"elapsed_time": null, "name": "gate-tempest-devstack-vm-neutron", "url": null, "voting": true, "remaining_time": null, "result": null}, {"elapsed_time": null, "name": "gate-tempest-devstack-vm-large-ops", "url": null, "voting": true, "remaining_time": null, "result": null}, {"elapsed_time": null, "name": "gate-grenade-devstack-vm", "url": null, "voting": true, "remaining_time": null, "result": null}, {"elapsed_time": null, "name": "gate-swift-devstack-vm-functional", "url": null, "voting": true, "remaining_time": null, "result": null}], "url": "https://review.openstack.org/48553", "item_ahead": "48503,1", "enqueue_time": 1380304548765, "project": "openstack/keystone", "remaining_time": null, "id": "48553,4"}, {"failing_reasons": [], "items_behind": ["48721,1"], "jobs": [{"elapsed_time": 93320, "name": "gate-glance-docs", "url": "https://jenkins02.openstack.org/job/gate-glance-docs/641/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 98965, "name": "gate-glance-pep8", "url": "https://jenkins01.openstack.org/job/gate-glance-pep8/816/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 601959, "name": "gate-glance-python26", "url": "https://jenkins01.openstack.org/job/gate-glance-python26/666/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 588646, "name": "gate-glance-python27", "url": "https://jenkins02.openstack.org/job/gate-glance-python27/729/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": null, "name": "gate-tempest-devstack-vm-full", "url": null, "voting": true, "remaining_time": null, "result": null}, {"elapsed_time": null, "name": "gate-tempest-devstack-vm-postgres-full", "url": null, "voting": true, "remaining_time": null, "result": null}, {"elapsed_time": null, "name": "gate-tempest-devstack-vm-neutron", "url": null, "voting": true, "remaining_time": null, "result": null}, {"elapsed_time": null, "name": "gate-tempest-devstack-vm-large-ops", "url": null, "voting": true, "remaining_time": null, "result": null}, {"elapsed_time": null, "name": "gate-grenade-devstack-vm", "url": null, "voting": true, "remaining_time": null, "result": null}], "url": "https://review.openstack.org/47718", "item_ahead": "48503,1", "enqueue_time": 1380307097942, "project": "openstack/glance", "remaining_time": null, "id": "47718,7"}, {"failing_reasons": [], "items_behind": ["48636,3", "48560,1"], "jobs": [{"elapsed_time": 250871, "name": "gate-nova-docs", "url": "https://jenkins01.openstack.org/job/gate-nova-docs/6822/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 271342, "name": "gate-nova-pep8", "url": "https://jenkins02.openstack.org/job/gate-nova-pep8/4733/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 603753, "name": "gate-nova-python26", "url": "https://jenkins01.openstack.org/job/gate-nova-python26/5810/", "voting": true, "remaining_time": 378103, "result": null}, {"elapsed_time": 607935, "name": "gate-nova-python27", "url": "https://jenkins02.openstack.org/job/gate-nova-python27/5878/", "voting": true, "remaining_time": 201525, "result": null}, {"elapsed_time": null, "name": "gate-tempest-devstack-vm-full", "url": null, "voting": true, "remaining_time": null, "result": null}, {"elapsed_time": null, "name": "gate-tempest-devstack-vm-postgres-full", "url": null, "voting": true, "remaining_time": null, "result": null}, {"elapsed_time": null, "name": "gate-tempest-devstack-vm-neutron", "url": null, "voting": true, "remaining_time": null, "result": null}, {"elapsed_time": null, "name": "gate-tempest-devstack-vm-large-ops", "url": null, "voting": true, "remaining_time": null, "result": null}, {"elapsed_time": null, "name": "gate-grenade-devstack-vm", "url": null, "voting": true, "remaining_time": null, "result": null}], "url": "https://review.openstack.org/48721", "item_ahead": "47718,7", "enqueue_time": 1380308978350, "project": "openstack/nova", "remaining_time": null, "id": "48721,1"}, {"failing_reasons": ["at least one job failed"], "items_behind": [], "jobs": [{"elapsed_time": 220348, "name": "gate-ceilometer-docs", "url": "https://jenkins02.openstack.org/job/gate-ceilometer-docs/995/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 70164, "name": "gate-ceilometer-pep8", "url": "https://jenkins01.openstack.org/job/gate-ceilometer-pep8/1153/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 554806, "name": "gate-ceilometer-python26", "url": "https://jenkins02.openstack.org/job/gate-ceilometer-python26/1021/", "voting": true, "remaining_time": 43, "result": null}, {"elapsed_time": 329706, "name": "gate-ceilometer-python27", "url": "https://jenkins02.openstack.org/job/gate-ceilometer-python27/1009/", "voting": true, "remaining_time": 0, "result": "FAILURE"}, {"elapsed_time": null, "name": "gate-tempest-devstack-vm-full", "url": null, "voting": true, "remaining_time": null, "result": null}, {"elapsed_time": null, "name": "gate-tempest-devstack-vm-postgres-full", "url": null, "voting": true, "remaining_time": null, "result": null}, {"elapsed_time": null, "name": "gate-tempest-devstack-vm-neutron", "url": null, "voting": true, "remaining_time": null, "result": null}, {"elapsed_time": null, "name": "gate-tempest-devstack-vm-large-ops", "url": null, "voting": true, "remaining_time": null, "result": null}, {"elapsed_time": null, "name": "gate-swift-devstack-vm-functional", "url": null, "voting": true, "remaining_time": null, "result": null}], "url": "https://review.openstack.org/48636", "item_ahead": "48721,1", "enqueue_time": 1380309007955, "project": "openstack/ceilometer", "remaining_time": null, "id": "48636,3"}, {"failing_reasons": [], "items_behind": [], "jobs": [{"elapsed_time": 5555, "name": "gate-tempest-requirements", "url": "https://jenkins01.openstack.org/job/gate-tempest-requirements/35/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 103859, "name": "gate-tempest-pep8", "url": "https://jenkins01.openstack.org/job/gate-tempest-pep8/1605/", "voting": true, "remaining_time": 0, "result": "SUCCESS"}, {"elapsed_time": 263246, "name": "gate-tempest-docs", "url": "https://jenkins02.openstack.org/job/gate-tempest-docs/1175/", "voting": true, "remaining_time": 157235, "result": null}, {"elapsed_time": null, "name": "gate-tempest-devstack-vm-full", "url": null, "voting": true, "remaining_time": null, "result": null}, {"elapsed_time": null, "name": "gate-tempest-devstack-vm-postgres-full", "url": null, "voting": true, "remaining_time": null, "result": null}, {"elapsed_time": null, "name": "gate-tempest-devstack-vm-neutron", "url": null, "voting": true, "remaining_time": null, "result": null}, {"elapsed_time": null, "name": "gate-tempest-devstack-vm-large-ops", "url": null, "voting": true, "remaining_time": null, "result": null}, {"elapsed_time": null, "name": "gate-grenade-devstack-vm", "url": null, "voting": true, "remaining_time": null, "result": null}], "url": "https://review.openstack.org/48560", "item_ahead": "48721,1", "enqueue_time": 1380309816876, "project": "openstack/tempest", "remaining_time": null, "id": "48560,1"}]], "name": "openstack-dev/devstack, openstack-dev/grenade, openstack-dev/pbr, openstack-infra/devstack-gate, openstack/ceilometer, openstack/cinder, openstack/glance, openstack/heat, openstack/horizon, openstack/keystone, openstack/neutron, openstack/nova, openstack/oslo.config, openstack/oslo.messaging, openstack/oslo.version, openstack/python-ceilometerclient, openstack/python-cinderclient, openstack/python-glanceclient, openstack/python-heatclient, openstack/python-keystoneclient, openstack/python-neutronclient, openstack/python-novaclient, openstack/python-swiftclient, openstack/requirements, openstack/swift, openstack/tempest, z/tempest"}, {"heads": [], "name": "openstack/ironic"}, {"heads": [], "name": "openstack-dev/cookiecutter, openstack-dev/openstack-nose, openstack-dev/openstack-qa, openstack-dev/sandbox, openstack-infra/activity-board, openstack-infra/askbot-theme, openstack-infra/groups, openstack-infra/lodgeit, openstack-infra/meetbot, openstack-infra/nose-html-output, openstack-infra/odsreg, openstack-infra/publications, openstack-infra/puppet-apparmor, openstack-infra/puppet-dashboard, openstack-infra/puppet-vcsrepo, openstack-infra/releasestatus, openstack-infra/reviewstats, openstack-infra/tripleo-ci, openstack/api-site, openstack/compute-api, openstack/database-api, openstack/governance, openstack/heat-templates, openstack/identity-api, openstack/image-api, openstack/netconn-api, openstack/object-api, openstack/openstack-chef, openstack/tripleo-heat-templates, openstack/tripleo-image-elements, openstack/trove-integration, openstack/volume-api, stackforge/MRaaS, stackforge/cloudcafe, stackforge/clouddocs-maven-plugin, stackforge/cloudroast, stackforge/fuel-astute, stackforge/fuel-main, stackforge/fuel-ostf-plugin, stackforge/fuel-ostf-tests, stackforge/fuel-web, stackforge/golang-client, stackforge/murano-agent, stackforge/murano-deployment, stackforge/murano-docs, stackforge/murano-tests, stackforge/novaimagebuilder, stackforge/occi-os, stackforge/opencafe, stackforge/openvz-nova-driver, stackforge/puppet-openstack_dev_env, stackforge/puppet-savanna, stackforge/python-climateclient, stackforge/savanna-extra, stackforge/savanna-image-elements, stackforge/staccato, stackforge/tuskar-ui"}, {"heads": [], "name": "stackforge/savanna"}, {"heads": [], "name": "stackforge/cookbook-openstack-image"}, {"heads": [], "name": "stackforge/puppet-cinder"}, {"heads": [], "name": "openstack/trove"}, {"heads": [], "name": "openstack/python-ironicclient"}, {"heads": [], "name": "stackforge/cookbook-openstack-identity"}, {"heads": [], "name": "stackforge/python-tuskarclient"}, {"heads": [], "name": "stackforge/bufunfa"}, {"heads": [], "name": "openstack-infra/gerrit"}, {"heads": [], "name": "openstack/heat-cfntools"}, {"heads": [], "name": "stackforge/taskflow"}, {"heads": [], "name": "openstack/openstack-planet"}, {"heads": [], "name": "stackforge/barbican"}, {"heads": [], "name": "stackforge/pycadf"}, {"heads": [], "name": "openstack-infra/jeepyb"}, {"heads": [], "name": "stackforge/puppet-heat"}, {"heads": [], "name": "stackforge/packstack"}, {"heads": [], "name": "openstack/oslo.sphinx"}, {"heads": [], "name": "stackforge/murano-conductor"}, {"heads": [], "name": "openstack-infra/reviewday"}, {"heads": [], "name": "openstack/python-marconiclient"}, {"heads": [], "name": "stackforge/puppet-glance"}, {"heads": [], "name": "stackforge/anvil"}, {"heads": [], "name": "stackforge/puppet-nova"}, {"heads": [], "name": "stackforge/murano-api"}, {"heads": [], "name": "stackforge/cookbook-openstack-dashboard"}, {"heads": [], "name": "stackforge/murano-common"}, {"heads": [], "name": "openstack-infra/gearman-plugin"}, {"heads": [], "name": "openstack-infra/gerritbot"}, {"heads": [], "name": "stackforge/python-savannaclient"}, {"heads": [], "name": "openstack-infra/elastic-recheck"}, {"heads": [], "name": "stackforge/pecan"}, {"heads": [], "name": "openstack/diskimage-builder"}, {"heads": [], "name": "stackforge/cookbook-openstack-orchestration"}, {"heads": [], "name": "stackforge/cookbook-openstack-common"}, {"heads": [], "name": "stackforge/cookbook-openstack-object-storage"}, {"heads": [], "name": "openstack-infra/nodepool"}, {"heads": [], "name": "stackforge/cookbook-openstack-compute"}, {"heads": [], "name": "openstack/python-troveclient"}, {"heads": [], "name": "stackforge/climate"}, {"heads": [], "name": "openstack-infra/git-review"}, {"heads": [], "name": "openstack-infra/gitdm"}, {"heads": [], "name": "stackforge/designate"}, {"heads": [], "name": "openstack-infra/config"}, {"heads": [], "name": "stackforge/tuskar"}, {"heads": [], "name": "stackforge/murano-dashboard"}, {"heads": [], "name": "stackforge/pyghmi"}, {"heads": [], "name": "openstack/operations-guide"}, {"heads": [], "name": "stackforge/cl-openstack-client"}, {"heads": [], "name": "stackforge/puppet-neutron"}, {"heads": [], "name": "stackforge/stackalytics"}, {"heads": [], "name": "stackforge/python-manilaclient"}, {"heads": [], "name": "stackforge/puppet-openstack"}, {"heads": [], "name": "stackforge/cookbook-openstack-metering"}, {"heads": [], "name": "openstack-infra/gerritlib"}, {"heads": [], "name": "stackforge/sqlalchemy-migrate"}, {"heads": [], "name": "stackforge/manila"}, {"heads": [], "name": "stackforge/kwapi"}, {"heads": [], "name": "openstack-infra/zmq-event-publisher"}, {"heads": [], "name": "openstack/os-collect-config"}, {"heads": [], "name": "openstack-infra/statusbot"}, {"heads": [], "name": "stackforge/python-libraclient"}, {"heads": [], "name": "openstack-infra/gear"}, {"heads": [], "name": "openstack-infra/zuul"}, {"heads": [], "name": "stackforge/libra"}, {"heads": [], "name": "stackforge/bindep"}, {"heads": [], "name": "stackforge/savanna-dashboard"}, {"heads": [], "name": "openstack/os-apply-config"}, {"heads": [], "name": "stackforge/openstack-chef-repo"}, {"heads": [], "name": "openstack-infra/storyboard"}, {"heads": [], "name": "stackforge/cookbook-openstack-network"}, {"heads": [], "name": "stackforge/cookbook-openstack-ops-database"}, {"heads": [], "name": "openstack-infra/pypi-mirror"}, {"heads": [], "name": "openstack/oslo-incubator"}, {"heads": [], "name": "stackforge/puppet-swift"}, {"heads": [], "name": "openstack-dev/hacking"}, {"heads": [], "name": "stackforge/cookbook-openstack-ops-messaging"}, {"heads": [], "name": "stackforge/puppet-keystone"}, {"heads": [], "name": "stackforge/inception"}, {"heads": [], "name": "openstack/os-refresh-config"}, {"heads": [], "name": "stackforge/healthnmon"}, {"heads": [], "name": "openstack-infra/jenkins-job-builder"}, {"heads": [], "name": "stackforge/python-muranoclient"}, {"heads": [], "name": "stackforge/python-designateclient"}, {"heads": [], "name": "stackforge/puppet-ceilometer"}, {"heads": [], "name": "openstack/django_openstack_auth"}, {"heads": [], "name": "stackforge/cookbook-openstack-block-storage"}, {"heads": [], "name": "stackforge/puppet-tempest"}, {"heads": [], "name": "stackforge/billingstack"}, {"heads": [], "name": "openstack/tripleo-incubator"}, {"heads": [], "name": "stackforge/rally"}, {"heads": [], "name": "stackforge/wsme"}, {"heads": [], "name": "openstack/python-openstackclient"}, {"heads": [], "name": "openstack/marconi"}, {"heads": [], "name": "openstack/openstack-manuals"}], "name": "gate"}, {"description": "This pipeline runs jobs that operate after each change is merged.", "change_queues": [{"heads": [[{"failing_reasons": ["at least one job failed"], "items_behind": [], "jobs": [{"elapsed_time": 111939, "name": "nova-branch-tarball", "url": "https://jenkins01.openstack.org/job/nova-branch-tarball/399/", "voting": true, "remaining_time": 71193, "result": null}, {"elapsed_time": 111936, "name": "nova-coverage", "url": "https://jenkins01.openstack.org/job/nova-coverage/395/", "voting": true, "remaining_time": 902451, "result": null}, {"elapsed_time": 111938, "name": "nova-docs", "url": "https://jenkins01.openstack.org/job/nova-docs/376/", "voting": true, "remaining_time": 204320, "result": null}, {"elapsed_time": 102513, "name": "nova-upstream-translation-update", "url": "https://jenkins.openstack.org/job/nova-upstream-translation-update/4393/", "voting": true, "remaining_time": 0, "result": "FAILURE"}], "url": "https://review.openstack.org/gitweb?p=openstack/nova.git;a=commitdiff;h=839b5e593f54dbd94f430af45e77f174329942b5", "item_ahead": null, "enqueue_time": 1380314129491, "project": "openstack/nova", "remaining_time": 902451, "id": "839b5e593f54dbd94f430af45e77f174329942b5"}], [{"failing_reasons": [], "items_behind": [], "jobs": [{"elapsed_time": 79896, "name": "tempest-docs", "url": "https://jenkins02.openstack.org/job/tempest-docs/83/", "voting": true, "remaining_time": 150587, "result": null}, {"elapsed_time": 79831, "name": "tempest-branch-tarball", "url": "https://jenkins02.openstack.org/job/tempest-branch-tarball/90/", "voting": true, "remaining_time": 92417, "result": null}], "url": "https://review.openstack.org/gitweb?p=openstack/tempest.git;a=commitdiff;h=6d4eecc3ca744a6b6d78f57b4a9177652bcab166", "item_ahead": null, "enqueue_time": 1380314162965, "project": "openstack/tempest", "remaining_time": 150587, "id": "6d4eecc3ca744a6b6d78f57b4a9177652bcab166"}], [{"failing_reasons": [], "items_behind": [], "jobs": [{"elapsed_time": null, "name": "nova-branch-tarball", "url": null, "voting": true, "remaining_time": null, "result": null}, {"elapsed_time": 72296, "name": "nova-coverage", "url": "https://jenkins01.openstack.org/job/nova-coverage/396/", "voting": true, "remaining_time": 942091, "result": null}, {"elapsed_time": 72128, "name": "nova-docs", "url": "https://jenkins02.openstack.org/job/nova-docs/328/", "voting": true, "remaining_time": 226661, "result": null}, {"elapsed_time": 10567, "name": "nova-upstream-translation-update", "url": "https://jenkins.openstack.org/job/nova-upstream-translation-update/4394/", "voting": true, "remaining_time": 139, "result": null}], "url": "https://review.openstack.org/gitweb?p=openstack/nova.git;a=commitdiff;h=a9890c554685959199cb01dfff4a989c2e410649", "item_ahead": null, "enqueue_time": 1380314170606, "project": "openstack/nova", "remaining_time": null, "id": "a9890c554685959199cb01dfff4a989c2e410649"}], [{"failing_reasons": [], "items_behind": [], "jobs": [{"elapsed_time": 58196, "name": "nova-branch-tarball", "url": "https://jenkins02.openstack.org/job/nova-branch-tarball/306/", "voting": true, "remaining_time": 162209, "result": null}, {"elapsed_time": 58156, "name": "nova-coverage", "url": "https://jenkins02.openstack.org/job/nova-coverage/308/", "voting": true, "remaining_time": 1164893, "result": null}, {"elapsed_time": 58150, "name": "nova-docs", "url": "https://jenkins02.openstack.org/job/nova-docs/329/", "voting": true, "remaining_time": 240639, "result": null}, {"elapsed_time": null, "name": "nova-upstream-translation-update", "url": null, "voting": true, "remaining_time": null, "result": null}], "url": "https://review.openstack.org/gitweb?p=openstack/nova.git;a=commitdiff;h=2d5755416c6ae52f61ec342d100cec9be6ff4539", "item_ahead": null, "enqueue_time": 1380314184610, "project": "openstack/nova", "remaining_time": null, "id": "2d5755416c6ae52f61ec342d100cec9be6ff4539"}]], "name": "openstack-dev/hacking, openstack-dev/openstack-qa, openstack-dev/pbr, openstack-infra/config, openstack-infra/gear, openstack-infra/gearman-plugin, openstack-infra/gerrit, openstack-infra/gerritbot, openstack-infra/git-review, openstack-infra/jenkins-job-builder, openstack-infra/nodepool, openstack-infra/nose-html-output, openstack-infra/publications, openstack-infra/reviewday, openstack-infra/statusbot, openstack-infra/storyboard, openstack-infra/zmq-event-publisher, openstack-infra/zuul, openstack/api-site, openstack/ceilometer, openstack/cinder, openstack/compute-api, openstack/diskimage-builder, openstack/django_openstack_auth, openstack/glance, openstack/heat, openstack/heat-cfntools, openstack/horizon, openstack/identity-api, openstack/image-api, openstack/ironic, openstack/keystone, openstack/marconi, openstack/netconn-api, openstack/neutron, openstack/nova, openstack/object-api, openstack/openstack-manuals, openstack/operations-guide, openstack/os-apply-config, openstack/os-collect-config, openstack/os-refresh-config, openstack/oslo-incubator, openstack/oslo.config, openstack/oslo.messaging, openstack/oslo.sphinx, openstack/oslo.version, openstack/python-ceilometerclient, openstack/python-cinderclient, openstack/python-glanceclient, openstack/python-heatclient, openstack/python-ironicclient, openstack/python-keystoneclient, openstack/python-marconiclient, openstack/python-neutronclient, openstack/python-novaclient, openstack/python-openstackclient, openstack/python-swiftclient, openstack/python-troveclient, openstack/requirements, openstack/swift, openstack/tempest, openstack/tripleo-image-elements, openstack/tripleo-incubator, openstack/trove, openstack/volume-api, stackforge/barbican, stackforge/billingstack, stackforge/bindep, stackforge/bufunfa, stackforge/designate, stackforge/libra, stackforge/manila, stackforge/murano-api, stackforge/murano-common, stackforge/murano-conductor, stackforge/murano-dashboard, stackforge/pecan, stackforge/pycadf, stackforge/python-designateclient, stackforge/python-manilaclient, stackforge/python-muranoclient, stackforge/python-savannaclient, stackforge/python-tuskarclient, stackforge/rally, stackforge/savanna, stackforge/savanna-dashboard, stackforge/sqlalchemy-migrate, stackforge/stackalytics, stackforge/wsme"}], "name": "post"}, {"description": "This pipeline runs jobs on projects in response to pre-release tags.", "change_queues": [{"heads": [], "name": "openstack-dev/hacking, openstack-dev/pbr, openstack-infra/gear, openstack-infra/gerritbot, openstack-infra/gerritlib, openstack-infra/git-review, openstack-infra/jeepyb, openstack-infra/jenkins-job-builder, openstack-infra/nodepool, openstack-infra/nose-html-output, openstack-infra/pypi-mirror, openstack-infra/reviewday, openstack-infra/statusbot, openstack-infra/storyboard, openstack-infra/zuul, openstack/ceilometer, openstack/cinder, openstack/diskimage-builder, openstack/django_openstack_auth, openstack/glance, openstack/heat, openstack/heat-cfntools, openstack/horizon, openstack/ironic, openstack/keystone, openstack/marconi, openstack/neutron, openstack/nova, openstack/os-apply-config, openstack/os-collect-config, openstack/os-refresh-config, openstack/oslo.config, openstack/oslo.messaging, openstack/oslo.sphinx, openstack/oslo.version, openstack/python-ceilometerclient, openstack/python-cinderclient, openstack/python-glanceclient, openstack/python-heatclient, openstack/python-keystoneclient, openstack/python-marconiclient, openstack/python-neutronclient, openstack/python-novaclient, openstack/python-openstackclient, openstack/python-swiftclient, openstack/python-troveclient, openstack/swift, openstack/tripleo-image-elements, openstack/tripleo-incubator, openstack/trove, stackforge/billingstack, stackforge/bindep, stackforge/designate, stackforge/libra, stackforge/murano-api, stackforge/murano-common, stackforge/murano-conductor, stackforge/murano-dashboard, stackforge/pecan, stackforge/pycadf, stackforge/python-designateclient, stackforge/python-muranoclient, stackforge/python-savannaclient, stackforge/rally, stackforge/savanna, stackforge/savanna-dashboard, stackforge/sqlalchemy-migrate, stackforge/stackalytics, stackforge/wsme"}], "name": "pre-release"}, {"description": "When a commit is tagged as a release, this pipeline runs jobs that publish archives and documentation.", "change_queues": [{"heads": [], "name": "openstack-dev/hacking, openstack-dev/openstack-qa, openstack-dev/pbr, openstack-infra/gear, openstack-infra/gearman-plugin, openstack-infra/gerritbot, openstack-infra/gerritlib, openstack-infra/git-review, openstack-infra/jeepyb, openstack-infra/jenkins-job-builder, openstack-infra/nodepool, openstack-infra/nose-html-output, openstack-infra/pypi-mirror, openstack-infra/reviewday, openstack-infra/statusbot, openstack-infra/storyboard, openstack-infra/zmq-event-publisher, openstack-infra/zuul, openstack/ceilometer, openstack/cinder, openstack/diskimage-builder, openstack/django_openstack_auth, openstack/glance, openstack/heat, openstack/heat-cfntools, openstack/horizon, openstack/ironic, openstack/keystone, openstack/marconi, openstack/neutron, openstack/nova, openstack/os-apply-config, openstack/os-collect-config, openstack/os-refresh-config, openstack/oslo-incubator, openstack/oslo.config, openstack/oslo.messaging, openstack/oslo.sphinx, openstack/oslo.version, openstack/python-ceilometerclient, openstack/python-cinderclient, openstack/python-glanceclient, openstack/python-heatclient, openstack/python-keystoneclient, openstack/python-marconiclient, openstack/python-neutronclient, openstack/python-novaclient, openstack/python-openstackclient, openstack/python-swiftclient, openstack/python-troveclient, openstack/swift, openstack/tripleo-image-elements, openstack/tripleo-incubator, openstack/trove, stackforge/billingstack, stackforge/bindep, stackforge/designate, stackforge/libra, stackforge/murano-api, stackforge/murano-common, stackforge/murano-conductor, stackforge/murano-dashboard, stackforge/pecan, stackforge/pycadf, stackforge/python-designateclient, stackforge/python-muranoclient, stackforge/python-savannaclient, stackforge/rally, stackforge/savanna, stackforge/savanna-dashboard, stackforge/sqlalchemy-migrate, stackforge/stackalytics, stackforge/wsme"}], "name": "release"}, {"description": "This pipeline is used for silently testing new jobs.", "change_queues": [{"heads": [], "name": ""}], "name": "silent"}, {"description": "On-demand pipeline for requesting a run against a set of jobs that are not yet gating. Leave review comment of \"check experimental\" to run jobs in this pipeline.", "change_queues": [{"heads": [], "name": "openstack-dev/devstack, openstack-dev/grenade, openstack-dev/pbr, openstack-infra/devstack-gate, openstack/cinder, openstack/glance, openstack/heat, openstack/horizon, openstack/keystone, openstack/neutron, openstack/nova, openstack/oslo-incubator, openstack/python-cinderclient, openstack/python-glanceclient, openstack/python-heatclient, openstack/python-keystoneclient, openstack/python-neutronclient, openstack/python-novaclient, openstack/swift, openstack/tempest, stackforge/sqlalchemy-migrate"}], "name": "experimental"}, {"description": "Jobs in this queue are triggered on a timer.", "change_queues": [{"heads": [], "name": "openstack-infra/gitdm, openstack-infra/zuul, openstack/ceilometer, openstack/cinder, openstack/glance, openstack/heat, openstack/horizon, openstack/keystone, openstack/neutron, openstack/nova, openstack/openstack-manuals, openstack/requirements, openstack/tempest, stackforge/savanna"}], "name": "periodic"}], "trigger_event_queue": {"length": 85}, "result_event_queue": {"length": 2}}
\ No newline at end of file
diff --git a/etc/status/public_html/styles/zuul.css b/etc/status/public_html/styles/zuul.css
new file mode 100644
index 0000000..e833f4b
--- /dev/null
+++ b/etc/status/public_html/styles/zuul.css
@@ -0,0 +1,56 @@
+.zuul-change {
+ margin-bottom: 10px;
+}
+
+.zuul-change-id {
+ float: right;
+}
+
+.zuul-job-result {
+ float: right;
+ width: 70px;
+ height: 15px;
+ margin: 2px 0 0 0;
+}
+
+.zuul-change-total-result {
+ height: 10px;
+ width: 100px;
+ margin: 5px 0 0 0;
+}
+
+.zuul-spinner,
+.zuul-spinner:hover {
+ opacity: 0;
+ transition: opacity 0.5s ease-out;
+ cursor: default;
+ pointer-events: none;
+}
+
+.zuul-spinner-on,
+.zuul-spinner-on:hover {
+ opacity: 1;
+ transition-duration: 0.2s;
+ cursor: progress;
+}
+
+.zuul-change-cell {
+ padding-left: 5px;
+}
+
+.zuul-change-job {
+ padding: 2px 8px;
+}
+
+.zuul-job-name {
+ font-size: small;
+}
+
+.zuul-non-voting-desc {
+ font-size: smaller;
+}
+
+.zuul-patchset-header {
+ font-size: small;
+ padding: 8px 12px;
+}
\ No newline at end of file
diff --git a/tests/fixtures/layout-bad-queue.yaml b/tests/fixtures/layout-bad-queue.yaml
new file mode 100644
index 0000000..3eb2051
--- /dev/null
+++ b/tests/fixtures/layout-bad-queue.yaml
@@ -0,0 +1,74 @@
+pipelines:
+ - name: check
+ manager: IndependentPipelineManager
+ trigger:
+ gerrit:
+ - event: patchset-created
+ success:
+ gerrit:
+ verified: 1
+ failure:
+ gerrit:
+ verified: -1
+
+ - name: post
+ manager: IndependentPipelineManager
+ trigger:
+ gerrit:
+ - event: ref-updated
+ ref: ^(?!refs/).*$
+
+ - name: gate
+ manager: DependentPipelineManager
+ failure-message: Build failed. For information on how to proceed, see http://wiki.example.org/Test_Failures
+ trigger:
+ gerrit:
+ - event: comment-added
+ approval:
+ - approved: 1
+ success:
+ gerrit:
+ verified: 2
+ submit: true
+ failure:
+ gerrit:
+ verified: -2
+ start:
+ gerrit:
+ verified: 0
+ precedence: high
+
+jobs:
+ - name: project1-project2-integration
+ queue-name: integration
+ - name: project1-test1
+ queue-name: not_integration
+
+projects:
+ - name: org/project1
+ check:
+ - project1-merge:
+ - project1-test1
+ - project1-test2
+ - project1-project2-integration
+ gate:
+ - project1-merge:
+ - project1-test1
+ - project1-test2
+ - project1-project2-integration
+ post:
+ - project1-post
+
+ - name: org/project2
+ check:
+ - project2-merge:
+ - project2-test1
+ - project2-test2
+ - project1-project2-integration
+ gate:
+ - project2-merge:
+ - project2-test1
+ - project2-test2
+ - project1-project2-integration
+ post:
+ - project2-post
diff --git a/tests/fixtures/layout-current-patchset.yaml b/tests/fixtures/layout-current-patchset.yaml
new file mode 100644
index 0000000..dc8f768
--- /dev/null
+++ b/tests/fixtures/layout-current-patchset.yaml
@@ -0,0 +1,24 @@
+includes:
+ - python-file: custom_functions.py
+
+pipelines:
+ - name: check
+ manager: IndependentPipelineManager
+ require:
+ current-patchset: True
+ trigger:
+ gerrit:
+ - event: patchset-created
+ - event: comment-added
+ success:
+ gerrit:
+ verified: 1
+ failure:
+ gerrit:
+ verified: -1
+
+projects:
+ - name: org/project
+ merge-mode: cherry-pick
+ check:
+ - project-check
diff --git a/tests/fixtures/layout-pipeline-requirements.yaml b/tests/fixtures/layout-pipeline-requirements.yaml
new file mode 100644
index 0000000..1826d88
--- /dev/null
+++ b/tests/fixtures/layout-pipeline-requirements.yaml
@@ -0,0 +1,59 @@
+includes:
+ - python-file: custom_functions.py
+
+pipelines:
+ - name: check
+ manager: IndependentPipelineManager
+ require:
+ approval:
+ - email-filter: jenkins@example.com
+ older-than: 48h
+ open: True
+ trigger:
+ gerrit:
+ - event: patchset-created
+ - event: comment-added
+ success:
+ gerrit:
+ verified: 1
+ failure:
+ gerrit:
+ verified: -1
+
+ - name: gate
+ manager: DependentPipelineManager
+ failure-message: Build failed. For information on how to proceed, see http://wiki.example.org/Test_Failures
+ require:
+ status:
+ - NEW
+ approval:
+ - verified: 1
+ username: jenkins
+ newer-than: 48h
+ trigger:
+ gerrit:
+ - event: comment-added
+ approval:
+ - approved: 1
+ - event: comment-added
+ approval:
+ - verified: 1
+ success:
+ gerrit:
+ verified: 2
+ submit: true
+ failure:
+ gerrit:
+ verified: -2
+ start:
+ gerrit:
+ verified: 0
+ precedence: high
+
+projects:
+ - name: org/project
+ merge-mode: cherry-pick
+ check:
+ - project-check
+ gate:
+ - project-gate
diff --git a/tests/fixtures/layout.yaml b/tests/fixtures/layout.yaml
index b02c782..cc4d34c 100644
--- a/tests/fixtures/layout.yaml
+++ b/tests/fixtures/layout.yaml
@@ -93,6 +93,16 @@
gerrit:
verified: 0
+ - name: experimental
+ manager: IndependentPipelineManager
+ trigger:
+ gerrit:
+ - event: patchset-created
+ success:
+ gerrit: {}
+ failure:
+ gerrit: {}
+
jobs:
- name: ^.*-merge$
failure-message: Unable to merge change
@@ -104,6 +114,8 @@
- '.*-requires'
- name: node-project-test1
parameter-function: select_debian_node
+ - name: project1-project2-integration
+ queue-name: integration
project-templates:
- name: test-one-and-two
@@ -230,3 +242,7 @@
- name: org/noop-project
gate:
- noop
+
+ - name: org/experimental-project
+ experimental:
+ - experimental-project-test
diff --git a/tests/test_scheduler.py b/tests/test_scheduler.py
index d060b00..458fe09 100755
--- a/tests/test_scheduler.py
+++ b/tests/test_scheduler.py
@@ -118,7 +118,7 @@
'id': 'I' + random_sha1(),
'lastUpdated': time.time(),
'number': str(number),
- 'open': True,
+ 'open': status == 'NEW',
'owner': {'email': 'user@example.com',
'name': 'User Name',
'username': 'username'},
@@ -132,6 +132,7 @@
self.upstream_root = upstream_root
self.addPatchset()
self.data['submitRecords'] = self.getSubmitRecords()
+ self.open = True
def add_fake_change_to_repo(self, msg, fn, large):
path = os.path.join(self.upstream_root, self.project)
@@ -221,6 +222,23 @@
"reason": ""}
return event
+ def getChangeCommentEvent(self, patchset):
+ event = {"type": "comment-added",
+ "change": {"project": self.project,
+ "branch": self.branch,
+ "id": "I5459869c07352a31bfb1e7a8cac379cabfcb25af",
+ "number": str(self.number),
+ "subject": self.subject,
+ "owner": {"name": "User Name"},
+ "url": "https://hostname/3"},
+ "patchSet": self.patchsets[patchset - 1],
+ "author": {"name": "User Name"},
+ "approvals": [{"type": "Code-Review",
+ "description": "Code-Review",
+ "value": "0"}],
+ "comment": "This is a comment"}
+ return event
+
def addApproval(self, category, value, username='jenkins',
granted_on=None):
if not granted_on:
@@ -345,10 +363,11 @@
self.change_number = 0
self.changes = {}
- def addFakeChange(self, project, branch, subject):
+ def addFakeChange(self, project, branch, subject, status='NEW'):
self.change_number += 1
c = FakeChange(self, self.change_number, project, branch, subject,
- upstream_root=self.upstream_root)
+ upstream_root=self.upstream_root,
+ status=status)
self.changes[self.change_number] = c
return c
@@ -811,6 +830,7 @@
self.init_repo("org/node-project")
self.init_repo("org/conflict-project")
self.init_repo("org/noop-project")
+ self.init_repo("org/experimental-project")
self.statsd = FakeStatsd()
os.environ['STATSD_HOST'] = 'localhost'
@@ -1125,7 +1145,7 @@
raise Exception("Timeout waiting for Zuul to settle")
# Make sure no new events show up while we're checking
self.worker.lock.acquire()
- # have all build states propogated to zuul?
+ # have all build states propagated to zuul?
if self.haveAllBuildsReported():
# Join ensures that the queue is empty _and_ events have been
# processed
@@ -1812,6 +1832,31 @@
self.assertTrue(trigger.canMerge(a, mgr.getSubmitAllowNeeds()))
trigger.maintainCache([])
+ def test_pipeline_requirements_closed_change(self):
+ "Test that pipeline requirements for closed changes are effective"
+ self.config.set('zuul', 'layout_config',
+ 'tests/fixtures/layout-pipeline-requirements.yaml')
+ self.sched.reconfigure(self.config)
+
+ A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A',
+ status='MERGED')
+ self.fake_gerrit.addEvent(A.addApproval('CRVW', 2))
+ self.waitUntilSettled()
+ self.assertEqual(len(self.history), 0)
+ self.assertEqual(len(self.builds), 0)
+
+ B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B',
+ status='MERGED')
+ B.addApproval('CRVW', 2)
+ B.addApproval('VRFY', 1)
+ self.fake_gerrit.addEvent(B.addApproval('APRV', 1))
+ self.waitUntilSettled()
+ self.assertEqual(len(self.history), 0)
+ self.assertEqual(len(self.builds), 0)
+
+ for pipeline in self.sched.layout.pipelines.values():
+ pipeline.trigger.maintainCache([])
+
def test_build_configuration(self):
"Test that zuul merges the right commits for testing"
@@ -2774,13 +2819,23 @@
self.assertEqual(D.data['status'], 'MERGED')
self.assertEqual(D.reported, 2)
+ def test_pipeline_requirements_approval_check_and_gate(self):
+ "Test pipeline requirements triggers both check and gate"
+ self.config.set('zuul', 'layout_config',
+ 'tests/fixtures/layout-pipeline-requirements.yaml')
+ self.sched.reconfigure(self.config)
+ self.registerJobs()
+ self._test_required_approval_check_and_gate()
+
def test_required_approval_check_and_gate(self):
"Test required-approval triggers both check and gate"
self.config.set('zuul', 'layout_config',
'tests/fixtures/layout-require-approval.yaml')
self.sched.reconfigure(self.config)
self.registerJobs()
+ self._test_required_approval_check_and_gate()
+ def _test_required_approval_check_and_gate(self):
A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
A.addApproval('CRVW', 2)
# Add a too-old +1
@@ -2801,12 +2856,27 @@
self.assertEqual(len(self.history), 2)
self.assertEqual(self.history[1].name, 'project-gate')
+ def test_pipeline_requirements_approval_newer(self):
+ "Test pipeline requirements newer trigger parameter"
+ self.config.set('zuul', 'layout_config',
+ 'tests/fixtures/layout-pipeline-requirements.yaml')
+ self.sched.reconfigure(self.config)
+ self.registerJobs()
+ self._test_required_approval_newer()
+
def test_required_approval_newer(self):
"Test required-approval newer trigger parameter"
self.config.set('zuul', 'layout_config',
'tests/fixtures/layout-require-approval.yaml')
self.sched.reconfigure(self.config)
self.registerJobs()
+ self._test_required_approval_newer()
+
+ def _test_required_approval_newer(self):
+ self.config.set('zuul', 'layout_config',
+ 'tests/fixtures/layout-require-approval.yaml')
+ self.sched.reconfigure(self.config)
+ self.registerJobs()
A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
A.addApproval('CRVW', 2)
@@ -2830,12 +2900,27 @@
self.assertEqual(len(self.history), 2)
self.assertEqual(self.history[1].name, 'project-gate')
+ def test_pipeline_requirements_approval_older(self):
+ "Test pipeline requirements older trigger parameter"
+ self.config.set('zuul', 'layout_config',
+ 'tests/fixtures/layout-pipeline-requirements.yaml')
+ self.sched.reconfigure(self.config)
+ self.registerJobs()
+ self._test_required_approval_older()
+
def test_required_approval_older(self):
"Test required-approval older trigger parameter"
self.config.set('zuul', 'layout_config',
'tests/fixtures/layout-require-approval.yaml')
self.sched.reconfigure(self.config)
self.registerJobs()
+ self._test_required_approval_older()
+
+ def _test_required_approval_older(self):
+ self.config.set('zuul', 'layout_config',
+ 'tests/fixtures/layout-require-approval.yaml')
+ self.sched.reconfigure(self.config)
+ self.registerJobs()
A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
crvw = A.addApproval('CRVW', 2)
@@ -2884,10 +2969,10 @@
statsd = extras.try_import('statsd.statsd')
statsd.incr('test-incr')
statsd.timing('test-timing', 3)
- statsd.gauge('test-guage', 12)
+ statsd.gauge('test-gauge', 12)
self.assertReportedStat('test-incr', '1|c')
self.assertReportedStat('test-timing', '3|ms')
- self.assertReportedStat('test-guage', '12|g')
+ self.assertReportedStat('test-gauge', '12|g')
def test_stuck_job_cleanup(self):
"Test that pending jobs are cleaned up if removed from layout"
@@ -2963,6 +3048,21 @@
self.assertTrue(re.search("project-test2.*SUCCESS", desc))
self.assertTrue(re.search("Reported result.*SUCCESS", desc))
+ def test_queue_names(self):
+ "Test shared change queue names"
+ project1 = self.sched.layout.projects['org/project1']
+ project2 = self.sched.layout.projects['org/project2']
+ q1 = self.sched.layout.pipelines['gate'].getQueue(project1)
+ q2 = self.sched.layout.pipelines['gate'].getQueue(project2)
+ self.assertEqual(q1.name, 'integration')
+ self.assertEqual(q2.name, 'integration')
+
+ self.config.set('zuul', 'layout_config',
+ 'tests/fixtures/layout-bad-queue.yaml')
+ with testtools.ExpectedException(
+ Exception, "More than one name assigned to change queue"):
+ self.sched.reconfigure(self.config)
+
def test_queue_precedence(self):
"Test that queue precedence works"
@@ -3979,3 +4079,47 @@
running_items = client.get_running_jobs()
self.assertEqual(0, len(running_items))
+
+ def test_nonvoting_pipeline(self):
+ "Test that a nonvoting pipeline (experimental) can still report"
+
+ A = self.fake_gerrit.addFakeChange('org/experimental-project',
+ 'master', 'A')
+ self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+ self.assertEqual(
+ self.getJobFromHistory('experimental-project-test').result,
+ 'SUCCESS')
+ self.assertEqual(A.reported, 1)
+
+ def test_old_patchset_doesnt_trigger(self):
+ "Test that jobs never run against old patchsets"
+ self.config.set('zuul', 'layout_config',
+ 'tests/fixtures/layout-current-patchset.yaml')
+ self.sched.reconfigure(self.config)
+ self.registerJobs()
+ # Create two patchsets and let their tests settle out. Then
+ # comment on first patchset and check that no additional
+ # jobs are run.
+ A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
+ # Added because the layout file really wants an approval but this
+ # doesn't match anyways.
+ self.fake_gerrit.addEvent(A.addApproval('CRVW', 1))
+ self.waitUntilSettled()
+ A.addPatchset()
+ self.fake_gerrit.addEvent(A.addApproval('CRVW', 1))
+ self.waitUntilSettled()
+
+ old_history_count = len(self.history)
+ self.assertEqual(old_history_count, 2) # one job for each ps
+ self.fake_gerrit.addEvent(A.getChangeCommentEvent(1))
+ self.waitUntilSettled()
+
+ # Assert no new jobs ran after event for old patchset.
+ self.assertEqual(len(self.history), old_history_count)
+
+ # The last thing we did was add an event for a change then do
+ # nothing with a pipeline, so it will be in the cache;
+ # clean it up so it does not fail the test.
+ for pipeline in self.sched.layout.pipelines.values():
+ pipeline.trigger.maintainCache([])
diff --git a/tests/test_stack_dump.py b/tests/test_stack_dump.py
index cc8cf8f..824e04c 100644
--- a/tests/test_stack_dump.py
+++ b/tests/test_stack_dump.py
@@ -17,7 +17,7 @@
import signal
import testtools
-import zuul.cmd.server
+import zuul.cmd
class TestStackDump(testtools.TestCase):
@@ -29,6 +29,6 @@
def test_stack_dump_logs(self):
"Test that stack dumps end up in logs."
- zuul.cmd.server.stack_dump_handler(signal.SIGUSR2, None)
+ zuul.cmd.stack_dump_handler(signal.SIGUSR2, None)
self.assertIn("Thread", self.log_fixture.output)
self.assertIn("test_stack_dump_logs", self.log_fixture.output)
diff --git a/zuul/cmd/__init__.py b/zuul/cmd/__init__.py
index e69de29..e17ad5b 100644
--- a/zuul/cmd/__init__.py
+++ b/zuul/cmd/__init__.py
@@ -0,0 +1,73 @@
+#!/usr/bin/env python
+# Copyright 2012 Hewlett-Packard Development Company, L.P.
+# Copyright 2013 OpenStack Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+import ConfigParser
+import logging
+import logging.config
+import os
+import signal
+import sys
+import traceback
+
+# No zuul imports here because they pull in paramiko which must not be
+# imported until after the daemonization.
+# https://github.com/paramiko/paramiko/issues/59
+# Similar situation with gear and statsd.
+
+
+def stack_dump_handler(signum, frame):
+ signal.signal(signal.SIGUSR2, signal.SIG_IGN)
+ log_str = ""
+ for thread_id, stack_frame in sys._current_frames().items():
+ log_str += "Thread: %s\n" % thread_id
+ log_str += "".join(traceback.format_stack(stack_frame))
+ log = logging.getLogger("zuul.stack_dump")
+ log.debug(log_str)
+ signal.signal(signal.SIGUSR2, stack_dump_handler)
+
+
+class ZuulApp(object):
+
+ def __init__(self):
+ self.args = None
+ self.config = None
+
+ def _get_version(self):
+ from zuul.version import version_info as zuul_version_info
+ return "Zuul version: %s" % zuul_version_info.version_string()
+
+ def read_config(self):
+ self.config = ConfigParser.ConfigParser()
+ if self.args.config:
+ locations = [self.args.config]
+ else:
+ locations = ['/etc/zuul/zuul.conf',
+ '~/zuul.conf']
+ for fp in locations:
+ if os.path.exists(os.path.expanduser(fp)):
+ self.config.read(os.path.expanduser(fp))
+ return
+ raise Exception("Unable to locate config file in %s" % locations)
+
+ def setup_logging(self, section, parameter):
+ if self.config.has_option(section, parameter):
+ fp = os.path.expanduser(self.config.get(section, parameter))
+ if not os.path.exists(fp):
+ raise Exception("Unable to read logging config file at %s" %
+ fp)
+ logging.config.fileConfig(fp)
+ else:
+ logging.basicConfig(level=logging.DEBUG)
diff --git a/zuul/cmd/client.py b/zuul/cmd/client.py
index 147fade..766a4ef 100644
--- a/zuul/cmd/client.py
+++ b/zuul/cmd/client.py
@@ -16,26 +16,20 @@
import argparse
import babel.dates
-import ConfigParser
import datetime
import logging
-import logging.config
-import os
import prettytable
import sys
import time
+
import zuul.rpcclient
+import zuul.cmd
-class Client(object):
+class Client(zuul.cmd.ZuulApp):
log = logging.getLogger("zuul.Client")
- def __init__(self):
- self.args = None
- self.config = None
- self.gear_server_pid = None
-
def parse_arguments(self):
parser = argparse.ArgumentParser(
description='Zuul Project Gating System Client.')
@@ -89,24 +83,8 @@
self.args = parser.parse_args()
- def _get_version(self):
- from zuul.version import version_info as zuul_version_info
- return "Zuul version: %s" % zuul_version_info.version_string()
-
- def read_config(self):
- self.config = ConfigParser.ConfigParser()
- if self.args.config:
- locations = [self.args.config]
- else:
- locations = ['/etc/zuul/zuul.conf',
- '~/zuul.conf']
- for fp in locations:
- if os.path.exists(os.path.expanduser(fp)):
- self.config.read(os.path.expanduser(fp))
- return
- raise Exception("Unable to locate config file in %s" % locations)
-
def setup_logging(self):
+ """Client logging does not rely on conf file"""
if self.args.verbose:
logging.basicConfig(level=logging.DEBUG)
diff --git a/zuul/cmd/merger.py b/zuul/cmd/merger.py
index edf8da9..dc3484a 100644
--- a/zuul/cmd/merger.py
+++ b/zuul/cmd/merger.py
@@ -15,7 +15,6 @@
# under the License.
import argparse
-import ConfigParser
import daemon
import extras
@@ -23,12 +22,11 @@
# instead it depends on lockfile-0.9.1 which uses pidfile.
pid_file_module = extras.try_imports(['daemon.pidlockfile', 'daemon.pidfile'])
-import logging
-import logging.config
import os
import sys
import signal
-import traceback
+
+import zuul.cmd
# No zuul imports here because they pull in paramiko which must not be
# imported until after the daemonization.
@@ -36,21 +34,7 @@
# Similar situation with gear and statsd.
-def stack_dump_handler(signum, frame):
- signal.signal(signal.SIGUSR2, signal.SIG_IGN)
- log_str = ""
- for thread_id, stack_frame in sys._current_frames().items():
- log_str += "Thread: %s\n" % thread_id
- log_str += "".join(traceback.format_stack(stack_frame))
- log = logging.getLogger("zuul.stack_dump")
- log.debug(log_str)
- signal.signal(signal.SIGUSR2, stack_dump_handler)
-
-
-class Merger(object):
- def __init__(self):
- self.args = None
- self.config = None
+class Merger(zuul.cmd.ZuulApp):
def parse_arguments(self):
parser = argparse.ArgumentParser(description='Zuul merge worker.')
@@ -58,33 +42,11 @@
help='specify the config file')
parser.add_argument('-d', dest='nodaemon', action='store_true',
help='do not run as a daemon')
- parser.add_argument('--version', dest='version', action='store_true',
+ parser.add_argument('--version', dest='version', action='version',
+ version=self._get_version(),
help='show zuul version')
self.args = parser.parse_args()
- def read_config(self):
- self.config = ConfigParser.ConfigParser()
- if self.args.config:
- locations = [self.args.config]
- else:
- locations = ['/etc/zuul/zuul.conf',
- '~/zuul.conf']
- for fp in locations:
- if os.path.exists(os.path.expanduser(fp)):
- self.config.read(os.path.expanduser(fp))
- return
- raise Exception("Unable to locate config file in %s" % locations)
-
- def setup_logging(self, section, parameter):
- if self.config.has_option(section, parameter):
- fp = os.path.expanduser(self.config.get(section, parameter))
- if not os.path.exists(fp):
- raise Exception("Unable to read logging config file at %s" %
- fp)
- logging.config.fileConfig(fp)
- else:
- logging.basicConfig(level=logging.DEBUG)
-
def exit_handler(self, signum, frame):
signal.signal(signal.SIGUSR1, signal.SIG_IGN)
self.merger.stop()
@@ -100,7 +62,7 @@
self.merger.start()
signal.signal(signal.SIGUSR1, self.exit_handler)
- signal.signal(signal.SIGUSR2, stack_dump_handler)
+ signal.signal(signal.SIGUSR2, zuul.cmd.stack_dump_handler)
while True:
try:
signal.pause()
@@ -113,11 +75,6 @@
server = Merger()
server.parse_arguments()
- if server.args.version:
- from zuul.version import version_info as zuul_version_info
- print "Zuul version: %s" % zuul_version_info.version_string()
- sys.exit(0)
-
server.read_config()
if server.config.has_option('zuul', 'state_dir'):
diff --git a/zuul/cmd/server.py b/zuul/cmd/server.py
index 8caa1fd..06ea780 100755
--- a/zuul/cmd/server.py
+++ b/zuul/cmd/server.py
@@ -15,7 +15,6 @@
# under the License.
import argparse
-import ConfigParser
import daemon
import extras
@@ -24,11 +23,11 @@
pid_file_module = extras.try_imports(['daemon.pidlockfile', 'daemon.pidfile'])
import logging
-import logging.config
import os
import sys
import signal
-import traceback
+
+import zuul.cmd
# No zuul imports here because they pull in paramiko which must not be
# imported until after the daemonization.
@@ -36,21 +35,9 @@
# Similar situation with gear and statsd.
-def stack_dump_handler(signum, frame):
- signal.signal(signal.SIGUSR2, signal.SIG_IGN)
- log_str = ""
- for thread_id, stack_frame in sys._current_frames().items():
- log_str += "Thread: %s\n" % thread_id
- log_str += "".join(traceback.format_stack(stack_frame))
- log = logging.getLogger("zuul.stack_dump")
- log.debug(log_str)
- signal.signal(signal.SIGUSR2, stack_dump_handler)
-
-
-class Server(object):
+class Server(zuul.cmd.ZuulApp):
def __init__(self):
- self.args = None
- self.config = None
+ super(Server, self).__init__()
self.gear_server_pid = None
def parse_arguments(self):
@@ -71,33 +58,6 @@
help='show zuul version')
self.args = parser.parse_args()
- def _get_version(self):
- from zuul.version import version_info as zuul_version_info
- return "Zuul version: %s" % zuul_version_info.version_string()
-
- def read_config(self):
- self.config = ConfigParser.ConfigParser()
- if self.args.config:
- locations = [self.args.config]
- else:
- locations = ['/etc/zuul/zuul.conf',
- '~/zuul.conf']
- for fp in locations:
- if os.path.exists(os.path.expanduser(fp)):
- self.config.read(os.path.expanduser(fp))
- return
- raise Exception("Unable to locate config file in %s" % locations)
-
- def setup_logging(self, section, parameter):
- if self.config.has_option(section, parameter):
- fp = os.path.expanduser(self.config.get(section, parameter))
- if not os.path.exists(fp):
- raise Exception("Unable to read logging config file at %s" %
- fp)
- logging.config.fileConfig(fp)
- else:
- logging.basicConfig(level=logging.DEBUG)
-
def reconfigure_handler(self, signum, frame):
signal.signal(signal.SIGHUP, signal.SIG_IGN)
self.read_config()
@@ -235,7 +195,7 @@
signal.signal(signal.SIGHUP, self.reconfigure_handler)
signal.signal(signal.SIGUSR1, self.exit_handler)
- signal.signal(signal.SIGUSR2, stack_dump_handler)
+ signal.signal(signal.SIGUSR2, zuul.cmd.stack_dump_handler)
signal.signal(signal.SIGTERM, self.term_handler)
while True:
try:
diff --git a/zuul/layoutvalidator.py b/zuul/layoutvalidator.py
index 15aa687..9a448a3 100644
--- a/zuul/layoutvalidator.py
+++ b/zuul/layoutvalidator.py
@@ -68,6 +68,12 @@
'subject': str,
},
}
+
+ require = {'approval': toList(require_approval),
+ 'open': bool,
+ 'current-patchset': bool,
+ 'status': toList(str)}
+
window = v.All(int, v.Range(min=0))
window_floor = v.All(int, v.Range(min=1))
window_type = v.Any('linear', 'exponential')
@@ -77,6 +83,7 @@
v.Required('manager'): manager,
'precedence': precedence,
'description': str,
+ 'require': require,
'success-message': str,
'failure-message': str,
'merge-failure-message': str,
@@ -108,6 +115,7 @@
}
job = {v.Required('name'): str,
+ 'queue-name': str,
'failure-message': str,
'success-message': str,
'failure-pattern': str,
diff --git a/zuul/model.py b/zuul/model.py
index 2f4110f..1d103a7 100644
--- a/zuul/model.py
+++ b/zuul/model.py
@@ -57,6 +57,11 @@
raise Exception("Unable to parse time value: %s" % s)
+def normalizeCategory(name):
+ name = name.lower()
+ return re.sub(' ', '-', name)
+
+
class Pipeline(object):
"""A top-level pipeline such as check, gate, post, etc."""
def __init__(self, name):
@@ -240,17 +245,6 @@
items.extend(shared_queue.queue)
return items
- def formatStatusHTML(self):
- ret = ''
- for queue in self.queues:
- if len(self.queues) > 1:
- s = 'Change queue: %s' % queue.name
- ret += s + '\n'
- ret += '-' * len(s) + '\n'
- for item in queue.queue:
- ret += self.formatStatus(item, html=True)
- return ret
-
def formatStatusJSON(self):
j_pipeline = dict(name=self.name,
description=self.description)
@@ -282,7 +276,7 @@
class ActionReporter(object):
- """An ActionReporter has a reporter and its configured paramaters"""
+ """An ActionReporter has a reporter and its configured parameters"""
def __repr__(self):
return '<ActionReporter %s, %s>' % (self.reporter, self.params)
@@ -314,6 +308,8 @@
window_decrease_type='exponential', window_decrease_factor=2):
self.pipeline = pipeline
self.name = ''
+ self.assigned_name = None
+ self.generated_name = None
self.projects = []
self._jobs = set()
self.queue = []
@@ -334,10 +330,21 @@
def addProject(self, project):
if project not in self.projects:
self.projects.append(project)
+ self._jobs |= set(self.pipeline.getJobTree(project).getJobs())
+
names = [x.name for x in self.projects]
names.sort()
- self.name = ', '.join(names)
- self._jobs |= set(self.pipeline.getJobTree(project).getJobs())
+ self.generated_name = ', '.join(names)
+
+ for job in self._jobs:
+ if job.queue_name:
+ if (self.assigned_name and
+ job.queue_name != self.assigned_name):
+ raise Exception("More than one name assigned to "
+ "change queue: %s != %s" %
+ (self.assigned_name, job.queue_name))
+ self.assigned_name = job.queue_name
+ self.name = self.assigned_name or self.generated_name
def enqueueChange(self, change):
item = QueueItem(self.pipeline, change)
@@ -431,6 +438,7 @@
def __init__(self, name):
# If you add attributes here, be sure to add them to the copy method.
self.name = name
+ self.queue_name = None
self.failure_message = None
self.success_message = None
self.failure_pattern = None
@@ -830,6 +838,8 @@
self.is_merged = False
self.failed_to_merge = False
self.approvals = []
+ self.open = None
+ self.status = None
def _id(self):
return '%s,%s' % (self.number, self.patchset)
@@ -1022,10 +1032,6 @@
return ret
def matches(self, event, change):
- def normalizeCategory(name):
- name = name.lower()
- return re.sub(' ', '-', name)
-
# event types are ORed
matches_type = False
for etype in self.types:
@@ -1140,6 +1146,90 @@
return True
+class ChangeishFilter(object):
+ def __init__(self, open=None, current_patchset=None,
+ statuses=[], approvals=[]):
+ self.open = open
+ self.current_patchset = current_patchset
+ self.statuses = statuses
+ self.approvals = approvals
+
+ for a in self.approvals:
+ if 'older-than' in a:
+ a['older-than'] = time_to_seconds(a['older-than'])
+ if 'newer-than' in a:
+ a['newer-than'] = time_to_seconds(a['newer-than'])
+ if 'email-filter' in a:
+ a['email-filter'] = re.compile(a['email-filter'])
+
+ def __repr__(self):
+ ret = '<ChangeishFilter'
+
+ if self.open is not None:
+ ret += ' open: %s' % self.open
+ if self.current_patchset is not None:
+ ret += ' current-patchset: %s' % self.current_patchset
+ if self.statuses:
+ ret += ' statuses: %s' % ', '.join(self.statuses)
+ if self.approvals:
+ ret += ' approvals: %s' % str(self.approvals)
+ ret += '>'
+
+ return ret
+
+ def matches(self, change):
+ if self.open is not None:
+ if self.open != change.open:
+ return False
+
+ if self.current_patchset is not None:
+ if self.current_patchset != change.is_current_patchset:
+ return False
+
+ if self.statuses:
+ if change.status not in self.statuses:
+ return False
+
+ if self.approvals and not change.approvals:
+ # A change with no approvals can not match
+ return False
+
+ now = time.time()
+ for rapproval in self.approvals:
+ matches_approval = False
+ for approval in change.approvals:
+ if 'description' not in approval:
+ continue
+ found_approval = True
+ by = approval.get('by', {})
+ for k, v in rapproval.items():
+ if k == 'username':
+ if (by.get('username', '') != v):
+ found_approval = False
+ elif k == 'email-filter':
+ if (not v.search(by.get('email', ''))):
+ found_approval = False
+ elif k == 'newer-than':
+ t = now - v
+ if (approval['grantedOn'] < t):
+ found_approval = False
+ elif k == 'older-than':
+ t = now - v
+ if (approval['grantedOn'] >= t):
+ found_approval = False
+ else:
+ if (normalizeCategory(approval['description']) != k or
+ int(approval['value']) != v):
+ found_approval = False
+ if found_approval:
+ matches_approval = True
+ break
+ if not matches_approval:
+ return False
+
+ return True
+
+
class Layout(object):
def __init__(self):
self.projects = {}
diff --git a/zuul/reporter/gerrit.py b/zuul/reporter/gerrit.py
index cceacca..7c4774b 100644
--- a/zuul/reporter/gerrit.py
+++ b/zuul/reporter/gerrit.py
@@ -30,10 +30,6 @@
"""Send a message to gerrit."""
self.log.debug("Report change %s, params %s, message: %s" %
(change, params, message))
- if not params:
- self.log.debug("Not reporting change %s: No params specified." %
- change)
- return
changeid = '%s,%s' % (change.number, change.patchset)
change._ref_sha = self.trigger.getRefSha(change.project.name,
'refs/heads/' + change.branch)
diff --git a/zuul/scheduler.py b/zuul/scheduler.py
index f5d6629..922d815 100644
--- a/zuul/scheduler.py
+++ b/zuul/scheduler.py
@@ -29,7 +29,8 @@
import layoutvalidator
import model
-from model import ActionReporter, Pipeline, Project, ChangeQueue, EventFilter
+from model import ActionReporter, Pipeline, Project, ChangeQueue
+from model import EventFilter, ChangeishFilter
from zuul import version as zuul_version
statsd = extras.try_import('statsd.statsd')
@@ -273,6 +274,15 @@
pipeline.setManager(manager)
layout.pipelines[conf_pipeline['name']] = pipeline
+ if 'require' in conf_pipeline:
+ require = conf_pipeline['require']
+ f = ChangeishFilter(
+ open=require.get('open'),
+ current_patchset=require.get('current-patchset'),
+ statuses=toList(require.get('status')),
+ approvals=toList(require.get('approval')))
+ manager.changeish_filters.append(f)
+
# TODO: move this into triggers (may require pluggable
# configuration)
if 'gerrit' in conf_pipeline['trigger']:
@@ -315,6 +325,9 @@
job = layout.getJob(config_job['name'])
# Be careful to only set attributes explicitly present on
# this job, to avoid squashing attributes set by a meta-job.
+ m = config_job.get('queue-name', None)
+ if m:
+ job.queue_name = m
m = config_job.get('failure-message', None)
if m:
job.failure_message = m
@@ -838,29 +851,6 @@
return
pipeline.manager.onMergeCompleted(event)
- def formatStatusHTML(self):
- ret = '<html><pre>'
- if self._pause:
- ret += '<p><b>Queue only mode:</b> preparing to '
- if self._exit:
- ret += 'exit'
- ret += ', queue length: %s' % self.trigger_event_queue.qsize()
- ret += '</p>'
-
- if self.last_reconfigured:
- ret += '<p>Last reconfigured: %s</p>' % self.last_reconfigured
-
- keys = self.layout.pipelines.keys()
- for key in keys:
- pipeline = self.layout.pipelines[key]
- s = 'Pipeline: %s' % pipeline.name
- ret += s + '\n'
- ret += '-' * len(s) + '\n'
- ret += pipeline.formatStatusHTML()
- ret += '\n'
- ret += '</pre></html>'
- return ret
-
def formatStatusJSON(self):
data = {}
@@ -900,6 +890,7 @@
self.sched = sched
self.pipeline = pipeline
self.event_filters = []
+ self.changeish_filters = []
if self.sched.config and self.sched.config.has_option(
'zuul', 'report_times'):
self.report_times = self.sched.config.getboolean(
@@ -912,6 +903,9 @@
def _postConfig(self, layout):
self.log.info("Configured Pipeline Manager %s" % self.pipeline.name)
+ self.log.info(" Requirements:")
+ for f in self.changeish_filters:
+ self.log.info(" %s" % f)
self.log.info(" Events:")
for e in self.event_filters:
self.log.info(" %s" % e)
@@ -1081,6 +1075,12 @@
change)
return False
+ for f in self.changeish_filters:
+ if not f.matches(change):
+ self.log.debug("Change %s does not match pipeline "
+ "requirements" % change)
+ return False
+
if not self.enqueueChangesAhead(change, quiet):
self.log.debug("Failed to enqueue changes ahead of %s" % change)
return False
@@ -1114,7 +1114,7 @@
def removeChange(self, change):
# Remove a change from the queue, probably because it has been
- # superceded by another change.
+ # superseded by another change.
for item in self.pipeline.getAllItems():
if item.change == change:
self.log.debug("Canceling builds behind change: %s "
@@ -1665,7 +1665,8 @@
self.log.info(" Shared change queues:")
for queue in new_change_queues:
self.pipeline.addQueue(queue)
- self.log.info(" %s" % queue)
+ self.log.info(" %s containing %s" % (
+ queue, queue.generated_name))
def combineChangeQueues(self, change_queues):
self.log.debug("Combining shared queues")
diff --git a/zuul/trigger/gerrit.py b/zuul/trigger/gerrit.py
index dc66f97..a6eedb1 100644
--- a/zuul/trigger/gerrit.py
+++ b/zuul/trigger/gerrit.py
@@ -363,6 +363,8 @@
change.needed_by_changes.append(dep)
change.approvals = data['currentPatchSet'].get('approvals', [])
+ change.open = data['open']
+ change.status = data['status']
return change