2019-01-15 02:02:28 +00:00
|
|
|
function register_events_job() {
|
|
|
|
$('#btn-job-add').click(function (e) {
|
2019-08-01 01:48:20 +00:00
|
|
|
var cb = function (workspaces) {
|
2019-04-23 08:57:15 +00:00
|
|
|
$('#form-job-workspace').children().remove();
|
|
|
|
$.each(workspaces, function (i, workspace) {
|
|
|
|
var newGroupOption = '<option value="' + workspace.git_repo + '">' + workspace.name + '</option>';
|
|
|
|
$('#form-job-workspace').append(newGroupOption);
|
|
|
|
});
|
|
|
|
};
|
|
|
|
wordspace_gets(null, cb);
|
2019-05-06 06:56:40 +00:00
|
|
|
|
2019-08-01 01:48:20 +00:00
|
|
|
var cb_cluster = function (clusters) {
|
|
|
|
$('#form-job-cluster').children().remove();
|
|
|
|
$.each(clusters, function (i, cluster) {
|
|
|
|
var newGroupOption = '<option value="' + cluster.name + '">' + cluster.name + '</option>';
|
|
|
|
$('#form-job-cluster').append(newGroupOption);
|
|
|
|
});
|
|
|
|
};
|
|
|
|
cluster_gets(cb_cluster);
|
|
|
|
|
2020-06-25 03:39:42 +00:00
|
|
|
//$('#form-job-name').val('');
|
2019-05-06 06:56:40 +00:00
|
|
|
$('#form-job-priority').val(25);
|
2020-06-25 03:39:42 +00:00
|
|
|
//$('#form-job-cluster').val(1);
|
2019-01-15 02:02:28 +00:00
|
|
|
$('#modal-job').modal('show');
|
|
|
|
});
|
|
|
|
|
2019-10-21 08:19:16 +00:00
|
|
|
$('#form-job-tasks').on('click', '.task-remove', function (e) {
|
|
|
|
if ($('#form-job-tasks').find('.row').length <= 1) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
var task = $(this).parent().parent().parent();
|
|
|
|
task.remove();
|
|
|
|
});
|
|
|
|
|
2020-06-21 05:00:23 +00:00
|
|
|
$("#form-job-predict-req").click(function (e) {
|
|
|
|
var name = $('#form-job-name').val();
|
2020-06-24 14:46:56 +00:00
|
|
|
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();
|
|
|
|
var locality = $('#form-job-locality').val();
|
|
|
|
if (run_before.length !== 0) {
|
|
|
|
run_before = moment(run_before).unix();
|
|
|
|
}
|
|
|
|
var tasks = [];
|
2020-06-21 05:00:23 +00:00
|
|
|
$('#form-job-tasks').find('.row').each(function () {
|
2020-06-24 14:46:56 +00:00
|
|
|
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();
|
|
|
|
task['is_ps'] = $(this).find('.task-is-ps').eq(0).val();
|
|
|
|
task['gpu_model'] = $(this).find('.task-gpu-model').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;
|
|
|
|
}
|
2020-06-21 05:00:23 +00:00
|
|
|
});
|
|
|
|
|
2020-06-24 15:46:23 +00:00
|
|
|
var roles = ['PS', 'Worker'];
|
|
|
|
$.each(roles, function (i, role) {
|
|
|
|
var ajax = $.ajax({
|
|
|
|
url: "service?action=job_predict_req&role=" + role,
|
|
|
|
type: 'POST',
|
|
|
|
data: {
|
|
|
|
name: name,
|
|
|
|
workspace: workspace,
|
|
|
|
cluster: cluster,
|
|
|
|
priority: priority,
|
|
|
|
run_before: run_before,
|
|
|
|
locality: locality,
|
|
|
|
tasks: JSON.stringify(tasks)
|
|
|
|
}
|
|
|
|
});
|
|
|
|
ajax.done(function (res) {
|
|
|
|
if (res["errno"] !== 0) {
|
|
|
|
$("#modal-msg-content").html(res["msg"]);
|
|
|
|
$("#modal-msg").modal('show');
|
|
|
|
} else {
|
|
|
|
$('#form-job-tasks').find('.row').each(function () {
|
2020-06-25 03:45:28 +00:00
|
|
|
var taskRole = parseInt($(this).find('.task-is-ps').eq(0).val());
|
2020-06-25 03:39:42 +00:00
|
|
|
console.log(taskRole);
|
|
|
|
if ((role === 'PS' && taskRole === 1) || (role === 'Worker' && taskRole === 0)) {
|
2020-06-24 15:46:23 +00:00
|
|
|
$(this).find('.task-cpu').eq(0).val(res['cpu']);
|
|
|
|
$(this).find('.task-mem').eq(0).val(res['mem']);
|
|
|
|
$(this).find('.task-gpu-mem').eq(0).val(res['gpu_mem']);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
ajax.fail(function (jqXHR, textStatus) {
|
|
|
|
$("#modal-msg-content").html("Request failed : " + jqXHR.statusText);
|
2020-06-21 05:00:23 +00:00
|
|
|
$("#modal-msg").modal('show');
|
2020-06-24 15:46:23 +00:00
|
|
|
$('#table-job').bootstrapTable("refresh");
|
|
|
|
});
|
2020-06-21 05:00:23 +00:00
|
|
|
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2020-07-01 02:52:31 +00:00
|
|
|
$("#form-job-predict-time").click(function (e) {
|
|
|
|
var name = $('#form-job-name').val();
|
|
|
|
var workspace = $('#form-job-workspace').val();
|
2020-09-11 03:12:07 +00:00
|
|
|
var model_dir = $('#form-job-model_dir').val();
|
|
|
|
var output_dir = $('#form-job-output_dir').val();
|
2020-07-01 02:52:31 +00:00
|
|
|
var cluster = $('#form-job-cluster').val();
|
|
|
|
var priority = $('#form-job-priority').val();
|
|
|
|
var run_before = $('#form-job-run-before').val();
|
|
|
|
var locality = $('#form-job-locality').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();
|
|
|
|
task['is_ps'] = $(this).find('.task-is-ps').eq(0).val();
|
|
|
|
task['gpu_model'] = $(this).find('.task-gpu-model').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;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
var ajax = $.ajax({
|
|
|
|
url: "service?action=job_predict_time",
|
|
|
|
type: 'POST',
|
|
|
|
data: {
|
|
|
|
name: name,
|
|
|
|
workspace: workspace,
|
2020-09-11 03:12:07 +00:00
|
|
|
model_dir: model_dir,
|
|
|
|
output_dir: output_dir,
|
2020-07-01 02:52:31 +00:00
|
|
|
cluster: cluster,
|
|
|
|
priority: priority,
|
|
|
|
run_before: run_before,
|
|
|
|
locality: locality,
|
|
|
|
tasks: JSON.stringify(tasks)
|
|
|
|
}
|
|
|
|
});
|
|
|
|
ajax.done(function (res) {
|
|
|
|
if (res["errno"] !== 0) {
|
|
|
|
$("#modal-msg-content").html(res["msg"]);
|
|
|
|
$("#modal-msg").modal('show');
|
|
|
|
} else {
|
|
|
|
console.log(res);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
ajax.fail(function (jqXHR, textStatus) {
|
|
|
|
$("#modal-msg-content").html("Request failed : " + jqXHR.statusText);
|
|
|
|
$("#modal-msg").modal('show');
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2019-10-21 08:19:16 +00:00
|
|
|
$('#form-job-task-add').click(function (e) {
|
|
|
|
var tasks = $('#form-job-tasks');
|
|
|
|
var newTask = $('#form-job-tasks').find('.row').eq(0).clone();
|
|
|
|
tasks.append(newTask);
|
|
|
|
});
|
|
|
|
|
2019-01-15 02:02:28 +00:00
|
|
|
$("#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();
|
2020-05-01 04:49:32 +00:00
|
|
|
var locality = $('#form-job-locality').val();
|
2019-01-15 02:02:28 +00:00
|
|
|
if (run_before.length !== 0) {
|
|
|
|
run_before = moment(run_before).unix();
|
|
|
|
}
|
|
|
|
var tasks = [];
|
2019-03-25 07:40:28 +00:00
|
|
|
$('#form-job-tasks').find('.row').each(function () {
|
|
|
|
var task = {};
|
2019-04-12 09:20:48 +00:00
|
|
|
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();
|
2020-04-30 04:02:56 +00:00
|
|
|
task['is_ps'] = $(this).find('.task-is-ps').eq(0).val();
|
|
|
|
task['gpu_model'] = $(this).find('.task-gpu-model').eq(0).val();
|
2019-03-25 07:40:28 +00:00
|
|
|
tasks.push(task);
|
|
|
|
});
|
2019-01-15 02:02:28 +00:00
|
|
|
|
|
|
|
/* TODO validate form */
|
2019-04-18 09:24:36 +00:00
|
|
|
if (name.length === 0) {
|
|
|
|
return true;
|
|
|
|
}
|
2019-05-06 06:56:40 +00:00
|
|
|
$.each(tasks, function (i, task) {
|
|
|
|
if (task['name'].length === 0) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
});
|
2019-04-18 09:24:36 +00:00
|
|
|
|
2019-01-15 02:02:28 +00:00
|
|
|
|
|
|
|
$('#modal-job').modal('hide');
|
|
|
|
var ajax = $.ajax({
|
2019-05-06 06:56:40 +00:00
|
|
|
url: "service?action=job_submit",
|
2019-01-15 02:02:28 +00:00
|
|
|
type: 'POST',
|
|
|
|
data: {
|
|
|
|
name: name,
|
|
|
|
workspace: workspace,
|
|
|
|
cluster: cluster,
|
|
|
|
priority: priority,
|
|
|
|
run_before: run_before,
|
2020-05-02 14:07:57 +00:00
|
|
|
locality: locality,
|
2019-01-15 02:02:28 +00:00
|
|
|
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({
|
2019-05-06 06:56:40 +00:00
|
|
|
url: 'service?action=job_list&who=' + scope,
|
2019-01-15 02:02:28 +00:00
|
|
|
responseHandler: jobResponseHandler,
|
2020-09-11 03:12:07 +00:00
|
|
|
sidePagination: 'client',
|
2019-01-15 02:02:28 +00:00
|
|
|
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
|
|
|
|
}, {
|
2019-08-01 03:21:48 +00:00
|
|
|
field: 'group',
|
2020-06-08 12:24:41 +00:00
|
|
|
title: 'Group',
|
2019-01-15 02:02:28 +00:00
|
|
|
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
|
2020-06-30 15:27:29 +00:00
|
|
|
}, {
|
|
|
|
field: 'started_at',
|
|
|
|
title: 'Started At',
|
|
|
|
align: 'center',
|
|
|
|
valign: 'middle',
|
2020-06-30 15:35:43 +00:00
|
|
|
formatter: timeFormatter,
|
|
|
|
visible: false
|
2020-04-12 04:12:59 +00:00
|
|
|
}, {
|
|
|
|
field: 'updated_at',
|
|
|
|
title: 'Updated At',
|
|
|
|
align: 'center',
|
|
|
|
valign: 'middle',
|
|
|
|
formatter: timeFormatter
|
2019-01-15 02:02:28 +00:00
|
|
|
}, {
|
|
|
|
field: 'status',
|
|
|
|
title: 'Status',
|
|
|
|
align: 'center',
|
|
|
|
valign: 'middle',
|
|
|
|
formatter: statusFormatter,
|
|
|
|
visible: true
|
2020-06-18 13:58:53 +00:00
|
|
|
}, {
|
|
|
|
field: 'base_priority',
|
|
|
|
title: 'BasePriority',
|
|
|
|
align: 'center',
|
|
|
|
valign: 'middle',
|
|
|
|
visible: false
|
2019-01-15 02:02:28 +00:00
|
|
|
}, {
|
|
|
|
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) {
|
2019-08-01 03:22:52 +00:00
|
|
|
return cluster;
|
2019-01-15 02:02:28 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
var priorityFormatter = function (status) {
|
2019-03-25 07:40:28 +00:00
|
|
|
status = parseInt(status);
|
2019-01-15 02:02:28 +00:00
|
|
|
switch (status) {
|
2019-03-25 07:40:28 +00:00
|
|
|
case 1:
|
2019-01-15 02:02:28 +00:00
|
|
|
return '<span class="text-normal">Low</span>';
|
2019-03-25 07:40:28 +00:00
|
|
|
case 25:
|
2019-01-15 02:02:28 +00:00
|
|
|
return '<span class="text-info">Medium</span>';
|
2019-03-25 07:40:28 +00:00
|
|
|
case 50:
|
2019-01-15 02:02:28 +00:00
|
|
|
return '<span class="text-success">High</span>';
|
2019-03-25 07:40:28 +00:00
|
|
|
case 99:
|
2019-01-15 02:02:28 +00:00
|
|
|
return '<span class="text-danger">Urgent</span>';
|
|
|
|
}
|
|
|
|
return 'Unknown (' + status + ')';
|
|
|
|
};
|
|
|
|
|
|
|
|
var statusFormatter = function (status) {
|
2019-03-25 07:40:28 +00:00
|
|
|
status = parseInt(status);
|
2019-01-15 02:02:28 +00:00
|
|
|
switch (status) {
|
2019-03-25 07:40:28 +00:00
|
|
|
case 0:
|
2019-05-16 05:48:30 +00:00
|
|
|
return '<span class="text-normal">Submitted</span>';
|
2019-03-25 07:40:28 +00:00
|
|
|
case 1:
|
2020-05-25 11:39:04 +00:00
|
|
|
return '<span class="text-info">Starting</span>';
|
2019-03-25 07:40:28 +00:00
|
|
|
case 2:
|
2020-05-25 11:39:04 +00:00
|
|
|
return '<span class="text-primary">Running</span>';
|
2019-03-25 07:40:28 +00:00
|
|
|
case 3:
|
2019-01-15 02:02:28 +00:00
|
|
|
return '<span class="text-danger">Stopped</span>';
|
2019-03-25 07:40:28 +00:00
|
|
|
case 4:
|
|
|
|
return '<span class="text-success">Finished</span>';
|
2020-05-04 06:13:46 +00:00
|
|
|
case 5:
|
2020-05-25 11:39:04 +00:00
|
|
|
return '<span class="text-warning">Failed</span>';
|
2019-01-15 02:02:28 +00:00
|
|
|
}
|
|
|
|
return 'Unknown(' + status + ')';
|
|
|
|
};
|
|
|
|
|
|
|
|
function jobResponseHandler(res) {
|
|
|
|
if (res['errno'] === 0) {
|
2020-09-11 03:12:07 +00:00
|
|
|
return res["jobs"];
|
2019-01-15 02:02:28 +00:00
|
|
|
}
|
|
|
|
$("#modal-msg-content").html(res["msg"]);
|
|
|
|
$("#modal-msg").modal('show');
|
|
|
|
return [];
|
|
|
|
}
|
|
|
|
|
|
|
|
function jobOperateFormatter(value, row, index) {
|
|
|
|
var div = '<div class="btn-group" role="group" aria-label="...">';
|
|
|
|
if (page_type === 'jobs')
|
2019-03-25 07:40:28 +00:00
|
|
|
div += '<button class="btn btn-default config"><i class="glyphicon glyphicon-cog"></i> </button>';
|
|
|
|
if (page_type === 'jobs')
|
|
|
|
div += '<button class="btn btn-default stats"><i class="glyphicon glyphicon-eye-open"></i> </button>';
|
2019-07-12 07:24:17 +00:00
|
|
|
if (page_type === 'jobs' && (parseInt(row.status) !== 3 && parseInt(row.status) !== 4))
|
2019-01-15 02:02:28 +00:00
|
|
|
div += '<button class="btn btn-default stop"><i class="glyphicon glyphicon-remove"></i> </button>';
|
|
|
|
div += '</div>';
|
|
|
|
return div;
|
|
|
|
}
|
|
|
|
|
|
|
|
window.jobOperateEvents = {
|
2019-03-25 07:40:28 +00:00
|
|
|
'click .config': function (e, value, row, index) {
|
2019-04-23 08:57:15 +00:00
|
|
|
var tmp = jQuery.extend(true, {}, row);
|
|
|
|
tmp.tasks = JSON.parse(tmp.tasks);
|
|
|
|
var formattedData = JSON.stringify(tmp, null, '\t');
|
2019-01-15 02:02:28 +00:00
|
|
|
$('#modal-job-description-content').text(formattedData);
|
|
|
|
$('#modal-job-description').modal('show');
|
|
|
|
},
|
2019-03-25 07:40:28 +00:00
|
|
|
'click .stats': function (e, value, row, index) {
|
|
|
|
window.open("?job_status&name=" + row.name);
|
|
|
|
},
|
2019-01-15 02:02:28 +00:00
|
|
|
'click .stop': function (e, value, row, index) {
|
|
|
|
if (!confirm('Are you sure to stop this job?')) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
var ajax = $.ajax({
|
2019-05-06 06:56:40 +00:00
|
|
|
url: "service?action=job_stop",
|
2019-01-15 02:02:28 +00:00
|
|
|
type: 'POST',
|
2019-04-18 09:24:36 +00:00
|
|
|
data: {id: row.name}
|
2019-01-15 02:02:28 +00:00
|
|
|
});
|
|
|
|
ajax.done(function (res) {
|
|
|
|
if (res["errno"] !== 0) {
|
|
|
|
$("#modal-msg-content").html(res["msg"]);
|
|
|
|
$("#modal-msg").modal('show');
|
|
|
|
}
|
2019-04-18 09:24:36 +00:00
|
|
|
$('#table-job').bootstrapTable("refresh");
|
2019-01-15 02:02:28 +00:00
|
|
|
});
|
|
|
|
ajax.fail(function (jqXHR, textStatus) {
|
|
|
|
$("#modal-msg-content").html("Request failed : " + jqXHR.statusText);
|
|
|
|
$("#modal-msg").modal('show');
|
|
|
|
$('#table-job').bootstrapTable("refresh");
|
|
|
|
});
|
|
|
|
}
|
2019-03-25 07:40:28 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
function load_job_status(name) {
|
|
|
|
$("#table-task").bootstrapTable({
|
2019-05-06 06:56:40 +00:00
|
|
|
url: 'service?action=job_status&name=' + name,
|
2019-03-25 07:40:28 +00:00
|
|
|
responseHandler: jobStatusResponseHandler,
|
|
|
|
sidePagination: 'server',
|
2019-04-03 12:26:25 +00:00
|
|
|
cache: true,
|
2019-03-25 07:40:28 +00:00
|
|
|
striped: true,
|
2019-04-03 12:26:25 +00:00
|
|
|
pagination: true,
|
2019-03-25 07:40:28 +00:00
|
|
|
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',
|
2019-07-12 07:24:17 +00:00
|
|
|
valign: 'middle',
|
|
|
|
visible: false
|
2019-03-25 07:40:28 +00:00
|
|
|
}, {
|
|
|
|
field: 'image',
|
|
|
|
title: 'Image',
|
|
|
|
align: 'center',
|
|
|
|
valign: 'middle',
|
2019-04-03 12:26:25 +00:00
|
|
|
visible: false
|
2019-03-25 07:40:28 +00:00
|
|
|
}, {
|
|
|
|
field: 'image_digest',
|
|
|
|
title: 'Image Version',
|
|
|
|
align: 'center',
|
|
|
|
valign: 'middle',
|
2019-04-03 12:26:25 +00:00
|
|
|
visible: false
|
2019-03-25 07:40:28 +00:00
|
|
|
}, {
|
|
|
|
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
|
2020-05-05 07:50:48 +00:00
|
|
|
}, {
|
|
|
|
field: 'node',
|
|
|
|
title: 'Node',
|
|
|
|
align: 'center',
|
|
|
|
valign: 'middle'
|
2019-03-25 07:40:28 +00:00
|
|
|
}, {
|
|
|
|
field: 'status',
|
|
|
|
title: 'Status',
|
|
|
|
align: 'center',
|
|
|
|
valign: 'middle'
|
|
|
|
}, {
|
|
|
|
field: 'operate',
|
2019-05-16 05:48:30 +00:00
|
|
|
title: 'Logs',
|
2019-03-25 07:40:28 +00:00
|
|
|
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 class="btn-group" role="group" aria-label="...">';
|
|
|
|
div += '<button class="btn btn-default logs"><i class="glyphicon glyphicon-eye-open"></i> </button>';
|
2019-05-16 05:48:30 +00:00
|
|
|
div += '<button class="btn btn-default download"><i class="glyphicon glyphicon-download-alt"></i> </button>';
|
2019-03-25 07:40:28 +00:00
|
|
|
div += '</div>';
|
|
|
|
return div;
|
|
|
|
}
|
|
|
|
|
|
|
|
window.jobStatusOperateEvents = {
|
|
|
|
'click .logs': function (e, value, row, index) {
|
|
|
|
var job = getParameterByName('name');
|
2019-08-01 06:33:16 +00:00
|
|
|
var task = row.hostname;
|
2019-03-25 07:40:28 +00:00
|
|
|
|
|
|
|
var ajax = $.ajax({
|
2019-05-06 06:56:40 +00:00
|
|
|
url: "service?action=task_logs",
|
2019-03-25 07:40:28 +00:00
|
|
|
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");
|
|
|
|
});
|
2019-05-16 05:48:30 +00:00
|
|
|
},
|
|
|
|
'click .download': function (e, value, row, index) {
|
|
|
|
var job = getParameterByName('name');
|
2020-06-08 12:24:41 +00:00
|
|
|
var task = row.hostname;
|
2019-05-16 05:48:30 +00:00
|
|
|
|
|
|
|
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');
|
2020-06-08 12:24:41 +00:00
|
|
|
} else {
|
|
|
|
download(res['logs'], job + '_' + task + '.txt', "text/plain");
|
2019-05-16 05:48:30 +00:00
|
|
|
}
|
|
|
|
});
|
|
|
|
ajax.fail(function (jqXHR, textStatus) {
|
|
|
|
$("#modal-msg-content").html("Request failed : " + jqXHR.statusText);
|
|
|
|
$("#modal-msg").modal('show');
|
|
|
|
$('#table-job').bootstrapTable("refresh");
|
|
|
|
});
|
2019-03-25 07:40:28 +00:00
|
|
|
}
|
2019-01-15 02:02:28 +00:00
|
|
|
};
|