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.
812 lines
23 KiB
812 lines
23 KiB
<?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__).'/../include/CAPITest.php';
|
|
require_once dirname(__FILE__).'/../include/helpers/CDataHelper.php';
|
|
|
|
/**
|
|
* @backup items
|
|
* @onBefore prepareUpdateData
|
|
*/
|
|
class testItem extends CAPITest {
|
|
|
|
protected static $items;
|
|
|
|
public static function getItemCreateData() {
|
|
$valid_item_types = [
|
|
ITEM_TYPE_ZABBIX => '50022',
|
|
ITEM_TYPE_TRAPPER => null,
|
|
ITEM_TYPE_SIMPLE => '50022',
|
|
ITEM_TYPE_INTERNAL => null,
|
|
ITEM_TYPE_ZABBIX_ACTIVE => null,
|
|
ITEM_TYPE_EXTERNAL => '50022',
|
|
ITEM_TYPE_DB_MONITOR => null,
|
|
ITEM_TYPE_IPMI => '50031',
|
|
ITEM_TYPE_SSH => '50022',
|
|
ITEM_TYPE_TELNET => '50022',
|
|
ITEM_TYPE_CALCULATED => null,
|
|
ITEM_TYPE_JMX => '50030',
|
|
ITEM_TYPE_DEPENDENT => null,
|
|
ITEM_TYPE_HTTPAGENT => '50022',
|
|
ITEM_TYPE_SNMP => '50029',
|
|
ITEM_TYPE_SCRIPT => null
|
|
];
|
|
$item_type_tests = [];
|
|
$binary_valuetype_tests = [];
|
|
|
|
foreach ($valid_item_types as $type => $interfaceid) {
|
|
switch ($type) {
|
|
case ITEM_TYPE_ZABBIX:
|
|
case ITEM_TYPE_SIMPLE:
|
|
case ITEM_TYPE_INTERNAL:
|
|
case ITEM_TYPE_ZABBIX_ACTIVE:
|
|
case ITEM_TYPE_EXTERNAL:
|
|
$params = [
|
|
'delay' => '30s'
|
|
];
|
|
break;
|
|
|
|
case ITEM_TYPE_DB_MONITOR:
|
|
$params = [
|
|
'params' => 'SELECT * FROM table',
|
|
'delay' => '30s'
|
|
];
|
|
break;
|
|
|
|
case ITEM_TYPE_IPMI:
|
|
$params = [
|
|
'ipmi_sensor' => '1.2.3',
|
|
'delay' => '30s'
|
|
];
|
|
break;
|
|
|
|
case ITEM_TYPE_SSH:
|
|
$params = [
|
|
'username' => 'username',
|
|
'authtype' => ITEM_AUTHTYPE_PASSWORD,
|
|
'params' => 'return true;',
|
|
'delay' => '30s'
|
|
];
|
|
break;
|
|
|
|
case ITEM_TYPE_TELNET:
|
|
$params = [
|
|
'username' => 'username',
|
|
'params' => 'return true;',
|
|
'delay' => '30s'
|
|
];
|
|
break;
|
|
|
|
case ITEM_TYPE_CALCULATED:
|
|
$params = [
|
|
'params' => '1+1',
|
|
'delay' => '30s'
|
|
];
|
|
break;
|
|
|
|
case ITEM_TYPE_JMX:
|
|
$params = [
|
|
'username' => 'username',
|
|
'password' => 'password',
|
|
'delay' => '30s'
|
|
];
|
|
break;
|
|
|
|
case ITEM_TYPE_DEPENDENT:
|
|
$params = [
|
|
'master_itemid' => '150151'
|
|
];
|
|
break;
|
|
|
|
case ITEM_TYPE_HTTPAGENT:
|
|
$params = [
|
|
'url' => 'http://0.0.0.0',
|
|
'delay' => '30s'
|
|
];
|
|
break;
|
|
|
|
case ITEM_TYPE_SNMP:
|
|
$params = [
|
|
'snmp_oid' => '1.2.3',
|
|
'delay' => '30s'
|
|
];
|
|
break;
|
|
|
|
case ITEM_TYPE_SCRIPT:
|
|
$params = [
|
|
'params' => 'script',
|
|
'timeout' => '30s',
|
|
'delay' => '30s'
|
|
];
|
|
break;
|
|
|
|
default:
|
|
$params = [];
|
|
break;
|
|
}
|
|
|
|
if ($interfaceid) {
|
|
$params['interfaceid'] = $interfaceid;
|
|
}
|
|
|
|
$item_type_tests[] = [
|
|
'request_data' => $params + [
|
|
'name' => 'Item of type '.$type,
|
|
'key_' => 'item_of_type_'.$type,
|
|
'hostid' => '50009',
|
|
'type' => (string) $type,
|
|
'value_type' => ITEM_VALUE_TYPE_UINT64
|
|
],
|
|
'expected_error' => null
|
|
];
|
|
|
|
$binary_valuetype_tests[] = [
|
|
'request_data' => $params + [
|
|
'hostid' => '50009',
|
|
'name' => 'Test binary with item type '.$type,
|
|
'key_' => 'test.binary.'.$type,
|
|
'type' => $type,
|
|
'value_type' => ITEM_VALUE_TYPE_BINARY
|
|
],
|
|
'expected_error' => $type == ITEM_TYPE_DEPENDENT
|
|
? null
|
|
: 'Invalid parameter "/1/value_type": value must be one of '.implode(', ', [
|
|
ITEM_VALUE_TYPE_FLOAT, ITEM_VALUE_TYPE_STR, ITEM_VALUE_TYPE_LOG, ITEM_VALUE_TYPE_UINT64,
|
|
ITEM_VALUE_TYPE_TEXT
|
|
]).'.'
|
|
];
|
|
|
|
// Additional type-specific cases.
|
|
switch ($type) {
|
|
case ITEM_TYPE_DEPENDENT:
|
|
$rejected_fields = [
|
|
['units', 'b', 'Invalid parameter "/1/units": value must be empty.'],
|
|
['trends', '1h', 'Invalid parameter "/1/trends": value must be 0.'],
|
|
['valuemapid', 123, 'Invalid parameter "/1/valuemapid": value must be 0.'],
|
|
['inventory_link', 123, 'Invalid parameter "/1/inventory_link": value must be 0.'],
|
|
['logtimefmt', 'x', 'Invalid parameter "/1/logtimefmt": value must be empty.']
|
|
];
|
|
|
|
foreach ($rejected_fields as $config) {
|
|
[$field, $value, $error] = $config;
|
|
|
|
$binary_valuetype_tests['Reject field '.$field.' for dependent item'] = [
|
|
'request_data' => $params + [
|
|
'hostid' => '50009',
|
|
'name' => 'Test binary with item type '.$type,
|
|
'key_' => 'test.binary.'.$type,
|
|
'type' => $type,
|
|
'value_type' => ITEM_VALUE_TYPE_BINARY,
|
|
$field => $value
|
|
],
|
|
'expected_error' => $error
|
|
];
|
|
}
|
|
break;
|
|
|
|
case ITEM_TYPE_HTTPAGENT:
|
|
$item_type_tests += [
|
|
'Reject too long Basic authentication username' => [
|
|
'request_data' => $params + [
|
|
'hostid' => '50009',
|
|
'key_' => 'httpagent.reject.username',
|
|
'name' => 'httpagent.reject.username',
|
|
'type' => $type,
|
|
'value_type' => ITEM_VALUE_TYPE_TEXT,
|
|
'authtype' => ZBX_HTTP_AUTH_BASIC,
|
|
'username' => str_repeat('z', 256)
|
|
],
|
|
'expected_error' => 'Invalid parameter "/1/username": value is too long.'
|
|
],
|
|
'Reject too long Basic authentication password' => [
|
|
'request_data' => $params + [
|
|
'hostid' => '50009',
|
|
'key_' => 'httpagent.reject.password',
|
|
'name' => 'httpagent.reject.password',
|
|
'type' => $type,
|
|
'value_type' => ITEM_VALUE_TYPE_TEXT,
|
|
'authtype' => ZBX_HTTP_AUTH_BASIC,
|
|
'password' => str_repeat('z', 256)
|
|
],
|
|
'expected_error' => 'Invalid parameter "/1/password": value is too long.'
|
|
],
|
|
'Accept longest Basic authentication username' => [
|
|
'request_data' => $params + [
|
|
'hostid' => '50009',
|
|
'key_' => 'httpagent.accept.username',
|
|
'name' => 'httpagent.accept.username',
|
|
'type' => $type,
|
|
'value_type' => ITEM_VALUE_TYPE_TEXT,
|
|
'authtype' => ZBX_HTTP_AUTH_BASIC,
|
|
'username' => str_repeat('z', 255)
|
|
],
|
|
'expected_error' => null
|
|
],
|
|
'Accept longest Basic authentication password' => [
|
|
'request_data' => $params + [
|
|
'hostid' => '50009',
|
|
'key_' => 'httpagent.accept.password',
|
|
'name' => 'httpagent.accept.password',
|
|
'type' => $type,
|
|
'value_type' => ITEM_VALUE_TYPE_TEXT,
|
|
'authtype' => ZBX_HTTP_AUTH_BASIC,
|
|
'password' => str_repeat('z', 255)
|
|
],
|
|
'expected_error' => null
|
|
]
|
|
];
|
|
break;
|
|
}
|
|
}
|
|
|
|
$interfaces_tests = [];
|
|
$optional = [ITEM_TYPE_SIMPLE, ITEM_TYPE_EXTERNAL, ITEM_TYPE_SSH, ITEM_TYPE_TELNET, ITEM_TYPE_HTTPAGENT];
|
|
$required = [ITEM_TYPE_SNMP, ITEM_TYPE_SNMPTRAP, ITEM_TYPE_IPMI, ITEM_TYPE_ZABBIX, ITEM_TYPE_JMX];
|
|
|
|
foreach ($item_type_tests as $item_type_test) {
|
|
if (in_array($item_type_test['request_data']['type'], $optional)) {
|
|
unset($item_type_test['request_data']['interfaceid']);
|
|
|
|
$request_data = [
|
|
'name' => $item_type_test['request_data']['name'].' missing',
|
|
'key_' => $item_type_test['request_data']['key_'].'_missing'
|
|
] + $item_type_test['request_data'];
|
|
|
|
$interfaces_tests[] = ['request_data' => $request_data] + $item_type_test;
|
|
|
|
$request_data = [
|
|
'name' => $item_type_test['request_data']['name'].' zero',
|
|
'key_' => $item_type_test['request_data']['key_'].'_zero',
|
|
'interfaceid' => '0'
|
|
] + $item_type_test['request_data'];
|
|
|
|
$interfaces_tests[] = ['request_data' => $request_data] + $item_type_test;
|
|
}
|
|
elseif (in_array($item_type_test['request_data']['type'], $required)) {
|
|
unset($item_type_test['request_data']['interfaceid']);
|
|
$item_type_test['expected_error'] = 'Invalid parameter "/1": the parameter "interfaceid" is missing.';
|
|
$interfaces_tests[] = $item_type_test;
|
|
}
|
|
}
|
|
|
|
$uuid = generateUuidV4();
|
|
$uuid_tests = [
|
|
'Reject item with non-empty UUID on host' => [
|
|
'request_data' => [
|
|
'hostid' => '50009',
|
|
'uuid' => $uuid,
|
|
'name' => 'UUIDItem1',
|
|
'key_' => 'UUIDItem1',
|
|
'interfaceid' => 0,
|
|
'value_type' => ITEM_VALUE_TYPE_UINT64,
|
|
'type' => ITEM_TYPE_HTTPAGENT,
|
|
'delay' => '30s',
|
|
'url' => '192.168.0.1'
|
|
],
|
|
'expected_error' => 'Invalid parameter "/1/uuid": value must be empty.'
|
|
],
|
|
'Accept item with empty UUID on host' => [
|
|
'request_data' => [
|
|
'hostid' => '50009',
|
|
'uuid' => '',
|
|
'name' => 'UUIDItem2',
|
|
'key_' => 'UUIDItem2',
|
|
'interfaceid' => 0,
|
|
'value_type' => ITEM_VALUE_TYPE_UINT64,
|
|
'type' => ITEM_TYPE_HTTPAGENT,
|
|
'delay' => '30s',
|
|
'url' => '192.168.0.1'
|
|
],
|
|
'expected_error' => null
|
|
],
|
|
'Accept multiple items with empty UUID on host' => [
|
|
'request_data' => [
|
|
[
|
|
'hostid' => '50009',
|
|
'uuid' => '',
|
|
'name' => 'UUIDItem2.1',
|
|
'key_' => 'UUIDItem2.1',
|
|
'interfaceid' => 0,
|
|
'value_type' => ITEM_VALUE_TYPE_UINT64,
|
|
'type' => ITEM_TYPE_HTTPAGENT,
|
|
'delay' => '30s',
|
|
'url' => '192.168.0.1'
|
|
],
|
|
[
|
|
'hostid' => '50009',
|
|
'uuid' => '',
|
|
'name' => 'UUIDItem2.2',
|
|
'key_' => 'UUIDItem2.2',
|
|
'interfaceid' => 0,
|
|
'value_type' => ITEM_VALUE_TYPE_UINT64,
|
|
'type' => ITEM_TYPE_HTTPAGENT,
|
|
'delay' => '30s',
|
|
'url' => '192.168.0.1'
|
|
]
|
|
],
|
|
'expected_error' => null
|
|
],
|
|
'Accept item with non-empty UUID on template' => [
|
|
'request_data' => [
|
|
'hostid' => '50010',
|
|
'uuid' => $uuid,
|
|
'name' => 'UUIDItem3',
|
|
'key_' => 'UUIDItem3',
|
|
'interfaceid' => 0,
|
|
'value_type' => ITEM_VALUE_TYPE_UINT64,
|
|
'type' => ITEM_TYPE_HTTPAGENT,
|
|
'delay' => '30s',
|
|
'url' => '192.168.0.1'
|
|
],
|
|
'expected_error' => null
|
|
],
|
|
'Reject item with empty UUID on template' => [
|
|
'request_data' => [
|
|
'hostid' => '50010',
|
|
'uuid' => '',
|
|
'name' => 'UUIDItem4',
|
|
'key_' => 'UUIDItem4',
|
|
'interfaceid' => 0,
|
|
'value_type' => ITEM_VALUE_TYPE_UINT64,
|
|
'type' => ITEM_TYPE_HTTPAGENT,
|
|
'delay' => '30s',
|
|
'url' => '192.168.0.1'
|
|
],
|
|
'expected_error' => 'Invalid parameter "/1/uuid": cannot be empty.'
|
|
],
|
|
'Reject same UUID for two template items' => [
|
|
'request_data' => [
|
|
[
|
|
'hostid' => '50010',
|
|
'uuid' => $uuid,
|
|
'name' => 'UUIDItem5',
|
|
'key_' => 'UUIDItem5',
|
|
'interfaceid' => 0,
|
|
'value_type' => ITEM_VALUE_TYPE_UINT64,
|
|
'type' => ITEM_TYPE_HTTPAGENT,
|
|
'delay' => '30s',
|
|
'url' => '192.168.0.1'
|
|
],
|
|
[
|
|
'hostid' => '50010',
|
|
'uuid' => $uuid,
|
|
'name' => 'UUIDItem6',
|
|
'key_' => 'UUIDItem6',
|
|
'interfaceid' => 0,
|
|
'value_type' => ITEM_VALUE_TYPE_UINT64,
|
|
'type' => ITEM_TYPE_HTTPAGENT,
|
|
'delay' => '30s',
|
|
'url' => '192.168.0.1'
|
|
]
|
|
],
|
|
'expected_error' => 'Invalid parameter "/2": value (uuid)=('.$uuid.') already exists.'
|
|
]
|
|
];
|
|
|
|
return array_merge([
|
|
[
|
|
'request_data' => [
|
|
'hostid' => '50009',
|
|
'name' => 'Item with invalid item type',
|
|
'key_' => 'item_with_invalid_item_type',
|
|
'interfaceid' => '50022',
|
|
'value_type' => ITEM_VALUE_TYPE_UINT64,
|
|
'type' => '100',
|
|
'delay' => '30s'
|
|
],
|
|
'expected_error' => 'Invalid parameter "/1/type": value must be one of '.implode(', ', [
|
|
ITEM_TYPE_ZABBIX, ITEM_TYPE_TRAPPER, ITEM_TYPE_SIMPLE, ITEM_TYPE_INTERNAL, ITEM_TYPE_ZABBIX_ACTIVE,
|
|
ITEM_TYPE_EXTERNAL, ITEM_TYPE_DB_MONITOR, ITEM_TYPE_IPMI, ITEM_TYPE_SSH, ITEM_TYPE_TELNET,
|
|
ITEM_TYPE_CALCULATED, ITEM_TYPE_JMX, ITEM_TYPE_SNMPTRAP, ITEM_TYPE_DEPENDENT, ITEM_TYPE_HTTPAGENT,
|
|
ITEM_TYPE_SNMP, ITEM_TYPE_SCRIPT
|
|
]).'.'
|
|
],
|
|
// Test update interval for mqtt key of the Agent item type.
|
|
[
|
|
'request_data' => [
|
|
'hostid' => '50009',
|
|
'name' => 'Test mqtt key',
|
|
'key_' => 'mqtt.get[0]',
|
|
'interfaceid' => '50022',
|
|
'value_type' => ITEM_VALUE_TYPE_UINT64,
|
|
'type' => ITEM_TYPE_ZABBIX,
|
|
'delay' => '30s'
|
|
],
|
|
'expected_error' => null
|
|
],
|
|
[
|
|
'request_data' => [
|
|
'hostid' => '50009',
|
|
'name' => 'Test mqtt key without delay',
|
|
'key_' => 'mqtt.get[1]',
|
|
'interfaceid' => '50022',
|
|
'value_type' => ITEM_VALUE_TYPE_UINT64,
|
|
'type' => ITEM_TYPE_ZABBIX
|
|
],
|
|
'expected_error' => 'Invalid parameter "/1": the parameter "delay" is missing.'
|
|
],
|
|
[
|
|
'request_data' => [
|
|
'hostid' => '50009',
|
|
'name' => 'Test mqtt key with 0 delay',
|
|
'key_' => 'mqtt.get[2]',
|
|
'interfaceid' => '50022',
|
|
'value_type' => ITEM_VALUE_TYPE_UINT64,
|
|
'type' => ITEM_TYPE_ZABBIX,
|
|
'delay' => '0'
|
|
],
|
|
'expected_error' => 'Invalid parameter "/1/delay": cannot be equal to zero without custom intervals.'
|
|
],
|
|
// Test update interval for mqtt key of the Active agent type.
|
|
[
|
|
'request_data' => [
|
|
'hostid' => '50009',
|
|
'name' => 'Test mqtt key for active agent',
|
|
'key_' => 'mqtt.get[3]',
|
|
'value_type' => ITEM_VALUE_TYPE_UINT64,
|
|
'type' => ITEM_TYPE_ZABBIX_ACTIVE
|
|
],
|
|
'expected_error' => null
|
|
],
|
|
[
|
|
'request_data' => [
|
|
'hostid' => '50009',
|
|
'name' => 'Test mqtt key with 0 delay for active agent',
|
|
'key_' => 'mqtt.get[4]',
|
|
'value_type' => ITEM_VALUE_TYPE_UINT64,
|
|
'type' => ITEM_TYPE_ZABBIX_ACTIVE
|
|
],
|
|
'expected_error' => null
|
|
],
|
|
[
|
|
'request_data' => [
|
|
'hostid' => '50009',
|
|
'name' => 'Item with some tags',
|
|
'key_' => 'trapper_item_1',
|
|
'value_type' => ITEM_VALUE_TYPE_UINT64,
|
|
'type' => ITEM_TYPE_TRAPPER,
|
|
'tags' => [
|
|
[
|
|
'tag' => 'tag',
|
|
'value' => 'value 1'
|
|
],
|
|
[
|
|
'tag' => 'tag',
|
|
'value' => 'value 2'
|
|
]
|
|
]
|
|
],
|
|
'expected_error' => null
|
|
],
|
|
[
|
|
'request_data' => [
|
|
'hostid' => '50009',
|
|
'name' => 'Test mqtt with wrong key and 0 delay',
|
|
'key_' => 'mqt.get[5]',
|
|
'value_type' => ITEM_VALUE_TYPE_UINT64,
|
|
'type' => ITEM_TYPE_ZABBIX_ACTIVE,
|
|
'delay' => '0'
|
|
],
|
|
'expected_error' => 'Invalid parameter "/1/delay": cannot be equal to zero without custom intervals.'
|
|
],
|
|
// Item preprocessing.
|
|
[
|
|
'request_data' => [
|
|
'hostid' => '50009',
|
|
'name' => 'Test preprocessing 1',
|
|
'key_' => 'mqtt.get[5]',
|
|
'interfaceid' => '50022',
|
|
'value_type' => ITEM_VALUE_TYPE_UINT64,
|
|
'type' => ITEM_TYPE_ZABBIX_ACTIVE,
|
|
'preprocessing' => [
|
|
[
|
|
'type' => ZBX_PREPROC_VALIDATE_NOT_SUPPORTED,
|
|
'error_handler' => ZBX_PREPROC_FAIL_DEFAULT,
|
|
'error_handler_params' => ''
|
|
]
|
|
]
|
|
],
|
|
'expected_error' => 'Invalid parameter "/1/preprocessing/1/error_handler": value must be one of 1, 2, 3.'
|
|
]
|
|
], $item_type_tests, $interfaces_tests, $uuid_tests, $binary_valuetype_tests);
|
|
}
|
|
|
|
/**
|
|
* @dataProvider getItemCreateData
|
|
*/
|
|
public function testItem_Create($request_data, $expected_error) {
|
|
$result = $this->call('item.create', $request_data, $expected_error);
|
|
|
|
if ($expected_error !== null) {
|
|
return;
|
|
}
|
|
|
|
$match_fields = ['uuid', 'hostid', 'name', 'key_', 'type', 'delay'];
|
|
$requests = zbx_toArray($request_data);
|
|
|
|
foreach ($requests as $request_data) {
|
|
$id = array_shift($result['result']['itemids']);
|
|
|
|
if ($request_data['type'] === ITEM_TYPE_ZABBIX_ACTIVE
|
|
&& substr($request_data['key_'], 0, 8) === 'mqtt.get') {
|
|
$request_data['delay'] = CTestArrayHelper::get($request_data, 'delay', '0');
|
|
}
|
|
|
|
if (!array_key_exists('delay', $request_data)) {
|
|
$request_data['delay'] = 0;
|
|
}
|
|
|
|
$db_item = CDBHelper::getRow(
|
|
'SELECT '.implode(',', $match_fields).' FROM items WHERE '.dbConditionId('itemid', [$id])
|
|
);
|
|
|
|
foreach ($match_fields as $field) {
|
|
if ($field === 'uuid' && !array_key_exists($field, $request_data)) {
|
|
continue;
|
|
}
|
|
|
|
$this->assertSame($db_item[$field], strval($request_data[$field]));
|
|
}
|
|
|
|
if (array_key_exists('tags', $request_data)) {
|
|
$db_tags = DBFetchArray(DBSelect(
|
|
'SELECT tag,value FROM item_tag WHERE '.dbConditionId('itemid', [$id])
|
|
));
|
|
uasort($request_data['tags'], function ($a, $b) {
|
|
return strnatcasecmp($a['value'], $b['value']);
|
|
});
|
|
uasort($db_tags, function ($a, $b) {
|
|
return strnatcasecmp($a['value'], $b['value']);
|
|
});
|
|
$this->assertEquals(array_values($db_tags), array_values($request_data['tags']), 'Tags should match');
|
|
}
|
|
}
|
|
}
|
|
|
|
public static function prepareUpdateData() {
|
|
$interfaces = [
|
|
[
|
|
'type' => 1,
|
|
'main' => 1,
|
|
'useip' => 1,
|
|
'ip' => '127.0.0.1',
|
|
'dns' => '',
|
|
'port' => '10050'
|
|
]
|
|
];
|
|
|
|
$groups = [
|
|
[
|
|
'groupid' => 4
|
|
]
|
|
];
|
|
|
|
$result = CDataHelper::createHosts([
|
|
[
|
|
'host' => 'testItem_Update',
|
|
'interfaces' => $interfaces,
|
|
'groups' => $groups,
|
|
'status' => HOST_STATUS_MONITORED,
|
|
'items' => [
|
|
[
|
|
'name' => 'Agent ping',
|
|
'key_' => 'agent.ping',
|
|
'type' => ITEM_TYPE_ZABBIX,
|
|
'value_type' => ITEM_VALUE_TYPE_UINT64,
|
|
'delay' => '1s'
|
|
],
|
|
[
|
|
'name' => 'Agent version',
|
|
'key_' => 'agent.version',
|
|
'type' => ITEM_TYPE_ZABBIX,
|
|
'value_type' => ITEM_VALUE_TYPE_UINT64,
|
|
'delay' => '1m'
|
|
],
|
|
[
|
|
'name' => 'httpagent.credentials.length',
|
|
'key_' => 'httpagent.credentials.length',
|
|
'type' => ITEM_TYPE_HTTPAGENT,
|
|
'value_type' => ITEM_VALUE_TYPE_TEXT,
|
|
'url' => 'test.com',
|
|
'authtype' => ZBX_HTTP_AUTH_BASIC,
|
|
'delay' => '1m'
|
|
]
|
|
]
|
|
]
|
|
]);
|
|
|
|
self::$items = $result['itemids'];
|
|
}
|
|
|
|
public static function getItemUpdateData() {
|
|
return [
|
|
// Test update interval for mqtt key of the Agent item type.
|
|
[
|
|
'request_data' => [
|
|
'item' => 'testItem_Update:agent.ping',
|
|
'key_' => 'mqtt.get[00]',
|
|
'delay' => '0'
|
|
],
|
|
'expected_error' => 'Invalid parameter "/1/delay": cannot be equal to zero without custom intervals.'
|
|
],
|
|
// Test update interval for wrong mqtt key of the Active agent item type.
|
|
[
|
|
'request_data' => [
|
|
'item' => 'testItem_Update:agent.ping',
|
|
'key_' => 'mqt.get[11]',
|
|
'type' => ITEM_TYPE_ZABBIX,
|
|
'delay' => '0'
|
|
],
|
|
'expected_error' => 'Invalid parameter "/1/delay": cannot be equal to zero without custom intervals.'
|
|
],
|
|
// Change type to active agent and check update interval for mqtt key.
|
|
[
|
|
'request_data' => [
|
|
'item' => 'testItem_Update:agent.ping',
|
|
'key_' => 'mqtt.get[22]',
|
|
'type' => ITEM_TYPE_ZABBIX_ACTIVE
|
|
],
|
|
'expected_error' => null
|
|
],
|
|
[
|
|
'request_data' => [
|
|
'item' => 'testItem_Update:agent.version',
|
|
'name' => 'Test mqtt key for active agent',
|
|
'key_' => 'mqtt.get[33]',
|
|
'type' => ITEM_TYPE_ZABBIX_ACTIVE
|
|
],
|
|
'expected_error' => null
|
|
],
|
|
'Reject too long Basic authentication username' => [
|
|
'request_data' => [
|
|
'item' => 'testItem_Update:httpagent.credentials.length',
|
|
'username' => str_repeat('z', 256)
|
|
],
|
|
'expected_error' => 'Invalid parameter "/1/username": value is too long.'
|
|
],
|
|
'Reject too long Basic authentication password' => [
|
|
'request_data' => [
|
|
'item' => 'testItem_Update:httpagent.credentials.length',
|
|
'password' => str_repeat('z', 256)
|
|
],
|
|
'expected_error' => 'Invalid parameter "/1/password": value is too long.'
|
|
],
|
|
'Accept longest Basic authentication username' => [
|
|
'request_data' => [
|
|
'item' => 'testItem_Update:httpagent.credentials.length',
|
|
'username' => str_repeat('z', 255)
|
|
],
|
|
'expected_error' => null
|
|
],
|
|
'Accept longest Basic authentication password' => [
|
|
'request_data' => [
|
|
'item' => 'testItem_Update:httpagent.credentials.length',
|
|
'password' => str_repeat('z', 255)
|
|
],
|
|
'expected_error' => null
|
|
]
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @dataProvider getItemUpdateData
|
|
*/
|
|
public function testItem_Update($request_data, $expected_error) {
|
|
$request_data['itemid'] = self::$items[$request_data['item']];
|
|
unset($request_data['item']);
|
|
|
|
$result = $this->call('item.update', $request_data, $expected_error);
|
|
|
|
if ($expected_error === null) {
|
|
if (array_key_exists('type', $request_data)
|
|
&& $request_data['type'] === ITEM_TYPE_ZABBIX_ACTIVE
|
|
&& substr($request_data['key_'], 0, 8) === 'mqtt.get') {
|
|
$request_data['delay'] = CTestArrayHelper::get($request_data, 'delay', '0');
|
|
}
|
|
|
|
$optional_fields = array_flip(['key_', 'type', 'delay']);
|
|
|
|
foreach ($result['result']['itemids'] as $id) {
|
|
$optional_updates = array_map('strval', array_intersect_key($request_data, $optional_fields));
|
|
|
|
if (!$optional_updates) {
|
|
continue;
|
|
}
|
|
|
|
$db_item = CDBHelper::getRow(
|
|
'SELECT '.implode(',', array_keys($optional_updates)).
|
|
' FROM items'.
|
|
' WHERE '.dbConditionId('itemid', [$id])
|
|
);
|
|
|
|
ksort($db_item);
|
|
ksort($optional_updates);
|
|
|
|
$this->assertSame($db_item, $optional_updates, 'Should match expected update values');
|
|
}
|
|
}
|
|
}
|
|
|
|
public static function getItemDeleteData() {
|
|
return [
|
|
[
|
|
'item' => ['400720'],
|
|
'data' => [
|
|
'discovered_triggerids' => ['30002'],
|
|
'dependent_item' => ['400740'],
|
|
'dependent_item_disc_triggerids' => ['30004']
|
|
],
|
|
'expected_error' => null
|
|
]
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @dataProvider getItemDeleteData
|
|
*/
|
|
public function testItem_Delete($item, $data, $expected_error) {
|
|
$result = $this->call('item.delete', $item, $expected_error);
|
|
|
|
if ($expected_error === null) {
|
|
foreach ($result['result']['itemids'] as $id) {
|
|
$dbResult = 'SELECT * FROM items WHERE itemid='.zbx_dbstr($id);
|
|
$this->assertEquals(0, CDBHelper::getCount($dbResult));
|
|
}
|
|
|
|
// Check that related discovered triggerid is removed with all related data.
|
|
if (array_key_exists('discovered_triggerids', $data)) {
|
|
foreach ($data['discovered_triggerids'] as $id) {
|
|
$dbResult = 'SELECT * FROM triggers WHERE triggerid='.zbx_dbstr($id);
|
|
$this->assertEquals(0, CDBHelper::getCount($dbResult));
|
|
|
|
$dbResult = 'SELECT * FROM functions WHERE triggerid='.zbx_dbstr($id);
|
|
$this->assertEquals(0, CDBHelper::getCount($dbResult));
|
|
|
|
$dbResult = 'SELECT * FROM trigger_discovery WHERE triggerid='.zbx_dbstr($id);
|
|
$this->assertEquals(0, CDBHelper::getCount($dbResult));
|
|
}
|
|
}
|
|
|
|
// Check that dependent item is removed.
|
|
if (array_key_exists('dependent_item', $data)) {
|
|
foreach ($data['dependent_item'] as $id) {
|
|
$dbResult = 'SELECT * FROM items WHERE itemid='.zbx_dbstr($id);
|
|
$this->assertEquals(0, CDBHelper::getCount($dbResult));
|
|
}
|
|
}
|
|
|
|
// Check that discovered trigger of dependent item is removed with all related data.
|
|
if (array_key_exists('dependent_item_disc_triggerids', $data)) {
|
|
foreach ($data['dependent_item_disc_triggerids'] as $id) {
|
|
$dbResult = 'SELECT * FROM triggers WHERE triggerid='.zbx_dbstr($id);
|
|
$this->assertEquals(0, CDBHelper::getCount($dbResult));
|
|
|
|
$dbResult = 'SELECT * FROM functions WHERE triggerid='.zbx_dbstr($id);
|
|
$this->assertEquals(0, CDBHelper::getCount($dbResult));
|
|
|
|
$dbResult = 'SELECT * FROM trigger_discovery WHERE triggerid='.zbx_dbstr($id);
|
|
$this->assertEquals(0, CDBHelper::getCount($dbResult));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|