// Copyright 2012 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. window.zuul_enable_status_updates = true; window.zuul_filter = ""; function format_time(ms, words) { if (ms == null) { return "unknown"; } var seconds = (+ms)/1000; var minutes = Math.floor((seconds/60)%60); var hours = Math.floor(minutes/60); seconds = Math.floor(seconds % 60); r = ''; if (words) { if (hours) { r += hours; r += ' hr '; } r += minutes + ' min' } else { if (hours < 10) r += '0'; r += hours + ':'; if (minutes < 10) r += '0'; r += minutes + ':'; if (seconds < 10) r += '0'; r += seconds; } return r; } function format_progress(elapsed, remaining) { if (remaining != null) { total = elapsed + remaining; } else { total = null; } r = 'in progress'; return r; } function is_hide_project(project) { var filter = window.zuul_filter; if (filter.length == 0) { return false; } return project.indexOf(filter) == -1; } function format_pipeline(data) { var html = '

'+ data['name']+'

'; if (data['description'] != null) { html += '

'+data['description']+'

'; } $.each(data['change_queues'], function(change_queue_i, change_queue) { $.each(change_queue['heads'], function(head_i, head) { var projects = ""; var hide_queue = true; $.each(head, function(change_i, change) { projects += change['project'] + "|"; hide_queue &= is_hide_project(change['project']); }); html += '
'; if (data['change_queues'].length > 1 && head_i == 0) { html += '
Change queue: '; var name = change_queue['name']; html += ''; if (name.length > 32) { name = name.substr(0,32) + '...'; } html += name + '
' } $.each(head, function(change_i, change) { if (change_i > 0) { html += '
' } html += format_change(change); }); html += '
' }); }); html += '
'; return html; } function format_change(change) { var html = '
'; html += ''+change['project']+''; var id = change['id']; var url = change['url']; if (id.length == 40) { id = id.substr(0,7); } html += ''; if (url != null) { html += ''; } html += id; if (url != null) { html += ''; } html += ''; html += format_time(change['remaining_time'], true); html += '
'; $.each(change['jobs'], function(i, job) { result = job['result']; var result_class = "result"; if (result == null) { if (job['url'] != null) { result = 'in progress'; } else { result = 'queued'; } } else if (result == 'SUCCESS') { result_class += " result_success"; } else if (result == 'FAILURE') { result_class += " result_failure"; } else if (result == 'LOST') { result_class += " result_unstable"; } else if (result == 'UNSTABLE') { result_class += " result_unstable"; } html += ''; if (job['url'] != null) { html += ''; } html += job['name']; if (job['url'] != null) { html += ''; } html += ': '; if (job['result'] == null && job['url'] != null) { html += format_progress(job['elapsed_time'], job['remaining_time']); } else { html += ''+result+''; } if (job['voting'] == false) { html += ' (non-voting)'; } html += ''; }); html += '
'; return html; } function update_timeout() { if (!window.zuul_enable_status_updates) { setTimeout(update_timeout, 5000); return; } window.zuul_graph_update_count += 1; update(); /* Only update graphs every minute */ if (window.zuul_graph_update_count > 11) { window.zuul_graph_update_count = 0; update_graphs(); } setTimeout(update_timeout, 5000); } function update() { var html = ''; $.getJSON('http://zuul.openstack.org/status.json', function(data) { if ('message' in data) { $("#message").attr('class', 'alertbox'); $("#message").html(data['message']); } else { $("#message").removeClass('alertbox'); $("#message").html(''); } html += '
'; $.each(data['pipelines'], function(i, pipeline) { html = html + format_pipeline(pipeline); }); html += '
'; $("#pipeline-container").html(html); $("#trigger_event_queue_length").html( data['trigger_event_queue']['length']); $("#result_event_queue_length").html( data['result_event_queue']['length']); }); } function update_graphs() { $('.graph').each(function(i, img) { var newimg = new Image() var parts = img.src.split('#'); newimg.src = parts[0] + '#' + new Date().getTime(); $(newimg).load(function (x) { img.src = newimg.src; }); }); } function save_filter() { var name = 'zuul-project-filter'; var value = $('#projects_filter').val().trim(); document.cookie = name+"="+value+"; path=/"; $('img.filter-saved').removeClass('hidden'); window.setTimeout(function(){ $('img.filter-saved').addClass('hidden'); }, 1500); } function read_cookie(name) { var nameEQ = name + "="; var ca = document.cookie.split(';'); for(var i=0;i < ca.length;i++) { var c = ca[i]; while (c.charAt(0)==' ') c = c.substring(1,c.length); if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length); } return null; } $(function() { window.zuul_graph_update_count = 0; update_timeout(); $(document).on({ 'show.visibility': function() { window.zuul_enable_status_updates = true; update(); update_graphs(); }, 'hide.visibility': function() { window.zuul_enable_status_updates = false; } }); $('#projects_filter').live('keyup change', function () { window.zuul_filter = $('#projects_filter').val().trim(); $.each($('div[project]'), function (idx, val) { val = $(val); var project = val.attr('project'); if (is_hide_project(project)) { val.hide(100); } else { val.show(100); } }) }).live('keyup', function () { $('a.save-filter') .removeClass('hidden') .live('click', function(e){ e.preventDefault(); $(this).addClass('hidden'); save_filter(); }); }); var cookie = read_cookie('zuul-project-filter'); if(cookie) $('#projects_filter').val(cookie).change(); });