From da41e2f4db4840609d23fee24d77ae673ba30d6a Mon Sep 17 00:00:00 2001 From: Thomas Gelf Date: Mon, 13 Mar 2017 22:25:04 +0100 Subject: [PATCH] AssignRenderer: improve/separate in-related code fixes #844 --- .../Director/IcingaConfig/AssignRenderer.php | 34 +++++++++++++++---- .../IcingaConfig/IcingaConfigHelper.php | 7 ++-- .../IcingaConfig/AssignRendererTest.php | 22 +++++++++--- 3 files changed, 49 insertions(+), 14 deletions(-) diff --git a/library/Director/IcingaConfig/AssignRenderer.php b/library/Director/IcingaConfig/AssignRenderer.php index cedb5ebb..0d77673f 100644 --- a/library/Director/IcingaConfig/AssignRenderer.php +++ b/library/Director/IcingaConfig/AssignRenderer.php @@ -75,6 +75,15 @@ class AssignRenderer } } + protected function renderInArray($column, $expression) + { + return sprintf( + '%s in %s', + $column, + $expression + ); + } + protected function renderContains(FilterExpression $filter) { return sprintf( @@ -91,14 +100,27 @@ class AssignRenderer } $column = $filter->getColumn(); - $expression = $this->renderExpressionValue(json_decode($filter->getExpression())); + $rawExpression = json_decode($filter->getExpression()); + $expression = $this->renderExpressionValue($rawExpression); + + if (is_array($rawExpression) && $filter instanceof FilterMatch) { + return $this->renderInArray($column, $expression); + } if ($filter instanceof FilterEqual) { - return sprintf( - '%s == %s', - $column, - $expression - ); + if (is_array($rawExpression)) { + return sprintf( + '%s in %s', + $column, + $expression + ); + } else { + return sprintf( + '%s == %s', + $column, + $expression + ); + } } elseif ($filter instanceof FilterMatch) { if (strpos($expression, '*') === false) { return $this->renderEquals($column, $expression); diff --git a/library/Director/IcingaConfig/IcingaConfigHelper.php b/library/Director/IcingaConfig/IcingaConfigHelper.php index 4ae287be..f8f3d557 100644 --- a/library/Director/IcingaConfig/IcingaConfigHelper.php +++ b/library/Director/IcingaConfig/IcingaConfigHelper.php @@ -137,9 +137,10 @@ class IcingaConfigHelper return static::renderFloat($value); // TODO: // } elseif (is_object($value) || static::isAssocArray($value)) { - // return static::renderHash($value, $prefix); - // } elseif (is_array($value)) { - // return static::renderArray($value, $prefix); + // return static::renderHash($value, $prefix) + // TODO: also check array + } elseif (is_array($value)) { + return static::renderArray($value); } elseif (is_string($value)) { return static::renderString($value); } else { diff --git a/test/php/library/Director/IcingaConfig/AssignRendererTest.php b/test/php/library/Director/IcingaConfig/AssignRendererTest.php index 355c2631..372b52d3 100644 --- a/test/php/library/Director/IcingaConfig/AssignRendererTest.php +++ b/test/php/library/Director/IcingaConfig/AssignRendererTest.php @@ -8,7 +8,7 @@ use Icinga\Module\Director\Test\BaseTestCase; class AssignRendererTest extends BaseTestCase { - public function testWhetherEqualMatchIsCorrectlyRendered() + public function testEqualMatchIsCorrectlyRendered() { $string = 'host.name="localhost"'; $expected = 'assign where host.name == "localhost"'; @@ -18,7 +18,7 @@ class AssignRendererTest extends BaseTestCase ); } - public function testWhetherWildcardsRenderAMatchMethod() + public function testWildcardsRenderAMatchMethod() { $string = 'host.address="127.0.0.*"'; $expected = 'assign where match("127.0.0.*", host.address)'; @@ -28,7 +28,7 @@ class AssignRendererTest extends BaseTestCase ); } - public function testWhetherACombinedFilterRendersCorrectly() + public function testACombinedFilterRendersCorrectly() { $string = 'host.name="*internal"|(service.vars.priority<2' . '&host.vars.is_clustered=true)'; @@ -42,7 +42,7 @@ class AssignRendererTest extends BaseTestCase ); } - public function testWhetherSlashesAreNotEscaped() + public function testSlashesAreNotEscaped() { $string = 'host.name=' . json_encode('a/b'); @@ -54,7 +54,7 @@ class AssignRendererTest extends BaseTestCase ); } - public function testWhetherFakeContainsOperatorRendersCorrectly() + public function testFakeContainsOperatorRendersCorrectly() { $string = json_encode('member') . '=host.groups'; @@ -75,6 +75,18 @@ class AssignRendererTest extends BaseTestCase ); } + public function testInArrayIsRenderedCorrectly() + { + $string = 'host.name=' . json_encode(array('a' ,'b')); + + $expected = 'assign where host.name in [ "a", "b" ]'; + + $this->assertEquals( + $expected, + $this->renderer($string)->renderAssign() + ); + } + protected function renderer($string) { return AssignRenderer::forFilter(Filter::fromQueryString($string));