170 lines
5.1 KiB
PHP
170 lines
5.1 KiB
PHP
<?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))
|
|
);
|
|
}
|
|
}
|