en cours : silexing taskmanager : add first tests

This commit is contained in:
jygaulier
2012-07-24 14:47:06 +02:00
parent 7a9dd3b612
commit 883cb1dec6
7 changed files with 245 additions and 14 deletions

View File

@@ -43,7 +43,7 @@ return call_user_func(
$app->mount('/setup', new Setup()); $app->mount('/setup', new Setup());
$app->mount('/sphinx', new Sphinx()); $app->mount('/sphinx', new Sphinx());
$app->mount('/connected-users', new ConnectedUsers()); $app->mount('/connected-users', new ConnectedUsers());
$app->mount('/tasks', new Tasks());
$app->mount('/tasks', new Tasks()); $app->mount('/tasks', new Tasks());
$app->mount('/task', new Task()); $app->mount('/task', new Task());
$app->mount('/scheduler', new Scheduler()); $app->mount('/scheduler', new Scheduler());

View File

@@ -28,21 +28,86 @@ class Scheduler implements ControllerProviderInterface
public function connect(Application $app) public function connect(Application $app)
{ {
$appbox = \appbox::get_instance($app['phraseanet.core']); $appbox = \appbox::get_instance($app['phraseanet.core']);
$session = $appbox->get_session();
$controllers = $app['controllers_factory']; $controllers = $app['controllers_factory'];
/* /*
* route /admin/tasks/ * route /admin/scheduler/start
* tasks status in json
* or
* task manager page in html
*/ */
$controllers->get('/', function(Application $app, Request $request) use ($app) { $controllers->get('/start', function(Application $app, Request $request) use ($app, $appbox) {
$request = $app['request'];
$task_manager = new \task_manager($appbox);
return ""; $session = $appbox->get_session();
$scheduler_key = \phrasea::scheduler_key();
$registry = $appbox->get_registry();
$good_user = false;
if ($session->is_authenticated()) {
$user = \User_Adapter::getInstance($session->get_usr_id(), $appbox);
if ($user->ACL()->has_right('taskmanager'))
$good_user = true;
}
if ( ! $good_user && (trim($scheduler_key) == '' || $scheduler_key !== $request->get('key'))) {
phrasea::headers(403);
}
set_time_limit(0);
session_write_close();
ignore_user_abort(true);
$nullfile = '/dev/null';
if (defined('PHP_WINDOWS_VERSION_BUILD')) {
$nullfile = 'NUL';
}
$phpcli = $registry->get('GV_cli');
$cmd = $phpcli . ' -f ' . $registry->get('GV_RootPath') . "bin/console scheduler:start";
$descriptors[1] = array("file", $nullfile, "a+");
$descriptors[2] = array("file", $nullfile, "a+");
$pipes = null;
$cwd = $registry->get('GV_RootPath') . "bin/";
$proc = proc_open($cmd, $descriptors, $pipes, $cwd, null, array('bypass_shell' => true));
$pid = NULL;
if (is_resource($proc)) {
$proc_status = proc_get_status($proc);
if ($proc_status['running'])
$pid = $proc_status['pid'];
}
if ($pid !== NULL) {
$msg = sprintf("scheduler '%s' started (pid=%s)", $cmd, $pid);
// my_syslog(LOG_INFO, $msg);
} else {
@fclose($pipes[1]);
@fclose($pipes[2]);
@proc_close($process);
$msg = sprintf("scheduler '%s' failed to start", $cmd);
// my_syslog(LOG_INFO, $msg);
}
return $app->json(true);
});
/*
* route /admin/scheduler/stop
*/
$controllers->get('/stop', function(Application $app, Request $request) use ($app, $appbox) {
try {
$task_manager = new \task_manager($appbox);
$task_manager->setSchedulerState(\task_manager::STATE_TOSTOP);
return $app->json(true);
} catch (Exception $e) {
}
return $app->json(false);
}); });
return $controllers; return $controllers;

View File

@@ -80,6 +80,112 @@ class Task implements ControllerProviderInterface
}); });
}); });
/*
* route /admin/task/{id}/delete
* delete a task
*/
$controllers->get('/{id}/delete', function(Application $app, Request $request, $id) use ($appbox) {
$task_manager = new \task_manager($appbox);
try {
$task = $task_manager->getTask($id);
$task->delete();
return $app->redirect('/admin/tasks/');
} catch (\Exception $e) {
/*
* todo : add a message back
*/
return $app->redirect('/admin/tasks/');
}
});
/*
* route /admin/task/{id}/start
* set a task to 'tostart'
*/
$controllers->get('/{id}/tostart', function(Application $app, Request $request, $id) use ($appbox) {
$task_manager = new \task_manager($appbox);
$ret = false;
try {
$task = $task_manager->getTask($id);
$pid = (int) ($task->getPID());
if ( ! $pid) {
$task->setState(\task_abstract::STATE_TOSTART);
$ret = true;
}
} catch (Exception $e) {
}
return $app->json($ret);
});
/*
* route /admin/task/{id}/stop
* set a task to 'tostop'
*/
$controllers->get('/{id}/tostop', function(Application $app, Request $request, $id) use ($appbox) {
$task_manager = new \task_manager($appbox);
$ret = false;
try {
$task = $task_manager->getTask($id);
$pid = $task->getPID();
$signal = $request->get('signal');
$task->setState(\task_abstract::STATE_TOSTOP);
if ((int) $pid > 0 && (int) $signal > 0 && function_exists('posix_kill')) {
posix_kill((int) $pid, (int) $signal);
}
$ret = true;
} catch (Exception $e) {
}
return $app->json($ret);
});
/*
* route /admin/task/{id}/resetcrashcounter
* return json
*/
$controllers->get('/{id}/resetcrashcounter', function(Application $app, Request $request, $id) use ($appbox) {
$task_manager = new \task_manager($appbox);
try {
$task = $task_manager->getTask($id);
$task->resetCrashCounter();
return $app->json(true);
} catch (\Exception $e) {
return $app->json(false);
}
});
/*
* route /admin/task/{id}
* render a task editing interface
*/
$controllers->get('/{id}', function(Application $app, Request $request, $id) use ($appbox) {
$task_manager = new \task_manager($appbox);
$task = $task_manager->getTask($id);
/* @var $twig \Twig_Environment */
$twig = $app['phraseanet.core']->getTwig();
$template = 'admin/task.html';
return $twig->render($template, array(
'task' => $task,
'view' => 'XML'
));
});
return $controllers; return $controllers;
} }
} }

View File

@@ -36,7 +36,7 @@ class task_manager
/** /**
* status of scheduler and tasks * status of scheduler and tasks
* used do refresh the taskmanager page * used do refresh the taskmanager page
* *
* @return array * @return array
*/ */
public function toArray() public function toArray()

View File

@@ -166,7 +166,7 @@
currentView : null, currentView : null,
oldXML:"{{task.getSettings()|stripdoublequotes}}", oldXML:"{{task.getSettings()|escape('js')}}",
view:function(type) view:function(type)
{ {

View File

@@ -0,0 +1,59 @@
<?php
require_once __DIR__ . '/../../../../PhraseanetWebTestCaseAuthenticatedAbstract.class.inc';
class TasksTest extends \PhraseanetWebTestCaseAuthenticatedAbstract
{
protected $client;
protected $appbox;
public function createApplication()
{
$app = require __DIR__ . '/../../../../../lib/Alchemy/Phrasea/Application/Admin.php';
$app['debug'] = true;
unset($app['exception_handler']);
return $app;
}
public function setUp()
{
parent::setUp();
$this->client = $this->createClient();
$this->appbox = appbox::get_instance(\bootstrap::getCore());
}
/**
* Default route test
*/
public function testRouteTasks()
{
$task_manager = new \task_manager($this->appbox);
/**
* get /admin/tasks/ should return html by default
*/
$crawler = $this->client->request('GET', '/tasks/', array());
$this->assertTrue($this->client->getResponse()->isOk());
$this->assertCount(1, $crawler->filter('form#taskManagerForm'));
/**
* get /admin/tasks/ can also return json
*/
$crawler = $this->client->request(
'GET',
'/tasks/',
array(),
array(),
array('CONTENT_TYPE' => 'application/json')
);
$this->assertTrue($this->client->getResponse()->isOk());
$this->assertTrue($this->client->getResponse()->headers->contains('Content-Type', 'application/json'));
$raw = $this->client->getResponse()->getContent();
$json = json_decode($raw);
$this->assertEquals(count($task_manager->getTasks()), count(get_object_vars($json->tasks)));
}
}

View File

@@ -63,7 +63,7 @@ switch ($parm['action']) {
} }
break; break;
/*
case 'RESETTASKCRASHCOUNTER': case 'RESETTASKCRASHCOUNTER':
$parm = $request->get_parms("task_id"); $parm = $request->get_parms("task_id");
try { try {
@@ -81,7 +81,7 @@ switch ($parm['action']) {
$output = $ret->saveXML(); $output = $ret->saveXML();
break; break;
*/
case 'CHANGETASK': case 'CHANGETASK':
$parm = $request->get_parms('act', 'task_id', "usr"); $parm = $request->get_parms('act', 'task_id', "usr");
$ret = new DOMDocument("1.0", "UTF-8"); $ret = new DOMDocument("1.0", "UTF-8");
@@ -107,6 +107,7 @@ switch ($parm['action']) {
$output = $ret->saveXML(); $output = $ret->saveXML();
break; break;
/*
case 'PINGSCHEDULER_JS': case 'PINGSCHEDULER_JS':
$parm = $request->get_parms('dbps'); $parm = $request->get_parms('dbps');
$ret = array('time' => date("H:i:s")); $ret = array('time' => date("H:i:s"));