icingaweb2-module-businessp.../library/Businessprocess/Web/Form/Validator/HostServiceTermValidator.php
Sukhwinder Dhillon f4d704fbd5 Fix: Switching to the icingadb backend and searching host/service node in add/edit form throws an error
`HostServiceTermValidator`: `$testConfig` requires backend for `MonitoringState::apply()` call.

If the `$testConfig` has no backend set and icingadb is in use, `MonitoringState::__construct($config) => $config->getBackend()` returns an icingadb backend that is not suitable for the `MonitoringState` class.
2024-03-27 08:47:02 +01:00

97 lines
2.9 KiB
PHP

<?php
namespace Icinga\Module\Businessprocess\Web\Form\Validator;
use Icinga\Module\Businessprocess\BpConfig;
use Icinga\Module\Businessprocess\BpNode;
use Icinga\Module\Businessprocess\ServiceNode;
use Icinga\Module\Businessprocess\State\IcingaDbState;
use Icinga\Module\Businessprocess\State\MonitoringState;
use Icinga\Module\Monitoring\Backend\MonitoringBackend;
use ipl\I18n\Translation;
use ipl\Validator\BaseValidator;
use ipl\Web\FormElement\TermInput\Term;
use LogicException;
class HostServiceTermValidator extends BaseValidator
{
use Translation;
/** @var ?BpNode */
protected $parent;
/**
* Set the affected process
*
* @param BpNode $parent
*
* @return $this
*/
public function setParent(BpNode $parent): self
{
$this->parent = $parent;
return $this;
}
public function isValid($terms)
{
if ($this->parent === null) {
throw new LogicException('Missing parent process. Cannot validate terms.');
}
if (! is_array($terms)) {
$terms = [$terms];
}
$isValid = true;
$testConfig = (new BpConfig())
->setBackend($this->parent->getBpConfig()->getBackend());
foreach ($terms as $term) {
/** @var Term $term */
[$hostName, $serviceName] = BpConfig::splitNodeName($term->getSearchValue());
if ($serviceName !== null && $serviceName !== 'Hoststatus') {
$node = $testConfig->createService($hostName, $serviceName);
} else {
$node = $testConfig->createHost($hostName);
if ($serviceName === null) {
$term->setSearchValue(BpConfig::joinNodeName($hostName, 'Hoststatus'));
}
}
if ($this->parent->hasChild($term->getSearchValue())) {
$term->setMessage($this->translate('Already defined in this process'));
$isValid = false;
} else {
$testConfig->getNode('__unbound__')
->addChild($node);
}
}
if ($testConfig->getBackend() instanceof MonitoringBackend) {
MonitoringState::apply($testConfig);
} else {
IcingaDbState::apply($testConfig);
}
foreach ($terms as $term) {
/** @var Term $term */
$node = $testConfig->getNode($term->getSearchValue());
if ($node->isMissing()) {
if ($node instanceof ServiceNode) {
$term->setMessage($this->translate('Service not found'));
} else {
$term->setMessage($this->translate('Host not found'));
}
$isValid = false;
} else {
$term->setLabel($node->getAlias());
$term->setClass($node->getObjectClassName());
}
}
return $isValid;
}
}