diff options
Diffstat (limited to 'library/Director/Web/Widget/DeploymentInfo.php')
-rw-r--r-- | library/Director/Web/Widget/DeploymentInfo.php | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/library/Director/Web/Widget/DeploymentInfo.php b/library/Director/Web/Widget/DeploymentInfo.php new file mode 100644 index 0000000..110200f --- /dev/null +++ b/library/Director/Web/Widget/DeploymentInfo.php @@ -0,0 +1,169 @@ +<?php + +namespace Icinga\Module\Director\Web\Widget; + +use ipl\Html\HtmlDocument; +use Icinga\Authentication\Auth; +use Icinga\Module\Director\IcingaConfig\IcingaConfig; +use Icinga\Module\Director\Objects\DirectorDeploymentLog; +use Icinga\Module\Director\StartupLogRenderer; +use Icinga\Util\Format; +use Icinga\Web\Request; +use ipl\Html\Html; +use gipfl\IcingaWeb2\Icon; +use gipfl\IcingaWeb2\Link; +use gipfl\Translation\TranslationHelper; +use gipfl\IcingaWeb2\Widget\NameValueTable; +use gipfl\IcingaWeb2\Widget\Tabs; + +class DeploymentInfo extends HtmlDocument +{ + use TranslationHelper; + + /** @var DirectorDeploymentLog */ + protected $deployment; + + /** @var IcingaConfig */ + protected $config; + + /** + * DeploymentInfo constructor. + * @param DirectorDeploymentLog $deployment + */ + public function __construct(DirectorDeploymentLog $deployment) + { + $this->deployment = $deployment; + if ($deployment->get('config_checksum') !== null) { + $this->config = IcingaConfig::load( + $deployment->get('config_checksum'), + $deployment->getConnection() + ); + } + } + + /** + * @param Auth $auth + * @param Request $request + * @return Tabs + */ + public function getTabs(Auth $auth, Request $request) + { + $dep = $this->deployment; + $tabs = new Tabs(); + $tabs->add('deployment', array( + 'label' => $this->translate('Deployment'), + 'url' => $request->getUrl() + ))->activate('deployment'); + + if ($dep->config_checksum !== null && $auth->hasPermission('director/showconfig')) { + $tabs->add('config', array( + 'label' => $this->translate('Config'), + 'url' => 'director/config/files', + 'urlParams' => array( + 'checksum' => $this->config->getHexChecksum(), + 'deployment_id' => $dep->id + ) + )); + } + + return $tabs; + } + + protected function createInfoTable() + { + $dep = $this->deployment; + $table = new NameValueTable(); + $table->addNameValuePairs([ + $this->translate('Deployment time') => $dep->start_time, + $this->translate('Sent to') => $dep->peer_identity, + ]); + if ($this->config !== null) { + $table->addNameValuePairs([ + $this->translate('Configuration') => $this->getConfigDetails(), + $this->translate('Duration') => $this->getDurationInfo(), + ]); + } + $table->addNameValuePairs([ + $this->translate('Stage name') => $dep->stage_name, + $this->translate('Startup') => $this->getStartupInfo() + ]); + + return $table; + } + + protected function getDurationInfo() + { + return sprintf( + $this->translate('Rendered in %0.2fs, deployed in %0.2fs'), + $this->config->getDuration() / 1000, + $this->deployment->duration_dump / 1000 + ); + } + + protected function getConfigDetails() + { + $cfg = $this->config; + $dep = $this->deployment; + + return [ + Link::create( + sprintf($this->translate('%d files'), $cfg->getFileCount()), + 'director/config/files', + [ + 'checksum' => $cfg->getHexChecksum(), + 'deployment_id' => $dep->id + ] + ), + ', ', + sprintf( + $this->translate('%d objects, %d templates, %d apply rules'), + $cfg->getObjectCount(), + $cfg->getTemplateCount(), + $cfg->getApplyCount() + ), + ', ', + Format::bytes($cfg->getSize()) + ]; + } + + protected function getStartupInfo() + { + $dep = $this->deployment; + if ($dep->startup_succeeded === null) { + if ($dep->stage_collected === null) { + return [$this->translate('Unknown, still waiting for config check outcome'), new Icon('spinner')]; + } else { + return [$this->translate('Unknown, failed to collect related information'), new Icon('help')]; + } + } elseif ($dep->startup_succeeded === 'y') { + return $this->colored('green', [$this->translate('Succeeded'), new Icon('ok')]); + } else { + return $this->colored('red', [$this->translate('Failed'), new Icon('cancel')]); + } + } + + protected function colored($color, array $content) + { + return Html::tag('div', ['style' => "color: $color;"], $content)->setSeparator(' '); + } + + public function render() + { + $this->add($this->createInfoTable()); + if ($this->deployment->get('startup_succeeded') !== null) { + $this->addStartupLog(); + } + + return parent::render(); + } + + protected function addStartupLog() + { + $this->add(Html::tag('h2', null, $this->translate('Startup Log'))); + $this->add( + Html::tag('pre', [ + 'class' => 'logfile' + ], new StartupLogRenderer($this->deployment)) + ); + } +} |