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.
762 lines
35 KiB
762 lines
35 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__).'/../include/CAPITest.php';
|
||
|
|
||
|
/**
|
||
|
* @backup items
|
||
|
*/
|
||
|
class testDependentItems extends CAPITest {
|
||
|
|
||
|
private static function getItems($hostid, $master_itemid, $prefix, $from, $to) {
|
||
|
$items = [];
|
||
|
|
||
|
for ($i = $from; $i <= $to; $i++) {
|
||
|
$items[] = [
|
||
|
'hostid' => $hostid,
|
||
|
'name' => $prefix.'.'.$i,
|
||
|
'type' => ITEM_TYPE_DEPENDENT,
|
||
|
'key_' => $prefix.'.'.$i,
|
||
|
'value_type' => ITEM_VALUE_TYPE_STR,
|
||
|
'master_itemid' => $master_itemid
|
||
|
];
|
||
|
}
|
||
|
|
||
|
return $items;
|
||
|
}
|
||
|
|
||
|
private static function getItemPrototypes($hostid, $ruleid, $master_itemid, $prefix, $from, $to) {
|
||
|
$items = [];
|
||
|
|
||
|
for ($i = $from; $i <= $to; $i++) {
|
||
|
$items[] = [
|
||
|
'hostid' => $hostid,
|
||
|
'ruleid' => $ruleid,
|
||
|
'name' => $prefix.'.'.$i,
|
||
|
'type' => ITEM_TYPE_DEPENDENT,
|
||
|
'key_' => $prefix.'.'.$i.'[{#LLD}]',
|
||
|
'value_type' => ITEM_VALUE_TYPE_STR,
|
||
|
'master_itemid' => $master_itemid
|
||
|
];
|
||
|
}
|
||
|
|
||
|
return $items;
|
||
|
}
|
||
|
|
||
|
private static function getDiscoveryRule($hostid, $master_itemid, $prefix, $from, $to) {
|
||
|
$items = [];
|
||
|
|
||
|
for ($i = $from; $i <= $to; $i++) {
|
||
|
$items[] = [
|
||
|
'hostid' => $hostid,
|
||
|
'name' => $prefix.'.'.$i,
|
||
|
'type' => ITEM_TYPE_DEPENDENT,
|
||
|
'key_' => $prefix.'.'.$i,
|
||
|
'value_type' => ITEM_VALUE_TYPE_STR,
|
||
|
'master_itemid' => $master_itemid
|
||
|
];
|
||
|
}
|
||
|
|
||
|
return $items;
|
||
|
}
|
||
|
|
||
|
public static function getTestCases() {
|
||
|
$dep_count_overflow = ZBX_DEPENDENT_ITEM_MAX_COUNT + 1;
|
||
|
|
||
|
return [
|
||
|
'Simple update master item.' => [
|
||
|
'error' => null,
|
||
|
'method' => 'item.update',
|
||
|
'request_data' => [
|
||
|
'itemid' => 1001 // dependent.items.template.1:master.item.1
|
||
|
]
|
||
|
],
|
||
|
'Simple update master item prototype.' => [
|
||
|
'error' => null,
|
||
|
'method' => 'itemprototype.update',
|
||
|
'request_data' => [
|
||
|
'itemid' => 1018 // dependent.items.template.1:master.item.proto.1
|
||
|
]
|
||
|
],
|
||
|
'Simple update discovered master item.' => [
|
||
|
'error' => null,
|
||
|
'method' => 'item.update',
|
||
|
'request_data' => [
|
||
|
'itemid' => 2304 // dependent.items.host.7:net.if[eth0]
|
||
|
]
|
||
|
],
|
||
|
'Simple update dependent item.' => [
|
||
|
'error' => null,
|
||
|
'method' => 'item.update',
|
||
|
'request_data' => [
|
||
|
'itemid' => 1015 // dependent.items.template.1:dependent.item.1.2.2.2
|
||
|
]
|
||
|
],
|
||
|
'Simple update dependent item prototype.' => [
|
||
|
'error' => null,
|
||
|
'method' => 'itemprototype.update',
|
||
|
'request_data' => [
|
||
|
'itemid' => 1032 // dependent.items.template.1:dependent.item.proto.1.2.2.2
|
||
|
]
|
||
|
],
|
||
|
'Simple update discovered dependent item.' => [
|
||
|
'error' => null,
|
||
|
'method' => 'item.update',
|
||
|
'request_data' => [
|
||
|
'itemid' => 2305 // dependent.items.host.7:net.if.in[eth0]
|
||
|
]
|
||
|
],
|
||
|
'Simple update dependent discovery rule.' => [
|
||
|
'error' => null,
|
||
|
'method' => 'discoveryrule.update',
|
||
|
'request_data' => [
|
||
|
'itemid' => 1034 // dependent.items.template.1:dependent.discovery.rule.1.1
|
||
|
]
|
||
|
],
|
||
|
'Set incorrect master_itemid for item (create).' => [
|
||
|
'error' => 'Invalid parameter "/1/master_itemid": an item ID is expected.',
|
||
|
'method' => 'item.create',
|
||
|
// 1015: dependent.items.host.8
|
||
|
// 2499: this ID does not exist in the DB
|
||
|
'request_data' => null,
|
||
|
'request_data_funcs' => [
|
||
|
[[self::class, 'getItems'], [1015, 2499, 'dependent.item.1', 2, 2]]
|
||
|
]
|
||
|
],
|
||
|
'Set incorrect master_itemid for item (update).' => [
|
||
|
'error' => 'Invalid parameter "/1/master_itemid": an item ID is expected.',
|
||
|
'method' => 'item.update',
|
||
|
'request_data' => [
|
||
|
'itemid' => 2402, // dependent.items.host.8:dependent.item.1.1
|
||
|
'master_itemid' => 2499 // this ID does not exist in the DB
|
||
|
]
|
||
|
],
|
||
|
'Set incorrect master_itemid for item prototype (create).' => [
|
||
|
'error' => 'Invalid parameter "/1/master_itemid": an item/item prototype ID is expected.',
|
||
|
'method' => 'itemprototype.create',
|
||
|
// 1015: dependent.items.host.8
|
||
|
// 2403: dependent.items.host.8:discovery.rule.1
|
||
|
// 2499: this ID does not exist in the DB
|
||
|
'request_data' => null,
|
||
|
'request_data_funcs' => [
|
||
|
[[self::class, 'getItemPrototypes'], [1015, 2403, 2499, 'dependent.item.proto.1', 2, 2]]
|
||
|
]
|
||
|
],
|
||
|
'Set incorrect master_itemid for item prototype (update).' => [
|
||
|
'error' => 'Invalid parameter "/1/master_itemid": an item/item prototype ID is expected.',
|
||
|
'method' => 'itemprototype.update',
|
||
|
'request_data' => [
|
||
|
'itemid' => 2405, // dependent.items.host.8:dependent.item.proto.1.1
|
||
|
'master_itemid' => 2499 // this ID does not exist in the DB
|
||
|
]
|
||
|
],
|
||
|
'Set incorrect master_itemid for discovery rule (create).' => [
|
||
|
'error' => 'Incorrect value for field "master_itemid": Item "2499" does not exist or you have no access to this item.',
|
||
|
'method' => 'discoveryrule.create',
|
||
|
// 1015: dependent.items.host.8
|
||
|
// 2499: this ID does not exist in the DB
|
||
|
'request_data' => null,
|
||
|
'request_data_funcs' => [
|
||
|
[[self::class, 'getDiscoveryRule'], [1015, 2499, 'dependent.discovery.rule.1', 2, 2]]
|
||
|
]
|
||
|
],
|
||
|
'Set incorrect master_itemid for discovery rule (update).' => [
|
||
|
'error' => 'Incorrect value for field "master_itemid": Item "2499" does not exist or you have no access to this item.',
|
||
|
'method' => 'discoveryrule.update',
|
||
|
'request_data' => [
|
||
|
'itemid' => 2409, // dependent.items.host.8:dependent.discovery.rule.1.1
|
||
|
'master_itemid' => 2499 // this ID does not exist in the DB
|
||
|
]
|
||
|
],
|
||
|
'Set master_itemid from other host for item (create).' => [
|
||
|
'error' => 'Invalid parameter "/1/master_itemid": cannot be an item ID from another host or template.',
|
||
|
'method' => 'item.create',
|
||
|
// 1015: dependent.items.host.8
|
||
|
// 2501: dependent.items.host.9:master.item.1
|
||
|
'request_data' => null,
|
||
|
'request_data_funcs' => [
|
||
|
[[self::class, 'getItems'], [1015, 2501, 'dependent.item.1', 2, 2]]
|
||
|
]
|
||
|
],
|
||
|
'Set master_itemid from other host for item (update).' => [
|
||
|
'error' => 'Invalid parameter "/1/master_itemid": cannot be an item ID from another host or template.',
|
||
|
'method' => 'item.update',
|
||
|
'request_data' => [
|
||
|
'itemid' => 2402, // dependent.items.host.8:dependent.item.1.1
|
||
|
'master_itemid' => 2501 // dependent.items.host.9:master.item.1
|
||
|
]
|
||
|
],
|
||
|
'Set master_itemid from other host for item prototype (create).' => [
|
||
|
'error' => 'Invalid parameter "/1/master_itemid": cannot be an item/item prototype ID from another host or template.',
|
||
|
'method' => 'itemprototype.create',
|
||
|
// 1015: dependent.items.host.8
|
||
|
// 2403: dependent.items.host.8:discovery.rule.1
|
||
|
// 2504: dependent.items.host.9:master.item.proto.1
|
||
|
'request_data' => null,
|
||
|
'request_data_funcs' => [
|
||
|
[[self::class, 'getItemPrototypes'], [1015, 2403, 2504, 'dependent.item.proto.1', 2, 2]]
|
||
|
]
|
||
|
],
|
||
|
'Set master_itemid from other host for item prototype (update).' => [
|
||
|
'error' => 'Invalid parameter "/1/master_itemid": cannot be an item/item prototype ID from another host or template.',
|
||
|
'method' => 'itemprototype.update',
|
||
|
'request_data' => [
|
||
|
'itemid' => 2405, // dependent.items.host.8:dependent.item.proto.1.1
|
||
|
'master_itemid' => 2504 // dependent.items.host.9:master.item.proto.1
|
||
|
]
|
||
|
],
|
||
|
'Set master_itemid from other discovery rule (create).' => [
|
||
|
'error' => 'Invalid parameter "/1/master_itemid": cannot be an item prototype ID from another LLD rule.',
|
||
|
'method' => 'itemprototype.create',
|
||
|
// 1015: dependent.items.host.8
|
||
|
// 2403: dependent.items.host.8:discovery.rule.1
|
||
|
// 2407: dependent.items.host.8:master.item.proto.2
|
||
|
'request_data' => null,
|
||
|
'request_data_funcs' => [
|
||
|
[[self::class, 'getItemPrototypes'], [1015, 2403, 2407, 'dependent.item.proto.1', 2, 2]]
|
||
|
]
|
||
|
],
|
||
|
'Set master_itemid from other discovery rule (update).' => [
|
||
|
'error' => 'Invalid parameter "/1/master_itemid": cannot be an item prototype ID from another LLD rule.',
|
||
|
'method' => 'itemprototype.update',
|
||
|
'request_data' => [
|
||
|
'itemid' => 2405, // dependent.items.host.8:dependent.item.proto.1.1
|
||
|
'master_itemid' => 2407 // dependent.items.host.8:master.item.proto.2
|
||
|
]
|
||
|
],
|
||
|
'Set master_itemid from other host for discovery rule (create).' => [
|
||
|
'error' => 'Incorrect value for field "master_itemid": "hostid" of dependent item and master item should match.',
|
||
|
'method' => 'discoveryrule.create',
|
||
|
// 1015: dependent.items.host.8
|
||
|
// 2501: dependent.items.host.9:master.item.1
|
||
|
'request_data' => null,
|
||
|
'request_data_funcs' => [
|
||
|
[[self::class, 'getDiscoveryRule'], [1015, 2501, 'dependent.discovery.rule.1', 2, 2]]
|
||
|
]
|
||
|
],
|
||
|
'Set master_itemid from other host for discovery rule (update).' => [
|
||
|
'error' => 'Incorrect value for field "master_itemid": "hostid" of dependent item and master item should match.',
|
||
|
'method' => 'discoveryrule.update',
|
||
|
'request_data' => [
|
||
|
'itemid' => 2409, // dependent.items.host.8:dependent.discovery.rule.1.1
|
||
|
'master_itemid' => 2501 // dependent.items.host.9:master.item.1
|
||
|
]
|
||
|
],
|
||
|
'Create dependent item, which depends on discovered item.' => [
|
||
|
'error' => 'Invalid parameter "/1/master_itemid": an item ID is expected.',
|
||
|
'method' => 'item.create',
|
||
|
// 1014: dependent.items.host.7
|
||
|
// 2304: dependent.items.host.7:net.if[eth0]
|
||
|
'request_data' => null,
|
||
|
'request_data_funcs' => [
|
||
|
[[self::class, 'getItems'], [1014, 2304, 'item', 1, 1]]
|
||
|
]
|
||
|
],
|
||
|
'Create dependent item prototype, which depends on discovered item.' => [
|
||
|
'error' => 'Invalid parameter "/1/master_itemid": an item/item prototype ID is expected.',
|
||
|
'method' => 'itemprototype.create',
|
||
|
// 1014: dependent.items.host.7
|
||
|
// 2301: dependent.items.host.7:net.if.discovery
|
||
|
// 2304: dependent.items.host.7:net.if[eth0]
|
||
|
'request_data' => null,
|
||
|
'request_data_funcs' => [
|
||
|
[[self::class, 'getItemPrototypes'], [1014, 2301, 2304, 'item.proto', 1, 1]]
|
||
|
]
|
||
|
],
|
||
|
'Create dependent discovery rule, which depends on discovered item.' => [
|
||
|
'error' => 'Incorrect value for field "master_itemid": Item "2304" does not exist or you have no access to this item.',
|
||
|
'method' => 'discoveryrule.create',
|
||
|
// 1014: dependent.items.host.7
|
||
|
// 2304: dependent.items.host.7:net.if[eth0]
|
||
|
'request_data' => null,
|
||
|
'request_data_funcs' => [
|
||
|
[[self::class, 'getDiscoveryRule'], [1014, 2304, 'discovery.rule', 1, 1]]
|
||
|
]
|
||
|
],
|
||
|
'Simple update templated master item.' => [
|
||
|
'error' => null,
|
||
|
'method' => 'item.update',
|
||
|
'request_data' => [
|
||
|
'itemid' => 1301 // dependent.items.host.1:master.item.1
|
||
|
]
|
||
|
],
|
||
|
'Simple update templated master item prototype.' => [
|
||
|
'error' => null,
|
||
|
'method' => 'itemprototype.update',
|
||
|
'request_data' => [
|
||
|
'itemid' => 1318 // dependent.items.host.1:master.item.proto.1
|
||
|
]
|
||
|
],
|
||
|
'Simple update templated dependent item.' => [
|
||
|
'error' => null,
|
||
|
'method' => 'item.update',
|
||
|
'request_data' => [
|
||
|
'itemid' => 1315 // dependent.items.host.1:dependent.item.1.2.2.2
|
||
|
]
|
||
|
],
|
||
|
'Simple update templated dependent item prototype.' => [
|
||
|
'error' => null,
|
||
|
'method' => 'itemprototype.update',
|
||
|
'request_data' => [
|
||
|
'itemid' => 1332 // dependent.items.host.1:dependent.item.proto.1.2.2.2
|
||
|
]
|
||
|
],
|
||
|
'Simple update templated dependent discovery rule.' => [
|
||
|
'error' => null,
|
||
|
'method' => 'discoveryrule.update',
|
||
|
'request_data' => [
|
||
|
'itemid' => 1334 // dependent.items.host.1:dependent.discovery.rule.1.1
|
||
|
]
|
||
|
],
|
||
|
'Circular dependency to itself (update).' => [
|
||
|
'error' => 'Incorrect value for field "master_itemid": circular item dependency is not allowed.',
|
||
|
'method' => 'item.update',
|
||
|
'request_data' => [
|
||
|
'itemid' => 1015, // dependent.items.template.1:dependent.item.1.2.2.2
|
||
|
'master_itemid' => 1015
|
||
|
]
|
||
|
],
|
||
|
'Circular dependency to itself (update).' => [
|
||
|
'error' => 'Incorrect value for field "master_itemid": circular item dependency is not allowed.',
|
||
|
'method' => 'itemprototype.update',
|
||
|
'request_data' => [
|
||
|
'itemid' => 1032, // dependent.items.template.1:dependent.item.proto.1.2.2.2
|
||
|
'master_itemid' => 1032
|
||
|
]
|
||
|
],
|
||
|
'Circular dependency to itself (update).' => [
|
||
|
'error' => 'Incorrect value for field "master_itemid": Item "1034" does not exist or you have no access to this item.',
|
||
|
'method' => 'discoveryrule.update',
|
||
|
'request_data' => [
|
||
|
'itemid' => 1034, // dependent.items.template.1:dependent.discovery.rule.1.1
|
||
|
'master_itemid' => 1034
|
||
|
]
|
||
|
],
|
||
|
'Circular dependency to between several items (update).' => [
|
||
|
'error' => 'Invalid parameter "/1/master_itemid": circular item dependency is not allowed.',
|
||
|
'method' => 'item.update',
|
||
|
'request_data' => [
|
||
|
'itemid' => 1003, // dependent.items.template.1:dependent.item.1.2
|
||
|
'master_itemid' => 1015
|
||
|
]
|
||
|
],
|
||
|
'Circular dependency to between several item prototypes (update).' => [
|
||
|
'error' => 'Invalid parameter "/1/master_itemid": circular item dependency is not allowed.',
|
||
|
'method' => 'itemprototype.update',
|
||
|
'request_data' => [
|
||
|
'itemid' => 1020, // dependent.items.template.1:dependent.item.proto.1.2
|
||
|
'master_itemid' => 1032
|
||
|
]
|
||
|
],
|
||
|
'Set "master_itemid" for not-dependent item (create).' => [
|
||
|
'error' => 'Invalid parameter "/1/master_itemid": value must be 0.',
|
||
|
'method' => 'item.create',
|
||
|
'request_data' => [
|
||
|
'hostid' => 1001, // dependent.items.template.1
|
||
|
'name' => 'trap.2',
|
||
|
'type' => ITEM_TYPE_TRAPPER,
|
||
|
'key_' => 'trap.2',
|
||
|
'value_type' => ITEM_VALUE_TYPE_STR,
|
||
|
'master_itemid' => 1001 // dependent.items.template.1:master.item.1
|
||
|
]
|
||
|
],
|
||
|
'Set "master_itemid" for not-dependent item prototype (create).' => [
|
||
|
'error' => 'Invalid parameter "/1/master_itemid": value must be 0.',
|
||
|
'method' => 'itemprototype.create',
|
||
|
'request_data' => [
|
||
|
'hostid' => 1001, // dependent.items.template.1
|
||
|
'ruleid' => 1017, // dependent.items.template.1:discovery.rule.1
|
||
|
'name' => 'item.proto.2',
|
||
|
'type' => ITEM_TYPE_TRAPPER,
|
||
|
'key_' => 'item.proto.2[{#LLD}]',
|
||
|
'value_type' => ITEM_VALUE_TYPE_STR,
|
||
|
'master_itemid' => 1001 // dependent.items.template.1:master.item.1
|
||
|
]
|
||
|
],
|
||
|
'Set "master_itemid" for not-dependent discovery rule (create).' => [
|
||
|
'error' => 'Incorrect value for field "master_itemid": should be empty.',
|
||
|
'method' => 'discoveryrule.create',
|
||
|
'request_data' => [
|
||
|
'hostid' => 1001, // dependent.items.template.1
|
||
|
'name' => 'discovery.rule.2',
|
||
|
'key_' => 'discovery.rule.2',
|
||
|
'type' => 2,
|
||
|
'master_itemid' => 1001 // dependent.items.template.1:master.item.1
|
||
|
]
|
||
|
],
|
||
|
'Set "master_itemid" for not-dependent item (update).' => [
|
||
|
'error' => 'Invalid parameter "/1/master_itemid": value must be 0.',
|
||
|
'method' => 'item.update',
|
||
|
'request_data' => [
|
||
|
'itemid' => 1016, // dependent.items.template.1:trap.1
|
||
|
'master_itemid' => 1001 // dependent.items.template.1:master.item.1
|
||
|
]
|
||
|
],
|
||
|
'Set "master_itemid" for not-dependent item prototype (update).' => [
|
||
|
'error' => 'Invalid parameter "/1/master_itemid": value must be 0.',
|
||
|
'method' => 'itemprototype.update',
|
||
|
'request_data' => [
|
||
|
'itemid' => 1033, // dependent.items.template.1:item.proto.1
|
||
|
'master_itemid' => 1001 // dependent.items.template.1:master.item.1
|
||
|
]
|
||
|
],
|
||
|
'Set "master_itemid" for not-dependent discovery rule (update).' => [
|
||
|
'error' => 'Incorrect value for field "master_itemid": should be empty.',
|
||
|
'method' => 'discoveryrule.update',
|
||
|
'request_data' => [
|
||
|
'itemid' => 1017, // dependent.items.template.1:discovery.rule.1
|
||
|
'master_itemid' => 1001 // dependent.items.template.1:master.item.1
|
||
|
]
|
||
|
],
|
||
|
'Check for maximum depth for the items tree (create). Add 4th level.' => [
|
||
|
'error' => 'Cannot set dependency for item with key "dependent.item.1.1.1.1.1" on the master item with key "dependent.item.1.1.1.1" on the template "dependent.items.template.1": allowed count of dependency levels would be exceeded.',
|
||
|
'method' => 'item.create',
|
||
|
// 1001: dependent.items.template.1
|
||
|
// 1008: dependent.items.template.1:dependent.item.1.1.1.1
|
||
|
'request_data' => null,
|
||
|
'request_data_funcs' => [
|
||
|
[[self::class, 'getItems'], [1001, 1008, 'dependent.item.1.1.1.1', 1, 1]]
|
||
|
]
|
||
|
],
|
||
|
'Check for maximum depth for the item prototypes tree (create). Add 4th level.' => [
|
||
|
'error' => 'Cannot set dependency for item prototype with key "dependent.item.1.1.1.1.1[{#LLD}]" on the master item prototype with key "dependent.item.proto.1.1.1.1" on the template "dependent.items.template.1": allowed count of dependency levels would be exceeded.',
|
||
|
'method' => 'itemprototype.create',
|
||
|
// 1001: dependent.items.template.1
|
||
|
// 1017: dependent.items.template.1:discovery.rule.1
|
||
|
// 1025: dependent.items.template.1:dependent.item.proto.1.1.1.1
|
||
|
'request_data' => null,
|
||
|
'request_data_funcs' => [
|
||
|
[[self::class, 'getItemPrototypes'], [1001, 1017, 1025, 'dependent.item.1.1.1.1', 1, 1]]
|
||
|
]
|
||
|
],
|
||
|
'Check for maximum depth of the discovery rule tree (create). Add 4th level.' => [
|
||
|
'error' => 'Incorrect value for field "master_itemid": maximum number of dependency levels reached.',
|
||
|
'method' => 'discoveryrule.create',
|
||
|
// 1001: dependent.items.template.1
|
||
|
// 1008: dependent.items.template.1:dependent.item.1.1.1.1
|
||
|
'request_data' => null,
|
||
|
'request_data_funcs' => [
|
||
|
[[self::class, 'getDiscoveryRule'], [1001, 1008, 'dependent.discovery.rule.1.1.1.1', 1, 1]]
|
||
|
]
|
||
|
],
|
||
|
'Check for maximum depth of the items tree (update). Add 4th level.' => [
|
||
|
'error' => 'Cannot set dependency for item with key "trap.1" on the master item with key "dependent.item.1.1.1.1" on the template "dependent.items.template.1": allowed count of dependency levels would be exceeded.',
|
||
|
'method' => 'item.update',
|
||
|
'request_data' => [
|
||
|
'itemid' => 1016, // dependent.items.template.1:trap.1
|
||
|
'type' => ITEM_TYPE_DEPENDENT,
|
||
|
'master_itemid' => 1008 // dependent.items.template.1:dependent.item.1.1.1.1
|
||
|
]
|
||
|
],
|
||
|
'Check for maximum depth of the item prototypes tree (update). Add 4th level.' => [
|
||
|
'error' => 'Cannot set dependency for item prototype with key "item.proto.1" on the master item prototype with key "dependent.item.proto.1.1.1.1" on the template "dependent.items.template.1": allowed count of dependency levels would be exceeded.',
|
||
|
'method' => 'itemprototype.update',
|
||
|
'request_data' => [
|
||
|
'itemid' => 1033, // dependent.items.template.1:item.proto.1
|
||
|
'type' => ITEM_TYPE_DEPENDENT,
|
||
|
'master_itemid' => 1025 // dependent.items.template.1:dependent.item.proto.1.1.1.1
|
||
|
]
|
||
|
],
|
||
|
'Check for maximum depth of the discovery rule tree (update). Add 4th level.' => [
|
||
|
'error' => 'Incorrect value for field "master_itemid": maximum number of dependency levels reached.',
|
||
|
'method' => 'discoveryrule.update',
|
||
|
'request_data' => [
|
||
|
'itemid' => 1017, // dependent.items.template.1:discovery.rule.1
|
||
|
'type' => ITEM_TYPE_DEPENDENT,
|
||
|
'master_itemid' => 1008 // dependent.items.template.1:dependent.item.1.1.1.1
|
||
|
]
|
||
|
],
|
||
|
'Check for maximum depth of the items tree (update). Add 4th level at the top.' => [
|
||
|
'error' => 'Cannot set dependency for item with key "item.2" on the master item with key "item.1" on the host "dependent.items.host.4": allowed count of dependency levels would be exceeded.',
|
||
|
'method' => 'item.update',
|
||
|
'request_data' => [
|
||
|
'itemid' => 1702, // dependent.items.template.4:item.2
|
||
|
'type' => ITEM_TYPE_DEPENDENT,
|
||
|
'master_itemid' => 1701 // dependent.items.template.4:item.1
|
||
|
]
|
||
|
],
|
||
|
'Check for maximum depth of the mixed tree (update). Add 4th level at the top.' => [
|
||
|
'error' => 'Cannot set dependency for item with key "item.2" on the master item with key "item.1" on the host "dependent.items.host.5": allowed count of dependency levels would be exceeded.',
|
||
|
'method' => 'item.update',
|
||
|
'request_data' => [
|
||
|
'itemid' => 1902, // dependent.items.template.5:item.2
|
||
|
'type' => ITEM_TYPE_DEPENDENT,
|
||
|
'master_itemid' => 1901 // dependent.items.template.5:item.1
|
||
|
]
|
||
|
],
|
||
|
'Check for maximum depth of the item prototypes tree (update). Add 4th level at the top.' => [
|
||
|
'error' => 'Cannot set dependency for item prototype with key "item.proto.2" on the master item prototype with key "item.proto.1" on the host "dependent.items.host.6": allowed count of dependency levels would be exceeded.',
|
||
|
'method' => 'itemprototype.update',
|
||
|
'request_data' => [
|
||
|
'itemid' => 2103, // dependent.items.template.6:item.proto.2
|
||
|
'type' => ITEM_TYPE_DEPENDENT,
|
||
|
'master_itemid' => 2102 // dependent.items.template.6:item.proto.1
|
||
|
]
|
||
|
],
|
||
|
'Check for maximum depth of the items tree (link a template).' => [
|
||
|
'error' => 'Cannot set dependency for item with key "dependent.item.1.1" on the master item with key "master.item.1" on the host "dependent.items.host.2": allowed count of dependency levels would be exceeded.',
|
||
|
'method' => 'host.update',
|
||
|
'request_data' => [
|
||
|
'hostid' => 1006, // dependent.items.host.2
|
||
|
'templates' => [
|
||
|
'templateid' => 1005 // dependent.items.template.2
|
||
|
]
|
||
|
]
|
||
|
],
|
||
|
'Check for maximum depth of the mixed tree (link a template).' => [
|
||
|
'error' => 'Cannot set dependency for item with key "dependent.item.1.1" on the master item with key "master.item.1" on the host "dependent.items.host.3": allowed count of dependency levels would be exceeded.',
|
||
|
'method' => 'host.update',
|
||
|
'request_data' => [
|
||
|
'hostid' => 1007, // dependent.items.host.3
|
||
|
'templates' => [
|
||
|
'templateid' => 1005 // dependent.items.template.2
|
||
|
]
|
||
|
]
|
||
|
],
|
||
|
'Check for maximum count of items in the tree on the template level.' => [
|
||
|
'error' => 'Cannot set dependency for item with key "dependent.item.1.3" on the master item with key "master.item.1" on the template "dependent.items.template.1": allowed count of dependent items would be exceeded.',
|
||
|
'method' => 'item.create',
|
||
|
// 1001: dependent.items.template.1
|
||
|
// 1001: dependent.items.template.1:master.item.1
|
||
|
'request_data' => null,
|
||
|
'request_data_funcs' => [
|
||
|
[[self::class, 'getItems'], [1001, 1001, 'dependent.item.1', 3, $dep_count_overflow - 3]]
|
||
|
]
|
||
|
],
|
||
|
'Check for maximum count of items in the tree on the template level, combination.' => [
|
||
|
'error' => 'Cannot set dependency for item with key "dependent.item.1.%d.%d" on the master item with key "dependent.item.1.%d" on the template "dependent.items.template.1": allowed count of dependent items would be exceeded.',
|
||
|
'method' => 'item.create',
|
||
|
// 1001: dependent.items.template.1
|
||
|
// 1002: dependent.items.template.1:dependent.item.1.1
|
||
|
// 1003: dependent.items.template.1:dependent.item.1.2
|
||
|
'request_data' => null,
|
||
|
'request_data_funcs' => [
|
||
|
[[self::class, 'getItems'], [1001, 1002, 'dependent.item.1.1', 3, floor($dep_count_overflow / 2) - 3]],
|
||
|
[[self::class, 'getItems'], [1001, 1003, 'dependent.item.1.2', 3, ceil($dep_count_overflow / 2) - 3]]
|
||
|
]
|
||
|
],
|
||
|
'Check for maximum count of discovery rule in the tree on the template level.' => [
|
||
|
'error' => 'Incorrect value for field "master_itemid": maximum dependent items count reached.',
|
||
|
'method' => 'discoveryrule.create',
|
||
|
// 1001: dependent.items.template.1
|
||
|
// 1001: dependent.items.template.1:master.item.1
|
||
|
'request_data' => null,
|
||
|
'request_data_funcs' => [
|
||
|
[[self::class, 'getDiscoveryRule'], [1001, 1001, 'dependent.discovery.rule.1', 2, $dep_count_overflow - 2]]
|
||
|
]
|
||
|
],
|
||
|
'Check for maximum count of discovery rule in the tree on the template level.' => [
|
||
|
'error' => 'Incorrect value for field "master_itemid": maximum dependent items count reached.',
|
||
|
'method' => 'discoveryrule.create',
|
||
|
// 1001: dependent.items.template.1
|
||
|
// 1002: dependent.items.template.1:dependent.item.1.1
|
||
|
// 1003: dependent.items.template.1:dependent.item.1.2
|
||
|
'request_data' => null,
|
||
|
'request_data_funcs' => [
|
||
|
[[self::class, 'getDiscoveryRule'], [1001, 1002, 'dependent.discovery.rule.1.1', 1, floor($dep_count_overflow / 2) - 6]],
|
||
|
[[self::class, 'getDiscoveryRule'], [1001, 1003, 'dependent.discovery.rule.1.2', 1, ceil($dep_count_overflow / 2)]]
|
||
|
]
|
||
|
],
|
||
|
'Check for maximum count of items in the tree on the host level.' => [
|
||
|
'error' => 'Cannot set dependency for item with key "dependent.item.1.3" on the master item with key "master.item.1" on the host "dependent.items.host.1": allowed count of dependent items would be exceeded.',
|
||
|
'method' => 'item.create',
|
||
|
// 1004: dependent.items.host.1
|
||
|
// 1301: dependent.items.host.1:master.item.1
|
||
|
'request_data' => null,
|
||
|
'request_data_funcs' => [
|
||
|
[[self::class, 'getItems'], [1004, 1301, 'dependent.item.1', 3, $dep_count_overflow - 3 - 6]]
|
||
|
]
|
||
|
],
|
||
|
'Check for maximum count of items in the tree on the host level, combination.' => [
|
||
|
'error' => 'Cannot set dependency for item with key "dependent.item.1.2.3" on the master item with key "dependent.item.1.2" on the host "dependent.items.host.1": allowed count of dependent items would be exceeded.',
|
||
|
'method' => 'item.create',
|
||
|
// 1004: dependent.items.host.1
|
||
|
// 1302: dependent.items.host.1:dependent.item.1.1
|
||
|
// 1303: dependent.items.host.1:dependent.item.1.2
|
||
|
'request_data' => null,
|
||
|
'request_data_funcs' => [
|
||
|
[[self::class, 'getItems'], [1004, 1302, 'dependent.item.1.1', 3, floor($dep_count_overflow / 2) - 3]],
|
||
|
[[self::class, 'getItems'], [1004, 1303, 'dependent.item.1.2', 3, ceil($dep_count_overflow / 2) - 3]]
|
||
|
]
|
||
|
],
|
||
|
'Check for maximum count of discovery rule in the tree on the host level.' => [
|
||
|
'error' => 'Incorrect value for field "master_itemid": maximum dependent items count reached.',
|
||
|
'method' => 'discoveryrule.create',
|
||
|
// 1004: dependent.items.host.1
|
||
|
// 1301: dependent.items.host.1:master.item.1
|
||
|
'request_data' => null,
|
||
|
'request_data_funcs' => [
|
||
|
[[self::class, 'getDiscoveryRule'], [1004, 1301, 'dependent.discovery.rule.1', 2, $dep_count_overflow - 2 - 6]]
|
||
|
]
|
||
|
],
|
||
|
'Check for maximum count of discovery rule in the tree on the host level 2.' => [
|
||
|
'error' => 'Incorrect value for field "master_itemid": maximum dependent items count reached.',
|
||
|
'method' => 'discoveryrule.create',
|
||
|
// 1004: dependent.items.host.1
|
||
|
// 1302: dependent.items.host.1:dependent.item.1.1
|
||
|
// 1303: dependent.items.host.1:dependent.item.1.2
|
||
|
'request_data' => null,
|
||
|
'request_data_funcs' => [
|
||
|
[[self::class, 'getDiscoveryRule'], [1004, 1302, 'dependent.discovery.rule.1.1', 1, floor($dep_count_overflow / 2) - 6]],
|
||
|
[[self::class, 'getDiscoveryRule'], [1004, 1303, 'dependent.discovery.rule.1.2', 1, ceil($dep_count_overflow / 2)]]
|
||
|
]
|
||
|
],
|
||
|
'Check for maximum count of items in the tree on the template level, fill to max.' => [
|
||
|
'error' => null,
|
||
|
'method' => 'item.create',
|
||
|
// 1001: dependent.items.template.1
|
||
|
// 1002: dependent.items.template.1:dependent.item.1.1 (2 dependents)
|
||
|
// 1003: dependent.items.template.1:dependent.item.1.2 (2 dependents)
|
||
|
'request_data' => null,
|
||
|
'request_data_funcs' => [
|
||
|
[[self::class, 'getItems'], [1001, 1002, 'dependent.item.1.1', 3, floor($dep_count_overflow / 2) - 3]],
|
||
|
[[self::class, 'getItems'], [1001, 1003, 'dependent.item.1.2', 3, ceil($dep_count_overflow / 2) - 3 - 6 /* 4 existing dependents + parent dependent items */]]
|
||
|
]
|
||
|
],
|
||
|
'Check for maximum count of items in the tree on the template level, adding overflow via 2nd item.' => [
|
||
|
'error' => 'Cannot set dependency for item with key "dependent.item.1.2.%d" on the master item with key "dependent.item.1.2" on the template "dependent.items.template.1": allowed count of dependent items would be exceeded.',
|
||
|
'method' => 'item.create',
|
||
|
// 1001: dependent.items.template.1
|
||
|
// 1003: dependent.items.template.1:dependent.item.1.2
|
||
|
'request_data' => null,
|
||
|
'request_data_funcs' => [
|
||
|
[[self::class, 'getItems'], [1001, 1003, 'dependent.item.1.2', ceil($dep_count_overflow), ceil($dep_count_overflow) + 1]]
|
||
|
]
|
||
|
],
|
||
|
'Check for maximum count of items in the tree on the template level, master item.' => [
|
||
|
'error' => 'Incorrect value for field "master_itemid": maximum dependent items count reached.',
|
||
|
'method' => 'discoveryrule.create',
|
||
|
// 1001: dependent.items.template.1
|
||
|
// 1001: dependent.items.template.1:master.item.1
|
||
|
'request_data' => null,
|
||
|
'request_data_funcs' => [
|
||
|
[[self::class, 'getDiscoveryRule'], [1001, 1001, 'dependent.discovery.rule.1', 2, $dep_count_overflow - 2 - 6]]
|
||
|
]
|
||
|
],
|
||
|
'Check for maximum count of item prototypes in the tree on the template level.' => [
|
||
|
'error' => 'Cannot set dependency for item prototype with key "dependent.item.proto.1.3[{#LLD}]" on the master item prototype with key "master.item.proto.1" on the template "dependent.items.template.1": allowed count of dependent items would be exceeded.',
|
||
|
'method' => 'itemprototype.create',
|
||
|
// 1001: dependent.items.template.1
|
||
|
// 1017: dependent.items.template.1:discovery.rule.1
|
||
|
// 1018: dependent.items.template.1:master.item.proto.1
|
||
|
'request_data' => null,
|
||
|
'request_data_funcs' => [
|
||
|
[[self::class, 'getItemPrototypes'], [1001, 1017, 1018, 'dependent.item.proto.1', 3, $dep_count_overflow - 3]]
|
||
|
]
|
||
|
],
|
||
|
'Check for maximum count of item prototypes in the tree on the template level, combination, fail.' => [
|
||
|
'error' => 'Cannot set dependency for item prototype with key "dependent.item.proto.1.%d.3[{#LLD}]" on the master item prototype with key "dependent.item.proto.1.%d" on the template "dependent.items.template.1": allowed count of dependent items would be exceeded.',
|
||
|
'method' => 'itemprototype.create',
|
||
|
// 1001: dependent.items.template.1
|
||
|
// 1017: dependent.items.template.1:discovery.rule.1
|
||
|
// 1019: dependent.items.template.1:dependent.item.proto.1.1
|
||
|
// 1020: dependent.items.template.1:dependent.item.proto.1.2
|
||
|
'request_data' => null,
|
||
|
'request_data_funcs' => [
|
||
|
[[self::class, 'getItemPrototypes'], [1001, 1017, 1019, 'dependent.item.proto.1.1', 3, floor($dep_count_overflow / 2) - 3]],
|
||
|
[[self::class, 'getItemPrototypes'], [1001, 1017, 1020, 'dependent.item.proto.1.2', 3, ceil($dep_count_overflow / 2) - 3]]
|
||
|
]
|
||
|
],
|
||
|
'Check for maximum count of item prototypes in the tree on the host level.' => [
|
||
|
'error' => 'Cannot set dependency for item prototype with key "dependent.item.proto.1.3[{#LLD}]" on the master item prototype with key "master.item.proto.1" on the host "dependent.items.host.1": allowed count of dependent items would be exceeded.',
|
||
|
'method' => 'itemprototype.create',
|
||
|
// 1004: dependent.items.host.1
|
||
|
// 1317: dependent.items.template.1:discovery.rule.1
|
||
|
// 1318: dependent.items.host.1:master.item.proto.1
|
||
|
'request_data' => null,
|
||
|
'request_data_funcs' => [
|
||
|
[[self::class, 'getItemPrototypes'], [1004, 1317, 1318, 'dependent.item.proto.1', 3, $dep_count_overflow - 3]]
|
||
|
]
|
||
|
],
|
||
|
'Check for maximum count of item prototypes in the tree on the host level, combination.' => [
|
||
|
'error' => 'Cannot set dependency for item prototype with key "dependent.item.proto.1.%d.3[{#LLD}]" on the master item prototype with key "dependent.item.proto.1.%d" on the host "dependent.items.host.1": allowed count of dependent items would be exceeded.',
|
||
|
'method' => 'itemprototype.create',
|
||
|
// 1004: dependent.items.host.1
|
||
|
// 1317: dependent.items.template.1:discovery.rule.1
|
||
|
// 1319: dependent.items.host.1:dependent.item.proto.1.1
|
||
|
// 1320: dependent.items.host.1:dependent.item.proto.1.2
|
||
|
'request_data' => null,
|
||
|
'request_data_funcs' => [
|
||
|
[[self::class, 'getItemPrototypes'], [1004, 1317, 1319, 'dependent.item.proto.1.1', 3, floor($dep_count_overflow / 2) - 3]],
|
||
|
[[self::class, 'getItemPrototypes'], [1004, 1317, 1320, 'dependent.item.proto.1.2', 3, ceil($dep_count_overflow / 2) - 3]]
|
||
|
]
|
||
|
],
|
||
|
'Check for maximum count of item prototypes in the tree on the template level, combination, success.' => [
|
||
|
'error' => null,
|
||
|
'method' => 'itemprototype.create',
|
||
|
// 1001: dependent.items.template.1 (max occupancy checked here)
|
||
|
// 1017: dependent.items.template.1:discovery.rule.1
|
||
|
// 1019: dependent.items.template.1:dependent.item.proto.1.1 (2 dependents)
|
||
|
// 1020: dependent.items.template.1:dependent.item.proto.1.2 (2 dependents)
|
||
|
'request_data' => null,
|
||
|
'request_data_funcs' => [
|
||
|
[[self::class, 'getItemPrototypes'], [1001, 1017, 1019, 'dependent.item.proto.1.1', 3, floor($dep_count_overflow / 2) - 3 - 2 /* dependents */]],
|
||
|
[[self::class, 'getItemPrototypes'], [1001, 1017, 1020, 'dependent.item.proto.1.2', 3, ceil($dep_count_overflow / 2) - 3 - 2 /* dependents */ - 1 /*rule itself*/]]
|
||
|
]
|
||
|
],
|
||
|
'Check for maximum count of item prototypes in the tree on the template.' => [
|
||
|
'error' => 'Cannot set dependency for item prototype with key "dependent.item.proto.1.2.%d[{#LLD}]" on the master item prototype with key "dependent.item.proto.1.2" on the template "dependent.items.template.1": allowed count of dependent items would be exceeded.',
|
||
|
'method' => 'itemprototype.create',
|
||
|
// 1001: dependent.items.template.1
|
||
|
// 1017: dependent.items.template.1:discovery.rule.1
|
||
|
// 1020: dependent.items.template.1:dependent.item.proto.1.2
|
||
|
'request_data' => null,
|
||
|
'request_data_funcs' => [
|
||
|
[[self::class, 'getItemPrototypes'], [1001, 1017, 1020, 'dependent.item.proto.1.2', floor($dep_count_overflow / 2) - 5 + 1 /* from last above */, floor($dep_count_overflow / 2) - 4 + 1]]
|
||
|
]
|
||
|
]
|
||
|
];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @dataProvider getTestCases
|
||
|
*/
|
||
|
public function testDependentItems_main($expected_error, $method, ?array $request_data, array $request_data_funcs = null) {
|
||
|
// Skip tests with the default option ZBX_DEPENDENT_ITEM_MAX_COUNT to prevent long running tests.
|
||
|
if (ZBX_DEPENDENT_ITEM_MAX_COUNT > 300) {
|
||
|
self::markTestSkipped('Lower the ZBX_DEPENDENT_ITEM_MAX_COUNT option to run this test.');
|
||
|
}
|
||
|
|
||
|
if ($request_data === null) {
|
||
|
$request_data = [];
|
||
|
foreach ($request_data_funcs as $request_data_func) {
|
||
|
$request_data = array_merge($request_data,
|
||
|
call_user_func_array($request_data_func[0], $request_data_func[1])
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ($expected_error === null || strrpos($expected_error, 'allowed count of dependent') === false) {
|
||
|
return $this->call($method, $request_data, $expected_error);
|
||
|
}
|
||
|
|
||
|
if (CAPIHelper::getSessionId() === null) {
|
||
|
$this->authorize(PHPUNIT_LOGIN_NAME, PHPUNIT_LOGIN_PWD);
|
||
|
}
|
||
|
|
||
|
$response = CAPIHelper::call($method, $request_data);
|
||
|
|
||
|
$this->assertArrayNotHasKey('result', $response);
|
||
|
$this->assertArrayHasKey('error', $response);
|
||
|
$this->assertStringMatchesFormat($expected_error, $response['error']['data']);
|
||
|
}
|
||
|
}
|