-
Notifications
You must be signed in to change notification settings - Fork 22
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add redundancy group detail view #1079
base: dependencies
Are you sure you want to change the base?
Changes from all commits
e426edd
db77a90
31264a3
791bc9b
f310b48
a81be5d
c462879
89c2405
7332d2c
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,349 @@ | ||
<?php | ||
|
||
/* Icinga DB Web | (c) 2024 Icinga GmbH | GPLv2 */ | ||
|
||
namespace Icinga\Module\Icingadb\Controllers; | ||
|
||
use Icinga\Exception\NotFoundError; | ||
use Icinga\Module\Icingadb\Common\CommandActions; | ||
use Icinga\Module\Icingadb\Data\DependencyNodes; | ||
use Icinga\Module\Icingadb\Model\DependencyNode; | ||
use Icinga\Module\Icingadb\Model\RedundancyGroup; | ||
use Icinga\Module\Icingadb\Model\RedundancyGroupSummary; | ||
use Icinga\Module\Icingadb\Web\Control\SearchBar\ObjectSuggestions; | ||
use Icinga\Module\Icingadb\Web\Control\ViewModeSwitcher; | ||
use Icinga\Module\Icingadb\Web\Controller; | ||
use Icinga\Module\Icingadb\Widget\Detail\MultiselectQuickActions; | ||
use Icinga\Module\Icingadb\Widget\Detail\RedundancyGroupDetail; | ||
use Icinga\Module\Icingadb\Widget\Detail\RedundancyGroupHeader; | ||
use Icinga\Module\Icingadb\Widget\ItemList\DependencyNodeList; | ||
use ipl\Html\HtmlElement; | ||
use ipl\Html\Text; | ||
use ipl\Orm\Query; | ||
use ipl\Stdlib\Filter; | ||
use ipl\Web\Control\LimitControl; | ||
use ipl\Web\Control\SortControl; | ||
use ipl\Web\Url; | ||
use ipl\Web\Widget\Tabs; | ||
|
||
class RedundancygroupController extends Controller | ||
{ | ||
use CommandActions; | ||
|
||
/** @var string */ | ||
protected $groupId; | ||
|
||
/** @var RedundancyGroup */ | ||
protected $group; | ||
|
||
public function init(): void | ||
{ | ||
// in case of quick actions, param id is not given | ||
$groupId = $this->params->shift('child.redundancy_group.id'); | ||
if ($groupId === null) { | ||
$groupId = $this->params->shiftRequired('id'); | ||
} | ||
|
||
$this->groupId = $groupId; | ||
Check failure on line 47 in application/controllers/RedundancygroupController.php GitHub Actions / phpstan / Static analysis with phpstan and php 7.3 on ubuntu-latest
Check failure on line 47 in application/controllers/RedundancygroupController.php GitHub Actions / phpstan / Static analysis with phpstan and php 7.2 on ubuntu-latest
|
||
} | ||
|
||
/** | ||
* Load the redundancy group | ||
*/ | ||
protected function loadGroup(): void | ||
{ | ||
$query = RedundancyGroup::on($this->getDb()) | ||
->with(['state']) | ||
->filter(Filter::equal('id', $this->groupId)); | ||
|
||
$this->applyRestrictions($query); | ||
|
||
$this->group = $query->first(); | ||
Check failure on line 61 in application/controllers/RedundancygroupController.php GitHub Actions / phpstan / Static analysis with phpstan and php 7.3 on ubuntu-latest
Check failure on line 61 in application/controllers/RedundancygroupController.php GitHub Actions / phpstan / Static analysis with phpstan and php 7.2 on ubuntu-latest
|
||
|
||
if ($this->group === null) { | ||
throw new NotFoundError($this->translate('Redundancy Group not found')); | ||
} | ||
|
||
$this->setTitleTab($this->getRequest()->getActionName()); | ||
$this->setTitle($this->group->display_name); | ||
|
||
$summary = RedundancyGroupSummary::on($this->getDb()) | ||
->filter(Filter::equal('id', $this->groupId)); | ||
|
||
$this->applyRestrictions($summary); | ||
|
||
$this->addControl(new RedundancyGroupHeader($this->group, $summary->first())); | ||
Check failure on line 75 in application/controllers/RedundancygroupController.php GitHub Actions / phpstan / Static analysis with phpstan and php 7.3 on ubuntu-latest
Check failure on line 75 in application/controllers/RedundancygroupController.php GitHub Actions / phpstan / Static analysis with phpstan and php 7.2 on ubuntu-latest
|
||
} | ||
|
||
public function indexAction(): void | ||
{ | ||
$this->loadGroup(); | ||
$summary = RedundancyGroupSummary::on($this->getDb()) | ||
->filter(Filter::equal('id', $this->groupId)); | ||
|
||
$this->filter($summary); | ||
|
||
$this->addControl( | ||
(new MultiselectQuickActions('dependency_node', $summary->first())) | ||
->setBaseFilter(Filter::equal('child.redundancy_group.id', $this->groupId)) | ||
->allowToProcessCheckResults(false) | ||
->setColumnPrefix('nodes') | ||
->setUrlPath('icingadb/redundancygroup') | ||
); | ||
|
||
$this->addContent(new RedundancyGroupDetail($this->group)); | ||
} | ||
|
||
public function membersAction(): void | ||
{ | ||
$this->loadGroup(); | ||
$nodesQuery = $this->fetchNodes(true); | ||
|
||
$limitControl = $this->createLimitControl(); | ||
$paginationControl = $this->createPaginationControl($nodesQuery); | ||
$sortControl = $this->createSortControl($nodesQuery); | ||
$viewModeSwitcher = $this->createViewModeSwitcher($paginationControl, $limitControl); | ||
|
||
$searchBar = $this->createSearchBar( | ||
$nodesQuery, | ||
Url::fromPath('icingadb/redundancygroup/members', ['id' => $this->groupId]), | ||
[ | ||
$limitControl->getLimitParam(), | ||
$sortControl->getSortParam(), | ||
$viewModeSwitcher->getViewModeParam(), | ||
'id' | ||
] | ||
); | ||
|
||
if ($searchBar->hasBeenSent() && ! $searchBar->isValid()) { | ||
if ($searchBar->hasBeenSubmitted()) { | ||
$filter = $this->getFilter(); | ||
} else { | ||
$this->addControl($searchBar); | ||
$this->sendMultipartUpdate(); | ||
return; | ||
} | ||
} else { | ||
$filter = $searchBar->getFilter(); | ||
} | ||
|
||
$nodesQuery->filter($filter); | ||
|
||
$this->addControl($paginationControl); | ||
$this->addControl($sortControl); | ||
$this->addControl($limitControl); | ||
$this->addControl($viewModeSwitcher); | ||
$this->addControl($searchBar); | ||
|
||
$this->addContent( | ||
(new DependencyNodeList($nodesQuery->execute())) | ||
->setViewMode($viewModeSwitcher->getViewMode()) | ||
); | ||
|
||
if (! $searchBar->hasBeenSubmitted() && $searchBar->hasBeenSent()) { | ||
$this->sendMultipartUpdate(); | ||
} | ||
|
||
$this->setAutorefreshInterval(10); | ||
} | ||
|
||
public function childrenAction(): void | ||
{ | ||
$this->loadGroup(); | ||
$nodesQuery = $this->fetchNodes(); | ||
|
||
$limitControl = $this->createLimitControl(); | ||
$paginationControl = $this->createPaginationControl($nodesQuery); | ||
$sortControl = $this->createSortControl($nodesQuery); | ||
$viewModeSwitcher = $this->createViewModeSwitcher($paginationControl, $limitControl); | ||
|
||
$searchBar = $this->createSearchBar( | ||
$nodesQuery, | ||
Url::fromPath('icingadb/redundancygroup/children', ['id' => $this->groupId]), | ||
[ | ||
$limitControl->getLimitParam(), | ||
$sortControl->getSortParam(), | ||
$viewModeSwitcher->getViewModeParam(), | ||
'id' | ||
] | ||
); | ||
|
||
$searchBar->getSuggestionUrl()->setParam('isChildrenTab'); | ||
$searchBar->getEditorUrl()->setParam('isChildrenTab'); | ||
|
||
if ($searchBar->hasBeenSent() && ! $searchBar->isValid()) { | ||
if ($searchBar->hasBeenSubmitted()) { | ||
$filter = $this->getFilter(); | ||
} else { | ||
$this->addControl($searchBar); | ||
$this->sendMultipartUpdate(); | ||
return; | ||
} | ||
} else { | ||
$filter = $searchBar->getFilter(); | ||
} | ||
|
||
$nodesQuery->filter($filter); | ||
|
||
$this->addControl($paginationControl); | ||
$this->addControl($sortControl); | ||
$this->addControl($limitControl); | ||
$this->addControl($viewModeSwitcher); | ||
$this->addControl($searchBar); | ||
|
||
$this->addContent( | ||
(new DependencyNodeList($nodesQuery->execute())) | ||
->setViewMode($viewModeSwitcher->getViewMode()) | ||
); | ||
|
||
if (! $searchBar->hasBeenSubmitted() && $searchBar->hasBeenSent()) { | ||
$this->sendMultipartUpdate(); | ||
} | ||
|
||
$this->setAutorefreshInterval(10); | ||
} | ||
|
||
public function completeAction(): void | ||
{ | ||
$isChildrenTab = $this->params->shift('isChildrenTab'); | ||
$column = $isChildrenTab ? 'parent' : 'child'; | ||
|
||
$suggestions = (new ObjectSuggestions()) | ||
->setModel(DependencyNode::class) | ||
->setBaseFilter(Filter::equal("$column.redundancy_group.id", $this->groupId)) | ||
->forRequest($this->getServerRequest()); | ||
|
||
$this->getDocument()->add($suggestions); | ||
} | ||
|
||
public function searchEditorAction(): void | ||
{ | ||
$isChildrenTab = $this->params->shift('isChildrenTab'); | ||
$redirectUrl = $isChildrenTab | ||
? Url::fromPath('icingadb/redundancygroup/children', ['id' => $this->groupId]) | ||
: Url::fromPath('icingadb/redundancygroup/members', ['id' => $this->groupId]); | ||
|
||
$editor = $this->createSearchEditor( | ||
DependencyNode::on($this->getDb()), | ||
$redirectUrl, | ||
[ | ||
LimitControl::DEFAULT_LIMIT_PARAM, | ||
SortControl::DEFAULT_SORT_PARAM, | ||
ViewModeSwitcher::DEFAULT_VIEW_MODE_PARAM, | ||
'id' | ||
] | ||
); | ||
|
||
if ($isChildrenTab) { | ||
$editor->getSuggestionUrl()->setParam('isChildrenTab'); | ||
Check failure on line 238 in application/controllers/RedundancygroupController.php GitHub Actions / phpstan / Static analysis with phpstan and php 7.3 on ubuntu-latest
|
||
} | ||
|
||
$this->getDocument()->add($editor); | ||
$this->setTitle($this->translate('Adjust Filter')); | ||
} | ||
|
||
protected function createTabs(): Tabs | ||
{ | ||
$tabs = $this->getTabs() | ||
->add('index', [ | ||
'label' => $this->translate('Redundancy Group'), | ||
'url' => Url::fromPath('icingadb/redundancygroup', ['id' => $this->groupId]) | ||
]) | ||
->add('members', [ | ||
'label' => $this->translate('Members'), | ||
'url' => Url::fromPath('icingadb/redundancygroup/members', ['id' => $this->groupId]) | ||
]) | ||
->add('children', [ | ||
'label' => $this->translate('Children'), | ||
'url' => Url::fromPath('icingadb/redundancygroup/children', ['id' => $this->groupId]) | ||
]); | ||
|
||
return $tabs; | ||
} | ||
|
||
protected function setTitleTab(string $name): void | ||
{ | ||
$tab = $this->createTabs()->get($name); | ||
|
||
if ($tab !== null) { | ||
$this->getTabs()->activate($name); | ||
} | ||
} | ||
|
||
public function createSortControl(Query $query, array $columns = null): SortControl | ||
Check failure on line 273 in application/controllers/RedundancygroupController.php GitHub Actions / phpstan / Static analysis with phpstan and php 7.3 on ubuntu-latest
Check failure on line 273 in application/controllers/RedundancygroupController.php GitHub Actions / phpstan / Static analysis with phpstan and php 7.2 on ubuntu-latest
|
||
{ | ||
$sortRules = [ | ||
'host.display_name, service.display_name, redundancy_group.display_name' => $this->translate('Name'), | ||
'service.state.severity desc, service.state.last_state_change desc, ' | ||
. 'host.state.severity desc, host.state.last_state_change desc, ' | ||
. 'redundancy_group.state.failed desc, redundancy_group.state.last_state_change desc' => $this->translate( | ||
'Severity' | ||
), | ||
'service.state.soft_state, host.state.soft_state, redundancy_group.state.failed' => $this->translate( | ||
'Current State' | ||
), | ||
'service.state.last_state_change desc, host.state.last_state_change desc, ' | ||
. 'redundancy_group.state.last_state_change desc' => $this->translate('Last State Change') | ||
]; | ||
|
||
return parent::createSortControl($query, $sortRules); | ||
} | ||
|
||
/** | ||
* Fetch the nodes for the current group | ||
* | ||
* @param bool $fetchParents Whether to fetch the parents or the children | ||
* | ||
* @return Query | ||
*/ | ||
private function fetchNodes(bool $fetchParents = false): Query | ||
{ | ||
$filterColumn = sprintf( | ||
'%s.redundancy_group.id', | ||
$fetchParents ? 'child' : 'parent' | ||
); | ||
|
||
return DependencyNode::on($this->getDb()) | ||
->with([ | ||
'host', | ||
'host.state', | ||
'service', | ||
'service.state', | ||
'service.host', | ||
'service.host.state' | ||
]) | ||
->filter(Filter::equal($filterColumn, $this->groupId)); | ||
} | ||
|
||
protected function fetchCommandTargets() | ||
Check failure on line 318 in application/controllers/RedundancygroupController.php GitHub Actions / phpstan / Static analysis with phpstan and php 7.3 on ubuntu-latest
Check failure on line 318 in application/controllers/RedundancygroupController.php GitHub Actions / phpstan / Static analysis with phpstan and php 7.2 on ubuntu-latest
|
||
{ | ||
$filter = Filter::all(Filter::equal('child.redundancy_group.id', $this->groupId)); | ||
|
||
if ($this->getRequest()->getActionName() === 'acknowledge') { | ||
$filter->add( | ||
Filter::any( | ||
Filter::all( | ||
Filter::unlike('child.service.id', '*'), | ||
Filter::equal('host.state.is_problem', 'y'), | ||
Filter::equal('host.state.is_acknowledged', 'n') | ||
), | ||
Filter::all( | ||
Filter::equal('service.state.is_problem', 'y'), | ||
Filter::equal('service.state.is_acknowledged', 'n') | ||
) | ||
) | ||
); | ||
} | ||
|
||
return new DependencyNodes($filter); | ||
} | ||
|
||
protected function getCommandTargetsUrl(): Url | ||
{ | ||
return Url::fromPath('icingadb/redundancygroup', ['id' => $this->groupId]); | ||
} | ||
|
||
public function processCheckresultAction(): void | ||
{ | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
override the process check result action, it won't work after all and isn't provided in the quick action bar