Skip to content
Snippets Groups Projects
Commit 16330a83 authored by Tibo's avatar Tibo
Browse files

status change detection

parent 8f1cb24a
No related branches found
No related tags found
No related merge requests found
......@@ -2,6 +2,8 @@
namespace App\Console;
use App\Jobs\StatusChangeDetection;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
......@@ -26,6 +28,8 @@ class Kernel extends ConsoleKernel
{
// $schedule->command('inspire')
// ->hourly();
$schedule->job(new StatusChangeDetection())->everyFiveMinutes();
}
/**
......
<?php
namespace App\Jobs;
use App\Organization;
use App\Server;
use App\StatusChange;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
class StatusChangeDetection implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
foreach (Organization::all() as $organization) {
/* @var $organization \App\Organization */
foreach ($organization->servers as $server) {
$this->detectChangeForServer($server);
}
}
}
public function detectChangeForServer(Server $server) {
$last_change = StatusChange::getLastChangeForServer($server->id);
$current_status = $server->status();
if ($last_change->status == $current_status) {
// no change
return;
}
$change = new StatusChange();
$change->server_id = $server->id;
$change->time = time();
$change->status = $current_status;
StatusChange::save($change);
}
}
<?php
namespace App;
/**
* Represents a change of status, that will be saved in MongoDB.
*
* @author tibo
*/
class StatusChange {
public $server_id = 0;
public $status = 0;
public $time = 0;
public static function save($status) {
$data = [
"time" => time(),
"server_id" => $status->server_id,
"status" => $status->status,
];
$collection = \Mongo::get()->monitoring->statuschanges;
$collection->insertOne($data);
}
public static function getLastChangeForServer(int $server_id) : StatusChange {
$collection = \Mongo::get()->monitoring->statuschanges;
$record = $collection->findOne(
["server_id" => $server_id],
["sort" => ["_id" => -1]]);
$change = new StatusChange();
$change->server_id = $server_id;
if ($record == null) {
return $change;
}
$change->time = $record["time"];
$change->status = $record["status"];
return $change;
}
}
......@@ -116,4 +116,31 @@ class ExampleTest extends TestCase
$client_version = new \App\Sensor\ClientVersion($server);
$this->assertStringMatchesFormat('%f', $client_version->latestVersion());
}
/**
* @group status-change
*/
public function testStatusChangeDetection() {
$server = new \App\Server();
$server->id = 1;
$this->assertEquals(1, \App\StatusChange::getLastChangeForServer(1)->server_id);
// Insert a fake status change
$change = new \App\StatusChange();
$change->status = 155;
$change->server_id = 1;
\App\StatusChange::save($change);
// Run change detection
$change_detection_job = new \App\Jobs\StatusChangeDetection();
$change_detection_job->detectChangeForServer($server);
// Check if a new StatusChange was inserted in Mongo
$last_change = \App\StatusChange::getLastChangeForServer(1);
$this->assertEquals(
$server->status(),
$last_change->status);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment