From b78983f5396aa4ba0ee5fd7fa198feba3c147506 Mon Sep 17 00:00:00 2001 From: Valentina Da Rold Date: Thu, 15 Jul 2021 11:24:37 +0200 Subject: [PATCH] Add Degraded operator implementation Refs #298 --- application/forms/AddNodeForm.php | 1 + application/forms/EditNodeForm.php | 1 + application/forms/ProcessForm.php | 1 + doc/09-Operators.md | 9 + .../09_operators/0905_deg-operator.jpg | Bin 0 -> 68934 bytes library/Businessprocess/BpNode.php | 14 ++ .../Storage/LegacyConfigParser.php | 4 +- .../Storage/LegacyConfigRenderer.php | 2 +- .../library/Businessprocess/BpNodeTest.php | 12 +- .../library/Businessprocess/HostNodeTest.php | 4 +- .../Operators/DegradedOperatorTest.php | 159 ++++++++++++++++++ 11 files changed, 194 insertions(+), 13 deletions(-) create mode 100644 doc/screenshot/09_operators/0905_deg-operator.jpg create mode 100644 test/php/library/Businessprocess/Operators/DegradedOperatorTest.php diff --git a/application/forms/AddNodeForm.php b/application/forms/AddNodeForm.php index 1d87305..6bfe392 100644 --- a/application/forms/AddNodeForm.php +++ b/application/forms/AddNodeForm.php @@ -117,6 +117,7 @@ class AddNodeForm extends QuickForm '&' => $this->translate('AND'), '|' => $this->translate('OR'), '!' => $this->translate('NOT'), + '%' => $this->translate('DEGRADED'), '1' => $this->translate('MIN 1'), '2' => $this->translate('MIN 2'), '3' => $this->translate('MIN 3'), diff --git a/application/forms/EditNodeForm.php b/application/forms/EditNodeForm.php index 588c6de..e97ae59 100644 --- a/application/forms/EditNodeForm.php +++ b/application/forms/EditNodeForm.php @@ -114,6 +114,7 @@ class EditNodeForm extends QuickForm '&' => $this->translate('AND'), '|' => $this->translate('OR'), '!' => $this->translate('NOT'), + '%' => $this->translate('DEGRADED'), '1' => $this->translate('MIN 1'), '2' => $this->translate('MIN 2'), '3' => $this->translate('MIN 3'), diff --git a/application/forms/ProcessForm.php b/application/forms/ProcessForm.php index 4cc3bcf..0e0b853 100644 --- a/application/forms/ProcessForm.php +++ b/application/forms/ProcessForm.php @@ -61,6 +61,7 @@ class ProcessForm extends QuickForm '&' => $this->translate('AND'), '|' => $this->translate('OR'), '!' => $this->translate('NOT'), + '%' => $this->translate('DEGRADED'), '1' => $this->translate('MIN 1'), '2' => $this->translate('MIN 2'), '3' => $this->translate('MIN 3'), diff --git a/doc/09-Operators.md b/doc/09-Operators.md index 53613f2..58db97c 100644 --- a/doc/09-Operators.md +++ b/doc/09-Operators.md @@ -17,6 +17,15 @@ The `OR` operator selects the **BEST** state of its child nodes: ![Or Operator #2](screenshot/09_operators/0903_or-operator-without-ok.png) +## DEGRADED + +The `DEGRADED` operator behaves like an `AND`, but if the resulting +state is **CRITICAL** it transforms it into a **WARNING**. +Refer to the table below for the case-by-case +analysis of the statuses. + +![Degraded Operator](screenshot/09_operators/0905_deg-operator.jpg) + ## MIN n The `MIN` operator selects the **WORST** state out of the **BEST n** child node states: diff --git a/doc/screenshot/09_operators/0905_deg-operator.jpg b/doc/screenshot/09_operators/0905_deg-operator.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9dc05a3c32e38fe45c3787105a262f8492448f43 GIT binary patch literal 68934 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 + $warningState = ($this->stateToSortState(self::ICINGA_WARNING) << self::SHIFT_FLAGS) + $flags; + + $sort_state = ($maxIcingaState === self::ICINGA_CRITICAL) ? $warningState : $maxState; + break; default: // MIN: $sort_state = 3 << self::SHIFT_FLAGS; @@ -624,6 +635,9 @@ class BpNode extends Node case self::OP_NOT: return 'NOT'; break; + case self::OP_DEGRADED: + return 'DEG'; + break; default: // MIN $this->assertNumericOperator(); diff --git a/library/Businessprocess/Storage/LegacyConfigParser.php b/library/Businessprocess/Storage/LegacyConfigParser.php index 4142731..17fc8a5 100644 --- a/library/Businessprocess/Storage/LegacyConfigParser.php +++ b/library/Businessprocess/Storage/LegacyConfigParser.php @@ -322,7 +322,7 @@ class LegacyConfigParser } $op = '&'; - if (preg_match_all('~(?hasNode($val)) { $node->addChild($bp->getNode($val)); diff --git a/library/Businessprocess/Storage/LegacyConfigRenderer.php b/library/Businessprocess/Storage/LegacyConfigRenderer.php index ebe9589..7e2e0b2 100644 --- a/library/Businessprocess/Storage/LegacyConfigRenderer.php +++ b/library/Businessprocess/Storage/LegacyConfigRenderer.php @@ -186,7 +186,7 @@ class LegacyConfigRenderer $op = static::renderOperator($node); $children = $node->getChildNames(); $str = implode(' ' . $op . ' ', array_map(function ($val) { - return preg_replace('~([\|\+&\!])~', '\\\\$1', $val); + return preg_replace('~([\|\+&\!\%])~', '\\\\$1', $val); }, $children)); if ((count($children) < 2) && $op !== '&') { diff --git a/test/php/library/Businessprocess/BpNodeTest.php b/test/php/library/Businessprocess/BpNodeTest.php index c1f224b..c3da723 100644 --- a/test/php/library/Businessprocess/BpNodeTest.php +++ b/test/php/library/Businessprocess/BpNodeTest.php @@ -7,22 +7,20 @@ use Icinga\Module\Businessprocess\Test\BaseTestCase; class BpNodeTest extends BaseTestCase { - /** - * @expectedException \Icinga\Module\Businessprocess\Exception\NestingError - */ public function testThrowsNestingErrorWhenCheckedForLoops() { + $this->expectException(\Icinga\Module\Businessprocess\Exception\NestingError::class); + /** @var BpNode $bpNode */ $bpNode = $this->makeLoop()->getNode('d'); $bpNode->checkForLoops(); } - /** - * @expectedExceptionMessage d -> a -> b -> c -> a - * @expectedException \Icinga\Module\Businessprocess\Exception\NestingError - */ public function testNestingErrorReportsFullLoop() { + $this->expectException(\Icinga\Module\Businessprocess\Exception\NestingError::class); + $this->expectExceptionMessage('d -> a -> b -> c -> a'); + /** @var BpNode $bpNode */ $bpNode = $this->makeLoop()->getNode('d'); $bpNode->checkForLoops(); diff --git a/test/php/library/Businessprocess/HostNodeTest.php b/test/php/library/Businessprocess/HostNodeTest.php index 9839959..ef4155d 100644 --- a/test/php/library/Businessprocess/HostNodeTest.php +++ b/test/php/library/Businessprocess/HostNodeTest.php @@ -41,11 +41,9 @@ class HostNodeTest extends BaseTestCase ); } - /** - * @expectedException \Icinga\Exception\ProgrammingError - */ public function testSettingAnInvalidStateFails() { + $this->expectException(\Icinga\Exception\ProgrammingError::class); $bp = new BpConfig(); $host = $bp->createHost('localhost')->setState(98); $bp->createBp('p')->addChild($host)->getState(); diff --git a/test/php/library/Businessprocess/Operators/DegradedOperatorTest.php b/test/php/library/Businessprocess/Operators/DegradedOperatorTest.php new file mode 100644 index 0000000..72ed5e5 --- /dev/null +++ b/test/php/library/Businessprocess/Operators/DegradedOperatorTest.php @@ -0,0 +1,159 @@ +emptyConfigSection()); + $expressions = [ + 'a = b;c', + 'a = b;c % c;d % d;e', + ]; + + foreach ($expressions as $expression) { + $this->assertInstanceOf( + 'Icinga\\Module\\Businessprocess\\BpConfig', + $storage->loadFromString('dummy', $expression) + ); + } + } + + public function testThreeTimesCriticalIsWarning() + { + $bp = $this->getBp(); + $bp->setNodeState('b;c', 2); + $bp->setNodeState('c;d', 2); + $bp->setNodeState('d;e', 2); + + $this->assertEquals( + 'WARNING', + $bp->getNode('a')->getStateName() + ); + } + + public function testTwoTimesCriticalAndOkIsWarning() + { + $bp = $this->getBp(); + $bp->setNodeState('b;c', 2); + $bp->setNodeState('c;d', 0); + $bp->setNodeState('d;e', 2); + + $this->assertEquals( + 'WARNING', + $bp->getNode('a')->getStateName() + ); + } + + public function testCriticalAndWarningAndOkIsWarning() + { + $bp = $this->getBp(); + $bp->setNodeState('b;c', 2); + $bp->setNodeState('c;d', 1); + $bp->setNodeState('d;e', 0); + + $this->assertEquals( + 'WARNING', + $bp->getNode('a')->getStateName() + ); + } + + public function testUnknownAndWarningAndOkIsUnknown() + { + $bp = $this->getBp(); + $bp->setNodeState('b;c', 0); + $bp->setNodeState('c;d', 1); + $bp->setNodeState('d;e', 3); + + $this->assertEquals( + 'UNKNOWN', + $bp->getNode('a')->getStateName() + ); + } + + public function testTwoTimesWarningAndOkIsWarning() + { + $bp = $this->getBp(); + $bp->setNodeState('b;c', 0); + $bp->setNodeState('c;d', 1); + $bp->setNodeState('d;e', 1); + + $this->assertEquals( + 'WARNING', + $bp->getNode('a')->getStateName() + ); + } + + public function testUnknownAndWarningAndCriticalIsWarning() + { + $bp = $this->getBp(); + $bp->setNodeState('b;c', 2); + $bp->setNodeState('c;d', 1); + $bp->setNodeState('d;e', 3); + + $this->assertEquals( + 'WARNING', + $bp->getNode('a')->getStateName() + ); + } + + public function testThreeTimesOkIsOk() + { + $bp = $this->getBp(); + $bp->setNodeState('b;c', 0); + $bp->setNodeState('c;d', 0); + $bp->setNodeState('d;e', 0); + + $this->assertEquals( + 'OK', + $bp->getNode('a')->getStateName() + ); + } + + public function testSimpleDegOperationWorksCorrectly() + { + $bp = new BpConfig(); + $bp->throwErrors(); + $host = $bp->createHost('localhost')->setState(0); + $service = $bp->createService('localhost', 'ping')->setState(2); + $p = $bp->createBp('p'); + $p->setOperator('%'); + $p->addChild($host); + $p->addChild($service); + + $this->assertEquals( + 'UP', + $host->getStateName() + ); + + $this->assertEquals( + 'CRITICAL', + $service->getStateName() + ); + + $this->assertEquals( + 'WARNING', + $p->getStateName() + ); + } + + /** + * @return BpConfig + */ + protected function getBp() + { + $storage = new LegacyStorage($this->emptyConfigSection()); + $expression = 'a = b;c % c;d % d;e'; + $bp = $storage->loadFromString('dummy', $expression); + $bp->createBp('b'); + $bp->createBp('c'); + $bp->createBp('d'); + + return $bp; + } +}