1
0
mirror of https://github.com/newnius/YAO-portal.git synced 2025-06-06 23:21:55 +00:00
YAO-portal/job.logic.php

381 lines
10 KiB
PHP
Raw Normal View History

2019-01-15 02:02:28 +00:00
<?php
require_once('predis/autoload.php');
require_once('util4p/util.php');
require_once('util4p/CRObject.class.php');
require_once('util4p/AccessController.class.php');
require_once('util4p/CRLogger.class.php');
require_once('Code.class.php');
require_once('JobManager.class.php');
require_once('Spider.class.php');
require_once('config.inc.php');
require_once('init.inc.php');
function job_submit(CRObject $job)
{
if (!AccessController::hasAccess(Session::get('role', 'visitor'), 'job.submit')) {
$res['errno'] = Code::NO_PRIVILEGE;
return $res;
}
$job->set('created_by', Session::get('uid'));
2019-03-25 07:40:28 +00:00
$job->set('created_at', time());
/* notify YAO-scheduler */
$spider = new Spider();
$tasks = json_decode($job->get('tasks'), true);
foreach ($tasks as $i => $task) {
$task['cpu_number'] = intval($task['cpu_number']);
$task['memory'] = intval($task['memory']);
$task['gpu_number'] = intval($task['gpu_number']);
$task['gpu_memory'] = intval($task['gpu_memory']);
2020-04-30 04:02:56 +00:00
$task['is_ps'] = $task['is_ps'] == 1;
2019-03-25 07:40:28 +00:00
$tasks[$i] = $task;
}
$job->set('tasks', $tasks);
2019-04-12 09:20:48 +00:00
$job->set('workspace', $job->get('workspace'));
2019-08-01 02:41:48 +00:00
$job->set('group', $job->get('virtual_cluster'));
2019-03-25 07:40:28 +00:00
$job->set('priority', $job->getInt('priority'));
2020-05-01 04:49:32 +00:00
$job->set('locality', $job->getInt('locality'));
2019-03-25 07:40:28 +00:00
$job->set('run_before', $job->getInt('run_before'));
$job->set('created_by', $job->getInt('created_by'));
$data['job'] = json_encode($job);
$spider->doPost(YAO_SCHEDULER_ADDR . '?action=job_submit', $data);
2019-04-18 09:24:36 +00:00
$msg = json_decode($spider->getBody(), true);
2019-03-25 07:40:28 +00:00
2019-04-18 09:24:36 +00:00
$res['errno'] = Code::SUCCESS;
if ($msg['code'] !== 0) {
$res['errno'] = Code::FAIL;
$res['msg'] = $msg['error'];
} else {
2020-07-08 16:00:48 +00:00
$res['job_name'] = $msg['jobName'];
2019-04-18 09:24:36 +00:00
}
2019-04-23 08:57:15 +00:00
$log = new CRObject();
$log->set('scope', Session::get('uid'));
$log->set('tag', 'job.submit');
$content = array('job' => $job, 'response' => $res['errno']);
$log->set('content', json_encode($content));
CRLogger::log($log);
2019-01-15 02:02:28 +00:00
return $res;
}
function job_stop(CRObject $job)
{
if (!AccessController::hasAccess(Session::get('role', 'visitor'), 'job.stop')) {
$res['errno'] = Code::NO_PRIVILEGE;
return $res;
}
2019-04-18 09:24:36 +00:00
/* TODO: permission check */
$spider = new Spider();
$data['id'] = $job->get('id', '');
$spider->doPost(YAO_SCHEDULER_ADDR . '?action=job_stop', $data);
$msg = json_decode($spider->getBody(), true);
$res['errno'] = Code::SUCCESS;
if ($msg['code'] !== 0) {
$res['errno'] = Code::FAIL;
$res['msg'] = $msg['error'];
return $res;
2019-01-15 02:02:28 +00:00
}
$log = new CRObject();
$log->set('scope', Session::get('uid'));
$log->set('tag', 'job.stop');
2019-04-18 09:24:36 +00:00
$content = array('id' => $job->get('id'), 'response' => $res['errno']);
2019-01-15 02:02:28 +00:00
$log->set('content', json_encode($content));
CRLogger::log($log);
return $res;
}
function job_list(CRObject $rule)
{
if (!AccessController::hasAccess(Session::get('role', 'visitor'), 'job.list')) {
$res['errno'] = Code::NO_PRIVILEGE;
return $res;
}
if ($rule->get('who') !== 'all') {
$rule->set('who', 'self');
$rule->set('created_by', Session::get('uid'));
}
if ($rule->get('who') === 'all' && !AccessController::hasAccess(Session::get('role', 'visitor'), 'job.list_others')) {
$res['errno'] = Code::NO_PRIVILEGE;
return $res;
}
2019-03-25 07:40:28 +00:00
$spider = new Spider();
$spider->doGet(YAO_SCHEDULER_ADDR . '?action=jobs');
$msg = json_decode($spider->getBody(), true);
if ($msg['code'] !== 0) {
2019-04-23 08:57:15 +00:00
$res['errno'] = $msg['code'] !== null ? $msg['code'] : Code::UNKNOWN_ERROR;
2019-03-25 07:40:28 +00:00
$res['msg'] = $msg['error'];
return $res;
}
2020-07-09 13:38:06 +00:00
if ($msg['jobs'] !== null) {
$res['jobs'] = array_reverse($msg['jobs']);
} else {
$res['jobs'] = [];
}
2019-03-25 07:40:28 +00:00
for ($i = 0; $i < sizeof($res['jobs']); $i++) {
$res['jobs'][$i]['tasks'] = json_encode($res['jobs'][$i]['tasks']);
if ($res['jobs'][$i]['run_before'] === 0) {
$res['jobs'][$i]['run_before'] = null;
}
}
$res['errno'] = Code::SUCCESS;
return $res;
}
function job_status(CRObject $job)
{
if (!AccessController::hasAccess(Session::get('role', 'visitor'), 'job.list')) {
$res['errno'] = Code::NO_PRIVILEGE;
return $res;
}
$spider = new Spider();
$spider->doGet(YAO_SCHEDULER_ADDR . '?action=job_status&id=' . $job->get('name'));
$msg = json_decode($spider->getBody(), true);
if ($msg['code'] !== 0) {
$res['errno'] = $msg['code'];
$res['msg'] = $msg['error'];
return $res;
}
2019-04-03 12:26:25 +00:00
$res['tasks'] = $msg['status'];
$res['errno'] = Code::SUCCESS;
return $res;
}
2020-06-24 14:46:56 +00:00
function job_predict_req(CRObject $job, $role)
2020-06-21 05:05:22 +00:00
{
if (!AccessController::hasAccess(Session::get('role', 'visitor'), 'job.list')) {
$res['errno'] = Code::NO_PRIVILEGE;
return $res;
}
$spider = new Spider();
2020-06-24 14:46:56 +00:00
$tasks = json_decode($job->get('tasks'), true);
foreach ($tasks as $i => $task) {
$task['cpu_number'] = intval($task['cpu_number']);
$task['memory'] = intval($task['memory']);
$task['gpu_number'] = intval($task['gpu_number']);
$task['gpu_memory'] = intval($task['gpu_memory']);
$task['is_ps'] = $task['is_ps'] == 1;
$tasks[$i] = $task;
}
$job->set('tasks', $tasks);
$job->set('workspace', $job->get('workspace'));
$job->set('group', $job->get('virtual_cluster'));
$job->set('priority', $job->getInt('priority'));
$job->set('locality', $job->getInt('locality'));
$job->set('run_before', $job->getInt('run_before'));
$job->set('created_by', $job->getInt('created_by'));
$data['job'] = json_encode($job);
$spider->doPost(YAO_SCHEDULER_ADDR . '?action=job_predict_req&role=' . $role, $data);
2020-06-21 05:05:22 +00:00
$msg = json_decode($spider->getBody(), true);
2020-06-21 05:08:22 +00:00
if ($msg === NULL) {
$res['errno'] = Code::UNKNOWN_ERROR;
$res['msg'] = 'response is null';
return $res;
}
2020-06-21 05:06:19 +00:00
2020-06-21 05:05:22 +00:00
if ($msg['code'] !== 0) {
$res['errno'] = $msg['code'];
$res['msg'] = $msg['error'];
return $res;
}
$res['cpu'] = $msg['cpu'];
$res['mem'] = $msg['mem'];
2020-06-24 14:46:56 +00:00
$res['gpu_util'] = $msg['gpu_util'];
$res['gpu_mem'] = $msg['gpu_mem'];
2020-06-21 05:05:22 +00:00
$res['bw'] = $msg['bw'];
$res['errno'] = Code::SUCCESS;
return $res;
}
2020-07-01 02:52:31 +00:00
function job_predict_time(CRObject $job, $role)
{
if (!AccessController::hasAccess(Session::get('role', 'visitor'), 'job.list')) {
$res['errno'] = Code::NO_PRIVILEGE;
return $res;
}
$spider = new Spider();
$tasks = json_decode($job->get('tasks'), true);
foreach ($tasks as $i => $task) {
$task['cpu_number'] = intval($task['cpu_number']);
$task['memory'] = intval($task['memory']);
$task['gpu_number'] = intval($task['gpu_number']);
$task['gpu_memory'] = intval($task['gpu_memory']);
$task['is_ps'] = $task['is_ps'] == 1;
$tasks[$i] = $task;
}
$job->set('tasks', $tasks);
$job->set('workspace', $job->get('workspace'));
$job->set('group', $job->get('virtual_cluster'));
$job->set('priority', $job->getInt('priority'));
$job->set('locality', $job->getInt('locality'));
$job->set('run_before', $job->getInt('run_before'));
$job->set('created_by', $job->getInt('created_by'));
$data['job'] = json_encode($job);
$spider->doPost(YAO_SCHEDULER_ADDR . '?action=job_predict_time', $data);
$msg = json_decode($spider->getBody(), true);
if ($msg === NULL) {
$res['errno'] = Code::UNKNOWN_ERROR;
$res['msg'] = 'response is null';
return $res;
}
if ($msg['code'] !== 0) {
$res['errno'] = $msg['code'];
$res['msg'] = $msg['error'];
return $res;
}
$res['total'] = $msg['total'];
$res['pre'] = $msg['pre'];
$res['post'] = $msg['post'];
$res['errno'] = Code::SUCCESS;
return $res;
}
2019-04-03 12:26:25 +00:00
function summary_get()
{
if (!AccessController::hasAccess(Session::get('role', 'visitor'), 'system.summary')) {
$res['errno'] = Code::NO_PRIVILEGE;
return $res;
}
$spider = new Spider();
$spider->doGet(YAO_SCHEDULER_ADDR . '?action=summary');
$msg = json_decode($spider->getBody(), true);
if ($msg['code'] !== 0) {
2019-04-23 08:57:15 +00:00
$res['errno'] = $msg['code'] !== null ? $msg['code'] : Code::UNKNOWN_ERROR;
2019-04-03 12:26:25 +00:00
$res['msg'] = $msg['error'];
return $res;
}
$res['jobs']['finished'] = $msg['jobs_finished'];
$res['jobs']['running'] = $msg['jobs_running'];
$res['jobs']['pending'] = $msg['jobs_pending'];
$res['gpu']['free'] = $msg['gpu_free'];
$res['gpu']['using'] = $msg['gpu_using'];
2019-03-25 07:40:28 +00:00
$res['errno'] = Code::SUCCESS;
return $res;
}
2019-04-29 13:04:19 +00:00
function summary_get_pool_history()
{
if (!AccessController::hasAccess(Session::get('role', 'visitor'), 'system.summary')) {
$res['errno'] = Code::NO_PRIVILEGE;
return $res;
}
$spider = new Spider();
$spider->doGet(YAO_SCHEDULER_ADDR . '?action=pool_status_history');
$msg = json_decode($spider->getBody(), true);
if ($msg['code'] !== 0) {
$res['errno'] = $msg['code'] !== null ? $msg['code'] : Code::UNKNOWN_ERROR;
$res['msg'] = $msg['error'];
return $res;
}
$res['data'] = $msg['data'];
$res['errno'] = Code::SUCCESS;
return $res;
}
2019-03-25 07:40:28 +00:00
function task_logs(CRObject $job)
{
if (!AccessController::hasAccess(Session::get('role', 'visitor'), 'job.list')) {
$res['errno'] = Code::NO_PRIVILEGE;
return $res;
}
$spider = new Spider();
$spider->doGet(YAO_SCHEDULER_ADDR . '?action=task_logs&job=' . $job->get('job') . '&task=' . $job->get('task'));
$msg = json_decode($spider->getBody(), true);
if ($msg['code'] !== 0) {
$res['errno'] = $msg['code'];
$res['msg'] = $msg['error'];
return $res;
}
$res['logs'] = $msg['logs'];
$res['errno'] = Code::SUCCESS;
2019-01-15 02:02:28 +00:00
return $res;
}
function job_describe(CRObject $rule)
{
if (!AccessController::hasAccess(Session::get('role', 'visitor'), 'job.describe')) {
$res['errno'] = Code::NO_PRIVILEGE;
return $res;
}
$res['errno'] = Code::FAIL;
$origin = JobManager::get($rule);
if ($origin === null) {
$res['errno'] = Code::RECORD_NOT_EXIST;
} else if ($origin['created_by'] !== Session::get('uid') && !AccessController::hasAccess(Session::get('role', 'visitor'), 'job.describe_others')) {
$res['errno'] = Code::NO_PRIVILEGE;
}
return $res;
}
2020-07-11 05:29:10 +00:00
function conf_update($option, $value)
{
if (!AccessController::hasAccess(Session::get('role', 'visitor'), 'job.list')) {
$res['errno'] = Code::NO_PRIVILEGE;
return $res;
}
$spider = new Spider();
2020-07-11 05:31:02 +00:00
$spider->doGet(YAO_SCHEDULER_ADDR . '?action=conf_update&option=' . $option . '&value=' . $value);
2020-07-11 05:29:10 +00:00
$msg = json_decode($spider->getBody(), true);
if ($msg['code'] !== 0) {
$res['errno'] = $msg['code'];
$res['msg'] = $msg['error'];
return $res;
}
$res['errno'] = Code::SUCCESS;
return $res;
}
function conf_list()
{
if (!AccessController::hasAccess(Session::get('role', 'visitor'), 'job.list')) {
$res['errno'] = Code::NO_PRIVILEGE;
return $res;
}
$spider = new Spider();
$spider->doGet(YAO_SCHEDULER_ADDR . '?action=conf_list');
$msg = json_decode($spider->getBody(), true);
if ($msg['code'] !== 0) {
$res['errno'] = $msg['code'];
$res['msg'] = $msg['error'];
return $res;
}
$res['errno'] = Code::SUCCESS;
$res['options'] = $msg['options'];
return $res;
}