You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

350 lines
11 KiB

1 year ago
<?php
/*
** Zabbix
** Copyright (C) 2001-2023 Zabbix SIA
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation; either version 2 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
**/
require_once dirname(__FILE__).'/../common/testFormPreprocessing.php';
require_once dirname(__FILE__).'/../../include/helpers/CDataHelper.php';
/**
* @backup items
*/
class testFormPreprocessingLowLevelDiscovery extends testFormPreprocessing {
public $link = 'host_discovery.php?context=host&filter_set=1&filter_hostids%5B0%5D='.self::HOSTID;
public $ready_link = 'host_discovery.php?form=update&context=host&itemid=';
public $button = 'Create discovery rule';
public $success_message = 'Discovery rule created';
public $fail_message = 'Cannot add discovery rule';
const IS_LLD = true;
const HOSTID = 40001;
const INHERITANCE_TEMPLATEID = 15000; // 'Inheritance test template'
const INHERITANCE_HOSTID = 15001; // 'Template inheritance test host'
const INHERITANCE_LLDID = 15016; // 'Template inheritance test host' -> 'testInheritanceDiscoveryRule'
const CLONE_LLDID = 133800; // 'Simple form test host' -> 'testFormDiscoveryRule1'
const CLONE_PREPROCESSING = [
[
'type' => '5',
'params' => "regular expression pattern \noutput template",
'error_handler' => 0,
'error_handler_params' => ''
],
[
'type' => '11',
'params' => '/document/item/value/text()',
'error_handler' => 0,
'error_handler_params' => ''
],
[
'type' => '12',
'params' => '$.document.item.value parameter.',
'error_handler' => 0,
'error_handler_params' => ''
],
[
'type' => '15',
'params' => 'regular expression pattern for not matching',
'error_handler' => 0,
'error_handler_params' => ''
],
[
'type' => '16',
'params' => '/json/path',
'error_handler' => 0,
'error_handler_params' => ''
],
[
'type' => '17',
'params' => '/xml/path',
'error_handler' => 0,
'error_handler_params' => ''
],
[
'type' => '20',
'params' => '7',
'error_handler' => 0,
'error_handler_params' => ''
],
[
'type' => '24',
'params' => ".\n/\n1",
'error_handler' => 0,
'error_handler_params' => ''
],
[
'type' => '25',
'params' => "1\n2",
'error_handler' => 0,
'error_handler_params' => ''
],
[
'type' => '21',
'params' => 'test script',
'error_handler' => 0,
'error_handler_params' => ''
],
[
'type' => '23',
'params' => 'metric',
'error_handler' => 0,
'error_handler_params' => ''
]
];
/*
* Preprocessing data for LLD successful creation.
*/
public static function getLLDPreprocessingCreateData() {
return [
// #0 Structured data. CSV to JSON.
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'CSV to JSON empty parameters',
'Key' => 'csv-to-json-empty-parameters'
],
'preprocessing' => [
['type' => 'CSV to JSON']
]
]
],
// #1
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'CSV to JSON with default parameters',
'Key' => 'csv-to-json-with-default-parameters'
],
'preprocessing' => [
['type' => 'CSV to JSON', 'parameter_1' => ',', 'parameter_2' => '"', 'parameter_3' => true]
]
]
],
// #2
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'CSV to JSON custom parameters',
'Key' => 'csv-to-json-custom-parameters'
],
'preprocessing' => [
['type' => 'CSV to JSON', 'parameter_1' => ' ', 'parameter_2' => "'", 'parameter_3' => false]
]
]
],
// #3
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Add spaces preprocessing',
'Key' => 'item.spaces.preprocessing'
],
'preprocessing' => [
['type' => 'Replace', 'parameter_1' => ' test text ', 'parameter_2' => ' replacement 1 '],
['type' => 'Regular expression', 'parameter_1' => ' expression ', 'parameter_2' => ' \1 '],
['type' => 'JSONPath', 'parameter_1' => ' $.data.test '],
['type' => 'JavaScript', 'parameter_1' => " Test line 1\n Test line 2\n Test line 3 "],
['type' => 'Does not match regular expression', 'parameter_1' => ' Pattern '],
['type' => 'Check for error in JSON', 'parameter_1' => ' $.new.path ']
]
]
],
// #4
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'LLD all preprocessing steps',
'Key' => 'lld-all-preprocessing-steps'
],
'preprocessing' => [
['type' => 'Replace', 'parameter_1' => 'test', 'parameter_2' => 'replacement'],
['type' => 'Regular expression', 'parameter_1' => 'expression', 'parameter_2' => '\1'],
['type' => 'CSV to JSON','parameter_1' => ' ', 'parameter_2' => '\\', 'parameter_3' => true],
['type' => 'JSONPath', 'parameter_1' => '$.data.test'],
['type' => 'JavaScript', 'parameter_1' => 'Test JavaScript'],
['type' => 'Does not match regular expression', 'parameter_1' => 'Pattern'],
['type' => 'Check for error in JSON', 'parameter_1' => '$.new.path'],
['type' => 'Discard unchanged with heartbeat', 'parameter_1' => '30'],
['type' => 'XML to JSON']
],
'screenshot' => true
]
],
// #5
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'LLD double preprocessing steps',
'Key' => 'lld-double-preprocessing-steps'
],
'preprocessing' => [
['type' => 'Replace', 'parameter_1' => '123', 'parameter_2' => '345'],
['type' => 'Replace', 'parameter_1' => '123', 'parameter_2' => '345'],
['type' => 'Regular expression', 'parameter_1' => 'expression1', 'parameter_2' => '\1'],
['type' => 'Regular expression', 'parameter_1' => 'expression2', 'parameter_2' => '\2'],
['type' => 'CSV to JSON', 'parameter_1' => '.', 'parameter_2' => "'" ,'parameter_3' => false],
['type' => 'CSV to JSON', 'parameter_1' => '.', 'parameter_2' => "'" ,'parameter_3' => false],
['type' => 'JSONPath', 'parameter_1' => '$.data.test1'],
['type' => 'JSONPath', 'parameter_1' => '$.data.test2'],
['type' => 'XML to JSON'],
['type' => 'XML to JSON'],
['type' => 'Does not match regular expression', 'parameter_1' => 'Pattern1'],
['type' => 'Does not match regular expression', 'parameter_1' => 'Pattern2'],
['type' => 'JavaScript', 'parameter_1' => 'Test JavaScript'],
['type' => 'JavaScript', 'parameter_1' => 'Test JavaScript'],
['type' => 'Check for error in JSON', 'parameter_1' => '$.new.path1'],
['type' => 'Check for error in JSON', 'parameter_1' => '$.new.path2']
]
]
],
// #6
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'LLD symbols preprocessing steps',
'Key' => 'lld-symbols-preprocessing-steps'
],
'preprocessing' => [
['type' => 'Regular expression', 'parameter_1' => '1a!@#$%^&*()-=', 'parameter_2' => '2b!@#$%^&*()-='],
['type' => 'JSONPath', 'parameter_1' => '3c!@#$%^&*()-='],
['type' => 'Does not match regular expression', 'parameter_1' => '4d!@#$%^&*()-='],
['type' => 'JavaScript', 'parameter_1' => '5d!@#$%^&*()-='],
['type' => 'Check for error in JSON', 'parameter_1' => '5e!@#$%^&*()-=']
]
]
],
// #7
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'LLD user macros preprocessing steps',
'Key' => 'lld-macros-preprocessing-steps'
],
'preprocessing' => [
['type' => 'Regular expression', 'parameter_1' => '{$PATTERN}', 'parameter_2' => '{$OUTPUT}'],
['type' => 'JSONPath', 'parameter_1' => '{$PATH}'],
['type' => 'Does not match regular expression', 'parameter_1' => '{$PATTERN2}'],
['type' => 'JavaScript', 'parameter_1' => '{$JAVASCRIPT}'],
['type' => 'Check for error in JSON', 'parameter_1' => '{$PATH2}'],
['type' => 'Discard unchanged with heartbeat', 'parameter_1' => '{$HEARTBEAT}']
]
]
]
];
}
public function getLLDPrometheusData() {
return array_merge($this->getPrometheustoJSONData(), [
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Item Prometheus to JSON wrong first parameter - LLD macro',
'Key' => 'json-wrong-first-parameter-macro'
],
'preprocessing' => [
['type' => 'Prometheus to JSON', 'parameter_1' => '{#METRICNAME}==1']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": invalid Prometheus pattern.',
'lld_error' => 'Incorrect value for field "params": invalid Prometheus pattern.'
]
]
]);
}
/**
* @dataProvider getCommonPreprocessingValidationData
* @dataProvider getLLDPreprocessingCreateData
* @dataProvider getLLDPrometheusData
* @dataProvider getCustomOnFailValidationData
*/
public function testFormPreprocessingLowLevelDiscovery_CreateAllSteps($data) {
$this->checkCreate($data, self::IS_LLD);
}
/**
* @dataProvider getCommonPreprocessingTrailingSpacesData
*/
public function testFormPreprocessingLowLevelDiscovery_TrailingSpaces($data) {
$this->checkTrailingSpaces($data, self::IS_LLD);
}
/**
* Add preprocessing steps to templated LLD for cloning.
*/
public function prepareCloneTemplatedLLDPreprocessing() {
CDataHelper::call('discoveryrule.update', [
'itemid' => '15011',
'preprocessing' => self::CLONE_PREPROCESSING
]);
}
/**
* @onBefore prepareCloneTemplatedLLDPreprocessing
*/
public function testFormPreprocessingLowLevelDiscovery_CloneTemplatedLLD() {
$link = 'host_discovery.php?form=update&context=host&itemid='.self::INHERITANCE_LLDID;
$this->checkCloneItem($link, 'Discovery rule', $templated = true);
}
/**
* Add preprocessing steps to LLD for cloning.
*/
public function prepareCloneLLDPreprocessing() {
CDataHelper::call('discoveryrule.update', [
'itemid' => self::CLONE_LLDID,
'preprocessing' => self::CLONE_PREPROCESSING
]);
}
/**
* @onBefore prepareCloneLLDPreprocessing
*/
public function testFormPreprocessingLowLevelDiscovery_CloneLLD() {
$link = 'host_discovery.php?form=update&context=host&itemid='.self::CLONE_LLDID;
$this->checkCloneItem($link, 'Discovery rule');
}
/**
* @dataProvider getCommonCustomOnFailData
*/
public function testFormPreprocessingLowLevelDiscovery_CustomOnFail($data) {
$this->checkCustomOnFail($data, self::IS_LLD);
}
/**
* @dataProvider getCommonInheritancePreprocessing
*/
public function testFormPreprocessingLowLevelDiscovery_PreprocessingInheritanceFromTemplate($data) {
$this->link = 'host_discovery.php?filter_set=1&&context=template&filter_hostids%5B0%5D='.self::INHERITANCE_TEMPLATEID;
$host_link = 'host_discovery.php?filter_set=1&context=host&filter_hostids%5B0%5D='.self::INHERITANCE_HOSTID;
$this->checkPreprocessingInheritance($data, $host_link, self::IS_LLD);
}
}