Icingadb/CustomVarRenderer: Look for the service in all of its types

It can be a directly created service or an applied service or an inherited service or service applied through service set.
This commit is contained in:
raviks789 2024-08-29 13:38:42 +02:00 committed by Johannes Meyer
parent 743997cb57
commit b954336170
1 changed files with 78 additions and 4 deletions

View File

@ -6,9 +6,12 @@ use Icinga\Application\Config;
use Icinga\Exception\ConfigurationError; use Icinga\Exception\ConfigurationError;
use Icinga\Exception\NotFoundError; use Icinga\Exception\NotFoundError;
use Icinga\Module\Director\Db; use Icinga\Module\Director\Db;
use Icinga\Module\Director\Db\AppliedServiceSetLoader;
use Icinga\Module\Director\Objects\IcingaHost; use Icinga\Module\Director\Objects\IcingaHost;
use Icinga\Module\Director\Objects\IcingaService; use Icinga\Module\Director\Objects\IcingaService;
use Icinga\Module\Director\Objects\IcingaTemplateResolver;
use Icinga\Module\Director\Web\Form\IcingaObjectFieldLoader; use Icinga\Module\Director\Web\Form\IcingaObjectFieldLoader;
use Icinga\Module\Director\Web\Table\IcingaHostAppliedServicesTable;
use Icinga\Module\Icingadb\Hook\CustomVarRendererHook; use Icinga\Module\Icingadb\Hook\CustomVarRendererHook;
use Icinga\Module\Icingadb\Model\Host; use Icinga\Module\Icingadb\Model\Host;
use Icinga\Module\Icingadb\Model\Service; use Icinga\Module\Icingadb\Model\Service;
@ -72,11 +75,82 @@ class CustomVarRenderer extends CustomVarRendererHook
try { try {
$directorHostObj = IcingaHost::load($host->name, $db); $directorHostObj = IcingaHost::load($host->name, $db);
$directorServiceObj = null;
if ($service !== null) { if ($service !== null) {
$directorServiceObj = IcingaService::load([ $serviceOrigin = ['direct', 'applied', 'inherited', 'service-set'];
$serviceName = $service->name;
$i = 0;
do {
if ($i > 3) {
return false;
} elseif ($serviceOrigin[$i] === 'direct') {
$directorServiceObj = IcingaService::loadOptional([
'host_id' => $directorHostObj->get('id'), 'host_id' => $directorHostObj->get('id'),
'object_name' => $service->name 'object_name' => $serviceName
], $db); ], $db);
} elseif ($serviceOrigin[$i] === 'inherited') {
$templateResolver = new IcingaTemplateResolver($directorHostObj);
$parentIds = $templateResolver->listParentIds();
$query = $db->getDbAdapter()->select()->from('icinga_service')
->where('object_name = ?', $serviceName)
->where('host_id IN (?)', $parentIds);
$directorServices = IcingaService::loadAll(
$db,
$query,
'object_name'
);
$directorServiceObj = current($directorServices);
} elseif ($serviceOrigin[$i] === 'applied') {
$appliedFilterQuery = IcingaHostAppliedServicesTable::load($directorHostObj)->getQuery();
foreach ($appliedFilterQuery->fetchAll() as $appliedService) {
if ($appliedService->name === $serviceName) {
$query = $db->getDbAdapter()->select()->from('icinga_service')
->where('object_name = ?', $serviceName)
->where("object_type = 'apply'")
->where('assign_filter = ?', $appliedService->assign_filter);
$directorAppliedServices = IcingaService::loadAll(
$db,
$query,
'object_name'
);
$directorServiceObj = current($directorAppliedServices);
break;
}
}
} elseif ($serviceOrigin[$i] === 'service-set') {
$templateResolver = new IcingaTemplateResolver($directorHostObj);
$hostServiceSets = $directorHostObj->fetchServiceSets()
+ AppliedServiceSetLoader::fetchForHost($directorHostObj);
$parents = $templateResolver->fetchParents();
foreach ($parents as $parent) {
$hostServiceSets += $parent->fetchServiceSets();
$hostServiceSets += AppliedServiceSetLoader::fetchForHost($parent);
}
foreach ($hostServiceSets as $hostServiceSet) {
foreach ($hostServiceSet->getServiceObjects() as $setServiceObject) {
if ($setServiceObject->getObjectName() === $serviceName) {
$directorServiceObj = $setServiceObject;
break 2;
}
}
}
}
$i++;
} while (! $directorServiceObj);
} }
} catch (NotFoundError $_) { } catch (NotFoundError $_) {
return false; return false;