Skip to content

Commit

Permalink
Add new Host from Filter and Service from Filter in AddNodeForm.php
Browse files Browse the repository at this point in the history
  • Loading branch information
nilmerg authored and ValeDaRold committed Aug 3, 2021
1 parent 65849bd commit d00cf96
Show file tree
Hide file tree
Showing 2 changed files with 124 additions and 0 deletions.
116 changes: 116 additions & 0 deletions application/forms/AddNodeForm.php
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,12 @@ public function setup()
case 'new-process':
$this->addNewProcess();
break;
case 'hosts_from_filter':
$this->selectHostsFromFilter();
break;
case 'services_from_filter':
$this->selectServicesFromFilter();
break;
case null:
$this->setSubmitLabel($this->translate('Next'));
return;
Expand Down Expand Up @@ -157,6 +163,8 @@ protected function selectNodeType()
if ($this->hasParentNode()) {
$types['host'] = $this->translate('Host');
$types['service'] = $this->translate('Service');
$types['hosts_from_filter'] = $this->translate('Hosts from filter');
$types['services_from_filter'] = $this->translate('Services from filter');
} elseif (! $this->hasProcesses()) {
$this->addElement('hidden', 'node_type', array(
'ignore' => true,
Expand Down Expand Up @@ -248,6 +256,53 @@ protected function addServicesElement($host)
]);
}

protected function addFilteredHostsElement($filter)
{
$this->addElement('submit', 'refresh', [
'label' => $this->translate('Refresh'),
'class' => 'refresh-filter'
]);
$this->addElement('multiselect', 'children', [
'label' => $this->translate('Hosts'),
'required' => true,
'size' => 8,
'style' => 'width: 25em',
'multiOptions' => $this->enumHostListByFilter($filter),
'description' => $this->translate(
'Hosts that should be part of this business process node'
),
'validators' => [[new NoDuplicateChildrenValidator($this, $this->bp, $this->parent), true]]
]);
}

protected function addFilteredServicesElement($filter)
{
$this->addElement('submit', 'refresh', [
'label' => $this->translate('Refresh'),
'class' => 'refresh-filter'
]);
$this->addElement('multiselect', 'children', [
'label' => $this->translate('Services'),
'required' => true,
'size' => 8,
'style' => 'width: 25em',
'multiOptions' => $this->enumServiceListByFilter($filter),
'description' => $this->translate(
'Services that should be part of this business process node'
),
'validators' => [[new NoDuplicateChildrenValidator($this, $this->bp, $this->parent), true]]
]);
}

protected function addFilterElement()
{
$this->addElement('text', 'filter', array(
'label' => $this->translate('Filter'),
'required' => true,
'ignore' => true
));
}

protected function addFileElement()
{
$this->addElement('select', 'file', [
Expand Down Expand Up @@ -301,6 +356,26 @@ protected function addServiceOverrideElement()
]);
}

protected function selectHostsFromFilter()
{
$this->addFilterElement();
if ($filter = $this->getSentValue('filter')) {
$this->addFilteredHostsElement($filter);
} else {
$this->setSubmitLabel($this->translate('Next'));
}
}

protected function selectServicesFromFilter()
{
$this->addFilterElement();
if ($filter = $this->getSentValue('filter')) {
$this->addFilteredServicesElement($filter);
} else {
$this->setSubmitLabel($this->translate('Next'));
}
}

protected function selectProcess()
{
if ($this->hasParentNode()) {
Expand Down Expand Up @@ -463,6 +538,45 @@ protected function enumServiceStateList()
return $serviceStateList;
}

protected function enumHostListByFilter($filter)
{
$names = $this->backend
->select()
->from('hostStatus', ['hostname' => 'host_name'])
->applyFilter($this->getCustomFilterWithRestriction('monitoring/filter/objects', $filter))
->order('host_name')
->getQuery()
->fetchColumn();

// fetchPairs doesn't seem to work when using the same column with
// different aliases twice
$res = array();
$suffix = ';Hoststatus';
foreach ($names as $name) {
$res[$name . $suffix] = $name;
}

return $res;
}

protected function enumServiceListByFilter($filter)
{
$objects = $this->backend
->select()
->from('serviceStatus', ['host' => 'host_name', 'service' => 'service_description'])
->applyFilter($this->getCustomFilterWithRestriction('monitoring/filter/objects', $filter))
->order('service_description')
->getQuery()
->fetchAll();

$services = array();
foreach ($objects as $object) {
$services[$object->host . ';' . $object->service] = $object->host . ':' . $object->service;
}

return $services;
}

protected function hasProcesses()
{
return count($this->enumProcesses()) > 0;
Expand Down Expand Up @@ -552,6 +666,8 @@ public function onSuccess()

// Fallthrough
case 'process':
case 'hosts_from_filter':
case 'services_from_filter':
if ($this->hasParentNode()) {
$changes->addChildrenToNode($this->getValue('children'), $this->parent);
} else {
Expand Down
8 changes: 8 additions & 0 deletions library/Businessprocess/MonitoringRestrictions.php
Original file line number Diff line number Diff line change
Expand Up @@ -62,4 +62,12 @@ function ($c) {

return $restriction;
}

public function getCustomFilterWithRestriction($restrictionName, $filterQueryString) {
$filter = Filter::matchAny();
$filter->addFilter(Filter::fromQueryString($filterQueryString));
$filter->addFilter($this->getRestriction($restrictionName));

return $filter;
}
}

0 comments on commit d00cf96

Please sign in to comment.