File: //home/arjun/projects/buyercall_forms/buyercall/deploy/fixes/flower.js
var flower = (function () {
"use strict";
/*jslint browser: true */
/*jslint unparam: true, node: true */
/*global $, WebSocket, jQuery, Rickshaw */
function on_alert_close(event) {
event.preventDefault();
event.stopPropagation();
$(event.target).parent().hide();
}
function show_error_alert(message) {
$("#alert").removeClass("alert-success").addClass("alert-error");
$("#alert-message").html("<strong>Error!</strong> " + message);
$("#alert").show();
}
function show_success_alert(message) {
$("#alert").removeClass("alert-error").addClass("alert-success");
$("#alert-message").html("<strong>Success!</strong> " + message);
$("#alert").show();
}
function url_prefix() {
var url_prefix = $('#url_prefix').val();
if (url_prefix) {
if (url_prefix.startsWith('/')) {
return '/flower'+url_prefix;
} else {
return '/flower'+'/' + url_prefix;
}
}
return '/flower';
}
//https://github.com/DataTables/DataTables/blob/1.10.11/media/js/jquery.dataTables.js#L14882
function htmlEscapeEntities(d) {
return typeof d === 'string' ?
d.replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"') :
d;
}
function active_page(name) {
var pathname = $(location).attr('pathname');
if (name === '/') {
return pathname === (url_prefix() + name);
}
else {
return pathname.startsWith(url_prefix() + name);
}
}
function on_worker_refresh(event) {
event.preventDefault();
event.stopPropagation();
var workername = $('#workername').text();
$.ajax({
type: 'GET',
url: url_prefix() + '/api/workers',
dataType: 'json',
data: {
workername: unescape(workername),
refresh: 1
},
success: function (data) {
show_success_alert(data.message || 'Refreshed');
},
error: function (data) {
show_error_alert(data.responseText);
}
});
}
function on_worker_pool_restart(event) {
event.preventDefault();
event.stopPropagation();
var workername = $('#workername').text();
$.ajax({
type: 'POST',
url: url_prefix() + '/api/worker/pool/restart/' + workername,
dataType: 'json',
data: {
workername: workername
},
success: function (data) {
show_success_alert(data.message);
},
error: function (data) {
show_error_alert(data.responseText);
}
});
}
function on_worker_shutdown(event) {
event.preventDefault();
event.stopPropagation();
var workername = $('#workername').text();
$.ajax({
type: 'POST',
url: url_prefix() + '/api/worker/shutdown/' + workername,
dataType: 'json',
data: {
workername: workername
},
success: function (data) {
show_success_alert(data.message);
},
error: function (data) {
show_error_alert(data.responseText);
}
});
}
function on_pool_grow(event) {
event.preventDefault();
event.stopPropagation();
var workername = $('#workername').text(),
grow_size = $('#pool-size option:selected').html();
$.ajax({
type: 'POST',
url: url_prefix() + '/api/worker/pool/grow/' + workername,
dataType: 'json',
data: {
'workername': workername,
'n': grow_size,
},
success: function (data) {
show_success_alert(data.message);
},
error: function (data) {
show_error_alert(data.responseText);
}
});
}
function on_pool_shrink(event) {
event.preventDefault();
event.stopPropagation();
var workername = $('#workername').text(),
shrink_size = $('#pool-size option:selected').html();
$.ajax({
type: 'POST',
url: url_prefix() + '/api/worker/pool/shrink/' + workername,
dataType: 'json',
data: {
'workername': workername,
'n': shrink_size,
},
success: function (data) {
show_success_alert(data.message);
},
error: function (data) {
show_error_alert(data.responseText);
}
});
}
function on_pool_autoscale(event) {
event.preventDefault();
event.stopPropagation();
var workername = $('#workername').text(),
min = $('#min-autoscale').val(),
max = $('#max-autoscale').val();
$.ajax({
type: 'POST',
url: url_prefix() + '/api/worker/pool/autoscale/' + workername,
dataType: 'json',
data: {
'workername': workername,
'min': min,
'max': max,
},
success: function (data) {
show_success_alert(data.message);
},
error: function (data) {
show_error_alert(data.responseText);
}
});
}
function on_add_consumer(event) {
event.preventDefault();
event.stopPropagation();
var workername = $('#workername').text(),
queue = $('#add-consumer-name').val();
$.ajax({
type: 'POST',
url: url_prefix() + '/api/worker/queue/add-consumer/' + workername,
dataType: 'json',
data: {
'workername': workername,
'queue': queue,
},
success: function (data) {
show_success_alert(data.message);
setTimeout(function () {
$('#tab-queues').load('/worker/' + workername + ' #tab-queues').fadeIn('show');
}, 10000);
},
error: function (data) {
show_error_alert(data.responseText);
}
});
}
function on_cancel_consumer(event) {
event.preventDefault();
event.stopPropagation();
var workername = $('#workername').text(),
queue = $(event.target).closest("tr").children("td:eq(0)").text();
$.ajax({
type: 'POST',
url: url_prefix() + '/api/worker/queue/cancel-consumer/' + workername,
dataType: 'json',
data: {
'workername': workername,
'queue': queue,
},
success: function (data) {
show_success_alert(data.message);
setTimeout(function () {
$('#tab-queues').load('/worker/' + workername + ' #tab-queues').fadeIn('show');
}, 10000);
},
error: function (data) {
show_error_alert(data.responseText);
}
});
}
function on_task_timeout(event) {
event.preventDefault();
event.stopPropagation();
var workername = $('#workername').text(),
taskname = $(event.target).closest("tr").children("td:eq(0)").text(),
timeout = $(event.target).siblings().closest("input").val();
taskname = taskname.split(' ')[0]; // removes [rate_limit=xxx]
$.ajax({
type: 'POST',
url: url_prefix() + '/api/task/timeout/' + taskname,
dataType: 'json',
data: {
'workername': workername,
'type': timeout,
},
success: function (data) {
show_success_alert(data.message);
},
error: function (data) {
show_error_alert(data.responseText);
}
});
}
function on_task_rate_limit(event) {
event.preventDefault();
event.stopPropagation();
var workername = $('#workername').text(),
taskname = $(event.target).closest("tr").children("td:eq(0)").text(),
ratelimit = $(event.target).prev().val();
taskname = taskname.split(' ')[0]; // removes [rate_limit=xxx]
$.ajax({
type: 'POST',
url: url_prefix() + '/api/task/rate-limit/' + taskname,
dataType: 'json',
data: {
'workername': workername,
'ratelimit': ratelimit,
},
success: function (data) {
show_success_alert(data.message);
setTimeout(function () {
$('#tab-limits').load('/worker/' + workername + ' #tab-limits').fadeIn('show');
}, 10000);
},
error: function (data) {
show_error_alert(data.responseText);
}
});
}
function on_task_revoke(event) {
event.preventDefault();
event.stopPropagation();
var taskid = $('#taskid').text();
$.ajax({
type: 'POST',
url: url_prefix() + '/api/task/revoke/' + taskid,
dataType: 'json',
data: {
'terminate': false,
},
success: function (data) {
show_success_alert(data.message);
},
error: function (data) {
show_error_alert(data.responseText);
}
});
}
function on_task_terminate(event) {
event.preventDefault();
event.stopPropagation();
var taskid = $('#taskid').text();
$.ajax({
type: 'POST',
url: url_prefix() + '/api/task/revoke/' + taskid,
dataType: 'json',
data: {
'terminate': true,
},
success: function (data) {
show_success_alert(data.message);
},
error: function (data) {
show_error_alert(data.responseText);
}
});
}
function sum(a, b) {
return parseInt(a, 10) + parseInt(b, 10);
}
function update_dashboard_counters() {
var table = $('#workers-table').DataTable();
$('a#btn-active').text('Active: ' + table.column(2).data().reduce(sum, 0));
$('a#btn-processed').text('Processed: ' + table.column(3).data().reduce(sum, 0));
$('a#btn-failed').text('Failed: ' + table.column(4).data().reduce(sum, 0));
$('a#btn-succeeded').text('Succeeded: ' + table.column(5).data().reduce(sum, 0));
$('a#btn-retried').text('Retried: ' + table.column(6).data().reduce(sum, 0));
}
function on_cancel_task_filter(event) {
event.preventDefault();
event.stopPropagation();
$('#task-filter-form').each(function () {
$(this).find('SELECT').val('');
$(this).find('.datetimepicker').val('');
});
$('#task-filter-form').submit();
}
function create_graph(data, id, width, height, metric) {
id = id || '';
width = width || 500;
height = height || 300;
metric = metric || '';
var name, seriesData = [],
palette, graph, ticksTreatment, timeUnit, xAxis, yAxis, hoverDetail,
legend, shelving, order, highlighter;
for (name in data) {
if (data.hasOwnProperty(name)) {
seriesData.push({
name: name
});
}
}
palette = new Rickshaw.Color.Palette({
scheme: 'colorwheel'
});
graph = new Rickshaw.Graph({
element: document.getElementById("chart" + id),
width: width,
height: height,
renderer: 'stack',
series: new Rickshaw.Series(seriesData, palette),
maxDataPoints: 10000,
padding: {
top: 0.1,
left: 0.01,
right: 0.01,
bottom: 0.01
},
});
ticksTreatment = 'glow';
timeUnit = new Rickshaw.Fixtures.Time.Local();
timeUnit.formatTime = function (d) {
return moment(d).format("yyyy.mm.dd HH:mm:ss");
};
timeUnit.unit("minute");
xAxis = new Rickshaw.Graph.Axis.Time({
graph: graph,
timeFixture: new Rickshaw.Fixtures.Time.Local(),
ticksTreatment: ticksTreatment,
timeUnit: timeUnit
});
xAxis.render();
yAxis = new Rickshaw.Graph.Axis.Y({
graph: graph,
tickFormat: Rickshaw.Fixtures.Number.formatKMBT,
ticksTreatment: ticksTreatment,
});
yAxis.render();
hoverDetail = new Rickshaw.Graph.HoverDetail({
graph: graph,
yFormatter: function (y) {
if (y % 1 === 0) {
return y + metric;
} else {
return y.toFixed(2) + metric;
}
}
});
legend = new Rickshaw.Graph.Legend({
graph: graph,
element: document.getElementById('legend' + id)
});
shelving = new Rickshaw.Graph.Behavior.Series.Toggle({
graph: graph,
legend: legend
});
order = new Rickshaw.Graph.Behavior.Series.Order({
graph: graph,
legend: legend
});
highlighter = new Rickshaw.Graph.Behavior.Series.Highlight({
graph: graph,
legend: legend
});
legend.shelving = shelving;
graph.series.legend = legend;
graph.render();
return graph;
}
function update_graph(graph, url, lastquery) {
$.ajax({
type: 'GET',
url: url,
data: {
lastquery: lastquery
},
success: function (data) {
graph.series.addData(data);
graph.update();
},
});
}
function current_unix_time() {
var now = new Date();
return Date.UTC(now.getUTCFullYear(), now.getUTCMonth(),
now.getUTCDate(), now.getUTCHours(),
now.getUTCMinutes(), now.getUTCSeconds()) / 1000;
}
function format_time(timestamp) {
var time = $('#time').val(),
prefix = time.startsWith('natural-time') ? 'natural-time' : 'time',
tz = time.substr(prefix.length + 1) || 'UTC';
if (prefix === 'natural-time') {
return moment.unix(timestamp).tz(tz).fromNow();
}
return moment.unix(timestamp).tz(tz).format('YYYY-MM-DD HH:mm:ss.SSS');
}
function isColumnVisible(name) {
var columns = $('#columns').val();
if (columns === "all")
return true;
if (columns) {
columns = columns.split(',').map(function (e) {
return e.trim();
});
return columns.indexOf(name) !== -1;
}
return true;
}
$.urlParam = function (name) {
var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(window.location.href);
return (results && results[1]) || 0;
};
$(document).ready(function () {
//https://github.com/twitter/bootstrap/issues/1768
var shiftWindow = function () {
scrollBy(0, -50);
};
if (location.hash) {
shiftWindow();
}
window.addEventListener("hashchange", shiftWindow);
// Make bootstrap tabs persistent
$(document).ready(function () {
if (location.hash !== '') {
$('a[href="' + location.hash + '"]').tab('show');
}
$('a[data-toggle="tab"]').on('shown', function (e) {
location.hash = $(e.target).attr('href').substr(1);
});
});
if (active_page('/monitor')) {
var sts = current_unix_time(),
fts = current_unix_time(),
tts = current_unix_time(),
updateinterval = parseInt($.urlParam('updateInterval'), 10) || 3000,
succeeded_graph = null,
failed_graph = null,
time_graph = null,
broker_graph = null;
$.ajax({
type: 'GET',
url: url_prefix() + '/monitor/succeeded-tasks',
data: {
lastquery: current_unix_time()
},
success: function (data) {
succeeded_graph = create_graph(data, '-succeeded');
succeeded_graph.update();
succeeded_graph.series.setTimeInterval(updateinterval);
setInterval(function () {
update_graph(succeeded_graph,
url_prefix() + '/monitor/succeeded-tasks',
sts);
sts = current_unix_time();
}, updateinterval);
},
});
$.ajax({
type: 'GET',
url: url_prefix() + '/monitor/completion-time',
data: {
lastquery: current_unix_time()
},
success: function (data) {
time_graph = create_graph(data, '-time', null, null, 's');
time_graph.update();
time_graph.series.setTimeInterval(updateinterval);
setInterval(function () {
update_graph(time_graph,
url_prefix() + '/monitor/completion-time',
tts);
tts = current_unix_time();
}, updateinterval);
},
});
$.ajax({
type: 'GET',
url: url_prefix() + '/monitor/failed-tasks',
data: {
lastquery: current_unix_time()
},
success: function (data) {
failed_graph = create_graph(data, '-failed');
failed_graph.update();
failed_graph.series.setTimeInterval(updateinterval);
setInterval(function () {
update_graph(failed_graph,
url_prefix() + '/monitor/failed-tasks',
fts);
fts = current_unix_time();
}, updateinterval);
},
});
$.ajax({
type: 'GET',
url: url_prefix() + '/monitor/broker',
success: function (data) {
broker_graph = create_graph(data, '-broker');
broker_graph.update();
broker_graph.series.setTimeInterval(updateinterval);
setInterval(function () {
update_graph(broker_graph,
url_prefix() + '/monitor/broker');
}, updateinterval);
},
});
}
});
$(document).ready(function () {
if (!active_page('/') && !active_page('/dashboard')) {
return;
}
$('#workers-table').DataTable({
rowId: 'name',
searching: true,
paginate: false,
select: false,
scrollX: true,
scrollY: true,
scrollCollapse: true,
ajax: url_prefix() + '/dashboard?json=1',
order: [
[1, "asc"]
],
columnDefs: [{
targets: 0,
data: 'hostname',
render: function (data, type, full, meta) {
return '<a href="' + url_prefix() + '/worker/' + data + '">' + data + '</a>';
}
}, {
targets: 1,
data: 'status',
render: function (data, type, full, meta) {
if (data) {
return '<span class="label label-success">Online</span>';
} else {
return '<span class="label label-important">Offline</span>';
}
}
}, {
targets: 2,
data: 'active',
defaultContent: 0
}, {
targets: 3,
data: 'task-received',
defaultContent: 0
}, {
targets: 4,
data: 'task-failed',
defaultContent: 0
}, {
targets: 5,
data: 'task-succeeded',
defaultContent: 0
}, {
targets: 6,
data: 'task-retried',
defaultContent: 0
}, {
targets: 7,
data: 'loadavg',
render: function (data, type, full, meta) {
if (Array.isArray(data)) {
return data.join(', ');
}
return data;
}
}, ],
});
var autorefresh = $.urlParam('autorefresh') || 1;
if (autorefresh !== 0) {
setInterval( function () {
$('#workers-table').DataTable().ajax.reload();
update_dashboard_counters();
}, autorefresh * 1000);
}
});
$(document).ready(function () {
if (!active_page('/tasks')) {
return;
}
$('#tasks-table').DataTable({
rowId: 'uuid',
searching: true,
paginate: true,
scrollX: true,
scrollCollapse: true,
processing: true,
serverSide: true,
colReorder: true,
ajax: {
type: 'POST',
url: url_prefix() + '/tasks/datatable'
},
order: [
[7, "asc"]
],
oSearch: {
"sSearch": $.urlParam('state') ? 'state:' + $.urlParam('state') : ''
},
columnDefs: [{
targets: 0,
data: 'name',
visible: isColumnVisible('name'),
render: function (data, type, full, meta) {
return data;
}
}, {
targets: 1,
data: 'uuid',
visible: isColumnVisible('uuid'),
orderable: false,
render: function (data, type, full, meta) {
return '<a href="' + url_prefix() + '/task/' + data + '">' + data + '</a>';
}
}, {
targets: 2,
data: 'state',
visible: isColumnVisible('state'),
render: function (data, type, full, meta) {
switch (data) {
case 'SUCCESS':
return '<span class="label label-success">' + data + '</span>';
case 'FAILURE':
return '<span class="label label-important">' + data + '</span>';
default:
return '<span class="label label-default">' + data + '</span>';
}
}
}, {
targets: 3,
data: 'args',
visible: isColumnVisible('args'),
render: htmlEscapeEntities
}, {
targets: 4,
data: 'kwargs',
visible: isColumnVisible('kwargs'),
render: htmlEscapeEntities
}, {
targets: 5,
data: 'result',
visible: isColumnVisible('result'),
render: htmlEscapeEntities
}, {
targets: 6,
data: 'received',
visible: isColumnVisible('received'),
render: function (data, type, full, meta) {
if (data) {
return format_time(data);
}
return data;
}
}, {
targets: 7,
data: 'started',
visible: isColumnVisible('started'),
render: function (data, type, full, meta) {
if (data) {
return format_time(data);
}
return data;
}
}, {
targets: 8,
data: 'runtime',
visible: isColumnVisible('runtime'),
render: function (data, type, full, meta) {
return data ? data.toFixed(3) : data;
}
}, {
targets: 9,
data: 'worker',
visible: isColumnVisible('worker'),
render: function (data, type, full, meta) {
return '<a href="' + url_prefix() + '/worker/' + data + '">' + data + '</a>';
}
}, {
targets: 10,
data: 'exchange',
visible: isColumnVisible('exchange')
}, {
targets: 11,
data: 'routing_key',
visible: isColumnVisible('routing_key')
}, {
targets: 12,
data: 'retries',
visible: isColumnVisible('retries')
}, {
targets: 13,
data: 'revoked',
visible: isColumnVisible('revoked')
}, {
targets: 14,
data: 'exception',
visible: isColumnVisible('exception')
}, {
targets: 15,
data: 'expires',
visible: isColumnVisible('expires')
}, {
targets: 16,
data: 'eta',
visible: isColumnVisible('eta')
}, ],
});
});
return {
on_alert_close: on_alert_close,
on_worker_refresh: on_worker_refresh,
on_worker_pool_restart: on_worker_pool_restart,
on_worker_shutdown: on_worker_shutdown,
on_pool_grow: on_pool_grow,
on_pool_shrink: on_pool_shrink,
on_pool_autoscale: on_pool_autoscale,
on_add_consumer: on_add_consumer,
on_cancel_consumer: on_cancel_consumer,
on_task_timeout: on_task_timeout,
on_task_rate_limit: on_task_rate_limit,
on_cancel_task_filter: on_cancel_task_filter,
on_task_revoke: on_task_revoke,
on_task_terminate: on_task_terminate,
};
}(jQuery));