function register_events_job() { $('#btn-job-add').click(function (e) { cb = function (workspaces) { $('#form-job-workspace').children().remove(); var newGroupOption = ''; $('#form-job-workspace').append(newGroupOption); $.each(workspaces, function (i, workspace) { var newGroupOption = ''; $('#form-job-workspace').append(newGroupOption); }); }; wordspace_gets(null, cb); $('#form-job-name').val(''); $('#form-job-priority').val(25); $('#form-job-cluster').val(1); $('#modal-job').modal('show'); }); $("#form-job-submit").click(function (e) { var name = $('#form-job-name').val(); var workspace = $('#form-job-workspace').val(); var cluster = $('#form-job-cluster').val(); var priority = $('#form-job-priority').val(); var run_before = $('#form-job-run-before').val(); if (run_before.length !== 0) { run_before = moment(run_before).unix(); } var tasks = []; $('#form-job-tasks').find('.row').each(function () { var task = {}; task['name'] = $(this).find('.task-name').eq(0).val(); task['image'] = $(this).find('.task-image').eq(0).val(); task['cmd'] = $(this).find('.task-cmd').eq(0).val(); task['cpu_number'] = $(this).find('.task-cpu').eq(0).val(); task['memory'] = $(this).find('.task-mem').eq(0).val(); task['gpu_number'] = $(this).find('.task-gpu-num').eq(0).val(); task['gpu_memory'] = $(this).find('.task-gpu-mem').eq(0).val(); tasks.push(task); }); /* TODO validate form */ if (name.length === 0) { return true; } $.each(tasks, function (i, task) { if (task['name'].length === 0) { return true; } }); $('#modal-job').modal('hide'); var ajax = $.ajax({ url: "service?action=job_submit", type: 'POST', data: { name: name, workspace: workspace, cluster: cluster, priority: priority, run_before: run_before, tasks: JSON.stringify(tasks) } }); ajax.done(function (res) { if (res["errno"] !== 0) { $("#modal-msg-content").html(res["msg"]); $("#modal-msg").modal('show'); } $('#table-job').bootstrapTable("refresh"); }); ajax.fail(function (jqXHR, textStatus) { $("#modal-msg-content").html("Request failed : " + jqXHR.statusText); $("#modal-msg").modal('show'); $('#table-job').bootstrapTable("refresh"); }); }); } function load_jobs(scope) { $("#table-job").bootstrapTable({ url: 'service?action=job_list&who=' + scope, responseHandler: jobResponseHandler, sidePagination: 'server', cache: true, striped: true, pagination: true, pageSize: 10, pageList: [10, 25, 50, 100, 200], search: false, showColumns: true, showRefresh: true, showToggle: false, showPaginationSwitch: true, minimumCountColumns: 2, clickToSelect: false, sortName: 'nobody', sortOrder: 'desc', smartDisplay: true, mobileResponsive: true, showExport: true, columns: [{ field: 'created_by', title: 'Created By', align: 'center', valign: 'middle', formatter: UIDFormatter, visible: scope === 'all' }, { field: 'name', title: 'Name', align: 'center', valign: 'middle', escape: true }, { field: 'workspace', title: 'Workspace', align: 'center', valign: 'middle', visible: false, formatter: workspaceFormatter }, { field: 'virtual_cluster', title: 'Virtual Cluster', align: 'center', valign: 'middle', formatter: clusterFormatter }, { field: 'priority', title: 'Priority', align: 'center', valign: 'middle', formatter: priorityFormatter }, { field: 'run_before', title: 'Run Before', align: 'center', valign: 'middle', visible: false, formatter: timeFormatter }, { field: 'created_at', title: 'Created At', align: 'center', valign: 'middle', formatter: timeFormatter }, { field: 'status', title: 'Status', align: 'center', valign: 'middle', formatter: statusFormatter, visible: true }, { field: 'operate', title: 'Operate', align: 'center', events: jobOperateEvents, formatter: jobOperateFormatter }] }); } var UIDFormatter = function (UID) { return UID; }; var workspaceFormatter = function (workspace) { return workspace; }; var clusterFormatter = function (cluster) { return 'default'; }; var priorityFormatter = function (status) { status = parseInt(status); switch (status) { case 1: return 'Low'; case 25: return 'Medium'; case 50: return 'High'; case 99: return 'Urgent'; } return 'Unknown (' + status + ')'; }; var statusFormatter = function (status) { status = parseInt(status); switch (status) { case 0: return 'Created'; case 1: return 'Starting'; case 2: return 'Running'; case 3: return 'Stopped'; case 4: return 'Finished'; } return 'Unknown(' + status + ')'; }; function jobResponseHandler(res) { if (res['errno'] === 0) { var tmp = {}; tmp["total"] = res["count"]; tmp["rows"] = res["jobs"]; return tmp; } $("#modal-msg-content").html(res["msg"]); $("#modal-msg").modal('show'); return []; } function jobOperateFormatter(value, row, index) { var div = '
'; if (page_type === 'jobs') div += ''; if (page_type === 'jobs') div += ''; if (page_type === 'jobs' && (parseInt(row.status) === 0 || parseInt(row.status) === 1)) div += ''; div += '
'; return div; } window.jobOperateEvents = { 'click .config': function (e, value, row, index) { var tmp = jQuery.extend(true, {}, row); tmp.tasks = JSON.parse(tmp.tasks); var formattedData = JSON.stringify(tmp, null, '\t'); $('#modal-job-description-content').text(formattedData); $('#modal-job-description').modal('show'); }, 'click .stats': function (e, value, row, index) { window.open("?job_status&name=" + row.name); }, 'click .stop': function (e, value, row, index) { if (!confirm('Are you sure to stop this job?')) { return; } var ajax = $.ajax({ url: "service?action=job_stop", type: 'POST', data: {id: row.name} }); ajax.done(function (res) { if (res["errno"] !== 0) { $("#modal-msg-content").html(res["msg"]); $("#modal-msg").modal('show'); } $('#table-job').bootstrapTable("refresh"); }); ajax.fail(function (jqXHR, textStatus) { $("#modal-msg-content").html("Request failed : " + jqXHR.statusText); $("#modal-msg").modal('show'); $('#table-job').bootstrapTable("refresh"); }); } }; function load_job_status(name) { $("#table-task").bootstrapTable({ url: 'service?action=job_status&name=' + name, responseHandler: jobStatusResponseHandler, sidePagination: 'server', cache: true, striped: true, pagination: true, pageSize: 10, pageList: [10, 25, 50, 100, 200], search: false, showColumns: true, showRefresh: true, showToggle: false, showPaginationSwitch: true, minimumCountColumns: 2, clickToSelect: false, sortName: 'nobody', sortOrder: 'desc', smartDisplay: true, mobileResponsive: true, showExport: true, columns: [{ field: 'id', title: 'ID', align: 'center', valign: 'middle' }, { field: 'image', title: 'Image', align: 'center', valign: 'middle', visible: false }, { field: 'image_digest', title: 'Image Version', align: 'center', valign: 'middle', visible: false }, { field: 'hostname', title: 'Hostname', align: 'center', valign: 'middle' }, { field: 'command', title: 'Command', align: 'center', valign: 'middle' }, { field: 'created_at', title: 'Created At', align: 'center', valign: 'middle' }, { field: 'finished_at', title: 'Finished At', align: 'center', valign: 'middle', visible: false }, { field: 'status', title: 'Status', align: 'center', valign: 'middle' }, { field: 'operate', title: 'Operate', align: 'center', events: jobStatusOperateEvents, formatter: jobStatusOperateFormatter }] }); } function jobStatusResponseHandler(res) { if (res['errno'] === 0) { var tmp = {}; tmp["total"] = res["count"]; tmp["rows"] = res["tasks"]; return tmp; } $("#modal-msg-content").html(res["msg"]); $("#modal-msg").modal('show'); return []; } function jobStatusOperateFormatter(value, row, index) { var div = '
'; div += ''; div += '
'; return div; } window.jobStatusOperateEvents = { 'click .logs': function (e, value, row, index) { var job = getParameterByName('name'); var task = row.id; var ajax = $.ajax({ url: "service?action=task_logs", type: 'GET', data: { job: job, task: task } }); ajax.done(function (res) { if (res["errno"] !== 0) { $("#modal-msg-content").html(res["msg"]); $("#modal-msg").modal('show'); } $('#modal-task-logs-content').text(res['logs']); $('#modal-task-logs').modal('show'); }); ajax.fail(function (jqXHR, textStatus) { $("#modal-msg-content").html("Request failed : " + jqXHR.statusText); $("#modal-msg").modal('show'); $('#table-job').bootstrapTable("refresh"); }); } };