summaryrefslogtreecommitdiffstats
path: root/library/Director/Objects/DirectorDeploymentLog.php
diff options
context:
space:
mode:
Diffstat (limited to 'library/Director/Objects/DirectorDeploymentLog.php')
-rw-r--r--library/Director/Objects/DirectorDeploymentLog.php199
1 files changed, 199 insertions, 0 deletions
diff --git a/library/Director/Objects/DirectorDeploymentLog.php b/library/Director/Objects/DirectorDeploymentLog.php
new file mode 100644
index 0000000..0794a3c
--- /dev/null
+++ b/library/Director/Objects/DirectorDeploymentLog.php
@@ -0,0 +1,199 @@
+<?php
+
+namespace Icinga\Module\Director\Objects;
+
+use Exception;
+use Icinga\Exception\NotFoundError;
+use Icinga\Module\Director\Core\CoreApi;
+use Icinga\Module\Director\Data\Db\DbObject;
+use Icinga\Module\Director\Db;
+use Icinga\Module\Director\IcingaConfig\IcingaConfig;
+use Icinga\Module\Director\Util;
+
+class DirectorDeploymentLog extends DbObject
+{
+ protected $table = 'director_deployment_log';
+
+ protected $keyName = 'id';
+
+ protected $autoincKeyName = 'id';
+
+ protected $config;
+
+ protected $defaultProperties = [
+ 'id' => null,
+ 'config_checksum' => null,
+ 'last_activity_checksum' => null,
+ 'peer_identity' => null,
+ 'start_time' => null,
+ 'end_time' => null,
+ 'abort_time' => null,
+ 'duration_connection' => null,
+ 'duration_dump' => null,
+ 'stage_name' => null,
+ 'stage_collected' => null,
+ 'connection_succeeded' => null,
+ 'dump_succeeded' => null,
+ 'startup_succeeded' => null,
+ 'username' => null,
+ 'startup_log' => null,
+ ];
+
+ protected $binaryProperties = [
+ 'config_checksum',
+ 'last_activity_checksum'
+ ];
+
+ public function getConfigHexChecksum()
+ {
+ return bin2hex($this->config_checksum);
+ }
+
+ public function getConfig()
+ {
+ if ($this->config === null) {
+ $this->config = IcingaConfig::load($this->config_checksum, $this->connection);
+ }
+
+ return $this->config;
+ }
+
+ public function isPending()
+ {
+ return $this->dump_succeeded === 'y' && $this->startup_log === null;
+ }
+
+ public function succeeded()
+ {
+ return $this->startup_succeeded === 'y';
+ }
+
+ public function configEquals(IcingaConfig $config)
+ {
+ return $this->config_checksum === $config->getChecksum();
+ }
+
+ public function getDeploymentTimestamp()
+ {
+ return strtotime($this->start_time);
+ }
+
+ public static function hasDeployments(Db $connection)
+ {
+ $db = $connection->getDbAdapter();
+ $query = $db->select()->from(
+ 'director_deployment_log',
+ array('c' => 'COUNT(*)')
+ );
+
+ return (int) $db->fetchOne($query) > 0;
+ }
+
+ public static function getConfigChecksumForStageName(Db $connection, $stage)
+ {
+ if ($stage === null) {
+ return null;
+ }
+ $db = $connection->getDbAdapter();
+ $query = $db->select()
+ ->from(
+ array('l' => 'director_deployment_log'),
+ array('c' => $connection->dbHexFunc('l.config_checksum'))
+ )->where('l.stage_name = ?');
+
+ return $db->fetchOne($query, $stage);
+ }
+
+ /**
+ * @param Db $connection
+ * @return DirectorDeploymentLog
+ * @throws NotFoundError
+ */
+ public static function loadLatest(Db $connection)
+ {
+ $db = $connection->getDbAdapter();
+ $query = $db->select()->from(
+ array('l' => 'director_deployment_log'),
+ array('id' => 'MAX(l.id)')
+ );
+
+ return static::load($db->fetchOne($query), $connection);
+ }
+
+ /**
+ * @param Db $connection
+ * @return ?DirectorDeploymentLog
+ */
+ public static function optionalLatest(Db $connection)
+ {
+ try {
+ return static::loadLatest($connection);
+ } catch (NotFoundError $exception) {
+ return null;
+ }
+ }
+
+ /**
+ * @param CoreApi $api
+ * @param Db $connection
+ * @return DirectorDeploymentLog
+ */
+ public static function getRelatedToActiveStage(CoreApi $api, Db $connection)
+ {
+ try {
+ return static::requireRelatedToActiveStage($api, $connection);
+ } catch (Exception $e) {
+ return null;
+ }
+ }
+
+ /**
+ * @param CoreApi $api
+ * @param Db $connection
+ * @return DirectorDeploymentLog
+ * @throws NotFoundError
+ */
+ public static function requireRelatedToActiveStage(CoreApi $api, Db $connection)
+ {
+ $stage = $api->getActiveStageName();
+
+ if (! strlen($stage)) {
+ throw new NotFoundError('Got no active stage name');
+ }
+ $db = $connection->getDbAdapter();
+ $query = $db->select()->from(
+ ['l' => 'director_deployment_log'],
+ ['id' => 'MAX(l.id)']
+ )->where('l.stage_name = ?', $stage);
+
+ return static::load($db->fetchOne($query), $connection);
+ }
+
+ /**
+ * @return static[]
+ */
+ public static function getUncollected(Db $connection)
+ {
+ $db = $connection->getDbAdapter();
+ $query = $db->select()
+ ->from('director_deployment_log')
+ ->where('stage_name IS NOT NULL')
+ ->where('stage_collected IS NULL')
+ ->where('startup_succeeded IS NULL')
+ ->order('stage_name');
+
+ return static::loadAll($connection, $query, 'stage_name');
+ }
+
+ public static function hasUncollected(Db $connection)
+ {
+ $db = $connection->getDbAdapter();
+ $query = $db->select()
+ ->from('director_deployment_log', ['cnt' => 'COUNT(*)'])
+ ->where('stage_name IS NOT NULL')
+ ->where('stage_collected IS NULL')
+ ->where('startup_succeeded IS NULL');
+
+ return $db->fetchOne($query) > 0;
+ }
+}