From 86b2cebb84b9352c3686d594008d6badd5eba4fe Mon Sep 17 00:00:00 2001 From: raviks789 Date: Thu, 31 Oct 2024 12:33:56 +0100 Subject: [PATCH] fix: resolve JM's review --- .../Icingadb/Widget/Detail/ObjectDetail.php | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/library/Icingadb/Widget/Detail/ObjectDetail.php b/library/Icingadb/Widget/Detail/ObjectDetail.php index 86ddc2a74..064fb1f02 100644 --- a/library/Icingadb/Widget/Detail/ObjectDetail.php +++ b/library/Icingadb/Widget/Detail/ObjectDetail.php @@ -21,6 +21,7 @@ use Icinga\Module\Icingadb\Common\Macros; use Icinga\Module\Icingadb\Compat\CompatHost; use Icinga\Module\Icingadb\Model\CustomvarFlat; +use Icinga\Module\Icingadb\Model\DependencyEdge; use Icinga\Module\Icingadb\Model\DependencyNode; use Icinga\Module\Icingadb\Model\Service; use Icinga\Module\Icingadb\Model\UnreachableParent; @@ -38,6 +39,8 @@ use Icinga\Module\Icingadb\Util\PluginOutput; use Icinga\Module\Icingadb\Widget\ItemList\DowntimeList; use Icinga\Module\Icingadb\Widget\ShowMore; +use ipl\Sql\Expression; +use ipl\Sql\Filter\Exists; use ipl\Web\Widget\CopyToClipboard; use ipl\Web\Widget\EmptyState; use ipl\Web\Widget\HorizontalKeyValue; @@ -692,15 +695,39 @@ protected function createAffectedObjects(): ?array 'host.state.last_state_change', 'service.state.severity', 'service.state.last_state_change', + 'redundancy_group.state.failed', 'redundancy_group.state.last_state_change' ], SORT_DESC); + $failedEdges = DependencyEdge::on($this->getDb()) + ->utilize('child') + ->columns([new Expression('1')]) + ->filter(Filter::equal('dependency.state.failed', 'y')); + if ($this->object instanceof Host) { - $affectedObjects->filter(Filter::equal('parent.host.id', $this->object->id)); + $failedEdges + ->filter(Filter::equal('parent.host.id', $this->object->id)) + ->filter(Filter::unlike('parent.service.id', '*')); } else { - $affectedObjects->filter(Filter::equal('parent.service.id', $this->object->id)); + $failedEdges->filter(Filter::equal('parent.service.id', $this->object->id)); } + $failedEdges->getFilter()->metaData()->set('forceOptimization', false); + $edgeResolver = $failedEdges->getResolver(); + + $childAlias = $edgeResolver->getAlias( + $edgeResolver->resolveRelation($failedEdges->getModel()->getTableName() . '.child')->getTarget() + ); + + $affectedObjects->filter(new Exists( + $failedEdges->assembleSelect() + ->where( + "$childAlias.id = " + . $affectedObjects->getResolver() + ->qualifyColumn('id', $affectedObjects->getModel()->getTableName()) + ) + )); + $this->applyRestrictions($affectedObjects); return [