mirror of
https://github.com/Icinga/icingaweb2-module-businessprocess.git
synced 2025-12-24 00:29:47 -05:00
Do not break overview page if existing business pocesses throw exceptions (#375)
fixes #370
This commit is contained in:
commit
94f5bd75ac
6 changed files with 83 additions and 10 deletions
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
namespace Icinga\Module\Businessprocess\Controllers;
|
namespace Icinga\Module\Businessprocess\Controllers;
|
||||||
|
|
||||||
|
use Exception;
|
||||||
use Icinga\Application\Modules\Module;
|
use Icinga\Application\Modules\Module;
|
||||||
use Icinga\Module\Businessprocess\ProvidedHook\Icingadb\IcingadbSupport;
|
use Icinga\Module\Businessprocess\ProvidedHook\Icingadb\IcingadbSupport;
|
||||||
use Icinga\Module\Businessprocess\Renderer\Breadcrumb;
|
use Icinga\Module\Businessprocess\Renderer\Breadcrumb;
|
||||||
|
|
@ -11,6 +12,8 @@ use Icinga\Module\Businessprocess\State\IcingaDbState;
|
||||||
use Icinga\Module\Businessprocess\State\MonitoringState;
|
use Icinga\Module\Businessprocess\State\MonitoringState;
|
||||||
use Icinga\Module\Businessprocess\Web\Controller;
|
use Icinga\Module\Businessprocess\Web\Controller;
|
||||||
use Icinga\Module\Businessprocess\Web\Url;
|
use Icinga\Module\Businessprocess\Web\Url;
|
||||||
|
use ipl\Html\Html;
|
||||||
|
use ipl\Web\Widget\Link;
|
||||||
|
|
||||||
class NodeController extends Controller
|
class NodeController extends Controller
|
||||||
{
|
{
|
||||||
|
|
@ -24,9 +27,16 @@ class NodeController extends Controller
|
||||||
$name = $this->params->get('name');
|
$name = $this->params->get('name');
|
||||||
$this->addTitle($this->translate('Business Impact (%s)'), $name);
|
$this->addTitle($this->translate('Business Impact (%s)'), $name);
|
||||||
|
|
||||||
|
$brokenFiles = [];
|
||||||
$simulation = Simulation::fromSession($this->session());
|
$simulation = Simulation::fromSession($this->session());
|
||||||
foreach ($this->storage()->listProcessNames() as $configName) {
|
foreach ($this->storage()->listProcessNames() as $configName) {
|
||||||
$config = $this->storage()->loadProcess($configName);
|
try {
|
||||||
|
$config = $this->storage()->loadProcess($configName);
|
||||||
|
} catch (Exception $e) {
|
||||||
|
$meta = $this->storage()->loadMetadata($configName);
|
||||||
|
$brokenFiles[$meta->get('Title')] = $configName;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
$parents = [];
|
$parents = [];
|
||||||
if ($config->hasNode($name)) {
|
if ($config->hasNode($name)) {
|
||||||
|
|
@ -108,5 +118,31 @@ class NodeController extends Controller
|
||||||
if ($content->isEmpty()) {
|
if ($content->isEmpty()) {
|
||||||
$content->add($this->translate('No impact detected. Is this node part of a business process?'));
|
$content->add($this->translate('No impact detected. Is this node part of a business process?'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (! empty($brokenFiles)) {
|
||||||
|
$elem = Html::tag(
|
||||||
|
'ul',
|
||||||
|
['class' => 'broken-files'],
|
||||||
|
tp(
|
||||||
|
'The following business process has an invalid config file and therefore cannot be read:',
|
||||||
|
'The following business processes have invalid config files and therefore cannot be read:',
|
||||||
|
count($brokenFiles)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
foreach ($brokenFiles as $bpName => $fileName) {
|
||||||
|
$elem->addHtml(
|
||||||
|
Html::tag(
|
||||||
|
'li',
|
||||||
|
new Link(
|
||||||
|
sprintf('%s (%s.conf)', $bpName, $fileName),
|
||||||
|
\ipl\Web\Url::fromPath('businessprocess/process/show', ['config' => $fileName])
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$content->addHtml($elem);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
namespace Icinga\Module\Businessprocess\Forms;
|
namespace Icinga\Module\Businessprocess\Forms;
|
||||||
|
|
||||||
|
use Exception;
|
||||||
use Icinga\Module\Businessprocess\BpNode;
|
use Icinga\Module\Businessprocess\BpNode;
|
||||||
use Icinga\Module\Businessprocess\BpConfig;
|
use Icinga\Module\Businessprocess\BpConfig;
|
||||||
use Icinga\Module\Businessprocess\Common\EnumList;
|
use Icinga\Module\Businessprocess\Common\EnumList;
|
||||||
|
|
@ -471,7 +472,13 @@ class AddNodeForm extends QuickForm
|
||||||
|
|
||||||
$bp = $this->bp;
|
$bp = $this->bp;
|
||||||
if ($differentFile) {
|
if ($differentFile) {
|
||||||
$bp = $this->storage->loadProcess($file);
|
try {
|
||||||
|
$bp = $this->storage->loadProcess($file);
|
||||||
|
} catch (Exception $e) {
|
||||||
|
$this->addError('Cannot add invalid config file');
|
||||||
|
|
||||||
|
return $list;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($bp->getNodes() as $node) {
|
foreach ($bp->getNodes() as $node) {
|
||||||
|
|
|
||||||
|
|
@ -3,10 +3,12 @@
|
||||||
namespace Icinga\Module\Businessprocess\Web\Component;
|
namespace Icinga\Module\Businessprocess\Web\Component;
|
||||||
|
|
||||||
use Icinga\Module\Businessprocess\BpConfig;
|
use Icinga\Module\Businessprocess\BpConfig;
|
||||||
use Icinga\Web\Url;
|
|
||||||
use ipl\Html\BaseHtmlElement;
|
use ipl\Html\BaseHtmlElement;
|
||||||
use ipl\Html\Html;
|
use ipl\Html\Html;
|
||||||
use ipl\Html\Text;
|
use ipl\Html\Text;
|
||||||
|
use ipl\Web\Url;
|
||||||
|
use ipl\Web\Widget\Icon;
|
||||||
|
use ipl\Web\Widget\Link;
|
||||||
|
|
||||||
class BpDashboardTile extends BaseHtmlElement
|
class BpDashboardTile extends BaseHtmlElement
|
||||||
{
|
{
|
||||||
|
|
@ -16,14 +18,10 @@ class BpDashboardTile extends BaseHtmlElement
|
||||||
|
|
||||||
public function __construct(BpConfig $bp, $title, $description, $icon, $url, $urlParams = null, $attributes = null)
|
public function __construct(BpConfig $bp, $title, $description, $icon, $url, $urlParams = null, $attributes = null)
|
||||||
{
|
{
|
||||||
if (! isset($attributes['href'])) {
|
|
||||||
$attributes['href'] = Url::fromPath($url, $urlParams ?: []);
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->add(Html::tag(
|
$this->add(Html::tag(
|
||||||
'div',
|
'div',
|
||||||
['class' => 'bp-link', 'data-base-target' => '_main'],
|
['class' => 'bp-link', 'data-base-target' => '_main'],
|
||||||
Html::tag('a', $attributes, Html::tag('i', ['class' => 'icon icon-' . $icon]))
|
(new Link(new Icon($icon), Url::fromPath($url, $urlParams ?: []), $attributes))
|
||||||
->add(Html::tag('span', ['class' => 'header'], $title))
|
->add(Html::tag('span', ['class' => 'header'], $title))
|
||||||
->add($description)
|
->add($description)
|
||||||
));
|
));
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,10 @@
|
||||||
|
|
||||||
namespace Icinga\Module\Businessprocess\Web\Component;
|
namespace Icinga\Module\Businessprocess\Web\Component;
|
||||||
|
|
||||||
|
use Exception;
|
||||||
use Icinga\Application\Modules\Module;
|
use Icinga\Application\Modules\Module;
|
||||||
use Icinga\Authentication\Auth;
|
use Icinga\Authentication\Auth;
|
||||||
|
use Icinga\Module\Businessprocess\BpConfig;
|
||||||
use Icinga\Module\Businessprocess\ProvidedHook\Icingadb\IcingadbSupport;
|
use Icinga\Module\Businessprocess\ProvidedHook\Icingadb\IcingadbSupport;
|
||||||
use Icinga\Module\Businessprocess\State\IcingaDbState;
|
use Icinga\Module\Businessprocess\State\IcingaDbState;
|
||||||
use Icinga\Module\Businessprocess\State\MonitoringState;
|
use Icinga\Module\Businessprocess\State\MonitoringState;
|
||||||
|
|
@ -92,7 +94,20 @@ class Dashboard extends BaseHtmlElement
|
||||||
$title = $name;
|
$title = $name;
|
||||||
}
|
}
|
||||||
|
|
||||||
$bp = $storage->loadProcess($name);
|
try {
|
||||||
|
$bp = $storage->loadProcess($name);
|
||||||
|
} catch (Exception $e) {
|
||||||
|
$this->add(new BpDashboardTile(
|
||||||
|
new BpConfig(),
|
||||||
|
$title,
|
||||||
|
sprintf(t('File %s has invalid config'), $name . '.conf'),
|
||||||
|
'file-circle-xmark',
|
||||||
|
'businessprocess/process/show',
|
||||||
|
['config' => $name]
|
||||||
|
));
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (Module::exists('icingadb') &&
|
if (Module::exists('icingadb') &&
|
||||||
(! $bp->hasBackendName() && IcingadbSupport::useIcingaDbAsBackend())
|
(! $bp->hasBackendName() && IcingadbSupport::useIcingaDbAsBackend())
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ namespace Icinga\Module\Businessprocess\Web\Component;
|
||||||
use Icinga\Web\Url;
|
use Icinga\Web\Url;
|
||||||
use ipl\Html\BaseHtmlElement;
|
use ipl\Html\BaseHtmlElement;
|
||||||
use ipl\Html\Html;
|
use ipl\Html\Html;
|
||||||
|
use ipl\Web\Widget\Icon;
|
||||||
|
|
||||||
class DashboardAction extends BaseHtmlElement
|
class DashboardAction extends BaseHtmlElement
|
||||||
{
|
{
|
||||||
|
|
@ -19,7 +20,7 @@ class DashboardAction extends BaseHtmlElement
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->add(Html::tag('a', $attributes)
|
$this->add(Html::tag('a', $attributes)
|
||||||
->add(Html::tag('i', ['class' => 'icon icon-' . $icon]))
|
->add(new Icon($icon))
|
||||||
->add(Html::tag('span', ['class' => 'header'], $title))
|
->add(Html::tag('span', ['class' => 'header'], $title))
|
||||||
->add($description));
|
->add($description));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -288,6 +288,22 @@ ul.bp {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ** Node inspect broken files **/
|
||||||
|
ul.broken-files {
|
||||||
|
.rounded-corners();
|
||||||
|
padding: 1em;
|
||||||
|
margin: 1em 0;
|
||||||
|
border: 2px solid @state-warning;
|
||||||
|
font-size: 1.25em;
|
||||||
|
list-style: none;
|
||||||
|
|
||||||
|
li {
|
||||||
|
padding-left: 1em;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ** END Node inspect broken files **/
|
||||||
|
|
||||||
/** BEGIN Dashboard **/
|
/** BEGIN Dashboard **/
|
||||||
.overview-dashboard {
|
.overview-dashboard {
|
||||||
.header {
|
.header {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue