diff options
Diffstat (limited to '')
-rw-r--r-- | library/Reporting/Schedule.php | 177 |
1 files changed, 86 insertions, 91 deletions
diff --git a/library/Reporting/Schedule.php b/library/Reporting/Schedule.php index e0ffa9f..ddd8bd3 100644 --- a/library/Reporting/Schedule.php +++ b/library/Reporting/Schedule.php @@ -1,160 +1,155 @@ <?php + // Icinga Reporting | (c) 2018 Icinga GmbH | GPLv2 namespace Icinga\Module\Reporting; -class Schedule -{ - /** @var int */ - protected $id; +use Exception; +use Icinga\Module\Reporting\Hook\ActionHook; +use Icinga\Util\Json; +use ipl\Scheduler\Common\TaskProperties; +use ipl\Scheduler\Contract\Task; +use Ramsey\Uuid\Uuid; +use React\EventLoop\Loop; +use React\Promise; +use React\Promise\ExtendedPromiseInterface; - /** @var int */ - protected $reportId; +use function md5; - /** @var \DateTime */ - protected $start; +class Schedule implements Task +{ + use TaskProperties; - /** @var string */ - protected $frequency; + /** @var int */ + protected $id; /** @var string */ protected $action; /** @var array */ - protected $config; + protected $config = []; - /** - * @return int - */ - public function getId() + /** @var Report */ + protected $report; + + public function __construct(string $name, string $action, array $config, Report $report) { - return $this->id; + $this->action = $action; + $this->config = $config; + ksort($this->config); + + $this + ->setName($name) + ->setReport($report) + ->setUuid(Uuid::fromBytes($this->getChecksum())); } /** - * @param int $id + * Create schedule from the given model + * + * @param Model\Schedule $scheduleModel * - * @return $this + * @return static */ - public function setId($id) + + public static function fromModel(Model\Schedule $scheduleModel, Report $report): self { - $this->id = $id; + $config = Json::decode($scheduleModel->config ?? [], true); + $schedule = new static("Schedule{$scheduleModel->id}", $scheduleModel->action, $config, $report); + $schedule->id = $scheduleModel->id; - return $this; + return $schedule; } /** + * Get the id of this schedule + * * @return int */ - public function getReportId() + public function getId(): int { - return $this->reportId; + return $this->id; } /** - * @param int $id + * Get the action hook class of this schedule * - * @return $this - */ - public function setReportId($id) - { - $this->reportId = $id; - - return $this; - } - - /** - * @return \DateTime + * @return string */ - public function getStart() + public function getAction(): string { - return $this->start; + return $this->action; } /** - * @param \DateTime $start + * Get the config of this schedule * - * @return $this + * @return array */ - public function setStart(\DateTime $start) + public function getConfig(): array { - $this->start = $start; - - return $this; + return $this->config; } /** - * @return string + * Get the report this schedule belongs to + * + * @return Report */ - public function getFrequency() + public function getReport(): Report { - return $this->frequency; + return $this->report; } /** - * @param string $frequency + * Set the report this schedule belongs to * - * @return $this + * @param Report $report + * + * @return $this */ - public function setFrequency($frequency) + public function setReport(Report $report): self { - $this->frequency = $frequency; + $this->report = $report; return $this; } /** + * Get the checksum of this schedule + * * @return string */ - public function getAction() + public function getChecksum(): string { - return $this->action; + return md5( + $this->getName() . $this->getReport()->getName() . $this->getAction() . Json::encode($this->getConfig()), + true + ); } - /** - * @param string $action - * - * @return $this - */ - public function setAction($action) + public function run(): ExtendedPromiseInterface { - $this->action = $action; + $deferred = new Promise\Deferred(); + Loop::futureTick(function () use ($deferred) { + $action = $this->getAction(); + /** @var ActionHook $actionHook */ + $actionHook = new $action(); - return $this; - } + try { + $actionHook->execute($this->getReport(), $this->getConfig()); + } catch (Exception $err) { + $deferred->reject($err); - /** - * @return array - */ - public function getConfig() - { - return $this->config; - } + return; + } - /** - * @param array $config - * - * @return $this - */ - public function setConfig(array $config) - { - $this->config = $config; + $deferred->resolve(); + }); - return $this; - } + /** @var ExtendedPromiseInterface $promise */ + $promise = $deferred->promise(); - /** - * @return string - */ - public function getChecksum() - { - return \md5( - $this->getId() - . $this->getReportId() - . $this->getStart()->format('Y-m-d H:i:s') - . $this->getAction() - . $this->getFrequency() - . \json_encode($this->getConfig()) - ); + return $promise; } } |