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:
parent
743997cb57
commit
b954336170
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue